https://www.jitbit.com/screensharing/#883291124783816021000000238419

ID da verificação
c3d39360-bd0b-44ec-83b5-36cd171d9de8Concluído
URL enviado:
https://www.jitbit.com/screensharing/#883291124783816021000000238419
Relatório concluído:

Os links de saída identificados na página

Variáveis JavaScript · 32 encontrada(s)

Variáveis JavaScript globais carregadas no objeto janela de uma página são variáveis declaradas fora das funções e acessíveis de qualquer lugar no código dentro do escopo atual

NomeTipo
onbeforetoggleobject
documentPictureInPictureobject
onscrollendobject
qobject
$function
iofunction
iceServersobject
getNamefunction
startfunction
displayStatusfunction

Mensagens de registro do console · 9 encontrada(s)

Mensagens registradas no console web

TipoCategoriaLog
logother
URL
https://www.jitbit.com/screensharing/
Texto
Created remote peer connection object pc2
logother
URL
https://www.jitbit.com/screensharing/
Texto
pc2 setRemoteDescription start
logother
URL
https://www.jitbit.com/screensharing/
Texto
pc2 received remote stream
logother
URL
https://www.jitbit.com/screensharing/
Texto
pc2 createAnswer start
logother
URL
https://www.jitbit.com/screensharing/
Texto
pc2 setLocalDescription start
logother
URL
https://www.jitbit.com/screensharing/
Texto
pc2 ICE state: checking
logjavascript
URL
https://www.jitbit.com/screensharing/
Texto
ICE state change event: JSHandle@object
logother
URL
https://www.jitbit.com/screensharing/
Texto
pc2 ICE state: connected
logjavascript
URL
https://www.jitbit.com/screensharing/
Texto
ICE state change event: JSHandle@object

HTML

O corpo HTML bruto da página

<!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&amp;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>&nbsp;</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
					&nbsp;
					<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>