werift 0.18.13 → 0.18.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/lib/common/src/binary.js.map +1 -1
  2. package/lib/common/src/index.d.ts +0 -1
  3. package/lib/common/src/index.js +0 -1
  4. package/lib/common/src/index.js.map +1 -1
  5. package/lib/dtls/src/client.js.map +1 -1
  6. package/lib/dtls/src/context/cipher.js +1 -1
  7. package/lib/dtls/src/context/cipher.js.map +1 -1
  8. package/lib/dtls/src/context/dtls.js.map +1 -1
  9. package/lib/dtls/src/context/transport.js.map +1 -1
  10. package/lib/dtls/src/flight/client/flight1.js.map +1 -1
  11. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  12. package/lib/dtls/src/flight/flight.js +1 -1
  13. package/lib/dtls/src/flight/flight.js.map +1 -1
  14. package/lib/dtls/src/flight/server/flight4.js.map +1 -1
  15. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  16. package/lib/dtls/src/handshake/extensions/ellipticCurves.js +1 -1
  17. package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
  18. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +1 -1
  19. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
  20. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +1 -1
  21. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
  22. package/lib/dtls/src/handshake/extensions/signature.js +1 -1
  23. package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
  24. package/lib/dtls/src/handshake/extensions/useSrtp.js +1 -1
  25. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  26. package/lib/dtls/src/handshake/message/alert.js +1 -1
  27. package/lib/dtls/src/handshake/message/alert.js.map +1 -1
  28. package/lib/dtls/src/handshake/message/certificate.js +1 -1
  29. package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
  30. package/lib/dtls/src/handshake/message/changeCipherSpec.js +1 -1
  31. package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
  32. package/lib/dtls/src/handshake/message/client/certificateVerify.js +1 -1
  33. package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
  34. package/lib/dtls/src/handshake/message/client/hello.js +1 -1
  35. package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
  36. package/lib/dtls/src/handshake/message/client/keyExchange.js +1 -1
  37. package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
  38. package/lib/dtls/src/handshake/message/finished.js.map +1 -1
  39. package/lib/dtls/src/handshake/message/server/certificateRequest.js +1 -1
  40. package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
  41. package/lib/dtls/src/handshake/message/server/hello.js +1 -1
  42. package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
  43. package/lib/dtls/src/handshake/message/server/helloDone.js +1 -1
  44. package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
  45. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +1 -1
  46. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
  47. package/lib/dtls/src/handshake/message/server/keyExchange.js +1 -1
  48. package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
  49. package/lib/dtls/src/handshake/random.js +1 -1
  50. package/lib/dtls/src/handshake/random.js.map +1 -1
  51. package/lib/dtls/src/record/message/fragment.js +1 -1
  52. package/lib/dtls/src/record/message/fragment.js.map +1 -1
  53. package/lib/dtls/src/record/message/header.js +2 -2
  54. package/lib/dtls/src/record/message/header.js.map +1 -1
  55. package/lib/dtls/src/record/message/plaintext.js +1 -1
  56. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  57. package/lib/dtls/src/server.js.map +1 -1
  58. package/lib/dtls/src/socket.js.map +1 -1
  59. package/lib/dtls/src/transport.js.map +1 -1
  60. package/lib/ice/src/candidate.js.map +1 -1
  61. package/lib/ice/src/exceptions.js.map +1 -1
  62. package/lib/ice/src/helper.js.map +1 -1
  63. package/lib/ice/src/ice.js.map +1 -1
  64. package/lib/ice/src/stun/attributes.js.map +1 -1
  65. package/lib/ice/src/stun/message.js.map +1 -1
  66. package/lib/ice/src/stun/protocol.js.map +1 -1
  67. package/lib/ice/src/stun/transaction.js.map +1 -1
  68. package/lib/ice/src/transport.js.map +1 -1
  69. package/lib/ice/src/turn/protocol.js.map +1 -1
  70. package/lib/rtp/src/codec/av1.js +1 -1
  71. package/lib/rtp/src/codec/av1.js.map +1 -1
  72. package/lib/rtp/src/container/index.d.ts +2 -1
  73. package/lib/rtp/src/container/index.js +2 -1
  74. package/lib/rtp/src/container/index.js.map +1 -1
  75. package/lib/rtp/src/container/mp4/container.d.ts +66 -0
  76. package/lib/rtp/src/container/mp4/container.js +262 -0
  77. package/lib/rtp/src/container/mp4/container.js.map +1 -0
  78. package/lib/rtp/src/container/mp4/exp-golomb.d.ts +20 -0
  79. package/lib/rtp/src/container/mp4/exp-golomb.js +144 -0
  80. package/lib/rtp/src/container/mp4/exp-golomb.js.map +1 -0
  81. package/lib/rtp/src/container/mp4/h264.d.ts +42 -0
  82. package/lib/rtp/src/container/mp4/h264.js +240 -0
  83. package/lib/rtp/src/container/mp4/h264.js.map +1 -0
  84. package/lib/rtp/src/container/mp4/index.d.ts +2 -0
  85. package/lib/rtp/src/container/mp4/index.js +19 -0
  86. package/lib/rtp/src/container/mp4/index.js.map +1 -0
  87. package/lib/rtp/src/container/mp4/mp4box.d.ts +5 -0
  88. package/lib/rtp/src/container/mp4/mp4box.js +32 -0
  89. package/lib/rtp/src/container/mp4/mp4box.js.map +1 -0
  90. package/lib/rtp/src/container/mp4/sps-parser.d.ts +40 -0
  91. package/lib/rtp/src/container/mp4/sps-parser.js +291 -0
  92. package/lib/rtp/src/container/mp4/sps-parser.js.map +1 -0
  93. package/lib/rtp/src/container/ogg/index.d.ts +1 -0
  94. package/lib/rtp/src/container/ogg/index.js +18 -0
  95. package/lib/rtp/src/container/ogg/index.js.map +1 -0
  96. package/lib/rtp/src/container/ogg/parser.d.ts +12 -0
  97. package/lib/rtp/src/container/ogg/parser.js +100 -0
  98. package/lib/rtp/src/container/ogg/parser.js.map +1 -0
  99. package/lib/rtp/src/container/{webm.d.ts → webm/container.d.ts} +1 -1
  100. package/lib/rtp/src/container/{webm.js → webm/container.js} +6 -6
  101. package/lib/rtp/src/container/webm/container.js.map +1 -0
  102. package/lib/rtp/src/container/webm/ebml/ebml.js.map +1 -0
  103. package/lib/rtp/src/container/webm/ebml/id.js.map +1 -0
  104. package/lib/rtp/src/container/webm/ebml/index.js.map +1 -0
  105. package/lib/rtp/src/container/webm/ebml/typedArrayUtils.js.map +1 -0
  106. package/lib/rtp/src/container/webm/index.d.ts +2 -0
  107. package/lib/rtp/src/container/webm/index.js +19 -0
  108. package/lib/rtp/src/container/webm/index.js.map +1 -0
  109. package/lib/rtp/src/processor/depacketizer.js.map +1 -1
  110. package/lib/rtp/src/processor/dtx.d.ts +1 -1
  111. package/lib/rtp/src/processor/dtx.js.map +1 -1
  112. package/lib/rtp/src/processor/index.d.ts +2 -0
  113. package/lib/rtp/src/processor/index.js +2 -0
  114. package/lib/rtp/src/processor/index.js.map +1 -1
  115. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  116. package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -1
  117. package/lib/rtp/src/processor/lipsync.js.map +1 -1
  118. package/lib/rtp/src/processor/lipsyncCallback.js.map +1 -1
  119. package/lib/rtp/src/processor/mp4.d.ts +50 -0
  120. package/lib/rtp/src/processor/mp4.js +162 -0
  121. package/lib/rtp/src/processor/mp4.js.map +1 -0
  122. package/lib/rtp/src/processor/mp4Callback.d.ts +12 -0
  123. package/lib/rtp/src/processor/mp4Callback.js +83 -0
  124. package/lib/rtp/src/processor/mp4Callback.js.map +1 -0
  125. package/lib/rtp/src/processor/mute.d.ts +1 -1
  126. package/lib/rtp/src/processor/mute.js +6 -3
  127. package/lib/rtp/src/processor/mute.js.map +1 -1
  128. package/lib/rtp/src/processor/muteCallback.js.map +1 -1
  129. package/lib/rtp/src/processor/nack.js +2 -3
  130. package/lib/rtp/src/processor/nack.js.map +1 -1
  131. package/lib/rtp/src/processor/ntpTime.d.ts +1 -1
  132. package/lib/rtp/src/processor/ntpTime.js.map +1 -1
  133. package/lib/rtp/src/processor/rtcpCallback.js.map +1 -1
  134. package/lib/rtp/src/processor/rtpCallback.js.map +1 -1
  135. package/lib/rtp/src/processor/rtpStream.js.map +1 -1
  136. package/lib/rtp/src/processor/rtpTime.js.map +1 -1
  137. package/lib/rtp/src/processor/webm.d.ts +1 -1
  138. package/lib/rtp/src/processor/webm.js +1 -1
  139. package/lib/rtp/src/processor/webm.js.map +1 -1
  140. package/lib/rtp/src/processor/webmCallback.d.ts +1 -1
  141. package/lib/rtp/src/processor/webmCallback.js.map +1 -1
  142. package/lib/rtp/src/processor/webmStream.d.ts +1 -1
  143. package/lib/rtp/src/processor/webmStream.js.map +1 -1
  144. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +1 -1
  145. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
  146. package/lib/rtp/src/rtcp/psfb/index.js +1 -1
  147. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  148. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +1 -1
  149. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
  150. package/lib/rtp/src/rtcp/psfb/remb.js +1 -1
  151. package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
  152. package/lib/rtp/src/rtcp/rr.js +3 -7
  153. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  154. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  155. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  156. package/lib/rtp/src/rtcp/rtpfb/nack.js +6 -13
  157. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  158. package/lib/rtp/src/rtcp/rtpfb/twcc.js +12 -8
  159. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  160. package/lib/rtp/src/rtcp/sdes.js +1 -1
  161. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  162. package/lib/rtp/src/rtcp/sr.js +2 -6
  163. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  164. package/lib/rtp/src/rtp/headerExtension.d.ts +5 -0
  165. package/lib/rtp/src/rtp/headerExtension.js +35 -9
  166. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  167. package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
  168. package/lib/rtp/src/rtp/red/handler.js.map +1 -1
  169. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  170. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  171. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  172. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  173. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  174. package/lib/rtp/src/srtp/session.js.map +1 -1
  175. package/lib/rtp/src/srtp/srtcp.js.map +1 -1
  176. package/lib/rtp/src/srtp/srtp.js.map +1 -1
  177. package/lib/rtp/src/util.js.map +1 -1
  178. package/lib/sctp/src/chunk.js +17 -17
  179. package/lib/sctp/src/chunk.js.map +1 -1
  180. package/lib/sctp/src/param.js +3 -3
  181. package/lib/sctp/src/param.js.map +1 -1
  182. package/lib/sctp/src/sctp.js.map +1 -1
  183. package/lib/sctp/src/transport.js.map +1 -1
  184. package/lib/webrtc/src/const.js.map +1 -1
  185. package/lib/webrtc/src/dataChannel.js.map +1 -1
  186. package/lib/webrtc/src/media/parameters.js.map +1 -1
  187. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  188. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  189. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  190. package/lib/webrtc/src/media/router.js.map +1 -1
  191. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  192. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  193. package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
  194. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  195. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  196. package/lib/webrtc/src/media/track.js.map +1 -1
  197. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  198. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  199. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  200. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  201. package/lib/webrtc/src/peerConnection.js.map +1 -1
  202. package/lib/webrtc/src/sdp.js.map +1 -1
  203. package/lib/webrtc/src/transport/dtls.d.ts +1 -1
  204. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  205. package/lib/webrtc/src/transport/ice.d.ts +2 -2
  206. package/lib/webrtc/src/transport/ice.js.map +1 -1
  207. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  208. package/lib/webrtc/src/types/domain.d.ts +2 -2
  209. package/lib/webrtc/src/types/domain.js.map +1 -1
  210. package/lib/webrtc/src/utils.d.ts +1 -0
  211. package/lib/webrtc/src/utils.js +9 -1
  212. package/lib/webrtc/src/utils.js.map +1 -1
  213. package/package.json +5 -3
  214. package/src/const.ts +1 -1
  215. package/src/dataChannel.ts +3 -3
  216. package/src/media/parameters.ts +3 -3
  217. package/src/media/receiver/nack.ts +7 -4
  218. package/src/media/receiver/receiverTwcc.ts +5 -5
  219. package/src/media/receiver/statistics.ts +1 -1
  220. package/src/media/router.ts +5 -5
  221. package/src/media/rtpReceiver.ts +9 -9
  222. package/src/media/rtpSender.ts +8 -8
  223. package/src/media/rtpTransceiver.ts +3 -3
  224. package/src/media/sender/senderBWE.ts +2 -2
  225. package/src/media/track.ts +1 -1
  226. package/src/nonstandard/recorder/index.ts +1 -1
  227. package/src/nonstandard/recorder/writer/index.ts +1 -1
  228. package/src/nonstandard/recorder/writer/webm.ts +2 -2
  229. package/src/nonstandard/userMedia.ts +1 -1
  230. package/src/peerConnection.ts +52 -52
  231. package/src/sdp.ts +27 -21
  232. package/src/transport/dtls.ts +13 -10
  233. package/src/transport/ice.ts +6 -6
  234. package/src/transport/sctp.ts +4 -4
  235. package/src/types/domain.ts +2 -2
  236. package/src/utils.ts +11 -2
  237. package/lib/common/src/array.d.ts +0 -1
  238. package/lib/common/src/array.js +0 -15
  239. package/lib/common/src/array.js.map +0 -1
  240. package/lib/rtp/src/container/ebml/ebml.js.map +0 -1
  241. package/lib/rtp/src/container/ebml/id.js.map +0 -1
  242. package/lib/rtp/src/container/ebml/index.js.map +0 -1
  243. package/lib/rtp/src/container/ebml/typedArrayUtils.js.map +0 -1
  244. package/lib/rtp/src/container/webm.js.map +0 -1
  245. /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.d.ts +0 -0
  246. /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.js +0 -0
  247. /package/lib/rtp/src/container/{ebml → webm/ebml}/id.d.ts +0 -0
  248. /package/lib/rtp/src/container/{ebml → webm/ebml}/id.js +0 -0
  249. /package/lib/rtp/src/container/{ebml → webm/ebml}/index.d.ts +0 -0
  250. /package/lib/rtp/src/container/{ebml → webm/ebml}/index.js +0 -0
  251. /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.d.ts +0 -0
  252. /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../sctp/src/sctp.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAiD;AACjD,kDAA0B;AAC1B,mCAAgC;AAChC,yDAAiC;AACjC,qCAAgC;AAEhC,0CAM0B;AAC1B,mCAoBiB;AACjB,mCAAqC;AACrC,qCAAqE;AACrE,mCAOiB;AAGjB,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,kBAAkB,CAAC,CAAC;AAEtC,8BAA8B;AAE9B,oBAAoB;AACpB,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,uBAAuB;AACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AACxC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,CAAC;AAEhC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,eAAe;AACf,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,wBAAwB,GAAG,MAAM,CAAC,CAAC,OAAO;AAChD,MAAM,qBAAqB,GAAG,MAAM,CAAC,CAAC,OAAO;AAE7C,MAAM,oBAAoB,GAAG;IAC3B,KAAK;IACL,QAAQ;IACR,WAAW;IACX,YAAY;CACJ,CAAC;AAGX,MAAa,IAAI;IAkFf,YAAmB,SAAoB,EAAS,OAAO,IAAI;;;;;mBAAxC;;;;;;mBAA6B;;QAjFhD;;;;mBAEI,IAAA,6BAAoB,EAAC,oBAAoB,CAAC;WAAC;QAC/C;;;;mBAA6B,IAAI,eAAK,EAAc;WAAC;QACrD,kDAAkD;QAClD;;;;mBAAqB,IAAI,eAAK,EAA4B;WAAC;QAC3D;;;;mBAAsC,KAAK,IAAI,EAAE,GAAE,CAAC;WAAC;QAErD;;;;mBAAmB,kBAAU,CAAC,MAAM;WAAC;QACrC;;;;mBAAU,KAAK;WAAC;QAChB;;;;mBAA6B,KAAK;WAAC;QACnC;;;;mBAAW,IAAI;WAAC;QAEhB;;;;mBAAkB,IAAA,oBAAW,EAAC,EAAE,CAAC;WAAC;QAClC;;;;mBAAkC,IAAI;WAAC;QACvC;;;;;WAA0B;QAC1B;;;;mBAA+B,IAAA,cAAQ,GAAE;WAAC;QAE1C;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAA2B,IAAI;WAAC;QAChC;;;;;WAA4B;QAC5B;;;;mBAAgC,CAAC;WAAC;QAElC,UAAU;QACV;;;;mBAAyB,IAAI,GAAG,IAAI;WAAC,CAAC,kBAAkB;QACxD;;;;mBAA2D,EAAE;WAAC;QAC9D;;;;mBAAuB,CAAC;WAAC;QACzB;;;;mBAAqB,WAAW;WAAC;QACjC;;;;;WAAiC,CAAC,+BAA+B;QACjE;;;;mBAAmC,EAAE;WAAC;QACtC;;;;mBAAyB,IAAI,GAAG,EAAU;WAAC;QAC3C;;;;mBAAqB,KAAK;WAAC;QAE3B,aAAa;QACb;;;;mBAAe,CAAC,GAAG,mBAAmB;WAAC,CAAC,oBAAoB;QAC5D;;;;;WAAkC;QAClC;;;;mBAA+B,KAAK;WAAC;QACrC;;;;;WAA0C;QAC1C;;;;mBAAqB,CAAC;WAAC;QACvB;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAA4D,EAAE;WAAC;QAC/D;;;;mBAAwB,WAAW;WAAC;QACpC,wCAAwC;QACxC;;;;mBAAmB,MAAM,CAAC,IAAA,cAAQ,GAAE,CAAC;WAAC;QACtC;;;;mBAAwB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;WAAC;QACnD;;;;mBAA6B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;WAAC,CAAC,kBAAkB;QAC3E;;;;mBAA4B,CAAC;WAAC;QAC9B;;;;mBAAiC,EAAE;WAAC;QAEpC,oBAAoB;QAEpB,uFAAuF;QACvF;;;;mBAAqB,IAAI,CAAC,QAAQ;WAAC;QACnC,6HAA6H;QAC7H;;;;mBAAsB,CAAC;WAAC;QACxB;;;;;WAA+C;QAC/C;;;;mBAA0B,EAAE;WAAC;QAE7B,kBAAkB;QAClB;;;;;WAAsB;QACtB;;;;;WAAwB;QAExB,SAAS;QACT;;;;mBAAc,gBAAgB;WAAC;QAC/B,yCAAyC;QACzC;;;;;WAA2B;QAC3B;;;;;WAA4B;QAC5B;;;;mBAAyB,CAAC;WAAC;QAC3B,6BAA6B;QAC7B;;;;;WAA2B;QAC3B;;;;;WAA4B;QAC5B;;;;mBAAyB,CAAC;WAAC;QAC3B,8BAA8B;QAC9B;;;;;WAA2B;QAC3B,4BAA4B;QAC5B;;;;;WAAkC;QAClC;;;;mBAAgC,CAAC;WAAC;QAElC,MAAM;QACN;;;;;WAA0B,CAAC,uBAAuB;QA+jBlD;;;;mBAAO,KAAK,EACV,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,EACE,MAAM,EACN,cAAc,EACd,OAAO,MAKL,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EACnE,EAAE;gBACF,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEzE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;gBACnE,IAAI,GAAG,GAAG,CAAC,CAAC;gBACZ,MAAM,MAAM,GAAgB,EAAE,CAAC;gBAC/B,KAAK,MAAM,QAAQ,IAAI,IAAA,eAAK,EAAC,CAAC,EAAE,SAAS,CAAC,EAAE;oBAC1C,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;oBAC1C,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;oBAChB,IAAI,CAAC,OAAO,EAAE;wBACZ,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC;qBACnC;oBACD,IAAI,QAAQ,KAAK,CAAC,EAAE;wBAClB,KAAK,CAAC,KAAK,IAAI,oBAAoB,CAAC;qBACrC;oBACD,IAAI,QAAQ,KAAK,SAAS,GAAG,CAAC,EAAE;wBAC9B,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC;qBACpC;oBACD,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;oBAC1B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBAC1B,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;oBAClC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACtB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAC;oBAChE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACvC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;oBACtB,KAAK,CAAC,cAAc,GAAG,cAAc,CAAC;oBAEtC,GAAG,IAAI,mBAAmB,CAAC;oBAC3B,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACpB;gBAED,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;gBAEH,IAAI,OAAO,EAAE;oBACX,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,IAAA,eAAS,EAAC,YAAY,EAAE,CAAC,CAAC,CAAC;iBAC/D;gBAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;oBACtB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACvB;qBAAM;oBACL,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3C;YACH,CAAC;WAAC;QAoIF;;;;mBAAwB,GAAG,EAAE;gBAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,IAAI,IAAI,CAAC,cAAc,GAAG,qBAAqB,EAAE;oBAC/C,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,MAAM,CAAC,CAAC;iBAClC;qBAAM;oBACL,YAAY,CAAC,GAAG,EAAE;wBAChB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAY,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;4BACrD,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC/C,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;iBACrE;YACH,CAAC;WAAC;QAkBF;;;;mBAAwB,GAAG,EAAE;gBAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,IAAI,IAAI,CAAC,cAAc,GAAG,4BAA4B,EAAE;oBACtD,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,MAAM,CAAC,CAAC;iBAClC;qBAAM;oBACL,YAAY,CAAC,GAAG,EAAE;wBAChB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAY,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;4BACrD,GAAG,CAAC,yBAAyB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC9C,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;iBACrE;YACH,CAAC;WAAC;QAsBF;;;;mBAAwB,GAAG,EAAE;gBAC3B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAE9B,wCAAwC;gBACxC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;wBAC7B,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;qBACzB;gBACH,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBAElC,6BAA6B;gBAC7B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBACpB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAE3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,EACzB,CAAC,GAAG,mBAAmB,CACxB,CAAC;gBACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;gBAEhC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;WAAC;QAoBF;;;;mBAAqC,KAAK,IAAI,EAAE;gBAC9C,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,WAAW;gBACX,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBAErC,IAAI,IAAI,CAAC,qBAAqB,GAAG,4BAA4B,EAAE;oBAC7D,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBACzD,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,MAAM,CAAC,CAAC;oBAEjC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;iBACtC;qBAAM,IAAI,IAAI,CAAC,eAAe,EAAE;oBAC/B,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBACxE,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBAEnD,IAAI,CAAC,mBAAmB,GAAG,UAAU,CACnC,IAAI,CAAC,0BAA0B,EAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,CAChB,CAAC;iBACH;YACH,CAAC;WAAC;QA13BA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,WAAW;QACb,IAAI,IAAI,CAAC,oBAAoB,GAAG,CAAC;YAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,SAAoB,EAAE,IAAI,GAAG,IAAI;QAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,SAAoB,EAAE,IAAI,GAAG,IAAI;QAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IACnB,KAAK,CAAC,UAAU,CAAC,IAAY;QACnC,IAAI,WAAmB,CAAC;QAExB,MAAM,CAAC,EAAE,AAAD,EAAG,eAAe,EAAE,MAAM,CAAC,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACzE,IAAI,SAAS,GAAG,CAAC,EAAE;YACjB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;gBACtB,MAAM,IAAI,KAAK,EAAE,CAAC;aACnB;YACD,WAAW,GAAG,CAAC,CAAC;SACjB;aAAM;YACL,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC;SACzC;QAED,IAAI,eAAe,KAAK,WAAW,EAAE;YACnC,OAAO;SACR;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SAChC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;SACvB;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,IAAI,GAAuB,EAAE,CAAC;QACpC,IAAI,OAAe,CAAC;QACpB,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,eAAgB,CAAC,GAAG,eAAe,CAAC;YAC5D,IAAI,GAAG,KAAK,OAAO,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;aAChC;iBAAM;gBACL,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;aACvB;YACD,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,iBAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAgB,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YAC9C,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAY;QACrC,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,iBAAS,CAAC,IAAI;gBACjB;oBACE,IAAI,CAAC,gBAAgB,CAAC,KAAkB,CAAC,CAAC;iBAC3C;gBACD,MAAM;YACR,KAAK,iBAAS,CAAC,IAAI;gBACjB;oBACE,IAAI,CAAC,IAAI,CAAC,QAAQ;wBAAE,OAAO;oBAC3B,MAAM,IAAI,GAAG,KAAkB,CAAC;oBAEhC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;oBAC1B,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACpD,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACxD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,CAAC;oBAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;oBACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAEhC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAClC,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,kBAAkB,CACxB,CAAC;oBACF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CACnC,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,cAAc,CACpB,CAAC;oBAEF,MAAM,GAAG,GAAG,IAAI,oBAAY,EAAE,CAAC;oBAC/B,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC;oBAC5C,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;oBACzC,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC;oBACjD,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC;oBAC/C,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;oBAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;oBAC/B,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;wBACrB,MAAM;wBACN,IAAA,mBAAU,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;qBACzD,CAAC,CAAC;oBACH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC7C,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;oBACzB,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBAC7C,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC1C,CAAC,CAAC,CAAC;iBACJ;gBACD,MAAM;YACR,KAAK,oBAAY,CAAC,IAAI;gBACpB;oBACE,IAAI,IAAI,CAAC,gBAAgB,IAAI,kBAAU,CAAC,WAAW;wBAAE,OAAO;oBAE5D,MAAM,OAAO,GAAG,KAAqB,CAAC;oBACtC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACvD,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC3D,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;oBACjD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;oBACvC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAEnC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAClC,OAAO,CAAC,eAAe,EACvB,IAAI,CAAC,kBAAkB,CACxB,CAAC;oBACF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,CACnC,IAAI,CAAC,qBAAqB,EAC1B,OAAO,CAAC,cAAc,CACvB,CAAC;oBAEF,MAAM,IAAI,GAAG,IAAI,uBAAe,EAAE,CAAC;oBACnC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE;wBACnC,IAAI,CAAC,KAAK,iBAAiB,EAAE;4BAC3B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;4BACd,MAAM;yBACP;qBACF;oBACD,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBAC9C,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC;oBAEH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,aAAa,CAAC,CAAC;iBACzC;gBACD,MAAM;YACR,KAAK,iBAAS,CAAC,IAAI;gBACjB;oBACE,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAkB,CAAC,CAAC;iBACjD;gBACD,MAAM;YACR,KAAK,sBAAc,CAAC,IAAI;gBACtB;oBACE,MAAM,GAAG,GAAG,IAAI,yBAAiB,EAAE,CAAC;oBACpC,GAAG,CAAC,MAAM,GAAI,KAAwB,CAAC,MAAM,CAAC;oBAC9C,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBAC7C,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAChD,CAAC,CAAC,CAAC;iBACJ;gBACD,MAAM;YACR,KAAK,kBAAU,CAAC,IAAI;gBAClB;oBACE,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,MAAM,CAAC,CAAC;iBAClC;gBACD,MAAM;YACR,KAAK,qBAAa,CAAC,IAAI;gBACrB;oBACE,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,iBAAiB,CAAC,CAAC;oBAC5C,MAAM,GAAG,GAAG,IAAI,wBAAgB,EAAE,CAAC;oBACnC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBAC7C,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC/C,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAClB,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,aAAa,CAAC,CAAC;iBACzC;gBACD,MAAM;YACR,KAAK,kBAAU,CAAC,IAAI;gBAClB;oBACE,uCAAuC;oBACvC,0EAA0E;oBAC1E,oEAAoE;oBACpE,wBAAwB;oBACxB,GAAG,CAAC,YAAY,EAAG,KAAoB,CAAC,YAAY,CAAC,CAAC;iBACvD;gBACD,MAAM;YACR,KAAK,uBAAe,CAAC,IAAI;gBACvB;oBACE,IAAI,CAAC,IAAI,CAAC,QAAQ;wBAAE,OAAO;oBAC3B,MAAM,IAAI,GAAG,KAAwB,CAAC;oBACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAK,CAAC;oBAC1B,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;yBAC5C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;yBAC1B,MAAM,EAAE,CAAC;oBACZ,IACE,MAAM,EAAE,MAAM,IAAI,aAAa;wBAC/B,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAC/B;wBACA,GAAG,CAAC,2BAA2B,CAAC,CAAC;wBACjC,OAAO;qBACR;oBACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;oBAC9B,MAAM,KAAK,GAAG,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7C,IAAI,KAAK,GAAG,GAAG,GAAG,eAAe,IAAI,KAAK,GAAG,GAAG,EAAE;wBAChD,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;wBAC3C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;4BAChB,kBAAU,CAAC,IAAI,CAAC,gBAAgB;4BAChC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;yBAC5D,CAAC,CAAC;wBACH,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;4BAC/C,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC7C,CAAC,CAAC,CAAC;wBACH,OAAO;qBACR;oBACD,MAAM,GAAG,GAAG,IAAI,sBAAc,EAAE,CAAC;oBACjC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;wBAC7C,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC5C,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,WAAW,CAAC,CAAC;iBACvC;gBACD,MAAM;YACR,KAAK,sBAAc,CAAC,IAAI;gBACtB;oBACE,IAAI,IAAI,CAAC,gBAAgB,IAAI,kBAAU,CAAC,aAAa;wBAAE,OAAO;oBAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,WAAW,CAAC,CAAC;iBACvC;gBACD,MAAM;YACR,KAAK,6BAAqB,CAAC,IAAI;gBAC7B;oBACE,IAAI,IAAI,CAAC,gBAAgB,IAAI,kBAAU,CAAC,iBAAiB;wBAAE,OAAO;oBAClE,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,MAAM,CAAC,CAAC;iBAClC;gBACD,MAAM;YACR,aAAa;YACb,KAAK,qBAAa,CAAC,IAAI;gBACrB;oBACE,IAAI,IAAI,CAAC,gBAAgB,IAAI,kBAAU,CAAC,WAAW;wBAAE,OAAO;oBAC5D,MAAM,QAAQ,GAAG,KAAsB,CAAC;oBACxC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE;wBAC1C,MAAM,MAAM,GAAG,+BAAuB,CAAC,IAAI,CAAC,CAAC;wBAC7C,IAAI,MAAM,EAAE;4BACV,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;yBACrD;qBACF;iBACF;gBACD,MAAM;YACR,KAAK,uBAAe,CAAC,IAAI;gBACvB;oBACE,IAAI,CAAC,sBAAsB,CAAC,KAAwB,CAAC,CAAC;iBACvD;gBACD,MAAM;SACT;IACH,CAAC;IAEO,aAAa,CAAC,MAA0B;QAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE;YAC3B,IAAI,CAAC,KAAK,qBAAqB,EAAE;gBAC/B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;aACtC;iBAAM,IAAI,CAAC,KAAK,wBAAwB,EAAE;gBACzC,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aAChC;SACF;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,KAAkB;QACnD,GAAG,CAAC,sBAAsB,EAAE,+BAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,oCAA4B,CAAC,IAAI;gBACpC;oBACE,MAAM,CAAC,GAAG,KAAqC,CAAC;oBAEhD,kBAAkB;oBAClB,MAAM,QAAQ,GAAG,IAAI,6BAAqB,CACxC,CAAC,CAAC,eAAe,EACjB,sBAAc,CAAC,8BAA8B,CAC9C,CAAC;oBACF,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,eAAe,CAAC;oBAC7C,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBAEvC,gCAAgC;oBAChC,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;wBAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;wBACrC,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;4BACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;4BAClC,yCAAyC;yBAC1C;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACrC,uBAAuB;oBACvB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;iBAC3C;gBACD,MAAM;YACR,KAAK,6BAAqB,CAAC,IAAI;gBAC7B;oBACE,MAAM,KAAK,GAAG,KAA8B,CAAC;oBAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,sBAAc,CAAC,8BAA8B,EAAE;wBAClE,GAAG,CACD,qCAAqC,EACrC,MAAM,CAAC,IAAI,CAAC,sBAAc,CAAC,CAAC,IAAI,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAc,CAAC,GAAY,CAAC,KAAK,KAAK,CAAC,MAAM,CACvD,CACF,CAAC;qBACH;yBAAM,IACL,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,eAAe,EAAE,eAAe,EAChE;wBACA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;4BAC9D,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;4BACxC,OAAO,QAAQ,CAAC;wBAClB,CAAC,CAAC,CAAC;wBAEH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBAE1C,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;wBACjC,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;4BACjC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;yBACtC;qBACF;iBACF;gBACD,MAAM;YACR,KAAK,8BAAsB,CAAC,IAAI;gBAC9B;oBACE,MAAM,GAAG,GAAG,KAA+B,CAAC;oBAC5C,IAAI,CAAC,oBAAoB,IAAI,GAAG,CAAC,UAAU,CAAC;oBAC5C,MAAM,GAAG,GAAG,IAAI,6BAAqB,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,eAAe,CAAC;oBAC/C,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;iBACnC;gBACD,MAAM;SACT;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAgB;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO;QAEzC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE5D,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7C,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,WAAW,EAAE,EAAE;YACjD,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;SAC1B;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAgB;QAC7C,MAAM;QACN,uBAAuB;QACvB,MAAM;QAEN,IAAI,IAAA,cAAQ,EAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC;YAAE,OAAO;QAE9D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;QACvD,IAAI,IAAI,GAAG,CAAC,EACV,SAAS,GAAG,CAAC,CAAC;QAEhB,6BAA6B;QAC7B,OACE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YACzB,IAAA,eAAS,EAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EACpD;YACA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAG,CAAC;YACvC,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;gBAClB,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;aACjC;YAED,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE;gBACxC,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,QAAS,CAAC,CAAC;aACjD;SACF;QAED,sBAAsB;QACtB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,cAAsB,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACzB,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxC,cAAc,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,eAAe,CAAC;gBAC/D,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3B,CAAC,CAAC,CACH,CAAC;YAEF,IAAI,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAAC;YAC5C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnC,IAAI,IAAA,cAAQ,EAAC,MAAM,CAAC,GAAG,EAAE,cAAe,CAAC,EAAE;oBACzC,MAAM;iBACP;gBACD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBACzC,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC;oBAC7B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAChC,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC;iBAChC;aACF;YAED,wCAAwC;YACxC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;gBACnC,IAAI,IAAA,cAAQ,EAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE;oBAC3C,MAAM;iBACP;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBACzB,MAAM,CAAC,MAAM,EAAE,CAAC;oBAChB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;wBACvB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;wBAClB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;4BAC9B,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;yBAC1B;wBACD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;wBACrB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;wBAChC,IAAI,GAAG,IAAI,CAAC;qBACb;iBACF;aACF;SACF;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACvC,IAAI,IAAI,IAAI,iBAAiB,EAAE;gBAC7B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAS,EAAE;oBAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;iBACvD;qBAAM;oBACL,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC;oBACpC,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,EAAE;wBACvC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC;wBACpC,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC;qBAClC;iBACF;aACF;YACD,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,EACzB,CAAC,GAAG,mBAAmB,CACxB,CAAC;gBACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBACtE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;aAClC;SACF;aAAM,IAAI,IAAA,eAAS,EAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE;YAChE,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;SACnC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;aAAM,IAAI,IAAI,GAAG,CAAC,EAAE;YACnB,IAAI,CAAC,aAAa,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAED,sBAAsB,CAAC,KAAsB;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,eAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE;YACzD,OAAO;SACR;QAED,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAA,cAAQ,EAAC,CAAC,EAAE,IAAI,CAAC,eAAgB,CAAC,CAAC;QAErE,2BAA2B;QAC3B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;YACjD,IAAI,GAAG,KAAK,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;gBAC5C,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;aAC5B;iBAAM;gBACL,MAAM;aACP;SACF;QAED,gCAAgC;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAE3E,sBAAsB;QACtB,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;YACpD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAEtD,iDAAiD;YACjD,aAAa,CAAC,oBAAoB,GAAG,IAAA,eAAS,EAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAChE,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,WAAW,EAAE,EAAE;gBACjD,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;aAC1B;SACF;QAED,0BAA0B;QAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;YAC3D,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,CAAS;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;SACf;aAAM;YACL,IAAI,CAAC,MAAM;gBACT,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,MAAO;oBAClC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,cAAc,GAAG,CAAC,CAAC;SACnE;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CACjB,YAAY,EACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CACpD,CAAC;IACJ,CAAC;IAEO,OAAO,CAAC,QAAgB,EAAE,IAAY,EAAE,IAAY;QAC1D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;YAClC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;SACrD;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,eAAgB,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACzE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;YACjD,IAAI,GAAG,KAAK,UAAU,CAAC,IAAI,CAAC,eAAgB,CAAC,EAAE;gBAC7C,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;aAC5B;iBAAM;gBACL,MAAM;aACP;SACF;QAED,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAA,cAAQ,EAAC,CAAC,EAAE,IAAI,CAAC,eAAgB,CAAC,CAAC;QAErE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAE3E,OAAO,KAAK,CAAC;IACf,CAAC;IA8DO,KAAK,CAAC,QAAQ;QACpB,MAAM;QACN,0BAA0B;QAC1B,MAAM;QAEN,qBAAqB;QACrB,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;gBAC9D,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;YAEjC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACtB,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;QAED,MAAM,SAAS,GACb,IAAI,CAAC,gBAAgB,IAAI,SAAS;YAChC,CAAC,CAAC,CAAC,GAAG,mBAAmB;YACzB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,kBAAkB,GAAG,IAAI,CAAC;QAC9B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,IAAI,SAAS,CAAC,UAAU,EAAE;gBACxB,IAAI,IAAI,CAAC,oBAAoB,EAAE;oBAC7B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;iBACnC;qBAAM,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE;oBAClC,OAAO;iBACR;gBACD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAEnC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrB,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC7B,SAAS,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;oBACnD,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;gBAEH,IAAI,kBAAkB,EAAE;oBACtB,IAAI,CAAC,aAAa,EAAE,CAAC;iBACtB;aACF;YACD,kBAAkB,GAAG,KAAK,CAAC;SAC5B;QAED,2BAA2B;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAE/B,oBAAoB;YACpB,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAEnC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;gBAC/C,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACtB,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,IACE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC7B,IAAI,CAAC,gBAAgB,KAAK,kBAAU,CAAC,WAAW;YAChD,CAAC,IAAI,CAAC,eAAe,EACrB;YACA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAElE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpE,MAAM,KAAK,GAAG,IAAI,oCAA4B,CAC5C,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,mBAAmB,EACxB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC1B,OAAO,CACR,CAAC;YACF,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAE9D,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACjC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAkB;QACxC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,qBAAa,EAAE,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YAC/C,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IACrC,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC7C,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,iBAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1C,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;SACvB;IACH,CAAC;IAEO,kBAAkB,CAAC,KAAgB;QACzC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC;IACpC,CAAC;IAEO,kBAAkB,CAAC,KAAgB;QACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,WAAW;IAEX,yCAAyC;IACjC,WAAW,CAAC,KAAY;QAC9B,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACtE,CAAC;IAiBO,YAAY;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;SAC9B;IACH,CAAC;IAED,6BAA6B;IACrB,OAAO,CAAC,KAAY;QAC1B,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACtE,CAAC;IAiBO,YAAY;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;SAC9B;IACH,CAAC;IAED,8BAA8B;IACtB,WAAW;QACjB,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACtE,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,kBAAkB;QAClB,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IA2BO,YAAY;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;SAC/B;IACH,CAAC;IAED,4BAA4B;IACpB,wBAAwB;QAC9B,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACrC,GAAG,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,UAAU,CACnC,IAAI,CAAC,0BAA0B,EAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,CAChB,CAAC;IACJ,CAAC;IAuBO,mBAAmB;QACzB,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACvC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;SACtC;IACH,CAAC;IAEO,0BAA0B;QAChC,IAAI,IAAA,cAAQ,EAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE;YACzD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC;SAC9C;QAED,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,OAAO,GAA8B,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;YAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAG,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC;YACpC,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,EAAE;gBACxC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;aAC9C;SACF;QAED,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,eAAe,GAAG,IAAI,uBAAe,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACzD,IAAI,CAAC,eAAe,CAAC,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAC7D,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBACrE,MAAM,CAAC,CAAC,CAAC;gBACT,CAAC;aACF,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,YAAY,CAAC,KAAgB;QACnC,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,OAAO,GACX,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,SAAU,CAAC;YACnE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QACxE,KAAK,MAAM,GAAG,IAAI,IAAA,eAAK,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,IAAI,MAAM,CAAC,KAAK,GAAG,mBAAmB,EAAE;gBACtC,MAAM;aACP;SACF;QAED,KAAK,MAAM,GAAG,IAAI,IAAA,eAAK,EAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,IAAI,MAAM,CAAC,KAAK,GAAG,mBAAmB,EAAE;gBACtC,MAAM;aACP;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,eAAe;QACpB,OAAO,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAmB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEtC,IAAI,UAAU,EAAE;gBACd,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;aAChC;YAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;aACnB;SACF;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,IAAI,GAAG,IAAI,iBAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEvB,IAAI;YACF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAE3B,+CAA+C;YAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,WAAW,CAAC,CAAC;SACvC;QAAC,OAAO,KAAU,EAAE;YACnB,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;SACxC;IACH,CAAC;IAEO,aAAa,CAAC,MAA0B;QAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtD,UAAU,CAAC,IAAI,CAAC,uBAAe,CAAC,IAAI,CAAC,CAAC;SACvC;QAED,UAAU,CAAC,IAAI,CAAC,qBAAa,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAY;QAC1B,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO;QACpC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;SACxC;QAED,MAAM,MAAM,GAAG,IAAA,uBAAe,EAC5B,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,qBAAqB,EAC1B,KAAK,CACN,CAAC;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,KAAiB;QACxB,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAClC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;SAC/B;QACD,IAAI,KAAK,KAAK,kBAAU,CAAC,WAAW,EAAE;YACpC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;SACtC;aAAM,IAAI,KAAK,KAAK,kBAAU,CAAC,MAAM,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC3B;IACH,CAAC;IAED,kBAAkB,CAAC,KAA0B;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,gBAAgB,KAAK,kBAAU,CAAC,MAAM,EAAE;YAC/C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;SACpB;QACD,IAAI,CAAC,QAAQ,CAAC,kBAAU,CAAC,MAAM,CAAC,CAAC;QACjC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,IAAI,kBAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YAC/C,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IACtE,CAAC;CACF;AA7nCD,oBA6nCC;AAED,MAAa,aAAa;IAIxB;QAHA;;;;mBAA0B,EAAE;WAAC;QAC7B;;;;mBAAuB,CAAC;WAAC,CAAC,MAAM;IAEjB,CAAC;IAEhB,QAAQ,CAAC,KAAgB;QACvB,IACE,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAC5B,IAAA,cAAQ,EAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EACpE;YACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAA,kBAAS,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC/C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAE1E,IAAI,IAAA,cAAQ,EAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACpC,MAAM;aACP;SACF;IACH,CAAC;IAED,CAAC,WAAW;QACV,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,QAA4B,CAAC;QACjC,IAAI,WAAmB,CAAC;QACxB,IAAI,OAA4B,CAAC;QACjC,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,CAAC;gBAC/C,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,oBAAoB,CAAC,EAAE;oBACzC,IAAI,OAAO,EAAE;wBACX,MAAM;qBACP;yBAAM;wBACL,GAAG,EAAE,CAAC;wBACN,SAAS;qBACV;iBACF;gBACD,IACE,OAAO;oBACP,IAAA,cAAQ,EAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,oBAAoB,CAAC,EACvD;oBACA,MAAM;iBACP;gBACD,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC;gBACxB,QAAQ,GAAG,GAAG,CAAC;aAChB;iBAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAY,EAAE;gBACrC,IAAI,OAAQ,EAAE;oBACZ,MAAM;iBACP;qBAAM;oBACL,QAAQ,GAAG,SAAS,CAAC;oBACrB,GAAG,EAAE,CAAC;oBACN,SAAS;iBACV;aACF;YAED,IAAI,KAAK,CAAC,KAAK,GAAG,mBAAmB,EAAE;gBACrC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;qBACxB,KAAK,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC;qBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;qBACtB,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACnB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACd,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC1B,OAAO,GAAG,CAAC;gBACb,CAAC,EAAE,EAAc,CAAC,CAAC;gBACrB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAEpC,IAAI,CAAC,UAAU,GAAG;oBAChB,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;oBACrC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;iBAClC,CAAC;gBACF,IAAI,OAAO,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,oBAAoB,EAAE;oBAC/D,IAAI,CAAC,oBAAoB,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;iBACrE;gBACD,GAAG,GAAG,QAAQ,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAClD;iBAAM;gBACL,GAAG,EAAE,CAAC;aACP;YACD,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;SACvC;IACH,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,MAAM;QACN,oCAAoC;QACpC,MAAM;QAEN,IAAI,GAAG,GAAG,CAAC,CAAC,EACV,IAAI,GAAG,CAAC,CAAC;QAEX,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,IAAA,eAAS,EAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC7B,GAAG,GAAG,CAAC,CAAC;gBACR,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC/B;iBAAM;gBACL,MAAM;aACP;SACF;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA5GD,sCA4GC;AAED,MAAa,mBAAmB;IAC9B,YAAmB,cAAsB;;;;;mBAAtB;;IAAyB,CAAC;CAC9C;AAFD,kDAEC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC;AACnC,CAAC","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"]}
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"]}
@@ -1 +1 @@
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"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../sctp/src/transport.ts"],"names":[],"mappings":";;;AAQA,MAAa,YAAY;IACvB,YAAoB,GAAW,EAAU,KAA0B;QAAvD;;;;mBAAQ,GAAG;WAAQ;QAAE;;;;mBAAQ,KAAK;WAAqB;QAMnE;;;;;WAA+B;QAE/B;;;;mBAAO,CAAC,GAAW,EAAE,EAAE,CACrB,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAAA,uDAGqC;AA8DZ,mGA/DvB,0BAAkB,OA+DuB;AA7D3C,sDAGqC;AAGrC,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,QAAA,YAAY,GAAG;IAC1B,2BAA2B,EAAE,2CAAoC;IACjE,qBAAqB,EAAE,qCAA8B;CAC7C,CAAC;AAEE,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,iBAAiB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import {\n HashAlgorithms,\n SignatureAlgorithm,\n} from \"../../dtls/src/cipher/const\";\nimport {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../../dtls/src/context/srtp\";\nimport { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport const SRTP_PROFILE = {\n SRTP_AES128_CM_HMAC_SHA1_80: ProtectionProfileAes128CmHmacSha1_80,\n SRTP_AEAD_AES_128_GCM: ProtectionProfileAeadAes128Gcm,\n} as const;\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const ReceiverDirection = [\"sendrecv\", \"recvonly\"];\n\nexport { HashAlgorithms, SignatureAlgorithm };\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAAA,uDAGqC;AA8DZ,mGA/DvB,0BAAkB,OA+DuB;AA7D3C,sDAGqC;AAGrC,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,QAAA,YAAY,GAAG;IAC1B,2BAA2B,EAAE,2CAAoC;IACjE,qBAAqB,EAAE,qCAA8B;CAC7C,CAAC;AAEE,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,iBAAiB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import {\n HashAlgorithms,\n SignatureAlgorithm,\n} from \"../../dtls/src/cipher/const\";\nimport {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../../dtls/src/context/srtp\";\nimport { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP,\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport const SRTP_PROFILE = {\n SRTP_AES128_CM_HMAC_SHA1_80: ProtectionProfileAes128CmHmacSha1_80,\n SRTP_AEAD_AES_128_GCM: ProtectionProfileAeadAes128Gcm,\n} as const;\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const ReceiverDirection = [\"sendrecv\", \"recvonly\"];\n\nexport { HashAlgorithms, SignatureAlgorithm };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { EventTarget } from \"./helper\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport class RTCDataChannel extends EventTarget {\n readonly stateChanged = new Event<[DCState]>();\n readonly message = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n constructor(\n private readonly transport: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true\n ) {\n super();\n\n this.id = this.parameters.id;\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\"\n );\n }\n this.transport.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.transport.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\"\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n this.transport.datachannelSend(this, data);\n }\n\n close() {\n this.transport.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
1
+ {"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { EventTarget } from \"./helper\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport class RTCDataChannel extends EventTarget {\n readonly stateChanged = new Event<[DCState]>();\n readonly message = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n constructor(\n private readonly transport: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true,\n ) {\n super();\n\n this.id = this.parameters.id;\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\",\n );\n }\n this.transport.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.transport.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\",\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n this.transport.datachannelSend(this, data);\n }\n\n close() {\n this.transport.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../../../src/media/parameters.ts"],"names":[],"mappings":";;;AAaA,MAAa,qBAAqB;IAahC,YACE,KACgC;QAdlC;;;WAGG;QACH;;;;;WAAqB;QACrB;;;;;WAAkB;QAClB;;;;;WAAmB;QACnB;;;;;WAAkB;QAClB;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;;WAAoB;QACpB;;;;mBAA+B,KAAK;WAAC;QAMnC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,GAAG;QACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,CAAC,IAAI,IAAI,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAjCD,sDAiCC;AAED,MAAa,+BAA+B;IAI1C,YACE,KAC8C;QALhD;;;;;WAAY;QACZ;;;;;WAAa;QAMX,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAVD,0EAUC;AAED,MAAa,iBAAiB;IAK5B,YAAY,QAAoC,EAAE;QAJlD;;;;;WAAe;QACf;;;;mBAAe,KAAK;WAAC;QACrB;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,8CAQC;AAED,MAAa,eAAe;IAI1B,YAAY,QAAkC,EAAE;QAHhD;;;;;WAAc;QACd;;;;;WAAmB;QAGjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAPD,0CAOC;AACD,MAAa,mBAAmB;IAG9B,YAAY,QAAsC,EAAE;QAFpD;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,kDAMC;AAED,MAAa,sBAAsB;IAKjC,YACE,KACsD;QANxD;;;;;WAAc;QACd;;;;;WAAqB;QACrB;;;;;WAA0B;QAMxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAXD,wDAWC;AAQD,MAAa,yBAAyB;IAGpC,YAAY,KAAgC;QAF5C;;;;;WAAa;QACb;;;;;WAA4B;QAE1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,8DAMC","sourcesContent":["import { Direction } from \"./rtpTransceiver\";\n\nexport interface RTCRtpParameters {\n codecs: RTCRtpCodecParameters[];\n headerExtensions: RTCRtpHeaderExtensionParameters[];\n muxId?: string;\n rtpStreamId?: string;\n repairedRtpStreamId?: string;\n rtcp?: RTCRtcpParameters;\n}\n\nexport type RTCPFB = { type: string; parameter?: string };\n\nexport class RTCRtpCodecParameters {\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n payloadType!: number;\n mimeType!: string;\n clockRate!: number;\n channels?: number;\n rtcpFeedback: RTCPFB[] = [];\n parameters?: string;\n direction: Direction | \"all\" = \"all\";\n\n constructor(\n props: Pick<RTCRtpCodecParameters, \"mimeType\" | \"clockRate\"> &\n Partial<RTCRtpCodecParameters>\n ) {\n Object.assign(this, props);\n }\n\n get name() {\n return this.mimeType.split(\"/\")[1];\n }\n\n get contentType() {\n return this.mimeType.split(\"/\")[0];\n }\n\n get str() {\n let s = `${this.name}/${this.clockRate}`;\n if (this.channels === 2) s += \"/2\";\n return s;\n }\n}\n\nexport class RTCRtpHeaderExtensionParameters {\n id!: number;\n uri!: string;\n\n constructor(\n props: Partial<RTCRtpHeaderExtensionParameters> &\n Pick<RTCRtpHeaderExtensionParameters, \"uri\">\n ) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpParameters {\n cname?: string;\n mux: boolean = false;\n ssrc?: number;\n\n constructor(props: Partial<RTCRtcpParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpFeedback {\n type!: string;\n parameter?: string;\n\n constructor(props: Partial<RTCRtcpFeedback> = {}) {\n Object.assign(this, props);\n }\n}\nexport class RTCRtpRtxParameters {\n ssrc!: number;\n\n constructor(props: Partial<RTCRtpRtxParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtpCodingParameters {\n ssrc!: number;\n payloadType!: number;\n rtx?: RTCRtpRtxParameters;\n\n constructor(\n props: Partial<RTCRtpCodingParameters> &\n Pick<RTCRtpCodingParameters, \"ssrc\" | \"payloadType\">\n ) {\n Object.assign(this, props);\n }\n}\n\nexport interface RTCRtpReceiveParameters extends RTCRtpParameters {\n encodings: RTCRtpCodingParameters[];\n}\n\nexport interface RTCRtpSendParameters extends RTCRtpParameters {}\n\nexport class RTCRtpSimulcastParameters {\n rid!: string;\n direction!: \"send\" | \"recv\";\n constructor(props: RTCRtpSimulcastParameters) {\n Object.assign(this, props);\n }\n}\n"]}
1
+ {"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../../../src/media/parameters.ts"],"names":[],"mappings":";;;AAaA,MAAa,qBAAqB;IAahC,YACE,KACgC;QAdlC;;;WAGG;QACH;;;;;WAAqB;QACrB;;;;;WAAkB;QAClB;;;;;WAAmB;QACnB;;;;;WAAkB;QAClB;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;;WAAoB;QACpB;;;;mBAA+B,KAAK;WAAC;QAMnC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,GAAG;QACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,CAAC,IAAI,IAAI,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAjCD,sDAiCC;AAED,MAAa,+BAA+B;IAI1C,YACE,KAC8C;QALhD;;;;;WAAY;QACZ;;;;;WAAa;QAMX,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAVD,0EAUC;AAED,MAAa,iBAAiB;IAK5B,YAAY,QAAoC,EAAE;QAJlD;;;;;WAAe;QACf;;;;mBAAe,KAAK;WAAC;QACrB;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,8CAQC;AAED,MAAa,eAAe;IAI1B,YAAY,QAAkC,EAAE;QAHhD;;;;;WAAc;QACd;;;;;WAAmB;QAGjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAPD,0CAOC;AACD,MAAa,mBAAmB;IAG9B,YAAY,QAAsC,EAAE;QAFpD;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,kDAMC;AAED,MAAa,sBAAsB;IAKjC,YACE,KACsD;QANxD;;;;;WAAc;QACd;;;;;WAAqB;QACrB;;;;;WAA0B;QAMxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAXD,wDAWC;AAQD,MAAa,yBAAyB;IAGpC,YAAY,KAAgC;QAF5C;;;;;WAAa;QACb;;;;;WAA4B;QAE1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,8DAMC","sourcesContent":["import { Direction } from \"./rtpTransceiver\";\n\nexport interface RTCRtpParameters {\n codecs: RTCRtpCodecParameters[];\n headerExtensions: RTCRtpHeaderExtensionParameters[];\n muxId?: string;\n rtpStreamId?: string;\n repairedRtpStreamId?: string;\n rtcp?: RTCRtcpParameters;\n}\n\nexport type RTCPFB = { type: string; parameter?: string };\n\nexport class RTCRtpCodecParameters {\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n payloadType!: number;\n mimeType!: string;\n clockRate!: number;\n channels?: number;\n rtcpFeedback: RTCPFB[] = [];\n parameters?: string;\n direction: Direction | \"all\" = \"all\";\n\n constructor(\n props: Pick<RTCRtpCodecParameters, \"mimeType\" | \"clockRate\"> &\n Partial<RTCRtpCodecParameters>,\n ) {\n Object.assign(this, props);\n }\n\n get name() {\n return this.mimeType.split(\"/\")[1];\n }\n\n get contentType() {\n return this.mimeType.split(\"/\")[0];\n }\n\n get str() {\n let s = `${this.name}/${this.clockRate}`;\n if (this.channels === 2) s += \"/2\";\n return s;\n }\n}\n\nexport class RTCRtpHeaderExtensionParameters {\n id!: number;\n uri!: string;\n\n constructor(\n props: Partial<RTCRtpHeaderExtensionParameters> &\n Pick<RTCRtpHeaderExtensionParameters, \"uri\">,\n ) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpParameters {\n cname?: string;\n mux: boolean = false;\n ssrc?: number;\n\n constructor(props: Partial<RTCRtcpParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpFeedback {\n type!: string;\n parameter?: string;\n\n constructor(props: Partial<RTCRtcpFeedback> = {}) {\n Object.assign(this, props);\n }\n}\nexport class RTCRtpRtxParameters {\n ssrc!: number;\n\n constructor(props: Partial<RTCRtpRtxParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtpCodingParameters {\n ssrc!: number;\n payloadType!: number;\n rtx?: RTCRtpRtxParameters;\n\n constructor(\n props: Partial<RTCRtpCodingParameters> &\n Pick<RTCRtpCodingParameters, \"ssrc\" | \"payloadType\">,\n ) {\n Object.assign(this, props);\n }\n}\n\nexport interface RTCRtpReceiveParameters extends RTCRtpParameters {\n encodings: RTCRtpCodingParameters[];\n}\n\nexport interface RTCRtpSendParameters extends RTCRtpParameters {}\n\nexport class RTCRtpSimulcastParameters {\n rid!: string;\n direction!: \"send\" | \"recv\";\n constructor(props: RTCRtpSimulcastParameters) {\n Object.assign(this, props);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\nimport Event from \"rx.mini\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n RtpPacket,\n} from \"../../../../rtp/src\";\nimport { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/receiver/nack.ts\");\n\nconst LOST_SIZE = 30 * 5;\n\nexport class NackHandler {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop: any;\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n retryCount = 10;\n closed = false;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lostSeqNumbers() {\n return Object.keys(this._lost).map(Number).sort();\n }\n\n private getLost(seq: number) {\n return this._lost[seq];\n }\n\n private setLost(seq: number, count: number) {\n this._lost[seq] = count;\n\n if (this.nackLoop || this.closed) {\n return;\n }\n this.nackLoop = setInterval(async () => {\n try {\n await this.sendNack();\n if (!Object.keys(this._lost).length) {\n clearInterval(this.nackLoop);\n this.nackLoop = undefined;\n }\n } catch (error) {\n log(\"failed to send nack\", error);\n }\n }, 5);\n }\n\n private removeLost(sequenceNumber: number) {\n delete this._lost[sequenceNumber];\n }\n\n addPacket(packet: RtpPacket) {\n const { sequenceNumber, ssrc } = packet.header;\n this.mediaSourceSsrc = ssrc;\n\n if (this.newEstSeqNum === 0) {\n this.newEstSeqNum = sequenceNumber;\n return;\n }\n\n if (this.getLost(sequenceNumber)) {\n // log(\"packetLoss resolved\", { sequenceNumber });\n this.removeLost(sequenceNumber);\n return;\n }\n\n if (sequenceNumber === uint16Add(this.newEstSeqNum, 1)) {\n this.newEstSeqNum = sequenceNumber;\n } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) {\n // packet lost detected\n range(uint16Add(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {\n this.setLost(seq, 1);\n });\n // this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n this.pruneLost();\n }\n }\n\n private pruneLost() {\n if (this.lostSeqNumbers.length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce((acc, [key, v]) => {\n acc[key] = v;\n return acc;\n }, {} as { [seqNum: number]: number });\n }\n }\n\n close() {\n this.closed = true;\n clearInterval(this.nackLoop);\n this._lost = {};\n }\n\n private updateRetryCount() {\n this.lostSeqNumbers.forEach((seq) => {\n const count = this._lost[seq]++;\n if (count > this.retryCount) {\n this.removeLost(seq);\n return seq;\n }\n });\n }\n\n private sendNack = () =>\n new Promise((r, f) => {\n if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lostSeqNumbers,\n });\n\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);\n\n this.updateRetryCount();\n this.onPacketLost.execute(nack);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\nimport Event from \"rx.mini\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n RtpPacket,\n} from \"../../../../rtp/src\";\nimport { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/receiver/nack.ts\");\n\nconst LOST_SIZE = 30 * 5;\n\nexport class NackHandler {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop: any;\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n retryCount = 10;\n closed = false;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lostSeqNumbers() {\n return Object.keys(this._lost).map(Number).sort();\n }\n\n private getLost(seq: number) {\n return this._lost[seq];\n }\n\n private setLost(seq: number, count: number) {\n this._lost[seq] = count;\n\n if (this.nackLoop || this.closed) {\n return;\n }\n this.nackLoop = setInterval(async () => {\n try {\n await this.sendNack();\n if (!Object.keys(this._lost).length) {\n clearInterval(this.nackLoop);\n this.nackLoop = undefined;\n }\n } catch (error) {\n log(\"failed to send nack\", error);\n }\n }, 5);\n }\n\n private removeLost(sequenceNumber: number) {\n delete this._lost[sequenceNumber];\n }\n\n addPacket(packet: RtpPacket) {\n const { sequenceNumber, ssrc } = packet.header;\n this.mediaSourceSsrc = ssrc;\n\n if (this.newEstSeqNum === 0) {\n this.newEstSeqNum = sequenceNumber;\n return;\n }\n\n if (this.getLost(sequenceNumber)) {\n // log(\"packetLoss resolved\", { sequenceNumber });\n this.removeLost(sequenceNumber);\n return;\n }\n\n if (sequenceNumber === uint16Add(this.newEstSeqNum, 1)) {\n this.newEstSeqNum = sequenceNumber;\n } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) {\n // packet lost detected\n range(uint16Add(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {\n this.setLost(seq, 1);\n });\n // this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n this.pruneLost();\n }\n }\n\n private pruneLost() {\n if (this.lostSeqNumbers.length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce(\n (acc, [key, v]) => {\n acc[key] = v;\n return acc;\n },\n {} as { [seqNum: number]: number },\n );\n }\n }\n\n close() {\n this.closed = true;\n clearInterval(this.nackLoop);\n this._lost = {};\n }\n\n private updateRetryCount() {\n this.lostSeqNumbers.forEach((seq) => {\n const count = this._lost[seq]++;\n if (count > this.retryCount) {\n this.removeLost(seq);\n return seq;\n }\n });\n }\n\n private sendNack = () =>\n new Promise((r, f) => {\n if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lostSeqNumbers,\n });\n\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);\n\n this.updateRetryCount();\n this.onPacketLost.execute(nack);\n }\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"receiverTwcc.js","sourceRoot":"","sources":["../../../../../src/media/receiver/receiverTwcc.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { uint8Add, uint16Add, uint24 } from \"../../../../common/src\";\nimport {\n PacketStatus,\n RecvDelta,\n RtcpTransportLayerFeedback,\n RunLengthChunk,\n StatusVectorChunk,\n TransportWideCC,\n} from \"../../../../rtp/src\";\nimport { RTCDtlsTransport } from \"../../transport/dtls\";\nimport { microTime } from \"../../utils\";\n\nconst log = debug(\"werift:packages/webrtc/media/receiver/receiverTwcc\");\n\ntype ExtensionInfo = { tsn: number; timestamp: number };\n\nexport class ReceiverTWCC {\n extensionInfo: {\n [tsn: number]: ExtensionInfo;\n } = {};\n twccRunning = false;\n /** uint8 */\n fbPktCount = 0;\n lastTimestamp?: number;\n\n constructor(\n private dtlsTransport: RTCDtlsTransport,\n private rtcpSsrc: number,\n private mediaSourceSsrc: number\n ) {\n this.runTWCC();\n }\n\n handleTWCC(transportSequenceNumber: number) {\n this.extensionInfo[transportSequenceNumber] = {\n tsn: transportSequenceNumber,\n timestamp: microTime(),\n };\n\n if (Object.keys(this.extensionInfo).length > 10) {\n this.sendTWCC();\n }\n }\n\n private async runTWCC() {\n while (this.twccRunning) {\n this.sendTWCC();\n await setTimeout(100);\n }\n }\n\n private sendTWCC() {\n if (Object.keys(this.extensionInfo).length === 0) return;\n const extensionsArr = Object.values(this.extensionInfo).sort(\n (a, b) => a.tsn - b.tsn\n );\n\n const minTSN = extensionsArr[0].tsn;\n const maxTSN = extensionsArr.slice(-1)[0].tsn;\n\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const baseSequenceNumber = extensionsArr[0].tsn;\n const packetStatusCount = uint16Add(maxTSN - minTSN, 1);\n /**micro sec */\n let referenceTime!: number;\n let lastPacketStatus: { status: PacketStatus; minTSN: number } | undefined;\n const recvDeltas: RecvDelta[] = [];\n\n for (let i = minTSN; i <= maxTSN; i++) {\n /**micro sec */\n const timestamp = this.extensionInfo[i]?.timestamp;\n\n if (timestamp) {\n if (!this.lastTimestamp) {\n this.lastTimestamp = timestamp;\n }\n if (!referenceTime) {\n referenceTime = this.lastTimestamp;\n }\n\n const delta = timestamp - this.lastTimestamp;\n this.lastTimestamp = timestamp;\n\n const recvDelta = new RecvDelta({\n delta: Number(delta),\n });\n recvDelta.parseDelta();\n recvDeltas.push(recvDelta);\n\n // when status changed\n if (\n lastPacketStatus != undefined &&\n lastPacketStatus.status !== recvDelta.type\n ) {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: lastPacketStatus.status,\n runLength: i - lastPacketStatus.minTSN,\n })\n );\n lastPacketStatus = { minTSN: i, status: recvDelta.type! };\n }\n // last status\n if (i === maxTSN) {\n if (lastPacketStatus != undefined) {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: lastPacketStatus.status,\n runLength: i - lastPacketStatus.minTSN + 1,\n })\n );\n } else {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: recvDelta.type,\n runLength: 1,\n })\n );\n }\n }\n\n if (lastPacketStatus == undefined) {\n lastPacketStatus = { minTSN: i, status: recvDelta.type! };\n }\n }\n }\n\n if (!referenceTime) {\n return;\n }\n\n const packet = new RtcpTransportLayerFeedback({\n feedback: new TransportWideCC({\n senderSsrc: this.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime: uint24(Math.floor(referenceTime / 1000 / 64)),\n fbPktCount: this.fbPktCount,\n recvDeltas,\n packetChunks,\n }),\n });\n\n this.dtlsTransport.sendRtcp([packet]).catch((err) => {\n log(err);\n });\n this.extensionInfo = {};\n this.fbPktCount = uint8Add(this.fbPktCount, 1);\n }\n}\n"]}
1
+ {"version":3,"file":"receiverTwcc.js","sourceRoot":"","sources":["../../../../../src/media/receiver/receiverTwcc.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { uint8Add, uint16Add, uint24 } from \"../../../../common/src\";\nimport {\n PacketStatus,\n RecvDelta,\n RtcpTransportLayerFeedback,\n RunLengthChunk,\n StatusVectorChunk,\n TransportWideCC,\n} from \"../../../../rtp/src\";\nimport { RTCDtlsTransport } from \"../../transport/dtls\";\nimport { microTime } from \"../../utils\";\n\nconst log = debug(\"werift:packages/webrtc/media/receiver/receiverTwcc\");\n\ntype ExtensionInfo = { tsn: number; timestamp: number };\n\nexport class ReceiverTWCC {\n extensionInfo: {\n [tsn: number]: ExtensionInfo;\n } = {};\n twccRunning = false;\n /** uint8 */\n fbPktCount = 0;\n lastTimestamp?: number;\n\n constructor(\n private dtlsTransport: RTCDtlsTransport,\n private rtcpSsrc: number,\n private mediaSourceSsrc: number,\n ) {\n this.runTWCC();\n }\n\n handleTWCC(transportSequenceNumber: number) {\n this.extensionInfo[transportSequenceNumber] = {\n tsn: transportSequenceNumber,\n timestamp: microTime(),\n };\n\n if (Object.keys(this.extensionInfo).length > 10) {\n this.sendTWCC();\n }\n }\n\n private async runTWCC() {\n while (this.twccRunning) {\n this.sendTWCC();\n await setTimeout(100);\n }\n }\n\n private sendTWCC() {\n if (Object.keys(this.extensionInfo).length === 0) return;\n const extensionsArr = Object.values(this.extensionInfo).sort(\n (a, b) => a.tsn - b.tsn,\n );\n\n const minTSN = extensionsArr[0].tsn;\n const maxTSN = extensionsArr.slice(-1)[0].tsn;\n\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const baseSequenceNumber = extensionsArr[0].tsn;\n const packetStatusCount = uint16Add(maxTSN - minTSN, 1);\n /**micro sec */\n let referenceTime!: number;\n let lastPacketStatus: { status: PacketStatus; minTSN: number } | undefined;\n const recvDeltas: RecvDelta[] = [];\n\n for (let i = minTSN; i <= maxTSN; i++) {\n /**micro sec */\n const timestamp = this.extensionInfo[i]?.timestamp;\n\n if (timestamp) {\n if (!this.lastTimestamp) {\n this.lastTimestamp = timestamp;\n }\n if (!referenceTime) {\n referenceTime = this.lastTimestamp;\n }\n\n const delta = timestamp - this.lastTimestamp;\n this.lastTimestamp = timestamp;\n\n const recvDelta = new RecvDelta({\n delta: Number(delta),\n });\n recvDelta.parseDelta();\n recvDeltas.push(recvDelta);\n\n // when status changed\n if (\n lastPacketStatus != undefined &&\n lastPacketStatus.status !== recvDelta.type\n ) {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: lastPacketStatus.status,\n runLength: i - lastPacketStatus.minTSN,\n }),\n );\n lastPacketStatus = { minTSN: i, status: recvDelta.type! };\n }\n // last status\n if (i === maxTSN) {\n if (lastPacketStatus != undefined) {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: lastPacketStatus.status,\n runLength: i - lastPacketStatus.minTSN + 1,\n }),\n );\n } else {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: recvDelta.type,\n runLength: 1,\n }),\n );\n }\n }\n\n if (lastPacketStatus == undefined) {\n lastPacketStatus = { minTSN: i, status: recvDelta.type! };\n }\n }\n }\n\n if (!referenceTime) {\n return;\n }\n\n const packet = new RtcpTransportLayerFeedback({\n feedback: new TransportWideCC({\n senderSsrc: this.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime: uint24(Math.floor(referenceTime / 1000 / 64)),\n fbPktCount: this.fbPktCount,\n recvDeltas,\n packetChunks,\n }),\n });\n\n this.dtlsTransport.sendRtcp([packet]).catch((err) => {\n log(err);\n });\n this.extensionInfo = {};\n this.fbPktCount = uint8Add(this.fbPktCount, 1);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../../../../src/media/receiver/statistics.ts"],"names":[],"mappings":"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","sourcesContent":["import { int, uint16Gt } from \"../../../../common/src\";\nimport { RtpPacket } from \"../../../../rtp/src\";\n\n// from aiortc\n\nexport class StreamStatistics {\n base_seq?: number;\n max_seq?: number;\n cycles = 0;\n packets_received = 0;\n\n // # jitter\n private clockRate: number;\n jitter_q4 = 0;\n private last_arrival?: number;\n private last_timestamp?: number;\n\n // # fraction lost\n expected_prior = 0;\n received_prior = 0;\n\n constructor(clockRate: number) {\n this.clockRate = clockRate;\n }\n\n add(packet: RtpPacket, now: number = Date.now() / 1000) {\n const inOrder =\n this.max_seq == undefined ||\n uint16Gt(packet.header.sequenceNumber, this.max_seq);\n this.packets_received++;\n\n if (this.base_seq == undefined) {\n this.base_seq = packet.header.sequenceNumber;\n }\n\n if (inOrder) {\n const arrival = int(now * this.clockRate);\n\n if (\n this.max_seq != undefined &&\n packet.header.sequenceNumber < this.max_seq\n ) {\n this.cycles += 1 << 16;\n }\n this.max_seq = packet.header.sequenceNumber;\n\n if (\n packet.header.timestamp !== this.last_timestamp &&\n this.packets_received > 1\n ) {\n const diff = Math.abs(\n arrival -\n (this.last_arrival ?? 0) -\n (packet.header.timestamp - (this.last_timestamp ?? 0))\n );\n this.jitter_q4 += diff - ((this.jitter_q4 + 8) >> 4);\n }\n\n this.last_arrival = arrival;\n this.last_timestamp = packet.header.timestamp;\n }\n }\n\n get fraction_lost() {\n const expected_interval = this.packets_expected - this.expected_prior;\n this.expected_prior = this.packets_expected;\n const received_interval = this.packets_received - this.received_prior;\n this.received_prior = this.packets_received;\n const lost_interval = expected_interval - received_interval;\n if (expected_interval == 0 || lost_interval <= 0) {\n return 0;\n } else {\n return Math.floor((lost_interval << 8) / expected_interval);\n }\n }\n\n get jitter() {\n return this.jitter_q4 >> 4;\n }\n\n get packets_expected() {\n return this.cycles + (this.max_seq ?? 0) - (this.base_seq ?? 0) + 1;\n }\n\n get packets_lost() {\n const lost = this.packets_expected - this.packets_received;\n return lost < 0 ? 0 : lost;\n }\n}\n"]}
1
+ {"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../../../../src/media/receiver/statistics.ts"],"names":[],"mappings":"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","sourcesContent":["import { int, uint16Gt } from \"../../../../common/src\";\nimport { RtpPacket } from \"../../../../rtp/src\";\n\n// from aiortc\n\nexport class StreamStatistics {\n base_seq?: number;\n max_seq?: number;\n cycles = 0;\n packets_received = 0;\n\n // # jitter\n private clockRate: number;\n jitter_q4 = 0;\n private last_arrival?: number;\n private last_timestamp?: number;\n\n // # fraction lost\n expected_prior = 0;\n received_prior = 0;\n\n constructor(clockRate: number) {\n this.clockRate = clockRate;\n }\n\n add(packet: RtpPacket, now: number = Date.now() / 1000) {\n const inOrder =\n this.max_seq == undefined ||\n uint16Gt(packet.header.sequenceNumber, this.max_seq);\n this.packets_received++;\n\n if (this.base_seq == undefined) {\n this.base_seq = packet.header.sequenceNumber;\n }\n\n if (inOrder) {\n const arrival = int(now * this.clockRate);\n\n if (\n this.max_seq != undefined &&\n packet.header.sequenceNumber < this.max_seq\n ) {\n this.cycles += 1 << 16;\n }\n this.max_seq = packet.header.sequenceNumber;\n\n if (\n packet.header.timestamp !== this.last_timestamp &&\n this.packets_received > 1\n ) {\n const diff = Math.abs(\n arrival -\n (this.last_arrival ?? 0) -\n (packet.header.timestamp - (this.last_timestamp ?? 0)),\n );\n this.jitter_q4 += diff - ((this.jitter_q4 + 8) >> 4);\n }\n\n this.last_arrival = arrival;\n this.last_timestamp = packet.header.timestamp;\n }\n }\n\n get fraction_lost() {\n const expected_interval = this.packets_expected - this.expected_prior;\n this.expected_prior = this.packets_expected;\n const received_interval = this.packets_received - this.received_prior;\n this.received_prior = this.packets_received;\n const lost_interval = expected_interval - received_interval;\n if (expected_interval == 0 || lost_interval <= 0) {\n return 0;\n } else {\n return Math.floor((lost_interval << 8) / expected_interval);\n }\n }\n\n get jitter() {\n return this.jitter_q4 >> 4;\n }\n\n get packets_expected() {\n return this.cycles + (this.max_seq ?? 0) - (this.base_seq ?? 0) + 1;\n }\n\n get packets_lost() {\n const lost = this.packets_expected - this.packets_received;\n return lost < 0 ? 0 : lost;\n }\n}\n"]}