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

92 行
2.8KB

  1. const allRPCs = {}
  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. addEventListener('rpc-needed', ({detail}) => {
  9. const {kind, target} = detail.value
  10. const isInitiatedLocally = !detail.source
  11. const uid = detail.value.uid || uuidv4()
  12. const rpc = new RTCPeerConnection(rpcConfig)
  13. rpc.onicecandidate = ({candidate}) => {
  14. if(candidate && candidate.candidate) {
  15. const cand = JSON.parse(JSON.stringify(candidate))
  16. wire({kind: 'ice-candidate', value: {...cand, uid}, target})
  17. }
  18. }
  19. rpc.ontrack = ({streams: [stream]}) => {
  20. stream.getTracks().forEach(track =>
  21. allRPCs[uid].receiver.addTrack(track, stream)
  22. )
  23. }
  24. rpc.oniceconnectionstatechange = (e) => {
  25. console.log(rpc.iceConnectionState)
  26. }
  27. rpc.onnegotiationneeded = (e) => {
  28. // if(isInitiatedLocally) {
  29. // signal({kind: 'rpc-initiate', value: {uid}})
  30. // }
  31. }
  32. allRPCs[uid] = {kind, target, rpc, isInitiatedLocally}
  33. signal({kind: 'rpc-new', value: {kind, target, uid}})
  34. if(isInitiatedLocally) {
  35. wire({kind: 'rpc-needed', value: {kind, target: State.username, uid}, target})
  36. }
  37. })
  38. addEventListener('rpc-setup', async ({detail}) => {
  39. const {uid, sender, receiver} = detail.value
  40. allRPCs[uid].sender = sender
  41. allRPCs[uid].receiver = receiver
  42. if(sender) {
  43. sender.getTracks().forEach(tr => allRPCs[uid].rpc.addTrack(tr, sender))
  44. }
  45. if(allRPCs[uid].isInitiatedLocally) {
  46. signal({kind: 'rpc-initiate', value: {uid}})
  47. }
  48. })
  49. addEventListener('rpc-initiate', async({detail}) => {
  50. const {uid} = detail.value
  51. const {rpc, target} = allRPCs[uid]
  52. const localOffer = await rpc.createOffer()
  53. await rpc.setLocalDescription(localOffer)
  54. wire({kind: 'rpc-offer', value: {...localOffer, uid}, target})
  55. })
  56. addEventListener('rpc-offer', async ({detail}) => {
  57. const {uid} = detail.value
  58. const {rpc, target} = allRPCs[uid]
  59. await rpc.setRemoteDescription(detail.value)
  60. const localAnswer = await rpc.createAnswer()
  61. await rpc.setLocalDescription(localAnswer)
  62. wire({kind: 'rpc-answer', value: {...localAnswer, uid}, target})
  63. })
  64. addEventListener('rpc-answer', async ({detail}) => {
  65. const {uid} = detail.value
  66. await allRPCs[uid].rpc.setRemoteDescription(detail.value)
  67. })
  68. addEventListener('ice-candidate', async ({detail}) => {
  69. const {uid} = detail.value
  70. await allRPCs[uid].rpc.addIceCandidate(detail.value)
  71. })
  72. addEventListener('load', () => {
  73. doNotLog.add('rpc-needed')
  74. doNotLog.add('rpc-offer')
  75. doNotLog.add('rpc-answer')
  76. doNotLog.add('ice-candidate')
  77. })