您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

67 行
2.0KB

  1. const allStreams = {}
  2. // https://stackoverflow.com/a/2117523
  3. function uuidv4() {
  4. return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
  5. (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  6. )
  7. }
  8. function newRPC(uid, target) {
  9. const rpc = new RTCPeerConnection(rpcConfig)
  10. rpc.onicecandidate = ({candidate}) => {
  11. if(candidate && candidate.candidate) {
  12. const value = JSON.parse(JSON.stringify(candidate))
  13. wire({kind: 'ice-candidate', value: {...value, uid}, target})
  14. }
  15. }
  16. rpc.ontrack = ({streams: [stream]}) => {
  17. stream.getTracks().forEach(tr => ScreenShare.stream.addTrack(tr, stream))
  18. }
  19. rpc.onconnectionstatechange = () => {
  20. console.log(rpc.connectionState)
  21. }
  22. return rpc
  23. }
  24. addEventListener('screen-start', async ({detail}) => {
  25. const {target, stream} = detail.value
  26. const uid = uuidv4()
  27. const rpc = newRPC(uid, target)
  28. allStreams[uid] = {target, rpc}
  29. stream.getTracks().forEach(tr => rpc.addTrack(tr, stream))
  30. const localOffer = await rpc.createOffer()
  31. await rpc.setLocalDescription(localOffer)
  32. wire({kind: 'screen-offer', value: {...localOffer, uid}, target})
  33. })
  34. addEventListener('screen-offer', async ({detail}) => {
  35. const target = detail.source
  36. const uid = detail.value.uid
  37. const rpc = newRPC(uid, target)
  38. allStreams[uid] = {target, rpc}
  39. await rpc.setRemoteDescription(detail.value)
  40. const localAnswer = await rpc.createAnswer()
  41. await rpc.setLocalDescription(localAnswer)
  42. wire({kind: 'screen-answer', value: {...localAnswer, uid}, target})
  43. })
  44. addEventListener('screen-answer', async ({detail}) => {
  45. await allStreams[detail.value.uid].rpc.setRemoteDescription(detail.value)
  46. })
  47. addEventListener('ice-candidate', async ({detail}) => {
  48. await allStreams[detail.value.uid].rpc.addIceCandidate(detail.value)
  49. })
  50. addEventListener('load', () => {
  51. doNotLog.add('screen-start')
  52. doNotLog.add('screen-offer')
  53. doNotLog.add('screen-answer')
  54. doNotLog.add('ice-candidate')
  55. })