|
- 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')
- })
|