@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,1585 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { DEFAULT_SCTP_MTU, validateSctpMtu } from '../sctp/index.js';
3
+ import { createWebRtcDomException, createWebRtcTypeError } from './errors.js';
4
+ import { EventTarget, enumerate } from './helper.js';
5
+ import { Event, debug, runDetached } from './imports/common.js';
6
+ import { RTCRtpHeaderExtensionParameters, RtpRouter, TransceiverManager, defaultCodecs } from './media/index.js';
7
+ import { buildStatsReport, generateStatsId, getStatsTimestamp } from './media/stats.js';
8
+ import { SctpTransportManager } from './sctpManager.js';
9
+ import { SessionDescription } from './sdp.js';
10
+ import { SDPManager } from './sdpManager.js';
11
+ import { SecureTransportManager } from './secureTransportManager.js';
12
+ import { DEFAULT_MAX_MESSAGE_SIZE } from './transport/sctp.js';
13
+ import { andDirection, deepMerge } from './utils.js';
14
+ const log = debug('webrtc/peer/peerConnection');
15
+ /**
16
+ * W3C compatibility notes kept near the public RTCPeerConnection surface so the
17
+ * reviewable diff does not depend on external PR text.
18
+ *
19
+ * - `current/pending*Description`, `canTrickleIceCandidates`, `sctp`,
20
+ * `addIceCandidate(null)`, and `RTCConfiguration` round-trip behavior are
21
+ * implemented here and covered by `tests/wpt/peerConnectionApiCompatibility.test.ts`.
22
+ * - `addIceCandidate()` also validates `sdpMid` / `sdpMLineIndex` /
23
+ * `usernameFragment` against the applied remote description and appends
24
+ * candidates or end-of-candidates markers to the corresponding m-section.
25
+ * The public API keeps werift's historical pre-SRD buffering behavior, while
26
+ * the WPT runner wraps the class to exercise strict spec rejection.
27
+ * - `bundlePolicy: "balanced"` is accepted for input compatibility but is
28
+ * normalized to werift's `"max-compat"` behavior, so `getConfiguration()`
29
+ * returns the normalized value.
30
+ * - `setLocalDescription()` keeps the historical `SessionDescription` return
31
+ * value for non-rollback calls, while `{ type: "rollback" }` resolves `void`
32
+ * to match the actual behavior without pretending to return a description.
33
+ * - API reference markdown is regenerated with `cd packages/webrtc && npm run doc`.
34
+ * The generated output lives under `packages/webrtc/doc/`; compatibility
35
+ * notes remain here and in the package README so review context is visible
36
+ * even when generated docs are not committed in the same change.
37
+ */
38
+ export class RTCPeerConnection extends EventTarget {
39
+ get ondatachannel() {
40
+ return this.eventHandlers.ondatachannel ?? null;
41
+ }
42
+ set ondatachannel(value) {
43
+ this.eventHandlers.ondatachannel = value ?? undefined;
44
+ }
45
+ get onicecandidate() {
46
+ return this.eventHandlers.onicecandidate ?? null;
47
+ }
48
+ set onicecandidate(value) {
49
+ this.eventHandlers.onicecandidate = value ?? undefined;
50
+ }
51
+ get onicecandidateerror() {
52
+ return this.eventHandlers.onicecandidateerror ?? null;
53
+ }
54
+ set onicecandidateerror(value) {
55
+ this.eventHandlers.onicecandidateerror = value ?? undefined;
56
+ }
57
+ get onicegatheringstatechange() {
58
+ return this.eventHandlers.onicegatheringstatechange ?? null;
59
+ }
60
+ set onicegatheringstatechange(value) {
61
+ this.eventHandlers.onicegatheringstatechange = value ?? undefined;
62
+ }
63
+ get onnegotiationneeded() {
64
+ return this.eventHandlers.onnegotiationneeded ?? null;
65
+ }
66
+ set onnegotiationneeded(value) {
67
+ this.eventHandlers.onnegotiationneeded = value ?? undefined;
68
+ }
69
+ get onsignalingstatechange() {
70
+ return this.eventHandlers.onsignalingstatechange ?? null;
71
+ }
72
+ set onsignalingstatechange(value) {
73
+ this.eventHandlers.onsignalingstatechange = value ?? undefined;
74
+ }
75
+ get ontrack() {
76
+ return this.eventHandlers.ontrack ?? null;
77
+ }
78
+ set ontrack(value) {
79
+ this.eventHandlers.ontrack = value ?? undefined;
80
+ }
81
+ get onconnectionstatechange() {
82
+ return this.eventHandlers.onconnectionstatechange ?? null;
83
+ }
84
+ set onconnectionstatechange(value) {
85
+ this.eventHandlers.onconnectionstatechange = value ?? undefined;
86
+ }
87
+ get oniceconnectionstatechange() {
88
+ return this.eventHandlers.oniceconnectionstatechange ?? null;
89
+ }
90
+ set oniceconnectionstatechange(value) {
91
+ this.eventHandlers.oniceconnectionstatechange = value ?? undefined;
92
+ }
93
+ constructor(config = {}) {
94
+ super();
95
+ this.id = randomUUID().toString();
96
+ this.cname = randomUUID().toString();
97
+ this.config = generateDefaultPeerConfig();
98
+ this.signalingState = 'stable';
99
+ this.negotiationneeded = false;
100
+ /**同じ tick の複数の変更で negotiationneeded を重複発火しないための予約フラグ */
101
+ this.negotiationneededScheduled = false;
102
+ /**交渉が必要な変更の通し番号 */
103
+ this.negotiationChangeSeq = 0;
104
+ /**answer まで確定した local offer が反映している変更の通し番号 */
105
+ this.negotiatedChangeSeq = 0;
106
+ this.lastCreatedOfferChangeSeq = 0;
107
+ this.needRestart = false;
108
+ this.router = new RtpRouter();
109
+ this.isClosed = false;
110
+ this.shouldNegotiationneeded = false;
111
+ this.pendingRemoteCandidates = [];
112
+ this.iceGatheringStateChange = new Event();
113
+ this.iceConnectionStateChange = new Event();
114
+ this.signalingStateChange = new Event();
115
+ this.connectionStateChange = new Event();
116
+ this.onDataChannel = new Event();
117
+ this.onRemoteTransceiverAdded = new Event();
118
+ this.onTransceiverAdded = new Event();
119
+ this.onIceCandidate = new Event();
120
+ this.onNegotiationneeded = new Event();
121
+ this.onTrack = new Event();
122
+ this.eventHandlers = {};
123
+ /**交渉が必要な変更を記録し、negotiationneeded を予約する */
124
+ this.needNegotiation = () => {
125
+ this.negotiationChangeSeq++;
126
+ this.scheduleNegotiationneeded();
127
+ };
128
+ this.setConfiguration(config);
129
+ this.sdpManager = new SDPManager({
130
+ cname: this.cname,
131
+ bundlePolicy: this.config.bundlePolicy,
132
+ mLineReuse: this.config.mLineReuse
133
+ });
134
+ this.transceiverManager = new TransceiverManager(this.cname, this.config, this.router);
135
+ this.transceiverManager.onTransceiverAdded.pipe(this.onTransceiverAdded);
136
+ this.transceiverManager.onRemoteTransceiverAdded.pipe(this.onRemoteTransceiverAdded);
137
+ this.transceiverManager.onTrack.subscribe(({ track, streams, transceiver }) => {
138
+ const event = new RTCTrackEvent({
139
+ track,
140
+ streams,
141
+ transceiver,
142
+ receiver: transceiver.receiver
143
+ });
144
+ this.onTrack.execute(track);
145
+ this.emit('track', event);
146
+ if (this.ontrack) {
147
+ runDetached(() => this.ontrack(event), (error) => log('event handler failed', error));
148
+ }
149
+ });
150
+ this.transceiverManager.onNegotiationNeeded.subscribe(() => this.needNegotiation());
151
+ this.sctpManager = new SctpTransportManager();
152
+ this.sctpManager.onDataChannel.subscribe((channel) => {
153
+ this.onDataChannel.execute(channel);
154
+ const event = { type: 'datachannel', channel };
155
+ if (this.ondatachannel)
156
+ runDetached(() => this.ondatachannel(event), (error) => log('event handler failed', error));
157
+ this.emit('datachannel', event);
158
+ });
159
+ this.secureManager = new SecureTransportManager({
160
+ config: this.config,
161
+ sctpManager: this.sctpManager,
162
+ transceiverManager: this.transceiverManager
163
+ });
164
+ this.secureManager.iceGatheringStateChange.subscribe((state) => {
165
+ this.iceGatheringStateChange.execute(state);
166
+ if (this.onicegatheringstatechange) {
167
+ runDetached(() => this.onicegatheringstatechange(new globalThis.Event('icegatheringstatechange')), (error) => log('event handler failed', error));
168
+ }
169
+ this.emit('icegatheringstatechange');
170
+ });
171
+ this.secureManager.iceConnectionStateChange.subscribe((state) => {
172
+ if (state === 'closed') {
173
+ this.close().catch((error) => log('close failed', error));
174
+ }
175
+ this.iceConnectionStateChange.execute(state);
176
+ if (this.oniceconnectionstatechange)
177
+ runDetached(() => this.oniceconnectionstatechange(), (error) => log('event handler failed', error));
178
+ this.emit('iceconnectionstatechange');
179
+ });
180
+ this.secureManager.connectionStateChange.subscribe((state) => {
181
+ this.connectionStateChange.execute(state);
182
+ if (this.onconnectionstatechange)
183
+ runDetached(() => this.onconnectionstatechange(), (error) => log('event handler failed', error));
184
+ this.emit('connectionstatechange');
185
+ });
186
+ this.secureManager.onIceCandidate.subscribe((candidate) => {
187
+ const iceCandidate = candidate ? candidate.toJSON() : undefined;
188
+ this.onIceCandidate.execute(iceCandidate);
189
+ const event = {
190
+ type: 'icecandidate',
191
+ candidate: iceCandidate
192
+ };
193
+ if (this.onicecandidate)
194
+ runDetached(() => this.onicecandidate(event), (error) => log('event handler failed', error));
195
+ this.emit('icecandidate', event);
196
+ });
197
+ }
198
+ get connectionState() {
199
+ return this.secureManager.connectionState;
200
+ }
201
+ get iceConnectionState() {
202
+ return this.secureManager.iceConnectionState;
203
+ }
204
+ get iceGathererState() {
205
+ return this.secureManager.iceGatheringState;
206
+ }
207
+ get iceGatheringState() {
208
+ return this.secureManager.iceGatheringState;
209
+ }
210
+ get dtlsTransports() {
211
+ return this.secureManager.dtlsTransports;
212
+ }
213
+ get sctpTransport() {
214
+ return this.sctpManager.sctpTransport;
215
+ }
216
+ get sctp() {
217
+ return this.sctpTransport ?? null;
218
+ }
219
+ get sctpRemotePort() {
220
+ return this.sctpManager.sctpRemotePort;
221
+ }
222
+ get iceTransports() {
223
+ return this.secureManager.iceTransports;
224
+ }
225
+ get extIdUriMap() {
226
+ return this.router.extIdUriMap;
227
+ }
228
+ get iceGeneration() {
229
+ return this.iceTransports[0].connection.generation;
230
+ }
231
+ get localDescription() {
232
+ return this.sdpManager.localDescription ?? null;
233
+ }
234
+ get currentLocalDescription() {
235
+ return this.sdpManager.currentLocalDescription?.toJSON() ?? null;
236
+ }
237
+ get pendingLocalDescription() {
238
+ return this.sdpManager.pendingLocalDescription?.toJSON() ?? null;
239
+ }
240
+ get remoteDescription() {
241
+ return this.sdpManager.remoteDescription ?? null;
242
+ }
243
+ get currentRemoteDescription() {
244
+ return this.sdpManager.currentRemoteDescription?.toJSON() ?? null;
245
+ }
246
+ get pendingRemoteDescription() {
247
+ return this.sdpManager.pendingRemoteDescription?.toJSON() ?? null;
248
+ }
249
+ get canTrickleIceCandidates() {
250
+ const remoteDescription = this.sdpManager._remoteDescription;
251
+ if (!remoteDescription) {
252
+ return null;
253
+ }
254
+ const iceOptions = [
255
+ remoteDescription.iceOptions,
256
+ ...remoteDescription.media.map((media) => media.iceOptions)
257
+ ]
258
+ .filter((value) => !!value)
259
+ .join(' ');
260
+ return iceOptions.split(/\s+/).includes('trickle');
261
+ }
262
+ get remoteIsBundled() {
263
+ return this.sdpManager.remoteIsBundled;
264
+ }
265
+ /**@private */
266
+ get _localDescription() {
267
+ return this.sdpManager._localDescription;
268
+ }
269
+ /**@private */
270
+ get _remoteDescription() {
271
+ return this.sdpManager._remoteDescription;
272
+ }
273
+ getTransceivers() {
274
+ return this.transceiverManager.getTransceivers();
275
+ }
276
+ getSenders() {
277
+ return this.transceiverManager.getSenders();
278
+ }
279
+ getReceivers() {
280
+ return this.transceiverManager.getReceivers();
281
+ }
282
+ setConfiguration(config) {
283
+ const normalizedConfig = normalizePeerConfiguration(config);
284
+ const isReconfiguration = !!this.sdpManager;
285
+ if (normalizedConfig.rtcpMuxPolicy &&
286
+ normalizedConfig.rtcpMuxPolicy !== 'require') {
287
+ throw new Error('rtcpMuxPolicy must be require');
288
+ }
289
+ if (normalizedConfig.iceCandidatePoolSize !== undefined &&
290
+ (!Number.isInteger(normalizedConfig.iceCandidatePoolSize) ||
291
+ normalizedConfig.iceCandidatePoolSize < 0)) {
292
+ throw new Error('iceCandidatePoolSize must be a non-negative integer');
293
+ }
294
+ if (isReconfiguration &&
295
+ normalizedConfig.bundlePolicy !== undefined &&
296
+ normalizedConfig.bundlePolicy !== this.config.bundlePolicy) {
297
+ throw new Error('bundlePolicy cannot be changed');
298
+ }
299
+ if (normalizedConfig.mLineReuse !== undefined &&
300
+ !MLineReuseModes.includes(normalizedConfig.mLineReuse)) {
301
+ throw createWebRtcTypeError(`mLineReuse must be one of ${MLineReuseModes.join(', ')}`);
302
+ }
303
+ if (isReconfiguration &&
304
+ normalizedConfig.mLineReuse !== undefined &&
305
+ normalizedConfig.mLineReuse !== this.config.mLineReuse) {
306
+ throw createWebRtcDomException('InvalidModificationError', 'mLineReuse cannot be changed');
307
+ }
308
+ if (isReconfiguration &&
309
+ normalizedConfig.rtcpMuxPolicy !== undefined &&
310
+ normalizedConfig.rtcpMuxPolicy !== this.config.rtcpMuxPolicy) {
311
+ throw new Error('rtcpMuxPolicy cannot be changed');
312
+ }
313
+ if (isReconfiguration &&
314
+ normalizedConfig.certificates !== undefined &&
315
+ !hasSameCertificates(normalizedConfig.certificates, this.config.certificates)) {
316
+ throw new Error('certificates cannot be changed');
317
+ }
318
+ if (isReconfiguration &&
319
+ normalizedConfig.iceCandidatePoolSize !== undefined &&
320
+ this.localDescription &&
321
+ normalizedConfig.iceCandidatePoolSize !== this.config.iceCandidatePoolSize) {
322
+ throw new Error('iceCandidatePoolSize cannot be changed after setLocalDescription');
323
+ }
324
+ if ((normalizedConfig.iceCandidatePoolSize ?? 0) > 0) {
325
+ throw new Error('iceCandidatePoolSize > 0 is not supported');
326
+ }
327
+ if (normalizedConfig.sctp !== undefined) {
328
+ const requestedSctpMtu = normalizedConfig.sctp.mtu ?? DEFAULT_SCTP_MTU;
329
+ validateSctpMtu(requestedSctpMtu);
330
+ if (this.sctpManager?.sctpTransport &&
331
+ requestedSctpMtu !== this.config.sctp.mtu) {
332
+ throw new Error('sctp.mtu cannot be changed after SCTP transport creation');
333
+ }
334
+ }
335
+ deepMerge(this.config, normalizedConfig);
336
+ this.config.sctp = {
337
+ mtu: this.config.sctp?.mtu ?? DEFAULT_SCTP_MTU
338
+ };
339
+ if (this.config.icePortRange) {
340
+ const [min, max] = this.config.icePortRange;
341
+ if (min === max)
342
+ throw new Error('should not be same value');
343
+ if (min >= max)
344
+ throw new Error('The min must be less than max');
345
+ }
346
+ if (!Number.isInteger(this.config.maxMessageSize) ||
347
+ this.config.maxMessageSize < 0) {
348
+ throw new Error('maxMessageSize must be a non-negative integer');
349
+ }
350
+ if (this.sctpManager?.sctpTransport) {
351
+ this.sctpManager.sctpTransport.maxMessageSize =
352
+ this.config.maxMessageSize;
353
+ }
354
+ assignDynamicPayloadTypes(this.config);
355
+ //One id per extension, the same in all the media (of a bundle)
356
+ const extensionIds = new Map();
357
+ const extensions = [
358
+ ...(this.config.headerExtensions.audio || []),
359
+ ...(this.config.headerExtensions.video || [])
360
+ ];
361
+ extensions.forEach((v) => {
362
+ if (!extensionIds.has(v.uri))
363
+ extensionIds.set(v.uri, extensionIds.size + 1);
364
+ v.id = extensionIds.get(v.uri);
365
+ });
366
+ // Propagate ICE server changes only to transports still in gathering
367
+ // state "new". JSEP (RFC 8829 §4.1.18): STUN/TURN changes affect the next
368
+ // gathering phase; once gathering has started or finished, nothing is
369
+ // applied to the live Connection (WHIP: createOffer → setConfiguration →
370
+ // setLocalDescription). Per-transport state is used so a gatherer that
371
+ // was reset to "new" (e.g. after ICE restart) is not blocked by a stale
372
+ // manager aggregate of "complete".
373
+ if (isReconfiguration &&
374
+ this.secureManager &&
375
+ (normalizedConfig.iceServers !== undefined ||
376
+ normalizedConfig.turnUdpFamily !== undefined)) {
377
+ this.secureManager.updateIceServers();
378
+ }
379
+ }
380
+ getConfiguration() {
381
+ return clonePeerConfiguration(this.config);
382
+ }
383
+ /**
384
+ * The header extensions of a media not negotiated yet: the ones configured, with the ids the connection negotiated
385
+ * for them in its other media (an extension has one id in all the media of a bundle: a browser refuses another one),
386
+ * else their configured ids when not taken by another extension, else free ones
387
+ */
388
+ headerExtensionsFor(kind) {
389
+ const negotiated = new Map();
390
+ for (const transceiver of this.transceiverManager.getTransceivers()) {
391
+ for (const extension of transceiver.headerExtensions)
392
+ negotiated.set(extension.uri, extension.id);
393
+ }
394
+ const taken = new Set(negotiated.values());
395
+ return (this.config.headerExtensions[kind] ?? []).flatMap((extension) => {
396
+ let id = negotiated.get(extension.uri);
397
+ if (id === undefined) {
398
+ id = taken.has(extension.id)
399
+ ? Array.from({ length: 14 }, (_, index) => index + 1).find((free) => !taken.has(free))
400
+ : extension.id;
401
+ if (id === undefined)
402
+ return [];
403
+ taken.add(id);
404
+ negotiated.set(extension.uri, id);
405
+ }
406
+ return [new RTCRtpHeaderExtensionParameters({ uri: extension.uri, id })];
407
+ });
408
+ }
409
+ async createOffer({ iceRestart } = {}) {
410
+ if (iceRestart || this.needRestart) {
411
+ this.needRestart = false;
412
+ this.secureManager.restartIce();
413
+ }
414
+ await this.secureManager.ensureCerts();
415
+ for (const transceiver of this.transceiverManager.getTransceivers()) {
416
+ if (transceiver.codecs.length === 0 ||
417
+ transceiver.codecPreferencesNeedResolution) {
418
+ this.transceiverManager.assignTransceiverCodecs(transceiver);
419
+ }
420
+ if (transceiver.headerExtensions.length === 0) {
421
+ transceiver.headerExtensions = this.headerExtensionsFor(transceiver.kind);
422
+ }
423
+ }
424
+ const description = this.sdpManager.buildOfferSdp(this.transceiverManager.getTransceivers(), this.sctpTransport);
425
+ const createdOffer = description.toJSON();
426
+ this.lastCreatedOffer = createdOffer;
427
+ this.lastCreatedOfferChangeSeq = this.negotiationChangeSeq;
428
+ return createdOffer;
429
+ }
430
+ createSctpTransport() {
431
+ const sctp = this.sctpManager.createSctpTransport(this.config.maxMessageSize, this.config.sctp);
432
+ const dtlsTransport = this.findOrCreateTransport();
433
+ sctp.setDtlsTransport(dtlsTransport);
434
+ return sctp;
435
+ }
436
+ createDataChannel(label, options = {}) {
437
+ if (!this.sctpTransport) {
438
+ this.createSctpTransport();
439
+ this.needNegotiation();
440
+ }
441
+ const channel = this.sctpManager.createDataChannel(label, options);
442
+ if (!channel.sctp.dtlsTransport) {
443
+ const dtlsTransport = this.findOrCreateTransport();
444
+ channel.sctp.setDtlsTransport(dtlsTransport);
445
+ }
446
+ return channel;
447
+ }
448
+ removeTrack(sender) {
449
+ if (this.isClosed) {
450
+ throw createWebRtcDomException('InvalidStateError', 'peer closed');
451
+ }
452
+ if (this.transceiverManager.removeTrack(sender)) {
453
+ this.needNegotiation();
454
+ }
455
+ }
456
+ /**未交渉の変更が残っていれば negotiationneeded を予約する (stable 復帰時の再判定にも使う) */
457
+ scheduleNegotiationneeded() {
458
+ this.invalidateLastCreatedDescriptions();
459
+ this.shouldNegotiationneeded = true;
460
+ if (this.negotiationneeded ||
461
+ this.negotiationneededScheduled ||
462
+ this.signalingState !== 'stable') {
463
+ return;
464
+ }
465
+ this.shouldNegotiationneeded = false;
466
+ this.negotiationneededScheduled = true;
467
+ setImmediate(() => {
468
+ this.negotiationneededScheduled = false;
469
+ if (this.negotiatedChangeSeq >= this.negotiationChangeSeq) {
470
+ // 発火前に適用された local offer が変更をすべて含んでいる
471
+ return;
472
+ }
473
+ if (this.signalingState !== 'stable') {
474
+ // stable に戻った時点で改めて判定する
475
+ this.shouldNegotiationneeded = true;
476
+ return;
477
+ }
478
+ this.negotiationneeded = true;
479
+ this.onNegotiationneeded.execute();
480
+ if (this.onnegotiationneeded) {
481
+ runDetached(() => this.onnegotiationneeded(new globalThis.Event('negotiationneeded')), (error) => log('event handler failed', error));
482
+ }
483
+ this.emit('negotiationneeded');
484
+ });
485
+ }
486
+ invalidateLastCreatedDescriptions() {
487
+ this.lastCreatedAnswer = undefined;
488
+ this.lastCreatedOffer = undefined;
489
+ }
490
+ async waitForPendingDescriptionTask() {
491
+ this.assertNotClosed();
492
+ await Promise.resolve();
493
+ if (this.isClosed) {
494
+ await new Promise(() => undefined);
495
+ }
496
+ }
497
+ findOrCreateTransport() {
498
+ const existingDtlsTransport = this.dtlsTransports.find((transport) => transport.state !== 'closed');
499
+ // Gather ICE candidates for only one track. If the remote endpoint is not bundle-aware, negotiate only one media track.
500
+ // https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum
501
+ if (this.sdpManager.bundlePolicy === 'max-bundle' ||
502
+ (this.sdpManager.bundlePolicy !== 'disable' && this.remoteIsBundled)) {
503
+ if (existingDtlsTransport) {
504
+ return existingDtlsTransport;
505
+ }
506
+ }
507
+ return this.createDtlsTransport();
508
+ }
509
+ /**
510
+ * @param inheritCredentials false の場合は BUNDLE 外の独立 transport として
511
+ * 既存 transport と異なる ICE credentials を使う
512
+ */
513
+ createDtlsTransport({ inheritCredentials = true } = {}) {
514
+ const dtlsTransport = this.secureManager.createTransport({
515
+ inheritCredentials
516
+ });
517
+ dtlsTransport.onRtp.subscribe((rtp) => {
518
+ this.router.routeRtp(rtp);
519
+ });
520
+ dtlsTransport.onRtcp.subscribe((rtcp) => {
521
+ this.router.routeRtcp(rtcp);
522
+ });
523
+ const iceTransport = dtlsTransport.iceTransport;
524
+ iceTransport.onNegotiationNeeded.subscribe(() => {
525
+ this.needNegotiation();
526
+ });
527
+ iceTransport.onIceCandidate.subscribe((candidate) => {
528
+ if (!this.localDescription) {
529
+ log('localDescription not found when ice candidate was gathered');
530
+ return;
531
+ }
532
+ if (!candidate) {
533
+ this.sdpManager.setLocal(this._localDescription, this.transceiverManager.getTransceivers(), this.sctpTransport);
534
+ this.onIceCandidate.execute(undefined);
535
+ if (this.onicecandidate) {
536
+ runDetached(() => this.onicecandidate({ candidate: undefined }), (error) => log('event handler failed', error));
537
+ }
538
+ this.emit('icecandidate', { candidate: undefined });
539
+ return;
540
+ }
541
+ if (!this._localDescription) {
542
+ log('localDescription not found when ice candidate was gathered');
543
+ return;
544
+ }
545
+ const owner = this.resolveLocalCandidateOwner(iceTransport);
546
+ if (!owner) {
547
+ // 停止 / 拒否した m-line だけが使う transport の候補は通知しない
548
+ log('no accepted m-line owns the ice transport', iceTransport.id);
549
+ return;
550
+ }
551
+ this.secureManager.handleNewIceCandidate({
552
+ candidate,
553
+ sdpMid: owner.mid,
554
+ sdpMLineIndex: owner.index
555
+ });
556
+ });
557
+ return dtlsTransport;
558
+ }
559
+ /**
560
+ * local candidate の sdpMid / sdpMLineIndex を、その ICE transport を実際に
561
+ * 所有する受け入れ済み m-line (BUNDLE なら tag) に合わせる。
562
+ */
563
+ resolveLocalCandidateOwner(iceTransport) {
564
+ const description = this._localDescription;
565
+ if (!description) {
566
+ return;
567
+ }
568
+ const owners = description.media
569
+ .map((media, index) => ({ media, index }))
570
+ .filter(({ media }) => {
571
+ if (media.port === 0) {
572
+ return false;
573
+ }
574
+ const mid = media.rtp.muxId;
575
+ if (media.kind === 'application') {
576
+ return (!!this.sctpTransport &&
577
+ this.sctpTransport.mid === mid &&
578
+ this.sctpTransport.dtlsTransport?.iceTransport.id ===
579
+ iceTransport.id);
580
+ }
581
+ const transceiver = this.transceiverManager
582
+ .getTransceivers()
583
+ .find((t) => t.mid != undefined && t.mid === mid);
584
+ return (!!transceiver &&
585
+ !transceiver.stopped &&
586
+ transceiver.dtlsTransport?.iceTransport.id === iceTransport.id);
587
+ });
588
+ const tags = description.group
589
+ .filter((group) => group.semantic === 'BUNDLE')
590
+ .map((group) => group.items[0]);
591
+ const owner = owners.find(({ media }) => tags.includes(media.rtp.muxId)) ?? owners[0];
592
+ if (!owner) {
593
+ return;
594
+ }
595
+ return { mid: owner.media.rtp.muxId, index: owner.index };
596
+ }
597
+ /**
598
+ * answer 確定後の stopping transceiver を整理する。
599
+ * @returns port 0 を自分の offer で交渉すべき transceiver が残っているか
600
+ */
601
+ settleStoppingTransceivers() {
602
+ const negotiatedMids = new Set((this.sdpManager.currentLocalDescription?.media ?? [])
603
+ .filter((media) => media.port !== 0 && media.rtp.muxId)
604
+ .map((media) => media.rtp.muxId));
605
+ const pending = this.transceiverManager.settleStoppingTransceivers(negotiatedMids);
606
+ this.closeIdleTransports();
607
+ return pending;
608
+ }
609
+ /**停止した transceiver の transport のうち、live な利用者がいないものを閉じる */
610
+ closeIdleTransports(candidates = this.transceiverManager
611
+ .getTransceivers()
612
+ .filter((t) => t.stopped)
613
+ .map((t) => t.dtlsTransport)) {
614
+ const live = new Set(this.dtlsTransports.map((t) => t.id));
615
+ for (const transport of new Set(candidates)) {
616
+ if (!transport ||
617
+ transport.state === 'closed' ||
618
+ live.has(transport.id)) {
619
+ continue;
620
+ }
621
+ transport.stop().catch((error) => {
622
+ log('failed to close idle transport', error);
623
+ });
624
+ }
625
+ }
626
+ async setLocalDescription(sessionDescription) {
627
+ // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setLocalDescription#type
628
+ const implicitOfferState = [
629
+ 'stable',
630
+ 'have-local-offer',
631
+ 'have-remote-pranswer'
632
+ ];
633
+ await this.waitForPendingDescriptionTask();
634
+ if (sessionDescription?.type === 'rollback') {
635
+ this.sdpManager.rollbackLocalDescription(this.signalingState);
636
+ this.rollbackLocalOffer();
637
+ for (const transceiver of this.transceiverManager.getTransceivers()) {
638
+ transceiver.pendingLocalOfferCodecs = undefined;
639
+ }
640
+ this.pendingOfferChangeSeq = undefined;
641
+ this.setSignalingState('stable');
642
+ if (this.shouldNegotiationneeded) {
643
+ this.scheduleNegotiationneeded();
644
+ }
645
+ this.invalidateLastCreatedDescriptions();
646
+ return;
647
+ }
648
+ const needsGeneratedDescription = !sessionDescription?.type ||
649
+ !sessionDescription.sdp ||
650
+ sessionDescription.sdp.length === 0;
651
+ const generatedDescription = needsGeneratedDescription
652
+ ? sessionDescription?.type === 'offer'
653
+ ? (this.lastCreatedOffer ?? (await this.createOffer()))
654
+ : sessionDescription?.type === 'answer' ||
655
+ sessionDescription?.type === 'pranswer'
656
+ ? (this.lastCreatedAnswer ?? (await this.createAnswer()))
657
+ : implicitOfferState.includes(this.signalingState)
658
+ ? (this.lastCreatedOffer ?? (await this.createOffer()))
659
+ : (this.lastCreatedAnswer ?? (await this.createAnswer()))
660
+ : undefined;
661
+ sessionDescription = {
662
+ type: sessionDescription?.type ?? generatedDescription.type,
663
+ sdp: sessionDescription?.sdp && sessionDescription.sdp.length > 0
664
+ ? sessionDescription.sdp
665
+ : generatedDescription.sdp
666
+ };
667
+ if (sessionDescription.type === 'offer' &&
668
+ this.lastCreatedOffer &&
669
+ sessionDescription.sdp !== this.lastCreatedOffer.sdp) {
670
+ throw createWebRtcDomException('InvalidModificationError', 'setLocalDescription must use the latest created offer');
671
+ }
672
+ // # parse and validate description
673
+ const descriptionType = sessionDescription.type;
674
+ const descriptionSdp = sessionDescription.sdp;
675
+ const description = this.sdpManager.parseSdp({
676
+ sdp: descriptionSdp,
677
+ isLocal: true,
678
+ signalingState: this.signalingState,
679
+ type: descriptionType
680
+ });
681
+ // # update signaling state
682
+ if (description.type === 'offer') {
683
+ // この offer は作成時点までの変更を含む。answer の適用で交渉済みにする
684
+ this.pendingOfferChangeSeq =
685
+ this.lastCreatedOffer?.sdp === sessionDescription.sdp
686
+ ? this.lastCreatedOfferChangeSeq
687
+ : undefined;
688
+ this.setSignalingState('have-local-offer');
689
+ }
690
+ else if (description.type === 'answer') {
691
+ this.setSignalingState('stable');
692
+ }
693
+ else if (description.type === 'pranswer') {
694
+ this.setSignalingState('have-local-pranswer');
695
+ }
696
+ if (description.type === 'answer') {
697
+ // answer の確定で拒否予定の m-line を停止し、RTP pipeline / 遊休 transport を解放する
698
+ this.transceiverManager.commitRemoteOffer();
699
+ // port 0 で答えた m-line (aggressive の inactive など) は offerer 側で拒否として停止が確定する。
700
+ // answerer 側も同じ位置を停止確定にし、offerer が新 MID で再利用できるようにする
701
+ for (const media of description.media) {
702
+ if (!['audio', 'video'].includes(media.kind) || media.port !== 0) {
703
+ continue;
704
+ }
705
+ const transceiver = this.transceiverManager
706
+ .getTransceivers()
707
+ .find((t) => t.mid === media.rtp.muxId && !t.stopped);
708
+ transceiver?.commitStopped({ rejected: true });
709
+ }
710
+ this.closeIdleTransports();
711
+ }
712
+ // # assign MID
713
+ for (const [i, media] of enumerate(description.media)) {
714
+ const mid = media.rtp.muxId;
715
+ this.sdpManager.registerMid(mid);
716
+ if (['audio', 'video'].includes(media.kind) && media.port !== 0) {
717
+ // 停止済み、別 kind、別 MID の transceiver には割り当てない (MID の一意性を保つ)
718
+ const transceiver = this.transceiverManager
719
+ .getTransceivers()
720
+ .find((t) => t.mLineIndex === i &&
721
+ !t.stopped &&
722
+ t.kind === media.kind &&
723
+ (t.mid == null || t.mid === mid));
724
+ if (transceiver) {
725
+ transceiver.mid = mid;
726
+ if (description.type === 'offer') {
727
+ transceiver.pendingLocalOfferCodecs = [...media.rtp.codecs];
728
+ }
729
+ }
730
+ }
731
+ if (media.kind === 'application' && this.sctpTransport) {
732
+ this.sctpTransport.mid = mid;
733
+ }
734
+ }
735
+ // setup ice,dtls role
736
+ const role = description.media.find((media) => media.dtlsParams)?.dtlsParams
737
+ ?.role;
738
+ // transport ごとに、その transport を使う受け入れ済み m-line の a=setup を適用する
739
+ // (BUNDLE group 外の独立 transport は先頭 m-line と異なる role を持ちうる)
740
+ const roleOfTransport = new Map();
741
+ for (const media of description.media) {
742
+ const mid = media.rtp.muxId;
743
+ const mediaRole = media.dtlsParams?.role;
744
+ if (media.port === 0 || mid == undefined || !mediaRole) {
745
+ continue;
746
+ }
747
+ const owner = media.kind === 'application'
748
+ ? this.sctpTransport?.mid === mid
749
+ ? this.sctpTransport
750
+ : undefined
751
+ : this.transceiverManager
752
+ .getTransceivers()
753
+ .find((t) => t.mid === mid && !t.stopped);
754
+ if (owner?.dtlsTransport && !roleOfTransport.has(owner.dtlsTransport)) {
755
+ roleOfTransport.set(owner.dtlsTransport, mediaRole);
756
+ }
757
+ }
758
+ this.secureManager.setLocalRole({
759
+ type: description.type === 'offer' ? 'offer' : 'answer',
760
+ role,
761
+ roleOfTransport
762
+ });
763
+ // # configure direction
764
+ if (['answer', 'pranswer'].includes(description.type)) {
765
+ for (const media of description.media) {
766
+ const t = this.transceiverManager
767
+ .getTransceivers()
768
+ .find((t) => t.mid != undefined && t.mid === media.rtp.muxId);
769
+ if (!t || t.stopped || t.pendingRejection) {
770
+ continue;
771
+ }
772
+ const direction = t.stopping
773
+ ? 'inactive'
774
+ : andDirection(t.direction, t.offerDirection);
775
+ t.setCurrentDirection(direction);
776
+ }
777
+ }
778
+ // for trickle ice
779
+ this.sdpManager.setLocal(description, this.transceiverManager.getTransceivers(), this.sctpTransport);
780
+ await this.gatherCandidates().catch((e) => {
781
+ log('gatherCandidates failed', e);
782
+ });
783
+ // connect transports
784
+ if (description.type === 'answer') {
785
+ this.connect().catch((err) => {
786
+ log('connect failed', err);
787
+ this.secureManager.setConnectionState('failed');
788
+ });
789
+ }
790
+ this.sdpManager.setLocal(description, this.transceiverManager.getTransceivers(), this.sctpTransport);
791
+ // answerer の stop() は次の自分の offer で交渉する
792
+ const hasUnnegotiatedStop = description.type === 'answer' && this.settleStoppingTransceivers();
793
+ if (this.shouldNegotiationneeded || hasUnnegotiatedStop) {
794
+ this.scheduleNegotiationneeded();
795
+ }
796
+ this.invalidateLastCreatedDescriptions();
797
+ return description;
798
+ }
799
+ async gatherCandidates() {
800
+ await this.secureManager.gatherCandidates();
801
+ }
802
+ async addIceCandidate(candidateMessage = {}) {
803
+ if (this.isClosed) {
804
+ throw createWebRtcDomException('InvalidStateError', 'is closed');
805
+ }
806
+ if (!this.remoteDescription || !this.sdpManager._remoteDescription) {
807
+ this.pendingRemoteCandidates.push(candidateMessage);
808
+ return;
809
+ }
810
+ await this.applyRemoteIceCandidate(candidateMessage);
811
+ }
812
+ async applyRemoteIceCandidate(candidateMessage) {
813
+ const sdp = this.sdpManager._remoteDescription;
814
+ if (!sdp) {
815
+ return;
816
+ }
817
+ const appliedCandidate = await this.secureManager.addIceCandidate(sdp, candidateMessage);
818
+ const remoteDescription = this.sdpManager._remoteDescription;
819
+ if (!remoteDescription || !appliedCandidate) {
820
+ return;
821
+ }
822
+ if (appliedCandidate.kind === 'end-of-candidates') {
823
+ for (const mediaIndex of appliedCandidate.mediaIndices) {
824
+ const media = remoteDescription.media[mediaIndex];
825
+ if (media) {
826
+ media.iceCandidatesComplete = true;
827
+ }
828
+ }
829
+ return;
830
+ }
831
+ for (const mediaIndex of appliedCandidate.mediaIndices) {
832
+ const media = remoteDescription.media[mediaIndex];
833
+ if (!media) {
834
+ continue;
835
+ }
836
+ media.iceCandidates.push(appliedCandidate.candidate);
837
+ }
838
+ }
839
+ async flushPendingRemoteCandidates() {
840
+ while (this.pendingRemoteCandidates.length > 0 &&
841
+ this.remoteDescription &&
842
+ this.sdpManager._remoteDescription) {
843
+ const candidate = this.pendingRemoteCandidates.shift();
844
+ await this.applyRemoteIceCandidate(candidate ?? null);
845
+ }
846
+ }
847
+ async connect() {
848
+ log('start connect');
849
+ const res = await Promise.allSettled(this.dtlsTransports.map(async (dtlsTransport) => {
850
+ const { iceTransport } = dtlsTransport;
851
+ if (iceTransport.state === 'connected') {
852
+ return;
853
+ }
854
+ //Not negotiated yet (the transport of a transceiver added since, which the next offer bundles): the
855
+ //negotiation giving it its remote parameters connects it
856
+ if (!iceTransport.connection.remoteUsername || !iceTransport.connection.remotePassword) {
857
+ return;
858
+ }
859
+ const checkDtlsConnected = () => dtlsTransport.state === 'connected';
860
+ if (checkDtlsConnected()) {
861
+ //After an ICE restart (new credentials, no pair nominated), DTLS is still connected: ICE checks
862
+ //again, and the records go over the pair it nominates
863
+ if (!iceTransport.connection.nominated) {
864
+ await iceTransport.start().catch((err) => {
865
+ log('iceTransport.start failed', err);
866
+ throw err;
867
+ });
868
+ }
869
+ return;
870
+ }
871
+ this.secureManager.setConnectionState('connecting');
872
+ await iceTransport.start().catch((err) => {
873
+ log('iceTransport.start failed', err);
874
+ throw err;
875
+ });
876
+ if (checkDtlsConnected()) {
877
+ return;
878
+ }
879
+ await dtlsTransport.start().catch((err) => {
880
+ log('dtlsTransport.start failed', err);
881
+ throw err;
882
+ });
883
+ if (this.sctpTransport &&
884
+ this.sctpTransport.dtlsTransport.id === dtlsTransport.id) {
885
+ await this.sctpManager.connectSctp();
886
+ }
887
+ }));
888
+ if (res.find((r) => r.status === 'rejected')) {
889
+ this.secureManager.setConnectionState('failed');
890
+ }
891
+ else {
892
+ this.secureManager.setConnectionState('connected');
893
+ }
894
+ }
895
+ restartIce() {
896
+ this.needRestart = true;
897
+ this.needNegotiation();
898
+ }
899
+ async setRemoteDescription(sessionDescription) {
900
+ if (sessionDescription instanceof SessionDescription) {
901
+ sessionDescription = sessionDescription.toSdp();
902
+ }
903
+ await this.waitForPendingDescriptionTask();
904
+ //An offer of the other side while this side offers: this side's offer is rolled back first, the offer of the
905
+ //other side then associated with the transceivers as they were before it
906
+ const needsImplicitLocalRollback = sessionDescription.type === 'offer' &&
907
+ ['have-local-offer', 'have-local-pranswer'].includes(this.signalingState);
908
+ if (needsImplicitLocalRollback) {
909
+ this.sdpManager.rollbackLocalDescription(this.signalingState);
910
+ this.rollbackLocalOffer();
911
+ for (const transceiver of this.transceiverManager.getTransceivers()) {
912
+ transceiver.pendingLocalOfferCodecs = undefined;
913
+ }
914
+ this.pendingOfferChangeSeq = undefined;
915
+ this.shouldNegotiationneeded = true;
916
+ this.setSignalingState('stable');
917
+ await Promise.resolve();
918
+ }
919
+ let codecPlan = new Map();
920
+ if (sessionDescription.type &&
921
+ sessionDescription.type !== 'rollback' &&
922
+ sessionDescription.sdp) {
923
+ const preview = this.sdpManager.parseSdp({
924
+ sdp: sessionDescription.sdp,
925
+ isLocal: false,
926
+ signalingState: this.signalingState,
927
+ type: sessionDescription.type
928
+ });
929
+ // 本適用と同じ対応付けで全 m-line の codec を副作用なしに解決する
930
+ const planned = new Set();
931
+ codecPlan = this.transceiverManager.planRemoteRtpCodecs(preview, (remoteMedia, index) => {
932
+ const transceiver = this.findTransceiverForRemoteMedia(remoteMedia, index, planned, sessionDescription.type === 'offer');
933
+ if (transceiver)
934
+ planned.add(transceiver);
935
+ return transceiver;
936
+ });
937
+ }
938
+ // # parse and validate description
939
+ this.assertAnswerKeepsSharedTransports(sessionDescription);
940
+ const remoteSdp = this.sdpManager.setRemoteDescription(sessionDescription, this.signalingState);
941
+ if (!remoteSdp) {
942
+ // 非対応 re-offer などの rollback では元の transceiver 対応を復元する
943
+ const transportsBeforeRollback = this.transceiverManager
944
+ .getTransceivers()
945
+ .map((t) => t.dtlsTransport);
946
+ this.transceiverManager.rollbackRemoteOffer();
947
+ this.closeIdleTransports(transportsBeforeRollback);
948
+ this.setSignalingState('stable');
949
+ if (this.shouldNegotiationneeded) {
950
+ this.scheduleNegotiationneeded();
951
+ }
952
+ this.invalidateLastCreatedDescriptions();
953
+ return;
954
+ }
955
+ if (remoteSdp.type === 'offer') {
956
+ this.transceiverManager.beginRemoteOffer();
957
+ }
958
+ // # apply description
959
+ const bundleGroups = this.config.bundlePolicy === 'disable'
960
+ ? []
961
+ : remoteSdp.group.filter((group) => group.semantic === 'BUNDLE');
962
+ const groupOfMid = (mid) => mid == undefined
963
+ ? undefined
964
+ : bundleGroups.find((group) => group.items.includes(mid));
965
+ // ## associate m-lines with transceivers / sctp
966
+ const associated = new Set();
967
+ const entries = remoteSdp.media.map((remoteMedia, index) => {
968
+ if (['audio', 'video'].includes(remoteMedia.kind)) {
969
+ let transceiver = this.findTransceiverForRemoteMedia(remoteMedia, index, associated, remoteSdp.type === 'offer');
970
+ if (!transceiver) {
971
+ if (remoteMedia.port === 0) {
972
+ // 未知の MID の拒否済み m-line には transceiver を関連付けない
973
+ return { remoteMedia, index };
974
+ }
975
+ transceiver = this.addRemoteTransceiver(remoteMedia, index);
976
+ }
977
+ else if (transceiver.mid == null) {
978
+ this.transceiverManager.associateMLine(transceiver, index);
979
+ }
980
+ associated.add(transceiver);
981
+ return { remoteMedia, index, transceiver };
982
+ }
983
+ else if (remoteMedia.kind === 'application') {
984
+ let sctpTransport = this.sctpTransport;
985
+ if (!sctpTransport) {
986
+ sctpTransport = this.createSctpTransport();
987
+ sctpTransport.mid = remoteMedia.rtp.muxId;
988
+ }
989
+ return { remoteMedia, index, sctpTransport };
990
+ }
991
+ else {
992
+ throw new Error('invalid media kind');
993
+ }
994
+ });
995
+ if (remoteSdp.type === 'offer') {
996
+ this.transceiverManager.releaseUnassociatedReservations(associated, remoteSdp.media.length);
997
+ }
998
+ const ownerOf = (entry) => entry.transceiver ?? entry.sctpTransport;
999
+ // ## transport ownership
1000
+ // remote offer の所有関係は bundlePolicy によらず offer の BUNDLE group だけで決まる
1001
+ // (max-bundle は自分の offer にだけ効く)。group ごとに 1 つの transport を共有し、
1002
+ // 異なる group や group 外の m-line とは共有しない。
1003
+ // remote answer では offer で渡した ICE credentials を保つため transport を作り直さない
1004
+ // (共有 transport を分割する answer は assertAnswerKeepsSharedTransports で事前に拒否済み)
1005
+ const isRemoteOffer = remoteSdp.type === 'offer';
1006
+ const liveTransport = (transport) => !!transport && transport.state !== 'closed';
1007
+ const groupTransports = new Map();
1008
+ const claimed = new Set();
1009
+ for (const group of bundleGroups) {
1010
+ const members = entries.filter((entry) => !!ownerOf(entry) &&
1011
+ group.items.includes(entry.remoteMedia.rtp.muxId));
1012
+ if (members.length === 0) {
1013
+ continue;
1014
+ }
1015
+ // 既存 member の transport を優先し、他の group が使っていれば新しい transport を作る
1016
+ let shared = members
1017
+ .map((entry) => ownerOf(entry).dtlsTransport)
1018
+ .find((transport) => liveTransport(transport) &&
1019
+ (!isRemoteOffer || !claimed.has(transport)));
1020
+ if (!shared) {
1021
+ shared = this.createDtlsTransport({ inheritCredentials: false });
1022
+ }
1023
+ groupTransports.set(group, shared);
1024
+ claimed.add(shared);
1025
+ for (const entry of members) {
1026
+ const owner = ownerOf(entry);
1027
+ if (owner.dtlsTransport !== shared) {
1028
+ owner.setDtlsTransport(shared);
1029
+ }
1030
+ }
1031
+ }
1032
+ if (isRemoteOffer) {
1033
+ // group 外 (group のない offer を含む) で受け入れた m-line は独立した transport / ICE credentials を持つ
1034
+ for (const entry of entries) {
1035
+ const owner = ownerOf(entry);
1036
+ if (!owner ||
1037
+ entry.remoteMedia.port === 0 ||
1038
+ groupOfMid(entry.remoteMedia.rtp.muxId)) {
1039
+ continue;
1040
+ }
1041
+ if (!liveTransport(owner.dtlsTransport) ||
1042
+ claimed.has(owner.dtlsTransport)) {
1043
+ owner.setDtlsTransport(this.createDtlsTransport({ inheritCredentials: false }));
1044
+ }
1045
+ claimed.add(owner.dtlsTransport);
1046
+ }
1047
+ }
1048
+ // ## apply RTP / SCTP (受け入れ判定)
1049
+ const acceptedEntries = new Set();
1050
+ for (const entry of entries) {
1051
+ const { remoteMedia, index } = entry;
1052
+ if (entry.transceiver) {
1053
+ if (this.transceiverManager.setRemoteRTP(entry.transceiver, remoteMedia, remoteSdp.type, index, codecPlan.get(index) ?? [])) {
1054
+ acceptedEntries.add(entry);
1055
+ }
1056
+ }
1057
+ else if (entry.sctpTransport) {
1058
+ this.sctpManager.setRemoteSCTP(remoteMedia, index);
1059
+ acceptedEntries.add(entry);
1060
+ }
1061
+ }
1062
+ // ICE / DTLS パラメータは group で最初に受け入れた member (tag) から適用する
1063
+ // (codec 不一致で拒否した member のパラメータは使わない)
1064
+ const groupParamSources = new Map();
1065
+ for (const group of bundleGroups) {
1066
+ for (const mid of group.items) {
1067
+ const entry = entries.find((e) => e.remoteMedia.rtp.muxId === mid &&
1068
+ e.remoteMedia.port !== 0 &&
1069
+ acceptedEntries.has(e));
1070
+ if (entry) {
1071
+ groupParamSources.set(group, entry);
1072
+ break;
1073
+ }
1074
+ }
1075
+ }
1076
+ // ## apply transport parameters
1077
+ for (const entry of entries) {
1078
+ const { remoteMedia } = entry;
1079
+ const owner = ownerOf(entry);
1080
+ if (!owner) {
1081
+ continue;
1082
+ }
1083
+ const accepted = acceptedEntries.has(entry);
1084
+ const dtlsTransport = owner.dtlsTransport;
1085
+ const group = groupOfMid(remoteMedia.rtp.muxId);
1086
+ if (remoteMedia.port === 0 ||
1087
+ !dtlsTransport ||
1088
+ dtlsTransport.state === 'closed' ||
1089
+ // group 外の拒否 section の transport は使わない
1090
+ (!accepted && !group)) {
1091
+ continue;
1092
+ }
1093
+ const iceTransport = dtlsTransport.iceTransport;
1094
+ const ownsTransportParams = !group || groupParamSources.get(group) === entry;
1095
+ if (ownsTransportParams) {
1096
+ if (remoteMedia.iceParams) {
1097
+ const renomination = !!this.sdpManager.inactiveRemoteMedia;
1098
+ iceTransport.setRemoteParams(remoteMedia.iceParams, renomination);
1099
+ // One agent full, one lite: The full agent MUST take the controlling role, and the lite agent MUST take the controlled role
1100
+ // RFC 8445 S6.1.1
1101
+ if (remoteMedia.iceParams.iceLite &&
1102
+ !iceTransport.connection.iceLite) {
1103
+ iceTransport.connection.iceControlling = true;
1104
+ }
1105
+ }
1106
+ if (remoteMedia.dtlsParams) {
1107
+ dtlsTransport.setRemoteParams(remoteMedia.dtlsParams);
1108
+ }
1109
+ }
1110
+ // # add ICE candidates
1111
+ for (const candidate of remoteMedia.iceCandidates) {
1112
+ iceTransport.addRemoteCandidate(candidate).catch((error) => log('add candidate failed', error));
1113
+ }
1114
+ if (remoteMedia.iceCandidatesComplete) {
1115
+ iceTransport.addRemoteCandidate(undefined).catch((error) => log('end of candidates failed', error));
1116
+ }
1117
+ // # set DTLS role
1118
+ if (remoteSdp.type === 'answer' && remoteMedia.dtlsParams?.role) {
1119
+ dtlsTransport.role =
1120
+ remoteMedia.dtlsParams.role === 'client' ? 'server' : 'client';
1121
+ }
1122
+ }
1123
+ if (remoteSdp.type === 'answer') {
1124
+ // answer に含まれない既存 m-line は remote 起因の停止として確定する
1125
+ for (const transceiver of this.transceiverManager.getTransceivers()) {
1126
+ if (!associated.has(transceiver) &&
1127
+ transceiver.mid != undefined &&
1128
+ !transceiver.stopped) {
1129
+ transceiver.commitStopped({ rejected: true });
1130
+ }
1131
+ }
1132
+ this.closeIdleTransports();
1133
+ }
1134
+ if (remoteSdp.type === 'offer') {
1135
+ this.setSignalingState('have-remote-offer');
1136
+ }
1137
+ else if (remoteSdp.type === 'answer') {
1138
+ this.setSignalingState('stable');
1139
+ }
1140
+ else if (remoteSdp.type === 'pranswer') {
1141
+ this.setSignalingState('have-remote-pranswer');
1142
+ }
1143
+ await this.flushPendingRemoteCandidates();
1144
+ // connect transports
1145
+ if (remoteSdp.type === 'answer') {
1146
+ log('caller start connect');
1147
+ this.connect().catch((err) => {
1148
+ log('connect failed', err);
1149
+ this.secureManager.setConnectionState('failed');
1150
+ });
1151
+ }
1152
+ this.negotiationneeded = false;
1153
+ if (remoteSdp.type === 'answer' &&
1154
+ this.pendingOfferChangeSeq != undefined) {
1155
+ this.negotiatedChangeSeq = Math.max(this.negotiatedChangeSeq, this.pendingOfferChangeSeq);
1156
+ this.pendingOfferChangeSeq = undefined;
1157
+ }
1158
+ const hasUnnegotiatedStop = remoteSdp.type === 'answer' && this.settleStoppingTransceivers();
1159
+ if (this.shouldNegotiationneeded || hasUnnegotiatedStop) {
1160
+ this.scheduleNegotiationneeded();
1161
+ }
1162
+ this.invalidateLastCreatedDescriptions();
1163
+ }
1164
+ /**
1165
+ * remote answer / pranswer の検証 (offerer 側、状態を変更する前に実行する)。
1166
+ * local offer で 1 つの transport を共有した m-line を、answer が同じ BUNDLE group に置かずに
1167
+ * 異なる ICE credentials で受け入れることはできない (RFC 8843 7.3.2)。共有 transport は分割できず、
1168
+ * 新しい transport を作ると offer で渡した ICE credentials とも一致しなくなる。
1169
+ * group の記述が MID と一致しなくても remote の ICE credentials が同じなら、同じ transport のまま扱う。
1170
+ */
1171
+ assertAnswerKeepsSharedTransports(sessionDescription) {
1172
+ if (!['answer', 'pranswer'].includes(sessionDescription.type ?? '') ||
1173
+ !['have-local-offer', 'have-local-pranswer'].includes(this.signalingState) ||
1174
+ !sessionDescription.sdp ||
1175
+ this.config.bundlePolicy === 'disable') {
1176
+ return;
1177
+ }
1178
+ const answer = SessionDescription.parse(sessionDescription.sdp);
1179
+ const answerGroups = answer.group.filter((g) => g.semantic === 'BUNDLE');
1180
+ const byTransport = new Map();
1181
+ for (const media of answer.media) {
1182
+ const mid = media.rtp.muxId;
1183
+ if (media.port === 0 || mid == undefined) {
1184
+ continue;
1185
+ }
1186
+ const owner = media.kind === 'application'
1187
+ ? this.sctpTransport?.mid === mid
1188
+ ? this.sctpTransport
1189
+ : undefined
1190
+ : this.transceiverManager
1191
+ .getTransceivers()
1192
+ .find((t) => t.mid === mid && !t.stopped);
1193
+ const transport = owner?.dtlsTransport;
1194
+ if (!transport) {
1195
+ continue;
1196
+ }
1197
+ const current = {
1198
+ group: answerGroups.find((g) => g.items.includes(mid)),
1199
+ credentials: `${media.iceParams?.usernameFragment}:${media.iceParams?.password}`
1200
+ };
1201
+ const first = byTransport.get(transport);
1202
+ if (!first) {
1203
+ byTransport.set(transport, current);
1204
+ continue;
1205
+ }
1206
+ const sameGroup = !!current.group && current.group === first.group;
1207
+ if (!sameGroup && current.credentials !== first.credentials) {
1208
+ throw createWebRtcDomException('InvalidAccessError', `mid=${mid} shares a transport in the local offer but the remote ${sessionDescription.type} moves it out of that BUNDLE group`);
1209
+ }
1210
+ }
1211
+ }
1212
+ /**
1213
+ * remote m-line に対応する transceiver を探す。MID の一致を優先し、
1214
+ * 未関連付け transceiver は同じ offer 内で異なる m-line に割り当てる。
1215
+ */
1216
+ findTransceiverForRemoteMedia(remoteMedia, index, associated, offer) {
1217
+ const candidates = this.transceiverManager
1218
+ .getTransceivers()
1219
+ .filter((t) => !associated.has(t) && t.kind === remoteMedia.kind);
1220
+ const mid = remoteMedia.rtp.muxId;
1221
+ const byMid = mid != undefined ? candidates.find((t) => t.mid === mid) : undefined;
1222
+ if (byMid) {
1223
+ return byMid;
1224
+ }
1225
+ if (remoteMedia.port === 0) {
1226
+ return;
1227
+ }
1228
+ //A media of an offer asking to receive takes a transceiver of addTrack, never one of addTransceiver (it sends
1229
+ //something else: RFC 8829 5.10)
1230
+ const unassociated = candidates.filter((t) => t.mid == null &&
1231
+ !t.stopping &&
1232
+ !t.stopped &&
1233
+ (!offer ||
1234
+ (t.addedByAddTrack &&
1235
+ ['sendrecv', 'recvonly'].includes(remoteMedia.direction ?? 'sendrecv'))));
1236
+ return unassociated.find((t) => t.mLineIndex === index) ?? unassociated[0];
1237
+ }
1238
+ /**
1239
+ * remote offer / answer の m-line 用に transceiver を作る。
1240
+ * 同じ位置に停止済みの旧 transceiver があれば、それを復活させず新しい receiver/router で置き換える。
1241
+ */
1242
+ addRemoteTransceiver(remoteMedia, index) {
1243
+ const dtlsTransport = this.findOrCreateTransport();
1244
+ const transceiver = this.transceiverManager.addTransceiver(remoteMedia.kind, dtlsTransport, { direction: 'recvonly' }, { remoteMLineIndex: index });
1245
+ transceiver.mid = remoteMedia.rtp.muxId ?? null;
1246
+ this.secureManager.updateIceConnectionState();
1247
+ this.onRemoteTransceiverAdded.execute(transceiver);
1248
+ return transceiver;
1249
+ }
1250
+ addTransceiver(trackOrKind, options = {}) {
1251
+ const dtlsTransport = this.findOrCreateTransport();
1252
+ const transceiver = this.transceiverManager.addTransceiver(trackOrKind, dtlsTransport, options);
1253
+ this.secureManager.updateIceConnectionState();
1254
+ this.needNegotiation();
1255
+ return transceiver;
1256
+ }
1257
+ // todo fix
1258
+ addTrack(track, ...streams) {
1259
+ return this.addTrackOn(undefined, track, ...streams);
1260
+ }
1261
+ /**
1262
+ * Whether addTrack may give a track of its kind to a transceiver, rather than adding one
1263
+ * @param transceiver
1264
+ */
1265
+ reusableForTrack(transceiver) {
1266
+ return this.transceiverManager.reusableForTrack(transceiver, transceiver.kind);
1267
+ }
1268
+ /**
1269
+ * addTrack, on the transceiver chosen already (by the main thread, for a connection served in a worker thread) if
1270
+ * it may still take the track, else on a new one, as for null
1271
+ * @param chosen
1272
+ * @param track
1273
+ * @param streams
1274
+ */
1275
+ addTrackOn(chosen, track, ...streams) {
1276
+ if (this.isClosed) {
1277
+ throw createWebRtcDomException('InvalidStateError', 'is closed');
1278
+ }
1279
+ const transceiver = this.transceiverManager.addTrack(track, streams, chosen);
1280
+ if (!transceiver.dtlsTransport) {
1281
+ const dtlsTransport = this.findOrCreateTransport();
1282
+ transceiver.setDtlsTransport(dtlsTransport);
1283
+ }
1284
+ this.needNegotiation();
1285
+ return transceiver.sender;
1286
+ }
1287
+ async createAnswer() {
1288
+ this.assertNotClosed();
1289
+ await this.secureManager.ensureCerts();
1290
+ // setCodecPreferences() で無効化された transceiver を再解決する。
1291
+ // offer 側と異なり answer は remote offer との交渉結果を使い、
1292
+ // sender/receiver の codec 状態も新しい negotiated codec に同期する。
1293
+ for (const transceiver of this.transceiverManager.getTransceivers()) {
1294
+ if (transceiver.codecs.length !== 0 &&
1295
+ !transceiver.codecPreferencesNeedResolution) {
1296
+ continue;
1297
+ }
1298
+ // 拒否予定 / 停止済みの m-line は port 0 で answer するため codec を解決しない
1299
+ if (transceiver.pendingRejection ||
1300
+ transceiver.stopping ||
1301
+ transceiver.stopped) {
1302
+ continue;
1303
+ }
1304
+ const remoteDescription = this.sdpManager._remoteDescription;
1305
+ const remoteMedia = remoteDescription?.media.find((media) => media.rtp.muxId != undefined &&
1306
+ media.rtp.muxId === transceiver.mid &&
1307
+ media.kind === transceiver.kind) ??
1308
+ (transceiver.mLineIndex != undefined
1309
+ ? remoteDescription?.media[transceiver.mLineIndex]
1310
+ : undefined);
1311
+ if (remoteMedia && ['audio', 'video'].includes(remoteMedia.kind)) {
1312
+ this.transceiverManager.resyncAnswerCodecs(transceiver, remoteMedia);
1313
+ }
1314
+ else {
1315
+ this.transceiverManager.assignTransceiverCodecs(transceiver);
1316
+ }
1317
+ if (transceiver.headerExtensions.length === 0) {
1318
+ transceiver.headerExtensions = this.headerExtensionsFor(transceiver.kind);
1319
+ }
1320
+ }
1321
+ const description = this.sdpManager.buildAnswerSdp({
1322
+ transceivers: this.transceiverManager.getTransceivers(),
1323
+ sctpTransport: this.sctpTransport,
1324
+ signalingState: this.signalingState
1325
+ });
1326
+ const createdAnswer = description.toJSON();
1327
+ this.lastCreatedAnswer = createdAnswer;
1328
+ return createdAnswer;
1329
+ }
1330
+ assertNotClosed() {
1331
+ if (this.isClosed) {
1332
+ throw createWebRtcDomException('InvalidStateError', 'RTCPeerConnection is closed');
1333
+ }
1334
+ }
1335
+ /**
1336
+ * The signaling state is stable: the associations of the transceivers and of the data channels are kept, for a
1337
+ * rollback of the next local offer
1338
+ */
1339
+ markStable() {
1340
+ this.transceiverManager.markStable();
1341
+ const sctp = this.sctpTransport;
1342
+ this.stableSctp = sctp ? { mid: sctp.mid, mLineIndex: sctp.mLineIndex } : undefined;
1343
+ }
1344
+ /**
1345
+ * A local offer is rolled back: the transceivers and the data channels are associated as before it
1346
+ */
1347
+ rollbackLocalOffer() {
1348
+ this.transceiverManager.rollbackLocalOffer();
1349
+ const sctp = this.sctpTransport;
1350
+ if (sctp) {
1351
+ sctp.mid = this.stableSctp?.mid;
1352
+ sctp.mLineIndex = this.stableSctp?.mLineIndex;
1353
+ }
1354
+ }
1355
+ setSignalingState(state) {
1356
+ if (this.signalingState === state) {
1357
+ return;
1358
+ }
1359
+ log('signalingStateChange', state);
1360
+ this.signalingState = state;
1361
+ if (state === 'stable')
1362
+ this.markStable();
1363
+ this.signalingStateChange.execute(state);
1364
+ if (this.onsignalingstatechange) {
1365
+ runDetached(() => this.onsignalingstatechange(new globalThis.Event('signalingstatechange')), (error) => log('event handler failed', error));
1366
+ }
1367
+ this.emit('signalingstatechange');
1368
+ }
1369
+ createPeerConnectionStats(timestamp) {
1370
+ return {
1371
+ type: 'peer-connection',
1372
+ id: generateStatsId('peer-connection', this.id),
1373
+ timestamp,
1374
+ dataChannelsOpened: this.sctpManager.dataChannelsOpened,
1375
+ dataChannelsClosed: this.sctpManager.dataChannelsClosed
1376
+ };
1377
+ }
1378
+ async getStats(selector) {
1379
+ const timestamp = getStatsTimestamp();
1380
+ const stats = [];
1381
+ if (!selector) {
1382
+ stats.push(this.createPeerConnectionStats(timestamp));
1383
+ }
1384
+ stats.push(...this.transceiverManager.collectStats(timestamp));
1385
+ const transportStats = await this.secureManager.getStats(timestamp);
1386
+ stats.push(...transportStats);
1387
+ if (!selector && this.sctpTransport) {
1388
+ const dataChannelStats = await this.sctpManager.getStats(timestamp);
1389
+ if (dataChannelStats) {
1390
+ stats.push(...dataChannelStats);
1391
+ }
1392
+ }
1393
+ if (!selector) {
1394
+ return buildStatsReport(stats);
1395
+ }
1396
+ return buildStatsReport(stats, this.transceiverManager.getStatsRootIds(selector));
1397
+ }
1398
+ async close() {
1399
+ if (this.isClosed)
1400
+ return;
1401
+ this.isClosed = true;
1402
+ this.pendingRemoteCandidates.length = 0;
1403
+ this.setSignalingState('closed');
1404
+ this.transceiverManager.close();
1405
+ // SCTP ABORT は DTLS/ICE が生きている間に送る(close は abrupt であり SHUTDOWN ではない)
1406
+ await this.sctpManager.close();
1407
+ await this.secureManager.close();
1408
+ // 公開 Event を完了させ、購読者・クロージャが PeerConnection を保持し続けないようにする
1409
+ this.completePeerEvents();
1410
+ log('peerConnection closed');
1411
+ }
1412
+ completePeerEvents() {
1413
+ const events = [
1414
+ this.onDataChannel,
1415
+ this.iceGatheringStateChange,
1416
+ this.iceConnectionStateChange,
1417
+ this.signalingStateChange,
1418
+ this.connectionStateChange,
1419
+ this.onTransceiverAdded,
1420
+ this.onRemoteTransceiverAdded,
1421
+ this.onIceCandidate,
1422
+ this.onNegotiationneeded
1423
+ ];
1424
+ for (const event of events) {
1425
+ if (!event.ended) {
1426
+ event.complete();
1427
+ }
1428
+ }
1429
+ }
1430
+ }
1431
+ const MLineReuseModes = ['compatible', 'aggressive'];
1432
+ export const findCodecByMimeType = (codecs, target) => codecs.find((localCodec) => localCodec.mimeType.toLowerCase() === target.mimeType.toLowerCase())
1433
+ ? target
1434
+ : undefined;
1435
+ function assignDynamicPayloadTypes(config) {
1436
+ for (const [i, codecParams] of enumerate([
1437
+ ...(config.codecs.audio || []),
1438
+ ...(config.codecs.video || [])
1439
+ ])) {
1440
+ if (codecParams.payloadType != undefined) {
1441
+ continue;
1442
+ }
1443
+ codecParams.payloadType = 96 + i;
1444
+ switch (codecParams.name.toLowerCase()) {
1445
+ case 'rtx':
1446
+ {
1447
+ codecParams.parameters = `apt=${codecParams.payloadType - 1}`;
1448
+ }
1449
+ break;
1450
+ case 'red':
1451
+ {
1452
+ if (codecParams.contentType === 'audio') {
1453
+ const redundant = codecParams.payloadType + 1;
1454
+ codecParams.parameters = `${redundant}/${redundant}`;
1455
+ codecParams.payloadType = 63;
1456
+ }
1457
+ }
1458
+ break;
1459
+ }
1460
+ }
1461
+ }
1462
+ function generateDefaultPeerConfig() {
1463
+ return {
1464
+ codecs: defaultCodecs(),
1465
+ headerExtensions: {
1466
+ audio: [],
1467
+ video: []
1468
+ },
1469
+ iceTransportPolicy: 'all',
1470
+ iceLite: false,
1471
+ iceServers: [],
1472
+ icePortRange: undefined,
1473
+ iceInterfaceAddresses: undefined,
1474
+ iceAdditionalHostAddresses: undefined,
1475
+ iceUseIpv4: true,
1476
+ iceUseIpv6: true,
1477
+ iceUseTcp: false,
1478
+ iceTcpPassive: true,
1479
+ iceStunGatherTimeout: undefined,
1480
+ iceTurnConnectTimeout: undefined,
1481
+ turnTransport: undefined,
1482
+ turnTlsOptions: undefined,
1483
+ turnUdpFamily: undefined,
1484
+ iceFilterStunResponse: undefined,
1485
+ iceFilterCandidatePair: undefined,
1486
+ icePasswordPrefix: undefined,
1487
+ iceUseLinkLocalAddress: undefined,
1488
+ dtls: {},
1489
+ bundlePolicy: 'max-compat',
1490
+ rtcpMuxPolicy: 'require',
1491
+ iceCandidatePoolSize: 0,
1492
+ certificates: [],
1493
+ debug: {},
1494
+ midSuffix: false,
1495
+ forceTurnTCP: false,
1496
+ maxMessageSize: DEFAULT_MAX_MESSAGE_SIZE,
1497
+ sctp: { mtu: DEFAULT_SCTP_MTU },
1498
+ pendingRtp: false,
1499
+ mLineReuse: 'compatible'
1500
+ };
1501
+ }
1502
+ export const defaultPeerConfig = generateDefaultPeerConfig();
1503
+ function normalizePeerConfiguration(config) {
1504
+ const input = Object(config ?? {});
1505
+ const normalizedConfig = { ...input };
1506
+ if (input.sctp !== undefined) {
1507
+ normalizedConfig.sctp = { ...input.sctp };
1508
+ }
1509
+ if (input.bundlePolicy === 'balanced') {
1510
+ normalizedConfig.bundlePolicy = 'max-compat';
1511
+ }
1512
+ if ('certificates' in input) {
1513
+ if (input.certificates === undefined) {
1514
+ normalizedConfig.certificates = undefined;
1515
+ }
1516
+ else if (!Array.isArray(input.certificates) ||
1517
+ input.certificates.some((certificate) => certificate == null)) {
1518
+ throw createWebRtcTypeError('certificates must be an array of RTCCertificate');
1519
+ }
1520
+ else {
1521
+ normalizedConfig.certificates = [...input.certificates];
1522
+ }
1523
+ }
1524
+ if ('iceCandidatePoolSize' in input) {
1525
+ normalizedConfig.iceCandidatePoolSize = coerceUnsignedShort(input.iceCandidatePoolSize, 'iceCandidatePoolSize');
1526
+ }
1527
+ return normalizedConfig;
1528
+ }
1529
+ function coerceUnsignedShort(value, name) {
1530
+ const coerced = Number(value);
1531
+ if (!Number.isFinite(coerced) ||
1532
+ !Number.isInteger(coerced) ||
1533
+ coerced < 0 ||
1534
+ coerced > 65535) {
1535
+ throw createWebRtcTypeError(`${name} must be an unsigned short`);
1536
+ }
1537
+ return coerced;
1538
+ }
1539
+ function hasSameCertificates(left, right) {
1540
+ return (left.length === right.length &&
1541
+ left.every((certificate, index) => certificate === right[index]));
1542
+ }
1543
+ function clonePeerConfiguration(config) {
1544
+ return {
1545
+ ...config,
1546
+ codecs: {
1547
+ audio: config.codecs.audio ? [...config.codecs.audio] : undefined,
1548
+ video: config.codecs.video ? [...config.codecs.video] : undefined
1549
+ },
1550
+ headerExtensions: {
1551
+ audio: config.headerExtensions.audio
1552
+ ? [...config.headerExtensions.audio]
1553
+ : undefined,
1554
+ video: config.headerExtensions.video
1555
+ ? [...config.headerExtensions.video]
1556
+ : undefined
1557
+ },
1558
+ iceServers: config.iceServers.map((server) => ({
1559
+ ...server,
1560
+ urls: Array.isArray(server.urls) ? [...server.urls] : server.urls
1561
+ })),
1562
+ icePortRange: config.icePortRange
1563
+ ? [...config.icePortRange]
1564
+ : undefined,
1565
+ iceAdditionalHostAddresses: config.iceAdditionalHostAddresses
1566
+ ? [...config.iceAdditionalHostAddresses]
1567
+ : undefined,
1568
+ dtls: { ...config.dtls },
1569
+ certificates: [...config.certificates],
1570
+ debug: { ...config.debug },
1571
+ sctp: { ...config.sctp },
1572
+ pendingRtp: typeof config.pendingRtp === 'object' && config.pendingRtp != undefined
1573
+ ? { ...config.pendingRtp }
1574
+ : config.pendingRtp
1575
+ };
1576
+ }
1577
+ export class RTCTrackEvent {
1578
+ constructor(init) {
1579
+ this.type = 'track';
1580
+ this.track = init.track;
1581
+ this.streams = [...init.streams];
1582
+ this.transceiver = init.transceiver;
1583
+ this.receiver = init.receiver;
1584
+ }
1585
+ }