Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

71 lines
2.4KB

  1. const getOrCreateRpc = (username) => {
  2. if(State.username === username) {
  3. return
  4. }
  5. if(!State.rpcs[username]) {
  6. rpc.onicecandidate = ({candidate}) => {
  7. if(candidate) {
  8. wire({kind: 'peerInfo', value: {type: 'candidate', candidate}})
  9. }
  10. }
  11. rpc.ontrack = (e) => {
  12. State.streams[username] = e.streams[0]
  13. m.redraw()
  14. }
  15. rpc.onclose = (e) => {
  16. console.log(username, e)
  17. }
  18. rpc.oniceconnectionstatechange = (e) => {
  19. m.redraw()
  20. }
  21. State.rpcs[username] = rpc
  22. }
  23. return State.rpcs[username]
  24. }
  25. const onPeerInfo = async ({detail: message}) => {
  26. const localStream = State.streams[State.username]
  27. const rpc = localStream && getOrCreateRpc(message.source)
  28. const resetStreams = () => {
  29. rpc.getSenders().forEach(sender => rpc.removeTrack(sender))
  30. localStream.getTracks().forEach(track => rpc.addTrack(track, localStream))
  31. }
  32. if(rpc && message.value.type === 'request') {
  33. resetStreams()
  34. const localOffer = await rpc.createOffer()
  35. await rpc.setLocalDescription(localOffer)
  36. wire({kind: 'peerInfo', value: localOffer, target: message.source})
  37. }
  38. else if(rpc && message.value.type === 'offer') {
  39. resetStreams()
  40. const remoteOffer = new RTCSessionDescription(message.value)
  41. await rpc.setRemoteDescription(remoteOffer)
  42. const localAnswer = await rpc.createAnswer()
  43. await rpc.setLocalDescription(localAnswer)
  44. wire({kind: 'peerInfo', value: localAnswer, target: message.source})
  45. }
  46. else if(rpc && message.value.type === 'answer') {
  47. const remoteAnswer = new RTCSessionDescription(message.value)
  48. await rpc.setRemoteDescription(remoteAnswer)
  49. }
  50. else if(rpc && message.value.type === 'candidate') {
  51. const candidate = new RTCIceCandidate(message.value.candidate)
  52. rpc.addIceCandidate(candidate)
  53. }
  54. else if(message.value.type === 'stop') {
  55. if(State.streams[message.source]) {
  56. State.streams[message.source].getTracks().map(track => track.stop())
  57. delete State.streams[message.source]
  58. }
  59. if(State.rpcs[message.source]) {
  60. State.rpcs[message.source].close()
  61. delete State.rpcs[message.source]
  62. }
  63. }
  64. else if(rpc) {
  65. console.log('uncaught', message)
  66. }
  67. }