- 제출된 URL:
- https://www.jitbit.com/screensharing/#883291124783816021000000238419
- 보고서 완료:
링크 · 0개 결과
페이지에서 식별된 외부 링크
JavaScript 변수 · 32개 결과
페이지의 창 개체에 로드된 전역 JavaScript 변수는 함수 외부에서 선언된 변수로, 현재 범위 내에서 코드의 어느 부분에서나 액세스할 수 있습니다
이름 | 유형 |
---|---|
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
q | object |
$ | function |
io | function |
iceServers | object |
getName | function |
start | function |
displayStatus | function |
콘솔 로그 메시지 · 9개 결과
웹 콘솔에 기록된 메시지
유형 | 카테고리 | 로그 |
---|---|---|
log | other |
|
log | other |
|
log | other |
|
log | other |
|
log | other |
|
log | other |
|
log | javascript |
|
log | other |
|
log | javascript |
|
HTML
페이지의 원시 HTML 본문
<!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>