werift 0.17.6 → 0.18.0

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 (338) hide show
  1. package/lib/common/src/binary.d.ts +1 -0
  2. package/lib/common/src/binary.js +74 -21
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/common/src/log.js +18 -0
  5. package/lib/common/src/log.js.map +1 -1
  6. package/lib/common/src/network.d.ts +1 -1
  7. package/lib/common/src/network.js +1 -0
  8. package/lib/common/src/network.js.map +1 -1
  9. package/lib/common/src/promise.js +22 -7
  10. package/lib/common/src/promise.js.map +1 -1
  11. package/lib/common/src/type.d.ts +1 -1
  12. package/lib/dtls/src/cipher/const.d.ts +7 -7
  13. package/lib/dtls/src/cipher/key-exchange.js +24 -1
  14. package/lib/dtls/src/cipher/key-exchange.js.map +1 -1
  15. package/lib/dtls/src/cipher/suites/abstract.d.ts +2 -2
  16. package/lib/dtls/src/cipher/suites/abstract.js +36 -2
  17. package/lib/dtls/src/cipher/suites/abstract.js.map +1 -1
  18. package/lib/dtls/src/cipher/suites/aead.js +60 -6
  19. package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
  20. package/lib/dtls/src/client.js +62 -51
  21. package/lib/dtls/src/client.js.map +1 -1
  22. package/lib/dtls/src/context/cipher.js +151 -59
  23. package/lib/dtls/src/context/cipher.js.map +1 -1
  24. package/lib/dtls/src/context/dtls.js +90 -14
  25. package/lib/dtls/src/context/dtls.js.map +1 -1
  26. package/lib/dtls/src/context/srtp.d.ts +1 -1
  27. package/lib/dtls/src/context/srtp.js +8 -0
  28. package/lib/dtls/src/context/srtp.js.map +1 -1
  29. package/lib/dtls/src/context/transport.js +14 -2
  30. package/lib/dtls/src/context/transport.js.map +1 -1
  31. package/lib/dtls/src/flight/client/flight1.js +6 -1
  32. package/lib/dtls/src/flight/client/flight1.js.map +1 -1
  33. package/lib/dtls/src/flight/client/flight5.js +12 -2
  34. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  35. package/lib/dtls/src/flight/flight.d.ts +1 -1
  36. package/lib/dtls/src/flight/flight.js +42 -7
  37. package/lib/dtls/src/flight/flight.js.map +1 -1
  38. package/lib/dtls/src/flight/server/flight2.js +4 -2
  39. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  40. package/lib/dtls/src/flight/server/flight4.js +12 -2
  41. package/lib/dtls/src/flight/server/flight4.js.map +1 -1
  42. package/lib/dtls/src/flight/server/flight6.js +6 -1
  43. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  44. package/lib/dtls/src/handshake/extensions/ellipticCurves.js +27 -7
  45. package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
  46. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +6 -1
  47. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
  48. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +27 -7
  49. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
  50. package/lib/dtls/src/handshake/extensions/signature.js +27 -7
  51. package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
  52. package/lib/dtls/src/handshake/extensions/useSrtp.js +39 -9
  53. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  54. package/lib/dtls/src/handshake/message/alert.js +21 -6
  55. package/lib/dtls/src/handshake/message/alert.js.map +1 -1
  56. package/lib/dtls/src/handshake/message/certificate.js +26 -5
  57. package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
  58. package/lib/dtls/src/handshake/message/changeCipherSpec.js +14 -4
  59. package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
  60. package/lib/dtls/src/handshake/message/client/certificateVerify.js +33 -7
  61. package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
  62. package/lib/dtls/src/handshake/message/client/hello.js +68 -18
  63. package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
  64. package/lib/dtls/src/handshake/message/client/keyExchange.js +26 -5
  65. package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
  66. package/lib/dtls/src/handshake/message/finished.js +18 -2
  67. package/lib/dtls/src/handshake/message/finished.js.map +1 -1
  68. package/lib/dtls/src/handshake/message/server/certificateRequest.js +40 -9
  69. package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
  70. package/lib/dtls/src/handshake/message/server/hello.js +60 -14
  71. package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
  72. package/lib/dtls/src/handshake/message/server/helloDone.js +18 -2
  73. package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
  74. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +33 -7
  75. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
  76. package/lib/dtls/src/handshake/message/server/keyExchange.js +75 -19
  77. package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
  78. package/lib/dtls/src/handshake/random.js +21 -6
  79. package/lib/dtls/src/handshake/random.js.map +1 -1
  80. package/lib/dtls/src/record/builder.d.ts +1 -1
  81. package/lib/dtls/src/record/message/fragment.js +49 -14
  82. package/lib/dtls/src/record/message/fragment.js.map +1 -1
  83. package/lib/dtls/src/record/message/header.js +84 -24
  84. package/lib/dtls/src/record/message/header.js.map +1 -1
  85. package/lib/dtls/src/record/message/plaintext.js +21 -6
  86. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  87. package/lib/dtls/src/server.js +59 -42
  88. package/lib/dtls/src/server.js.map +1 -1
  89. package/lib/dtls/src/socket.js +153 -64
  90. package/lib/dtls/src/socket.js.map +1 -1
  91. package/lib/dtls/src/transport.js +38 -11
  92. package/lib/dtls/src/transport.js.map +1 -1
  93. package/lib/dtls/src/typings/domain.d.ts +4 -4
  94. package/lib/ice/src/candidate.js +66 -11
  95. package/lib/ice/src/candidate.js.map +1 -1
  96. package/lib/ice/src/dns/lookup.js +12 -1
  97. package/lib/ice/src/dns/lookup.js.map +1 -1
  98. package/lib/ice/src/exceptions.js +27 -2
  99. package/lib/ice/src/exceptions.js.map +1 -1
  100. package/lib/ice/src/helper.d.ts +1 -1
  101. package/lib/ice/src/helper.js +12 -2
  102. package/lib/ice/src/helper.js.map +1 -1
  103. package/lib/ice/src/ice.d.ts +9 -3
  104. package/lib/ice/src/ice.js +407 -155
  105. package/lib/ice/src/ice.js.map +1 -1
  106. package/lib/ice/src/stun/attributes.d.ts +3 -3
  107. package/lib/ice/src/stun/attributes.js +6 -1
  108. package/lib/ice/src/stun/attributes.js.map +1 -1
  109. package/lib/ice/src/stun/message.d.ts +4 -0
  110. package/lib/ice/src/stun/message.js +24 -3
  111. package/lib/ice/src/stun/message.js.map +1 -1
  112. package/lib/ice/src/stun/protocol.js +64 -15
  113. package/lib/ice/src/stun/protocol.js.map +1 -1
  114. package/lib/ice/src/stun/transaction.js +99 -36
  115. package/lib/ice/src/stun/transaction.js.map +1 -1
  116. package/lib/ice/src/transport.js +57 -21
  117. package/lib/ice/src/transport.js.map +1 -1
  118. package/lib/ice/src/turn/protocol.js +176 -40
  119. package/lib/ice/src/turn/protocol.js.map +1 -1
  120. package/lib/ice/src/types/model.d.ts +1 -1
  121. package/lib/rtp/src/codec/av1.d.ts +1 -1
  122. package/lib/rtp/src/codec/av1.js +118 -30
  123. package/lib/rtp/src/codec/av1.js.map +1 -1
  124. package/lib/rtp/src/codec/base.js +8 -0
  125. package/lib/rtp/src/codec/base.js.map +1 -1
  126. package/lib/rtp/src/codec/h264.js +55 -0
  127. package/lib/rtp/src/codec/h264.js.map +1 -1
  128. package/lib/rtp/src/codec/index.d.ts +2 -0
  129. package/lib/rtp/src/codec/index.js +12 -2
  130. package/lib/rtp/src/codec/index.js.map +1 -1
  131. package/lib/rtp/src/codec/opus.js +8 -0
  132. package/lib/rtp/src/codec/opus.js.map +1 -1
  133. package/lib/rtp/src/codec/vp8.js +102 -3
  134. package/lib/rtp/src/codec/vp8.js.map +1 -1
  135. package/lib/rtp/src/codec/vp9.js +164 -7
  136. package/lib/rtp/src/codec/vp9.js.map +1 -1
  137. package/lib/rtp/src/container/ebml/ebml.js +30 -3
  138. package/lib/rtp/src/container/ebml/ebml.js.map +1 -1
  139. package/lib/rtp/src/container/webm.d.ts +1 -1
  140. package/lib/rtp/src/container/webm.js +44 -13
  141. package/lib/rtp/src/container/webm.js.map +1 -1
  142. package/lib/rtp/src/processor/depacketizer.d.ts +16 -8
  143. package/lib/rtp/src/processor/depacketizer.js +59 -22
  144. package/lib/rtp/src/processor/depacketizer.js.map +1 -1
  145. package/lib/rtp/src/processor/depacketizerCallback.js +24 -8
  146. package/lib/rtp/src/processor/depacketizerCallback.js.map +1 -1
  147. package/lib/rtp/src/processor/depacketizerTransformer.d.ts +2 -2
  148. package/lib/rtp/src/processor/depacketizerTransformer.js +6 -0
  149. package/lib/rtp/src/processor/depacketizerTransformer.js.map +1 -1
  150. package/lib/rtp/src/processor/index.d.ts +4 -2
  151. package/lib/rtp/src/processor/index.js +4 -2
  152. package/lib/rtp/src/processor/index.js.map +1 -1
  153. package/lib/rtp/src/processor/interface.d.ts +4 -0
  154. package/lib/rtp/src/processor/interface.js.map +1 -1
  155. package/lib/rtp/src/processor/jitterBuffer.d.ts +2 -1
  156. package/lib/rtp/src/processor/jitterBuffer.js +40 -8
  157. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  158. package/lib/rtp/src/processor/jitterBufferCallback.js +30 -9
  159. package/lib/rtp/src/processor/jitterBufferCallback.js.map +1 -1
  160. package/lib/rtp/src/processor/jitterBufferTransformer.js +12 -1
  161. package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -1
  162. package/lib/rtp/src/processor/lipsync.d.ts +42 -0
  163. package/lib/rtp/src/processor/lipsync.js +178 -0
  164. package/lib/rtp/src/processor/lipsync.js.map +1 -0
  165. package/lib/rtp/src/processor/lipsyncCallback.d.ts +10 -0
  166. package/lib/rtp/src/processor/lipsyncCallback.js +59 -0
  167. package/lib/rtp/src/processor/lipsyncCallback.js.map +1 -0
  168. package/lib/rtp/src/processor/ntpTime.d.ts +24 -0
  169. package/lib/rtp/src/processor/ntpTime.js +91 -0
  170. package/lib/rtp/src/processor/ntpTime.js.map +1 -0
  171. package/lib/rtp/src/processor/ntpTimeCallback.d.ts +7 -0
  172. package/lib/rtp/src/processor/ntpTimeCallback.js +36 -0
  173. package/lib/rtp/src/processor/ntpTimeCallback.js.map +1 -0
  174. package/lib/rtp/src/processor/source/index.d.ts +1 -0
  175. package/lib/rtp/src/processor/source/index.js +1 -0
  176. package/lib/rtp/src/processor/source/index.js.map +1 -1
  177. package/lib/rtp/src/processor/source/rtcpCallback.d.ts +12 -0
  178. package/lib/rtp/src/processor/source/rtcpCallback.js +33 -0
  179. package/lib/rtp/src/processor/source/rtcpCallback.js.map +1 -0
  180. package/lib/rtp/src/processor/source/rtpCallback.js +28 -12
  181. package/lib/rtp/src/processor/source/rtpCallback.js.map +1 -1
  182. package/lib/rtp/src/processor/source/rtpStream.js +38 -10
  183. package/lib/rtp/src/processor/source/rtpStream.js.map +1 -1
  184. package/lib/rtp/src/processor/webm.d.ts +11 -4
  185. package/lib/rtp/src/processor/webm.js +169 -46
  186. package/lib/rtp/src/processor/webm.js.map +1 -1
  187. package/lib/rtp/src/processor/webmCallback.d.ts +5 -3
  188. package/lib/rtp/src/processor/webmCallback.js +52 -8
  189. package/lib/rtp/src/processor/webmCallback.js.map +1 -1
  190. package/lib/rtp/src/processor/webmStream.d.ts +2 -2
  191. package/lib/rtp/src/processor/webmStream.js +24 -0
  192. package/lib/rtp/src/processor/webmStream.js.map +1 -1
  193. package/lib/rtp/src/processor_old/base.d.ts +18 -0
  194. package/lib/rtp/src/processor_old/base.js +51 -0
  195. package/lib/rtp/src/processor_old/base.js.map +1 -0
  196. package/lib/rtp/src/processor_old/lipsync.d.ts +30 -0
  197. package/lib/rtp/src/processor_old/lipsync.js +119 -0
  198. package/lib/rtp/src/processor_old/lipsync.js.map +1 -0
  199. package/lib/rtp/src/rtcp/header.js +30 -5
  200. package/lib/rtp/src/rtcp/header.js.map +1 -1
  201. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
  202. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +30 -3
  203. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
  204. package/lib/rtp/src/rtcp/psfb/index.d.ts +1 -1
  205. package/lib/rtp/src/rtcp/psfb/index.js +18 -2
  206. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  207. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +30 -3
  208. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
  209. package/lib/rtp/src/rtcp/psfb/remb.js +66 -5
  210. package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
  211. package/lib/rtp/src/rtcp/rr.js +68 -4
  212. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  213. package/lib/rtp/src/rtcp/rtcp.d.ts +1 -1
  214. package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
  215. package/lib/rtp/src/rtcp/rtpfb/index.js +24 -2
  216. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  217. package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +5 -0
  218. package/lib/rtp/src/rtcp/rtpfb/nack.js +43 -3
  219. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  220. package/lib/rtp/src/rtcp/rtpfb/twcc.js +154 -11
  221. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  222. package/lib/rtp/src/rtcp/sdes.js +42 -4
  223. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  224. package/lib/rtp/src/rtcp/sr.js +56 -5
  225. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  226. package/lib/rtp/src/rtp/red/encoder.js +18 -3
  227. package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
  228. package/lib/rtp/src/rtp/red/handler.js +12 -2
  229. package/lib/rtp/src/rtp/red/handler.js.map +1 -1
  230. package/lib/rtp/src/rtp/red/packet.js +18 -2
  231. package/lib/rtp/src/rtp/red/packet.js.map +1 -1
  232. package/lib/rtp/src/rtp/rtp.d.ts +3 -3
  233. package/lib/rtp/src/rtp/rtp.js +104 -17
  234. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  235. package/lib/rtp/src/srtp/cipher/ctr.js +26 -10
  236. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  237. package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -0
  238. package/lib/rtp/src/srtp/cipher/gcm.js +40 -20
  239. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  240. package/lib/rtp/src/srtp/cipher/index.js +24 -4
  241. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  242. package/lib/rtp/src/srtp/const.d.ts +1 -1
  243. package/lib/rtp/src/srtp/context/context.d.ts +1 -1
  244. package/lib/rtp/src/srtp/context/context.js +84 -5
  245. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  246. package/lib/rtp/src/srtp/session.d.ts +2 -2
  247. package/lib/rtp/src/srtp/session.js +24 -1
  248. package/lib/rtp/src/srtp/session.js.map +1 -1
  249. package/lib/rtp/src/srtp/srtcp.js +15 -5
  250. package/lib/rtp/src/srtp/srtcp.js.map +1 -1
  251. package/lib/rtp/src/srtp/srtp.js +15 -5
  252. package/lib/rtp/src/srtp/srtp.js.map +1 -1
  253. package/lib/sctp/src/chunk.js +349 -69
  254. package/lib/sctp/src/chunk.js.map +1 -1
  255. package/lib/sctp/src/helper.d.ts +1 -1
  256. package/lib/sctp/src/param.d.ts +3 -3
  257. package/lib/sctp/src/param.js +66 -11
  258. package/lib/sctp/src/param.js.map +1 -1
  259. package/lib/sctp/src/sctp.d.ts +1 -1
  260. package/lib/sctp/src/sctp.js +479 -138
  261. package/lib/sctp/src/sctp.js.map +1 -1
  262. package/lib/sctp/src/transport.js +31 -10
  263. package/lib/sctp/src/transport.js.map +1 -1
  264. package/lib/webrtc/src/dataChannel.d.ts +1 -1
  265. package/lib/webrtc/src/dataChannel.js +145 -15
  266. package/lib/webrtc/src/dataChannel.js.map +1 -1
  267. package/lib/webrtc/src/helper.js +37 -12
  268. package/lib/webrtc/src/helper.js.map +1 -1
  269. package/lib/webrtc/src/media/parameters.d.ts +1 -1
  270. package/lib/webrtc/src/media/parameters.js +124 -3
  271. package/lib/webrtc/src/media/parameters.js.map +1 -1
  272. package/lib/webrtc/src/media/receiver/nack.d.ts +4 -4
  273. package/lib/webrtc/src/media/receiver/nack.js +85 -33
  274. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  275. package/lib/webrtc/src/media/receiver/receiverTwcc.d.ts +1 -1
  276. package/lib/webrtc/src/media/receiver/receiverTwcc.js +42 -6
  277. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  278. package/lib/webrtc/src/media/receiver/statistics.js +61 -5
  279. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  280. package/lib/webrtc/src/media/router.d.ts +1 -1
  281. package/lib/webrtc/src/media/router.js +108 -83
  282. package/lib/webrtc/src/media/router.js.map +1 -1
  283. package/lib/webrtc/src/media/rtpReceiver.js +188 -33
  284. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  285. package/lib/webrtc/src/media/rtpSender.js +279 -42
  286. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  287. package/lib/webrtc/src/media/rtpTransceiver.d.ts +2 -2
  288. package/lib/webrtc/src/media/rtpTransceiver.js +102 -18
  289. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  290. package/lib/webrtc/src/media/sender/cumulativeResult.js +36 -6
  291. package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -1
  292. package/lib/webrtc/src/media/sender/senderBWE.js +57 -12
  293. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  294. package/lib/webrtc/src/media/track.js +135 -24
  295. package/lib/webrtc/src/media/track.js.map +1 -1
  296. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +7 -4
  297. package/lib/webrtc/src/nonstandard/recorder/index.js +50 -6
  298. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  299. package/lib/webrtc/src/nonstandard/recorder/writer/index.js +12 -2
  300. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  301. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +2 -2
  302. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +39 -35
  303. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  304. package/lib/webrtc/src/nonstandard/userMedia.js +158 -56
  305. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  306. package/lib/webrtc/src/peerConnection.d.ts +2 -2
  307. package/lib/webrtc/src/peerConnection.js +260 -58
  308. package/lib/webrtc/src/peerConnection.js.map +1 -1
  309. package/lib/webrtc/src/sdp.js +287 -24
  310. package/lib/webrtc/src/sdp.js.map +1 -1
  311. package/lib/webrtc/src/transport/dtls.d.ts +3 -3
  312. package/lib/webrtc/src/transport/dtls.js +185 -30
  313. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  314. package/lib/webrtc/src/transport/ice.d.ts +2 -2
  315. package/lib/webrtc/src/transport/ice.js +193 -25
  316. package/lib/webrtc/src/transport/ice.js.map +1 -1
  317. package/lib/webrtc/src/transport/sctp.js +193 -101
  318. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  319. package/lib/webrtc/src/types/domain.d.ts +3 -3
  320. package/lib/webrtc/src/types/util.d.ts +2 -2
  321. package/lib/webrtc/src/utils.js +12 -2
  322. package/lib/webrtc/src/utils.js.map +1 -1
  323. package/package.json +15 -15
  324. package/src/dataChannel.ts +3 -1
  325. package/src/media/receiver/nack.ts +23 -19
  326. package/src/media/rtpReceiver.ts +5 -0
  327. package/src/media/rtpSender.ts +22 -19
  328. package/src/nonstandard/recorder/index.ts +12 -4
  329. package/src/nonstandard/recorder/writer/webm.ts +42 -50
  330. package/src/transport/dtls.ts +7 -3
  331. package/src/transport/ice.ts +6 -3
  332. package/src/transport/sctp.ts +3 -1
  333. package/lib/rtp/src/processor/avBuffer.d.ts +0 -36
  334. package/lib/rtp/src/processor/avBuffer.js +0 -107
  335. package/lib/rtp/src/processor/avBuffer.js.map +0 -1
  336. package/lib/rtp/src/processor/avBufferCallback.d.ts +0 -10
  337. package/lib/rtp/src/processor/avBufferCallback.js +0 -27
  338. package/lib/rtp/src/processor/avBufferCallback.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport range from \"lodash/range\";\nimport { Event } from \"rx.mini\";\n\nimport {\n random32,\n uint16Add,\n uint16Gt,\n uint32Gt,\n uint32Gte,\n} from \"../../common/src\";\nimport {\n AbortChunk,\n Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n parsePacket,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n serializePacket,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { createEventsFromList, enumerate, Unpacked } from \"./helper\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n reconfigResult,\n StreamAddOutgoingParam,\n StreamParam,\n} from \"./param\";\nimport { Transport } from \"./transport\";\n\nconst log = debug(\"werift/sctp/sctp\");\n\n// SSN: Stream Sequence Number\n\n// # local constants\nconst COOKIE_LENGTH = 24;\nconst COOKIE_LIFETIME = 60;\nconst MAX_STREAMS = 65535;\nconst USERDATA_MAX_LENGTH = 1200;\n\n// # protocol constants\nconst SCTP_DATA_LAST_FRAG = 0x01;\nconst SCTP_DATA_FIRST_FRAG = 0x02;\nconst SCTP_DATA_UNORDERED = 0x04;\n\nconst SCTP_MAX_ASSOCIATION_RETRANS = 10;\nconst SCTP_MAX_INIT_RETRANS = 8;\nconst SCTP_RTO_ALPHA = 1 / 8;\nconst SCTP_RTO_BETA = 1 / 4;\nconst SCTP_RTO_INITIAL = 3;\nconst SCTP_RTO_MIN = 1;\nconst SCTP_RTO_MAX = 60;\nconst SCTP_TSN_MODULO = 2 ** 32;\n\nconst RECONFIG_MAX_STREAMS = 135;\n\n// # parameters\nconst SCTP_STATE_COOKIE = 0x0007;\nconst SCTP_SUPPORTED_CHUNK_EXT = 0x8008; //32778\nconst SCTP_PRSCTP_SUPPORTED = 0xc000; //49152\n\nconst SCTPConnectionStates = [\n \"new\",\n \"closed\",\n \"connected\",\n \"connecting\",\n] as const;\ntype SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;\n\nexport class SCTP {\n readonly stateChanged: {\n [key in SCTPConnectionState]: Event<[]>;\n } = createEventsFromList(SCTPConnectionStates);\n readonly onReconfigStreams = new Event<[number[]]>();\n /**streamId: number, ppId: number, data: Buffer */\n readonly onReceive = new Event<[number, number, Buffer]>();\n onSackReceived: () => Promise<void> = async () => {};\n\n associationState = SCTP_STATE.CLOSED;\n started = false;\n state: SCTPConnectionState = \"new\";\n isServer = true;\n\n private hmacKey = randomBytes(16);\n private localPartialReliability = true;\n private localPort = this.port;\n private localVerificationTag = random32();\n\n remoteExtensions: number[] = [];\n remotePartialReliability = true;\n private remotePort?: number;\n private remoteVerificationTag = 0;\n\n // inbound\n private advertisedRwnd = 1024 * 1024; // Receiver Window\n private inboundStreams: { [key: number]: InboundStream } = {};\n _inboundStreamsCount = 0;\n _inboundStreamsMax = MAX_STREAMS;\n private lastReceivedTsn?: number; // Transmission Sequence Number\n private sackDuplicates: number[] = [];\n private sackMisOrdered = new Set<number>();\n private sackNeeded = false;\n\n // # outbound\n private cwnd = 3 * USERDATA_MAX_LENGTH; // Congestion Window\n private fastRecoveryExit?: number;\n private fastRecoveryTransmit = false;\n private forwardTsnChunk?: ForwardTsnChunk;\n private flightSize = 0;\n outboundQueue: DataChunk[] = [];\n private outboundStreamSeq: { [streamId: number]: number } = {};\n _outboundStreamsCount = MAX_STREAMS;\n /**local transmission sequence number */\n private localTsn = Number(random32());\n private lastSackedTsn = tsnMinusOne(this.localTsn);\n private advancedPeerAckTsn = tsnMinusOne(this.localTsn); // acknowledgement\n private partialBytesAcked = 0;\n private sentQueue: DataChunk[] = [];\n\n // # reconfiguration\n\n /**初期TSNと同じ値に初期化される単調に増加する数です. これは、新しいre-configuration requestパラメーターを送信するたびに1ずつ増加します */\n reconfigRequestSeq = this.localTsn;\n /**このフィールドは、incoming要求のre-configuration requestシーケンス番号を保持します. 他の場合では、次に予想されるre-configuration requestシーケンス番号から1を引いた値が保持されます */\n reconfigResponseSeq = 0;\n reconfigRequest?: OutgoingSSNResetRequestParam;\n reconfigQueue: number[] = [];\n\n // rtt calculation\n private srtt?: number;\n private rttvar?: number;\n\n // timers\n private rto = SCTP_RTO_INITIAL;\n /**t1 is wait for initAck or cookieAck */\n private timer1Handle?: any;\n private timer1Chunk?: Chunk;\n private timer1Failures = 0;\n /**t2 is wait for shutdown */\n private timer2Handle?: any;\n private timer2Chunk?: Chunk;\n private timer2Failures = 0;\n /**t3 is wait for data sack */\n private timer3Handle?: any;\n /**Re-configuration Timer */\n private timerReconfigHandle?: any;\n private timerReconfigFailures = 0;\n\n // etc\n private ssthresh?: number; // slow start threshold\n\n constructor(public transport: Transport, public port = 5000) {\n this.transport.onData = (buf) => {\n this.handleData(buf);\n };\n }\n\n get maxChannels() {\n if (this._inboundStreamsCount > 0)\n return Math.min(this._inboundStreamsCount, this._outboundStreamsCount);\n }\n\n static client(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = false;\n return sctp;\n }\n\n static server(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = true;\n return sctp;\n }\n\n // call from dtls transport\n private async handleData(data: Buffer) {\n let expectedTag: number;\n\n const [, , verificationTag, chunks] = parsePacket(data);\n const initChunk = chunks.filter((v) => v.type === InitChunk.type).length;\n if (initChunk > 0) {\n if (chunks.length != 1) {\n throw new Error();\n }\n expectedTag = 0;\n } else {\n expectedTag = this.localVerificationTag;\n }\n\n if (verificationTag !== expectedTag) {\n return;\n }\n\n for (const chunk of chunks) {\n await this.receiveChunk(chunk);\n }\n\n if (this.sackNeeded) {\n await this.sendSack();\n }\n }\n\n private async sendSack() {\n const gaps: [number, number][] = [];\n let gapNext: number;\n [...this.sackMisOrdered].sort().forEach((tsn) => {\n const pos = (tsn - this.lastReceivedTsn!) % SCTP_TSN_MODULO;\n if (tsn === gapNext) {\n gaps[gaps.length - 1][1] = pos;\n } else {\n gaps.push([pos, pos]);\n }\n gapNext = tsnPlusOne(tsn);\n });\n const sack = new SackChunk(0, undefined);\n sack.cumulativeTsn = this.lastReceivedTsn!;\n sack.advertisedRwnd = Math.max(0, this.advertisedRwnd);\n sack.duplicates = [...this.sackDuplicates];\n sack.gaps = gaps;\n\n await this.sendChunk(sack).catch((err: Error) => {\n log(\"send sack failed\", err.message);\n });\n\n this.sackDuplicates = [];\n this.sackNeeded = false;\n }\n\n private async receiveChunk(chunk: Chunk) {\n switch (chunk.type) {\n case DataChunk.type:\n {\n this.receiveDataChunk(chunk as DataChunk);\n }\n break;\n case InitChunk.type:\n {\n if (!this.isServer) return;\n const init = chunk as InitChunk;\n\n log(\"receive init\", init);\n this.lastReceivedTsn = tsnMinusOne(init.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(init.initialTsn);\n this.remoteVerificationTag = init.initiateTag;\n this.ssthresh = init.advertisedRwnd;\n this.getExtensions(init.params);\n\n this._inboundStreamsCount = Math.min(\n init.outboundStreams,\n this._inboundStreamsMax\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n init.inboundStreams\n );\n\n const ack = new InitAckChunk();\n ack.initiateTag = this.localVerificationTag;\n ack.advertisedRwnd = this.advertisedRwnd;\n ack.outboundStreams = this._outboundStreamsCount;\n ack.inboundStreams = this._inboundStreamsCount;\n ack.initialTsn = this.localTsn;\n this.setExtensions(ack.params);\n\n const time = Date.now() / 1000;\n let cookie = Buffer.from(jspack.Pack(\"!L\", [time]));\n cookie = Buffer.concat([\n cookie,\n createHmac(\"sha1\", this.hmacKey).update(cookie).digest(),\n ]);\n ack.params.push([SCTP_STATE_COOKIE, cookie]);\n log(\"send initAck\", ack);\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send initAck failed\", err.message);\n });\n }\n break;\n case InitAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_WAIT) return;\n\n const initAck = chunk as InitAckChunk;\n this.timer1Cancel();\n this.lastReceivedTsn = tsnMinusOne(initAck.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(initAck.initialTsn);\n this.remoteVerificationTag = initAck.initiateTag;\n this.ssthresh = initAck.advertisedRwnd;\n this.getExtensions(initAck.params);\n\n this._inboundStreamsCount = Math.min(\n initAck.outboundStreams,\n this._inboundStreamsMax\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n initAck.inboundStreams\n );\n\n const echo = new CookieEchoChunk();\n for (const [k, v] of initAck.params) {\n if (k === SCTP_STATE_COOKIE) {\n echo.body = v;\n break;\n }\n }\n await this.sendChunk(echo).catch((err: Error) => {\n log(\"send echo failed\", err.message);\n });\n\n this.timer1Start(echo);\n this.setState(SCTP_STATE.COOKIE_ECHOED);\n }\n break;\n case SackChunk.type:\n {\n await this.receiveSackChunk(chunk as SackChunk);\n }\n break;\n case HeartbeatChunk.type:\n {\n const ack = new HeartbeatAckChunk();\n ack.params = (chunk as HeartbeatChunk).params;\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send heartbeat ack failed\", err.message);\n });\n }\n break;\n case AbortChunk.type:\n {\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n case ShutdownChunk.type:\n {\n this.timer2Cancel();\n this.setState(SCTP_STATE.SHUTDOWN_RECEIVED);\n const ack = new ShutdownAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send shutdown ack failed\", err.message);\n });\n this.t2Start(ack);\n this.setState(SCTP_STATE.SHUTDOWN_SENT);\n }\n break;\n case ErrorChunk.type:\n {\n // 3.3.10. Operation Error (ERROR) (9)\n // An Operation Error is not considered fatal in and of itself, but may be\n // used with an ABORT chunk to report a fatal condition. It has the\n // following parameters:\n log(\"ErrorChunk\", (chunk as ErrorChunk).descriptions);\n }\n break;\n case CookieEchoChunk.type:\n {\n if (!this.isServer) return;\n const data = chunk as CookieEchoChunk;\n const cookie = data.body!;\n const digest = createHmac(\"sha1\", this.hmacKey)\n .update(cookie.slice(0, 4))\n .digest();\n if (\n cookie?.length != COOKIE_LENGTH ||\n !cookie.slice(4).equals(digest)\n ) {\n log(\"x State cookie is invalid\");\n return;\n }\n const now = Date.now() / 1000;\n const stamp = jspack.Unpack(\"!L\", cookie)[0];\n if (stamp < now - COOKIE_LIFETIME || stamp > now) {\n const error = new ErrorChunk(0, undefined);\n error.params.push([\n ErrorChunk.CODE.StaleCookieError,\n Buffer.concat([...Array(8)].map(() => Buffer.from(\"\\x00\"))),\n ]);\n await this.sendChunk(error).catch((err: Error) => {\n log(\"send errorChunk failed\", err.message);\n });\n return;\n }\n const ack = new CookieAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send cookieAck failed\", err.message);\n });\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case CookieAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_ECHOED) return;\n this.timer1Cancel();\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case ShutdownCompleteChunk.type:\n {\n if (this.associationState != SCTP_STATE.SHUTDOWN_ACK_SENT) return;\n this.timer2Cancel();\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n // extensions\n case ReconfigChunk.type:\n {\n if (this.associationState != SCTP_STATE.ESTABLISHED) return;\n const reconfig = chunk as ReConfigChunk;\n for (const [type, body] of reconfig.params) {\n const target = RECONFIG_PARAM_BY_TYPES[type];\n if (target) {\n await this.receiveReconfigParam(target.parse(body));\n }\n }\n }\n break;\n case ForwardTsnChunk.type:\n {\n this.receiveForwardTsnChunk(chunk as ForwardTsnChunk);\n }\n break;\n }\n }\n\n private getExtensions(params: [number, Buffer][]) {\n for (const [k, v] of params) {\n if (k === SCTP_PRSCTP_SUPPORTED) {\n this.remotePartialReliability = true;\n } else if (k === SCTP_SUPPORTED_CHUNK_EXT) {\n this.remoteExtensions = [...v];\n }\n }\n }\n\n private async receiveReconfigParam(param: StreamParam) {\n log(\"receiveReconfigParam\", RECONFIG_PARAM_BY_TYPES[param.type]);\n switch (param.type) {\n case OutgoingSSNResetRequestParam.type:\n {\n const p = param as OutgoingSSNResetRequestParam;\n\n // # send response\n const response = new ReconfigResponseParam(\n p.requestSequence,\n reconfigResult.ReconfigResultSuccessPerformed\n );\n this.reconfigResponseSeq = p.requestSequence;\n await this.sendReconfigParam(response);\n\n // # mark closed inbound streams\n await Promise.all(\n p.streams.map(async (streamId) => {\n delete this.inboundStreams[streamId];\n if (this.outboundStreamSeq[streamId]) {\n this.reconfigQueue.push(streamId);\n // await this.sendResetRequest(streamId);\n }\n })\n );\n await this.transmitReconfigRequest();\n // # close data channel\n this.onReconfigStreams.execute(p.streams);\n }\n break;\n case ReconfigResponseParam.type:\n {\n const reset = param as ReconfigResponseParam;\n if (reset.result !== reconfigResult.ReconfigResultSuccessPerformed) {\n log(\n \"OutgoingSSNResetRequestParam failed\",\n Object.keys(reconfigResult).find(\n (key) => reconfigResult[key as never] === reset.result\n )\n );\n } else if (\n reset.responseSequence === this.reconfigRequest?.requestSequence\n ) {\n const streamIds = this.reconfigRequest.streams.map((streamId) => {\n delete this.outboundStreamSeq[streamId];\n return streamId;\n });\n\n this.onReconfigStreams.execute(streamIds);\n\n this.reconfigRequest = undefined;\n this.timerReconfigCancel();\n if (this.reconfigQueue.length > 0) {\n await this.transmitReconfigRequest();\n }\n }\n }\n break;\n case StreamAddOutgoingParam.type:\n {\n const add = param as StreamAddOutgoingParam;\n this._inboundStreamsCount += add.newStreams;\n const res = new ReconfigResponseParam(add.requestSequence, 1);\n this.reconfigResponseSeq = add.requestSequence;\n await this.sendReconfigParam(res);\n }\n break;\n }\n }\n\n private receiveDataChunk(chunk: DataChunk) {\n this.sackNeeded = true;\n\n if (this.markReceived(chunk.tsn)) return;\n\n const inboundStream = this.getInboundStream(chunk.streamId);\n\n inboundStream.addChunk(chunk);\n this.advertisedRwnd -= chunk.userData.length;\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n private async receiveSackChunk(chunk: SackChunk) {\n // \"\"\"\n // Handle a SACK chunk.\n // \"\"\"\n\n if (uint32Gt(this.lastSackedTsn, chunk.cumulativeTsn)) return;\n\n const receivedTime = Date.now() / 1000;\n this.lastSackedTsn = chunk.cumulativeTsn;\n const cwndFullyUtilized = this.flightSize >= this.cwnd;\n let done = 0,\n doneBytes = 0;\n\n // # handle acknowledged data\n while (\n this.sentQueue.length > 0 &&\n uint32Gte(this.lastSackedTsn, this.sentQueue[0].tsn)\n ) {\n const sChunk = this.sentQueue.shift()!;\n done++;\n if (!sChunk?.acked) {\n doneBytes += sChunk.bookSize;\n this.flightSizeDecrease(sChunk);\n }\n\n if (done === 1 && sChunk.sentCount === 1) {\n this.updateRto(receivedTime - sChunk.sentTime!);\n }\n }\n\n // # handle gap blocks\n let loss = false;\n if (chunk.gaps.length > 0) {\n const seen = new Set();\n let highestSeenTsn: number;\n chunk.gaps.forEach((gap) =>\n range(gap[0], gap[1] + 1).forEach((pos) => {\n highestSeenTsn = (chunk.cumulativeTsn + pos) % SCTP_TSN_MODULO;\n seen.add(highestSeenTsn);\n })\n );\n\n let highestNewlyAcked = chunk.cumulativeTsn;\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestSeenTsn!)) {\n break;\n }\n if (seen.has(sChunk.tsn) && !sChunk.acked) {\n doneBytes += sChunk.bookSize;\n sChunk.acked = true;\n this.flightSizeDecrease(sChunk);\n highestNewlyAcked = sChunk.tsn;\n }\n }\n\n // # strike missing chunks prior to HTNA\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestNewlyAcked)) {\n break;\n }\n if (!seen.has(sChunk.tsn)) {\n sChunk.misses++;\n if (sChunk.misses === 3) {\n sChunk.misses = 0;\n if (!this.maybeAbandon(sChunk)) {\n sChunk.retransmit = true;\n }\n sChunk.acked = false;\n this.flightSizeDecrease(sChunk);\n loss = true;\n }\n }\n }\n }\n\n // # adjust congestion window\n if (this.fastRecoveryExit === undefined) {\n if (done && cwndFullyUtilized) {\n if (this.cwnd <= this.ssthresh!) {\n this.cwnd += Math.min(doneBytes, USERDATA_MAX_LENGTH);\n } else {\n this.partialBytesAcked += doneBytes;\n if (this.partialBytesAcked >= this.cwnd) {\n this.partialBytesAcked -= this.cwnd;\n this.cwnd += USERDATA_MAX_LENGTH;\n }\n }\n }\n if (loss) {\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH\n );\n this.cwnd = this.ssthresh;\n this.partialBytesAcked = 0;\n this.fastRecoveryExit = this.sentQueue[this.sentQueue.length - 1].tsn;\n this.fastRecoveryTransmit = true;\n }\n } else if (uint32Gte(chunk.cumulativeTsn, this.fastRecoveryExit)) {\n this.fastRecoveryExit = undefined;\n }\n\n if (this.sentQueue.length === 0) {\n this.timer3Cancel();\n } else if (done > 0) {\n this.timer3Restart();\n }\n\n this.updateAdvancedPeerAckPoint();\n await this.onSackReceived();\n await this.transmit();\n }\n\n receiveForwardTsnChunk(chunk: ForwardTsnChunk) {\n this.sackNeeded = true;\n\n if (uint32Gte(this.lastReceivedTsn!, chunk.cumulativeTsn)) {\n return;\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n // # advance cumulative TSN\n this.lastReceivedTsn = chunk.cumulativeTsn;\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n // # filter out obsolete entries\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n // # update reassembly\n for (const [streamId, streamSeqNum] of chunk.streams) {\n const inboundStream = this.getInboundStream(streamId);\n\n // # advance sequence number and perform delivery\n inboundStream.streamSequenceNumber = uint16Add(streamSeqNum, 1);\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n // # prune obsolete chunks\n Object.values(this.inboundStreams).forEach((inboundStream) => {\n this.advertisedRwnd += inboundStream.pruneChunks(this.lastReceivedTsn!);\n });\n }\n\n private updateRto(R: number) {\n if (!this.srtt) {\n this.rttvar = R / 2;\n this.srtt = R;\n } else {\n this.rttvar =\n (1 - SCTP_RTO_BETA) * this.rttvar! +\n SCTP_RTO_BETA * Math.abs(this.srtt - R);\n this.srtt = (1 - SCTP_RTO_ALPHA) * this.srtt + SCTP_RTO_ALPHA * R;\n }\n this.rto = Math.max(\n SCTP_RTO_MIN,\n Math.min(this.srtt + 4 * this.rttvar, SCTP_RTO_MAX)\n );\n }\n\n private receive(streamId: number, ppId: number, data: Buffer) {\n this.onReceive.execute(streamId, ppId, data);\n }\n\n private getInboundStream(streamId: number) {\n if (!this.inboundStreams[streamId]) {\n this.inboundStreams[streamId] = new InboundStream();\n }\n return this.inboundStreams[streamId];\n }\n\n private markReceived(tsn: number) {\n if (uint32Gte(this.lastReceivedTsn!, tsn) || this.sackMisOrdered.has(tsn)) {\n this.sackDuplicates.push(tsn);\n return true;\n }\n\n this.sackMisOrdered.add(tsn);\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn!)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n return false;\n }\n\n send = async (\n streamId: number,\n ppId: number,\n userData: Buffer,\n {\n expiry,\n maxRetransmits,\n ordered,\n }: {\n expiry?: number | undefined;\n maxRetransmits?: number | undefined;\n ordered?: boolean;\n } = { expiry: undefined, maxRetransmits: undefined, ordered: true }\n ) => {\n const streamSeqNum = ordered ? this.outboundStreamSeq[streamId] || 0 : 0;\n\n const fragments = Math.ceil(userData.length / USERDATA_MAX_LENGTH);\n let pos = 0;\n const chunks: DataChunk[] = [];\n for (const fragment of range(0, fragments)) {\n const chunk = new DataChunk(0, undefined);\n chunk.flags = 0;\n if (!ordered) {\n chunk.flags = SCTP_DATA_UNORDERED;\n }\n if (fragment === 0) {\n chunk.flags |= SCTP_DATA_FIRST_FRAG;\n }\n if (fragment === fragments - 1) {\n chunk.flags |= SCTP_DATA_LAST_FRAG;\n }\n chunk.tsn = this.localTsn;\n chunk.streamId = streamId;\n chunk.streamSeqNum = streamSeqNum;\n chunk.protocol = ppId;\n chunk.userData = userData.slice(pos, pos + USERDATA_MAX_LENGTH);\n chunk.bookSize = chunk.userData.length;\n chunk.expiry = expiry;\n chunk.maxRetransmits = maxRetransmits;\n\n pos += USERDATA_MAX_LENGTH;\n this.localTsn = tsnPlusOne(this.localTsn);\n chunks.push(chunk);\n }\n\n chunks.forEach((chunk) => {\n this.outboundQueue.push(chunk);\n });\n\n if (ordered) {\n this.outboundStreamSeq[streamId] = uint16Add(streamSeqNum, 1);\n }\n\n if (!this.timer3Handle) {\n await this.transmit();\n } else {\n await new Promise((r) => setImmediate(r));\n }\n };\n\n private async transmit() {\n // \"\"\"\n // Transmit outbound data.\n // \"\"\"\n\n // # send FORWARD TSN\n if (this.forwardTsnChunk) {\n await this.sendChunk(this.forwardTsnChunk).catch((err: Error) => {\n log(\"send forwardTsn failed\", err.message);\n });\n this.forwardTsnChunk = undefined;\n\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n\n const burstSize =\n this.fastRecoveryExit != undefined\n ? 2 * USERDATA_MAX_LENGTH\n : 4 * USERDATA_MAX_LENGTH;\n\n const cwnd = Math.min(this.flightSize + burstSize, this.cwnd);\n\n let retransmitEarliest = true;\n for (const dataChunk of this.sentQueue) {\n if (dataChunk.retransmit) {\n if (this.fastRecoveryTransmit) {\n this.fastRecoveryTransmit = false;\n } else if (this.flightSize >= cwnd) {\n return;\n }\n this.flightSizeIncrease(dataChunk);\n\n dataChunk.misses = 0;\n dataChunk.retransmit = false;\n dataChunk.sentCount++;\n await this.sendChunk(dataChunk).catch((err: Error) => {\n log(\"send data failed\", err.message);\n });\n\n if (retransmitEarliest) {\n this.timer3Restart();\n }\n }\n retransmitEarliest = false;\n }\n\n // for performance todo fix\n while (this.outboundQueue.length > 0) {\n const chunk = this.outboundQueue.shift();\n if (!chunk) return;\n\n this.sentQueue.push(chunk);\n this.flightSizeIncrease(chunk);\n\n // # update counters\n chunk.sentCount++;\n chunk.sentTime = Date.now() / 1000;\n\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send data outboundQueue failed\", err.message);\n });\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n }\n\n async transmitReconfigRequest() {\n if (\n this.reconfigQueue.length > 0 &&\n this.associationState === SCTP_STATE.ESTABLISHED &&\n !this.reconfigRequest\n ) {\n const streams = this.reconfigQueue.slice(0, RECONFIG_MAX_STREAMS);\n\n this.reconfigQueue = this.reconfigQueue.slice(RECONFIG_MAX_STREAMS);\n const param = new OutgoingSSNResetRequestParam(\n this.reconfigRequestSeq,\n this.reconfigResponseSeq,\n tsnMinusOne(this.localTsn),\n streams\n );\n this.reconfigRequestSeq = tsnPlusOne(this.reconfigRequestSeq);\n\n this.reconfigRequest = param;\n await this.sendReconfigParam(param);\n this.timerReconfigHandleStart();\n }\n }\n\n async sendReconfigParam(param: StreamParam) {\n log(\"sendReconfigParam\", param);\n const chunk = new ReconfigChunk();\n chunk.params.push([param.type, param.bytes]);\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send reconfig failed\", err.message);\n });\n }\n\n // https://github.com/pion/sctp/pull/44/files\n private async sendResetRequest(streamId: number) {\n log(\"sendResetRequest\", streamId);\n const chunk = new DataChunk(0, undefined);\n chunk.streamId = streamId;\n this.outboundQueue.push(chunk);\n if (!this.timer3Handle) {\n await this.transmit();\n }\n }\n\n private flightSizeIncrease(chunk: DataChunk) {\n this.flightSize += chunk.bookSize;\n }\n\n private flightSizeDecrease(chunk: DataChunk) {\n this.flightSize = Math.max(0, this.flightSize - chunk.bookSize);\n }\n\n // # timers\n\n /**t1 is wait for initAck or cookieAck */\n private timer1Start(chunk: Chunk) {\n if (this.timer1Handle) throw new Error();\n this.timer1Chunk = chunk;\n this.timer1Failures = 0;\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n\n private timer1Expired = () => {\n this.timer1Failures++;\n this.timer1Handle = undefined;\n if (this.timer1Failures > SCTP_MAX_INIT_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer1Chunk!).catch((err: Error) => {\n log(\"send timer1 chunk failed\", err.message);\n });\n });\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n };\n\n private timer1Cancel() {\n if (this.timer1Handle) {\n clearTimeout(this.timer1Handle);\n this.timer1Handle = undefined;\n this.timer1Chunk = undefined;\n }\n }\n\n /**t2 is wait for shutdown */\n private t2Start(chunk: Chunk) {\n if (this.timer2Handle) throw new Error();\n this.timer2Chunk = chunk;\n this.timer2Failures = 0;\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n\n private timer2Expired = () => {\n this.timer2Failures++;\n this.timer2Handle = undefined;\n if (this.timer2Failures > SCTP_MAX_ASSOCIATION_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer2Chunk!).catch((err: Error) => {\n log(\"send timer2Chunk failed\", err.message);\n });\n });\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n };\n\n private timer2Cancel() {\n if (this.timer2Handle) {\n clearTimeout(this.timer2Handle);\n this.timer2Handle = undefined;\n this.timer2Chunk = undefined;\n }\n }\n\n /**t3 is wait for data sack */\n private timer3Start() {\n if (this.timer3Handle) throw new Error();\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto * 1000);\n }\n\n private timer3Restart() {\n this.timer3Cancel();\n // for performance\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto);\n }\n\n private timer3Expired = () => {\n this.timer3Handle = undefined;\n\n // # mark retransmit or abandoned chunks\n this.sentQueue.forEach((chunk) => {\n if (!this.maybeAbandon(chunk)) {\n chunk.retransmit = true;\n }\n });\n this.updateAdvancedPeerAckPoint();\n\n // # adjust congestion window\n this.fastRecoveryExit = undefined;\n this.flightSize = 0;\n this.partialBytesAcked = 0;\n\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH\n );\n this.cwnd = USERDATA_MAX_LENGTH;\n\n this.transmit();\n };\n\n private timer3Cancel() {\n if (this.timer3Handle) {\n clearTimeout(this.timer3Handle);\n this.timer3Handle = undefined;\n }\n }\n\n /**Re-configuration Timer */\n private timerReconfigHandleStart() {\n if (this.timerReconfigHandle) return;\n log(\"timerReconfigHandleStart\", { rto: this.rto });\n this.timerReconfigFailures = 0;\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000\n );\n }\n\n private timerReconfigHandleExpired = async () => {\n this.timerReconfigFailures++;\n // back off\n this.rto = Math.ceil(this.rto * 1.5);\n\n if (this.timerReconfigFailures > SCTP_MAX_ASSOCIATION_RETRANS) {\n log(\"timerReconfigFailures\", this.timerReconfigFailures);\n this.setState(SCTP_STATE.CLOSED);\n\n this.timerReconfigHandle = undefined;\n } else if (this.reconfigRequest) {\n log(\"timerReconfigHandleExpired\", this.timerReconfigFailures, this.rto);\n await this.sendReconfigParam(this.reconfigRequest);\n\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000\n );\n }\n };\n\n private timerReconfigCancel() {\n if (this.timerReconfigHandle) {\n log(\"timerReconfigCancel\");\n clearTimeout(this.timerReconfigHandle);\n this.timerReconfigHandle = undefined;\n }\n }\n\n private updateAdvancedPeerAckPoint() {\n if (uint32Gt(this.lastSackedTsn, this.advancedPeerAckTsn)) {\n this.advancedPeerAckTsn = this.lastSackedTsn;\n }\n\n let done = 0;\n const streams: { [key: number]: number } = {};\n while (this.sentQueue.length > 0 && this.sentQueue[0].abandoned) {\n const chunk = this.sentQueue.shift()!;\n this.advancedPeerAckTsn = chunk.tsn;\n done++;\n if (!(chunk.flags & SCTP_DATA_UNORDERED)) {\n streams[chunk.streamId] = chunk.streamSeqNum;\n }\n }\n\n if (done) {\n this.forwardTsnChunk = new ForwardTsnChunk(0, undefined);\n this.forwardTsnChunk.cumulativeTsn = this.advancedPeerAckTsn;\n this.forwardTsnChunk.streams = Object.entries(streams).map(([k, v]) => [\n Number(k),\n v,\n ]);\n }\n }\n\n private maybeAbandon(chunk: DataChunk): boolean {\n if (chunk.abandoned) return true;\n const abandon =\n (!!chunk.maxRetransmits && chunk.maxRetransmits < chunk.sentCount!) ||\n (!!chunk.expiry && chunk.expiry < Date.now() / 1000);\n if (!abandon) return false;\n\n const chunkPos = this.sentQueue.findIndex((v) => v.type === chunk.type);\n for (const pos of range(chunkPos, -1, -1)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n for (const pos of range(chunkPos, this.sentQueue.length)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n return true;\n }\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.remotePort = port;\n }\n\n async start(remotePort?: number) {\n if (!this.started) {\n this.started = true;\n this.setConnectionState(\"connecting\");\n\n if (remotePort) {\n this.setRemotePort(remotePort);\n }\n\n if (!this.isServer) {\n await this.init();\n }\n }\n }\n\n private async init() {\n const init = new InitChunk();\n init.initiateTag = this.localVerificationTag;\n init.advertisedRwnd = this.advertisedRwnd;\n init.outboundStreams = this._outboundStreamsCount;\n init.inboundStreams = this._inboundStreamsMax;\n init.initialTsn = this.localTsn;\n this.setExtensions(init.params);\n log(\"send init\", init);\n\n try {\n await this.sendChunk(init);\n\n // # start T1 timer and enter COOKIE-WAIT state\n this.timer1Start(init);\n this.setState(SCTP_STATE.COOKIE_WAIT);\n } catch (error: any) {\n log(\"send init failed\", error.message);\n }\n }\n\n private setExtensions(params: [number, Buffer][]) {\n const extensions: number[] = [];\n if (this.localPartialReliability) {\n params.push([SCTP_PRSCTP_SUPPORTED, Buffer.from(\"\")]);\n extensions.push(ForwardTsnChunk.type);\n }\n\n extensions.push(ReConfigChunk.type);\n params.push([SCTP_SUPPORTED_CHUNK_EXT, Buffer.from(extensions)]);\n }\n\n async sendChunk(chunk: Chunk) {\n if (this.state === \"closed\") return;\n if (this.remotePort === undefined) {\n throw new Error(\"invalid remote port\");\n }\n\n const packet = serializePacket(\n this.localPort,\n this.remotePort,\n this.remoteVerificationTag,\n chunk\n );\n await this.transport.send(packet);\n }\n\n setState(state: SCTP_STATE) {\n if (state != this.associationState) {\n this.associationState = state;\n }\n if (state === SCTP_STATE.ESTABLISHED) {\n this.setConnectionState(\"connected\");\n } else if (state === SCTP_STATE.CLOSED) {\n this.timer1Cancel();\n this.timer2Cancel();\n this.timer3Cancel();\n this.setConnectionState(\"closed\");\n this.removeAllListeners();\n }\n }\n\n setConnectionState(state: SCTPConnectionState) {\n this.state = state;\n log(\"setConnectionState\", state);\n this.stateChanged[state].execute();\n }\n\n async stop() {\n if (this.associationState !== SCTP_STATE.CLOSED) {\n await this.abort();\n }\n this.setState(SCTP_STATE.CLOSED);\n clearTimeout(this.timer1Handle);\n clearTimeout(this.timer2Handle);\n clearTimeout(this.timer3Handle);\n }\n\n async abort() {\n const abort = new AbortChunk();\n await this.sendChunk(abort).catch((err: Error) => {\n log(\"send abort failed\", err.message);\n });\n }\n\n private removeAllListeners() {\n Object.values(this.stateChanged).forEach((v) => v.allUnsubscribe());\n }\n}\n\nexport class InboundStream {\n reassembly: DataChunk[] = [];\n streamSequenceNumber = 0; // SSN\n\n constructor() {}\n\n addChunk(chunk: DataChunk) {\n if (\n this.reassembly.length === 0 ||\n uint32Gt(chunk.tsn, this.reassembly[this.reassembly.length - 1].tsn)\n ) {\n this.reassembly.push(chunk);\n return;\n }\n\n for (const [i, v] of enumerate(this.reassembly)) {\n if (v.tsn === chunk.tsn) throw new Error(\"duplicate chunk in reassembly\");\n\n if (uint32Gt(v.tsn, chunk.tsn)) {\n this.reassembly.splice(i, 0, chunk);\n break;\n }\n }\n }\n\n *popMessages(): Generator<[number, number, Buffer]> {\n let pos = 0;\n let startPos: number | undefined;\n let expectedTsn: number;\n let ordered: boolean | undefined;\n while (pos < this.reassembly.length) {\n const chunk = this.reassembly[pos];\n if (startPos === undefined) {\n ordered = !(chunk.flags & SCTP_DATA_UNORDERED);\n if (!(chunk.flags & SCTP_DATA_FIRST_FRAG)) {\n if (ordered) {\n break;\n } else {\n pos++;\n continue;\n }\n }\n if (\n ordered &&\n uint16Gt(chunk.streamSeqNum, this.streamSequenceNumber)\n ) {\n break;\n }\n expectedTsn = chunk.tsn;\n startPos = pos;\n } else if (chunk.tsn !== expectedTsn!) {\n if (ordered!) {\n break;\n } else {\n startPos = undefined;\n pos++;\n continue;\n }\n }\n\n if (chunk.flags & SCTP_DATA_LAST_FRAG) {\n const arr = this.reassembly\n .slice(startPos, pos + 1)\n .map((c) => c.userData)\n .reduce((acc, cur) => {\n acc.push(cur);\n acc.push(Buffer.from(\"\"));\n return acc;\n }, [] as Buffer[]);\n arr.pop();\n const userData = Buffer.concat(arr);\n\n this.reassembly = [\n ...this.reassembly.slice(0, startPos),\n ...this.reassembly.slice(pos + 1),\n ];\n if (ordered && chunk.streamSeqNum === this.streamSequenceNumber) {\n this.streamSequenceNumber = uint16Add(this.streamSequenceNumber, 1);\n }\n pos = startPos;\n yield [chunk.streamId, chunk.protocol, userData];\n } else {\n pos++;\n }\n expectedTsn = tsnPlusOne(expectedTsn);\n }\n }\n\n pruneChunks(tsn: number) {\n // \"\"\"\n // Prune chunks up to the given TSN.\n // \"\"\"\n\n let pos = -1,\n size = 0;\n\n for (const [i, chunk] of this.reassembly.entries()) {\n if (uint32Gte(tsn, chunk.tsn)) {\n pos = i;\n size += chunk.userData.length;\n } else {\n break;\n }\n }\n\n this.reassembly = this.reassembly.slice(pos + 1);\n return size;\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nfunction tsnMinusOne(a: number) {\n return (a - 1) % SCTP_TSN_MODULO;\n}\n\nfunction tsnPlusOne(a: number) {\n return (a + 1) % SCTP_TSN_MODULO;\n}\n"]}
1
+ {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport range from \"lodash/range\";\nimport { Event } from \"rx.mini\";\n\nimport {\n random32,\n uint16Add,\n uint16Gt,\n uint32Gt,\n uint32Gte,\n} from \"../../common/src\";\nimport {\n AbortChunk,\n Chunk,\n CookieAckChunk,\n CookieEchoChunk,\n DataChunk,\n ErrorChunk,\n ForwardTsnChunk,\n HeartbeatAckChunk,\n HeartbeatChunk,\n InitAckChunk,\n InitChunk,\n parsePacket,\n ReConfigChunk,\n ReconfigChunk,\n SackChunk,\n serializePacket,\n ShutdownAckChunk,\n ShutdownChunk,\n ShutdownCompleteChunk,\n} from \"./chunk\";\nimport { SCTP_STATE } from \"./const\";\nimport { createEventsFromList, enumerate, Unpacked } from \"./helper\";\nimport {\n OutgoingSSNResetRequestParam,\n RECONFIG_PARAM_BY_TYPES,\n ReconfigResponseParam,\n reconfigResult,\n StreamAddOutgoingParam,\n StreamParam,\n} from \"./param\";\nimport { Transport } from \"./transport\";\n\nconst log = debug(\"werift/sctp/sctp\");\n\n// SSN: Stream Sequence Number\n\n// # local constants\nconst COOKIE_LENGTH = 24;\nconst COOKIE_LIFETIME = 60;\nconst MAX_STREAMS = 65535;\nconst USERDATA_MAX_LENGTH = 1200;\n\n// # protocol constants\nconst SCTP_DATA_LAST_FRAG = 0x01;\nconst SCTP_DATA_FIRST_FRAG = 0x02;\nconst SCTP_DATA_UNORDERED = 0x04;\n\nconst SCTP_MAX_ASSOCIATION_RETRANS = 10;\nconst SCTP_MAX_INIT_RETRANS = 8;\nconst SCTP_RTO_ALPHA = 1 / 8;\nconst SCTP_RTO_BETA = 1 / 4;\nconst SCTP_RTO_INITIAL = 3;\nconst SCTP_RTO_MIN = 1;\nconst SCTP_RTO_MAX = 60;\nconst SCTP_TSN_MODULO = 2 ** 32;\n\nconst RECONFIG_MAX_STREAMS = 135;\n\n// # parameters\nconst SCTP_STATE_COOKIE = 0x0007;\nconst SCTP_SUPPORTED_CHUNK_EXT = 0x8008; //32778\nconst SCTP_PRSCTP_SUPPORTED = 0xc000; //49152\n\nconst SCTPConnectionStates = [\n \"new\",\n \"closed\",\n \"connected\",\n \"connecting\",\n] as const;\ntype SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;\n\nexport class SCTP {\n readonly stateChanged: {\n [key in SCTPConnectionState]: Event<[]>;\n } = createEventsFromList(SCTPConnectionStates);\n readonly onReconfigStreams = new Event<[number[]]>();\n /**streamId: number, ppId: number, data: Buffer */\n readonly onReceive = new Event<[number, number, Buffer]>();\n onSackReceived: () => Promise<void> = async () => {};\n\n associationState = SCTP_STATE.CLOSED;\n started = false;\n state: SCTPConnectionState = \"new\";\n isServer = true;\n\n private hmacKey = randomBytes(16);\n private localPartialReliability = true;\n private localPort: number;\n private localVerificationTag = random32();\n\n remoteExtensions: number[] = [];\n remotePartialReliability = true;\n private remotePort?: number;\n private remoteVerificationTag = 0;\n\n // inbound\n private advertisedRwnd = 1024 * 1024; // Receiver Window\n private inboundStreams: { [key: number]: InboundStream } = {};\n _inboundStreamsCount = 0;\n _inboundStreamsMax = MAX_STREAMS;\n private lastReceivedTsn?: number; // Transmission Sequence Number\n private sackDuplicates: number[] = [];\n private sackMisOrdered = new Set<number>();\n private sackNeeded = false;\n\n // # outbound\n private cwnd = 3 * USERDATA_MAX_LENGTH; // Congestion Window\n private fastRecoveryExit?: number;\n private fastRecoveryTransmit = false;\n private forwardTsnChunk?: ForwardTsnChunk;\n private flightSize = 0;\n outboundQueue: DataChunk[] = [];\n private outboundStreamSeq: { [streamId: number]: number } = {};\n _outboundStreamsCount = MAX_STREAMS;\n /**local transmission sequence number */\n private localTsn = Number(random32());\n private lastSackedTsn = tsnMinusOne(this.localTsn);\n private advancedPeerAckTsn = tsnMinusOne(this.localTsn); // acknowledgement\n private partialBytesAcked = 0;\n private sentQueue: DataChunk[] = [];\n\n // # reconfiguration\n\n /**初期TSNと同じ値に初期化される単調に増加する数です. これは、新しいre-configuration requestパラメーターを送信するたびに1ずつ増加します */\n reconfigRequestSeq = this.localTsn;\n /**このフィールドは、incoming要求のre-configuration requestシーケンス番号を保持します. 他の場合では、次に予想されるre-configuration requestシーケンス番号から1を引いた値が保持されます */\n reconfigResponseSeq = 0;\n reconfigRequest?: OutgoingSSNResetRequestParam;\n reconfigQueue: number[] = [];\n\n // rtt calculation\n private srtt?: number;\n private rttvar?: number;\n\n // timers\n private rto = SCTP_RTO_INITIAL;\n /**t1 is wait for initAck or cookieAck */\n private timer1Handle?: any;\n private timer1Chunk?: Chunk;\n private timer1Failures = 0;\n /**t2 is wait for shutdown */\n private timer2Handle?: any;\n private timer2Chunk?: Chunk;\n private timer2Failures = 0;\n /**t3 is wait for data sack */\n private timer3Handle?: any;\n /**Re-configuration Timer */\n private timerReconfigHandle?: any;\n private timerReconfigFailures = 0;\n\n // etc\n private ssthresh?: number; // slow start threshold\n\n constructor(public transport: Transport, public port = 5000) {\n this.localPort = this.port;\n this.transport.onData = (buf) => {\n this.handleData(buf);\n };\n }\n\n get maxChannels() {\n if (this._inboundStreamsCount > 0)\n return Math.min(this._inboundStreamsCount, this._outboundStreamsCount);\n }\n\n static client(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = false;\n return sctp;\n }\n\n static server(transport: Transport, port = 5000) {\n const sctp = new SCTP(transport, port);\n sctp.isServer = true;\n return sctp;\n }\n\n // call from dtls transport\n private async handleData(data: Buffer) {\n let expectedTag: number;\n\n const [, , verificationTag, chunks] = parsePacket(data);\n const initChunk = chunks.filter((v) => v.type === InitChunk.type).length;\n if (initChunk > 0) {\n if (chunks.length != 1) {\n throw new Error();\n }\n expectedTag = 0;\n } else {\n expectedTag = this.localVerificationTag;\n }\n\n if (verificationTag !== expectedTag) {\n return;\n }\n\n for (const chunk of chunks) {\n await this.receiveChunk(chunk);\n }\n\n if (this.sackNeeded) {\n await this.sendSack();\n }\n }\n\n private async sendSack() {\n const gaps: [number, number][] = [];\n let gapNext: number;\n [...this.sackMisOrdered].sort().forEach((tsn) => {\n const pos = (tsn - this.lastReceivedTsn!) % SCTP_TSN_MODULO;\n if (tsn === gapNext) {\n gaps[gaps.length - 1][1] = pos;\n } else {\n gaps.push([pos, pos]);\n }\n gapNext = tsnPlusOne(tsn);\n });\n const sack = new SackChunk(0, undefined);\n sack.cumulativeTsn = this.lastReceivedTsn!;\n sack.advertisedRwnd = Math.max(0, this.advertisedRwnd);\n sack.duplicates = [...this.sackDuplicates];\n sack.gaps = gaps;\n\n await this.sendChunk(sack).catch((err: Error) => {\n log(\"send sack failed\", err.message);\n });\n\n this.sackDuplicates = [];\n this.sackNeeded = false;\n }\n\n private async receiveChunk(chunk: Chunk) {\n switch (chunk.type) {\n case DataChunk.type:\n {\n this.receiveDataChunk(chunk as DataChunk);\n }\n break;\n case InitChunk.type:\n {\n if (!this.isServer) return;\n const init = chunk as InitChunk;\n\n log(\"receive init\", init);\n this.lastReceivedTsn = tsnMinusOne(init.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(init.initialTsn);\n this.remoteVerificationTag = init.initiateTag;\n this.ssthresh = init.advertisedRwnd;\n this.getExtensions(init.params);\n\n this._inboundStreamsCount = Math.min(\n init.outboundStreams,\n this._inboundStreamsMax\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n init.inboundStreams\n );\n\n const ack = new InitAckChunk();\n ack.initiateTag = this.localVerificationTag;\n ack.advertisedRwnd = this.advertisedRwnd;\n ack.outboundStreams = this._outboundStreamsCount;\n ack.inboundStreams = this._inboundStreamsCount;\n ack.initialTsn = this.localTsn;\n this.setExtensions(ack.params);\n\n const time = Date.now() / 1000;\n let cookie = Buffer.from(jspack.Pack(\"!L\", [time]));\n cookie = Buffer.concat([\n cookie,\n createHmac(\"sha1\", this.hmacKey).update(cookie).digest(),\n ]);\n ack.params.push([SCTP_STATE_COOKIE, cookie]);\n log(\"send initAck\", ack);\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send initAck failed\", err.message);\n });\n }\n break;\n case InitAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_WAIT) return;\n\n const initAck = chunk as InitAckChunk;\n this.timer1Cancel();\n this.lastReceivedTsn = tsnMinusOne(initAck.initialTsn);\n this.reconfigResponseSeq = tsnMinusOne(initAck.initialTsn);\n this.remoteVerificationTag = initAck.initiateTag;\n this.ssthresh = initAck.advertisedRwnd;\n this.getExtensions(initAck.params);\n\n this._inboundStreamsCount = Math.min(\n initAck.outboundStreams,\n this._inboundStreamsMax\n );\n this._outboundStreamsCount = Math.min(\n this._outboundStreamsCount,\n initAck.inboundStreams\n );\n\n const echo = new CookieEchoChunk();\n for (const [k, v] of initAck.params) {\n if (k === SCTP_STATE_COOKIE) {\n echo.body = v;\n break;\n }\n }\n await this.sendChunk(echo).catch((err: Error) => {\n log(\"send echo failed\", err.message);\n });\n\n this.timer1Start(echo);\n this.setState(SCTP_STATE.COOKIE_ECHOED);\n }\n break;\n case SackChunk.type:\n {\n await this.receiveSackChunk(chunk as SackChunk);\n }\n break;\n case HeartbeatChunk.type:\n {\n const ack = new HeartbeatAckChunk();\n ack.params = (chunk as HeartbeatChunk).params;\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send heartbeat ack failed\", err.message);\n });\n }\n break;\n case AbortChunk.type:\n {\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n case ShutdownChunk.type:\n {\n this.timer2Cancel();\n this.setState(SCTP_STATE.SHUTDOWN_RECEIVED);\n const ack = new ShutdownAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send shutdown ack failed\", err.message);\n });\n this.t2Start(ack);\n this.setState(SCTP_STATE.SHUTDOWN_SENT);\n }\n break;\n case ErrorChunk.type:\n {\n // 3.3.10. Operation Error (ERROR) (9)\n // An Operation Error is not considered fatal in and of itself, but may be\n // used with an ABORT chunk to report a fatal condition. It has the\n // following parameters:\n log(\"ErrorChunk\", (chunk as ErrorChunk).descriptions);\n }\n break;\n case CookieEchoChunk.type:\n {\n if (!this.isServer) return;\n const data = chunk as CookieEchoChunk;\n const cookie = data.body!;\n const digest = createHmac(\"sha1\", this.hmacKey)\n .update(cookie.slice(0, 4))\n .digest();\n if (\n cookie?.length != COOKIE_LENGTH ||\n !cookie.slice(4).equals(digest)\n ) {\n log(\"x State cookie is invalid\");\n return;\n }\n const now = Date.now() / 1000;\n const stamp = jspack.Unpack(\"!L\", cookie)[0];\n if (stamp < now - COOKIE_LIFETIME || stamp > now) {\n const error = new ErrorChunk(0, undefined);\n error.params.push([\n ErrorChunk.CODE.StaleCookieError,\n Buffer.concat([...Array(8)].map(() => Buffer.from(\"\\x00\"))),\n ]);\n await this.sendChunk(error).catch((err: Error) => {\n log(\"send errorChunk failed\", err.message);\n });\n return;\n }\n const ack = new CookieAckChunk();\n await this.sendChunk(ack).catch((err: Error) => {\n log(\"send cookieAck failed\", err.message);\n });\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case CookieAckChunk.type:\n {\n if (this.associationState != SCTP_STATE.COOKIE_ECHOED) return;\n this.timer1Cancel();\n this.setState(SCTP_STATE.ESTABLISHED);\n }\n break;\n case ShutdownCompleteChunk.type:\n {\n if (this.associationState != SCTP_STATE.SHUTDOWN_ACK_SENT) return;\n this.timer2Cancel();\n this.setState(SCTP_STATE.CLOSED);\n }\n break;\n // extensions\n case ReconfigChunk.type:\n {\n if (this.associationState != SCTP_STATE.ESTABLISHED) return;\n const reconfig = chunk as ReConfigChunk;\n for (const [type, body] of reconfig.params) {\n const target = RECONFIG_PARAM_BY_TYPES[type];\n if (target) {\n await this.receiveReconfigParam(target.parse(body));\n }\n }\n }\n break;\n case ForwardTsnChunk.type:\n {\n this.receiveForwardTsnChunk(chunk as ForwardTsnChunk);\n }\n break;\n }\n }\n\n private getExtensions(params: [number, Buffer][]) {\n for (const [k, v] of params) {\n if (k === SCTP_PRSCTP_SUPPORTED) {\n this.remotePartialReliability = true;\n } else if (k === SCTP_SUPPORTED_CHUNK_EXT) {\n this.remoteExtensions = [...v];\n }\n }\n }\n\n private async receiveReconfigParam(param: StreamParam) {\n log(\"receiveReconfigParam\", RECONFIG_PARAM_BY_TYPES[param.type]);\n switch (param.type) {\n case OutgoingSSNResetRequestParam.type:\n {\n const p = param as OutgoingSSNResetRequestParam;\n\n // # send response\n const response = new ReconfigResponseParam(\n p.requestSequence,\n reconfigResult.ReconfigResultSuccessPerformed\n );\n this.reconfigResponseSeq = p.requestSequence;\n await this.sendReconfigParam(response);\n\n // # mark closed inbound streams\n await Promise.all(\n p.streams.map(async (streamId) => {\n delete this.inboundStreams[streamId];\n if (this.outboundStreamSeq[streamId]) {\n this.reconfigQueue.push(streamId);\n // await this.sendResetRequest(streamId);\n }\n })\n );\n await this.transmitReconfigRequest();\n // # close data channel\n this.onReconfigStreams.execute(p.streams);\n }\n break;\n case ReconfigResponseParam.type:\n {\n const reset = param as ReconfigResponseParam;\n if (reset.result !== reconfigResult.ReconfigResultSuccessPerformed) {\n log(\n \"OutgoingSSNResetRequestParam failed\",\n Object.keys(reconfigResult).find(\n (key) => reconfigResult[key as never] === reset.result\n )\n );\n } else if (\n reset.responseSequence === this.reconfigRequest?.requestSequence\n ) {\n const streamIds = this.reconfigRequest.streams.map((streamId) => {\n delete this.outboundStreamSeq[streamId];\n return streamId;\n });\n\n this.onReconfigStreams.execute(streamIds);\n\n this.reconfigRequest = undefined;\n this.timerReconfigCancel();\n if (this.reconfigQueue.length > 0) {\n await this.transmitReconfigRequest();\n }\n }\n }\n break;\n case StreamAddOutgoingParam.type:\n {\n const add = param as StreamAddOutgoingParam;\n this._inboundStreamsCount += add.newStreams;\n const res = new ReconfigResponseParam(add.requestSequence, 1);\n this.reconfigResponseSeq = add.requestSequence;\n await this.sendReconfigParam(res);\n }\n break;\n }\n }\n\n private receiveDataChunk(chunk: DataChunk) {\n this.sackNeeded = true;\n\n if (this.markReceived(chunk.tsn)) return;\n\n const inboundStream = this.getInboundStream(chunk.streamId);\n\n inboundStream.addChunk(chunk);\n this.advertisedRwnd -= chunk.userData.length;\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n private async receiveSackChunk(chunk: SackChunk) {\n // \"\"\"\n // Handle a SACK chunk.\n // \"\"\"\n\n if (uint32Gt(this.lastSackedTsn, chunk.cumulativeTsn)) return;\n\n const receivedTime = Date.now() / 1000;\n this.lastSackedTsn = chunk.cumulativeTsn;\n const cwndFullyUtilized = this.flightSize >= this.cwnd;\n let done = 0,\n doneBytes = 0;\n\n // # handle acknowledged data\n while (\n this.sentQueue.length > 0 &&\n uint32Gte(this.lastSackedTsn, this.sentQueue[0].tsn)\n ) {\n const sChunk = this.sentQueue.shift()!;\n done++;\n if (!sChunk?.acked) {\n doneBytes += sChunk.bookSize;\n this.flightSizeDecrease(sChunk);\n }\n\n if (done === 1 && sChunk.sentCount === 1) {\n this.updateRto(receivedTime - sChunk.sentTime!);\n }\n }\n\n // # handle gap blocks\n let loss = false;\n if (chunk.gaps.length > 0) {\n const seen = new Set();\n let highestSeenTsn: number;\n chunk.gaps.forEach((gap) =>\n range(gap[0], gap[1] + 1).forEach((pos) => {\n highestSeenTsn = (chunk.cumulativeTsn + pos) % SCTP_TSN_MODULO;\n seen.add(highestSeenTsn);\n })\n );\n\n let highestNewlyAcked = chunk.cumulativeTsn;\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestSeenTsn!)) {\n break;\n }\n if (seen.has(sChunk.tsn) && !sChunk.acked) {\n doneBytes += sChunk.bookSize;\n sChunk.acked = true;\n this.flightSizeDecrease(sChunk);\n highestNewlyAcked = sChunk.tsn;\n }\n }\n\n // # strike missing chunks prior to HTNA\n for (const sChunk of this.sentQueue) {\n if (uint32Gt(sChunk.tsn, highestNewlyAcked)) {\n break;\n }\n if (!seen.has(sChunk.tsn)) {\n sChunk.misses++;\n if (sChunk.misses === 3) {\n sChunk.misses = 0;\n if (!this.maybeAbandon(sChunk)) {\n sChunk.retransmit = true;\n }\n sChunk.acked = false;\n this.flightSizeDecrease(sChunk);\n loss = true;\n }\n }\n }\n }\n\n // # adjust congestion window\n if (this.fastRecoveryExit === undefined) {\n if (done && cwndFullyUtilized) {\n if (this.cwnd <= this.ssthresh!) {\n this.cwnd += Math.min(doneBytes, USERDATA_MAX_LENGTH);\n } else {\n this.partialBytesAcked += doneBytes;\n if (this.partialBytesAcked >= this.cwnd) {\n this.partialBytesAcked -= this.cwnd;\n this.cwnd += USERDATA_MAX_LENGTH;\n }\n }\n }\n if (loss) {\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH\n );\n this.cwnd = this.ssthresh;\n this.partialBytesAcked = 0;\n this.fastRecoveryExit = this.sentQueue[this.sentQueue.length - 1].tsn;\n this.fastRecoveryTransmit = true;\n }\n } else if (uint32Gte(chunk.cumulativeTsn, this.fastRecoveryExit)) {\n this.fastRecoveryExit = undefined;\n }\n\n if (this.sentQueue.length === 0) {\n this.timer3Cancel();\n } else if (done > 0) {\n this.timer3Restart();\n }\n\n this.updateAdvancedPeerAckPoint();\n await this.onSackReceived();\n await this.transmit();\n }\n\n receiveForwardTsnChunk(chunk: ForwardTsnChunk) {\n this.sackNeeded = true;\n\n if (uint32Gte(this.lastReceivedTsn!, chunk.cumulativeTsn)) {\n return;\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n // # advance cumulative TSN\n this.lastReceivedTsn = chunk.cumulativeTsn;\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n // # filter out obsolete entries\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n // # update reassembly\n for (const [streamId, streamSeqNum] of chunk.streams) {\n const inboundStream = this.getInboundStream(streamId);\n\n // # advance sequence number and perform delivery\n inboundStream.streamSequenceNumber = uint16Add(streamSeqNum, 1);\n for (const message of inboundStream.popMessages()) {\n this.advertisedRwnd += message[2].length;\n this.receive(...message);\n }\n }\n\n // # prune obsolete chunks\n Object.values(this.inboundStreams).forEach((inboundStream) => {\n this.advertisedRwnd += inboundStream.pruneChunks(this.lastReceivedTsn!);\n });\n }\n\n private updateRto(R: number) {\n if (!this.srtt) {\n this.rttvar = R / 2;\n this.srtt = R;\n } else {\n this.rttvar =\n (1 - SCTP_RTO_BETA) * this.rttvar! +\n SCTP_RTO_BETA * Math.abs(this.srtt - R);\n this.srtt = (1 - SCTP_RTO_ALPHA) * this.srtt + SCTP_RTO_ALPHA * R;\n }\n this.rto = Math.max(\n SCTP_RTO_MIN,\n Math.min(this.srtt + 4 * this.rttvar, SCTP_RTO_MAX)\n );\n }\n\n private receive(streamId: number, ppId: number, data: Buffer) {\n this.onReceive.execute(streamId, ppId, data);\n }\n\n private getInboundStream(streamId: number) {\n if (!this.inboundStreams[streamId]) {\n this.inboundStreams[streamId] = new InboundStream();\n }\n return this.inboundStreams[streamId];\n }\n\n private markReceived(tsn: number) {\n if (uint32Gte(this.lastReceivedTsn!, tsn) || this.sackMisOrdered.has(tsn)) {\n this.sackDuplicates.push(tsn);\n return true;\n }\n\n this.sackMisOrdered.add(tsn);\n for (const tsn of [...this.sackMisOrdered].sort()) {\n if (tsn === tsnPlusOne(this.lastReceivedTsn!)) {\n this.lastReceivedTsn = tsn;\n } else {\n break;\n }\n }\n\n const isObsolete = (x: number) => uint32Gt(x, this.lastReceivedTsn!);\n\n this.sackDuplicates = this.sackDuplicates.filter(isObsolete);\n this.sackMisOrdered = new Set([...this.sackMisOrdered].filter(isObsolete));\n\n return false;\n }\n\n send = async (\n streamId: number,\n ppId: number,\n userData: Buffer,\n {\n expiry,\n maxRetransmits,\n ordered,\n }: {\n expiry?: number | undefined;\n maxRetransmits?: number | undefined;\n ordered?: boolean;\n } = { expiry: undefined, maxRetransmits: undefined, ordered: true }\n ) => {\n const streamSeqNum = ordered ? this.outboundStreamSeq[streamId] || 0 : 0;\n\n const fragments = Math.ceil(userData.length / USERDATA_MAX_LENGTH);\n let pos = 0;\n const chunks: DataChunk[] = [];\n for (const fragment of range(0, fragments)) {\n const chunk = new DataChunk(0, undefined);\n chunk.flags = 0;\n if (!ordered) {\n chunk.flags = SCTP_DATA_UNORDERED;\n }\n if (fragment === 0) {\n chunk.flags |= SCTP_DATA_FIRST_FRAG;\n }\n if (fragment === fragments - 1) {\n chunk.flags |= SCTP_DATA_LAST_FRAG;\n }\n chunk.tsn = this.localTsn;\n chunk.streamId = streamId;\n chunk.streamSeqNum = streamSeqNum;\n chunk.protocol = ppId;\n chunk.userData = userData.slice(pos, pos + USERDATA_MAX_LENGTH);\n chunk.bookSize = chunk.userData.length;\n chunk.expiry = expiry;\n chunk.maxRetransmits = maxRetransmits;\n\n pos += USERDATA_MAX_LENGTH;\n this.localTsn = tsnPlusOne(this.localTsn);\n chunks.push(chunk);\n }\n\n chunks.forEach((chunk) => {\n this.outboundQueue.push(chunk);\n });\n\n if (ordered) {\n this.outboundStreamSeq[streamId] = uint16Add(streamSeqNum, 1);\n }\n\n if (!this.timer3Handle) {\n await this.transmit();\n } else {\n await new Promise((r) => setImmediate(r));\n }\n };\n\n private async transmit() {\n // \"\"\"\n // Transmit outbound data.\n // \"\"\"\n\n // # send FORWARD TSN\n if (this.forwardTsnChunk) {\n await this.sendChunk(this.forwardTsnChunk).catch((err: Error) => {\n log(\"send forwardTsn failed\", err.message);\n });\n this.forwardTsnChunk = undefined;\n\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n\n const burstSize =\n this.fastRecoveryExit != undefined\n ? 2 * USERDATA_MAX_LENGTH\n : 4 * USERDATA_MAX_LENGTH;\n\n const cwnd = Math.min(this.flightSize + burstSize, this.cwnd);\n\n let retransmitEarliest = true;\n for (const dataChunk of this.sentQueue) {\n if (dataChunk.retransmit) {\n if (this.fastRecoveryTransmit) {\n this.fastRecoveryTransmit = false;\n } else if (this.flightSize >= cwnd) {\n return;\n }\n this.flightSizeIncrease(dataChunk);\n\n dataChunk.misses = 0;\n dataChunk.retransmit = false;\n dataChunk.sentCount++;\n await this.sendChunk(dataChunk).catch((err: Error) => {\n log(\"send data failed\", err.message);\n });\n\n if (retransmitEarliest) {\n this.timer3Restart();\n }\n }\n retransmitEarliest = false;\n }\n\n // for performance todo fix\n while (this.outboundQueue.length > 0) {\n const chunk = this.outboundQueue.shift();\n if (!chunk) return;\n\n this.sentQueue.push(chunk);\n this.flightSizeIncrease(chunk);\n\n // # update counters\n chunk.sentCount++;\n chunk.sentTime = Date.now() / 1000;\n\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send data outboundQueue failed\", err.message);\n });\n if (!this.timer3Handle) {\n this.timer3Start();\n }\n }\n }\n\n async transmitReconfigRequest() {\n if (\n this.reconfigQueue.length > 0 &&\n this.associationState === SCTP_STATE.ESTABLISHED &&\n !this.reconfigRequest\n ) {\n const streams = this.reconfigQueue.slice(0, RECONFIG_MAX_STREAMS);\n\n this.reconfigQueue = this.reconfigQueue.slice(RECONFIG_MAX_STREAMS);\n const param = new OutgoingSSNResetRequestParam(\n this.reconfigRequestSeq,\n this.reconfigResponseSeq,\n tsnMinusOne(this.localTsn),\n streams\n );\n this.reconfigRequestSeq = tsnPlusOne(this.reconfigRequestSeq);\n\n this.reconfigRequest = param;\n await this.sendReconfigParam(param);\n this.timerReconfigHandleStart();\n }\n }\n\n async sendReconfigParam(param: StreamParam) {\n log(\"sendReconfigParam\", param);\n const chunk = new ReconfigChunk();\n chunk.params.push([param.type, param.bytes]);\n await this.sendChunk(chunk).catch((err: Error) => {\n log(\"send reconfig failed\", err.message);\n });\n }\n\n // https://github.com/pion/sctp/pull/44/files\n private async sendResetRequest(streamId: number) {\n log(\"sendResetRequest\", streamId);\n const chunk = new DataChunk(0, undefined);\n chunk.streamId = streamId;\n this.outboundQueue.push(chunk);\n if (!this.timer3Handle) {\n await this.transmit();\n }\n }\n\n private flightSizeIncrease(chunk: DataChunk) {\n this.flightSize += chunk.bookSize;\n }\n\n private flightSizeDecrease(chunk: DataChunk) {\n this.flightSize = Math.max(0, this.flightSize - chunk.bookSize);\n }\n\n // # timers\n\n /**t1 is wait for initAck or cookieAck */\n private timer1Start(chunk: Chunk) {\n if (this.timer1Handle) throw new Error();\n this.timer1Chunk = chunk;\n this.timer1Failures = 0;\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n\n private timer1Expired = () => {\n this.timer1Failures++;\n this.timer1Handle = undefined;\n if (this.timer1Failures > SCTP_MAX_INIT_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer1Chunk!).catch((err: Error) => {\n log(\"send timer1 chunk failed\", err.message);\n });\n });\n this.timer1Handle = setTimeout(this.timer1Expired, this.rto * 1000);\n }\n };\n\n private timer1Cancel() {\n if (this.timer1Handle) {\n clearTimeout(this.timer1Handle);\n this.timer1Handle = undefined;\n this.timer1Chunk = undefined;\n }\n }\n\n /**t2 is wait for shutdown */\n private t2Start(chunk: Chunk) {\n if (this.timer2Handle) throw new Error();\n this.timer2Chunk = chunk;\n this.timer2Failures = 0;\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n\n private timer2Expired = () => {\n this.timer2Failures++;\n this.timer2Handle = undefined;\n if (this.timer2Failures > SCTP_MAX_ASSOCIATION_RETRANS) {\n this.setState(SCTP_STATE.CLOSED);\n } else {\n setImmediate(() => {\n this.sendChunk(this.timer2Chunk!).catch((err: Error) => {\n log(\"send timer2Chunk failed\", err.message);\n });\n });\n this.timer2Handle = setTimeout(this.timer2Expired, this.rto * 1000);\n }\n };\n\n private timer2Cancel() {\n if (this.timer2Handle) {\n clearTimeout(this.timer2Handle);\n this.timer2Handle = undefined;\n this.timer2Chunk = undefined;\n }\n }\n\n /**t3 is wait for data sack */\n private timer3Start() {\n if (this.timer3Handle) throw new Error();\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto * 1000);\n }\n\n private timer3Restart() {\n this.timer3Cancel();\n // for performance\n this.timer3Handle = setTimeout(this.timer3Expired, this.rto);\n }\n\n private timer3Expired = () => {\n this.timer3Handle = undefined;\n\n // # mark retransmit or abandoned chunks\n this.sentQueue.forEach((chunk) => {\n if (!this.maybeAbandon(chunk)) {\n chunk.retransmit = true;\n }\n });\n this.updateAdvancedPeerAckPoint();\n\n // # adjust congestion window\n this.fastRecoveryExit = undefined;\n this.flightSize = 0;\n this.partialBytesAcked = 0;\n\n this.ssthresh = Math.max(\n Math.floor(this.cwnd / 2),\n 4 * USERDATA_MAX_LENGTH\n );\n this.cwnd = USERDATA_MAX_LENGTH;\n\n this.transmit();\n };\n\n private timer3Cancel() {\n if (this.timer3Handle) {\n clearTimeout(this.timer3Handle);\n this.timer3Handle = undefined;\n }\n }\n\n /**Re-configuration Timer */\n private timerReconfigHandleStart() {\n if (this.timerReconfigHandle) return;\n log(\"timerReconfigHandleStart\", { rto: this.rto });\n this.timerReconfigFailures = 0;\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000\n );\n }\n\n private timerReconfigHandleExpired = async () => {\n this.timerReconfigFailures++;\n // back off\n this.rto = Math.ceil(this.rto * 1.5);\n\n if (this.timerReconfigFailures > SCTP_MAX_ASSOCIATION_RETRANS) {\n log(\"timerReconfigFailures\", this.timerReconfigFailures);\n this.setState(SCTP_STATE.CLOSED);\n\n this.timerReconfigHandle = undefined;\n } else if (this.reconfigRequest) {\n log(\"timerReconfigHandleExpired\", this.timerReconfigFailures, this.rto);\n await this.sendReconfigParam(this.reconfigRequest);\n\n this.timerReconfigHandle = setTimeout(\n this.timerReconfigHandleExpired,\n this.rto * 1000\n );\n }\n };\n\n private timerReconfigCancel() {\n if (this.timerReconfigHandle) {\n log(\"timerReconfigCancel\");\n clearTimeout(this.timerReconfigHandle);\n this.timerReconfigHandle = undefined;\n }\n }\n\n private updateAdvancedPeerAckPoint() {\n if (uint32Gt(this.lastSackedTsn, this.advancedPeerAckTsn)) {\n this.advancedPeerAckTsn = this.lastSackedTsn;\n }\n\n let done = 0;\n const streams: { [key: number]: number } = {};\n while (this.sentQueue.length > 0 && this.sentQueue[0].abandoned) {\n const chunk = this.sentQueue.shift()!;\n this.advancedPeerAckTsn = chunk.tsn;\n done++;\n if (!(chunk.flags & SCTP_DATA_UNORDERED)) {\n streams[chunk.streamId] = chunk.streamSeqNum;\n }\n }\n\n if (done) {\n this.forwardTsnChunk = new ForwardTsnChunk(0, undefined);\n this.forwardTsnChunk.cumulativeTsn = this.advancedPeerAckTsn;\n this.forwardTsnChunk.streams = Object.entries(streams).map(([k, v]) => [\n Number(k),\n v,\n ]);\n }\n }\n\n private maybeAbandon(chunk: DataChunk): boolean {\n if (chunk.abandoned) return true;\n const abandon =\n (!!chunk.maxRetransmits && chunk.maxRetransmits < chunk.sentCount!) ||\n (!!chunk.expiry && chunk.expiry < Date.now() / 1000);\n if (!abandon) return false;\n\n const chunkPos = this.sentQueue.findIndex((v) => v.type === chunk.type);\n for (const pos of range(chunkPos, -1, -1)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n for (const pos of range(chunkPos, this.sentQueue.length)) {\n const oChunk = this.sentQueue[pos];\n oChunk.abandoned = true;\n oChunk.retransmit = false;\n if (oChunk.flags & SCTP_DATA_LAST_FRAG) {\n break;\n }\n }\n\n return true;\n }\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.remotePort = port;\n }\n\n async start(remotePort?: number) {\n if (!this.started) {\n this.started = true;\n this.setConnectionState(\"connecting\");\n\n if (remotePort) {\n this.setRemotePort(remotePort);\n }\n\n if (!this.isServer) {\n await this.init();\n }\n }\n }\n\n private async init() {\n const init = new InitChunk();\n init.initiateTag = this.localVerificationTag;\n init.advertisedRwnd = this.advertisedRwnd;\n init.outboundStreams = this._outboundStreamsCount;\n init.inboundStreams = this._inboundStreamsMax;\n init.initialTsn = this.localTsn;\n this.setExtensions(init.params);\n log(\"send init\", init);\n\n try {\n await this.sendChunk(init);\n\n // # start T1 timer and enter COOKIE-WAIT state\n this.timer1Start(init);\n this.setState(SCTP_STATE.COOKIE_WAIT);\n } catch (error: any) {\n log(\"send init failed\", error.message);\n }\n }\n\n private setExtensions(params: [number, Buffer][]) {\n const extensions: number[] = [];\n if (this.localPartialReliability) {\n params.push([SCTP_PRSCTP_SUPPORTED, Buffer.from(\"\")]);\n extensions.push(ForwardTsnChunk.type);\n }\n\n extensions.push(ReConfigChunk.type);\n params.push([SCTP_SUPPORTED_CHUNK_EXT, Buffer.from(extensions)]);\n }\n\n async sendChunk(chunk: Chunk) {\n if (this.state === \"closed\") return;\n if (this.remotePort === undefined) {\n throw new Error(\"invalid remote port\");\n }\n\n const packet = serializePacket(\n this.localPort,\n this.remotePort,\n this.remoteVerificationTag,\n chunk\n );\n await this.transport.send(packet);\n }\n\n setState(state: SCTP_STATE) {\n if (state != this.associationState) {\n this.associationState = state;\n }\n if (state === SCTP_STATE.ESTABLISHED) {\n this.setConnectionState(\"connected\");\n } else if (state === SCTP_STATE.CLOSED) {\n this.timer1Cancel();\n this.timer2Cancel();\n this.timer3Cancel();\n this.setConnectionState(\"closed\");\n this.removeAllListeners();\n }\n }\n\n setConnectionState(state: SCTPConnectionState) {\n this.state = state;\n log(\"setConnectionState\", state);\n this.stateChanged[state].execute();\n }\n\n async stop() {\n if (this.associationState !== SCTP_STATE.CLOSED) {\n await this.abort();\n }\n this.setState(SCTP_STATE.CLOSED);\n clearTimeout(this.timer1Handle);\n clearTimeout(this.timer2Handle);\n clearTimeout(this.timer3Handle);\n }\n\n async abort() {\n const abort = new AbortChunk();\n await this.sendChunk(abort).catch((err: Error) => {\n log(\"send abort failed\", err.message);\n });\n }\n\n private removeAllListeners() {\n Object.values(this.stateChanged).forEach((v) => v.allUnsubscribe());\n }\n}\n\nexport class InboundStream {\n reassembly: DataChunk[] = [];\n streamSequenceNumber = 0; // SSN\n\n constructor() {}\n\n addChunk(chunk: DataChunk) {\n if (\n this.reassembly.length === 0 ||\n uint32Gt(chunk.tsn, this.reassembly[this.reassembly.length - 1].tsn)\n ) {\n this.reassembly.push(chunk);\n return;\n }\n\n for (const [i, v] of enumerate(this.reassembly)) {\n if (v.tsn === chunk.tsn) throw new Error(\"duplicate chunk in reassembly\");\n\n if (uint32Gt(v.tsn, chunk.tsn)) {\n this.reassembly.splice(i, 0, chunk);\n break;\n }\n }\n }\n\n *popMessages(): Generator<[number, number, Buffer]> {\n let pos = 0;\n let startPos: number | undefined;\n let expectedTsn: number;\n let ordered: boolean | undefined;\n while (pos < this.reassembly.length) {\n const chunk = this.reassembly[pos];\n if (startPos === undefined) {\n ordered = !(chunk.flags & SCTP_DATA_UNORDERED);\n if (!(chunk.flags & SCTP_DATA_FIRST_FRAG)) {\n if (ordered) {\n break;\n } else {\n pos++;\n continue;\n }\n }\n if (\n ordered &&\n uint16Gt(chunk.streamSeqNum, this.streamSequenceNumber)\n ) {\n break;\n }\n expectedTsn = chunk.tsn;\n startPos = pos;\n } else if (chunk.tsn !== expectedTsn!) {\n if (ordered!) {\n break;\n } else {\n startPos = undefined;\n pos++;\n continue;\n }\n }\n\n if (chunk.flags & SCTP_DATA_LAST_FRAG) {\n const arr = this.reassembly\n .slice(startPos, pos + 1)\n .map((c) => c.userData)\n .reduce((acc, cur) => {\n acc.push(cur);\n acc.push(Buffer.from(\"\"));\n return acc;\n }, [] as Buffer[]);\n arr.pop();\n const userData = Buffer.concat(arr);\n\n this.reassembly = [\n ...this.reassembly.slice(0, startPos),\n ...this.reassembly.slice(pos + 1),\n ];\n if (ordered && chunk.streamSeqNum === this.streamSequenceNumber) {\n this.streamSequenceNumber = uint16Add(this.streamSequenceNumber, 1);\n }\n pos = startPos;\n yield [chunk.streamId, chunk.protocol, userData];\n } else {\n pos++;\n }\n expectedTsn = tsnPlusOne(expectedTsn);\n }\n }\n\n pruneChunks(tsn: number) {\n // \"\"\"\n // Prune chunks up to the given TSN.\n // \"\"\"\n\n let pos = -1,\n size = 0;\n\n for (const [i, chunk] of this.reassembly.entries()) {\n if (uint32Gte(tsn, chunk.tsn)) {\n pos = i;\n size += chunk.userData.length;\n } else {\n break;\n }\n }\n\n this.reassembly = this.reassembly.slice(pos + 1);\n return size;\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nfunction tsnMinusOne(a: number) {\n return (a - 1) % SCTP_TSN_MODULO;\n}\n\nfunction tsnPlusOne(a: number) {\n return (a + 1) % SCTP_TSN_MODULO;\n}\n"]}
@@ -3,16 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createUdpTransport = exports.UdpTransport = void 0;
4
4
  class UdpTransport {
5
5
  constructor(upd, rinfo) {
6
- this.upd = upd;
7
- this.rinfo = rinfo;
8
- this.send = (buf) => new Promise((r, f) => this.upd.send(buf, this.rinfo.port, this.rinfo.address, (err) => {
9
- if (err) {
10
- f(err);
11
- }
12
- else {
13
- r();
14
- }
15
- }));
6
+ Object.defineProperty(this, "upd", {
7
+ enumerable: true,
8
+ configurable: true,
9
+ writable: true,
10
+ value: upd
11
+ });
12
+ Object.defineProperty(this, "rinfo", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: rinfo
17
+ });
18
+ Object.defineProperty(this, "onData", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: void 0
23
+ });
24
+ Object.defineProperty(this, "send", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: (buf) => new Promise((r, f) => this.upd.send(buf, this.rinfo.port, this.rinfo.address, (err) => {
29
+ if (err) {
30
+ f(err);
31
+ }
32
+ else {
33
+ r();
34
+ }
35
+ }))
36
+ });
16
37
  upd.on("message", (buf, target) => {
17
38
  this.rinfo = target;
18
39
  if (this.onData)
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../sctp/src/transport.ts"],"names":[],"mappings":";;;AAQA,MAAa,YAAY;IACvB,YAAoB,GAAW,EAAU,KAA0B;QAA/C,QAAG,GAAH,GAAG,CAAQ;QAAU,UAAK,GAAL,KAAK,CAAqB;QAQnE,SAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CACrB,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9D,IAAI,GAAG,EAAE;gBACP,CAAC,CAAC,GAAG,CAAC,CAAC;aACR;iBAAM;gBACL,CAAC,EAAE,CAAC;aACL;QACH,CAAC,CAAC,CACH,CAAC;QAhBF,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;IAcD,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;CACF;AAvBD,oCAuBC;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 { RemoteInfo, Socket } from \"dgram\";\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 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 this.upd.close();\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":["../../../../sctp/src/transport.ts"],"names":[],"mappings":";;;AAQA,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,CACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9D,IAAI,GAAG,EAAE;oBACP,CAAC,CAAC,GAAG,CAAC,CAAC;iBACR;qBAAM;oBACL,CAAC,EAAE,CAAC;iBACL;YACH,CAAC,CAAC,CACH;WAAC;QAhBF,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;IAcD,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;CACF;AAvBD,oCAuBC;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 { RemoteInfo, Socket } from \"dgram\";\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 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 this.upd.close();\n }\n}\n\nexport const createUdpTransport = (\n socket: Socket,\n rinfo: Partial<RemoteInfo> = {}\n) => new UdpTransport(socket, rinfo);\n"]}
@@ -36,7 +36,7 @@ export declare class RTCDataChannel extends EventTarget {
36
36
  send(data: Buffer | string): void;
37
37
  close(): void;
38
38
  }
39
- export declare type DCState = "open" | "closed" | "connecting" | "closing";
39
+ export type DCState = "open" | "closed" | "connecting" | "closing";
40
40
  export declare class RTCDataChannelParameters {
41
41
  label: string;
42
42
  maxPacketLifeTime?: number;
@@ -11,19 +11,111 @@ const log = (0, debug_1.default)("werift:packages/webrtc/src/dataChannel.ts");
11
11
  class RTCDataChannel extends helper_1.EventTarget {
12
12
  constructor(transport, parameters, sendOpen = true) {
13
13
  super();
14
- this.transport = transport;
15
- this.parameters = parameters;
16
- this.sendOpen = sendOpen;
17
- this.stateChanged = new rx_mini_1.Event();
18
- this.message = new rx_mini_1.Event();
14
+ Object.defineProperty(this, "transport", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: transport
19
+ });
20
+ Object.defineProperty(this, "parameters", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: parameters
25
+ });
26
+ Object.defineProperty(this, "sendOpen", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: sendOpen
31
+ });
32
+ Object.defineProperty(this, "stateChanged", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: new rx_mini_1.Event()
37
+ });
38
+ Object.defineProperty(this, "message", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: new rx_mini_1.Event()
43
+ });
19
44
  // todo impl
20
- this.error = new rx_mini_1.Event();
21
- this.bufferedAmountLow = new rx_mini_1.Event();
22
- this.isCreatedByRemote = false;
45
+ Object.defineProperty(this, "error", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: new rx_mini_1.Event()
50
+ });
51
+ Object.defineProperty(this, "bufferedAmountLow", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: new rx_mini_1.Event()
56
+ });
57
+ Object.defineProperty(this, "onopen", {
58
+ enumerable: true,
59
+ configurable: true,
60
+ writable: true,
61
+ value: void 0
62
+ });
63
+ Object.defineProperty(this, "onclose", {
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true,
67
+ value: void 0
68
+ });
69
+ Object.defineProperty(this, "onclosing", {
70
+ enumerable: true,
71
+ configurable: true,
72
+ writable: true,
73
+ value: void 0
74
+ });
75
+ Object.defineProperty(this, "onmessage", {
76
+ enumerable: true,
77
+ configurable: true,
78
+ writable: true,
79
+ value: void 0
80
+ });
81
+ // todo impl
82
+ Object.defineProperty(this, "onerror", {
83
+ enumerable: true,
84
+ configurable: true,
85
+ writable: true,
86
+ value: void 0
87
+ });
88
+ Object.defineProperty(this, "isCreatedByRemote", {
89
+ enumerable: true,
90
+ configurable: true,
91
+ writable: true,
92
+ value: false
93
+ });
94
+ Object.defineProperty(this, "id", {
95
+ enumerable: true,
96
+ configurable: true,
97
+ writable: true,
98
+ value: void 0
99
+ });
100
+ Object.defineProperty(this, "readyState", {
101
+ enumerable: true,
102
+ configurable: true,
103
+ writable: true,
104
+ value: "connecting"
105
+ });
106
+ Object.defineProperty(this, "bufferedAmount", {
107
+ enumerable: true,
108
+ configurable: true,
109
+ writable: true,
110
+ value: 0
111
+ });
112
+ Object.defineProperty(this, "_bufferedAmountLowThreshold", {
113
+ enumerable: true,
114
+ configurable: true,
115
+ writable: true,
116
+ value: 0
117
+ });
23
118
  this.id = this.parameters.id;
24
- this.readyState = "connecting";
25
- this.bufferedAmount = 0;
26
- this._bufferedAmountLowThreshold = 0;
27
119
  if (parameters.negotiated) {
28
120
  if (this.id == undefined || this.id < 0 || this.id > 65534) {
29
121
  throw new Error("ID must be in range 0-65534 if data channel is negotiated out-of-band");
@@ -109,10 +201,48 @@ class RTCDataChannel extends helper_1.EventTarget {
109
201
  exports.RTCDataChannel = RTCDataChannel;
110
202
  class RTCDataChannelParameters {
111
203
  constructor(props = {}) {
112
- this.label = "";
113
- this.ordered = true;
114
- this.protocol = "";
115
- this.negotiated = false;
204
+ Object.defineProperty(this, "label", {
205
+ enumerable: true,
206
+ configurable: true,
207
+ writable: true,
208
+ value: ""
209
+ });
210
+ Object.defineProperty(this, "maxPacketLifeTime", {
211
+ enumerable: true,
212
+ configurable: true,
213
+ writable: true,
214
+ value: void 0
215
+ }); // sec
216
+ Object.defineProperty(this, "maxRetransmits", {
217
+ enumerable: true,
218
+ configurable: true,
219
+ writable: true,
220
+ value: void 0
221
+ });
222
+ Object.defineProperty(this, "ordered", {
223
+ enumerable: true,
224
+ configurable: true,
225
+ writable: true,
226
+ value: true
227
+ });
228
+ Object.defineProperty(this, "protocol", {
229
+ enumerable: true,
230
+ configurable: true,
231
+ writable: true,
232
+ value: ""
233
+ });
234
+ Object.defineProperty(this, "negotiated", {
235
+ enumerable: true,
236
+ configurable: true,
237
+ writable: true,
238
+ value: false
239
+ });
240
+ Object.defineProperty(this, "id", {
241
+ enumerable: true,
242
+ configurable: true,
243
+ writable: true,
244
+ value: void 0
245
+ });
116
246
  Object.assign(this, props);
117
247
  }
118
248
  }