const allStreams = {} // https://stackoverflow.com/a/2117523 function uuidv4() { return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ) } function newRPC(uid, target) { const rpc = new RTCPeerConnection(rpcConfig) rpc.onicecandidate = ({candidate}) => { if(candidate && candidate.candidate) { const value = JSON.parse(JSON.stringify(candidate)) wire({kind: 'ice-candidate', value: {...value, uid}, target}) } } rpc.ontrack = ({streams: [stream]}) => { stream.getTracks().forEach(tr => ScreenShare.stream.addTrack(tr, stream)) } rpc.onconnectionstatechange = () => { console.log(rpc.connectionState) } return rpc } addEventListener('screen-start', async ({detail}) => { const {target, stream} = detail.value const uid = uuidv4() const rpc = newRPC(uid, target) allStreams[uid] = {target, rpc} stream.getTracks().forEach(tr => rpc.addTrack(tr, stream)) const localOffer = await rpc.createOffer() await rpc.setLocalDescription(localOffer) wire({kind: 'screen-offer', value: {...localOffer, uid}, target}) }) addEventListener('screen-offer', async ({detail}) => { const target = detail.source const uid = detail.value.uid const rpc = newRPC(uid, target) allStreams[uid] = {target, rpc} await rpc.setRemoteDescription(detail.value) const localAnswer = await rpc.createAnswer() await rpc.setLocalDescription(localAnswer) wire({kind: 'screen-answer', value: {...localAnswer, uid}, target}) }) addEventListener('screen-answer', async ({detail}) => { await allStreams[detail.value.uid].rpc.setRemoteDescription(detail.value) }) addEventListener('ice-candidate', async ({detail}) => { await allStreams[detail.value.uid].rpc.addIceCandidate(detail.value) }) addEventListener('load', () => { doNotLog.add('screen-start') doNotLog.add('screen-offer') doNotLog.add('screen-answer') doNotLog.add('ice-candidate') })