@lakutata/webrtc 0.0.0-stage → 3.1.4

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