Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

77 lines
2.4KB

  1. const connections = {}
  2. const datachannels = {}
  3. function createConnection(target) {
  4. const rpc = new RTCPeerConnection(rpcConfig)
  5. rpc.onicecandidate = ({candidate}) => {
  6. if(candidate && candidate.candidate) {
  7. const value = {type: 'candidate', candidate}
  8. wire({kind: 'rpc', value, target})
  9. }
  10. }
  11. rpc.ontrack = ({track}) => {
  12. console.log(track)
  13. }
  14. rpc.onconnectionstatechange = () => {
  15. if(rpc.connectionState === 'failed') {
  16. console.log(target, 'failed, retry!')
  17. wire({kind: 'rpc', value: {type: 'request'}, target})
  18. }
  19. }
  20. rpc.ondatachannel = ({channel}) => {
  21. datachannels[target] = channel
  22. datachannels[target].onmessage = ({data}) => console.log(data)
  23. // for testing purposes
  24. const msg = `rpc established from ${target} to ${State.username}`
  25. datachannels[target].send(msg)
  26. console.log(msg)
  27. }
  28. connections[target] = rpc
  29. if(State.username > target) {
  30. datachannels[target] = rpc.createDataChannel('test')
  31. datachannels[target].onmessage = ({data}) => console.log(data)
  32. signal({kind: 'rpc', value: {type: 'request'}, source: target})
  33. }
  34. }
  35. async function handlePeerInfo({source: target, value}) {
  36. const rpc = connections[target]
  37. if(!rpc) {
  38. return
  39. }
  40. if(value.type === 'request') {
  41. const localOffer = await rpc.createOffer()
  42. await rpc.setLocalDescription(localOffer)
  43. wire({kind: 'rpc', value: localOffer, target})
  44. }
  45. else if(value.type === 'offer') {
  46. const remoteOffer = new RTCSessionDescription(value)
  47. await rpc.setRemoteDescription(remoteOffer)
  48. const localAnswer = await rpc.createAnswer()
  49. await rpc.setLocalDescription(localAnswer)
  50. wire({kind: 'rpc', value: localAnswer, target})
  51. }
  52. else if(value.type === 'answer') {
  53. const remoteAnswer = new RTCSessionDescription(value)
  54. await rpc.setRemoteDescription(remoteAnswer)
  55. }
  56. else if(value.type === 'candidate') {
  57. const candidate = new RTCIceCandidate(value.candidate)
  58. await rpc.addIceCandidate(candidate)
  59. }
  60. }
  61. function removeConnection(user) {
  62. const rpc = connections[user]
  63. if(rpc) {
  64. delete connections[user]
  65. }
  66. }
  67. addEventListener('rpc', (e) => handlePeerInfo(e.detail))
  68. addEventListener('join', (e) => createConnection(e.detail.value))
  69. addEventListener('load', () => doNotLog.add('rpc'))