@lakutata/webrtc 0.0.0-stage → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1094) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +509 -2
  3. package/README.zh-CN.md +399 -0
  4. package/THIRD_PARTY_NOTICES.md +652 -0
  5. package/dist/cjs/client/SignalingConnection.d.ts +81 -0
  6. package/dist/cjs/client/SignalingConnection.js +67 -0
  7. package/dist/cjs/cluster/Cluster.d.ts +503 -0
  8. package/dist/cjs/cluster/Cluster.js +546 -0
  9. package/dist/cjs/cluster/ClusterFrames.d.ts +24 -0
  10. package/dist/cjs/cluster/ClusterFrames.js +90 -0
  11. package/dist/cjs/cluster/ClusterTURN.d.ts +63 -0
  12. package/dist/cjs/cluster/ClusterTURN.js +78 -0
  13. package/dist/cjs/cluster/Rendezvous.d.ts +8 -0
  14. package/dist/cjs/cluster/Rendezvous.js +23 -0
  15. package/dist/cjs/cluster/transports/ClusterTransport.d.ts +34 -0
  16. package/dist/cjs/cluster/transports/ClusterTransport.js +2 -0
  17. package/dist/cjs/cluster/transports/LoadClient.d.ts +6 -0
  18. package/dist/cjs/cluster/transports/LoadClient.js +80 -0
  19. package/dist/cjs/cluster/transports/MemoryClusterTransport.d.ts +13 -0
  20. package/dist/cjs/cluster/transports/MemoryClusterTransport.js +47 -0
  21. package/dist/cjs/cluster/transports/NATSClusterTransport.d.ts +23 -0
  22. package/dist/cjs/cluster/transports/NATSClusterTransport.js +70 -0
  23. package/dist/cjs/cluster/transports/RedisClusterTransport.d.ts +23 -0
  24. package/dist/cjs/cluster/transports/RedisClusterTransport.js +77 -0
  25. package/dist/cjs/exceptions/ClusterRequestException.d.ts +11 -0
  26. package/dist/cjs/exceptions/ClusterRequestException.js +18 -0
  27. package/dist/cjs/exceptions/ClusterTimeoutException.d.ts +10 -0
  28. package/dist/cjs/exceptions/ClusterTimeoutException.js +17 -0
  29. package/dist/cjs/exceptions/ClusterTransportNotFoundException.d.ts +11 -0
  30. package/dist/cjs/exceptions/ClusterTransportNotFoundException.js +18 -0
  31. package/dist/cjs/exceptions/SignalingClientRequiredException.d.ts +12 -0
  32. package/dist/cjs/exceptions/SignalingClientRequiredException.js +19 -0
  33. package/dist/cjs/exceptions/SignalingConnectionException.d.ts +12 -0
  34. package/dist/cjs/exceptions/SignalingConnectionException.js +19 -0
  35. package/dist/cjs/exceptions/SignalingDeniedException.d.ts +11 -0
  36. package/dist/cjs/exceptions/SignalingDeniedException.js +18 -0
  37. package/dist/cjs/exceptions/SignalingLimitException.d.ts +11 -0
  38. package/dist/cjs/exceptions/SignalingLimitException.js +18 -0
  39. package/dist/cjs/exceptions/SignalingNotAMemberException.d.ts +11 -0
  40. package/dist/cjs/exceptions/SignalingNotAMemberException.js +18 -0
  41. package/dist/cjs/exceptions/WHEPDeniedException.d.ts +15 -0
  42. package/dist/cjs/exceptions/WHEPDeniedException.js +22 -0
  43. package/dist/cjs/exceptions/WHEPLimitException.d.ts +15 -0
  44. package/dist/cjs/exceptions/WHEPLimitException.js +22 -0
  45. package/dist/cjs/exceptions/WHEPMediaTypeException.d.ts +15 -0
  46. package/dist/cjs/exceptions/WHEPMediaTypeException.js +22 -0
  47. package/dist/cjs/exceptions/WHEPOfferException.d.ts +16 -0
  48. package/dist/cjs/exceptions/WHEPOfferException.js +23 -0
  49. package/dist/cjs/exceptions/WHEPSessionNotFoundException.d.ts +15 -0
  50. package/dist/cjs/exceptions/WHEPSessionNotFoundException.js +22 -0
  51. package/dist/cjs/exceptions/WHIPDeniedException.d.ts +15 -0
  52. package/dist/cjs/exceptions/WHIPDeniedException.js +22 -0
  53. package/dist/cjs/exceptions/WHIPLimitException.d.ts +15 -0
  54. package/dist/cjs/exceptions/WHIPLimitException.js +22 -0
  55. package/dist/cjs/exceptions/WHIPMediaTypeException.d.ts +15 -0
  56. package/dist/cjs/exceptions/WHIPMediaTypeException.js +22 -0
  57. package/dist/cjs/exceptions/WHIPOfferException.d.ts +16 -0
  58. package/dist/cjs/exceptions/WHIPOfferException.js +23 -0
  59. package/dist/cjs/exceptions/WHIPSessionNotFoundException.d.ts +15 -0
  60. package/dist/cjs/exceptions/WHIPSessionNotFoundException.js +22 -0
  61. package/dist/cjs/exports/Client.d.ts +11 -0
  62. package/dist/cjs/exports/Client.js +29 -0
  63. package/dist/cjs/exports/WebRTC.d.ts +48 -0
  64. package/dist/cjs/exports/WebRTC.js +72 -0
  65. package/dist/cjs/lib/common/binary.d.ts +51 -0
  66. package/dist/cjs/lib/common/binary.js +264 -0
  67. package/dist/cjs/lib/common/binaryData.d.ts +116 -0
  68. package/dist/cjs/lib/common/binaryData.js +400 -0
  69. package/dist/cjs/lib/common/crc.d.ts +4 -0
  70. package/dist/cjs/lib/common/crc.js +122 -0
  71. package/dist/cjs/lib/common/deque.d.ts +36 -0
  72. package/dist/cjs/lib/common/deque.js +89 -0
  73. package/dist/cjs/lib/common/event.d.ts +48 -0
  74. package/dist/cjs/lib/common/event.js +207 -0
  75. package/dist/cjs/lib/common/index.d.ts +11 -0
  76. package/dist/cjs/lib/common/index.js +50 -0
  77. package/dist/cjs/lib/common/log.d.ts +47 -0
  78. package/dist/cjs/lib/common/log.js +62 -0
  79. package/dist/cjs/lib/common/network.d.ts +10 -0
  80. package/dist/cjs/lib/common/network.js +60 -0
  81. package/dist/cjs/lib/common/number.d.ts +13 -0
  82. package/dist/cjs/lib/common/number.js +43 -0
  83. package/dist/cjs/lib/common/promise.d.ts +21 -0
  84. package/dist/cjs/lib/common/promise.js +70 -0
  85. package/dist/cjs/lib/common/transport.d.ts +104 -0
  86. package/dist/cjs/lib/common/transport.js +441 -0
  87. package/dist/cjs/lib/common/type.d.ts +3 -0
  88. package/dist/cjs/lib/common/type.js +2 -0
  89. package/dist/cjs/lib/dtls/cipher/const.d.ts +42 -0
  90. package/dist/cjs/lib/dtls/cipher/const.js +33 -0
  91. package/dist/cjs/lib/dtls/cipher/create.d.ts +21 -0
  92. package/dist/cjs/lib/dtls/cipher/create.js +105 -0
  93. package/dist/cjs/lib/dtls/cipher/ec.d.ts +28 -0
  94. package/dist/cjs/lib/dtls/cipher/ec.js +44 -0
  95. package/dist/cjs/lib/dtls/cipher/key-exchange.d.ts +43 -0
  96. package/dist/cjs/lib/dtls/cipher/key-exchange.js +113 -0
  97. package/dist/cjs/lib/dtls/cipher/namedCurve.d.ts +7 -0
  98. package/dist/cjs/lib/dtls/cipher/namedCurve.js +27 -0
  99. package/dist/cjs/lib/dtls/cipher/prf.d.ts +17 -0
  100. package/dist/cjs/lib/dtls/cipher/prf.js +92 -0
  101. package/dist/cjs/lib/dtls/cipher/suites/abstract.d.ts +40 -0
  102. package/dist/cjs/lib/dtls/cipher/suites/abstract.js +41 -0
  103. package/dist/cjs/lib/dtls/cipher/suites/aead.d.ts +28 -0
  104. package/dist/cjs/lib/dtls/cipher/suites/aead.js +132 -0
  105. package/dist/cjs/lib/dtls/cipher/suites/null.d.ts +24 -0
  106. package/dist/cjs/lib/dtls/cipher/suites/null.js +41 -0
  107. package/dist/cjs/lib/dtls/cipher/utils.d.ts +18 -0
  108. package/dist/cjs/lib/dtls/cipher/utils.js +70 -0
  109. package/dist/cjs/lib/dtls/cipher/x509.d.ts +33 -0
  110. package/dist/cjs/lib/dtls/cipher/x509.js +100 -0
  111. package/dist/cjs/lib/dtls/client.d.ts +7 -0
  112. package/dist/cjs/lib/dtls/client.js +76 -0
  113. package/dist/cjs/lib/dtls/context/cipher.d.ts +42 -0
  114. package/dist/cjs/lib/dtls/context/cipher.js +87 -0
  115. package/dist/cjs/lib/dtls/context/dtls.d.ts +38 -0
  116. package/dist/cjs/lib/dtls/context/dtls.js +49 -0
  117. package/dist/cjs/lib/dtls/context/srtp.d.ts +5 -0
  118. package/dist/cjs/lib/dtls/context/srtp.js +12 -0
  119. package/dist/cjs/lib/dtls/context/transport.d.ts +8 -0
  120. package/dist/cjs/lib/dtls/context/transport.js +17 -0
  121. package/dist/cjs/lib/dtls/flight/client/flight1.d.ts +10 -0
  122. package/dist/cjs/lib/dtls/flight/client/flight1.js +26 -0
  123. package/dist/cjs/lib/dtls/flight/client/flight3.d.ts +8 -0
  124. package/dist/cjs/lib/dtls/flight/client/flight3.js +25 -0
  125. package/dist/cjs/lib/dtls/flight/client/flight5.d.ts +18 -0
  126. package/dist/cjs/lib/dtls/flight/client/flight5.js +206 -0
  127. package/dist/cjs/lib/dtls/flight/flight.d.ts +18 -0
  128. package/dist/cjs/lib/dtls/flight/flight.js +68 -0
  129. package/dist/cjs/lib/dtls/flight/server/flight2.d.ts +6 -0
  130. package/dist/cjs/lib/dtls/flight/server/flight2.js +126 -0
  131. package/dist/cjs/lib/dtls/flight/server/flight4.d.ts +17 -0
  132. package/dist/cjs/lib/dtls/flight/server/flight4.js +87 -0
  133. package/dist/cjs/lib/dtls/flight/server/flight6.d.ts +13 -0
  134. package/dist/cjs/lib/dtls/flight/server/flight6.js +111 -0
  135. package/dist/cjs/lib/dtls/handshake/binary.d.ts +16 -0
  136. package/dist/cjs/lib/dtls/handshake/binary.js +20 -0
  137. package/dist/cjs/lib/dtls/handshake/const.d.ts +13 -0
  138. package/dist/cjs/lib/dtls/handshake/const.js +17 -0
  139. package/dist/cjs/lib/dtls/handshake/extensions/ellipticCurves.d.ts +17 -0
  140. package/dist/cjs/lib/dtls/handshake/extensions/ellipticCurves.js +40 -0
  141. package/dist/cjs/lib/dtls/handshake/extensions/extendedMasterSecret.d.ts +3 -0
  142. package/dist/cjs/lib/dtls/handshake/extensions/extendedMasterSecret.js +7 -0
  143. package/dist/cjs/lib/dtls/handshake/extensions/renegotiationIndication.d.ts +18 -0
  144. package/dist/cjs/lib/dtls/handshake/extensions/renegotiationIndication.js +34 -0
  145. package/dist/cjs/lib/dtls/handshake/extensions/signature.d.ts +26 -0
  146. package/dist/cjs/lib/dtls/handshake/extensions/signature.js +39 -0
  147. package/dist/cjs/lib/dtls/handshake/extensions/useSrtp.d.ts +19 -0
  148. package/dist/cjs/lib/dtls/handshake/extensions/useSrtp.js +65 -0
  149. package/dist/cjs/lib/dtls/handshake/message/alert.d.ts +12 -0
  150. package/dist/cjs/lib/dtls/handshake/message/alert.js +24 -0
  151. package/dist/cjs/lib/dtls/handshake/message/certificate.d.ts +17 -0
  152. package/dist/cjs/lib/dtls/handshake/message/certificate.js +35 -0
  153. package/dist/cjs/lib/dtls/handshake/message/changeCipherSpec.d.ts +11 -0
  154. package/dist/cjs/lib/dtls/handshake/message/changeCipherSpec.js +24 -0
  155. package/dist/cjs/lib/dtls/handshake/message/client/certificateVerify.d.ts +20 -0
  156. package/dist/cjs/lib/dtls/handshake/message/client/certificateVerify.js +35 -0
  157. package/dist/cjs/lib/dtls/handshake/message/client/hello.d.ts +50 -0
  158. package/dist/cjs/lib/dtls/handshake/message/client/hello.js +48 -0
  159. package/dist/cjs/lib/dtls/handshake/message/client/keyExchange.d.ts +17 -0
  160. package/dist/cjs/lib/dtls/handshake/message/client/keyExchange.js +33 -0
  161. package/dist/cjs/lib/dtls/handshake/message/finished.d.ts +13 -0
  162. package/dist/cjs/lib/dtls/handshake/message/finished.js +26 -0
  163. package/dist/cjs/lib/dtls/handshake/message/server/certificateRequest.d.ts +31 -0
  164. package/dist/cjs/lib/dtls/handshake/message/server/certificateRequest.js +38 -0
  165. package/dist/cjs/lib/dtls/handshake/message/server/hello.d.ts +33 -0
  166. package/dist/cjs/lib/dtls/handshake/message/server/hello.js +57 -0
  167. package/dist/cjs/lib/dtls/handshake/message/server/helloDone.d.ts +12 -0
  168. package/dist/cjs/lib/dtls/handshake/message/server/helloDone.js +30 -0
  169. package/dist/cjs/lib/dtls/handshake/message/server/helloVerifyRequest.d.ts +32 -0
  170. package/dist/cjs/lib/dtls/handshake/message/server/helloVerifyRequest.js +42 -0
  171. package/dist/cjs/lib/dtls/handshake/message/server/keyExchange.d.ts +32 -0
  172. package/dist/cjs/lib/dtls/handshake/message/server/keyExchange.js +49 -0
  173. package/dist/cjs/lib/dtls/handshake/random.d.ts +13 -0
  174. package/dist/cjs/lib/dtls/handshake/random.js +29 -0
  175. package/dist/cjs/lib/dtls/helper.d.ts +4 -0
  176. package/dist/cjs/lib/dtls/helper.js +30 -0
  177. package/dist/cjs/lib/dtls/imports/common.d.ts +1 -0
  178. package/dist/cjs/lib/dtls/imports/common.js +17 -0
  179. package/dist/cjs/lib/dtls/imports/rtp.d.ts +1 -0
  180. package/dist/cjs/lib/dtls/imports/rtp.js +17 -0
  181. package/dist/cjs/lib/dtls/index.d.ts +7 -0
  182. package/dist/cjs/lib/dtls/index.js +117 -0
  183. package/dist/cjs/lib/dtls/record/antiReplayWindow.d.ts +27 -0
  184. package/dist/cjs/lib/dtls/record/antiReplayWindow.js +102 -0
  185. package/dist/cjs/lib/dtls/record/builder.d.ts +9 -0
  186. package/dist/cjs/lib/dtls/record/builder.js +27 -0
  187. package/dist/cjs/lib/dtls/record/const.d.ts +33 -0
  188. package/dist/cjs/lib/dtls/record/const.js +38 -0
  189. package/dist/cjs/lib/dtls/record/message/fragment.d.ts +26 -0
  190. package/dist/cjs/lib/dtls/record/message/fragment.js +96 -0
  191. package/dist/cjs/lib/dtls/record/message/header.d.ts +38 -0
  192. package/dist/cjs/lib/dtls/record/message/header.js +34 -0
  193. package/dist/cjs/lib/dtls/record/message/plaintext.d.ts +14 -0
  194. package/dist/cjs/lib/dtls/record/message/plaintext.js +63 -0
  195. package/dist/cjs/lib/dtls/record/receive.d.ts +9 -0
  196. package/dist/cjs/lib/dtls/record/receive.js +91 -0
  197. package/dist/cjs/lib/dtls/server.d.ts +6 -0
  198. package/dist/cjs/lib/dtls/server.js +78 -0
  199. package/dist/cjs/lib/dtls/socket.d.ts +52 -0
  200. package/dist/cjs/lib/dtls/socket.js +188 -0
  201. package/dist/cjs/lib/dtls/typings/domain.d.ts +20 -0
  202. package/dist/cjs/lib/dtls/typings/domain.js +2 -0
  203. package/dist/cjs/lib/dtls/util/binary.d.ts +2 -0
  204. package/dist/cjs/lib/dtls/util/binary.js +8 -0
  205. package/dist/cjs/lib/ice/candidate.d.ts +35 -0
  206. package/dist/cjs/lib/ice/candidate.js +198 -0
  207. package/dist/cjs/lib/ice/dns/lookup.d.ts +16 -0
  208. package/dist/cjs/lib/ice/dns/lookup.js +133 -0
  209. package/dist/cjs/lib/ice/dns/mdns.d.ts +38 -0
  210. package/dist/cjs/lib/ice/dns/mdns.js +145 -0
  211. package/dist/cjs/lib/ice/exceptions.d.ts +24 -0
  212. package/dist/cjs/lib/ice/exceptions.js +41 -0
  213. package/dist/cjs/lib/ice/helper.d.ts +17 -0
  214. package/dist/cjs/lib/ice/helper.js +74 -0
  215. package/dist/cjs/lib/ice/ice.d.ts +182 -0
  216. package/dist/cjs/lib/ice/ice.js +1584 -0
  217. package/dist/cjs/lib/ice/iceBase.d.ts +214 -0
  218. package/dist/cjs/lib/ice/iceBase.js +182 -0
  219. package/dist/cjs/lib/ice/imports/common.d.ts +1 -0
  220. package/dist/cjs/lib/ice/imports/common.js +17 -0
  221. package/dist/cjs/lib/ice/index.d.ts +12 -0
  222. package/dist/cjs/lib/ice/index.js +30 -0
  223. package/dist/cjs/lib/ice/internal/selectAddresses.d.ts +9 -0
  224. package/dist/cjs/lib/ice/internal/selectAddresses.js +39 -0
  225. package/dist/cjs/lib/ice/stun/attributes.d.ts +1 -0
  226. package/dist/cjs/lib/ice/stun/attributes.js +17 -0
  227. package/dist/cjs/lib/ice/stun/const.d.ts +8 -0
  228. package/dist/cjs/lib/ice/stun/const.js +25 -0
  229. package/dist/cjs/lib/ice/stun/message.d.ts +1 -0
  230. package/dist/cjs/lib/ice/stun/message.js +17 -0
  231. package/dist/cjs/lib/ice/stun/protocol.d.ts +30 -0
  232. package/dist/cjs/lib/ice/stun/protocol.js +125 -0
  233. package/dist/cjs/lib/ice/stun/tcpFrame.d.ts +5 -0
  234. package/dist/cjs/lib/ice/stun/tcpFrame.js +25 -0
  235. package/dist/cjs/lib/ice/stun/tcpProtocol.d.ts +57 -0
  236. package/dist/cjs/lib/ice/stun/tcpProtocol.js +323 -0
  237. package/dist/cjs/lib/ice/stun/transaction.d.ts +75 -0
  238. package/dist/cjs/lib/ice/stun/transaction.js +239 -0
  239. package/dist/cjs/lib/ice/turn/frame.d.ts +1 -0
  240. package/dist/cjs/lib/ice/turn/frame.js +17 -0
  241. package/dist/cjs/lib/ice/turn/protocol.d.ts +170 -0
  242. package/dist/cjs/lib/ice/turn/protocol.js +638 -0
  243. package/dist/cjs/lib/ice/types/model.d.ts +56 -0
  244. package/dist/cjs/lib/ice/types/model.js +2 -0
  245. package/dist/cjs/lib/ice/utils.d.ts +13 -0
  246. package/dist/cjs/lib/ice/utils.js +84 -0
  247. package/dist/cjs/lib/peer/const.d.ts +36 -0
  248. package/dist/cjs/lib/peer/const.js +53 -0
  249. package/dist/cjs/lib/peer/dataChannel.d.ts +69 -0
  250. package/dist/cjs/lib/peer/dataChannel.js +133 -0
  251. package/dist/cjs/lib/peer/errors.d.ts +11 -0
  252. package/dist/cjs/lib/peer/errors.js +23 -0
  253. package/dist/cjs/lib/peer/helper.d.ts +20 -0
  254. package/dist/cjs/lib/peer/helper.js +84 -0
  255. package/dist/cjs/lib/peer/imports/common.d.ts +1 -0
  256. package/dist/cjs/lib/peer/imports/common.js +17 -0
  257. package/dist/cjs/lib/peer/imports/dtls.d.ts +1 -0
  258. package/dist/cjs/lib/peer/imports/dtls.js +17 -0
  259. package/dist/cjs/lib/peer/imports/ice.d.ts +1 -0
  260. package/dist/cjs/lib/peer/imports/ice.js +17 -0
  261. package/dist/cjs/lib/peer/imports/rtp.d.ts +1 -0
  262. package/dist/cjs/lib/peer/imports/rtp.js +17 -0
  263. package/dist/cjs/lib/peer/index.d.ts +14 -0
  264. package/dist/cjs/lib/peer/index.js +30 -0
  265. package/dist/cjs/lib/peer/media/codec.d.ts +15 -0
  266. package/dist/cjs/lib/peer/media/codec.js +80 -0
  267. package/dist/cjs/lib/peer/media/codecCompatibility.d.ts +23 -0
  268. package/dist/cjs/lib/peer/media/codecCompatibility.js +137 -0
  269. package/dist/cjs/lib/peer/media/extension/rtcpFeedback.d.ts +6 -0
  270. package/dist/cjs/lib/peer/media/extension/rtcpFeedback.js +13 -0
  271. package/dist/cjs/lib/peer/media/extension/rtpExtension.d.ts +9 -0
  272. package/dist/cjs/lib/peer/media/extension/rtpExtension.js +52 -0
  273. package/dist/cjs/lib/peer/media/index.d.ts +12 -0
  274. package/dist/cjs/lib/peer/media/index.js +28 -0
  275. package/dist/cjs/lib/peer/media/parameters.d.ts +65 -0
  276. package/dist/cjs/lib/peer/media/parameters.js +60 -0
  277. package/dist/cjs/lib/peer/media/receiver/nack.d.ts +23 -0
  278. package/dist/cjs/lib/peer/media/receiver/nack.js +104 -0
  279. package/dist/cjs/lib/peer/media/receiver/receiverTwcc.d.ts +47 -0
  280. package/dist/cjs/lib/peer/media/receiver/receiverTwcc.js +179 -0
  281. package/dist/cjs/lib/peer/media/receiver/statistics.d.ts +22 -0
  282. package/dist/cjs/lib/peer/media/receiver/statistics.js +71 -0
  283. package/dist/cjs/lib/peer/media/router.d.ts +25 -0
  284. package/dist/cjs/lib/peer/media/router.js +166 -0
  285. package/dist/cjs/lib/peer/media/rtpReceiver.d.ts +90 -0
  286. package/dist/cjs/lib/peer/media/rtpReceiver.js +407 -0
  287. package/dist/cjs/lib/peer/media/rtpSender.d.ts +209 -0
  288. package/dist/cjs/lib/peer/media/rtpSender.js +826 -0
  289. package/dist/cjs/lib/peer/media/rtpTransceiver.d.ts +117 -0
  290. package/dist/cjs/lib/peer/media/rtpTransceiver.js +245 -0
  291. package/dist/cjs/lib/peer/media/sender/cumulativeResult.d.ts +19 -0
  292. package/dist/cjs/lib/peer/media/sender/cumulativeResult.js +61 -0
  293. package/dist/cjs/lib/peer/media/sender/senderBWE.d.ts +32 -0
  294. package/dist/cjs/lib/peer/media/sender/senderBWE.js +99 -0
  295. package/dist/cjs/lib/peer/media/stats.d.ts +293 -0
  296. package/dist/cjs/lib/peer/media/stats.js +90 -0
  297. package/dist/cjs/lib/peer/media/track.d.ts +67 -0
  298. package/dist/cjs/lib/peer/media/track.js +216 -0
  299. package/dist/cjs/lib/peer/peerConnection.d.ts +458 -0
  300. package/dist/cjs/lib/peer/peerConnection.js +1591 -0
  301. package/dist/cjs/lib/peer/sctpManager.d.ts +28 -0
  302. package/dist/cjs/lib/peer/sctpManager.js +138 -0
  303. package/dist/cjs/lib/peer/sdp.d.ts +97 -0
  304. package/dist/cjs/lib/peer/sdp.js +628 -0
  305. package/dist/cjs/lib/peer/sdpManager.d.ts +116 -0
  306. package/dist/cjs/lib/peer/sdpManager.js +573 -0
  307. package/dist/cjs/lib/peer/secureTransportManager.d.ts +96 -0
  308. package/dist/cjs/lib/peer/secureTransportManager.js +472 -0
  309. package/dist/cjs/lib/peer/transceiverManager.d.ts +151 -0
  310. package/dist/cjs/lib/peer/transceiverManager.js +767 -0
  311. package/dist/cjs/lib/peer/transport/dtls.d.ts +95 -0
  312. package/dist/cjs/lib/peer/transport/dtls.js +571 -0
  313. package/dist/cjs/lib/peer/transport/ice.d.ts +143 -0
  314. package/dist/cjs/lib/peer/transport/ice.js +436 -0
  315. package/dist/cjs/lib/peer/transport/sctp.d.ts +56 -0
  316. package/dist/cjs/lib/peer/transport/sctp.js +387 -0
  317. package/dist/cjs/lib/peer/types/domain.d.ts +5 -0
  318. package/dist/cjs/lib/peer/types/domain.js +19 -0
  319. package/dist/cjs/lib/peer/types/util.d.ts +2 -0
  320. package/dist/cjs/lib/peer/types/util.js +2 -0
  321. package/dist/cjs/lib/peer/utils.d.ts +73 -0
  322. package/dist/cjs/lib/peer/utils.js +306 -0
  323. package/dist/cjs/lib/rtp/codec/av1.d.ts +56 -0
  324. package/dist/cjs/lib/rtp/codec/av1.js +209 -0
  325. package/dist/cjs/lib/rtp/codec/base.d.ts +8 -0
  326. package/dist/cjs/lib/rtp/codec/base.js +15 -0
  327. package/dist/cjs/lib/rtp/codec/h264.d.ts +32 -0
  328. package/dist/cjs/lib/rtp/codec/h264.js +122 -0
  329. package/dist/cjs/lib/rtp/codec/index.d.ts +16 -0
  330. package/dist/cjs/lib/rtp/codec/index.js +84 -0
  331. package/dist/cjs/lib/rtp/codec/leb128.d.ts +5 -0
  332. package/dist/cjs/lib/rtp/codec/leb128.js +23 -0
  333. package/dist/cjs/lib/rtp/codec/opus.d.ts +9 -0
  334. package/dist/cjs/lib/rtp/codec/opus.js +25 -0
  335. package/dist/cjs/lib/rtp/codec/vp8.d.ts +27 -0
  336. package/dist/cjs/lib/rtp/codec/vp8.js +109 -0
  337. package/dist/cjs/lib/rtp/codec/vp9.d.ts +46 -0
  338. package/dist/cjs/lib/rtp/codec/vp9.js +161 -0
  339. package/dist/cjs/lib/rtp/const.d.ts +1 -0
  340. package/dist/cjs/lib/rtp/const.js +4 -0
  341. package/dist/cjs/lib/rtp/helper.d.ts +8 -0
  342. package/dist/cjs/lib/rtp/helper.js +36 -0
  343. package/dist/cjs/lib/rtp/imports/common.d.ts +1 -0
  344. package/dist/cjs/lib/rtp/imports/common.js +17 -0
  345. package/dist/cjs/lib/rtp/index.d.ts +25 -0
  346. package/dist/cjs/lib/rtp/index.js +41 -0
  347. package/dist/cjs/lib/rtp/rtcp/header.d.ts +13 -0
  348. package/dist/cjs/lib/rtp/rtcp/header.js +50 -0
  349. package/dist/cjs/lib/rtp/rtcp/psfb/fullIntraRequest.d.ts +16 -0
  350. package/dist/cjs/lib/rtp/rtcp/psfb/fullIntraRequest.js +34 -0
  351. package/dist/cjs/lib/rtp/rtcp/psfb/index.d.ts +14 -0
  352. package/dist/cjs/lib/rtp/rtcp/psfb/index.js +39 -0
  353. package/dist/cjs/lib/rtp/rtcp/psfb/pictureLossIndication.d.ts +10 -0
  354. package/dist/cjs/lib/rtp/rtcp/psfb/pictureLossIndication.js +20 -0
  355. package/dist/cjs/lib/rtp/rtcp/psfb/remb.d.ts +16 -0
  356. package/dist/cjs/lib/rtp/rtcp/psfb/remb.js +53 -0
  357. package/dist/cjs/lib/rtp/rtcp/rr.d.ts +32 -0
  358. package/dist/cjs/lib/rtp/rtcp/rr.js +73 -0
  359. package/dist/cjs/lib/rtp/rtcp/rtcp.d.ts +10 -0
  360. package/dist/cjs/lib/rtp/rtcp/rtcp.js +58 -0
  361. package/dist/cjs/lib/rtp/rtcp/rtpfb/const.d.ts +1 -0
  362. package/dist/cjs/lib/rtp/rtcp/rtpfb/const.js +4 -0
  363. package/dist/cjs/lib/rtp/rtcp/rtpfb/index.d.ts +14 -0
  364. package/dist/cjs/lib/rtp/rtcp/rtpfb/index.js +35 -0
  365. package/dist/cjs/lib/rtp/rtcp/rtpfb/nack.d.ts +17 -0
  366. package/dist/cjs/lib/rtp/rtcp/rtpfb/nack.js +77 -0
  367. package/dist/cjs/lib/rtp/rtcp/rtpfb/twcc.d.ts +71 -0
  368. package/dist/cjs/lib/rtp/rtcp/rtpfb/twcc.js +352 -0
  369. package/dist/cjs/lib/rtp/rtcp/sdes.d.ts +26 -0
  370. package/dist/cjs/lib/rtp/rtcp/sdes.js +97 -0
  371. package/dist/cjs/lib/rtp/rtcp/sr.d.ts +41 -0
  372. package/dist/cjs/lib/rtp/rtcp/sr.js +110 -0
  373. package/dist/cjs/lib/rtp/rtp/headerExtension.d.ts +72 -0
  374. package/dist/cjs/lib/rtp/rtp/headerExtension.js +117 -0
  375. package/dist/cjs/lib/rtp/rtp/red/encoder.d.ts +13 -0
  376. package/dist/cjs/lib/rtp/rtp/red/encoder.js +44 -0
  377. package/dist/cjs/lib/rtp/rtp/red/handler.d.ts +6 -0
  378. package/dist/cjs/lib/rtp/rtp/red/handler.js +59 -0
  379. package/dist/cjs/lib/rtp/rtp/red/packet.d.ts +26 -0
  380. package/dist/cjs/lib/rtp/rtp/red/packet.js +112 -0
  381. package/dist/cjs/lib/rtp/rtp/rtp.d.ts +44 -0
  382. package/dist/cjs/lib/rtp/rtp/rtp.js +271 -0
  383. package/dist/cjs/lib/rtp/rtp/rtx.d.ts +3 -0
  384. package/dist/cjs/lib/rtp/rtp/rtx.js +29 -0
  385. package/dist/cjs/lib/rtp/srtp/cipher/ctr.d.ts +16 -0
  386. package/dist/cjs/lib/rtp/srtp/cipher/ctr.js +107 -0
  387. package/dist/cjs/lib/rtp/srtp/cipher/gcm.d.ts +17 -0
  388. package/dist/cjs/lib/rtp/srtp/cipher/gcm.js +145 -0
  389. package/dist/cjs/lib/rtp/srtp/cipher/index.d.ts +13 -0
  390. package/dist/cjs/lib/rtp/srtp/cipher/index.js +24 -0
  391. package/dist/cjs/lib/rtp/srtp/const.d.ts +6 -0
  392. package/dist/cjs/lib/rtp/srtp/const.js +26 -0
  393. package/dist/cjs/lib/rtp/srtp/context/context.d.ts +45 -0
  394. package/dist/cjs/lib/rtp/srtp/context/context.js +180 -0
  395. package/dist/cjs/lib/rtp/srtp/context/srtcp.d.ts +8 -0
  396. package/dist/cjs/lib/rtp/srtp/context/srtcp.js +25 -0
  397. package/dist/cjs/lib/rtp/srtp/context/srtp.d.ts +9 -0
  398. package/dist/cjs/lib/rtp/srtp/context/srtp.js +41 -0
  399. package/dist/cjs/lib/rtp/srtp/error.d.ts +3 -0
  400. package/dist/cjs/lib/rtp/srtp/error.js +10 -0
  401. package/dist/cjs/lib/rtp/srtp/packet.d.ts +5 -0
  402. package/dist/cjs/lib/rtp/srtp/packet.js +47 -0
  403. package/dist/cjs/lib/rtp/srtp/session.d.ts +19 -0
  404. package/dist/cjs/lib/rtp/srtp/session.js +13 -0
  405. package/dist/cjs/lib/rtp/srtp/srtcp.d.ts +8 -0
  406. package/dist/cjs/lib/rtp/srtp/srtcp.js +21 -0
  407. package/dist/cjs/lib/rtp/srtp/srtp.d.ts +9 -0
  408. package/dist/cjs/lib/rtp/srtp/srtp.js +20 -0
  409. package/dist/cjs/lib/rtp/transport.d.ts +15 -0
  410. package/dist/cjs/lib/rtp/transport.js +23 -0
  411. package/dist/cjs/lib/rtp/util.d.ts +11 -0
  412. package/dist/cjs/lib/rtp/util.js +28 -0
  413. package/dist/cjs/lib/sctp/chunk.d.ts +164 -0
  414. package/dist/cjs/lib/sctp/chunk.js +542 -0
  415. package/dist/cjs/lib/sctp/const.d.ts +17 -0
  416. package/dist/cjs/lib/sctp/const.js +22 -0
  417. package/dist/cjs/lib/sctp/helper.d.ts +5 -0
  418. package/dist/cjs/lib/sctp/helper.js +14 -0
  419. package/dist/cjs/lib/sctp/imports/common.d.ts +1 -0
  420. package/dist/cjs/lib/sctp/imports/common.js +17 -0
  421. package/dist/cjs/lib/sctp/index.d.ts +6 -0
  422. package/dist/cjs/lib/sctp/index.js +20 -0
  423. package/dist/cjs/lib/sctp/param.d.ts +40 -0
  424. package/dist/cjs/lib/sctp/param.js +132 -0
  425. package/dist/cjs/lib/sctp/sctp.d.ts +210 -0
  426. package/dist/cjs/lib/sctp/sctp.js +1467 -0
  427. package/dist/cjs/lib/sctp/transport.d.ts +15 -0
  428. package/dist/cjs/lib/sctp/transport.js +28 -0
  429. package/dist/cjs/lib/turn/index.d.ts +9 -0
  430. package/dist/cjs/lib/turn/index.js +25 -0
  431. package/dist/cjs/lib/turn/node/server.d.ts +21 -0
  432. package/dist/cjs/lib/turn/node/server.js +94 -0
  433. package/dist/cjs/lib/turn/node/turnServer.d.ts +91 -0
  434. package/dist/cjs/lib/turn/node/turnServer.js +565 -0
  435. package/dist/cjs/lib/turn/protocol.d.ts +47 -0
  436. package/dist/cjs/lib/turn/protocol.js +116 -0
  437. package/dist/cjs/lib/turn/stun/attributes.d.ts +37 -0
  438. package/dist/cjs/lib/turn/stun/attributes.js +208 -0
  439. package/dist/cjs/lib/turn/stun/const.d.ts +28 -0
  440. package/dist/cjs/lib/turn/stun/const.js +87 -0
  441. package/dist/cjs/lib/turn/stun/ip.d.ts +12 -0
  442. package/dist/cjs/lib/turn/stun/ip.js +87 -0
  443. package/dist/cjs/lib/turn/stun/message.d.ts +37 -0
  444. package/dist/cjs/lib/turn/stun/message.js +180 -0
  445. package/dist/cjs/lib/turn/turn/auth.d.ts +1 -0
  446. package/dist/cjs/lib/turn/turn/auth.js +9 -0
  447. package/dist/cjs/lib/turn/turn/frame.d.ts +13 -0
  448. package/dist/cjs/lib/turn/turn/frame.js +68 -0
  449. package/dist/cjs/lib/turn/turn/protocol.d.ts +147 -0
  450. package/dist/cjs/lib/turn/turn/protocol.js +785 -0
  451. package/dist/cjs/package.json +1 -0
  452. package/dist/cjs/peer/Endpoints.d.ts +75 -0
  453. package/dist/cjs/peer/Endpoints.js +154 -0
  454. package/dist/cjs/peer/EngineConfig.d.ts +20 -0
  455. package/dist/cjs/peer/EngineConfig.js +36 -0
  456. package/dist/cjs/peer/EngineConnection.d.ts +22 -0
  457. package/dist/cjs/peer/EngineConnection.js +27 -0
  458. package/dist/cjs/peer/Events.d.ts +55 -0
  459. package/dist/cjs/peer/Events.js +85 -0
  460. package/dist/cjs/peer/MediaCodecs.d.ts +27 -0
  461. package/dist/cjs/peer/MediaCodecs.js +53 -0
  462. package/dist/cjs/peer/MediaTrack.d.ts +212 -0
  463. package/dist/cjs/peer/MediaTrack.js +313 -0
  464. package/dist/cjs/peer/PeerChannel.d.ts +248 -0
  465. package/dist/cjs/peer/PeerChannel.js +319 -0
  466. package/dist/cjs/peer/PeerConnection.d.ts +603 -0
  467. package/dist/cjs/peer/PeerConnection.js +697 -0
  468. package/dist/cjs/peer/PeerThreadChannel.d.ts +112 -0
  469. package/dist/cjs/peer/PeerThreadChannel.js +273 -0
  470. package/dist/cjs/peer/PeerThreadProtocol.d.ts +325 -0
  471. package/dist/cjs/peer/PeerThreadProtocol.js +2 -0
  472. package/dist/cjs/peer/PeerThreads.d.ts +114 -0
  473. package/dist/cjs/peer/PeerThreads.js +268 -0
  474. package/dist/cjs/peer/PeerWorker.d.ts +6 -0
  475. package/dist/cjs/peer/PeerWorker.js +461 -0
  476. package/dist/cjs/peer/PeerWorkerCode.d.ts +5 -0
  477. package/dist/cjs/peer/PeerWorkerCode.js +4 -0
  478. package/dist/cjs/peer/RemoteConnection.d.ts +314 -0
  479. package/dist/cjs/peer/RemoteConnection.js +913 -0
  480. package/dist/cjs/peer/RtpPacket.d.ts +112 -0
  481. package/dist/cjs/peer/RtpPacket.js +92 -0
  482. package/dist/cjs/peer/RtpTransceiver.d.ts +167 -0
  483. package/dist/cjs/peer/RtpTransceiver.js +235 -0
  484. package/dist/cjs/peer/SignalingClient.d.ts +236 -0
  485. package/dist/cjs/peer/SignalingClient.js +285 -0
  486. package/dist/cjs/protocol/SignalingProtocol.d.ts +266 -0
  487. package/dist/cjs/protocol/SignalingProtocol.js +65 -0
  488. package/dist/cjs/service/WebRTCServiceEntrypoint.d.ts +158 -0
  489. package/dist/cjs/service/WebRTCServiceEntrypoint.js +356 -0
  490. package/dist/cjs/sfu/SFU.d.ts +356 -0
  491. package/dist/cjs/sfu/SFU.js +763 -0
  492. package/dist/cjs/sfu/SFUAccess.d.ts +48 -0
  493. package/dist/cjs/sfu/SFUAccess.js +15 -0
  494. package/dist/cjs/sfu/SFUClusterLeg.d.ts +101 -0
  495. package/dist/cjs/sfu/SFUClusterLeg.js +106 -0
  496. package/dist/cjs/sfu/SFURoom.d.ts +148 -0
  497. package/dist/cjs/sfu/SFURoom.js +1300 -0
  498. package/dist/cjs/sfu/SFUWorker.d.ts +13 -0
  499. package/dist/cjs/sfu/SFUWorker.js +168 -0
  500. package/dist/cjs/sfu/SFUWorkerChannel.d.ts +204 -0
  501. package/dist/cjs/sfu/SFUWorkerChannel.js +105 -0
  502. package/dist/cjs/sfu/SFUWorkerCode.d.ts +5 -0
  503. package/dist/cjs/sfu/SFUWorkerCode.js +4 -0
  504. package/dist/cjs/sfu/SFUWorkers.d.ts +247 -0
  505. package/dist/cjs/sfu/SFUWorkers.js +552 -0
  506. package/dist/cjs/shared/ChunkedChannel.d.ts +122 -0
  507. package/dist/cjs/shared/ChunkedChannel.js +182 -0
  508. package/dist/cjs/shared/Connections.d.ts +231 -0
  509. package/dist/cjs/shared/Connections.js +2 -0
  510. package/dist/cjs/shared/Emitter.d.ts +50 -0
  511. package/dist/cjs/shared/Emitter.js +80 -0
  512. package/dist/cjs/shared/Peer.d.ts +182 -0
  513. package/dist/cjs/shared/Peer.js +509 -0
  514. package/dist/cjs/shared/PeerServiceProxy.d.ts +173 -0
  515. package/dist/cjs/shared/PeerServiceProxy.js +304 -0
  516. package/dist/cjs/shared/Room.d.ts +143 -0
  517. package/dist/cjs/shared/Room.js +515 -0
  518. package/dist/cjs/shared/SignalingError.d.ts +40 -0
  519. package/dist/cjs/shared/SignalingError.js +48 -0
  520. package/dist/cjs/shared/SignalingSession.d.ts +97 -0
  521. package/dist/cjs/shared/SignalingSession.js +347 -0
  522. package/dist/cjs/shared/Transports.d.ts +139 -0
  523. package/dist/cjs/shared/Transports.js +285 -0
  524. package/dist/cjs/signaling/MediaServers.d.ts +40 -0
  525. package/dist/cjs/signaling/MediaServers.js +16 -0
  526. package/dist/cjs/signaling/Signaling.d.ts +573 -0
  527. package/dist/cjs/signaling/Signaling.js +945 -0
  528. package/dist/cjs/signaling/SignalingController.d.ts +128 -0
  529. package/dist/cjs/signaling/SignalingController.js +229 -0
  530. package/dist/cjs/turn/TURNCredentials.d.ts +49 -0
  531. package/dist/cjs/turn/TURNCredentials.js +49 -0
  532. package/dist/cjs/turn/TURNIceServers.d.ts +11 -0
  533. package/dist/cjs/turn/TURNIceServers.js +25 -0
  534. package/dist/cjs/turn/TURNServer.d.ts +309 -0
  535. package/dist/cjs/turn/TURNServer.js +331 -0
  536. package/dist/cjs/turn/TURNWorker.d.ts +42 -0
  537. package/dist/cjs/turn/TURNWorker.js +52 -0
  538. package/dist/cjs/turn/TURNWorkerCode.d.ts +5 -0
  539. package/dist/cjs/turn/TURNWorkerCode.js +4 -0
  540. package/dist/cjs/turn/TURNWorkers.d.ts +52 -0
  541. package/dist/cjs/turn/TURNWorkers.js +211 -0
  542. package/dist/cjs/whep/WHEP.d.ts +386 -0
  543. package/dist/cjs/whep/WHEP.js +426 -0
  544. package/dist/cjs/whep/WHEPController.d.ts +134 -0
  545. package/dist/cjs/whep/WHEPController.js +301 -0
  546. package/dist/cjs/whip/WHIP.d.ts +426 -0
  547. package/dist/cjs/whip/WHIP.js +470 -0
  548. package/dist/cjs/whip/WHIPController.d.ts +132 -0
  549. package/dist/cjs/whip/WHIPController.js +299 -0
  550. package/dist/esm/client/SignalingConnection.js +63 -0
  551. package/dist/esm/cluster/Cluster.js +542 -0
  552. package/dist/esm/cluster/ClusterFrames.js +85 -0
  553. package/dist/esm/cluster/ClusterTURN.js +73 -0
  554. package/dist/esm/cluster/Rendezvous.js +20 -0
  555. package/dist/esm/cluster/transports/ClusterTransport.js +1 -0
  556. package/dist/esm/cluster/transports/LoadClient.js +44 -0
  557. package/dist/esm/cluster/transports/MemoryClusterTransport.js +43 -0
  558. package/dist/esm/cluster/transports/NATSClusterTransport.js +66 -0
  559. package/dist/esm/cluster/transports/RedisClusterTransport.js +73 -0
  560. package/dist/esm/exceptions/ClusterRequestException.js +14 -0
  561. package/dist/esm/exceptions/ClusterTimeoutException.js +13 -0
  562. package/dist/esm/exceptions/ClusterTransportNotFoundException.js +14 -0
  563. package/dist/esm/exceptions/SignalingClientRequiredException.js +15 -0
  564. package/dist/esm/exceptions/SignalingConnectionException.js +15 -0
  565. package/dist/esm/exceptions/SignalingDeniedException.js +14 -0
  566. package/dist/esm/exceptions/SignalingLimitException.js +14 -0
  567. package/dist/esm/exceptions/SignalingNotAMemberException.js +14 -0
  568. package/dist/esm/exceptions/WHEPDeniedException.js +18 -0
  569. package/dist/esm/exceptions/WHEPLimitException.js +18 -0
  570. package/dist/esm/exceptions/WHEPMediaTypeException.js +18 -0
  571. package/dist/esm/exceptions/WHEPOfferException.js +19 -0
  572. package/dist/esm/exceptions/WHEPSessionNotFoundException.js +18 -0
  573. package/dist/esm/exceptions/WHIPDeniedException.js +18 -0
  574. package/dist/esm/exceptions/WHIPLimitException.js +18 -0
  575. package/dist/esm/exceptions/WHIPMediaTypeException.js +18 -0
  576. package/dist/esm/exceptions/WHIPOfferException.js +19 -0
  577. package/dist/esm/exceptions/WHIPSessionNotFoundException.js +18 -0
  578. package/dist/esm/exports/Client.js +5 -0
  579. package/dist/esm/exports/WebRTC.js +41 -0
  580. package/dist/esm/lib/common/binary.js +244 -0
  581. package/dist/esm/lib/common/binaryData.js +392 -0
  582. package/dist/esm/lib/common/crc.js +118 -0
  583. package/dist/esm/lib/common/deque.js +85 -0
  584. package/dist/esm/lib/common/event.js +202 -0
  585. package/dist/esm/lib/common/index.js +11 -0
  586. package/dist/esm/lib/common/log.js +55 -0
  587. package/dist/esm/lib/common/network.js +52 -0
  588. package/dist/esm/lib/common/number.js +31 -0
  589. package/dist/esm/lib/common/promise.js +64 -0
  590. package/dist/esm/lib/common/transport.js +401 -0
  591. package/dist/esm/lib/common/type.js +1 -0
  592. package/dist/esm/lib/dtls/cipher/const.js +30 -0
  593. package/dist/esm/lib/dtls/cipher/create.js +98 -0
  594. package/dist/esm/lib/dtls/cipher/ec.js +37 -0
  595. package/dist/esm/lib/dtls/cipher/key-exchange.js +103 -0
  596. package/dist/esm/lib/dtls/cipher/namedCurve.js +24 -0
  597. package/dist/esm/lib/dtls/cipher/prf.js +79 -0
  598. package/dist/esm/lib/dtls/cipher/suites/abstract.js +37 -0
  599. package/dist/esm/lib/dtls/cipher/suites/aead.js +96 -0
  600. package/dist/esm/lib/dtls/cipher/suites/null.js +35 -0
  601. package/dist/esm/lib/dtls/cipher/utils.js +34 -0
  602. package/dist/esm/lib/dtls/cipher/x509.js +94 -0
  603. package/dist/esm/lib/dtls/client.js +72 -0
  604. package/dist/esm/lib/dtls/context/cipher.js +83 -0
  605. package/dist/esm/lib/dtls/context/dtls.js +45 -0
  606. package/dist/esm/lib/dtls/context/srtp.js +8 -0
  607. package/dist/esm/lib/dtls/context/transport.js +13 -0
  608. package/dist/esm/lib/dtls/flight/client/flight1.js +22 -0
  609. package/dist/esm/lib/dtls/flight/client/flight3.js +21 -0
  610. package/dist/esm/lib/dtls/flight/client/flight5.js +202 -0
  611. package/dist/esm/lib/dtls/flight/flight.js +64 -0
  612. package/dist/esm/lib/dtls/flight/server/flight2.js +122 -0
  613. package/dist/esm/lib/dtls/flight/server/flight4.js +83 -0
  614. package/dist/esm/lib/dtls/flight/server/flight6.js +107 -0
  615. package/dist/esm/lib/dtls/handshake/binary.js +17 -0
  616. package/dist/esm/lib/dtls/handshake/const.js +14 -0
  617. package/dist/esm/lib/dtls/handshake/extensions/ellipticCurves.js +36 -0
  618. package/dist/esm/lib/dtls/handshake/extensions/extendedMasterSecret.js +3 -0
  619. package/dist/esm/lib/dtls/handshake/extensions/renegotiationIndication.js +30 -0
  620. package/dist/esm/lib/dtls/handshake/extensions/signature.js +35 -0
  621. package/dist/esm/lib/dtls/handshake/extensions/useSrtp.js +61 -0
  622. package/dist/esm/lib/dtls/handshake/message/alert.js +20 -0
  623. package/dist/esm/lib/dtls/handshake/message/certificate.js +31 -0
  624. package/dist/esm/lib/dtls/handshake/message/changeCipherSpec.js +20 -0
  625. package/dist/esm/lib/dtls/handshake/message/client/certificateVerify.js +31 -0
  626. package/dist/esm/lib/dtls/handshake/message/client/hello.js +44 -0
  627. package/dist/esm/lib/dtls/handshake/message/client/keyExchange.js +29 -0
  628. package/dist/esm/lib/dtls/handshake/message/finished.js +22 -0
  629. package/dist/esm/lib/dtls/handshake/message/server/certificateRequest.js +34 -0
  630. package/dist/esm/lib/dtls/handshake/message/server/hello.js +53 -0
  631. package/dist/esm/lib/dtls/handshake/message/server/helloDone.js +26 -0
  632. package/dist/esm/lib/dtls/handshake/message/server/helloVerifyRequest.js +38 -0
  633. package/dist/esm/lib/dtls/handshake/message/server/keyExchange.js +45 -0
  634. package/dist/esm/lib/dtls/handshake/random.js +25 -0
  635. package/dist/esm/lib/dtls/helper.js +23 -0
  636. package/dist/esm/lib/dtls/imports/common.js +1 -0
  637. package/dist/esm/lib/dtls/imports/rtp.js +1 -0
  638. package/dist/esm/lib/dtls/index.js +97 -0
  639. package/dist/esm/lib/dtls/record/antiReplayWindow.js +98 -0
  640. package/dist/esm/lib/dtls/record/builder.js +22 -0
  641. package/dist/esm/lib/dtls/record/const.js +35 -0
  642. package/dist/esm/lib/dtls/record/message/fragment.js +92 -0
  643. package/dist/esm/lib/dtls/record/message/header.js +30 -0
  644. package/dist/esm/lib/dtls/record/message/plaintext.js +59 -0
  645. package/dist/esm/lib/dtls/record/receive.js +86 -0
  646. package/dist/esm/lib/dtls/server.js +74 -0
  647. package/dist/esm/lib/dtls/socket.js +184 -0
  648. package/dist/esm/lib/dtls/typings/domain.js +1 -0
  649. package/dist/esm/lib/dtls/util/binary.js +5 -0
  650. package/dist/esm/lib/ice/candidate.js +190 -0
  651. package/dist/esm/lib/ice/dns/lookup.js +95 -0
  652. package/dist/esm/lib/ice/dns/mdns.js +139 -0
  653. package/dist/esm/lib/ice/exceptions.js +34 -0
  654. package/dist/esm/lib/ice/helper.js +65 -0
  655. package/dist/esm/lib/ice/ice.js +1547 -0
  656. package/dist/esm/lib/ice/iceBase.js +172 -0
  657. package/dist/esm/lib/ice/imports/common.js +1 -0
  658. package/dist/esm/lib/ice/index.js +12 -0
  659. package/dist/esm/lib/ice/internal/selectAddresses.js +36 -0
  660. package/dist/esm/lib/ice/stun/attributes.js +1 -0
  661. package/dist/esm/lib/ice/stun/const.js +8 -0
  662. package/dist/esm/lib/ice/stun/message.js +1 -0
  663. package/dist/esm/lib/ice/stun/protocol.js +121 -0
  664. package/dist/esm/lib/ice/stun/tcpFrame.js +21 -0
  665. package/dist/esm/lib/ice/stun/tcpProtocol.js +318 -0
  666. package/dist/esm/lib/ice/stun/transaction.js +230 -0
  667. package/dist/esm/lib/ice/turn/frame.js +1 -0
  668. package/dist/esm/lib/ice/turn/protocol.js +630 -0
  669. package/dist/esm/lib/ice/types/model.js +1 -0
  670. package/dist/esm/lib/ice/utils.js +43 -0
  671. package/dist/esm/lib/peer/const.js +50 -0
  672. package/dist/esm/lib/peer/dataChannel.js +127 -0
  673. package/dist/esm/lib/peer/errors.js +17 -0
  674. package/dist/esm/lib/peer/helper.js +77 -0
  675. package/dist/esm/lib/peer/imports/common.js +1 -0
  676. package/dist/esm/lib/peer/imports/dtls.js +1 -0
  677. package/dist/esm/lib/peer/imports/ice.js +1 -0
  678. package/dist/esm/lib/peer/imports/rtp.js +1 -0
  679. package/dist/esm/lib/peer/index.js +14 -0
  680. package/dist/esm/lib/peer/media/codec.js +69 -0
  681. package/dist/esm/lib/peer/media/codecCompatibility.js +128 -0
  682. package/dist/esm/lib/peer/media/extension/rtcpFeedback.js +5 -0
  683. package/dist/esm/lib/peer/media/extension/rtpExtension.js +42 -0
  684. package/dist/esm/lib/peer/media/index.js +12 -0
  685. package/dist/esm/lib/peer/media/parameters.js +50 -0
  686. package/dist/esm/lib/peer/media/receiver/nack.js +100 -0
  687. package/dist/esm/lib/peer/media/receiver/receiverTwcc.js +175 -0
  688. package/dist/esm/lib/peer/media/receiver/statistics.js +67 -0
  689. package/dist/esm/lib/peer/media/router.js +162 -0
  690. package/dist/esm/lib/peer/media/rtpReceiver.js +403 -0
  691. package/dist/esm/lib/peer/media/rtpSender.js +822 -0
  692. package/dist/esm/lib/peer/media/rtpTransceiver.js +241 -0
  693. package/dist/esm/lib/peer/media/sender/cumulativeResult.js +57 -0
  694. package/dist/esm/lib/peer/media/sender/senderBWE.js +95 -0
  695. package/dist/esm/lib/peer/media/stats.js +81 -0
  696. package/dist/esm/lib/peer/media/track.js +208 -0
  697. package/dist/esm/lib/peer/peerConnection.js +1585 -0
  698. package/dist/esm/lib/peer/sctpManager.js +134 -0
  699. package/dist/esm/lib/peer/sdp.js +614 -0
  700. package/dist/esm/lib/peer/sdpManager.js +569 -0
  701. package/dist/esm/lib/peer/secureTransportManager.js +468 -0
  702. package/dist/esm/lib/peer/transceiverManager.js +763 -0
  703. package/dist/esm/lib/peer/transport/dtls.js +564 -0
  704. package/dist/esm/lib/peer/transport/ice.js +426 -0
  705. package/dist/esm/lib/peer/transport/sctp.js +382 -0
  706. package/dist/esm/lib/peer/types/domain.js +16 -0
  707. package/dist/esm/lib/peer/types/util.js +1 -0
  708. package/dist/esm/lib/peer/utils.js +286 -0
  709. package/dist/esm/lib/rtp/codec/av1.js +203 -0
  710. package/dist/esm/lib/rtp/codec/base.js +11 -0
  711. package/dist/esm/lib/rtp/codec/h264.js +118 -0
  712. package/dist/esm/lib/rtp/codec/index.js +66 -0
  713. package/dist/esm/lib/rtp/codec/leb128.js +20 -0
  714. package/dist/esm/lib/rtp/codec/opus.js +21 -0
  715. package/dist/esm/lib/rtp/codec/vp8.js +105 -0
  716. package/dist/esm/lib/rtp/codec/vp9.js +157 -0
  717. package/dist/esm/lib/rtp/const.js +1 -0
  718. package/dist/esm/lib/rtp/helper.js +29 -0
  719. package/dist/esm/lib/rtp/imports/common.js +1 -0
  720. package/dist/esm/lib/rtp/index.js +25 -0
  721. package/dist/esm/lib/rtp/rtcp/header.js +46 -0
  722. package/dist/esm/lib/rtp/rtcp/psfb/fullIntraRequest.js +30 -0
  723. package/dist/esm/lib/rtp/rtcp/psfb/index.js +35 -0
  724. package/dist/esm/lib/rtp/rtcp/psfb/pictureLossIndication.js +16 -0
  725. package/dist/esm/lib/rtp/rtcp/psfb/remb.js +49 -0
  726. package/dist/esm/lib/rtp/rtcp/rr.js +68 -0
  727. package/dist/esm/lib/rtp/rtcp/rtcp.js +53 -0
  728. package/dist/esm/lib/rtp/rtcp/rtpfb/const.js +1 -0
  729. package/dist/esm/lib/rtp/rtcp/rtpfb/index.js +31 -0
  730. package/dist/esm/lib/rtp/rtcp/rtpfb/nack.js +73 -0
  731. package/dist/esm/lib/rtp/rtcp/rtpfb/twcc.js +344 -0
  732. package/dist/esm/lib/rtp/rtcp/sdes.js +91 -0
  733. package/dist/esm/lib/rtp/rtcp/sr.js +104 -0
  734. package/dist/esm/lib/rtp/rtp/headerExtension.js +102 -0
  735. package/dist/esm/lib/rtp/rtp/red/encoder.js +40 -0
  736. package/dist/esm/lib/rtp/rtp/red/handler.js +55 -0
  737. package/dist/esm/lib/rtp/rtp/red/packet.js +107 -0
  738. package/dist/esm/lib/rtp/rtp/rtp.js +266 -0
  739. package/dist/esm/lib/rtp/rtp/rtx.js +25 -0
  740. package/dist/esm/lib/rtp/srtp/cipher/ctr.js +103 -0
  741. package/dist/esm/lib/rtp/srtp/cipher/gcm.js +141 -0
  742. package/dist/esm/lib/rtp/srtp/cipher/index.js +20 -0
  743. package/dist/esm/lib/rtp/srtp/const.js +21 -0
  744. package/dist/esm/lib/rtp/srtp/context/context.js +175 -0
  745. package/dist/esm/lib/rtp/srtp/context/srtcp.js +21 -0
  746. package/dist/esm/lib/rtp/srtp/context/srtp.js +37 -0
  747. package/dist/esm/lib/rtp/srtp/error.js +6 -0
  748. package/dist/esm/lib/rtp/srtp/packet.js +42 -0
  749. package/dist/esm/lib/rtp/srtp/session.js +9 -0
  750. package/dist/esm/lib/rtp/srtp/srtcp.js +17 -0
  751. package/dist/esm/lib/rtp/srtp/srtp.js +16 -0
  752. package/dist/esm/lib/rtp/transport.js +18 -0
  753. package/dist/esm/lib/rtp/util.js +24 -0
  754. package/dist/esm/lib/sctp/chunk.js +515 -0
  755. package/dist/esm/lib/sctp/const.js +19 -0
  756. package/dist/esm/lib/sctp/helper.js +10 -0
  757. package/dist/esm/lib/sctp/imports/common.js +1 -0
  758. package/dist/esm/lib/sctp/index.js +4 -0
  759. package/dist/esm/lib/sctp/param.js +126 -0
  760. package/dist/esm/lib/sctp/sctp.js +1459 -0
  761. package/dist/esm/lib/sctp/transport.js +23 -0
  762. package/dist/esm/lib/turn/index.js +9 -0
  763. package/dist/esm/lib/turn/node/server.js +89 -0
  764. package/dist/esm/lib/turn/node/turnServer.js +560 -0
  765. package/dist/esm/lib/turn/protocol.js +112 -0
  766. package/dist/esm/lib/turn/stun/attributes.js +198 -0
  767. package/dist/esm/lib/turn/stun/const.js +82 -0
  768. package/dist/esm/lib/turn/stun/ip.js +81 -0
  769. package/dist/esm/lib/turn/stun/message.js +174 -0
  770. package/dist/esm/lib/turn/turn/auth.js +6 -0
  771. package/dist/esm/lib/turn/turn/frame.js +61 -0
  772. package/dist/esm/lib/turn/turn/protocol.js +781 -0
  773. package/dist/esm/peer/Endpoints.js +143 -0
  774. package/dist/esm/peer/EngineConfig.js +33 -0
  775. package/dist/esm/peer/EngineConnection.js +22 -0
  776. package/dist/esm/peer/Events.js +81 -0
  777. package/dist/esm/peer/MediaCodecs.js +47 -0
  778. package/dist/esm/peer/MediaTrack.js +305 -0
  779. package/dist/esm/peer/PeerChannel.js +315 -0
  780. package/dist/esm/peer/PeerConnection.js +694 -0
  781. package/dist/esm/peer/PeerThreadChannel.js +266 -0
  782. package/dist/esm/peer/PeerThreadProtocol.js +1 -0
  783. package/dist/esm/peer/PeerThreads.js +264 -0
  784. package/dist/esm/peer/PeerWorker.js +458 -0
  785. package/dist/esm/peer/PeerWorkerCode.js +1 -0
  786. package/dist/esm/peer/RemoteConnection.js +905 -0
  787. package/dist/esm/peer/RtpPacket.js +86 -0
  788. package/dist/esm/peer/RtpTransceiver.js +225 -0
  789. package/dist/esm/peer/SignalingClient.js +249 -0
  790. package/dist/esm/protocol/SignalingProtocol.js +62 -0
  791. package/dist/esm/service/WebRTCServiceEntrypoint.js +352 -0
  792. package/dist/esm/sfu/SFU.js +759 -0
  793. package/dist/esm/sfu/SFUAccess.js +12 -0
  794. package/dist/esm/sfu/SFUClusterLeg.js +102 -0
  795. package/dist/esm/sfu/SFURoom.js +1296 -0
  796. package/dist/esm/sfu/SFUWorker.js +165 -0
  797. package/dist/esm/sfu/SFUWorkerChannel.js +101 -0
  798. package/dist/esm/sfu/SFUWorkerCode.js +1 -0
  799. package/dist/esm/sfu/SFUWorkers.js +547 -0
  800. package/dist/esm/shared/ChunkedChannel.js +178 -0
  801. package/dist/esm/shared/Connections.js +1 -0
  802. package/dist/esm/shared/Emitter.js +76 -0
  803. package/dist/esm/shared/Peer.js +505 -0
  804. package/dist/esm/shared/PeerServiceProxy.js +299 -0
  805. package/dist/esm/shared/Room.js +511 -0
  806. package/dist/esm/shared/SignalingError.js +43 -0
  807. package/dist/esm/shared/SignalingSession.js +343 -0
  808. package/dist/esm/shared/Transports.js +279 -0
  809. package/dist/esm/signaling/MediaServers.js +13 -0
  810. package/dist/esm/signaling/Signaling.js +941 -0
  811. package/dist/esm/signaling/SignalingController.js +225 -0
  812. package/dist/esm/turn/TURNCredentials.js +44 -0
  813. package/dist/esm/turn/TURNIceServers.js +22 -0
  814. package/dist/esm/turn/TURNServer.js +327 -0
  815. package/dist/esm/turn/TURNWorker.js +49 -0
  816. package/dist/esm/turn/TURNWorkerCode.js +1 -0
  817. package/dist/esm/turn/TURNWorkers.js +206 -0
  818. package/dist/esm/whep/WHEP.js +422 -0
  819. package/dist/esm/whep/WHEPController.js +298 -0
  820. package/dist/esm/whip/WHIP.js +466 -0
  821. package/dist/esm/whip/WHIPController.js +296 -0
  822. package/dist/types/client/SignalingConnection.d.ts +81 -0
  823. package/dist/types/cluster/Cluster.d.ts +503 -0
  824. package/dist/types/cluster/ClusterFrames.d.ts +24 -0
  825. package/dist/types/cluster/ClusterTURN.d.ts +63 -0
  826. package/dist/types/cluster/Rendezvous.d.ts +8 -0
  827. package/dist/types/cluster/transports/ClusterTransport.d.ts +34 -0
  828. package/dist/types/cluster/transports/LoadClient.d.ts +6 -0
  829. package/dist/types/cluster/transports/MemoryClusterTransport.d.ts +13 -0
  830. package/dist/types/cluster/transports/NATSClusterTransport.d.ts +23 -0
  831. package/dist/types/cluster/transports/RedisClusterTransport.d.ts +23 -0
  832. package/dist/types/exceptions/ClusterRequestException.d.ts +11 -0
  833. package/dist/types/exceptions/ClusterTimeoutException.d.ts +10 -0
  834. package/dist/types/exceptions/ClusterTransportNotFoundException.d.ts +11 -0
  835. package/dist/types/exceptions/SignalingClientRequiredException.d.ts +12 -0
  836. package/dist/types/exceptions/SignalingConnectionException.d.ts +12 -0
  837. package/dist/types/exceptions/SignalingDeniedException.d.ts +11 -0
  838. package/dist/types/exceptions/SignalingLimitException.d.ts +11 -0
  839. package/dist/types/exceptions/SignalingNotAMemberException.d.ts +11 -0
  840. package/dist/types/exceptions/WHEPDeniedException.d.ts +15 -0
  841. package/dist/types/exceptions/WHEPLimitException.d.ts +15 -0
  842. package/dist/types/exceptions/WHEPMediaTypeException.d.ts +15 -0
  843. package/dist/types/exceptions/WHEPOfferException.d.ts +16 -0
  844. package/dist/types/exceptions/WHEPSessionNotFoundException.d.ts +15 -0
  845. package/dist/types/exceptions/WHIPDeniedException.d.ts +15 -0
  846. package/dist/types/exceptions/WHIPLimitException.d.ts +15 -0
  847. package/dist/types/exceptions/WHIPMediaTypeException.d.ts +15 -0
  848. package/dist/types/exceptions/WHIPOfferException.d.ts +16 -0
  849. package/dist/types/exceptions/WHIPSessionNotFoundException.d.ts +15 -0
  850. package/dist/types/exports/Client.d.ts +11 -0
  851. package/dist/types/exports/WebRTC.d.ts +48 -0
  852. package/dist/types/lib/common/binary.d.ts +51 -0
  853. package/dist/types/lib/common/binaryData.d.ts +116 -0
  854. package/dist/types/lib/common/crc.d.ts +4 -0
  855. package/dist/types/lib/common/deque.d.ts +36 -0
  856. package/dist/types/lib/common/event.d.ts +48 -0
  857. package/dist/types/lib/common/index.d.ts +11 -0
  858. package/dist/types/lib/common/log.d.ts +47 -0
  859. package/dist/types/lib/common/network.d.ts +10 -0
  860. package/dist/types/lib/common/number.d.ts +13 -0
  861. package/dist/types/lib/common/promise.d.ts +21 -0
  862. package/dist/types/lib/common/transport.d.ts +104 -0
  863. package/dist/types/lib/common/type.d.ts +3 -0
  864. package/dist/types/lib/dtls/cipher/const.d.ts +42 -0
  865. package/dist/types/lib/dtls/cipher/create.d.ts +21 -0
  866. package/dist/types/lib/dtls/cipher/ec.d.ts +28 -0
  867. package/dist/types/lib/dtls/cipher/key-exchange.d.ts +43 -0
  868. package/dist/types/lib/dtls/cipher/namedCurve.d.ts +7 -0
  869. package/dist/types/lib/dtls/cipher/prf.d.ts +17 -0
  870. package/dist/types/lib/dtls/cipher/suites/abstract.d.ts +40 -0
  871. package/dist/types/lib/dtls/cipher/suites/aead.d.ts +28 -0
  872. package/dist/types/lib/dtls/cipher/suites/null.d.ts +24 -0
  873. package/dist/types/lib/dtls/cipher/utils.d.ts +18 -0
  874. package/dist/types/lib/dtls/cipher/x509.d.ts +33 -0
  875. package/dist/types/lib/dtls/client.d.ts +7 -0
  876. package/dist/types/lib/dtls/context/cipher.d.ts +42 -0
  877. package/dist/types/lib/dtls/context/dtls.d.ts +38 -0
  878. package/dist/types/lib/dtls/context/srtp.d.ts +5 -0
  879. package/dist/types/lib/dtls/context/transport.d.ts +8 -0
  880. package/dist/types/lib/dtls/flight/client/flight1.d.ts +10 -0
  881. package/dist/types/lib/dtls/flight/client/flight3.d.ts +8 -0
  882. package/dist/types/lib/dtls/flight/client/flight5.d.ts +18 -0
  883. package/dist/types/lib/dtls/flight/flight.d.ts +18 -0
  884. package/dist/types/lib/dtls/flight/server/flight2.d.ts +6 -0
  885. package/dist/types/lib/dtls/flight/server/flight4.d.ts +17 -0
  886. package/dist/types/lib/dtls/flight/server/flight6.d.ts +13 -0
  887. package/dist/types/lib/dtls/handshake/binary.d.ts +16 -0
  888. package/dist/types/lib/dtls/handshake/const.d.ts +13 -0
  889. package/dist/types/lib/dtls/handshake/extensions/ellipticCurves.d.ts +17 -0
  890. package/dist/types/lib/dtls/handshake/extensions/extendedMasterSecret.d.ts +3 -0
  891. package/dist/types/lib/dtls/handshake/extensions/renegotiationIndication.d.ts +18 -0
  892. package/dist/types/lib/dtls/handshake/extensions/signature.d.ts +26 -0
  893. package/dist/types/lib/dtls/handshake/extensions/useSrtp.d.ts +19 -0
  894. package/dist/types/lib/dtls/handshake/message/alert.d.ts +12 -0
  895. package/dist/types/lib/dtls/handshake/message/certificate.d.ts +17 -0
  896. package/dist/types/lib/dtls/handshake/message/changeCipherSpec.d.ts +11 -0
  897. package/dist/types/lib/dtls/handshake/message/client/certificateVerify.d.ts +20 -0
  898. package/dist/types/lib/dtls/handshake/message/client/hello.d.ts +50 -0
  899. package/dist/types/lib/dtls/handshake/message/client/keyExchange.d.ts +17 -0
  900. package/dist/types/lib/dtls/handshake/message/finished.d.ts +13 -0
  901. package/dist/types/lib/dtls/handshake/message/server/certificateRequest.d.ts +31 -0
  902. package/dist/types/lib/dtls/handshake/message/server/hello.d.ts +33 -0
  903. package/dist/types/lib/dtls/handshake/message/server/helloDone.d.ts +12 -0
  904. package/dist/types/lib/dtls/handshake/message/server/helloVerifyRequest.d.ts +32 -0
  905. package/dist/types/lib/dtls/handshake/message/server/keyExchange.d.ts +32 -0
  906. package/dist/types/lib/dtls/handshake/random.d.ts +13 -0
  907. package/dist/types/lib/dtls/helper.d.ts +4 -0
  908. package/dist/types/lib/dtls/imports/common.d.ts +1 -0
  909. package/dist/types/lib/dtls/imports/rtp.d.ts +1 -0
  910. package/dist/types/lib/dtls/index.d.ts +7 -0
  911. package/dist/types/lib/dtls/record/antiReplayWindow.d.ts +27 -0
  912. package/dist/types/lib/dtls/record/builder.d.ts +9 -0
  913. package/dist/types/lib/dtls/record/const.d.ts +33 -0
  914. package/dist/types/lib/dtls/record/message/fragment.d.ts +26 -0
  915. package/dist/types/lib/dtls/record/message/header.d.ts +38 -0
  916. package/dist/types/lib/dtls/record/message/plaintext.d.ts +14 -0
  917. package/dist/types/lib/dtls/record/receive.d.ts +9 -0
  918. package/dist/types/lib/dtls/server.d.ts +6 -0
  919. package/dist/types/lib/dtls/socket.d.ts +52 -0
  920. package/dist/types/lib/dtls/typings/domain.d.ts +20 -0
  921. package/dist/types/lib/dtls/util/binary.d.ts +2 -0
  922. package/dist/types/lib/ice/candidate.d.ts +35 -0
  923. package/dist/types/lib/ice/dns/lookup.d.ts +16 -0
  924. package/dist/types/lib/ice/dns/mdns.d.ts +38 -0
  925. package/dist/types/lib/ice/exceptions.d.ts +24 -0
  926. package/dist/types/lib/ice/helper.d.ts +17 -0
  927. package/dist/types/lib/ice/ice.d.ts +182 -0
  928. package/dist/types/lib/ice/iceBase.d.ts +214 -0
  929. package/dist/types/lib/ice/imports/common.d.ts +1 -0
  930. package/dist/types/lib/ice/index.d.ts +12 -0
  931. package/dist/types/lib/ice/internal/selectAddresses.d.ts +9 -0
  932. package/dist/types/lib/ice/stun/attributes.d.ts +1 -0
  933. package/dist/types/lib/ice/stun/const.d.ts +8 -0
  934. package/dist/types/lib/ice/stun/message.d.ts +1 -0
  935. package/dist/types/lib/ice/stun/protocol.d.ts +30 -0
  936. package/dist/types/lib/ice/stun/tcpFrame.d.ts +5 -0
  937. package/dist/types/lib/ice/stun/tcpProtocol.d.ts +57 -0
  938. package/dist/types/lib/ice/stun/transaction.d.ts +75 -0
  939. package/dist/types/lib/ice/turn/frame.d.ts +1 -0
  940. package/dist/types/lib/ice/turn/protocol.d.ts +170 -0
  941. package/dist/types/lib/ice/types/model.d.ts +56 -0
  942. package/dist/types/lib/ice/utils.d.ts +13 -0
  943. package/dist/types/lib/peer/const.d.ts +36 -0
  944. package/dist/types/lib/peer/dataChannel.d.ts +69 -0
  945. package/dist/types/lib/peer/errors.d.ts +11 -0
  946. package/dist/types/lib/peer/helper.d.ts +20 -0
  947. package/dist/types/lib/peer/imports/common.d.ts +1 -0
  948. package/dist/types/lib/peer/imports/dtls.d.ts +1 -0
  949. package/dist/types/lib/peer/imports/ice.d.ts +1 -0
  950. package/dist/types/lib/peer/imports/rtp.d.ts +1 -0
  951. package/dist/types/lib/peer/index.d.ts +14 -0
  952. package/dist/types/lib/peer/media/codec.d.ts +15 -0
  953. package/dist/types/lib/peer/media/codecCompatibility.d.ts +23 -0
  954. package/dist/types/lib/peer/media/extension/rtcpFeedback.d.ts +6 -0
  955. package/dist/types/lib/peer/media/extension/rtpExtension.d.ts +9 -0
  956. package/dist/types/lib/peer/media/index.d.ts +12 -0
  957. package/dist/types/lib/peer/media/parameters.d.ts +65 -0
  958. package/dist/types/lib/peer/media/receiver/nack.d.ts +23 -0
  959. package/dist/types/lib/peer/media/receiver/receiverTwcc.d.ts +47 -0
  960. package/dist/types/lib/peer/media/receiver/statistics.d.ts +22 -0
  961. package/dist/types/lib/peer/media/router.d.ts +25 -0
  962. package/dist/types/lib/peer/media/rtpReceiver.d.ts +90 -0
  963. package/dist/types/lib/peer/media/rtpSender.d.ts +209 -0
  964. package/dist/types/lib/peer/media/rtpTransceiver.d.ts +117 -0
  965. package/dist/types/lib/peer/media/sender/cumulativeResult.d.ts +19 -0
  966. package/dist/types/lib/peer/media/sender/senderBWE.d.ts +32 -0
  967. package/dist/types/lib/peer/media/stats.d.ts +293 -0
  968. package/dist/types/lib/peer/media/track.d.ts +67 -0
  969. package/dist/types/lib/peer/peerConnection.d.ts +458 -0
  970. package/dist/types/lib/peer/sctpManager.d.ts +28 -0
  971. package/dist/types/lib/peer/sdp.d.ts +97 -0
  972. package/dist/types/lib/peer/sdpManager.d.ts +116 -0
  973. package/dist/types/lib/peer/secureTransportManager.d.ts +96 -0
  974. package/dist/types/lib/peer/transceiverManager.d.ts +151 -0
  975. package/dist/types/lib/peer/transport/dtls.d.ts +95 -0
  976. package/dist/types/lib/peer/transport/ice.d.ts +143 -0
  977. package/dist/types/lib/peer/transport/sctp.d.ts +56 -0
  978. package/dist/types/lib/peer/types/domain.d.ts +5 -0
  979. package/dist/types/lib/peer/types/util.d.ts +2 -0
  980. package/dist/types/lib/peer/utils.d.ts +73 -0
  981. package/dist/types/lib/rtp/codec/av1.d.ts +56 -0
  982. package/dist/types/lib/rtp/codec/base.d.ts +8 -0
  983. package/dist/types/lib/rtp/codec/h264.d.ts +32 -0
  984. package/dist/types/lib/rtp/codec/index.d.ts +16 -0
  985. package/dist/types/lib/rtp/codec/leb128.d.ts +5 -0
  986. package/dist/types/lib/rtp/codec/opus.d.ts +9 -0
  987. package/dist/types/lib/rtp/codec/vp8.d.ts +27 -0
  988. package/dist/types/lib/rtp/codec/vp9.d.ts +46 -0
  989. package/dist/types/lib/rtp/const.d.ts +1 -0
  990. package/dist/types/lib/rtp/helper.d.ts +8 -0
  991. package/dist/types/lib/rtp/imports/common.d.ts +1 -0
  992. package/dist/types/lib/rtp/index.d.ts +25 -0
  993. package/dist/types/lib/rtp/rtcp/header.d.ts +13 -0
  994. package/dist/types/lib/rtp/rtcp/psfb/fullIntraRequest.d.ts +16 -0
  995. package/dist/types/lib/rtp/rtcp/psfb/index.d.ts +14 -0
  996. package/dist/types/lib/rtp/rtcp/psfb/pictureLossIndication.d.ts +10 -0
  997. package/dist/types/lib/rtp/rtcp/psfb/remb.d.ts +16 -0
  998. package/dist/types/lib/rtp/rtcp/rr.d.ts +32 -0
  999. package/dist/types/lib/rtp/rtcp/rtcp.d.ts +10 -0
  1000. package/dist/types/lib/rtp/rtcp/rtpfb/const.d.ts +1 -0
  1001. package/dist/types/lib/rtp/rtcp/rtpfb/index.d.ts +14 -0
  1002. package/dist/types/lib/rtp/rtcp/rtpfb/nack.d.ts +17 -0
  1003. package/dist/types/lib/rtp/rtcp/rtpfb/twcc.d.ts +71 -0
  1004. package/dist/types/lib/rtp/rtcp/sdes.d.ts +26 -0
  1005. package/dist/types/lib/rtp/rtcp/sr.d.ts +41 -0
  1006. package/dist/types/lib/rtp/rtp/headerExtension.d.ts +72 -0
  1007. package/dist/types/lib/rtp/rtp/red/encoder.d.ts +13 -0
  1008. package/dist/types/lib/rtp/rtp/red/handler.d.ts +6 -0
  1009. package/dist/types/lib/rtp/rtp/red/packet.d.ts +26 -0
  1010. package/dist/types/lib/rtp/rtp/rtp.d.ts +44 -0
  1011. package/dist/types/lib/rtp/rtp/rtx.d.ts +3 -0
  1012. package/dist/types/lib/rtp/srtp/cipher/ctr.d.ts +16 -0
  1013. package/dist/types/lib/rtp/srtp/cipher/gcm.d.ts +17 -0
  1014. package/dist/types/lib/rtp/srtp/cipher/index.d.ts +13 -0
  1015. package/dist/types/lib/rtp/srtp/const.d.ts +6 -0
  1016. package/dist/types/lib/rtp/srtp/context/context.d.ts +45 -0
  1017. package/dist/types/lib/rtp/srtp/context/srtcp.d.ts +8 -0
  1018. package/dist/types/lib/rtp/srtp/context/srtp.d.ts +9 -0
  1019. package/dist/types/lib/rtp/srtp/error.d.ts +3 -0
  1020. package/dist/types/lib/rtp/srtp/packet.d.ts +5 -0
  1021. package/dist/types/lib/rtp/srtp/session.d.ts +19 -0
  1022. package/dist/types/lib/rtp/srtp/srtcp.d.ts +8 -0
  1023. package/dist/types/lib/rtp/srtp/srtp.d.ts +9 -0
  1024. package/dist/types/lib/rtp/transport.d.ts +15 -0
  1025. package/dist/types/lib/rtp/util.d.ts +11 -0
  1026. package/dist/types/lib/sctp/chunk.d.ts +164 -0
  1027. package/dist/types/lib/sctp/const.d.ts +17 -0
  1028. package/dist/types/lib/sctp/helper.d.ts +5 -0
  1029. package/dist/types/lib/sctp/imports/common.d.ts +1 -0
  1030. package/dist/types/lib/sctp/index.d.ts +6 -0
  1031. package/dist/types/lib/sctp/param.d.ts +40 -0
  1032. package/dist/types/lib/sctp/sctp.d.ts +210 -0
  1033. package/dist/types/lib/sctp/transport.d.ts +15 -0
  1034. package/dist/types/lib/turn/index.d.ts +9 -0
  1035. package/dist/types/lib/turn/node/server.d.ts +21 -0
  1036. package/dist/types/lib/turn/node/turnServer.d.ts +91 -0
  1037. package/dist/types/lib/turn/protocol.d.ts +47 -0
  1038. package/dist/types/lib/turn/stun/attributes.d.ts +37 -0
  1039. package/dist/types/lib/turn/stun/const.d.ts +28 -0
  1040. package/dist/types/lib/turn/stun/ip.d.ts +12 -0
  1041. package/dist/types/lib/turn/stun/message.d.ts +37 -0
  1042. package/dist/types/lib/turn/turn/auth.d.ts +1 -0
  1043. package/dist/types/lib/turn/turn/frame.d.ts +13 -0
  1044. package/dist/types/lib/turn/turn/protocol.d.ts +147 -0
  1045. package/dist/types/peer/Endpoints.d.ts +75 -0
  1046. package/dist/types/peer/EngineConfig.d.ts +20 -0
  1047. package/dist/types/peer/EngineConnection.d.ts +22 -0
  1048. package/dist/types/peer/Events.d.ts +55 -0
  1049. package/dist/types/peer/MediaCodecs.d.ts +27 -0
  1050. package/dist/types/peer/MediaTrack.d.ts +212 -0
  1051. package/dist/types/peer/PeerChannel.d.ts +248 -0
  1052. package/dist/types/peer/PeerConnection.d.ts +603 -0
  1053. package/dist/types/peer/PeerThreadChannel.d.ts +112 -0
  1054. package/dist/types/peer/PeerThreadProtocol.d.ts +325 -0
  1055. package/dist/types/peer/PeerThreads.d.ts +114 -0
  1056. package/dist/types/peer/PeerWorker.d.ts +6 -0
  1057. package/dist/types/peer/PeerWorkerCode.d.ts +5 -0
  1058. package/dist/types/peer/RemoteConnection.d.ts +314 -0
  1059. package/dist/types/peer/RtpPacket.d.ts +112 -0
  1060. package/dist/types/peer/RtpTransceiver.d.ts +167 -0
  1061. package/dist/types/peer/SignalingClient.d.ts +236 -0
  1062. package/dist/types/protocol/SignalingProtocol.d.ts +266 -0
  1063. package/dist/types/service/WebRTCServiceEntrypoint.d.ts +158 -0
  1064. package/dist/types/sfu/SFU.d.ts +356 -0
  1065. package/dist/types/sfu/SFUAccess.d.ts +48 -0
  1066. package/dist/types/sfu/SFUClusterLeg.d.ts +101 -0
  1067. package/dist/types/sfu/SFURoom.d.ts +148 -0
  1068. package/dist/types/sfu/SFUWorker.d.ts +13 -0
  1069. package/dist/types/sfu/SFUWorkerChannel.d.ts +204 -0
  1070. package/dist/types/sfu/SFUWorkerCode.d.ts +5 -0
  1071. package/dist/types/sfu/SFUWorkers.d.ts +247 -0
  1072. package/dist/types/shared/ChunkedChannel.d.ts +122 -0
  1073. package/dist/types/shared/Connections.d.ts +231 -0
  1074. package/dist/types/shared/Emitter.d.ts +50 -0
  1075. package/dist/types/shared/Peer.d.ts +182 -0
  1076. package/dist/types/shared/PeerServiceProxy.d.ts +173 -0
  1077. package/dist/types/shared/Room.d.ts +143 -0
  1078. package/dist/types/shared/SignalingError.d.ts +40 -0
  1079. package/dist/types/shared/SignalingSession.d.ts +97 -0
  1080. package/dist/types/shared/Transports.d.ts +139 -0
  1081. package/dist/types/signaling/MediaServers.d.ts +40 -0
  1082. package/dist/types/signaling/Signaling.d.ts +573 -0
  1083. package/dist/types/signaling/SignalingController.d.ts +128 -0
  1084. package/dist/types/turn/TURNCredentials.d.ts +49 -0
  1085. package/dist/types/turn/TURNIceServers.d.ts +11 -0
  1086. package/dist/types/turn/TURNServer.d.ts +309 -0
  1087. package/dist/types/turn/TURNWorker.d.ts +42 -0
  1088. package/dist/types/turn/TURNWorkerCode.d.ts +5 -0
  1089. package/dist/types/turn/TURNWorkers.d.ts +52 -0
  1090. package/dist/types/whep/WHEP.d.ts +386 -0
  1091. package/dist/types/whep/WHEPController.d.ts +134 -0
  1092. package/dist/types/whip/WHIP.d.ts +426 -0
  1093. package/dist/types/whip/WHIPController.d.ts +132 -0
  1094. package/package.json +115 -4
@@ -0,0 +1,1296 @@
1
+ import { RTCRtpCodecParameters } from '../lib/peer/media/parameters.js';
2
+ import { engineChannelOf, engineConnectionOf } from '../peer/EngineConnection.js';
3
+ import { engineTrackOf, relayedTrack } from '../peer/MediaTrack.js';
4
+ import { gathered, patchConnection } from '../peer/Endpoints.js';
5
+ import { engineSenderOf } from '../peer/RtpTransceiver.js';
6
+ import { SignalingControlChannel, SignalingEvent } from '../protocol/SignalingProtocol.js';
7
+ import { Peer } from '../shared/Peer.js';
8
+ /**
9
+ * The key of a track: its member and its id
10
+ * @param peerId
11
+ * @param trackId
12
+ */
13
+ function trackKey(peerId, trackId) {
14
+ return JSON.stringify([peerId, trackId]);
15
+ }
16
+ /**
17
+ * How long a channel to a member not known yet waits for it (its joining on its way through the cluster), in
18
+ * milliseconds
19
+ */
20
+ const UNKNOWN_MEMBER_TIMEOUT = 5000;
21
+ /**
22
+ * How long a member joining waits for the answers of select for the tracks already published, in milliseconds, so the
23
+ * first offer carries them (select asked in the main thread from a worker thread); an answer coming later is applied in
24
+ * an offer of its own
25
+ */
26
+ const FIRST_OFFER_SELECT_WAIT = 1000;
27
+ /**
28
+ * The members a channel from the media server of another node goes from and to: its protocol, `["from","to"]`
29
+ * @param protocol
30
+ */
31
+ function routeOf(protocol) {
32
+ try {
33
+ const route = JSON.parse(protocol);
34
+ return Array.isArray(route) && route.length === 2 && route.every((id) => typeof id === 'string') ? route : undefined;
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ /**
41
+ * The bytes a channel relayed to a member may have waiting to be sent: past them, the messages wait at the server, out
42
+ * of the receive window of the member sending them (which waits then), until the channel sends half of them
43
+ */
44
+ const RELAY_HIGH_WATER_MARK = 1024 * 1024;
45
+ /**
46
+ * Relay the messages of a channel to another one, as fast as the other one sends them: the messages of a reliable
47
+ * channel wait at the server while the other one is not open or has too much to send, held out of the receive window
48
+ * of the connection they come from (its sender waits once the window is closed); the ones of an unreliable channel are
49
+ * dropped then, once the other one is open or past RELAY_HIGH_WATER_MARK waiting
50
+ * @param source
51
+ * @param target
52
+ * @param early The messages the source got before.
53
+ */
54
+ function relay(source, target, early = []) {
55
+ const transport = engineChannelOf(source).sctp;
56
+ const reliable = source.maxRetransmits === null && source.maxPacketLifeTime === null;
57
+ const waiting = [];
58
+ let held = 0;
59
+ let queued = 0;
60
+ target.bufferedAmountLowThreshold = RELAY_HIGH_WATER_MARK / 2;
61
+ const drain = () => {
62
+ while (waiting.length && target.readyState === 'open' && target.bufferedAmount < RELAY_HIGH_WATER_MARK) {
63
+ const { data, size } = waiting.shift();
64
+ queued -= size;
65
+ target.send(data);
66
+ if (reliable) {
67
+ held -= size;
68
+ transport.releaseReceived(size);
69
+ }
70
+ }
71
+ };
72
+ const relayed = (data) => {
73
+ const message = typeof data === 'string' || Buffer.isBuffer(data) ? data : Buffer.from(data);
74
+ if (target.readyState === 'closing' || target.readyState === 'closed')
75
+ return;
76
+ if (!waiting.length && target.readyState === 'open' && target.bufferedAmount < RELAY_HIGH_WATER_MARK)
77
+ return target.send(message);
78
+ const size = typeof message === 'string' ? Buffer.byteLength(message) : message.length;
79
+ if (!reliable && (target.readyState === 'open' || queued + size > RELAY_HIGH_WATER_MARK))
80
+ return;
81
+ waiting.push({ data: message, size: size });
82
+ queued += size;
83
+ if (reliable) {
84
+ held += size;
85
+ transport.holdReceived(size);
86
+ }
87
+ };
88
+ early.forEach(relayed);
89
+ source.on('message', relayed);
90
+ target.on('open', drain);
91
+ target.on('bufferedamountlow', drain);
92
+ //The window held is given back when the other side is gone
93
+ target.on('close', () => {
94
+ waiting.length = 0;
95
+ queued = 0;
96
+ if (held)
97
+ transport.releaseReceived(held);
98
+ held = 0;
99
+ });
100
+ }
101
+ /**
102
+ * The transceiver of the engine of a transceiver
103
+ * @param connection
104
+ * @param transceiver
105
+ */
106
+ function engineTransceiverOf(connection, transceiver) {
107
+ const engine = engineConnectionOf(connection);
108
+ return transceiver.mid === null ? undefined : engine.getTransceivers().find((each) => each.mid === transceiver.mid);
109
+ }
110
+ /**
111
+ * The part of a room on the media server: a connection to each member (the server never gives up its offers), the
112
+ * tracks they publish, forwarded to the others the server selects for them
113
+ */
114
+ export class SFURoom {
115
+ #host;
116
+ #members = new Map();
117
+ #viewers = new Map();
118
+ #publications = new Set();
119
+ //The transports whose bandwidth is watched
120
+ #watched = new WeakSet();
121
+ //The clients connected to the media servers of other nodes, and the id of their server
122
+ #elsewhere = new Map();
123
+ //What select answered for each member (by its id) and each track of the other nodes (by key)
124
+ #selected = new Map();
125
+ //The tracks of other nodes read here, by key
126
+ #reads = new Map();
127
+ //The channels to members not known yet
128
+ #waiting = new Set();
129
+ #closed = false;
130
+ /**
131
+ * Create the part of a room, and join it.
132
+ * @param host The media server.
133
+ * @param name The room.
134
+ */
135
+ constructor(host, name) {
136
+ this.#host = host;
137
+ this.name = name;
138
+ this.ready = this.#join();
139
+ }
140
+ /**
141
+ * Whether the room has no member and no viewer left.
142
+ */
143
+ get empty() {
144
+ return !this.members.length && !this.#viewers.size;
145
+ }
146
+ /**
147
+ * The number of the viewers of WHEP.
148
+ */
149
+ get viewers() {
150
+ return this.#viewers.size;
151
+ }
152
+ /**
153
+ * Whether the server left the room.
154
+ */
155
+ get closed() {
156
+ return this.#closed;
157
+ }
158
+ /**
159
+ * The ids of the members of this node (the media servers of the other nodes are not counted).
160
+ */
161
+ get members() {
162
+ return [...this.#members.values()].filter((member) => !member.cascade).map((member) => member.id);
163
+ }
164
+ /**
165
+ * The tracks the members of this node publish.
166
+ */
167
+ get tracks() {
168
+ return [...this.#publications].filter((publication) => !publication.remote).map((publication) => publication.track);
169
+ }
170
+ /**
171
+ * A track published in the room: received from its member, or from the media server of its node while it is read.
172
+ * @param peerId The member.
173
+ * @param trackId The id of the track.
174
+ * @returns The track, or undefined when it is not published.
175
+ */
176
+ track(peerId, trackId) {
177
+ for (const publication of this.#publications) {
178
+ if (!publication.remote && publication.track.peerId === peerId && publication.track.id === trackId)
179
+ return publication.media;
180
+ }
181
+ const key = trackKey(peerId, trackId);
182
+ const offered = this.#offered(key);
183
+ if (!offered)
184
+ return undefined;
185
+ let read = this.#reads.get(key);
186
+ if (!read) {
187
+ const codec = offered.codec ?? { mimeType: offered.track.codec, clockRate: offered.track.kind === 'audio' ? 48000 : 90000 };
188
+ const relayed = relayedTrack(offered.track.kind, new RTCRtpCodecParameters(codec), trackId, {
189
+ requestKeyFrame: () => this.#remotePublication(key)?.media.requestKeyFrame(),
190
+ wanted: (wanted) => {
191
+ const current = this.#reads.get(key);
192
+ if (!current)
193
+ return;
194
+ current.wanted = wanted;
195
+ this.#pipe(key);
196
+ this.#tellWants();
197
+ }
198
+ });
199
+ read = { track: relayed.track, receive: relayed.receive, wanted: false };
200
+ this.#reads.set(key, read);
201
+ }
202
+ return read.track;
203
+ }
204
+ /**
205
+ * The connections to the media servers of the other nodes: the tracks sent on each, the ones received (for the
206
+ * tests).
207
+ * @returns By the id of the member of each server.
208
+ */
209
+ cascades() {
210
+ return Object.fromEntries([...this.#members.values()].filter((member) => !!member.cascade).map((member) => [member.id, { sends: member.subscriptions.size, receives: member.publications.size }]));
211
+ }
212
+ /**
213
+ * Leave the room: the connections to the members are closed.
214
+ * @returns Resolves once the signaling is told.
215
+ */
216
+ async close() {
217
+ if (this.#closed)
218
+ return;
219
+ this.#closed = true;
220
+ for (const member of [...this.#members.values()])
221
+ this.#remove(member);
222
+ for (const viewer of [...this.#viewers.values()])
223
+ this.#stop(viewer);
224
+ for (const key of [...this.#reads.keys()])
225
+ this.#endRead(key);
226
+ for (const opening of [...this.#waiting])
227
+ opening.channel.close();
228
+ await this.#host.signaling.leave(this.#host.id, this.name).catch(() => undefined);
229
+ }
230
+ /**
231
+ * A viewer of WHEP: the connection answering its offer sends it an audio and a video track of a member of the room
232
+ * (its source), once and as long as there is one, from a key frame. Its media negotiate every codec it offers that
233
+ * the server has, so a source publishing later with any of them is sent too.
234
+ * @param id The id of the viewer.
235
+ * @param offer The offer of the viewer.
236
+ * @param select Chooses its source among the members publishing; the newest stream of WHIP, else the first member
237
+ * publishing, without it.
238
+ * @returns The connection, its answer with all its candidates, and its source now.
239
+ */
240
+ async play(id, offer, select) {
241
+ const connection = await this.#host.connect();
242
+ const ended = [];
243
+ let closed = false;
244
+ const leg = {
245
+ connection: connection,
246
+ ready: Promise.resolve(),
247
+ get closed() {
248
+ return closed;
249
+ },
250
+ close: () => {
251
+ if (closed)
252
+ return;
253
+ closed = true;
254
+ connection.close();
255
+ for (const listener of ended.splice(0))
256
+ listener();
257
+ }
258
+ };
259
+ const viewer = { id: id, leg: leg, transceivers: new Map(), attached: new Map(), select: select, feeding: Promise.resolve() };
260
+ connection.on('connectionstatechange', (state) => {
261
+ if (state === 'failed' || state === 'closed')
262
+ this.#stop(viewer);
263
+ });
264
+ try {
265
+ await connection.setRemoteDescription(offer);
266
+ //The first media of each kind sends; no track before the answer, which keeps all the codecs
267
+ for (const transceiver of connection.getTransceivers()) {
268
+ if (viewer.transceivers.has(transceiver.kind))
269
+ continue;
270
+ viewer.transceivers.set(transceiver.kind, transceiver);
271
+ transceiver.direction = 'sendonly';
272
+ }
273
+ if (!viewer.transceivers.size)
274
+ throw new Error('The offer has no audio and no video');
275
+ await connection.setLocalDescription();
276
+ await gathered(connection);
277
+ if (closed)
278
+ throw new Error(`The connection is ${connection.connectionState}`);
279
+ }
280
+ catch (error) {
281
+ leg.close();
282
+ throw error;
283
+ }
284
+ this.#viewers.set(id, viewer);
285
+ this.#host.changed?.(this);
286
+ await this.#feed(viewer);
287
+ return {
288
+ answer: connection.localDescription,
289
+ patch: (fragment, restart) => patchConnection(connection, fragment, restart),
290
+ ended: (listener) => closed ? listener() : ended.push(listener),
291
+ close: () => this.#stop(viewer),
292
+ source: () => viewer.source
293
+ };
294
+ }
295
+ /**
296
+ * Send a viewer the tracks of its source, after the changes before
297
+ * @param viewer
298
+ */
299
+ #feed(viewer) {
300
+ viewer.feeding = viewer.feeding.then(() => this.#refeed(viewer)).catch(() => undefined);
301
+ return viewer.feeding;
302
+ }
303
+ /**
304
+ * Send a viewer the tracks of its source: chosen again, as the tracks of the room change
305
+ * @param viewer
306
+ */
307
+ async #refeed(viewer) {
308
+ if (viewer.leg.closed)
309
+ return;
310
+ //The tracks of the members of this node, then the ones of the other nodes
311
+ const tracks = [...this.tracks, ...[...this.#offeredTracks()].map((offered) => offered.track)];
312
+ const selected = viewer.select ? await viewer.select(tracks) : undefined;
313
+ if (viewer.leg.closed)
314
+ return;
315
+ const publishers = [...new Set(tracks.map((track) => track.peerId))];
316
+ const chosen = selected
317
+ ?? publishers.filter((id) => id.startsWith('whip:')).at(-1)
318
+ ?? publishers[0];
319
+ const before = viewer.source;
320
+ viewer.source = chosen !== undefined && publishers.includes(chosen) ? chosen : undefined;
321
+ if (viewer.source !== before) {
322
+ this.#host.sourced?.(viewer.id, viewer.source);
323
+ //The tracks of a source of another node come from that node
324
+ this.#tellWants();
325
+ }
326
+ for (const [kind, transceiver] of viewer.transceivers) {
327
+ const publication = viewer.source === undefined
328
+ ? undefined
329
+ : [...this.#publications].find((each) => each.track.peerId === viewer.source && each.track.kind === kind);
330
+ if (viewer.attached.get(kind) === publication)
331
+ continue;
332
+ viewer.attached.delete(kind);
333
+ try {
334
+ await transceiver.sender.replaceTrack(publication?.media ?? null);
335
+ }
336
+ catch {
337
+ //Of a codec the viewer does not have
338
+ this.#host.emit('unsupported', this.name, viewer.id, publication.track);
339
+ await transceiver.sender.replaceTrack(null).catch(() => undefined);
340
+ continue;
341
+ }
342
+ if (!publication)
343
+ continue;
344
+ viewer.attached.set(kind, publication);
345
+ if (kind === 'video')
346
+ publication.media.requestKeyFrame();
347
+ }
348
+ }
349
+ /**
350
+ * A viewer stopped: its connection is closed
351
+ * @param viewer
352
+ */
353
+ #stop(viewer) {
354
+ if (this.#viewers.get(viewer.id) !== viewer)
355
+ return viewer.leg.close();
356
+ this.#viewers.delete(viewer.id);
357
+ viewer.leg.close();
358
+ if (!this.#closed)
359
+ this.#host.changed?.(this);
360
+ if (!this.#closed && this.empty)
361
+ this.#host.emptied(this);
362
+ }
363
+ /**
364
+ * A stream published with WHIP joins the room: a member (of role `whip`) whose connection answers the offer of the
365
+ * publisher, publishing its tracks and receiving nothing
366
+ * @param id The id of the member.
367
+ * @param offer The offer of the publisher.
368
+ * @returns The connection, its answer with all its candidates.
369
+ */
370
+ async publish(id, offer) {
371
+ const connection = await this.#host.connect();
372
+ const ended = [];
373
+ let closed = false;
374
+ const leg = {
375
+ connection: connection,
376
+ ready: Promise.resolve(),
377
+ get closed() {
378
+ return closed;
379
+ },
380
+ close: () => {
381
+ if (closed)
382
+ return;
383
+ closed = true;
384
+ connection.close();
385
+ for (const listener of ended.splice(0))
386
+ listener();
387
+ }
388
+ };
389
+ const member = {
390
+ id: id,
391
+ leg: leg,
392
+ metadata: undefined,
393
+ publications: new Map(),
394
+ subscriptions: new Map(),
395
+ streams: new Map(),
396
+ streamIds: new Map(),
397
+ transceivers: new Set()
398
+ };
399
+ this.#members.set(id, member);
400
+ this.#host.changed?.(this);
401
+ connection.addEventListener('track', (event) => this.#published(member, event));
402
+ connection.on('connectionstatechange', (state) => {
403
+ if (state === 'failed' || state === 'closed')
404
+ this.#remove(member);
405
+ });
406
+ //Negotiated again for an ICE restart (a PATCH)
407
+ connection.on('signalingstatechange', (state) => {
408
+ if (state === 'stable')
409
+ setImmediate(() => this.#negotiated(member));
410
+ });
411
+ try {
412
+ await connection.setRemoteDescription(offer);
413
+ await connection.setLocalDescription();
414
+ await gathered(connection);
415
+ if (closed)
416
+ throw new Error(`The connection is ${connection.connectionState}`);
417
+ await this.#host.signaling.join(id, this.name, { role: 'whip', receive: () => undefined });
418
+ }
419
+ catch (error) {
420
+ this.#remove(member);
421
+ throw error;
422
+ }
423
+ return {
424
+ answer: connection.localDescription,
425
+ patch: (fragment, restart) => patchConnection(connection, fragment, restart),
426
+ ended: (listener) => closed ? listener() : ended.push(listener),
427
+ close: () => this.#remove(member)
428
+ };
429
+ }
430
+ /**
431
+ * Join the room, with the members already in it
432
+ */
433
+ async #join() {
434
+ const result = await this.#host.signaling.join(this.#host.id, this.name, {
435
+ role: 'sfu',
436
+ receive: (event, payload) => this.#receive(event, payload)
437
+ });
438
+ for (const peer of result.peers) {
439
+ if (this.#serves(peer))
440
+ this.#add(peer.peerId, peer.metadata, peer.session);
441
+ else
442
+ this.#elsewhereJoined(peer);
443
+ }
444
+ }
445
+ /**
446
+ * A member of the room this server does not serve: the media server of another node (connected to), or a client of
447
+ * one
448
+ * @param peer
449
+ */
450
+ #elsewhereJoined(peer) {
451
+ if (peer.role === 'sfu') {
452
+ if (peer.peerId !== this.#host.id && !this.#members.has(peer.peerId))
453
+ this.#cascade(peer.peerId);
454
+ }
455
+ else if (!peer.role && peer.sfu) {
456
+ this.#elsewhere.set(peer.peerId, peer.sfu);
457
+ }
458
+ this.#unwait();
459
+ }
460
+ /**
461
+ * Whether the server serves a member: a client connected to it (the media server of another node serves the
462
+ * others)
463
+ * @param peer
464
+ */
465
+ #serves(peer) {
466
+ return !peer.role && peer.sfu === this.#host.id;
467
+ }
468
+ /**
469
+ * An event of the room
470
+ * @param event
471
+ * @param payload
472
+ */
473
+ #receive(event, payload) {
474
+ if (this.#closed)
475
+ return;
476
+ switch (event) {
477
+ case SignalingEvent.peerJoined: {
478
+ const joined = payload;
479
+ const member = this.#members.get(joined.peerId);
480
+ if (!this.#serves(joined)) {
481
+ //A client joining again through the media server of another node
482
+ if (!joined.role && member?.peer)
483
+ this.#remove(member);
484
+ this.#elsewhereJoined(joined);
485
+ return;
486
+ }
487
+ this.#elsewhere.delete(joined.peerId);
488
+ //A new client behind the same id: its old connection is useless
489
+ if (member && joined.session !== undefined && member.session !== joined.session)
490
+ this.#remove(member);
491
+ if (member && this.#members.get(joined.peerId) === member) {
492
+ const changed = JSON.stringify(member.metadata) !== JSON.stringify(joined.metadata);
493
+ member.metadata = joined.metadata;
494
+ if (changed)
495
+ this.#reselect(member);
496
+ return;
497
+ }
498
+ this.#add(joined.peerId, joined.metadata, joined.session);
499
+ return;
500
+ }
501
+ case SignalingEvent.peerLeft: {
502
+ const peerId = payload.peerId;
503
+ this.#elsewhere.delete(peerId);
504
+ const member = this.#members.get(peerId);
505
+ if (member)
506
+ this.#remove(member);
507
+ return;
508
+ }
509
+ case SignalingEvent.signal: {
510
+ const signal = payload;
511
+ let member = this.#members.get(signal.from);
512
+ if (!member) {
513
+ //A client of another media server (a signal still on its way when it moved) is not taken
514
+ if (this.#elsewhere.has(signal.from))
515
+ return;
516
+ member = signal.from.startsWith('sfu:') ? this.#cascade(signal.from) : this.#add(signal.from, undefined, signal.session);
517
+ }
518
+ //The streams of the media server of another node: the members they come from
519
+ if (member.cascade)
520
+ for (const stream of signal.streams ?? [])
521
+ member.cascade.received.set(stream.id, stream);
522
+ const received = {};
523
+ if (signal.description)
524
+ received.description = signal.description;
525
+ if (signal.candidate)
526
+ received.candidate = signal.candidate;
527
+ member.peer?.receive(received);
528
+ return;
529
+ }
530
+ }
531
+ }
532
+ /**
533
+ * Connect to a member, and send it the tracks published
534
+ * @param id
535
+ * @param metadata
536
+ * @param session
537
+ */
538
+ #add(id, metadata, session) {
539
+ const host = {
540
+ localId: this.#host.id,
541
+ create: () => this.#host.connect(),
542
+ send: (to, signal) => this.#signal(member, signal),
543
+ signalingUp: true,
544
+ closed: () => undefined,
545
+ polite: false
546
+ };
547
+ const peer = new Peer(host, id, metadata, session);
548
+ const member = {
549
+ id: id,
550
+ leg: peer,
551
+ peer: peer,
552
+ metadata: metadata,
553
+ session: session,
554
+ publications: new Map(),
555
+ subscriptions: new Map(),
556
+ streams: new Map(),
557
+ streamIds: new Map(),
558
+ transceivers: new Set()
559
+ };
560
+ this.#members.set(id, member);
561
+ this.#host.changed?.(this);
562
+ //The tracks of the other nodes it may receive
563
+ this.#evaluate();
564
+ this.#unwait();
565
+ //A failed negotiation is the member's (it left meanwhile, it sent a wrong description)
566
+ peer.on('error', () => undefined);
567
+ peer.on('track', (event) => this.#published(member, event));
568
+ peer.on('datachannel', (channel) => this.#opened(member, channel));
569
+ peer.ready.then(async () => {
570
+ if (peer.closed)
571
+ return;
572
+ const connection = peer.connection;
573
+ //Once the negotiation applied the directions
574
+ connection.on('signalingstatechange', (state) => {
575
+ if (state === 'stable')
576
+ setImmediate(() => this.#negotiated(member));
577
+ });
578
+ connection.on('connectionstatechange', (state) => {
579
+ if (state === 'connected')
580
+ this.#watchBandwidth(member);
581
+ });
582
+ //select asked first for the tracks already published, its answers awaited a moment: the control channel and
583
+ //the tracks selected are then added at once, and the first offer carries them all
584
+ const metadata = member.metadata;
585
+ const answers = new Map([...this.#publications].map((publication) => [publication, this.#ask(member, publication)]));
586
+ //Waiting only for answers to come: otherwise the first offer goes as soon as before
587
+ const settled = [...answers.values()].some((answer) => answer instanceof Promise)
588
+ ? await this.#settle(answers)
589
+ : new Map();
590
+ if (peer.closed || this.#members.get(member.id) !== member)
591
+ return;
592
+ const control = connection.createDataChannel(SignalingControlChannel.label, { negotiated: true, id: SignalingControlChannel.id });
593
+ control.on('message', (data) => this.#controlled(member, data));
594
+ member.control = control;
595
+ //The tracks published meanwhile were offered as they came; when the metadata changed meanwhile (a change
596
+ //before the connection is up is not reselected), select is asked again
597
+ for (const [publication, answer] of answers) {
598
+ if (!this.#publications.has(publication))
599
+ continue;
600
+ if (member.metadata === metadata)
601
+ this.#offer(member, publication, settled.get(publication) ?? answer);
602
+ else
603
+ this.#offer(member, publication);
604
+ }
605
+ }, () => this.#remove(member));
606
+ return member;
607
+ }
608
+ /**
609
+ * A member opened a channel to another one (its protocol): the server opens the same channel to the other one (its
610
+ * protocol the id of the first one), and relays their messages
611
+ * @param member
612
+ * @param channel
613
+ */
614
+ #opened(member, channel) {
615
+ let source = member.id;
616
+ let target = channel.protocol;
617
+ if (member.cascade) {
618
+ //From the media server of another node: its protocol has the member it comes from and the one it goes to
619
+ const route = routeOf(channel.protocol);
620
+ if (!route)
621
+ return channel.close();
622
+ [source, target] = route;
623
+ }
624
+ //Its first messages may come with its opening, before the other side is there
625
+ const early = [];
626
+ const keep = (data) => early.push(data);
627
+ channel.on('message', keep);
628
+ this.#route({ member: member, channel: channel, source: source, target: target, early: early, keep: keep });
629
+ }
630
+ /**
631
+ * Relay a channel to its other member: on the connection to it, the protocol the id of the member it comes from;
632
+ * on the connection to the media server of its node, the protocol both of them (from a member of this node only:
633
+ * a channel goes through two servers at most). A channel to a member not known yet waits for it.
634
+ * @param opening
635
+ */
636
+ #route(opening) {
637
+ const { member, channel, source, target, early, keep } = opening;
638
+ if (channel.readyState === 'closing' || channel.readyState === 'closed')
639
+ return;
640
+ const local = this.#members.get(target);
641
+ let other;
642
+ let protocol;
643
+ //Not to a media server
644
+ if (local?.cascade || target.startsWith('sfu:'))
645
+ return channel.close();
646
+ if (local) {
647
+ //Not to a stream published with WHIP: it has no data channels
648
+ if (local === member || !local.peer || local.leg.closed)
649
+ return channel.close();
650
+ other = local;
651
+ protocol = source;
652
+ }
653
+ else {
654
+ const server = this.#elsewhere.get(target);
655
+ if (member.cascade && server !== undefined)
656
+ return channel.close();
657
+ other = member.cascade || server === undefined ? undefined : this.#members.get(server);
658
+ protocol = JSON.stringify([source, target]);
659
+ }
660
+ if (!other)
661
+ return this.#wait(opening);
662
+ const relayTo = other;
663
+ relayTo.leg.ready
664
+ .then(() => relayTo.cascade ? relayTo.peer.negotiated : undefined)
665
+ .then(() => {
666
+ channel.off('message', keep);
667
+ if (relayTo.leg.closed || channel.readyState === 'closed')
668
+ return channel.close();
669
+ const relayed = relayTo.leg.connection.createDataChannel(channel.label, {
670
+ protocol: protocol,
671
+ ordered: channel.ordered,
672
+ ...channel.maxRetransmits !== null ? { maxRetransmits: channel.maxRetransmits } : {},
673
+ ...channel.maxPacketLifeTime !== null ? { maxPacketLifeTime: channel.maxPacketLifeTime } : {}
674
+ });
675
+ relay(channel, relayed, early);
676
+ relay(relayed, channel);
677
+ channel.on('close', () => relayed.close());
678
+ relayed.on('close', () => channel.close());
679
+ }, () => channel.close());
680
+ }
681
+ /**
682
+ * A channel to a member not known yet waits for it, UNKNOWN_MEMBER_TIMEOUT at most
683
+ * @param opening
684
+ */
685
+ #wait(opening) {
686
+ if (this.#waiting.has(opening))
687
+ return;
688
+ this.#waiting.add(opening);
689
+ opening.timer = setTimeout(() => {
690
+ this.#waiting.delete(opening);
691
+ opening.channel.close();
692
+ }, UNKNOWN_MEMBER_TIMEOUT);
693
+ opening.timer.unref();
694
+ opening.channel.on('close', () => {
695
+ clearTimeout(opening.timer);
696
+ this.#waiting.delete(opening);
697
+ });
698
+ }
699
+ /**
700
+ * A member, or the media server of another node, is known: the channels waiting are relayed if they can be
701
+ */
702
+ #unwait() {
703
+ for (const opening of [...this.#waiting]) {
704
+ const known = this.#members.has(opening.target) || this.#members.has(this.#elsewhere.get(opening.target) ?? '');
705
+ if (!known)
706
+ continue;
707
+ this.#waiting.delete(opening);
708
+ clearTimeout(opening.timer);
709
+ this.#route(opening);
710
+ }
711
+ }
712
+ /**
713
+ * Close the connection to a member: its tracks are unpublished
714
+ * @param member
715
+ */
716
+ #remove(member) {
717
+ if (this.#members.get(member.id) !== member)
718
+ return;
719
+ this.#members.delete(member.id);
720
+ for (const publication of [...member.publications.values()])
721
+ this.#unpublished(publication);
722
+ member.leg.close();
723
+ //A stream published with WHIP leaves the signaling (before the server, when it was the last one)
724
+ if (!member.peer)
725
+ this.#host.signaling.leave(member.id, this.name).catch(() => undefined);
726
+ if (member.cascade) {
727
+ //Its tracks are not offered any more, its members are not reached any more
728
+ for (const key of member.cascade.offered.keys())
729
+ this.#endRead(key);
730
+ for (const opening of [...this.#waiting])
731
+ if (this.#elsewhere.get(opening.target) === member.id)
732
+ opening.channel.close();
733
+ if (!this.#closed)
734
+ this.#knownChanged();
735
+ }
736
+ else {
737
+ this.#selected.delete(member.id);
738
+ if (!this.#closed)
739
+ this.#tellWants();
740
+ }
741
+ if (!this.#closed)
742
+ this.#host.changed?.(this);
743
+ if (!this.#closed && this.empty)
744
+ this.#host.emptied(this);
745
+ }
746
+ /**
747
+ * Send a signal to a member: a description carries the streams sent to it
748
+ * @param member
749
+ * @param signal
750
+ */
751
+ async #signal(member, signal) {
752
+ await this.#host.signaling.signal(this.#host.id, this.name, member.id, {
753
+ ...signal,
754
+ ...signal.description ? { streams: [...member.streams.values()] } : {}
755
+ });
756
+ }
757
+ /**
758
+ * Send a track published to a member, if the server selects it for the member
759
+ * @param member
760
+ * @param publication
761
+ */
762
+ #offer(member, publication, answer = this.#ask(member, publication)) {
763
+ //A stream published with WHIP receives nothing
764
+ if (member === publication.publisher || !member.peer || member.leg.closed)
765
+ return;
766
+ //The media server of another node: the tracks of the members of this node it wants
767
+ if (member.cascade) {
768
+ if (!publication.remote && member.cascade.wanted.has(trackKey(publication.track.peerId, publication.track.id)))
769
+ this.#subscribe(member, publication).catch(() => undefined);
770
+ return;
771
+ }
772
+ const selected = answer;
773
+ if (selected === undefined)
774
+ return;
775
+ if (typeof selected === 'boolean') {
776
+ if (selected)
777
+ this.#subscribe(member, publication).catch(() => undefined);
778
+ return;
779
+ }
780
+ //Chosen elsewhere: the member and the track may be gone meanwhile
781
+ selected.then((selected) => selected
782
+ && this.#members.get(member.id) === member
783
+ && !member.leg.closed
784
+ && this.#publications.has(publication)
785
+ ? this.#subscribe(member, publication)
786
+ : undefined).catch(() => undefined);
787
+ }
788
+ /**
789
+ * Ask select whether a member receives a track published: undefined for the members select is not asked for (the
790
+ * publisher, the media servers of the other nodes, a member whose connection is closed)
791
+ * @param member
792
+ * @param publication
793
+ */
794
+ #ask(member, publication) {
795
+ if (member === publication.publisher || !member.peer || member.leg.closed || member.cascade)
796
+ return undefined;
797
+ return this.#host.select({ peerId: member.id, metadata: member.metadata, session: member.session }, publication.track);
798
+ }
799
+ /**
800
+ * Wait for the answers of select given as promises, FIRST_OFFER_SELECT_WAIT at most
801
+ * @param answers
802
+ * @returns The answers that came, a failed one as false
803
+ */
804
+ async #settle(answers) {
805
+ const settled = new Map();
806
+ const waiting = [];
807
+ for (const [publication, answer] of answers) {
808
+ if (answer instanceof Promise)
809
+ waiting.push(answer.then((selected) => void settled.set(publication, selected), () => void settled.set(publication, false)));
810
+ }
811
+ if (!waiting.length)
812
+ return settled;
813
+ let timer;
814
+ await Promise.race([Promise.all(waiting), new Promise((resolve) => {
815
+ timer = setTimeout(resolve, FIRST_OFFER_SELECT_WAIT);
816
+ })]);
817
+ clearTimeout(timer);
818
+ return settled;
819
+ }
820
+ /**
821
+ * A member publishes a track: the members selected for it receive it
822
+ * @param member
823
+ * @param event
824
+ */
825
+ #published(member, event) {
826
+ //A transceiver of the member receiving again: the track it received before ended
827
+ const previous = member.publications.get(event.transceiver);
828
+ if (previous)
829
+ this.#unpublished(previous);
830
+ const engine = engineTransceiverOf(member.leg.connection, event.transceiver);
831
+ let peerId = member.id;
832
+ let stream = event.streams[0]?.id ?? '';
833
+ if (member.cascade) {
834
+ //A track of a member of another node: its member and its stream are the ones of the streams of its server
835
+ const origin = member.cascade.received.get(stream);
836
+ if (!origin)
837
+ return;
838
+ peerId = origin.peerId;
839
+ stream = origin.stream;
840
+ }
841
+ const track = {
842
+ room: this.name,
843
+ peerId: peerId,
844
+ id: engine?.receiver.remoteTrackId ?? event.transceiver.mid ?? event.track.id,
845
+ kind: event.track.kind,
846
+ codec: event.track.codec ?? '',
847
+ stream: stream
848
+ };
849
+ const publication = { track: track, media: event.track, transceiver: event.transceiver, publisher: member, remote: !!member.cascade };
850
+ member.publications.set(event.transceiver, publication);
851
+ this.#publications.add(publication);
852
+ if (publication.remote) {
853
+ this.#pipe(trackKey(track.peerId, track.id));
854
+ }
855
+ else {
856
+ this.#host.emit('publish', track);
857
+ this.#tellTracks();
858
+ }
859
+ for (const other of this.#members.values())
860
+ this.#offer(other, publication);
861
+ for (const viewer of this.#viewers.values())
862
+ void this.#feed(viewer);
863
+ }
864
+ /**
865
+ * A track is not published any more: the members receiving it stop
866
+ * @param publication
867
+ */
868
+ #unpublished(publication) {
869
+ if (!this.#publications.delete(publication))
870
+ return;
871
+ if (publication.publisher.publications.get(publication.transceiver) === publication)
872
+ publication.publisher.publications.delete(publication.transceiver);
873
+ for (const member of this.#members.values())
874
+ this.#unsubscribe(member, publication);
875
+ if (publication.remote) {
876
+ this.#pipe(trackKey(publication.track.peerId, publication.track.id));
877
+ }
878
+ else {
879
+ this.#host.emit('unpublish', publication.track);
880
+ this.#tellTracks();
881
+ }
882
+ for (const viewer of this.#viewers.values())
883
+ void this.#feed(viewer);
884
+ }
885
+ /**
886
+ * Send a track to a member: on a transceiver of a track sent before, of the same codec, else on a new one
887
+ * @param member
888
+ * @param publication
889
+ */
890
+ async #subscribe(member, publication) {
891
+ if (member.subscriptions.has(publication))
892
+ return;
893
+ const connection = member.leg.connection;
894
+ const stream = this.#streamOf(member, publication.track);
895
+ const taken = new Set([...member.subscriptions.values()].map((subscription) => subscription.transceiver));
896
+ const reusable = connection.getTransceivers().find((transceiver) => member.transceivers.has(transceiver)
897
+ && !taken.has(transceiver)
898
+ && !transceiver.sender.track
899
+ && transceiver.direction === 'inactive'
900
+ && transceiver.currentDirection === 'inactive'
901
+ && transceiver.kind === publication.track.kind
902
+ && engineTransceiverOf(connection, transceiver)?.sender.codec?.mimeType.toLowerCase() === publication.track.codec.toLowerCase());
903
+ if (!reusable) {
904
+ const transceiver = connection.addTransceiver(publication.media, { direction: 'sendonly', streams: [stream] });
905
+ //The media server of another node takes the id of the track from its MSID, before it is negotiated
906
+ if (member.cascade)
907
+ engineSenderOf(transceiver.sender).trackId = publication.track.id;
908
+ member.transceivers.add(transceiver);
909
+ member.subscriptions.set(publication, { transceiver: transceiver, started: false, paused: false });
910
+ return;
911
+ }
912
+ member.subscriptions.set(publication, { transceiver: reusable, started: false, paused: false });
913
+ if (member.cascade)
914
+ engineSenderOf(reusable.sender).trackId = publication.track.id;
915
+ await reusable.sender.replaceTrack(publication.media);
916
+ reusable.sender.setStreams(stream);
917
+ reusable.direction = 'sendonly';
918
+ }
919
+ /**
920
+ * Stop sending a track to a member: its transceiver stays, inactive, for the next one
921
+ * @param member
922
+ * @param publication
923
+ */
924
+ #unsubscribe(member, publication) {
925
+ const subscription = member.subscriptions.get(publication);
926
+ if (!subscription)
927
+ return;
928
+ member.subscriptions.delete(publication);
929
+ if (member.leg.closed)
930
+ return;
931
+ try {
932
+ subscription.transceiver.direction = 'inactive';
933
+ subscription.transceiver.sender.replaceTrack(null).catch(() => undefined);
934
+ }
935
+ catch {
936
+ //Stopped already
937
+ }
938
+ }
939
+ /**
940
+ * The id of the stream of a track on the connection of a member: short (at most 64 characters in an MSID), the
941
+ * same for the tracks of a stream of a member
942
+ * @param member
943
+ * @param track
944
+ */
945
+ #streamOf(member, track) {
946
+ const key = JSON.stringify([track.peerId, track.stream || track.id]);
947
+ let id = member.streamIds.get(key);
948
+ if (!id) {
949
+ id = `s${member.streamIds.size + 1}`;
950
+ member.streamIds.set(key, id);
951
+ member.streams.set(id, { id: id, peerId: track.peerId, stream: track.stream });
952
+ }
953
+ return id;
954
+ }
955
+ /**
956
+ * A negotiation with a member completed: the tracks it stopped sending are unpublished, the ones it refused (no
957
+ * codec in common) are given up, and the ones it starts receiving begin with a key frame
958
+ * @param member
959
+ */
960
+ #negotiated(member) {
961
+ if (member.leg.closed || member.leg.connection.signalingState !== 'stable')
962
+ return;
963
+ for (const publication of [...member.publications.values()]) {
964
+ const direction = publication.transceiver.currentDirection;
965
+ if (direction === 'inactive' || direction === 'sendonly' || direction === 'stopped')
966
+ this.#unpublished(publication);
967
+ }
968
+ for (const [publication, subscription] of [...member.subscriptions]) {
969
+ const direction = subscription.transceiver.currentDirection;
970
+ if (direction === 'stopped') {
971
+ member.subscriptions.delete(publication);
972
+ this.#host.emit('unsupported', this.name, member.id, publication.track);
973
+ }
974
+ else if (!subscription.started && (direction === 'sendonly' || direction === 'sendrecv')) {
975
+ subscription.started = true;
976
+ if (publication.track.kind === 'video')
977
+ publication.media.requestKeyFrame();
978
+ }
979
+ }
980
+ }
981
+ /**
982
+ * A message of a member on its control channel: pause or resume a track it receives
983
+ * @param member
984
+ * @param data
985
+ */
986
+ #controlled(member, data) {
987
+ let message;
988
+ try {
989
+ message = JSON.parse(typeof data === 'string' ? data : Buffer.from(data).toString());
990
+ }
991
+ catch {
992
+ return;
993
+ }
994
+ if (member.cascade)
995
+ return this.#cascaded(member, member.cascade, message);
996
+ if (message?.type !== 'pause' && message?.type !== 'resume')
997
+ return;
998
+ for (const [publication, subscription] of member.subscriptions) {
999
+ if (subscription.transceiver.mid !== message.mid)
1000
+ continue;
1001
+ const paused = message.type === 'pause';
1002
+ if (subscription.paused === paused)
1003
+ return;
1004
+ subscription.paused = paused;
1005
+ subscription.transceiver.sender.replaceTrack(paused ? null : publication.media).catch(() => undefined);
1006
+ if (!paused && publication.track.kind === 'video')
1007
+ publication.media.requestKeyFrame();
1008
+ return;
1009
+ }
1010
+ }
1011
+ /**
1012
+ * Connect to the media server of another node in the room: the one of the lower id offers first and does not give
1013
+ * up its offers; their control channel carries the tracks of each node and the ones each wants of the other
1014
+ * @param id The id of the member of that server.
1015
+ */
1016
+ #cascade(id) {
1017
+ const peerHost = {
1018
+ localId: this.#host.id,
1019
+ create: () => this.#host.connect(),
1020
+ send: (_to, signal) => this.#signal(member, signal),
1021
+ signalingUp: true,
1022
+ closed: () => undefined,
1023
+ polite: this.#host.id > id
1024
+ };
1025
+ const peer = new Peer(peerHost, id, undefined, undefined);
1026
+ const cascade = { offered: new Map(), wanted: new Set(), received: new Map() };
1027
+ const member = {
1028
+ id: id,
1029
+ leg: peer,
1030
+ peer: peer,
1031
+ metadata: undefined,
1032
+ publications: new Map(),
1033
+ subscriptions: new Map(),
1034
+ streams: new Map(),
1035
+ streamIds: new Map(),
1036
+ transceivers: new Set(),
1037
+ cascade: cascade
1038
+ };
1039
+ this.#members.set(id, member);
1040
+ this.#unwait();
1041
+ peer.on('error', () => undefined);
1042
+ peer.on('track', (event) => this.#published(member, event));
1043
+ peer.on('datachannel', (channel) => this.#opened(member, channel));
1044
+ //The polite side waits for the first offer of the other one
1045
+ peer.ready.then(() => peer.polite ? peer.negotiated : undefined).then(() => {
1046
+ if (peer.closed)
1047
+ return;
1048
+ const connection = peer.connection;
1049
+ connection.on('signalingstatechange', (state) => {
1050
+ if (state === 'stable')
1051
+ setImmediate(() => this.#negotiated(member));
1052
+ });
1053
+ const control = connection.createDataChannel(SignalingControlChannel.label, { negotiated: true, id: SignalingControlChannel.id });
1054
+ control.on('message', (data) => this.#controlled(member, data));
1055
+ //What it was told before is lost with a channel not open
1056
+ control.on('open', () => {
1057
+ cascade.toldTracks = undefined;
1058
+ cascade.toldWants = undefined;
1059
+ this.#tellTracks();
1060
+ this.#tellWants();
1061
+ });
1062
+ member.control = control;
1063
+ }, () => this.#remove(member));
1064
+ return member;
1065
+ }
1066
+ /**
1067
+ * A message of the media server of another node
1068
+ * @param member
1069
+ * @param cascade
1070
+ * @param message
1071
+ */
1072
+ #cascaded(member, cascade, message) {
1073
+ if (!cascade.heard) {
1074
+ cascade.heard = true;
1075
+ cascade.toldTracks = undefined;
1076
+ cascade.toldWants = undefined;
1077
+ this.#tellTracks();
1078
+ this.#tellWants();
1079
+ }
1080
+ if (message?.type === 'tracks' && Array.isArray(message.tracks)) {
1081
+ const before = cascade.offered;
1082
+ cascade.offered = new Map(message.tracks
1083
+ .filter((offered) => typeof offered?.track?.peerId === 'string' && typeof offered.track.id === 'string')
1084
+ .map((offered) => [trackKey(offered.track.peerId, offered.track.id), { track: { ...offered.track, room: this.name }, ...offered.codec ? { codec: offered.codec } : {} }]));
1085
+ for (const key of before.keys())
1086
+ if (!cascade.offered.has(key))
1087
+ this.#endRead(key);
1088
+ this.#knownChanged();
1089
+ this.#evaluate();
1090
+ for (const viewer of this.#viewers.values())
1091
+ void this.#feed(viewer);
1092
+ }
1093
+ else if (message?.type === 'want' && Array.isArray(message.keys)) {
1094
+ cascade.wanted = new Set(message.keys.filter((key) => typeof key === 'string'));
1095
+ for (const publication of [...this.#publications]) {
1096
+ if (publication.remote)
1097
+ continue;
1098
+ if (cascade.wanted.has(trackKey(publication.track.peerId, publication.track.id)))
1099
+ this.#offer(member, publication);
1100
+ else
1101
+ this.#unsubscribe(member, publication);
1102
+ }
1103
+ }
1104
+ }
1105
+ /**
1106
+ * The tracks the media servers of the other nodes offer
1107
+ */
1108
+ *#offeredTracks() {
1109
+ for (const member of this.#members.values())
1110
+ if (member.cascade)
1111
+ yield* member.cascade.offered.values();
1112
+ }
1113
+ /**
1114
+ * A track another node offers
1115
+ * @param key
1116
+ */
1117
+ #offered(key) {
1118
+ for (const member of this.#members.values()) {
1119
+ const offered = member.cascade?.offered.get(key);
1120
+ if (offered)
1121
+ return offered;
1122
+ }
1123
+ return undefined;
1124
+ }
1125
+ /**
1126
+ * A track of another node received here
1127
+ * @param key
1128
+ */
1129
+ #remotePublication(key) {
1130
+ for (const publication of this.#publications) {
1131
+ if (publication.remote && trackKey(publication.track.peerId, publication.track.id) === key)
1132
+ return publication;
1133
+ }
1134
+ return undefined;
1135
+ }
1136
+ /**
1137
+ * The tracks the other nodes offer changed: the thread forwarding the room tells the main thread
1138
+ */
1139
+ #knownChanged() {
1140
+ this.#host.known?.(this, [...this.#offeredTracks()]);
1141
+ }
1142
+ /**
1143
+ * Tell the media servers of the other nodes the tracks of the members of this node
1144
+ */
1145
+ #tellTracks() {
1146
+ const tracks = [...this.#publications].filter((publication) => !publication.remote).map((publication) => {
1147
+ const codec = engineTrackOf(publication.media).codec;
1148
+ return { track: publication.track, ...codec ? { codec: { payloadType: codec.payloadType, mimeType: codec.mimeType, clockRate: codec.clockRate, channels: codec.channels, parameters: codec.parameters } } : {} };
1149
+ });
1150
+ const told = JSON.stringify({ type: 'tracks', tracks: tracks });
1151
+ for (const member of this.#members.values()) {
1152
+ if (!member.cascade || member.control?.readyState !== 'open' || member.cascade.toldTracks === told)
1153
+ continue;
1154
+ member.cascade.toldTracks = told;
1155
+ member.control.send(told);
1156
+ }
1157
+ }
1158
+ /**
1159
+ * Tell the media servers of the other nodes the tracks of theirs this node wants: the ones a member of this node is
1160
+ * selected for, the ones of the source of a viewer, the ones read here
1161
+ */
1162
+ #tellWants() {
1163
+ if (this.#closed)
1164
+ return;
1165
+ const sources = new Set([...this.#viewers.values()].map((viewer) => viewer.source).filter((source) => source !== undefined));
1166
+ for (const member of this.#members.values()) {
1167
+ const cascade = member.cascade;
1168
+ if (!cascade || member.control?.readyState !== 'open')
1169
+ continue;
1170
+ const keys = [];
1171
+ for (const [key, { track }] of cascade.offered) {
1172
+ const selected = [...this.#members.values()].some((each) => !!each.peer && !each.cascade && !each.leg.closed && each.id !== track.peerId && this.#selected.get(each.id)?.get(key) === true);
1173
+ if (selected || sources.has(track.peerId) || this.#reads.get(key)?.wanted)
1174
+ keys.push(key);
1175
+ }
1176
+ const told = JSON.stringify({ type: 'want', keys: keys.sort() });
1177
+ if (cascade.toldWants === told)
1178
+ continue;
1179
+ cascade.toldWants = told;
1180
+ member.control.send(told);
1181
+ }
1182
+ }
1183
+ /**
1184
+ * The metadata of a member changed: select is asked again for it, the tracks it receives follow the answers (and
1185
+ * the tracks of the other nodes this node wants)
1186
+ * @param member
1187
+ */
1188
+ #reselect(member) {
1189
+ if (!member.peer || member.cascade)
1190
+ return;
1191
+ this.#selected.delete(member.id);
1192
+ this.#evaluate();
1193
+ //Before its connection is up, it gets the tracks as it comes
1194
+ if (!member.control)
1195
+ return;
1196
+ const subscriber = { peerId: member.id, metadata: member.metadata, session: member.session };
1197
+ for (const publication of [...this.#publications]) {
1198
+ if (publication.publisher === member)
1199
+ continue;
1200
+ const apply = (selected) => {
1201
+ if (this.#members.get(member.id) !== member || member.leg.closed || !this.#publications.has(publication))
1202
+ return;
1203
+ if (selected)
1204
+ this.#subscribe(member, publication).catch(() => undefined);
1205
+ else
1206
+ this.#unsubscribe(member, publication);
1207
+ };
1208
+ const answer = this.#host.select(subscriber, publication.track);
1209
+ if (typeof answer === 'boolean')
1210
+ apply(answer);
1211
+ else
1212
+ answer.then(apply, () => undefined);
1213
+ }
1214
+ }
1215
+ /**
1216
+ * Ask select for the members of this node and the tracks of the other nodes not asked yet; the tracks wanted follow
1217
+ * the answers
1218
+ */
1219
+ #evaluate() {
1220
+ for (const member of this.#members.values()) {
1221
+ if (!member.peer || member.cascade)
1222
+ continue;
1223
+ let selected = this.#selected.get(member.id);
1224
+ if (!selected) {
1225
+ selected = new Map();
1226
+ this.#selected.set(member.id, selected);
1227
+ }
1228
+ const answers = selected;
1229
+ for (const offered of this.#offeredTracks()) {
1230
+ const key = trackKey(offered.track.peerId, offered.track.id);
1231
+ if (answers.has(key) || offered.track.peerId === member.id)
1232
+ continue;
1233
+ const answer = this.#host.select({ peerId: member.id, metadata: member.metadata, session: member.session }, offered.track);
1234
+ if (typeof answer === 'boolean') {
1235
+ answers.set(key, answer);
1236
+ continue;
1237
+ }
1238
+ //Not wanted until it answers
1239
+ answers.set(key, false);
1240
+ answer.then((yes) => {
1241
+ if (!yes || this.#selected.get(member.id) !== answers)
1242
+ return;
1243
+ answers.set(key, true);
1244
+ this.#tellWants();
1245
+ }, () => undefined);
1246
+ }
1247
+ }
1248
+ this.#tellWants();
1249
+ }
1250
+ /**
1251
+ * Give a track of another node read here its packets, while it is read and received
1252
+ * @param key
1253
+ */
1254
+ #pipe(key) {
1255
+ const read = this.#reads.get(key);
1256
+ if (!read)
1257
+ return;
1258
+ const source = read.wanted ? this.#remotePublication(key) : undefined;
1259
+ if (read.source === source)
1260
+ return;
1261
+ read.unpipe?.();
1262
+ read.unpipe = undefined;
1263
+ read.source = source;
1264
+ if (!source)
1265
+ return;
1266
+ read.unpipe = engineTrackOf(source.media).onReceiveRtp.subscribe((packet, extensions) => read.receive(packet, extensions)).unSubscribe;
1267
+ if (source.track.kind === 'video')
1268
+ source.media.requestKeyFrame();
1269
+ }
1270
+ /**
1271
+ * A track of another node is not offered any more: the track read here ends
1272
+ * @param key
1273
+ */
1274
+ #endRead(key) {
1275
+ const read = this.#reads.get(key);
1276
+ if (!read)
1277
+ return;
1278
+ this.#reads.delete(key);
1279
+ read.unpipe?.();
1280
+ read.track.stop();
1281
+ }
1282
+ /**
1283
+ * Tell the application when the bandwidth to a member is too low, and when it is enough again
1284
+ * @param member
1285
+ */
1286
+ #watchBandwidth(member) {
1287
+ const transport = engineConnectionOf(member.leg.connection).dtlsTransports[0];
1288
+ if (!transport || this.#watched.has(transport))
1289
+ return;
1290
+ this.#watched.add(transport);
1291
+ transport.senderBWE.onCongestion.subscribe((congested) => {
1292
+ if (!member.leg.closed)
1293
+ this.#host.emit('congestion', this.name, member.id, congested, transport.senderBWE.availableBitrate);
1294
+ });
1295
+ }
1296
+ }