- ID de l'analyse :
- c3d39360-bd0b-44ec-83b5-36cd171d9de8Terminée
- URL soumise :
- https://www.jitbit.com/screensharing/#883291124783816021000000238419
- Fin du rapport :
Liens : 0 trouvé(s)
Liens sortants identifiés à partir de la page
Variables JavaScript : 32 trouvée(s)
Les variables JavaScript globales chargées dans l'objet fenêtre d'une page sont des variables déclarées en dehors des fonctions et accessibles depuis n'importe quel endroit du code au sein du champ d'application actuel
Nom | Type |
---|---|
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
q | object |
$ | function |
io | function |
iceServers | object |
getName | function |
start | function |
displayStatus | function |
Messages de journal de console : 9 trouvé(s)
Messages consignés dans la console web
Type | Catégorie | Enregistrement |
---|---|---|
log | other |
|
log | other |
|
log | other |
|
log | other |
|
log | other |
|
log | other |
|
log | javascript |
|
log | other |
|
log | javascript |
|
HTML
Le corps HTML de la page en données brutes
<!DOCTYPE html><html lang="en"><head>
<title>Free screen sharing via browser</title>
<meta name="description" content="Free screen sharing">
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@jitbithelpdesk">
<meta name="twitter:title" content="Screen sharing">
<meta name="twitter:image" content="https://www.jitbit.com/images/i/OWZdMMs.jpg?1">
<meta name="twitter:description" content="Free screen sharing via a browser, no software needed">
<meta property="og:site_name" content="jitbit.com">
<meta property="og:title" content="Screen sharing">
<meta property="og:type" content="product">
<meta property="og:image" content="https://www.jitbit.com/images/i/OWZdMMs.jpg?1">
<meta property="og:description" content="Free screen sharing via a browser, no software needed">
<style>
video{width:100%;margin-bottom:20px}
</style>
<link href="https://www.jitbit.com/screensharing/" rel="canonical">
<script>
if(!location.hash.replace('#', '').length) {
location.hash = (Math.random() * 100).toString().replace('.', '') + performance.now().toString().replace('.', '');
}
</script>
<link rel="alternate" id="rssLink" type="application/rss+xml" title="Jitbit Software" href="https://www.jitbit.com/news/rss/">
<link rel="shortcut icon" href="//www.jitbit.com/favicon.ico">
<link rel="icon" href="/favicon.ico">
<link rel="icon" type="image/png" href="/favicon.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/assets/css/style.min.css?v=9109-19962">
<link rel="dns-prefetch" href="https://fonts.googleapis.com/">
<link rel="stylesheet" onload="this.onload=null;this.removeAttribute('media');" href="https://fonts.googleapis.com/css?family=Titillium+Web:400,600&display=swap">
<script>
window.q=[];window.$=function(f){q.push(f)}
</script>
<meta name="slack-app-id" content="AGW609EKZ">
</head>
<body style="">
<div id="header" class="homepage">
<div>
<div class="container">
<a href="/" id="logo">
<img id="cloud" src="/assets/img/logocloud.svg" width="27" alt="Jitbit logo - makers of Jitbit Helpdesk">
<img src="/images/JitBit-white.svg">
</a>
<ul id="nav">
<li id="productsLi">
<a title="helpdesk pricing" href="#">More free tools</a>
<div id="productsPopup">
<ul>
<li><a href="/sslcheck/">SSL Check</a></li>
<li><a href="/screencapture/">Screen Capture</a></li>
<li><a href="/unusedcss/">Unused CSS Finder</a></li>
<li><a href="/msg2eml/">Convert MSG to EML</a></li>
<li><a href="/listcleaner/">Free email list cleaner</a></li>
</ul>
</div>
</li>
<li style="padding-right:0"><a href="/company/">About</a></li>
</ul>
<div class="row" style="clear:both">
<h1 style="text-align:center">Screen Sharing - right from your browser</h1>
<p style="text-align:center">This is a free, very basic browser based screen sharing app between 2 people. Use it to quickly share your screen with a co-worker remotely.</p>
<video id="localVideo" playsinline="" autoplay="" muted="" style="display:none"></video>
<div style="text-align:center" class="buttons">
<a id="startButton" class="trynowbutton" href="javascript:;">Share my screen</a>
<a id="hangupButton" href="javascript:;" style="display:none">Hang Up</a>
<a id="copyLinkBtn" href="javascript:;" style="display:none">Copy link to clipboard</a>
</div>
<p id="statusMsg" style="text-align:center;display:none"></p>
</div>
</div>
</div>
</div>
<div class="container content">
<div class="row">
<div class="span12">
<br>
<h3>What is this?</h3>
<p>This is a free, very basic browser based screen sharing app between 2 people. Use it to quickly share your screen with a co-worker remotely or provide technical support without any additional <a href="/helpdesk/">support software</a>.</p>
<p>No plugins, no extensions, no 3rd party software like TeamViewer or something. Just a modern browser that supports WebRTC (current beta works in Chromium browsers, somewhat functional in Firefox, with full Safari/Firefox support coming up shortly).</p>
<h3>But why?</h3>
<p>We've built this fun little side project during the days of COVID-19 when everyone's remote and found themselves in need of video connectivity tools. Some of those video tools (cough cough) are not very privacy friendly... OTOH there's a peer-2-peer video technology that's literally built right into everyone's browser.</p>
<h3>How secure is the video?</h3>
<p>This is peer 2 peer, the video stream is not being sent to our servers, your browser streams the video directly to the viewer's browser.</p>
<h3>But I can spot connections to your server!</h3>
<p>Yes, but only during the handshake phase. The two browsers need to exchange some magic numbers before they can find each other. So we wrote a small signaling server to help with that (and also manage "rooms"). See for yourself: just look at this page's source code, it's all there ;)</p>
<h3>Can someone guess my "room number"?</h3>
<p>Unfortunately, yes. All rooms are public in this beta version. But once someone's joined - the app won't let anyone in. Also you can add some more random stuff to the URL-hash and load the page again to make it harder to guess.</p>
<h3>Help, it won't work</h3>
<p>This is an early stage experiment, a proof of concept if you will. It might not work in Firefox or if both you and your counterparty are behind symmatric NATs. It <i>should</i> work though, but there are always some real world scenarios where it won't...</p>
<p>If something's not working: ask your coworker to close their browser, then refresh this page, re-share the screen and send the link to your coworker again.</p>
<p><a href="https://twitter.com/intent/tweet?text=Screen%20sharing%20via%20browser%20https%3A//www.jitbit.com/screensharing/">retweet</a></p>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"> </script>
<script>
'use strict';
//try to use google stun servers
var iceServers = [{
'urls': [
'stun:stun3.l.google.com:19305',
'stun:stun4.l.google.com:19305',
'stun:stun.l.google.com:19305',
'stun:stun1.l.google.com:19302',
'stun:stun2.l.google.com:19305',
'stun:stun2.l.google.com:19302',
'stun:stun4.l.google.com:19302',
'stun:stun.l.google.com:19302',
'stun:stun1.l.google.com:19305',
'stun:stun3.l.google.com:19302',
]
}];
iceServers = {
iceServers: iceServers,
iceTransportPolicy: 'all',
bundlePolicy: 'max-bundle',
iceCandidatePoolSize: 0
};
if (window.chrome) { //if chrome
iceServers = {
iceServers: iceServers.iceServers
};
}
const SIGNALING_SERVER = "https://nodesocket.jitbit.com/";
let _stream;
const _room = location.hash.replace('#', '');
const _socket = io(SIGNALING_SERVER)
.emit("join", _room);
_socket.on('join', function () { initBroadcasting(); }); //listener has joined, start session
const startButton = document.getElementById('startButton');
const hangupButton = document.getElementById('hangupButton');
const copyLinkBtn = document.getElementById('copyLinkBtn');
startButton.addEventListener('click', start);
hangupButton.addEventListener('click', hangup);
copyLinkBtn.addEventListener('click', copyLink);
const _localVideo = document.getElementById('localVideo');
let pc1;
let pc2;
const offerOptions = {
offerToReceiveAudio: 0,
offerToReceiveVideo: 1
};
function getName(pc) {
return (pc === pc1) ? 'pc1' : 'pc2';
}
async function start() {
startButton.style.display= 'none';
localVideo.style.display = copyLinkBtn.style.display = hangupButton.style.display = '';
try {
if(navigator.mediaDevices.getDisplayMedia) {
_stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
}
else if(navigator.getDisplayMedia) {
_stream = await navigator.getDisplayMedia({ video: true });
}
console.log('Received local stream');
_localVideo.srcObject = _stream;
displayStatus("Waiting for someone to join (give them the current URL)...");
} catch (e) {
alert(`getUserMedia() error: ${e.name}`);
}
}
function displayStatus(msg) {
document.getElementById("statusMsg").style.display = '';
document.getElementById("statusMsg").innerText = msg;
}
async function initBroadcasting() {
displayStatus("Someone's trying to join");
hangupButton.disabled = false;
console.log('Starting call');
pc1 = new RTCPeerConnection(iceServers);
console.log('Created local peer connection object pc1');
pc1.addEventListener('icecandidate', e => onIceCandidate(e, 'pc1'));
pc1.addEventListener('iceconnectionstatechange', e => onIceStateChange(pc1, e));
_stream.getTracks().forEach(track => pc1.addTrack(track, _stream));
console.log('Added local stream to pc1');
try {
console.log('pc1 createOffer start');
const offer = await pc1.createOffer(offerOptions);
await onCreateOfferSuccess(offer);
} catch (e) {
console.log(`Failed to create session description: ${e.toString()}`);
}
}
async function onCreateOfferSuccess(desc) {
console.log('pc1 setLocalDescription start');
try {
await pc1.setLocalDescription(desc);
} catch (e) {
onSetSessionDescriptionError();
}
_socket.emit("readyToBroadcast", desc); //initReceiving(desc);
}
_socket.on('readyToBroadcast', function (desc) { initReceiving(desc); })
async function initReceiving(desc) {
copyLinkBtn.style.display = startButton.style.display = 'none';
localVideo.style.display = '';
pc2 = new RTCPeerConnection(iceServers);
console.log('Created remote peer connection object pc2');
pc2.addEventListener('icecandidate', e => onIceCandidate(e, 'pc2'));
pc2.addEventListener('iceconnectionstatechange', e => onIceStateChange(pc2, e));
pc2.addEventListener('track', gotRemoteStream);
console.log('pc2 setRemoteDescription start');
try {
await pc2.setRemoteDescription(desc);
} catch (e) {
onSetSessionDescriptionError();
}
console.log('pc2 createAnswer start');
try {
const answer = await pc2.createAnswer();
await onCreateAnswerSuccess(answer);
} catch (e) {
onCreateSessionDescriptionError(e);
}
}
function onSetSessionDescriptionError(error) {
console.log(`Failed to set session description: ${error.toString()}`);
}
function gotRemoteStream(e) {
_localVideo.controls = _localVideo.autoplay = _localVideo.playsinline = _localVideo.controls = true;
if (_localVideo.srcObject !== e.streams[e.streams.length-1]) {
_localVideo.srcObject = e.streams[e.streams.length-1];
console.log('pc2 received remote stream');
}
}
async function onCreateAnswerSuccess(desc) {
console.log('pc2 setLocalDescription start');
try {
await pc2.setLocalDescription(desc);
_socket.emit("readyToReceive", desc); //startBroadcasting(desc);
} catch (e) {
onSetSessionDescriptionError(e);
}
}
_socket.on('readyToReceive', function (desc) { startBroadcasting(desc); });
async function startBroadcasting(desc) {
displayStatus("Broadcasting");
console.log('pc1 setRemoteDescription start');
try {
await pc1.setRemoteDescription(desc);
} catch (e) {
onSetSessionDescriptionError(e);
}
}
async function onIceCandidate(event, type) {
_socket.emit("ice", {
type: type,
candidate: JSON.stringify(event.candidate)
});
}
_socket.on('ice', async function (data) {
if (data.type == 'pc1')
await pc2.addIceCandidate(JSON.parse(data.candidate));
else if (data.type == 'pc2')
await pc1.addIceCandidate(JSON.parse(data.candidate));
});
function onIceStateChange(pc, event) {
if (pc) {
console.log(`${getName(pc)} ICE state: ${pc.iceConnectionState}`);
console.log('ICE state change event: ', event);
}
}
function hangup() {
console.log('Ending call');
if(pc1) pc1.close();
if(pc2) pc2.close();
pc1 = null;
pc2 = null;
if (_stream) {
_stream.getTracks().forEach(function (track) {
track.stop();
});
}
_localVideo.srcObject = null;
_socket.close();
displayStatus("Finished");
}
function copyLink() {
ClipboardClass.copyText(document.location.href);
}
window.addEventListener("beforeunload", hangup);
// Clipboard polyfill (stupid safari)
var ClipboardClass = (function () {
function copyText(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text);
return;
}
// Create temp element off-screen to hold text.
var tempElem = $('<textarea style="position: absolute; top: -8888px; left: -8888px">');
$("body").append(tempElem);
tempElem.val(text).select();
document.execCommand("copy");
tempElem.remove();
}
return {
copyText: copyText
};
})();
</script>
<div id="footer">
<div class="container">
<div class="row">
<div class="span3">
<h4>Jitbit Software</h4>
<ul>
<li>☎ <a href="tel:16463977708">+1 (646) 397-7708</a></li>
<li>✉ <a href="mailto:[email protected]">[email protected]</a></li>
<li> </li>
<li>1312 17th Street<br>Denver, CO 80202, United States</li>
</ul>
</div>
<div class="span3">
<h4>About us</h4>
<ul>
<li><a href="/news/"><b>Blog</b></a></li>
<li><a href="/company/">About</a></li>
<li><a href="/company/#contact">Contact us</a></li>
<li><a href="/support/">Support</a></li>
<li><a href="/privacy/">Privacy policy</a></li>
<li><a href="/tos/">Terms</a></li>
</ul>
</div>
<div class="span3">
<h4>
Helpdesk products
</h4>
<ul>
<li><a href="/">Helpdesk ticketing system</a></li>
<li><a href="/helpdesk/purchase/">Pricing - self-hosted</a></li>
<li><a href="/saas-helpdesk/purchase/">Pricing - hosted</a></li>
<li><a href="/saas-helpdesk/">SaaS Helpdesk</a></li>
</ul>
</div>
<div class="span3">
<h4>
Top features
</h4>
<ul>
<li><a href="/helpdesk/helpdesk-features/">Helpdesk feature list</a></li>
<li><a href="/saas-helpdesk/single-sign-on/">Single sign-on</a></li>
<li><a href="/docs/api/">API</a></li>
<li><a href="/helpdesk/zendesk-vs-jitbit/">Zendesk vs Jitbit vs Spiceworks</a></li>
</ul>
</div>
</div>
<div class="row copyright">
<div class="span12">
<a href="/"><img class="lazyimg" data-original="/assets/img/footerlogo.png" alt="jitbit"></a>
Copyright © 2024 Jitbit
<form action="/search/" id="Form2" style="display:inline">
<input type="hidden" name="cx" value="partner-pub-1886487233116645:gxcjs2-2fl6">
<input type="hidden" name="cof" value="FORID:11">
<input type="hidden" name="ie" value="UTF-8">
<input name="q" type="text" maxlength="50" placeholder="Search our website..." style="margin:0">
</form>
</div>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js" defer="" onload="setTimeout(function(){$.each(q, function (i,f) { $(f) });}, 500)"></script>
<script src="/js/utils.js?v=5" defer=""></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/lazyload.min.js" defer="" onload="var lzl=new LazyLoad({elements_selector:'.lazyimg',threshold:300,data_src:'original'});"></script>
<script async="" defer="" data-domain="jitbit.com" src="https://plausible.io/js/plausible.js"></script>
</body></html>