werift 0.18.13 → 0.18.15

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 (252) hide show
  1. package/lib/common/src/binary.js.map +1 -1
  2. package/lib/common/src/index.d.ts +0 -1
  3. package/lib/common/src/index.js +0 -1
  4. package/lib/common/src/index.js.map +1 -1
  5. package/lib/dtls/src/client.js.map +1 -1
  6. package/lib/dtls/src/context/cipher.js +1 -1
  7. package/lib/dtls/src/context/cipher.js.map +1 -1
  8. package/lib/dtls/src/context/dtls.js.map +1 -1
  9. package/lib/dtls/src/context/transport.js.map +1 -1
  10. package/lib/dtls/src/flight/client/flight1.js.map +1 -1
  11. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  12. package/lib/dtls/src/flight/flight.js +1 -1
  13. package/lib/dtls/src/flight/flight.js.map +1 -1
  14. package/lib/dtls/src/flight/server/flight4.js.map +1 -1
  15. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  16. package/lib/dtls/src/handshake/extensions/ellipticCurves.js +1 -1
  17. package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
  18. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +1 -1
  19. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
  20. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +1 -1
  21. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
  22. package/lib/dtls/src/handshake/extensions/signature.js +1 -1
  23. package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
  24. package/lib/dtls/src/handshake/extensions/useSrtp.js +1 -1
  25. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  26. package/lib/dtls/src/handshake/message/alert.js +1 -1
  27. package/lib/dtls/src/handshake/message/alert.js.map +1 -1
  28. package/lib/dtls/src/handshake/message/certificate.js +1 -1
  29. package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
  30. package/lib/dtls/src/handshake/message/changeCipherSpec.js +1 -1
  31. package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
  32. package/lib/dtls/src/handshake/message/client/certificateVerify.js +1 -1
  33. package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
  34. package/lib/dtls/src/handshake/message/client/hello.js +1 -1
  35. package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
  36. package/lib/dtls/src/handshake/message/client/keyExchange.js +1 -1
  37. package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
  38. package/lib/dtls/src/handshake/message/finished.js.map +1 -1
  39. package/lib/dtls/src/handshake/message/server/certificateRequest.js +1 -1
  40. package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
  41. package/lib/dtls/src/handshake/message/server/hello.js +1 -1
  42. package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
  43. package/lib/dtls/src/handshake/message/server/helloDone.js +1 -1
  44. package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
  45. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +1 -1
  46. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
  47. package/lib/dtls/src/handshake/message/server/keyExchange.js +1 -1
  48. package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
  49. package/lib/dtls/src/handshake/random.js +1 -1
  50. package/lib/dtls/src/handshake/random.js.map +1 -1
  51. package/lib/dtls/src/record/message/fragment.js +1 -1
  52. package/lib/dtls/src/record/message/fragment.js.map +1 -1
  53. package/lib/dtls/src/record/message/header.js +2 -2
  54. package/lib/dtls/src/record/message/header.js.map +1 -1
  55. package/lib/dtls/src/record/message/plaintext.js +1 -1
  56. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  57. package/lib/dtls/src/server.js.map +1 -1
  58. package/lib/dtls/src/socket.js.map +1 -1
  59. package/lib/dtls/src/transport.js.map +1 -1
  60. package/lib/ice/src/candidate.js.map +1 -1
  61. package/lib/ice/src/exceptions.js.map +1 -1
  62. package/lib/ice/src/helper.js.map +1 -1
  63. package/lib/ice/src/ice.js.map +1 -1
  64. package/lib/ice/src/stun/attributes.js.map +1 -1
  65. package/lib/ice/src/stun/message.js.map +1 -1
  66. package/lib/ice/src/stun/protocol.js.map +1 -1
  67. package/lib/ice/src/stun/transaction.js.map +1 -1
  68. package/lib/ice/src/transport.js.map +1 -1
  69. package/lib/ice/src/turn/protocol.js.map +1 -1
  70. package/lib/rtp/src/codec/av1.js +1 -1
  71. package/lib/rtp/src/codec/av1.js.map +1 -1
  72. package/lib/rtp/src/container/index.d.ts +2 -1
  73. package/lib/rtp/src/container/index.js +2 -1
  74. package/lib/rtp/src/container/index.js.map +1 -1
  75. package/lib/rtp/src/container/mp4/container.d.ts +66 -0
  76. package/lib/rtp/src/container/mp4/container.js +262 -0
  77. package/lib/rtp/src/container/mp4/container.js.map +1 -0
  78. package/lib/rtp/src/container/mp4/exp-golomb.d.ts +20 -0
  79. package/lib/rtp/src/container/mp4/exp-golomb.js +144 -0
  80. package/lib/rtp/src/container/mp4/exp-golomb.js.map +1 -0
  81. package/lib/rtp/src/container/mp4/h264.d.ts +42 -0
  82. package/lib/rtp/src/container/mp4/h264.js +240 -0
  83. package/lib/rtp/src/container/mp4/h264.js.map +1 -0
  84. package/lib/rtp/src/container/mp4/index.d.ts +2 -0
  85. package/lib/rtp/src/container/mp4/index.js +19 -0
  86. package/lib/rtp/src/container/mp4/index.js.map +1 -0
  87. package/lib/rtp/src/container/mp4/mp4box.d.ts +5 -0
  88. package/lib/rtp/src/container/mp4/mp4box.js +32 -0
  89. package/lib/rtp/src/container/mp4/mp4box.js.map +1 -0
  90. package/lib/rtp/src/container/mp4/sps-parser.d.ts +40 -0
  91. package/lib/rtp/src/container/mp4/sps-parser.js +291 -0
  92. package/lib/rtp/src/container/mp4/sps-parser.js.map +1 -0
  93. package/lib/rtp/src/container/ogg/index.d.ts +1 -0
  94. package/lib/rtp/src/container/ogg/index.js +18 -0
  95. package/lib/rtp/src/container/ogg/index.js.map +1 -0
  96. package/lib/rtp/src/container/ogg/parser.d.ts +12 -0
  97. package/lib/rtp/src/container/ogg/parser.js +100 -0
  98. package/lib/rtp/src/container/ogg/parser.js.map +1 -0
  99. package/lib/rtp/src/container/{webm.d.ts → webm/container.d.ts} +1 -1
  100. package/lib/rtp/src/container/{webm.js → webm/container.js} +6 -6
  101. package/lib/rtp/src/container/webm/container.js.map +1 -0
  102. package/lib/rtp/src/container/webm/ebml/ebml.js.map +1 -0
  103. package/lib/rtp/src/container/webm/ebml/id.js.map +1 -0
  104. package/lib/rtp/src/container/webm/ebml/index.js.map +1 -0
  105. package/lib/rtp/src/container/webm/ebml/typedArrayUtils.js.map +1 -0
  106. package/lib/rtp/src/container/webm/index.d.ts +2 -0
  107. package/lib/rtp/src/container/webm/index.js +19 -0
  108. package/lib/rtp/src/container/webm/index.js.map +1 -0
  109. package/lib/rtp/src/processor/depacketizer.js.map +1 -1
  110. package/lib/rtp/src/processor/dtx.d.ts +1 -1
  111. package/lib/rtp/src/processor/dtx.js.map +1 -1
  112. package/lib/rtp/src/processor/index.d.ts +2 -0
  113. package/lib/rtp/src/processor/index.js +2 -0
  114. package/lib/rtp/src/processor/index.js.map +1 -1
  115. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  116. package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -1
  117. package/lib/rtp/src/processor/lipsync.js.map +1 -1
  118. package/lib/rtp/src/processor/lipsyncCallback.js.map +1 -1
  119. package/lib/rtp/src/processor/mp4.d.ts +50 -0
  120. package/lib/rtp/src/processor/mp4.js +162 -0
  121. package/lib/rtp/src/processor/mp4.js.map +1 -0
  122. package/lib/rtp/src/processor/mp4Callback.d.ts +12 -0
  123. package/lib/rtp/src/processor/mp4Callback.js +83 -0
  124. package/lib/rtp/src/processor/mp4Callback.js.map +1 -0
  125. package/lib/rtp/src/processor/mute.d.ts +1 -1
  126. package/lib/rtp/src/processor/mute.js +6 -3
  127. package/lib/rtp/src/processor/mute.js.map +1 -1
  128. package/lib/rtp/src/processor/muteCallback.js.map +1 -1
  129. package/lib/rtp/src/processor/nack.js +2 -3
  130. package/lib/rtp/src/processor/nack.js.map +1 -1
  131. package/lib/rtp/src/processor/ntpTime.d.ts +1 -1
  132. package/lib/rtp/src/processor/ntpTime.js.map +1 -1
  133. package/lib/rtp/src/processor/rtcpCallback.js.map +1 -1
  134. package/lib/rtp/src/processor/rtpCallback.js.map +1 -1
  135. package/lib/rtp/src/processor/rtpStream.js.map +1 -1
  136. package/lib/rtp/src/processor/rtpTime.js.map +1 -1
  137. package/lib/rtp/src/processor/webm.d.ts +1 -1
  138. package/lib/rtp/src/processor/webm.js +1 -1
  139. package/lib/rtp/src/processor/webm.js.map +1 -1
  140. package/lib/rtp/src/processor/webmCallback.d.ts +1 -1
  141. package/lib/rtp/src/processor/webmCallback.js.map +1 -1
  142. package/lib/rtp/src/processor/webmStream.d.ts +1 -1
  143. package/lib/rtp/src/processor/webmStream.js.map +1 -1
  144. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +1 -1
  145. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
  146. package/lib/rtp/src/rtcp/psfb/index.js +1 -1
  147. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  148. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +1 -1
  149. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
  150. package/lib/rtp/src/rtcp/psfb/remb.js +1 -1
  151. package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
  152. package/lib/rtp/src/rtcp/rr.js +3 -7
  153. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  154. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  155. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  156. package/lib/rtp/src/rtcp/rtpfb/nack.js +6 -13
  157. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  158. package/lib/rtp/src/rtcp/rtpfb/twcc.js +12 -8
  159. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  160. package/lib/rtp/src/rtcp/sdes.js +1 -1
  161. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  162. package/lib/rtp/src/rtcp/sr.js +2 -6
  163. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  164. package/lib/rtp/src/rtp/headerExtension.d.ts +5 -0
  165. package/lib/rtp/src/rtp/headerExtension.js +35 -9
  166. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  167. package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
  168. package/lib/rtp/src/rtp/red/handler.js.map +1 -1
  169. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  170. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  171. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  172. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  173. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  174. package/lib/rtp/src/srtp/session.js.map +1 -1
  175. package/lib/rtp/src/srtp/srtcp.js.map +1 -1
  176. package/lib/rtp/src/srtp/srtp.js.map +1 -1
  177. package/lib/rtp/src/util.js.map +1 -1
  178. package/lib/sctp/src/chunk.js +17 -17
  179. package/lib/sctp/src/chunk.js.map +1 -1
  180. package/lib/sctp/src/param.js +3 -3
  181. package/lib/sctp/src/param.js.map +1 -1
  182. package/lib/sctp/src/sctp.js.map +1 -1
  183. package/lib/sctp/src/transport.js.map +1 -1
  184. package/lib/webrtc/src/const.js.map +1 -1
  185. package/lib/webrtc/src/dataChannel.js.map +1 -1
  186. package/lib/webrtc/src/media/parameters.js.map +1 -1
  187. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  188. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  189. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  190. package/lib/webrtc/src/media/router.js.map +1 -1
  191. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  192. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  193. package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
  194. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  195. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  196. package/lib/webrtc/src/media/track.js.map +1 -1
  197. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  198. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  199. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  200. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  201. package/lib/webrtc/src/peerConnection.js.map +1 -1
  202. package/lib/webrtc/src/sdp.js.map +1 -1
  203. package/lib/webrtc/src/transport/dtls.d.ts +1 -1
  204. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  205. package/lib/webrtc/src/transport/ice.d.ts +2 -2
  206. package/lib/webrtc/src/transport/ice.js.map +1 -1
  207. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  208. package/lib/webrtc/src/types/domain.d.ts +2 -2
  209. package/lib/webrtc/src/types/domain.js.map +1 -1
  210. package/lib/webrtc/src/utils.d.ts +1 -0
  211. package/lib/webrtc/src/utils.js +9 -1
  212. package/lib/webrtc/src/utils.js.map +1 -1
  213. package/package.json +5 -3
  214. package/src/const.ts +1 -1
  215. package/src/dataChannel.ts +3 -3
  216. package/src/media/parameters.ts +3 -3
  217. package/src/media/receiver/nack.ts +7 -4
  218. package/src/media/receiver/receiverTwcc.ts +5 -5
  219. package/src/media/receiver/statistics.ts +1 -1
  220. package/src/media/router.ts +5 -5
  221. package/src/media/rtpReceiver.ts +9 -9
  222. package/src/media/rtpSender.ts +8 -8
  223. package/src/media/rtpTransceiver.ts +3 -3
  224. package/src/media/sender/senderBWE.ts +2 -2
  225. package/src/media/track.ts +1 -1
  226. package/src/nonstandard/recorder/index.ts +1 -1
  227. package/src/nonstandard/recorder/writer/index.ts +1 -1
  228. package/src/nonstandard/recorder/writer/webm.ts +2 -2
  229. package/src/nonstandard/userMedia.ts +1 -1
  230. package/src/peerConnection.ts +52 -52
  231. package/src/sdp.ts +27 -21
  232. package/src/transport/dtls.ts +13 -10
  233. package/src/transport/ice.ts +6 -6
  234. package/src/transport/sctp.ts +4 -4
  235. package/src/types/domain.ts +2 -2
  236. package/src/utils.ts +11 -2
  237. package/lib/common/src/array.d.ts +0 -1
  238. package/lib/common/src/array.js +0 -15
  239. package/lib/common/src/array.js.map +0 -1
  240. package/lib/rtp/src/container/ebml/ebml.js.map +0 -1
  241. package/lib/rtp/src/container/ebml/id.js.map +0 -1
  242. package/lib/rtp/src/container/ebml/index.js.map +0 -1
  243. package/lib/rtp/src/container/ebml/typedArrayUtils.js.map +0 -1
  244. package/lib/rtp/src/container/webm.js.map +0 -1
  245. /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.d.ts +0 -0
  246. /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.js +0 -0
  247. /package/lib/rtp/src/container/{ebml → webm/ebml}/id.d.ts +0 -0
  248. /package/lib/rtp/src/container/{ebml → webm/ebml}/id.js +0 -0
  249. /package/lib/rtp/src/container/{ebml → webm/ebml}/index.d.ts +0 -0
  250. /package/lib/rtp/src/container/{ebml → webm/ebml}/index.js +0 -0
  251. /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.d.ts +0 -0
  252. /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../dtls/src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport { SessionType } from \"./cipher/suites/abstract\";\nimport { flight2 } from \"./flight/server/flight2\";\nimport { Flight4 } from \"./flight/server/flight4\";\nimport { Flight6 } from \"./flight/server/flight6\";\nimport { HandshakeType } from \"./handshake/const\";\nimport { ClientHello } from \"./handshake/message/client/hello\";\nimport { FragmentedHandshake } from \"./record/message/fragment\";\nimport { DtlsSocket, Options } from \"./socket\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/server.ts : log\");\n\nexport class DtlsServer extends DtlsSocket {\n constructor(options: Options) {\n super(options, SessionType.SERVER);\n this.onHandleHandshakes = this.handleHandshakes;\n log(this.dtls.sessionId, \"start server\");\n }\n\n private flight6?: Flight6;\n private handleHandshakes = async (assembled: FragmentedHandshake[]) => {\n log(\n this.dtls.sessionId,\n \"handleHandshakes\",\n assembled.map((a) => a.msg_type)\n );\n\n for (const handshake of assembled) {\n switch (handshake.msg_type) {\n // flight1,3\n case HandshakeType.client_hello_1:\n {\n if (this.connected) {\n this.renegotiation();\n }\n const clientHello = ClientHello.deSerialize(handshake.fragment);\n\n if (clientHello.cookie.length === 0) {\n log(this.dtls.sessionId, \"send flight2\");\n flight2(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp\n )(clientHello);\n } else if (\n this.dtls.cookie &&\n clientHello.cookie.equals(this.dtls.cookie)\n ) {\n log(this.dtls.sessionId, \"send flight4\");\n await new Flight4(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp\n ).exec(handshake, this.options.certificateRequest);\n } else {\n log(\"wrong state\", {\n dtlsCookie: this.dtls.cookie?.toString(\"hex\").slice(10),\n helloCookie: clientHello.cookie.toString(\"hex\").slice(10),\n });\n }\n }\n break;\n // flight 5\n case HandshakeType.certificate_11:\n case HandshakeType.certificate_verify_15:\n case HandshakeType.client_key_exchange_16:\n {\n if (this.connected) return;\n this.flight6 = new Flight6(this.transport, this.dtls, this.cipher);\n this.flight6.handleHandshake(handshake);\n }\n break;\n case HandshakeType.finished_20:\n {\n await this.waitForReady(() => !!this.flight6);\n this.flight6?.handleHandshake(handshake);\n\n await this.waitForReady(() => this.dtls.checkHandshakesExist([16]));\n await this.flight6?.exec();\n\n this.connected = true;\n this.onConnect.execute();\n log(this.dtls.sessionId, \"dtls connected\");\n }\n break;\n }\n }\n };\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../dtls/src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport { SessionType } from \"./cipher/suites/abstract\";\nimport { flight2 } from \"./flight/server/flight2\";\nimport { Flight4 } from \"./flight/server/flight4\";\nimport { Flight6 } from \"./flight/server/flight6\";\nimport { HandshakeType } from \"./handshake/const\";\nimport { ClientHello } from \"./handshake/message/client/hello\";\nimport { FragmentedHandshake } from \"./record/message/fragment\";\nimport { DtlsSocket, Options } from \"./socket\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/server.ts : log\");\n\nexport class DtlsServer extends DtlsSocket {\n constructor(options: Options) {\n super(options, SessionType.SERVER);\n this.onHandleHandshakes = this.handleHandshakes;\n log(this.dtls.sessionId, \"start server\");\n }\n\n private flight6?: Flight6;\n private handleHandshakes = async (assembled: FragmentedHandshake[]) => {\n log(\n this.dtls.sessionId,\n \"handleHandshakes\",\n assembled.map((a) => a.msg_type)\n );\n\n for (const handshake of assembled) {\n switch (handshake.msg_type) {\n // flight1,3\n case HandshakeType.client_hello_1:\n {\n if (this.connected) {\n this.renegotiation();\n }\n const clientHello = ClientHello.deSerialize(handshake.fragment);\n\n if (clientHello.cookie.length === 0) {\n log(this.dtls.sessionId, \"send flight2\");\n flight2(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp\n )(clientHello);\n } else if (\n this.dtls.cookie &&\n clientHello.cookie.equals(this.dtls.cookie)\n ) {\n log(this.dtls.sessionId, \"send flight4\");\n await new Flight4(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp\n ).exec(handshake, this.options.certificateRequest);\n } else {\n log(\"wrong state\", {\n dtlsCookie: this.dtls.cookie?.toString(\"hex\").slice(10),\n helloCookie: clientHello.cookie.toString(\"hex\").slice(10),\n });\n }\n }\n break;\n // flight 5\n case HandshakeType.certificate_11:\n case HandshakeType.certificate_verify_15:\n case HandshakeType.client_key_exchange_16:\n {\n if (this.connected) return;\n this.flight6 = new Flight6(this.transport, this.dtls, this.cipher);\n this.flight6.handleHandshake(handshake);\n }\n break;\n case HandshakeType.finished_20:\n {\n await this.waitForReady(() => !!this.flight6);\n this.flight6?.handleHandshake(handshake);\n\n await this.waitForReady(() => this.dtls.checkHandshakesExist([16]));\n await this.flight6?.exec();\n\n this.connected = true;\n this.onConnect.execute();\n log(this.dtls.sessionId, \"dtls connected\");\n }\n break;\n }\n }\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../dtls/src/socket.ts"],"names":[],"mappings":"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","sourcesContent":["import { decode, types } from \"binary-data\";\nimport debug from \"debug\";\nimport { Event } from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\n\nimport {\n HashAlgorithm,\n NamedCurveAlgorithmList,\n SignatureAlgorithm,\n SignatureHash,\n} from \"./cipher/const\";\nimport { exportKeyingMaterial } from \"./cipher/prf\";\nimport { SessionType, SessionTypes } from \"./cipher/suites/abstract\";\nimport { CipherContext } from \"./context/cipher\";\nimport { DtlsContext } from \"./context/dtls\";\nimport { Profile, SrtpContext } from \"./context/srtp\";\nimport { TransportContext } from \"./context/transport\";\nimport { EllipticCurves } from \"./handshake/extensions/ellipticCurves\";\nimport { ExtendedMasterSecret } from \"./handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"./handshake/extensions/renegotiationIndication\";\nimport { Signature } from \"./handshake/extensions/signature\";\nimport { UseSRTP } from \"./handshake/extensions/useSrtp\";\nimport { createPlaintext } from \"./record/builder\";\nimport { ContentType } from \"./record/const\";\nimport { FragmentedHandshake } from \"./record/message/fragment\";\nimport { parsePacket, parsePlainText } from \"./record/receive\";\nimport { Transport } from \"./transport\";\nimport { Extension } from \"./typings/domain\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/socket.ts : log\");\nconst err = debug(\"werift-dtls : packages/dtls/src/socket.ts : err\");\n\nexport class DtlsSocket {\n readonly onConnect = new Event();\n readonly onData = new Event<[Buffer]>();\n readonly onError = new Event<[Error]>();\n readonly onClose = new Event();\n readonly transport: TransportContext;\n cipher: CipherContext;\n dtls: DtlsContext;\n srtp: SrtpContext = new SrtpContext();\n\n connected = false;\n extensions: Extension[] = [];\n onHandleHandshakes!: (assembled: FragmentedHandshake[]) => Promise<void>;\n\n private bufferFragmentedHandshakes: FragmentedHandshake[] = [];\n\n constructor(public options: Options, public sessionType: SessionTypes) {\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash\n );\n this.transport = new TransportContext(this.options.transport);\n this.setupExtensions();\n this.transport.socket.onData = this.udpOnMessage;\n }\n\n renegotiation() {\n log(\"renegotiation\", this.sessionType);\n this.connected = false;\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash\n );\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.srtp = new SrtpContext();\n this.extensions = [];\n this.bufferFragmentedHandshakes = [];\n }\n\n private udpOnMessage = (data: Buffer) => {\n const packets = parsePacket(data);\n\n for (const packet of packets) {\n try {\n const message = parsePlainText(this.dtls, this.cipher)(packet);\n switch (message.type) {\n case ContentType.handshake:\n {\n const handshake = message.data as FragmentedHandshake;\n const handshakes = this.handleFragmentHandshake([handshake]);\n const assembled = Object.values(\n handshakes.reduce(\n (acc: { [type: string]: FragmentedHandshake[] }, cur) => {\n if (!acc[cur.msg_type]) acc[cur.msg_type] = [];\n acc[cur.msg_type].push(cur);\n return acc;\n },\n {}\n )\n )\n .map((v) => FragmentedHandshake.assemble(v))\n .sort((a, b) => a.msg_type - b.msg_type);\n\n this.onHandleHandshakes(assembled).catch((error) => {\n err(this.dtls.sessionId, \"onHandleHandshakes error\", error);\n this.onError.execute(error);\n });\n }\n break;\n case ContentType.applicationData:\n {\n this.onData.execute(message.data as Buffer);\n }\n break;\n case ContentType.alert:\n this.onClose.execute();\n break;\n }\n } catch (error) {\n err(this.dtls.sessionId, \"catch udpOnMessage error\", error);\n }\n }\n };\n\n private setupExtensions() {\n {\n log(\n this.dtls.sessionId,\n \"support srtpProfiles\",\n this.options.srtpProfiles\n );\n if (this.options.srtpProfiles && this.options.srtpProfiles.length > 0) {\n const useSrtp = UseSRTP.create(\n this.options.srtpProfiles,\n Buffer.from([0x00])\n );\n this.extensions.push(useSrtp.extension);\n }\n }\n\n {\n const curve = EllipticCurves.createEmpty();\n curve.data = NamedCurveAlgorithmList;\n this.extensions.push(curve.extension);\n }\n\n {\n const signature = Signature.createEmpty();\n // libwebrtc/OpenSSL require 4=1 , 4=3 signatureHash\n signature.data = [\n { hash: HashAlgorithm.sha256_4, signature: SignatureAlgorithm.rsa_1 },\n { hash: HashAlgorithm.sha256_4, signature: SignatureAlgorithm.ecdsa_3 },\n ];\n this.extensions.push(signature.extension);\n }\n\n {\n if (this.options.extendedMasterSecret) {\n this.extensions.push({\n type: ExtendedMasterSecret.type,\n data: Buffer.alloc(0),\n });\n }\n }\n\n {\n const renegotiationIndication = RenegotiationIndication.createEmpty();\n this.extensions.push(renegotiationIndication.extension);\n }\n }\n\n protected waitForReady = (condition: () => boolean) =>\n new Promise<void>(async (r, f) => {\n {\n for (let i = 0; i < 10; i++) {\n if (condition()) {\n r();\n break;\n } else {\n await setTimeout(100 * i);\n }\n }\n f(\"waitForReady timeout\");\n }\n });\n\n handleFragmentHandshake(messages: FragmentedHandshake[]) {\n let handshakes = messages.filter((v) => {\n // find fragmented\n if (v.fragment_length !== v.length) {\n this.bufferFragmentedHandshakes.push(v);\n return false;\n }\n return true;\n });\n\n if (this.bufferFragmentedHandshakes.length > 1) {\n const [last] = this.bufferFragmentedHandshakes.slice(-1);\n if (last.fragment_offset + last.fragment_length === last.length) {\n handshakes = [...this.bufferFragmentedHandshakes, ...handshakes];\n this.bufferFragmentedHandshakes = [];\n }\n }\n return handshakes; // return un fragmented handshakes\n }\n\n /**send application data */\n send = async (buf: Buffer) => {\n const pkt = createPlaintext(this.dtls)(\n [{ type: ContentType.applicationData, fragment: buf }],\n ++this.dtls.recordSequenceNumber\n )[0];\n await this.transport.send(this.cipher.encryptPacket(pkt).serialize());\n };\n\n close() {\n this.transport.socket.close();\n }\n\n extractSessionKeys(keyLength: number, saltLength: number) {\n const keyingMaterial = this.exportKeyingMaterial(\n \"EXTRACTOR-dtls_srtp\",\n keyLength * 2 + saltLength * 2\n );\n\n const { clientKey, serverKey, clientSalt, serverSalt } = decode(\n keyingMaterial,\n {\n clientKey: types.buffer(keyLength),\n serverKey: types.buffer(keyLength),\n clientSalt: types.buffer(saltLength),\n serverSalt: types.buffer(saltLength),\n }\n );\n\n if (this.sessionType === SessionType.CLIENT) {\n return {\n localKey: clientKey,\n localSalt: clientSalt,\n remoteKey: serverKey,\n remoteSalt: serverSalt,\n };\n } else {\n return {\n localKey: serverKey,\n localSalt: serverSalt,\n remoteKey: clientKey,\n remoteSalt: clientSalt,\n };\n }\n }\n\n exportKeyingMaterial(label: string, length: number) {\n return exportKeyingMaterial(\n label,\n length,\n this.cipher.masterSecret,\n this.cipher.localRandom.serialize(),\n this.cipher.remoteRandom.serialize(),\n this.sessionType === SessionType.CLIENT\n );\n }\n}\n\nexport interface Options {\n transport: Transport;\n srtpProfiles?: Profile[];\n cert?: string;\n key?: string;\n signatureHash?: SignatureHash;\n certificateRequest?: boolean;\n extendedMasterSecret?: boolean;\n}\n"]}
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../dtls/src/socket.ts"],"names":[],"mappings":"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","sourcesContent":["import { decode, types } from \"binary-data\";\nimport debug from \"debug\";\nimport { Event } from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\n\nimport {\n HashAlgorithm,\n NamedCurveAlgorithmList,\n SignatureAlgorithm,\n SignatureHash,\n} from \"./cipher/const\";\nimport { exportKeyingMaterial } from \"./cipher/prf\";\nimport { SessionType, SessionTypes } from \"./cipher/suites/abstract\";\nimport { CipherContext } from \"./context/cipher\";\nimport { DtlsContext } from \"./context/dtls\";\nimport { Profile, SrtpContext } from \"./context/srtp\";\nimport { TransportContext } from \"./context/transport\";\nimport { EllipticCurves } from \"./handshake/extensions/ellipticCurves\";\nimport { ExtendedMasterSecret } from \"./handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"./handshake/extensions/renegotiationIndication\";\nimport { Signature } from \"./handshake/extensions/signature\";\nimport { UseSRTP } from \"./handshake/extensions/useSrtp\";\nimport { createPlaintext } from \"./record/builder\";\nimport { ContentType } from \"./record/const\";\nimport { FragmentedHandshake } from \"./record/message/fragment\";\nimport { parsePacket, parsePlainText } from \"./record/receive\";\nimport { Transport } from \"./transport\";\nimport { Extension } from \"./typings/domain\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/socket.ts : log\");\nconst err = debug(\"werift-dtls : packages/dtls/src/socket.ts : err\");\n\nexport class DtlsSocket {\n readonly onConnect = new Event();\n readonly onData = new Event<[Buffer]>();\n readonly onError = new Event<[Error]>();\n readonly onClose = new Event();\n readonly transport: TransportContext;\n cipher: CipherContext;\n dtls: DtlsContext;\n srtp: SrtpContext = new SrtpContext();\n\n connected = false;\n extensions: Extension[] = [];\n onHandleHandshakes!: (assembled: FragmentedHandshake[]) => Promise<void>;\n\n private bufferFragmentedHandshakes: FragmentedHandshake[] = [];\n\n constructor(public options: Options, public sessionType: SessionTypes) {\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash\n );\n this.transport = new TransportContext(this.options.transport);\n this.setupExtensions();\n this.transport.socket.onData = this.udpOnMessage;\n }\n\n renegotiation() {\n log(\"renegotiation\", this.sessionType);\n this.connected = false;\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash\n );\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.srtp = new SrtpContext();\n this.extensions = [];\n this.bufferFragmentedHandshakes = [];\n }\n\n private udpOnMessage = (data: Buffer) => {\n const packets = parsePacket(data);\n\n for (const packet of packets) {\n try {\n const message = parsePlainText(this.dtls, this.cipher)(packet);\n switch (message.type) {\n case ContentType.handshake:\n {\n const handshake = message.data as FragmentedHandshake;\n const handshakes = this.handleFragmentHandshake([handshake]);\n const assembled = Object.values(\n handshakes.reduce(\n (acc: { [type: string]: FragmentedHandshake[] }, cur) => {\n if (!acc[cur.msg_type]) acc[cur.msg_type] = [];\n acc[cur.msg_type].push(cur);\n return acc;\n },\n {}\n )\n )\n .map((v) => FragmentedHandshake.assemble(v))\n .sort((a, b) => a.msg_type - b.msg_type);\n\n this.onHandleHandshakes(assembled).catch((error) => {\n err(this.dtls.sessionId, \"onHandleHandshakes error\", error);\n this.onError.execute(error);\n });\n }\n break;\n case ContentType.applicationData:\n {\n this.onData.execute(message.data as Buffer);\n }\n break;\n case ContentType.alert:\n this.onClose.execute();\n break;\n }\n } catch (error) {\n err(this.dtls.sessionId, \"catch udpOnMessage error\", error);\n }\n }\n };\n\n private setupExtensions() {\n {\n log(\n this.dtls.sessionId,\n \"support srtpProfiles\",\n this.options.srtpProfiles\n );\n if (this.options.srtpProfiles && this.options.srtpProfiles.length > 0) {\n const useSrtp = UseSRTP.create(\n this.options.srtpProfiles,\n Buffer.from([0x00])\n );\n this.extensions.push(useSrtp.extension);\n }\n }\n\n {\n const curve = EllipticCurves.createEmpty();\n curve.data = NamedCurveAlgorithmList;\n this.extensions.push(curve.extension);\n }\n\n {\n const signature = Signature.createEmpty();\n // libwebrtc/OpenSSL require 4=1 , 4=3 signatureHash\n signature.data = [\n { hash: HashAlgorithm.sha256_4, signature: SignatureAlgorithm.rsa_1 },\n { hash: HashAlgorithm.sha256_4, signature: SignatureAlgorithm.ecdsa_3 },\n ];\n this.extensions.push(signature.extension);\n }\n\n {\n if (this.options.extendedMasterSecret) {\n this.extensions.push({\n type: ExtendedMasterSecret.type,\n data: Buffer.alloc(0),\n });\n }\n }\n\n {\n const renegotiationIndication = RenegotiationIndication.createEmpty();\n this.extensions.push(renegotiationIndication.extension);\n }\n }\n\n protected waitForReady = (condition: () => boolean) =>\n new Promise<void>(async (r, f) => {\n {\n for (let i = 0; i < 10; i++) {\n if (condition()) {\n r();\n break;\n } else {\n await setTimeout(100 * i);\n }\n }\n f(\"waitForReady timeout\");\n }\n });\n\n handleFragmentHandshake(messages: FragmentedHandshake[]) {\n let handshakes = messages.filter((v) => {\n // find fragmented\n if (v.fragment_length !== v.length) {\n this.bufferFragmentedHandshakes.push(v);\n return false;\n }\n return true;\n });\n\n if (this.bufferFragmentedHandshakes.length > 1) {\n const [last] = this.bufferFragmentedHandshakes.slice(-1);\n if (last.fragment_offset + last.fragment_length === last.length) {\n handshakes = [...this.bufferFragmentedHandshakes, ...handshakes];\n this.bufferFragmentedHandshakes = [];\n }\n }\n return handshakes; // return un fragmented handshakes\n }\n\n /**send application data */\n send = async (buf: Buffer) => {\n const pkt = createPlaintext(this.dtls)(\n [{ type: ContentType.applicationData, fragment: buf }],\n ++this.dtls.recordSequenceNumber\n )[0];\n await this.transport.send(this.cipher.encryptPacket(pkt).serialize());\n };\n\n close() {\n this.transport.socket.close();\n }\n\n extractSessionKeys(keyLength: number, saltLength: number) {\n const keyingMaterial = this.exportKeyingMaterial(\n \"EXTRACTOR-dtls_srtp\",\n keyLength * 2 + saltLength * 2\n );\n\n const { clientKey, serverKey, clientSalt, serverSalt } = decode(\n keyingMaterial,\n {\n clientKey: types.buffer(keyLength),\n serverKey: types.buffer(keyLength),\n clientSalt: types.buffer(saltLength),\n serverSalt: types.buffer(saltLength),\n }\n );\n\n if (this.sessionType === SessionType.CLIENT) {\n return {\n localKey: clientKey,\n localSalt: clientSalt,\n remoteKey: serverKey,\n remoteSalt: serverSalt,\n };\n } else {\n return {\n localKey: serverKey,\n localSalt: serverSalt,\n remoteKey: clientKey,\n remoteSalt: clientSalt,\n };\n }\n }\n\n exportKeyingMaterial(label: string, length: number) {\n return exportKeyingMaterial(\n label,\n length,\n this.cipher.masterSecret,\n this.cipher.localRandom.serialize(),\n this.cipher.remoteRandom.serialize(),\n this.sessionType === SessionType.CLIENT\n );\n }\n}\n\nexport interface Options {\n transport: Transport;\n srtpProfiles?: Profile[];\n cert?: string;\n key?: string;\n signatureHash?: SignatureHash;\n certificateRequest?: boolean;\n extendedMasterSecret?: boolean;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../dtls/src/transport.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,8CAA8C,CAAC,CAAC;AAQlE,MAAa,YAAY;IACvB,YAAoB,GAAW,EAAU,KAA0B;;;;;mBAA/C;;;;;;mBAAqB;;QAMzC;;;;;WAA+B;QAE/B;;;;mBAAO,CAAC,GAAW,EAAE,EAAE,CACrB,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACzB,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC9D,IAAI,GAAG,EAAE;wBACP,CAAC,CAAC,GAAG,CAAC,CAAC;qBACR;yBAAM;wBACL,CAAC,EAAE,CAAC;qBACL;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;WAAC;QAjBH,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAeD,KAAK;QACH,IAAI;YACF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;SAClB;QAAC,OAAO,KAAK,EAAE,GAAE;IACpB,CAAC;CACF;AA1BD,oCA0BC;AAEM,MAAM,kBAAkB,GAAG,CAChC,MAAc,EACd,QAA6B,EAAE,EAC/B,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAHxB,QAAA,kBAAkB,sBAGM","sourcesContent":["import debug from \"debug\";\nimport { RemoteInfo, Socket } from \"dgram\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/transport.ts\");\n\nexport interface Transport {\n onData?: (buf: Buffer) => void;\n send: (buf: Buffer) => Promise<void>;\n close: () => void;\n}\n\nexport class UdpTransport implements Transport {\n constructor(private upd: Socket, private rinfo: Partial<RemoteInfo>) {\n upd.on(\"message\", (buf, target) => {\n this.rinfo = target;\n if (this.onData) this.onData(buf);\n });\n }\n onData?: (buf: Buffer) => void;\n\n send = (buf: Buffer) =>\n new Promise<void>((r, f) => {\n log(\"this.rinfo\", this.rinfo);\n this.upd.send(buf, this.rinfo.port, this.rinfo.address, (err) => {\n if (err) {\n f(err);\n } else {\n r();\n }\n });\n });\n\n close() {\n try {\n this.upd.close();\n } catch (error) {}\n }\n}\n\nexport const createUdpTransport = (\n socket: Socket,\n rinfo: Partial<RemoteInfo> = {}\n) => new UdpTransport(socket, rinfo);\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../dtls/src/transport.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,8CAA8C,CAAC,CAAC;AAQlE,MAAa,YAAY;IACvB,YAAoB,GAAW,EAAU,KAA0B;QAAvD;;;;mBAAQ,GAAG;WAAQ;QAAE;;;;mBAAQ,KAAK;WAAqB;QAMnE;;;;;WAA+B;QAE/B;;;;mBAAO,CAAC,GAAW,EAAE,EAAE,CACrB,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACzB,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC9D,IAAI,GAAG,EAAE;wBACP,CAAC,CAAC,GAAG,CAAC,CAAC;qBACR;yBAAM;wBACL,CAAC,EAAE,CAAC;qBACL;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;WAAC;QAjBH,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAeD,KAAK;QACH,IAAI;YACF,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;SAClB;QAAC,OAAO,KAAK,EAAE,GAAE;IACpB,CAAC;CACF;AA1BD,oCA0BC;AAEM,MAAM,kBAAkB,GAAG,CAChC,MAAc,EACd,QAA6B,EAAE,EAC/B,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAHxB,QAAA,kBAAkB,sBAGM","sourcesContent":["import debug from \"debug\";\nimport { RemoteInfo, Socket } from \"dgram\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/transport.ts\");\n\nexport interface Transport {\n onData?: (buf: Buffer) => void;\n send: (buf: Buffer) => Promise<void>;\n close: () => void;\n}\n\nexport class UdpTransport implements Transport {\n constructor(private upd: Socket, private rinfo: Partial<RemoteInfo>) {\n upd.on(\"message\", (buf, target) => {\n this.rinfo = target;\n if (this.onData) this.onData(buf);\n });\n }\n onData?: (buf: Buffer) => void;\n\n send = (buf: Buffer) =>\n new Promise<void>((r, f) => {\n log(\"this.rinfo\", this.rinfo);\n this.upd.send(buf, this.rinfo.port, this.rinfo.address, (err) => {\n if (err) {\n f(err);\n } else {\n r();\n }\n });\n });\n\n close() {\n try {\n this.upd.close();\n } catch (error) {}\n }\n}\n\nexport const createUdpTransport = (\n socket: Socket,\n rinfo: Partial<RemoteInfo> = {}\n) => new UdpTransport(socket, rinfo);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"candidate.js","sourceRoot":"","sources":["../../../../ice/src/candidate.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport range from \"lodash/range\";\nimport { isIPv4 } from \"net\";\n\nexport class Candidate {\n // An ICE candidate.\n\n constructor(\n public foundation: string,\n public component: number,\n public transport: string,\n public priority: number,\n public host: string,\n public port: number,\n public type: string,\n public relatedAddress?: string,\n public relatedPort?: number,\n public tcptype?: string,\n public generation?: number\n ) {}\n\n static fromSdp(sdp: string) {\n // Parse a :class:`Candidate` from SDP.\n // .. code-block:: python\n // Candidate.from_sdp(\n // '6815297761 1 udp 659136 1.2.3.4 31102 typ host generation 0')\n\n const bits = sdp.split(\" \");\n if (bits.length < 8) throw new Error(\"SDP does not have enough properties\");\n\n const kwargs = {\n foundation: bits[0],\n component: Number(bits[1]),\n transport: bits[2],\n priority: Number(bits[3]),\n host: bits[4],\n port: Number(bits[5]),\n type: bits[7],\n };\n\n for (const i of range(8, bits.length - 1, 2)) {\n if (bits[i] === \"raddr\") {\n (kwargs as any)[\"related_address\"] = bits[i + 1];\n } else if (bits[i] === \"rport\") {\n (kwargs as any)[\"related_port\"] = Number(bits[i + 1]);\n } else if (bits[i] === \"tcptype\") {\n (kwargs as any)[\"tcptype\"] = bits[i + 1];\n } else if (bits[i] === \"generation\") {\n (kwargs as any)[\"generation\"] = Number(bits[i + 1]);\n }\n }\n const { foundation, component, transport, priority, host, port, type } =\n kwargs;\n\n return new Candidate(\n foundation,\n component,\n transport,\n priority,\n host,\n port,\n type,\n (kwargs as any)[\"related_address\"],\n (kwargs as any)[\"related_port\"],\n (kwargs as any)[\"tcptype\"],\n (kwargs as any)[\"generation\"]\n );\n }\n\n canPairWith(other: Candidate) {\n // \"\"\"\n // A local candidate is paired with a remote candidate if and only if\n // the two candidates have the same component ID and have the same IP\n // address version.\n // \"\"\"\n const a = isIPv4(this.host);\n const b = isIPv4(other.host);\n return (\n this.component === other.component &&\n this.transport.toLowerCase() === other.transport.toLowerCase() &&\n a === b\n );\n }\n\n toSdp() {\n let sdp = `${this.foundation} ${this.component} ${this.transport} ${this.priority} ${this.host} ${this.port} typ ${this.type}`;\n\n if (this.relatedAddress) sdp += ` raddr ${this.relatedAddress}`;\n if (this.relatedPort != undefined) sdp += ` rport ${this.relatedPort}`;\n if (this.tcptype) sdp += ` tcptype ${this.tcptype}`;\n if (this.generation != undefined) sdp += ` generation ${this.generation}`;\n\n return sdp;\n }\n}\n\nexport function candidateFoundation(\n candidateType: string,\n candidateTransport: string,\n baseAddress: string\n) {\n // \"\"\"\n // See RFC 5245 - 4.1.1.3. Computing Foundations\n // \"\"\"\n const key = `${candidateType}|${candidateTransport}|${baseAddress}`;\n\n return createHash(\"md5\").update(key, \"ascii\").digest(\"hex\").slice(7);\n}\n\n// priorityを決める\nexport function candidatePriority(\n candidateComponent: number,\n candidateType: string,\n localPref = 65535\n) {\n // See RFC 5245 - 4.1.2.1. Recommended Formula\n let typePref = 0;\n if (candidateType === \"host\") {\n typePref = 126;\n } else if (candidateType === \"prflx\") {\n typePref = 110;\n } else if (candidateType === \"srflx\") {\n typePref = 100;\n } else {\n typePref = 0;\n }\n return (\n (1 << 24) * typePref + (1 << 8) * localPref + (256 - candidateComponent)\n );\n}\n"]}
1
+ {"version":3,"file":"candidate.js","sourceRoot":"","sources":["../../../../ice/src/candidate.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAoC;AACpC,yDAAiC;AACjC,6BAA6B;AAE7B,MAAa,SAAS;IACpB,oBAAoB;IAEpB,YACS,UAAkB,EAClB,SAAiB,EACjB,SAAiB,EACjB,QAAgB,EAChB,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,cAAuB,EACvB,WAAoB,EACpB,OAAgB,EAChB,UAAmB;QAV1B;;;;mBAAO,UAAU;WAAQ;QACzB;;;;mBAAO,SAAS;WAAQ;QACxB;;;;mBAAO,SAAS;WAAQ;QACxB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,IAAI;WAAQ;QACnB;;;;mBAAO,cAAc;WAAS;QAC9B;;;;mBAAO,WAAW;WAAS;QAC3B;;;;mBAAO,OAAO;WAAS;QACvB;;;;mBAAO,UAAU;WAAS;IACzB,CAAC;IAEJ,MAAM,CAAC,OAAO,CAAC,GAAW;QACxB,uCAAuC;QACvC,yBAAyB;QACzB,yBAAyB;QACzB,qEAAqE;QAErE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YACnB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;SACd,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,IAAA,eAAK,EAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE;YAC5C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;gBACtB,MAAc,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aAClD;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;gBAC7B,MAAc,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACvD;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;gBAC/B,MAAc,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1C;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;gBAClC,MAAc,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACrD;SACF;QACD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GACpE,MAAM,CAAC;QAET,OAAO,IAAI,SAAS,CAClB,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,IAAI,EACH,MAAc,CAAC,iBAAiB,CAAC,EACjC,MAAc,CAAC,cAAc,CAAC,EAC9B,MAAc,CAAC,SAAS,CAAC,EACzB,MAAc,CAAC,YAAY,CAAC,CAC9B,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,KAAgB;QAC1B,MAAM;QACN,qEAAqE;QACrE,qEAAqE;QACrE,mBAAmB;QACnB,MAAM;QACN,MAAM,CAAC,GAAG,IAAA,YAAM,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,IAAA,YAAM,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,CACL,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;YAClC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;YAC9D,CAAC,KAAK,CAAC,CACR,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAE/H,IAAI,IAAI,CAAC,cAAc;YAAE,GAAG,IAAI,UAAU,IAAI,CAAC,cAAc,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,WAAW,IAAI,SAAS;YAAE,GAAG,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,OAAO;YAAE,GAAG,IAAI,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,UAAU,IAAI,SAAS;YAAE,GAAG,IAAI,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QAE1E,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA1FD,8BA0FC;AAED,SAAgB,mBAAmB,CACjC,aAAqB,EACrB,kBAA0B,EAC1B,WAAmB;IAEnB,MAAM;IACN,gDAAgD;IAChD,MAAM;IACN,MAAM,GAAG,GAAG,GAAG,aAAa,IAAI,kBAAkB,IAAI,WAAW,EAAE,CAAC;IAEpE,OAAO,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAXD,kDAWC;AAED,eAAe;AACf,SAAgB,iBAAiB,CAC/B,kBAA0B,EAC1B,aAAqB,EACrB,SAAS,GAAG,KAAK;IAEjB,8CAA8C;IAC9C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,aAAa,KAAK,MAAM,EAAE;QAC5B,QAAQ,GAAG,GAAG,CAAC;KAChB;SAAM,IAAI,aAAa,KAAK,OAAO,EAAE;QACpC,QAAQ,GAAG,GAAG,CAAC;KAChB;SAAM,IAAI,aAAa,KAAK,OAAO,EAAE;QACpC,QAAQ,GAAG,GAAG,CAAC;KAChB;SAAM;QACL,QAAQ,GAAG,CAAC,CAAC;KACd;IACD,OAAO,CACL,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG,kBAAkB,CAAC,CACzE,CAAC;AACJ,CAAC;AAnBD,8CAmBC","sourcesContent":["import { createHash } from \"crypto\";\nimport range from \"lodash/range\";\nimport { isIPv4 } from \"net\";\n\nexport class Candidate {\n // An ICE candidate.\n\n constructor(\n public foundation: string,\n public component: number,\n public transport: string,\n public priority: number,\n public host: string,\n public port: number,\n public type: string,\n public relatedAddress?: string,\n public relatedPort?: number,\n public tcptype?: string,\n public generation?: number\n ) {}\n\n static fromSdp(sdp: string) {\n // Parse a :class:`Candidate` from SDP.\n // .. code-block:: python\n // Candidate.from_sdp(\n // '6815297761 1 udp 659136 1.2.3.4 31102 typ host generation 0')\n\n const bits = sdp.split(\" \");\n if (bits.length < 8) throw new Error(\"SDP does not have enough properties\");\n\n const kwargs = {\n foundation: bits[0],\n component: Number(bits[1]),\n transport: bits[2],\n priority: Number(bits[3]),\n host: bits[4],\n port: Number(bits[5]),\n type: bits[7],\n };\n\n for (const i of range(8, bits.length - 1, 2)) {\n if (bits[i] === \"raddr\") {\n (kwargs as any)[\"related_address\"] = bits[i + 1];\n } else if (bits[i] === \"rport\") {\n (kwargs as any)[\"related_port\"] = Number(bits[i + 1]);\n } else if (bits[i] === \"tcptype\") {\n (kwargs as any)[\"tcptype\"] = bits[i + 1];\n } else if (bits[i] === \"generation\") {\n (kwargs as any)[\"generation\"] = Number(bits[i + 1]);\n }\n }\n const { foundation, component, transport, priority, host, port, type } =\n kwargs;\n\n return new Candidate(\n foundation,\n component,\n transport,\n priority,\n host,\n port,\n type,\n (kwargs as any)[\"related_address\"],\n (kwargs as any)[\"related_port\"],\n (kwargs as any)[\"tcptype\"],\n (kwargs as any)[\"generation\"]\n );\n }\n\n canPairWith(other: Candidate) {\n // \"\"\"\n // A local candidate is paired with a remote candidate if and only if\n // the two candidates have the same component ID and have the same IP\n // address version.\n // \"\"\"\n const a = isIPv4(this.host);\n const b = isIPv4(other.host);\n return (\n this.component === other.component &&\n this.transport.toLowerCase() === other.transport.toLowerCase() &&\n a === b\n );\n }\n\n toSdp() {\n let sdp = `${this.foundation} ${this.component} ${this.transport} ${this.priority} ${this.host} ${this.port} typ ${this.type}`;\n\n if (this.relatedAddress) sdp += ` raddr ${this.relatedAddress}`;\n if (this.relatedPort != undefined) sdp += ` rport ${this.relatedPort}`;\n if (this.tcptype) sdp += ` tcptype ${this.tcptype}`;\n if (this.generation != undefined) sdp += ` generation ${this.generation}`;\n\n return sdp;\n }\n}\n\nexport function candidateFoundation(\n candidateType: string,\n candidateTransport: string,\n baseAddress: string\n) {\n // \"\"\"\n // See RFC 5245 - 4.1.1.3. Computing Foundations\n // \"\"\"\n const key = `${candidateType}|${candidateTransport}|${baseAddress}`;\n\n return createHash(\"md5\").update(key, \"ascii\").digest(\"hex\").slice(7);\n}\n\n// priorityを決める\nexport function candidatePriority(\n candidateComponent: number,\n candidateType: string,\n localPref = 65535\n) {\n // See RFC 5245 - 4.1.2.1. Recommended Formula\n let typePref = 0;\n if (candidateType === \"host\") {\n typePref = 126;\n } else if (candidateType === \"prflx\") {\n typePref = 110;\n } else if (candidateType === \"srflx\") {\n typePref = 100;\n } else {\n typePref = 0;\n }\n return (\n (1 << 24) * typePref + (1 << 8) * localPref + (256 - candidateComponent)\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../../../ice/src/exceptions.ts"],"names":[],"mappings":";;;AAGA,MAAa,gBAAiB,SAAQ,KAAK;IAA3C;;QACE;;;;;WAAmB;QACnB;;;;;WAAe;IACjB,CAAC;CAAA;AAHD,4CAGC;AAED,MAAa,iBAAkB,SAAQ,gBAAgB;IACrD,YAAmB,QAAiB,EAAS,IAAa;QACxD,KAAK,EAAE,CAAC;;;;;mBADS;;;;;;mBAA0B;;IAE7C,CAAC;IAED,IAAI,GAAG;QACL,IAAI,GAAG,GAAG,yBAAyB,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,SAAS,EAAE;YACb,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;YAC9B,GAAG,IAAI,KAAK,IAAI,MAAM,GAAG,GAAG,CAAC;SAC9B;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAdD,8CAcC;AAED,MAAa,kBAAmB,SAAQ,gBAAgB;IACtD,IAAI,GAAG;QACL,OAAO,4BAA4B,CAAC;IACtC,CAAC;CACF;AAJD,gDAIC","sourcesContent":["import { Message } from \"./stun/message\";\nimport { Address } from \"./types/model\";\n\nexport class TransactionError extends Error {\n response?: Message;\n addr?: Address;\n}\n\nexport class TransactionFailed extends TransactionError {\n constructor(public response: Message, public addr: Address) {\n super();\n }\n\n get str() {\n let out = \"STUN transaction failed\";\n const attribute = this.response.getAttributeValue(\"ERROR-CODE\");\n if (attribute) {\n const [code, msg] = attribute;\n out += ` (${code} - ${msg})`;\n }\n return out;\n }\n}\n\nexport class TransactionTimeout extends TransactionError {\n get str() {\n return \"STUN transaction timed out\";\n }\n}\n"]}
1
+ {"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../../../ice/src/exceptions.ts"],"names":[],"mappings":";;;AAGA,MAAa,gBAAiB,SAAQ,KAAK;IAA3C;;QACE;;;;;WAAmB;QACnB;;;;;WAAe;IACjB,CAAC;CAAA;AAHD,4CAGC;AAED,MAAa,iBAAkB,SAAQ,gBAAgB;IACrD,YAAmB,QAAiB,EAAS,IAAa;QACxD,KAAK,EAAE,CAAC;QADE;;;;mBAAO,QAAQ;WAAS;QAAE;;;;mBAAO,IAAI;WAAS;IAE1D,CAAC;IAED,IAAI,GAAG;QACL,IAAI,GAAG,GAAG,yBAAyB,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,SAAS,EAAE;YACb,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;YAC9B,GAAG,IAAI,KAAK,IAAI,MAAM,GAAG,GAAG,CAAC;SAC9B;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAdD,8CAcC;AAED,MAAa,kBAAmB,SAAQ,gBAAgB;IACtD,IAAI,GAAG;QACL,OAAO,4BAA4B,CAAC;IACtC,CAAC;CACF;AAJD,gDAIC","sourcesContent":["import { Message } from \"./stun/message\";\nimport { Address } from \"./types/model\";\n\nexport class TransactionError extends Error {\n response?: Message;\n addr?: Address;\n}\n\nexport class TransactionFailed extends TransactionError {\n constructor(public response: Message, public addr: Address) {\n super();\n }\n\n get str() {\n let out = \"STUN transaction failed\";\n const attribute = this.response.getAttributeValue(\"ERROR-CODE\");\n if (attribute) {\n const [code, msg] = attribute;\n out += ` (${code} - ${msg})`;\n }\n return out;\n }\n}\n\nexport class TransactionTimeout extends TransactionError {\n get str() {\n return \"STUN transaction timed out\";\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../ice/src/helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport PCancelable from \"p-cancelable\";\nimport { Event } from \"rx.mini\";\n\nconst log = debug(\"werift-ice:packages/ice/src/helper.ts\");\n\nexport function randomString(length: number) {\n return randomBytes(length).toString(\"hex\").substring(0, length);\n}\n\nexport function randomTransactionId() {\n return randomBytes(12);\n}\n\nexport function bufferXor(a: Buffer, b: Buffer): Buffer {\n if (a.length !== b.length) {\n throw new TypeError(\n \"[webrtc-stun] You can not XOR buffers which length are different\"\n );\n }\n\n const length = a.length;\n const buffer = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n buffer[i] = a[i] ^ b[i];\n }\n\n return buffer;\n}\n\nexport function difference<T>(x: Set<T>, y: Set<T>) {\n return new Set([...x].filter((e) => !y.has(e)));\n}\n\n// infinite size queue\nexport class PQueue<T> {\n private queue: Promise<T>[] = [];\n private wait = new Event<[Promise<T>]>();\n\n put(v: Promise<T>) {\n this.queue.push(v);\n if (this.queue.length === 1) {\n this.wait.execute(v);\n }\n }\n\n get(): Promise<T> {\n const v = this.queue.shift();\n if (!v) {\n return new Promise((r) => {\n this.wait.subscribe((v) => {\n this.queue.shift();\n r(v);\n });\n });\n }\n return v!;\n }\n}\n\nexport const future = (pCancel: PCancelable<any>) => {\n const state = { done: false };\n\n const cancel = () => pCancel.cancel();\n\n const done = () => state.done;\n\n pCancel\n .then(() => {\n state.done = true;\n })\n .catch((error) => {\n if (error !== \"cancel\") {\n log(\"future\", error);\n }\n });\n\n return { cancel, promise: pCancel, done };\n};\n\nexport type Future = ReturnType<typeof future>;\n"]}
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../../ice/src/helper.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport PCancelable from \"p-cancelable\";\nimport { Event } from \"rx.mini\";\n\nconst log = debug(\"werift-ice:packages/ice/src/helper.ts\");\n\nexport function randomString(length: number) {\n return randomBytes(length).toString(\"hex\").substring(0, length);\n}\n\nexport function randomTransactionId() {\n return randomBytes(12);\n}\n\nexport function bufferXor(a: Buffer, b: Buffer): Buffer {\n if (a.length !== b.length) {\n throw new TypeError(\n \"[webrtc-stun] You can not XOR buffers which length are different\"\n );\n }\n\n const length = a.length;\n const buffer = Buffer.allocUnsafe(length);\n\n for (let i = 0; i < length; i++) {\n buffer[i] = a[i] ^ b[i];\n }\n\n return buffer;\n}\n\nexport function difference<T>(x: Set<T>, y: Set<T>) {\n return new Set([...x].filter((e) => !y.has(e)));\n}\n\n// infinite size queue\nexport class PQueue<T> {\n private queue: Promise<T>[] = [];\n private wait = new Event<[Promise<T>]>();\n\n put(v: Promise<T>) {\n this.queue.push(v);\n if (this.queue.length === 1) {\n this.wait.execute(v);\n }\n }\n\n get(): Promise<T> {\n const v = this.queue.shift();\n if (!v) {\n return new Promise((r) => {\n this.wait.subscribe((v) => {\n this.queue.shift();\n r(v);\n });\n });\n }\n return v!;\n }\n}\n\nexport const future = (pCancel: PCancelable<any>) => {\n const state = { done: false };\n\n const cancel = () => pCancel.cancel();\n\n const done = () => state.done;\n\n pCancel\n .then(() => {\n state.done = true;\n })\n .catch((error) => {\n if (error !== \"cancel\") {\n log(\"future\", error);\n }\n });\n\n return { cancel, promise: pCancel, done };\n};\n\nexport type Future = ReturnType<typeof future>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { Uint64BE } from \"int64-buffer\";\nimport * as nodeIp from \"ip\";\nimport isEqual from \"lodash/isEqual\";\nimport range from \"lodash/range\";\nimport { isIPv4 } from \"net\";\nimport os from \"os\";\nimport PCancelable from \"p-cancelable\";\nimport { Event } from \"rx.mini\";\nimport timers from \"timers/promises\";\n\nimport { InterfaceAddresses } from \"../../common/src/network\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport { DnsLookup } from \"./dns/lookup\";\nimport { TransactionError } from \"./exceptions\";\nimport { difference, Future, future, PQueue, randomString } from \"./helper\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message, parseMessage } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { createTurnEndpoint } from \"./turn/protocol\";\nimport { Address, Protocol } from \"./types/model\";\nimport { normalizeFamilyNodeV18 } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection {\n localUserName = randomString(4);\n localPassword = randomString(22);\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n remoteIsLite = false;\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n useIpv4: boolean;\n useIpv6: boolean;\n options: IceOptions;\n remoteCandidatesEnd = false;\n /**コンポーネントはデータストリームの一部です. データストリームには複数のコンポーネントが必要な場合があり、\n * データストリーム全体が機能するには、それぞれが機能する必要があります.\n * RTP / RTCPデータストリームの場合、RTPとRTCPが同じポートで多重化されていない限り、データストリームごとに2つのコンポーネントがあります.\n * 1つはRTP用、もう1つはRTCP用です. コンポーネントには候補ペアがあり、他のコンポーネントでは使用できません. */\n _components: Set<number>;\n _localCandidatesEnd = false;\n _tieBreaker: BigInt = BigInt(new Uint64BE(randomBytes(64)).toString());\n state: IceState = \"new\";\n dnsLookup?: DnsLookup;\n\n readonly onData = new Event<[Buffer, number]>();\n readonly stateChanged = new Event<[IceState]>();\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n private nominated: { [componentId: number]: CandidatePair } = {};\n get nominatedKeys() {\n return Object.keys(this.nominated).map((v) => v.toString());\n }\n private nominating = new Set<number>();\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Future;\n private promiseGatherCandidates?: Event<[]>;\n\n constructor(public iceControlling: boolean, options?: Partial<IceOptions>) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n const { components, stunServer, turnServer, useIpv4, useIpv6 } =\n this.options;\n this.stunServer = validateAddress(stunServer);\n this.turnServer = validateAddress(turnServer);\n this.useIpv4 = useIpv4;\n this.useIpv6 = useIpv6;\n this._components = new Set(range(1, components + 1));\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates(cb?: (candidate: Candidate) => void) {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n this.promiseGatherCandidates = new Event();\n\n let address = getHostAddresses(this.useIpv4, this.useIpv6);\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check)\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address])\n );\n }\n\n for (const component of this._components) {\n const candidates = await this.getComponentCandidates(\n component,\n address,\n 5,\n cb\n );\n this.localCandidates = [...this.localCandidates, ...candidates];\n }\n\n this._localCandidatesEnd = true;\n this.promiseGatherCandidates.execute();\n }\n this.setState(\"completed\");\n }\n\n private async getComponentCandidates(\n component: number,\n addresses: string[],\n timeout = 5,\n cb?: (candidate: Candidate) => void\n ) {\n let candidates: Candidate[] = [];\n\n await Promise.allSettled(\n addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol(this);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses\n );\n } catch (error) {\n log(\"protocol STUN\", error);\n return;\n }\n\n protocol.localAddress = address;\n this.protocols.push(protocol);\n\n // # add host candidate\n const candidateAddress: Address = [address, protocol.getExtraInfo()[1]];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n component,\n \"udp\",\n candidatePriority(component, \"host\"),\n candidateAddress[0],\n candidateAddress[1],\n \"host\"\n );\n\n candidates.push(protocol.localCandidate);\n if (cb) {\n cb(protocol.localCandidate);\n }\n })\n );\n\n let candidatePromises: Promise<Candidate | void>[] = [];\n\n // # query STUN server for server-reflexive candidates (IPv4 only)\n const { stunServer, turnServer } = this;\n if (stunServer) {\n const stunPromises = this.protocols.map((protocol) =>\n new Promise<Candidate | void>(async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer\n ).catch((error) => log(\"error\", error));\n if (candidate && cb) cb(candidate);\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n }).catch((error) => {\n log(\"query STUN server\", error);\n })\n );\n candidatePromises.push(...stunPromises);\n }\n\n const { turnUsername, turnPassword } = this.options;\n if (turnServer && turnUsername && turnPassword) {\n const turnCandidate = (async () => {\n const protocol = await createTurnEndpoint(\n turnServer,\n turnUsername,\n turnPassword,\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n }\n );\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n component,\n \"udp\",\n candidatePriority(component, \"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1]\n );\n if (cb) {\n cb(protocol.localCandidate);\n }\n protocol.receiver = this;\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n if (this.options.forceTurn) {\n candidates = [];\n candidatePromises = [];\n }\n\n candidatePromises.push(turnCandidate);\n }\n\n const extraCandidates = [...(await Promise.allSettled(candidatePromises))]\n .filter(\n (\n v\n ): v is PromiseFulfilledResult<\n Awaited<typeof candidatePromises[number]>\n > => v.status === \"fulfilled\"\n )\n .map((v) => v.value)\n .filter((v): v is Candidate => typeof v !== \"undefined\");\n\n candidates.push(...extraCandidates);\n\n return candidates;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\", this.localCandidates);\n if (!this._localCandidatesEnd) {\n if (!this.localCandidatesStart)\n throw new Error(\"Local candidates gathering was not performed\");\n if (this.promiseGatherCandidates)\n // wait for GatherCandidates finish\n await this.promiseGatherCandidates.asPromise();\n }\n if (!this.remoteUsername || !this.remotePassword)\n throw new Error(\"Remote username or password is missing\");\n\n // # 5.7.1. Forming Candidate Pairs\n this.remoteCandidates.forEach(this.pairRemoteCandidate);\n this.sortCheckList();\n\n this.unfreezeInitial();\n\n // # handle early checks\n this.earlyChecks.forEach((earlyCheck) => this.checkIncoming(...earlyCheck));\n this.earlyChecks = [];\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n }\n\n // # cancel remaining checks\n this.checkList.forEach((check) => check.handle?.cancel());\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsentHandle = future(this.queryConsent());\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const firstPair = this.checkList.find(\n (pair) => pair.component === Math.min(...[...this._components])\n );\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n this.setPairState(firstPair, CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n this.setPairState(pair, CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (this.options.forceTurn && pair.protocol.type === \"stun\")\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = future(this.checkStart(pair));\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN\n );\n if (pair) {\n pair.handle = future(this.checkStart(pair));\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () =>\n new PCancelable(async (r, f, onCancel) => {\n let failures = 0;\n\n const cancelEvent = new AbortController();\n onCancel(() => {\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n f(\"cancel\");\n });\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (!this.remoteIsLite && this.state !== \"closed\") {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal }\n );\n\n for (const key of this.nominatedKeys) {\n const pair = this.nominated[Number(key)];\n const request = this.buildRequest(pair, false);\n try {\n const [msg, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0\n );\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n // 切断検知\n r(await this.close());\n return;\n }\n }\n }\n } catch (error) {}\n });\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n if (this.queryConsentHandle && !this.queryConsentHandle.done()) {\n this.queryConsentHandle.cancel();\n try {\n await this.queryConsentHandle.promise;\n } catch (error) {\n // pass\n }\n }\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n })\n );\n }\n\n this.nominated = {};\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n await this.dnsLookup?.close();\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.pruneComponents();\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (this.state === \"closed\") return;\n if (!this.dnsLookup) {\n this.dnsLookup = new DnsLookup();\n }\n const host = await this.dnsLookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this.remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n // \"\"\"\n // Send a datagram on the first component.\n\n // If the connection is not established, a `ConnectionError` is raised.\n\n // :param data: The data to be sent.\n // \"\"\"\n await this.sendTo(data, 1);\n };\n\n private async sendTo(data: Buffer, component: number) {\n // \"\"\"\n // Send a datagram on the specified component.\n\n // If the connection is not established, a `ConnectionError` is raised.\n\n // :param data: The data to be sent.\n // :param component: The component on which to send the data.\n // \"\"\"\n const activePair = this.nominated[component];\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n }\n\n getDefaultCandidate(component: number) {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority\n );\n const candidate = candidates.find(\n (candidate) => candidate.component === component\n );\n return candidate;\n }\n\n requestReceived(\n message: Message,\n addr: Address,\n protocol: Protocol,\n rawData: Buffer\n ) {\n if (message.messageMethod !== methods.BINDING) {\n this.respondError(message, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n // # authenticate request\n try {\n parseMessage(rawData, Buffer.from(this.localPassword, \"utf8\"));\n if (!this.remoteUsername) {\n const rxUsername = `${this.localUserName}:${this.remoteUsername}`;\n if (message.getAttributeValue(\"USERNAME\") != rxUsername) {\n throw new Error(\"Wrong username\");\n }\n }\n } catch (error) {\n this.respondError(message, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && message.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this._tieBreaker >= message.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(message, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n message.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (this._tieBreaker < message.getAttributeValue(\"ICE-CONTROLLED\")) {\n this.respondError(message, addr, protocol, [487, \"Role Conflict\"]);\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(message, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n message.transactionId\n );\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n // todo fix\n // if (this.checkList.length === 0) {\n // this.earlyChecks.push([message, addr, protocol]);\n // } else {\n this.checkIncoming(message, addr, protocol);\n // }\n }\n\n dataReceived(data: Buffer, component: number) {\n try {\n this.onData.execute(data, component);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this.remoteCandidates.push(remoteCandidate);\n }\n this.pruneComponents();\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n private pruneComponents() {\n const seenComponents = new Set(\n this.remoteCandidates.map((v) => v.component)\n );\n const missingComponents = [...difference(this._components, seenComponents)];\n if (missingComponents.length > 0) {\n this._components = seenComponents;\n }\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate)\n );\n return pair;\n }\n\n private setPairState(pair: CandidatePair, state: CandidatePairState) {\n log(\"setPairState\", pair.toJSON(), CandidatePairState[state]);\n pair.updateState(state);\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = {};\n this.nominating.clear();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (pair.nominated && this.nominated[pair.component] == undefined) {\n log(\"nominated\", pair.toJSON());\n this.nominated[pair.component] = pair;\n this.nominating.delete(pair.component);\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state\n )\n ) {\n this.setPairState(p, CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominatedKeys.length === this._components.size) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n this.setPairState(p, CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n })\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n new PCancelable(async (r, f, onCancel) => {\n onCancel(() => f(\"cancel\"));\n\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n this.setPairState(pair, CandidatePairState.IN_PROGRESS);\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest(pair, nominate);\n\n const result: { response?: Message; addr?: Address } = {};\n try {\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 4\n );\n log(\"response\", response, addr);\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\"failure case\", exc.response);\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair);\n r();\n return;\n } else {\n // timeout\n log(\"CandidatePairState.FAILED\", pair.toJSON());\n this.setPairState(pair, CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n this.setPairState(pair, CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating.has(pair.component)) {\n // # perform regular nomination\n this.nominating.add(pair.component);\n const request = this.buildRequest(pair, true);\n try {\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\")\n );\n } catch (error) {\n this.setPairState(pair, CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n this.setPairState(pair, CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // log(\"checkIncoming\", message.toJSON(), addr);\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n const component = protocol.localCandidate?.component;\n if (component == undefined) {\n throw new Error(\"component not exist\");\n }\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n if (remoteCandidate.component !== component) {\n throw new Error(\"checkIncoming\");\n }\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n component,\n \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\"\n );\n this.remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate);\n this.setPairState(pair, CandidatePairState.WAITING);\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state\n )\n ) {\n pair.handle = future(this.checkStart(pair));\n } else {\n pair;\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(protocol, remoteCandidate);\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n continue;\n }\n this.checkList.push(pair);\n this.setPairState(pair, CandidatePairState.WAITING);\n }\n }\n };\n\n private buildRequest(pair: CandidatePair, nominate: boolean) {\n const txUsername = `${this.remoteUsername}:${this.localUserName}`;\n const request = new Message(methods.BINDING, classes.REQUEST);\n request\n .setAttribute(\"USERNAME\", txUsername)\n .setAttribute(\"PRIORITY\", candidatePriority(pair.component, \"prflx\"));\n if (this.iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this._tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this._tieBreaker);\n }\n return request;\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string]\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nexport class CandidatePair {\n handle?: Future;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n toJSON() {\n return {\n protocol: this.protocol.type,\n remoteAddr: this.remoteAddr,\n };\n }\n\n constructor(public protocol: Protocol, public remoteCandidate: Candidate) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate)\n throw new Error(\"localCandidate not exist\");\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n}\n\nconst ICE_COMPLETED = 1 as const;\nconst ICE_FAILED = 2 as const;\n\nconst CONSENT_INTERVAL = 5;\nconst CONSENT_FAILURES = 6;\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\ntype IceState = \"disconnected\" | \"closed\" | \"completed\" | \"new\" | \"connected\";\n\nexport interface IceOptions {\n components: number;\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnSsl?: boolean;\n turnTransport?: string;\n forceTurn?: boolean;\n useIpv4: boolean;\n useIpv6: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nconst defaultOptions: IceOptions = {\n components: 1,\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: CandidatePair[],\n iceControlling: boolean\n) {\n pairs.sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling\n ) -\n candidatePairPriority(b.localCandidate, b.remoteCandidate, iceControlling)\n );\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Candidate,\n remote: Candidate,\n iceControlling: boolean\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nfunction isAutoconfigurationAddress(info: os.NetworkInterfaceInfo) {\n return (\n normalizeFamilyNodeV18(info.family) === 4 &&\n info.address?.startsWith(\"169.254.\")\n );\n}\n\nfunction nodeIpAddress(family: number): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n\n const interfaces = os.networkInterfaces();\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [],\n };\n }\n }\n const addresses = interfaces[nic]!.filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !nodeIp.isLoopback(details.address) &&\n !isAutoconfigurationAddress(details)\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all)\n .map((entry) => entry.addresses)\n .flat();\n}\n\nexport function getHostAddresses(useIpv4: boolean, useIpv6: boolean) {\n const address: string[] = [];\n if (useIpv4) address.push(...nodeIpAddress(4));\n if (useIpv6) address.push(...nodeIpAddress(6));\n return address;\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) throw new Error(\"not exist\");\n\n return new Candidate(\n candidateFoundation(\"srflx\", \"udp\", localCandidate.host),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(localCandidate.component, \"srflx\"),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port\n );\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}
1
+ {"version":3,"file":"ice.js","sourceRoot":"","sources":["../../../../ice/src/ice.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { Uint64BE } from \"int64-buffer\";\nimport * as nodeIp from \"ip\";\nimport isEqual from \"lodash/isEqual\";\nimport range from \"lodash/range\";\nimport { isIPv4 } from \"net\";\nimport os from \"os\";\nimport PCancelable from \"p-cancelable\";\nimport { Event } from \"rx.mini\";\nimport timers from \"timers/promises\";\n\nimport { InterfaceAddresses } from \"../../common/src/network\";\nimport { Candidate, candidateFoundation, candidatePriority } from \"./candidate\";\nimport { DnsLookup } from \"./dns/lookup\";\nimport { TransactionError } from \"./exceptions\";\nimport { difference, Future, future, PQueue, randomString } from \"./helper\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message, parseMessage } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { createTurnEndpoint } from \"./turn/protocol\";\nimport { Address, Protocol } from \"./types/model\";\nimport { normalizeFamilyNodeV18 } from \"./utils\";\n\nconst log = debug(\"werift-ice : packages/ice/src/ice.ts : log\");\n\nexport class Connection {\n localUserName = randomString(4);\n localPassword = randomString(22);\n remotePassword: string = \"\";\n remoteUsername: string = \"\";\n remoteIsLite = false;\n checkList: CandidatePair[] = [];\n localCandidates: Candidate[] = [];\n stunServer?: Address;\n turnServer?: Address;\n useIpv4: boolean;\n useIpv6: boolean;\n options: IceOptions;\n remoteCandidatesEnd = false;\n /**コンポーネントはデータストリームの一部です. データストリームには複数のコンポーネントが必要な場合があり、\n * データストリーム全体が機能するには、それぞれが機能する必要があります.\n * RTP / RTCPデータストリームの場合、RTPとRTCPが同じポートで多重化されていない限り、データストリームごとに2つのコンポーネントがあります.\n * 1つはRTP用、もう1つはRTCP用です. コンポーネントには候補ペアがあり、他のコンポーネントでは使用できません. */\n _components: Set<number>;\n _localCandidatesEnd = false;\n _tieBreaker: BigInt = BigInt(new Uint64BE(randomBytes(64)).toString());\n state: IceState = \"new\";\n dnsLookup?: DnsLookup;\n\n readonly onData = new Event<[Buffer, number]>();\n readonly stateChanged = new Event<[IceState]>();\n\n private _remoteCandidates: Candidate[] = [];\n // P2P接続完了したソケット\n private nominated: { [componentId: number]: CandidatePair } = {};\n get nominatedKeys() {\n return Object.keys(this.nominated).map((v) => v.toString());\n }\n private nominating = new Set<number>();\n private checkListDone = false;\n private checkListState = new PQueue<number>();\n private earlyChecks: [Message, Address, Protocol][] = [];\n private localCandidatesStart = false;\n private protocols: Protocol[] = [];\n private queryConsentHandle?: Future;\n private promiseGatherCandidates?: Event<[]>;\n\n constructor(public iceControlling: boolean, options?: Partial<IceOptions>) {\n this.options = {\n ...defaultOptions,\n ...options,\n };\n const { components, stunServer, turnServer, useIpv4, useIpv6 } =\n this.options;\n this.stunServer = validateAddress(stunServer);\n this.turnServer = validateAddress(turnServer);\n this.useIpv4 = useIpv4;\n this.useIpv6 = useIpv6;\n this._components = new Set(range(1, components + 1));\n }\n\n setRemoteParams({\n iceLite,\n usernameFragment,\n password,\n }: {\n iceLite: boolean;\n usernameFragment: string;\n password: string;\n }) {\n log(\"setRemoteParams\", { iceLite, usernameFragment, password });\n this.remoteIsLite = iceLite;\n this.remoteUsername = usernameFragment;\n this.remotePassword = password;\n }\n\n // 4.1.1 Gathering Candidates\n async gatherCandidates(cb?: (candidate: Candidate) => void) {\n if (!this.localCandidatesStart) {\n this.localCandidatesStart = true;\n this.promiseGatherCandidates = new Event();\n\n let address = getHostAddresses(this.useIpv4, this.useIpv6);\n const { interfaceAddresses } = this.options;\n if (interfaceAddresses) {\n const filteredAddresses = address.filter((check) =>\n Object.values(interfaceAddresses).includes(check)\n );\n if (filteredAddresses.length) {\n address = filteredAddresses;\n }\n }\n if (this.options.additionalHostAddresses) {\n address = Array.from(\n new Set([...this.options.additionalHostAddresses, ...address])\n );\n }\n\n for (const component of this._components) {\n const candidates = await this.getComponentCandidates(\n component,\n address,\n 5,\n cb\n );\n this.localCandidates = [...this.localCandidates, ...candidates];\n }\n\n this._localCandidatesEnd = true;\n this.promiseGatherCandidates.execute();\n }\n this.setState(\"completed\");\n }\n\n private async getComponentCandidates(\n component: number,\n addresses: string[],\n timeout = 5,\n cb?: (candidate: Candidate) => void\n ) {\n let candidates: Candidate[] = [];\n\n await Promise.allSettled(\n addresses.map(async (address) => {\n // # create transport\n const protocol = new StunProtocol(this);\n try {\n await protocol.connectionMade(\n isIPv4(address),\n this.options.portRange,\n this.options.interfaceAddresses\n );\n } catch (error) {\n log(\"protocol STUN\", error);\n return;\n }\n\n protocol.localAddress = address;\n this.protocols.push(protocol);\n\n // # add host candidate\n const candidateAddress: Address = [address, protocol.getExtraInfo()[1]];\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"host\", \"udp\", candidateAddress[0]),\n component,\n \"udp\",\n candidatePriority(component, \"host\"),\n candidateAddress[0],\n candidateAddress[1],\n \"host\"\n );\n\n candidates.push(protocol.localCandidate);\n if (cb) {\n cb(protocol.localCandidate);\n }\n })\n );\n\n let candidatePromises: Promise<Candidate | void>[] = [];\n\n // # query STUN server for server-reflexive candidates (IPv4 only)\n const { stunServer, turnServer } = this;\n if (stunServer) {\n const stunPromises = this.protocols.map((protocol) =>\n new Promise<Candidate | void>(async (r, f) => {\n const timer = setTimeout(f, timeout * 1000);\n if (\n protocol.localCandidate?.host &&\n isIPv4(protocol.localCandidate?.host)\n ) {\n const candidate = await serverReflexiveCandidate(\n protocol,\n stunServer\n ).catch((error) => log(\"error\", error));\n if (candidate && cb) cb(candidate);\n\n clearTimeout(timer);\n r(candidate);\n } else {\n clearTimeout(timer);\n r();\n }\n }).catch((error) => {\n log(\"query STUN server\", error);\n })\n );\n candidatePromises.push(...stunPromises);\n }\n\n const { turnUsername, turnPassword } = this.options;\n if (turnServer && turnUsername && turnPassword) {\n const turnCandidate = (async () => {\n const protocol = await createTurnEndpoint(\n turnServer,\n turnUsername,\n turnPassword,\n {\n portRange: this.options.portRange,\n interfaceAddresses: this.options.interfaceAddresses,\n }\n );\n this.protocols.push(protocol);\n\n const candidateAddress = protocol.turn.relayedAddress;\n const relatedAddress = protocol.turn.mappedAddress;\n\n log(\"turn candidateAddress\", candidateAddress);\n\n protocol.localCandidate = new Candidate(\n candidateFoundation(\"relay\", \"udp\", candidateAddress[0]),\n component,\n \"udp\",\n candidatePriority(component, \"relay\"),\n candidateAddress[0],\n candidateAddress[1],\n \"relay\",\n relatedAddress[0],\n relatedAddress[1]\n );\n if (cb) {\n cb(protocol.localCandidate);\n }\n protocol.receiver = this;\n return protocol.localCandidate;\n })().catch((error) => {\n log(\"query TURN server\", error);\n });\n\n if (this.options.forceTurn) {\n candidates = [];\n candidatePromises = [];\n }\n\n candidatePromises.push(turnCandidate);\n }\n\n const extraCandidates = [...(await Promise.allSettled(candidatePromises))]\n .filter(\n (\n v\n ): v is PromiseFulfilledResult<\n Awaited<typeof candidatePromises[number]>\n > => v.status === \"fulfilled\"\n )\n .map((v) => v.value)\n .filter((v): v is Candidate => typeof v !== \"undefined\");\n\n candidates.push(...extraCandidates);\n\n return candidates;\n }\n\n async connect() {\n // \"\"\"\n // Perform ICE handshake.\n //\n // This coroutine returns if a candidate pair was successfully nominated\n // and raises an exception otherwise.\n // \"\"\"\n log(\"start connect ice\", this.localCandidates);\n if (!this._localCandidatesEnd) {\n if (!this.localCandidatesStart)\n throw new Error(\"Local candidates gathering was not performed\");\n if (this.promiseGatherCandidates)\n // wait for GatherCandidates finish\n await this.promiseGatherCandidates.asPromise();\n }\n if (!this.remoteUsername || !this.remotePassword)\n throw new Error(\"Remote username or password is missing\");\n\n // # 5.7.1. Forming Candidate Pairs\n this.remoteCandidates.forEach(this.pairRemoteCandidate);\n this.sortCheckList();\n\n this.unfreezeInitial();\n\n // # handle early checks\n this.earlyChecks.forEach((earlyCheck) => this.checkIncoming(...earlyCheck));\n this.earlyChecks = [];\n\n // # perform checks\n // 5.8. Scheduling Checks\n for (;;) {\n if (this.state === \"closed\") break;\n if (!this.schedulingChecks()) break;\n await timers.setTimeout(20);\n }\n\n // # wait for completion\n let res: number = ICE_FAILED;\n while (this.checkList.length > 0 && res === ICE_FAILED) {\n res = await this.checkListState.get();\n }\n\n // # cancel remaining checks\n this.checkList.forEach((check) => check.handle?.cancel());\n\n if (res !== ICE_COMPLETED) {\n throw new Error(\"ICE negotiation failed\");\n }\n\n // # start consent freshness tests\n this.queryConsentHandle = future(this.queryConsent());\n\n this.setState(\"connected\");\n }\n\n private unfreezeInitial() {\n // # unfreeze first pair for the first component\n const firstPair = this.checkList.find(\n (pair) => pair.component === Math.min(...[...this._components])\n );\n if (!firstPair) return;\n if (firstPair.state === CandidatePairState.FROZEN) {\n this.setPairState(firstPair, CandidatePairState.WAITING);\n }\n\n // # unfreeze pairs with same component but different foundations\n const seenFoundations = new Set(firstPair.localCandidate.foundation);\n for (const pair of this.checkList) {\n if (\n pair.component === firstPair.component &&\n !seenFoundations.has(pair.localCandidate.foundation) &&\n pair.state === CandidatePairState.FROZEN\n ) {\n this.setPairState(pair, CandidatePairState.WAITING);\n seenFoundations.add(pair.localCandidate.foundation);\n }\n }\n }\n\n // 5.8 Scheduling Checks\n private schedulingChecks() {\n // Ordinary Check\n {\n // # find the highest-priority pair that is in the waiting state\n const pair = this.checkList\n .filter((pair) => {\n if (this.options.forceTurn && pair.protocol.type === \"stun\")\n return false;\n return true;\n })\n .find((pair) => pair.state === CandidatePairState.WAITING);\n if (pair) {\n pair.handle = future(this.checkStart(pair));\n return true;\n }\n }\n\n {\n // # find the highest-priority pair that is in the frozen state\n const pair = this.checkList.find(\n (pair) => pair.state === CandidatePairState.FROZEN\n );\n if (pair) {\n pair.handle = future(this.checkStart(pair));\n return true;\n }\n }\n\n // # if we expect more candidates, keep going\n if (!this.remoteCandidatesEnd) {\n return !this.checkListDone;\n }\n\n return false;\n }\n\n // 4.1.1.4 ? 生存確認 life check\n private queryConsent = () =>\n new PCancelable(async (r, f, onCancel) => {\n let failures = 0;\n\n const cancelEvent = new AbortController();\n onCancel(() => {\n failures += CONSENT_FAILURES;\n cancelEvent.abort();\n f(\"cancel\");\n });\n\n // \"\"\"\n // Periodically check consent (RFC 7675).\n // \"\"\"\n\n try {\n while (!this.remoteIsLite && this.state !== \"closed\") {\n // # randomize between 0.8 and 1.2 times CONSENT_INTERVAL\n await timers.setTimeout(\n CONSENT_INTERVAL * (0.8 + 0.4 * Math.random()) * 1000,\n undefined,\n { signal: cancelEvent.signal }\n );\n\n for (const key of this.nominatedKeys) {\n const pair = this.nominated[Number(key)];\n const request = this.buildRequest(pair, false);\n try {\n const [msg, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 0\n );\n failures = 0;\n if (this.state === \"disconnected\") {\n this.setState(\"connected\");\n }\n } catch (error) {\n log(\"no stun response\");\n failures++;\n this.setState(\"disconnected\");\n }\n if (failures >= CONSENT_FAILURES) {\n log(\"Consent to send expired\");\n this.queryConsentHandle = undefined;\n // 切断検知\n r(await this.close());\n return;\n }\n }\n }\n } catch (error) {}\n });\n\n async close() {\n // \"\"\"\n // Close the connection.\n // \"\"\"\n\n this.setState(\"closed\");\n\n // # stop consent freshness tests\n if (this.queryConsentHandle && !this.queryConsentHandle.done()) {\n this.queryConsentHandle.cancel();\n try {\n await this.queryConsentHandle.promise;\n } catch (error) {\n // pass\n }\n }\n\n // # stop check list\n if (this.checkList && !this.checkListDone) {\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n })\n );\n }\n\n this.nominated = {};\n for (const protocol of this.protocols) {\n if (protocol.close) {\n await protocol.close();\n }\n }\n\n this.protocols = [];\n this.localCandidates = [];\n\n await this.dnsLookup?.close();\n }\n\n private setState(state: IceState) {\n this.state = state;\n this.stateChanged.execute(state);\n }\n\n async addRemoteCandidate(remoteCandidate: Candidate | undefined) {\n // \"\"\"\n // Add a remote candidate or signal end-of-candidates.\n\n // To signal end-of-candidates, pass `None`.\n\n // :param remote_candidate: A :class:`Candidate` instance or `None`.\n // \"\"\"\n\n if (!remoteCandidate) {\n this.pruneComponents();\n this.remoteCandidatesEnd = true;\n return;\n }\n\n if (remoteCandidate.host.includes(\".local\")) {\n try {\n if (this.state === \"closed\") return;\n if (!this.dnsLookup) {\n this.dnsLookup = new DnsLookup();\n }\n const host = await this.dnsLookup.lookup(remoteCandidate.host);\n remoteCandidate.host = host;\n } catch (error) {\n return;\n }\n }\n\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n return;\n }\n\n log(\"addRemoteCandidate\", remoteCandidate);\n this.remoteCandidates.push(remoteCandidate);\n\n this.pairRemoteCandidate(remoteCandidate);\n this.sortCheckList();\n }\n\n send = async (data: Buffer) => {\n // \"\"\"\n // Send a datagram on the first component.\n\n // If the connection is not established, a `ConnectionError` is raised.\n\n // :param data: The data to be sent.\n // \"\"\"\n await this.sendTo(data, 1);\n };\n\n private async sendTo(data: Buffer, component: number) {\n // \"\"\"\n // Send a datagram on the specified component.\n\n // If the connection is not established, a `ConnectionError` is raised.\n\n // :param data: The data to be sent.\n // :param component: The component on which to send the data.\n // \"\"\"\n const activePair = this.nominated[component];\n if (activePair) {\n await activePair.protocol.sendData(data, activePair.remoteAddr);\n } else {\n // log(\"Cannot send data, ice not connected\");\n return;\n }\n }\n\n getDefaultCandidate(component: number) {\n const candidates = this.localCandidates.sort(\n (a, b) => a.priority - b.priority\n );\n const candidate = candidates.find(\n (candidate) => candidate.component === component\n );\n return candidate;\n }\n\n requestReceived(\n message: Message,\n addr: Address,\n protocol: Protocol,\n rawData: Buffer\n ) {\n if (message.messageMethod !== methods.BINDING) {\n this.respondError(message, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n // # authenticate request\n try {\n parseMessage(rawData, Buffer.from(this.localPassword, \"utf8\"));\n if (!this.remoteUsername) {\n const rxUsername = `${this.localUserName}:${this.remoteUsername}`;\n if (message.getAttributeValue(\"USERNAME\") != rxUsername) {\n throw new Error(\"Wrong username\");\n }\n }\n } catch (error) {\n this.respondError(message, addr, protocol, [400, \"Bad Request\"]);\n return;\n }\n\n const { iceControlling } = this;\n\n // 7.2.1.1. Detecting and Repairing Role Conflicts\n if (iceControlling && message.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n if (this._tieBreaker >= message.getAttributeValue(\"ICE-CONTROLLING\")) {\n this.respondError(message, addr, protocol, [487, \"Role Conflict\"]);\n return;\n } else {\n this.switchRole(false);\n }\n } else if (\n !iceControlling &&\n message.attributesKeys.includes(\"ICE-CONTROLLED\")\n ) {\n if (this._tieBreaker < message.getAttributeValue(\"ICE-CONTROLLED\")) {\n this.respondError(message, addr, protocol, [487, \"Role Conflict\"]);\n } else {\n this.switchRole(true);\n return;\n }\n }\n\n if (\n this.options.filterStunResponse &&\n !this.options.filterStunResponse(message, addr, protocol)\n ) {\n return;\n }\n\n // # send binding response\n const response = new Message(\n methods.BINDING,\n classes.RESPONSE,\n message.transactionId\n );\n response\n .setAttribute(\"XOR-MAPPED-ADDRESS\", addr)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n\n // todo fix\n // if (this.checkList.length === 0) {\n // this.earlyChecks.push([message, addr, protocol]);\n // } else {\n this.checkIncoming(message, addr, protocol);\n // }\n }\n\n dataReceived(data: Buffer, component: number) {\n try {\n this.onData.execute(data, component);\n } catch (error) {\n log(\"dataReceived\", error);\n }\n }\n\n // for test only\n set remoteCandidates(value: Candidate[]) {\n if (this.remoteCandidatesEnd)\n throw new Error(\"Cannot set remote candidates after end-of-candidates.\");\n this._remoteCandidates = [];\n for (const remoteCandidate of value) {\n try {\n validateRemoteCandidate(remoteCandidate);\n } catch (error) {\n continue;\n }\n this.remoteCandidates.push(remoteCandidate);\n }\n this.pruneComponents();\n this.remoteCandidatesEnd = true;\n }\n get remoteCandidates() {\n return this._remoteCandidates;\n }\n\n private pruneComponents() {\n const seenComponents = new Set(\n this.remoteCandidates.map((v) => v.component)\n );\n const missingComponents = [...difference(this._components, seenComponents)];\n if (missingComponents.length > 0) {\n this._components = seenComponents;\n }\n }\n\n private sortCheckList() {\n sortCandidatePairs(this.checkList, this.iceControlling);\n }\n\n private findPair(protocol: Protocol, remoteCandidate: Candidate) {\n const pair = this.checkList.find(\n (pair) =>\n isEqual(pair.protocol, protocol) &&\n isEqual(pair.remoteCandidate, remoteCandidate)\n );\n return pair;\n }\n\n private setPairState(pair: CandidatePair, state: CandidatePairState) {\n log(\"setPairState\", pair.toJSON(), CandidatePairState[state]);\n pair.updateState(state);\n }\n\n private switchRole(iceControlling: boolean) {\n log(\"switch role\", iceControlling);\n this.iceControlling = iceControlling;\n this.sortCheckList();\n }\n\n resetNominatedPair() {\n log(\"resetNominatedPair\");\n this.nominated = {};\n this.nominating.clear();\n }\n\n private checkComplete(pair: CandidatePair) {\n pair.handle = undefined;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n // Updating the Nominated Flag\n\n // https://www.rfc-editor.org/rfc/rfc8445#section-7.3.1.5,\n // Once the nominated flag is set for a component of a data stream, it\n // concludes the ICE processing for that component. See Section 8.\n // So disallow overwriting of the pair nominated for that component\n if (pair.nominated && this.nominated[pair.component] == undefined) {\n log(\"nominated\", pair.toJSON());\n this.nominated[pair.component] = pair;\n this.nominating.delete(pair.component);\n\n // 8.1.2. Updating States\n\n // The agent MUST remove all Waiting and Frozen pairs in the check\n // list and triggered check queue for the same component as the\n // nominated pairs for that media stream.\n for (const p of this.checkList) {\n if (\n p.component === pair.component &&\n [CandidatePairState.WAITING, CandidatePairState.FROZEN].includes(\n p.state\n )\n ) {\n this.setPairState(p, CandidatePairState.FAILED);\n }\n }\n }\n\n // Once there is at least one nominated pair in the valid list for\n // every component of at least one media stream and the state of the\n // check list is Running:\n if (this.nominatedKeys.length === this._components.size) {\n if (!this.checkListDone) {\n log(\"ICE completed\");\n this.checkListState.put(new Promise((r) => r(ICE_COMPLETED)));\n this.checkListDone = true;\n }\n return;\n }\n\n // 7.1.3.2.3. Updating Pair States\n for (const p of this.checkList) {\n if (\n p.localCandidate.foundation === pair.localCandidate.foundation &&\n p.state === CandidatePairState.FROZEN\n ) {\n this.setPairState(p, CandidatePairState.WAITING);\n }\n }\n }\n\n {\n const list = [CandidatePairState.SUCCEEDED, CandidatePairState.FAILED];\n if (this.checkList.find(({ state }) => !list.includes(state))) {\n return;\n }\n }\n\n if (!this.iceControlling) {\n const target = CandidatePairState.SUCCEEDED;\n if (this.checkList.find(({ state }) => state === target)) {\n return;\n }\n }\n\n if (!this.checkListDone) {\n log(\"ICE failed\");\n this.checkListState.put(\n new Promise((r) => {\n r(ICE_FAILED);\n })\n );\n }\n }\n\n // 3. Terminology : Check\n checkStart = (pair: CandidatePair) =>\n new PCancelable(async (r, f, onCancel) => {\n onCancel(() => f(\"cancel\"));\n\n // \"\"\"\n // Starts a check.\n // \"\"\"\n\n log(\"check start\", pair.toJSON());\n\n this.setPairState(pair, CandidatePairState.IN_PROGRESS);\n\n const nominate = this.iceControlling && !this.remoteIsLite;\n const request = this.buildRequest(pair, nominate);\n\n const result: { response?: Message; addr?: Address } = {};\n try {\n const [response, addr] = await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\"),\n 4\n );\n log(\"response\", response, addr);\n result.response = response;\n result.addr = addr;\n } catch (error: any) {\n const exc: TransactionError = error;\n // 7.1.3.1. Failure Cases\n log(\"failure case\", exc.response);\n if (exc.response?.getAttributeValue(\"ERROR-CODE\")[0] === 487) {\n if (request.attributesKeys.includes(\"ICE-CONTROLLED\")) {\n this.switchRole(true);\n } else if (request.attributesKeys.includes(\"ICE-CONTROLLING\")) {\n this.switchRole(false);\n }\n await this.checkStart(pair);\n r();\n return;\n } else {\n // timeout\n log(\"CandidatePairState.FAILED\", pair.toJSON());\n this.setPairState(pair, CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n }\n\n // # check remote address matches\n if (!isEqual(result.addr, pair.remoteAddr)) {\n this.setPairState(pair, CandidatePairState.FAILED);\n this.checkComplete(pair);\n r();\n return;\n }\n\n // # success\n if (nominate || pair.remoteNominated) {\n // # nominated by agressive nomination or the remote party\n pair.nominated = true;\n } else if (this.iceControlling && !this.nominating.has(pair.component)) {\n // # perform regular nomination\n this.nominating.add(pair.component);\n const request = this.buildRequest(pair, true);\n try {\n await pair.protocol.request(\n request,\n pair.remoteAddr,\n Buffer.from(this.remotePassword, \"utf8\")\n );\n } catch (error) {\n this.setPairState(pair, CandidatePairState.FAILED);\n this.checkComplete(pair);\n return;\n }\n pair.nominated = true;\n }\n\n this.setPairState(pair, CandidatePairState.SUCCEEDED);\n this.checkComplete(pair);\n r();\n });\n\n // 7.2. STUN Server Procedures\n // 7.2.1.3、7.2.1.4、および7.2.1.5\n checkIncoming(message: Message, addr: Address, protocol: Protocol) {\n // log(\"checkIncoming\", message.toJSON(), addr);\n // \"\"\"\n // Handle a successful incoming check.\n // \"\"\"\n const component = protocol.localCandidate?.component;\n if (component == undefined) {\n throw new Error(\"component not exist\");\n }\n\n // find remote candidate\n let remoteCandidate: Candidate | undefined;\n const [host, port] = addr;\n for (const c of this.remoteCandidates) {\n if (c.host === host && c.port === port) {\n remoteCandidate = c;\n if (remoteCandidate.component !== component) {\n throw new Error(\"checkIncoming\");\n }\n break;\n }\n }\n if (!remoteCandidate) {\n // 7.2.1.3. Learning Peer Reflexive Candidates\n remoteCandidate = new Candidate(\n randomString(10),\n component,\n \"udp\",\n message.getAttributeValue(\"PRIORITY\"),\n host,\n port,\n \"prflx\"\n );\n this.remoteCandidates.push(remoteCandidate);\n }\n\n // find pair\n let pair = this.findPair(protocol, remoteCandidate);\n if (!pair) {\n pair = new CandidatePair(protocol, remoteCandidate);\n this.setPairState(pair, CandidatePairState.WAITING);\n this.checkList.push(pair);\n this.sortCheckList();\n }\n\n // 7.2.1.4. Triggered Checks\n if (\n [CandidatePairState.WAITING, CandidatePairState.FAILED].includes(\n pair.state\n )\n ) {\n pair.handle = future(this.checkStart(pair));\n } else {\n pair;\n }\n\n // 7.2.1.5. Updating the Nominated Flag\n if (\n message.attributesKeys.includes(\"USE-CANDIDATE\") &&\n !this.iceControlling\n ) {\n pair.remoteNominated = true;\n if (pair.state === CandidatePairState.SUCCEEDED) {\n pair.nominated = true;\n this.checkComplete(pair);\n }\n }\n }\n\n private pairRemoteCandidate = (remoteCandidate: Candidate) => {\n for (const protocol of this.protocols) {\n if (\n protocol.localCandidate?.canPairWith(remoteCandidate) &&\n !this.findPair(protocol, remoteCandidate)\n ) {\n const pair = new CandidatePair(protocol, remoteCandidate);\n if (\n this.options.filterCandidatePair &&\n !this.options.filterCandidatePair(pair)\n ) {\n continue;\n }\n this.checkList.push(pair);\n this.setPairState(pair, CandidatePairState.WAITING);\n }\n }\n };\n\n private buildRequest(pair: CandidatePair, nominate: boolean) {\n const txUsername = `${this.remoteUsername}:${this.localUserName}`;\n const request = new Message(methods.BINDING, classes.REQUEST);\n request\n .setAttribute(\"USERNAME\", txUsername)\n .setAttribute(\"PRIORITY\", candidatePriority(pair.component, \"prflx\"));\n if (this.iceControlling) {\n request.setAttribute(\"ICE-CONTROLLING\", this._tieBreaker);\n if (nominate) {\n request.setAttribute(\"USE-CANDIDATE\", null);\n }\n } else {\n request.setAttribute(\"ICE-CONTROLLED\", this._tieBreaker);\n }\n return request;\n }\n\n private respondError(\n request: Message,\n addr: Address,\n protocol: Protocol,\n errorCode: [number, string]\n ) {\n const response = new Message(\n request.messageMethod,\n classes.ERROR,\n request.transactionId\n );\n response\n .setAttribute(\"ERROR-CODE\", errorCode)\n .addMessageIntegrity(Buffer.from(this.localPassword, \"utf8\"))\n .addFingerprint();\n protocol.sendStun(response, addr).catch((e) => {\n log(\"sendStun error\", e);\n });\n }\n}\n\nexport class CandidatePair {\n handle?: Future;\n nominated = false;\n remoteNominated = false;\n // 5.7.4. Computing States\n private _state = CandidatePairState.FROZEN;\n get state() {\n return this._state;\n }\n\n toJSON() {\n return {\n protocol: this.protocol.type,\n remoteAddr: this.remoteAddr,\n };\n }\n\n constructor(public protocol: Protocol, public remoteCandidate: Candidate) {}\n\n updateState(state: CandidatePairState) {\n this._state = state;\n }\n\n get localCandidate() {\n if (!this.protocol.localCandidate)\n throw new Error(\"localCandidate not exist\");\n return this.protocol.localCandidate;\n }\n\n get remoteAddr(): Address {\n return [this.remoteCandidate.host, this.remoteCandidate.port];\n }\n\n get component() {\n return this.localCandidate.component;\n }\n}\n\nconst ICE_COMPLETED = 1 as const;\nconst ICE_FAILED = 2 as const;\n\nconst CONSENT_INTERVAL = 5;\nconst CONSENT_FAILURES = 6;\n\nexport enum CandidatePairState {\n FROZEN = 0,\n WAITING = 1,\n IN_PROGRESS = 2,\n SUCCEEDED = 3,\n FAILED = 4,\n}\n\ntype IceState = \"disconnected\" | \"closed\" | \"completed\" | \"new\" | \"connected\";\n\nexport interface IceOptions {\n components: number;\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnSsl?: boolean;\n turnTransport?: string;\n forceTurn?: boolean;\n useIpv4: boolean;\n useIpv6: boolean;\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n additionalHostAddresses?: string[];\n filterStunResponse?: (\n message: Message,\n addr: Address,\n protocol: Protocol\n ) => boolean;\n filterCandidatePair?: (pair: CandidatePair) => boolean;\n}\n\nconst defaultOptions: IceOptions = {\n components: 1,\n useIpv4: true,\n useIpv6: true,\n};\n\nexport function validateRemoteCandidate(candidate: Candidate) {\n // \"\"\"\n // Check the remote candidate is supported.\n // \"\"\"\n if (![\"host\", \"relay\", \"srflx\"].includes(candidate.type))\n throw new Error(`Unexpected candidate type \"${candidate.type}\"`);\n\n // ipaddress.ip_address(candidate.host)\n return candidate;\n}\n\nexport function sortCandidatePairs(\n pairs: CandidatePair[],\n iceControlling: boolean\n) {\n pairs.sort(\n (a, b) =>\n candidatePairPriority(\n a.localCandidate,\n a.remoteCandidate,\n iceControlling\n ) -\n candidatePairPriority(b.localCandidate, b.remoteCandidate, iceControlling)\n );\n}\n\n// 5.7.2. Computing Pair Priority and Ordering Pairs\nexport function candidatePairPriority(\n local: Candidate,\n remote: Candidate,\n iceControlling: boolean\n) {\n const G = (iceControlling && local.priority) || remote.priority;\n const D = (iceControlling && remote.priority) || local.priority;\n return (1 << 32) * Math.min(G, D) + 2 * Math.max(G, D) + (G > D ? 1 : 0);\n}\n\nfunction isAutoconfigurationAddress(info: os.NetworkInterfaceInfo) {\n return (\n normalizeFamilyNodeV18(info.family) === 4 &&\n info.address?.startsWith(\"169.254.\")\n );\n}\n\nfunction nodeIpAddress(family: number): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n\n const interfaces = os.networkInterfaces();\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [],\n };\n }\n }\n const addresses = interfaces[nic]!.filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !nodeIp.isLoopback(details.address) &&\n !isAutoconfigurationAddress(details)\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all)\n .map((entry) => entry.addresses)\n .flat();\n}\n\nexport function getHostAddresses(useIpv4: boolean, useIpv6: boolean) {\n const address: string[] = [];\n if (useIpv4) address.push(...nodeIpAddress(4));\n if (useIpv6) address.push(...nodeIpAddress(6));\n return address;\n}\n\nexport async function serverReflexiveCandidate(\n protocol: Protocol,\n stunServer: Address\n) {\n // \"\"\"\n // Query STUN server to obtain a server-reflexive candidate.\n // \"\"\"\n\n // # perform STUN query\n const request = new Message(methods.BINDING, classes.REQUEST);\n try {\n const [response] = await protocol.request(request, stunServer);\n\n const localCandidate = protocol.localCandidate;\n if (!localCandidate) throw new Error(\"not exist\");\n\n return new Candidate(\n candidateFoundation(\"srflx\", \"udp\", localCandidate.host),\n localCandidate.component,\n localCandidate.transport,\n candidatePriority(localCandidate.component, \"srflx\"),\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[0],\n response.getAttributeValue(\"XOR-MAPPED-ADDRESS\")[1],\n \"srflx\",\n localCandidate.host,\n localCandidate.port\n );\n } catch (error) {\n // todo fix\n log(\"error serverReflexiveCandidate\", error);\n }\n}\n\nexport function validateAddress(addr?: Address): Address | undefined {\n if (addr && isNaN(addr[1])) {\n return [addr[0], 443];\n }\n return addr;\n}\n"]}