@norskvideo/moq-net 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.md +70 -0
  2. package/announced.d.ts +45 -0
  3. package/announced.d.ts.map +1 -0
  4. package/announced.js +70 -0
  5. package/announced.js.map +1 -0
  6. package/bandwidth.d.ts +11 -0
  7. package/bandwidth.d.ts.map +1 -0
  8. package/bandwidth.js +7 -0
  9. package/bandwidth.js.map +1 -0
  10. package/broadcast.d.ts +39 -0
  11. package/broadcast.d.ts.map +1 -0
  12. package/broadcast.js +76 -0
  13. package/broadcast.js.map +1 -0
  14. package/connection/accept.d.ts +15 -0
  15. package/connection/accept.d.ts.map +1 -0
  16. package/connection/accept.js +137 -0
  17. package/connection/accept.js.map +1 -0
  18. package/connection/cert.test.d.ts +2 -0
  19. package/connection/cert.test.d.ts.map +1 -0
  20. package/connection/cert.test.js +26 -0
  21. package/connection/cert.test.js.map +1 -0
  22. package/connection/connect.d.ts +37 -0
  23. package/connection/connect.d.ts.map +1 -0
  24. package/connection/connect.js +348 -0
  25. package/connection/connect.js.map +1 -0
  26. package/connection/established.d.ts +30 -0
  27. package/connection/established.d.ts.map +1 -0
  28. package/connection/established.js +3 -0
  29. package/connection/established.js.map +1 -0
  30. package/connection/handshake.d.ts +10 -0
  31. package/connection/handshake.d.ts.map +1 -0
  32. package/connection/handshake.js +48 -0
  33. package/connection/handshake.js.map +1 -0
  34. package/connection/index.d.ts +5 -0
  35. package/connection/index.d.ts.map +1 -0
  36. package/connection/index.js +6 -0
  37. package/connection/index.js.map +1 -0
  38. package/connection/reload.d.ts +47 -0
  39. package/connection/reload.d.ts.map +1 -0
  40. package/connection/reload.js +137 -0
  41. package/connection/reload.js.map +1 -0
  42. package/group.d.ts +66 -0
  43. package/group.d.ts.map +1 -0
  44. package/group.js +135 -0
  45. package/group.js.map +1 -0
  46. package/group.test.d.ts +2 -0
  47. package/group.test.d.ts.map +1 -0
  48. package/group.test.js +66 -0
  49. package/group.test.js.map +1 -0
  50. package/ietf/adapter.d.ts +65 -0
  51. package/ietf/adapter.d.ts.map +1 -0
  52. package/ietf/adapter.js +626 -0
  53. package/ietf/adapter.js.map +1 -0
  54. package/ietf/connection.d.ts +65 -0
  55. package/ietf/connection.d.ts.map +1 -0
  56. package/ietf/connection.js +248 -0
  57. package/ietf/connection.js.map +1 -0
  58. package/ietf/control.d.ts +135 -0
  59. package/ietf/control.d.ts.map +1 -0
  60. package/ietf/control.js +242 -0
  61. package/ietf/control.js.map +1 -0
  62. package/ietf/fetch.d.ts +64 -0
  63. package/ietf/fetch.d.ts.map +1 -0
  64. package/ietf/fetch.js +100 -0
  65. package/ietf/fetch.js.map +1 -0
  66. package/ietf/goaway.d.ts +15 -0
  67. package/ietf/goaway.d.ts.map +1 -0
  68. package/ietf/goaway.js +34 -0
  69. package/ietf/goaway.js.map +1 -0
  70. package/ietf/ietf.test.d.ts +2 -0
  71. package/ietf/ietf.test.d.ts.map +1 -0
  72. package/ietf/ietf.test.js +873 -0
  73. package/ietf/ietf.test.js.map +1 -0
  74. package/ietf/index.d.ts +18 -0
  75. package/ietf/index.d.ts.map +1 -0
  76. package/ietf/index.js +19 -0
  77. package/ietf/index.js.map +1 -0
  78. package/ietf/message.d.ts +4 -0
  79. package/ietf/message.d.ts.map +1 -0
  80. package/ietf/message.js +54 -0
  81. package/ietf/message.js.map +1 -0
  82. package/ietf/namespace.d.ts +5 -0
  83. package/ietf/namespace.d.ts.map +1 -0
  84. package/ietf/namespace.js +27 -0
  85. package/ietf/namespace.js.map +1 -0
  86. package/ietf/object.d.ts +40 -0
  87. package/ietf/object.d.ts.map +1 -0
  88. package/ietf/object.js +160 -0
  89. package/ietf/object.js.map +1 -0
  90. package/ietf/parameters.d.ts +56 -0
  91. package/ietf/parameters.d.ts.map +1 -0
  92. package/ietf/parameters.js +337 -0
  93. package/ietf/parameters.js.map +1 -0
  94. package/ietf/properties.d.ts +4 -0
  95. package/ietf/properties.d.ts.map +1 -0
  96. package/ietf/properties.js +33 -0
  97. package/ietf/properties.js.map +1 -0
  98. package/ietf/publish.d.ts +68 -0
  99. package/ietf/publish.d.ts.map +1 -0
  100. package/ietf/publish.js +192 -0
  101. package/ietf/publish.js.map +1 -0
  102. package/ietf/publish_namespace.d.ts +68 -0
  103. package/ietf/publish_namespace.d.ts.map +1 -0
  104. package/ietf/publish_namespace.js +176 -0
  105. package/ietf/publish_namespace.js.map +1 -0
  106. package/ietf/publisher.d.ts +50 -0
  107. package/ietf/publisher.d.ts.map +1 -0
  108. package/ietf/publisher.js +330 -0
  109. package/ietf/publisher.js.map +1 -0
  110. package/ietf/request.d.ts +52 -0
  111. package/ietf/request.d.ts.map +1 -0
  112. package/ietf/request.js +119 -0
  113. package/ietf/request.js.map +1 -0
  114. package/ietf/setup.d.ts +38 -0
  115. package/ietf/setup.d.ts.map +1 -0
  116. package/ietf/setup.js +129 -0
  117. package/ietf/setup.js.map +1 -0
  118. package/ietf/subscribe.d.ts +66 -0
  119. package/ietf/subscribe.d.ts.map +1 -0
  120. package/ietf/subscribe.js +276 -0
  121. package/ietf/subscribe.js.map +1 -0
  122. package/ietf/subscribe_namespace.d.ts +101 -0
  123. package/ietf/subscribe_namespace.d.ts.map +1 -0
  124. package/ietf/subscribe_namespace.js +256 -0
  125. package/ietf/subscribe_namespace.js.map +1 -0
  126. package/ietf/subscriber.d.ts +53 -0
  127. package/ietf/subscriber.d.ts.map +1 -0
  128. package/ietf/subscriber.js +404 -0
  129. package/ietf/subscriber.js.map +1 -0
  130. package/ietf/track.d.ts +40 -0
  131. package/ietf/track.d.ts.map +1 -0
  132. package/ietf/track.js +108 -0
  133. package/ietf/track.js.map +1 -0
  134. package/ietf/version.d.ts +56 -0
  135. package/ietf/version.d.ts.map +1 -0
  136. package/ietf/version.js +63 -0
  137. package/ietf/version.js.map +1 -0
  138. package/index.d.ts +22 -0
  139. package/index.d.ts.map +1 -0
  140. package/index.js +23 -0
  141. package/index.js.map +1 -0
  142. package/integration.test.d.ts +2 -0
  143. package/integration.test.d.ts.map +1 -0
  144. package/integration.test.js +90 -0
  145. package/integration.test.js.map +1 -0
  146. package/lite/announce.d.ts +35 -0
  147. package/lite/announce.d.ts.map +1 -0
  148. package/lite/announce.js +166 -0
  149. package/lite/announce.js.map +1 -0
  150. package/lite/connection.d.ts +47 -0
  151. package/lite/connection.d.ts.map +1 -0
  152. package/lite/connection.js +247 -0
  153. package/lite/connection.js.map +1 -0
  154. package/lite/fetch.d.ts +14 -0
  155. package/lite/fetch.d.ts.map +1 -0
  156. package/lite/fetch.js +47 -0
  157. package/lite/fetch.js.map +1 -0
  158. package/lite/goaway.d.ts +10 -0
  159. package/lite/goaway.d.ts.map +1 -0
  160. package/lite/goaway.js +37 -0
  161. package/lite/goaway.js.map +1 -0
  162. package/lite/group.d.ts +18 -0
  163. package/lite/group.d.ts.map +1 -0
  164. package/lite/group.js +46 -0
  165. package/lite/group.js.map +1 -0
  166. package/lite/index.d.ts +11 -0
  167. package/lite/index.d.ts.map +1 -0
  168. package/lite/index.js +12 -0
  169. package/lite/index.js.map +1 -0
  170. package/lite/message.d.ts +5 -0
  171. package/lite/message.d.ts.map +1 -0
  172. package/lite/message.js +51 -0
  173. package/lite/message.js.map +1 -0
  174. package/lite/origin.d.ts +25 -0
  175. package/lite/origin.d.ts.map +1 -0
  176. package/lite/origin.js +35 -0
  177. package/lite/origin.js.map +1 -0
  178. package/lite/probe.d.ts +12 -0
  179. package/lite/probe.d.ts.map +1 -0
  180. package/lite/probe.js +60 -0
  181. package/lite/probe.js.map +1 -0
  182. package/lite/publisher.d.ts +63 -0
  183. package/lite/publisher.d.ts.map +1 -0
  184. package/lite/publisher.js +350 -0
  185. package/lite/publisher.js.map +1 -0
  186. package/lite/session.d.ts +36 -0
  187. package/lite/session.d.ts.map +1 -0
  188. package/lite/session.js +130 -0
  189. package/lite/session.js.map +1 -0
  190. package/lite/setup.d.ts +18 -0
  191. package/lite/setup.d.ts.map +1 -0
  192. package/lite/setup.js +55 -0
  193. package/lite/setup.js.map +1 -0
  194. package/lite/stream.d.ts +23 -0
  195. package/lite/stream.d.ts.map +1 -0
  196. package/lite/stream.js +20 -0
  197. package/lite/stream.js.map +1 -0
  198. package/lite/subscribe.d.ts +111 -0
  199. package/lite/subscribe.d.ts.map +1 -0
  200. package/lite/subscribe.js +341 -0
  201. package/lite/subscribe.js.map +1 -0
  202. package/lite/subscriber.d.ts +80 -0
  203. package/lite/subscriber.d.ts.map +1 -0
  204. package/lite/subscriber.js +316 -0
  205. package/lite/subscriber.js.map +1 -0
  206. package/lite/track.d.ts +38 -0
  207. package/lite/track.d.ts.map +1 -0
  208. package/lite/track.js +81 -0
  209. package/lite/track.js.map +1 -0
  210. package/lite/track.test.d.ts +2 -0
  211. package/lite/track.test.d.ts.map +1 -0
  212. package/lite/track.test.js +53 -0
  213. package/lite/track.test.js.map +1 -0
  214. package/lite/version.d.ts +16 -0
  215. package/lite/version.d.ts.map +1 -0
  216. package/lite/version.js +41 -0
  217. package/lite/version.js.map +1 -0
  218. package/mock.d.ts +16 -0
  219. package/mock.d.ts.map +1 -0
  220. package/mock.js +154 -0
  221. package/mock.js.map +1 -0
  222. package/package.json +27 -0
  223. package/path.d.ts +111 -0
  224. package/path.d.ts.map +1 -0
  225. package/path.js +133 -0
  226. package/path.js.map +1 -0
  227. package/path.test.d.ts +2 -0
  228. package/path.test.d.ts.map +1 -0
  229. package/path.test.js +169 -0
  230. package/path.test.js.map +1 -0
  231. package/stream.d.ts +57 -0
  232. package/stream.d.ts.map +1 -0
  233. package/stream.js +326 -0
  234. package/stream.js.map +1 -0
  235. package/stream.test.d.ts +2 -0
  236. package/stream.test.d.ts.map +1 -0
  237. package/stream.test.js +210 -0
  238. package/stream.test.js.map +1 -0
  239. package/time.d.ts +109 -0
  240. package/time.d.ts.map +1 -0
  241. package/time.js +94 -0
  242. package/time.js.map +1 -0
  243. package/track.d.ts +85 -0
  244. package/track.d.ts.map +1 -0
  245. package/track.js +227 -0
  246. package/track.js.map +1 -0
  247. package/track.test.d.ts +2 -0
  248. package/track.test.d.ts.map +1 -0
  249. package/track.test.js +56 -0
  250. package/track.test.js.map +1 -0
  251. package/util/error.d.ts +3 -0
  252. package/util/error.d.ts.map +1 -0
  253. package/util/error.js +9 -0
  254. package/util/error.js.map +1 -0
  255. package/util/hex.d.ts +3 -0
  256. package/util/hex.d.ts.map +1 -0
  257. package/util/hex.js +16 -0
  258. package/util/hex.js.map +1 -0
  259. package/util/index.d.ts +2 -0
  260. package/util/index.d.ts.map +1 -0
  261. package/util/index.js +3 -0
  262. package/util/index.js.map +1 -0
  263. package/varint.d.ts +36 -0
  264. package/varint.d.ts.map +1 -0
  265. package/varint.js +288 -0
  266. package/varint.js.map +1 -0
  267. package/varint.test.d.ts +2 -0
  268. package/varint.test.d.ts.map +1 -0
  269. package/varint.test.js +106 -0
  270. package/varint.test.js.map +1 -0
  271. package/zod.d.ts +13 -0
  272. package/zod.d.ts.map +1 -0
  273. package/zod.js +19 -0
  274. package/zod.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/ietf/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAe,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAezD;;;GAGG;AACH,MAAM,OAAO,aAAa;IACzB,KAAK,CAAe;IACpB,UAAU,GAAG,EAAE,CAAC;IACP,OAAO,CAAc;IAE9B,YAAY,IAAkB,EAAE,OAAoB;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM;QACX,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,aAAa;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3B,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACX,CAAC;CACD;AAED,oDAAoD;AACpD,MAAM,KAAK,GAAG;IACb,UAAU,EAAE,CAAC,EAAE,mDAAmD;IAClE,QAAQ,EAAE,CAAC,EAAE,8CAA8C;IAC3D,aAAa,EAAE,CAAC,EAAE,8CAA8C;IAChE,WAAW,EAAE,CAAC,EAAE,sCAAsC;IACtD,QAAQ,EAAE,CAAC,EAAE,4CAA4C;IACzD,YAAY,EAAE,CAAC,EAAE,sBAAsB;IACvC,MAAM,EAAE,CAAC,EAAE,+BAA+B;IAC1C,MAAM,EAAE,CAAC,EAAE,WAAW;CACb,CAAC;AAOX;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IAChC,8DAA8D;IAC9D,KAAK,CAAe;IAEpB,iBAAiB;IACjB,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;IACjB,OAAO,CAAc;IAE9B,qCAAqC;IACrC,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1C,0EAA0E;IAC1E,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,qEAAqE;IACrE,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,8FAA8F;IAC9F,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,uCAAuC;IACvC,cAAc,GAAa,EAAE,CAAC;IAC9B,gBAAgB,GAA6C,EAAE,CAAC;IAEhE,0BAA0B;IAC1B,UAAU,GAAG,EAAE,CAAC;IAChB,aAAa,CAAS;IACtB,qBAAqB,GAAmB,EAAE,CAAC;IAE3C,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAY,IAAkB,EAAE,aAAqB,EAAE,OAAoB,EAAE,YAAoB;QAChG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACb,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,OAAO,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,MAAM;QACL,IAAI,UAAwD,CAAC;QAC7D,IAAI,mBAAuC,CAAC;QAE5C,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAa;YAC/C,KAAK,CAAC,CAAC;gBACN,UAAU,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACZ,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;SACD,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,MAAM,YAAY,GAAG,IAAI,cAAc,CAAa;YACnD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtB,2DAA2D;gBAC3D,+EAA+E;gBAC/E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,GAAG,MAAM,CAAC;gBAEhB,iDAAiD;gBACjD,SAAS,CAAC;oBACT,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,QAAQ,KAAK,SAAS;wBAAE,MAAM;oBAElC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAC7C,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;wBACjB,gEAAgE;wBAChE,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAC/C,IAAI,MAAM,EAAE,CAAC;4BACZ,mBAAmB,GAAG,MAAM,CAAC,SAAS,CAAC;4BACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;4BACpD,UAAU,GAAG,IAAI,CAAC;wBACnB,CAAC;oBACF,CAAC;oBAED,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC;YACF,CAAC;SACD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACrC,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAClB,SAAS,CAAC;YACT,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3B,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;YACX,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG;QACR,IAAI,CAAC;YACJ,8DAA8D;YAC9D,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACvC,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,CAAC;YAED,SAAS,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE3C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAEtD,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBAClD,OAAO;gBACR,CAAC;gBAED,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;gBAExC,QAAQ,KAAK,EAAE,CAAC;oBACf,KAAK,KAAK,CAAC,UAAU;wBACpB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;wBAChD,MAAM;oBACP,KAAK,KAAK,CAAC,QAAQ;wBAClB,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;wBACjD,MAAM;oBACP,KAAK,KAAK,CAAC,aAAa;wBACvB,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;wBACjD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;wBAC7B,MAAM;oBACP,KAAK,KAAK,CAAC,WAAW;wBACrB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;wBAC7B,MAAM;oBACP,KAAK,KAAK,CAAC,QAAQ;wBAClB,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;wBACjD,MAAM;oBACP,KAAK,KAAK,CAAC,YAAY;wBACtB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;wBAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,qBAAqB;4BAAE,OAAO,EAAE,CAAC;wBAC5D,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;wBAChC,MAAM;gBACR,CAAC;YACF,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACF,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,kBAAkB;QACvB,IAAI,CAAC;YACJ,SAAS,CAAC;gBACT,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7D,IAAI,CAAC,MAAM;oBAAE,MAAM;gBAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC7C,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,iBAAiB;QAClB,CAAC;IACF,CAAC;IAED,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,IAAgB,EAAE,SAAiB;QAC5E,IAAI,UAAwD,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAa;YAC/C,KAAK,CAAC,CAAC;gBACN,UAAU,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;SACD,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAErC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAE7C,wEAAwE;QACxE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,qBAAqB;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,MAAM,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,IAAgB;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,oCAAoC,SAAS,aAAa,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9F,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACR,wBAAwB;QACzB,CAAC;IACF,CAAC;IAED,YAAY,CAAC,SAAiB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,OAAO,CAAC,KAAK,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC;YACJ,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACR,iBAAiB;QAClB,CAAC;IACF,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,MAAkB;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE1C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ;YAAE,OAAO,SAAS,CAAC;QAE/C,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAE3C,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS;YAAE,OAAO,SAAS,CAAC;QAEhD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,MAAkB;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE1C,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ;YAAE,OAAO,SAAS,CAAC;QAE/C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAElD,4BAA4B;QAC5B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAE3C,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExC,iBAAiB;QACjB,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI;YAAE,OAAO,SAAS,CAAC;QAE9C,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAEzC,2CAA2C;QAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhC,2EAA2E;QAC3E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC;gBACJ,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACR,oEAAoE;YACrE,CAAC;QACF,CAAC;QAED,4DAA4D;QAC5D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,GAAe,EAAE,SAAiB;QAC5D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,UAAU,CAAC;QACxB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,2GAA2G;IAC3G,mBAAmB;QAClB,IAAI,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,IAAI,cAAc,CAAa;YACrC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,GAAG,MAAM,CAAC;gBAEhB,SAAS,CAAC;oBACT,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAC3C,IAAI,QAAQ,KAAK,SAAS;wBAAE,MAAM;oBAElC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAC7C,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACnC,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC;YACF,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,UAAU,CAAC,MAAc,EAAE,IAAY,EAAE,IAAgB;QACxD,iCAAiC;QACjC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACxE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACd,MAAc,EACd,IAAgB;QAEhB,MAAM,aAAa,GAAG,KAAK,IAAqB,EAAE;YACjD,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,KAAK,IAAqB,EAAE;YAC1D,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC;QAEF,QAAQ,MAAM,EAAE,CAAC;YAChB,6CAA6C;YAC7C,KAAK,IAAI,EAAE,CAAC;gBACX,mCAAmC;gBACnC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC7C,CAAC;YAED,4CAA4C;YAC5C,KAAK,IAAI,CAAC,CAAC,YAAY;YACvB,KAAK,IAAI,CAAC,CAAC,QAAQ;YACnB,KAAK,IAAI,CAAC,CAAC,UAAU;YACrB,KAAK,IAAI,EAAE,CAAC;gBACX,qBAAqB;gBACrB,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;YAC/C,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,qEAAqE;gBACrE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC3C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBACtD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;YAC/C,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,sDAAsD;gBACtD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC5E,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACpE,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;YAC/C,CAAC;YAED,iDAAiD;YACjD,KAAK,IAAI,EAAE,CAAC;gBACX,cAAc;gBACd,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC7C,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,UAAU;gBACV,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC7C,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,YAAY;gBACZ,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC7C,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,2CAA2C;gBAC3C,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC7C,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,kCAAkC;gBAClC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC1F,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YAC7C,CAAC;YAED,4CAA4C;YAC5C,KAAK,IAAI,EAAE,CAAC;gBACX,6CAA6C;gBAC7C,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;YAClD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,wBAAwB;gBACxB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAChF,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;YAClD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,0BAA0B;gBAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAClF,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;YAClD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACvC,wBAAwB;oBACxB,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;oBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;gBAClD,CAAC;gBACD,2EAA2E;gBAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAChE,IAAI,OAAO,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACpG,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;YACtD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,+EAA+E;gBAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAChE,IAAI,OAAO,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACpG,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;YACtD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,qCAAqC;gBACrC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC7F,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;YAClD,CAAC;YAED,oDAAoD;YACpD,KAAK,IAAI,EAAE,CAAC;gBACX,cAAc;gBACd,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,cAAc;gBACd,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,cAAc;gBACd,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,mEAAmE;gBACnE,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACvC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;oBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;gBAChD,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;gBACjD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,qEAAqE;gBACrE,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACvC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;oBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;gBAChD,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;gBACjD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,sCAAsC;gBACtC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC5E,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACpD,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;YAChD,CAAC;YAED,kBAAkB;YAClB,KAAK,IAAI,EAAE,CAAC;gBACX,eAAe;gBACf,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC;YACjD,CAAC;YACD,KAAK,IAAI,EAAE,CAAC;gBACX,yDAAyD;gBACzD,MAAM,aAAa,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC/C,CAAC;YAED,mBAAmB;YACnB,KAAK,IAAI,EAAE,SAAS;gBACnB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;YAEhC;gBACC,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACF,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAEzC,4BAA4B;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACJ,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACR,iBAAiB;YAClB,CAAC;QACF,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,uCAAuC;QACvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAE3B,2BAA2B;QAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAElC,+BAA+B;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,qBAAqB;YAAE,OAAO,EAAE,CAAC;QAC5D,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;IACjC,CAAC;CACD","sourcesContent":["import { Mutex } from \"async-mutex\";\nimport { Reader, Stream, type Writer } from \"../stream.ts\";\nimport * as Varint from \"../varint.ts\";\nimport * as Namespace from \"./namespace.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/**\n * Interface for opening outgoing bidi streams and allocating request IDs.\n * Implemented by both ControlStreamAdapter (v14-v16) and NativeSession (v17).\n */\nexport interface Session {\n\topenBi(): Stream | Promise<Stream>;\n\topenNativeBi?(): Promise<Stream>;\n\tacceptBi(): Promise<Stream | undefined>;\n\tnextRequestId(): Promise<bigint | undefined>;\n\tclose?(): void;\n\treadonly version: IetfVersion;\n}\n\n/**\n * v17 native session — thin wrapper around WebTransport.\n * Each request gets its own real bidi stream; no control stream multiplexing.\n */\nexport class NativeSession implements Session {\n\t#quic: WebTransport;\n\t#requestId = 0n;\n\treadonly version: IetfVersion;\n\n\tconstructor(quic: WebTransport, version: IetfVersion) {\n\t\tthis.#quic = quic;\n\t\tthis.version = version;\n\t}\n\n\tasync openBi(): Promise<Stream> {\n\t\treturn Stream.open(this.#quic, this.version);\n\t}\n\n\tasync acceptBi(): Promise<Stream | undefined> {\n\t\treturn Stream.accept(this.#quic, this.version);\n\t}\n\n\tasync nextRequestId(): Promise<bigint | undefined> {\n\t\tconst id = this.#requestId;\n\t\tthis.#requestId += 2n;\n\t\treturn id;\n\t}\n}\n\n// Route classification for control stream messages.\nconst Route = {\n\tNewRequest: 0, // Create virtual bidi stream, push initial message\n\tResponse: 1, // Push message to existing stream (keep open)\n\tErrorResponse: 2, // Push message to existing stream, then close\n\tCloseStream: 3, // Close stream recv (no bytes pushed)\n\tFollowUp: 4, // Push follow-up message to existing stream\n\tMaxRequestId: 5, // Update flow control\n\tIgnore: 6, // Connection-level, no routing\n\tGoAway: 7, // Terminal\n} as const;\ntype Route = (typeof Route)[keyof typeof Route];\n\ninterface StreamEntry {\n\tcontroller: ReadableStreamDefaultController<Uint8Array>;\n}\n\n/**\n * Converts v14-v16 control stream multiplexing into virtual bidi streams.\n *\n * Reads control messages, classifies them, and routes to virtual Stream objects.\n * Each request/response pair gets its own virtual Stream, making all versions\n * look like v17's stream-per-request model.\n */\nexport class ControlStreamAdapter implements Session {\n\t// WebTransport session (for opening real bidi streams in v16)\n\t#quic: WebTransport;\n\n\t// Control stream\n\t#reader: Reader;\n\t#writer: Writer;\n\t#writeMutex = new Mutex();\n\treadonly version: IetfVersion;\n\n\t// Virtual streams keyed by requestId\n\t#streams = new Map<bigint, StreamEntry>();\n\n\t// Namespace → requestId reverse lookup (v14/v15 namespace-keyed messages)\n\t#namespaces = new Map<string, bigint>();\n\n\t// requestId → namespace reverse lookup (for cleanup in #closeStream)\n\t#namespacesByRequestId = new Map<bigint, string>();\n\n\t// SubscribeNamespace requestIds — for routing 0x08/0x0E entries that lack requestId (v14/v15)\n\t#subscribeNamespaces = new Set<bigint>();\n\n\t// Incoming stream queue (for acceptBi)\n\t#incomingQueue: Stream[] = [];\n\t#incomingWaiters: ((stream: Stream | undefined) => void)[] = [];\n\n\t// Request ID flow control\n\t#requestId = 0n;\n\t#maxRequestId: bigint;\n\t#maxRequestIdResolves: (() => void)[] = [];\n\n\t#closed = false;\n\n\tconstructor(quic: WebTransport, controlStream: Stream, version: IetfVersion, maxRequestId: bigint) {\n\t\tthis.#quic = quic;\n\t\tthis.#reader = controlStream.reader;\n\t\tthis.#reader.version = version;\n\t\tthis.#writer = controlStream.writer;\n\t\tthis.#writer.version = version;\n\t\tthis.version = version;\n\t\tthis.#maxRequestId = maxRequestId;\n\t}\n\n\t/**\n\t * Accept the next incoming virtual bidi stream.\n\t * Blocks until a new request arrives on the control stream.\n\t */\n\tasync acceptBi(): Promise<Stream | undefined> {\n\t\tif (this.#closed) return undefined;\n\n\t\tconst queued = this.#incomingQueue.shift();\n\t\tif (queued) return queued;\n\n\t\treturn new Promise<Stream | undefined>((resolve) => {\n\t\t\tthis.#incomingWaiters.push(resolve);\n\t\t});\n\t}\n\n\t/**\n\t * Open an outgoing virtual bidi stream.\n\t * Buffers writes until the first full message is available, parses the\n\t * requestId (and namespace for PublishNamespace), self-registers, then\n\t * flushes. Subsequent writes go directly to the control stream.\n\t */\n\topenBi(): Stream {\n\t\tlet controller!: ReadableStreamDefaultController<Uint8Array>;\n\t\tlet registeredRequestId: bigint | undefined;\n\n\t\tconst readable = new ReadableStream<Uint8Array>({\n\t\t\tstart(c) {\n\t\t\t\tcontroller = c;\n\t\t\t},\n\t\t\tcancel: () => {\n\t\t\t\tif (registeredRequestId !== undefined) {\n\t\t\t\t\tthis.#streams.delete(registeredRequestId);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tlet buffer = new Uint8Array(0);\n\t\tlet registered = false;\n\n\t\tconst sendWritable = new WritableStream<Uint8Array>({\n\t\t\twrite: async (chunk) => {\n\t\t\t\t// Always accumulate bytes and flush only complete messages\n\t\t\t\t// to prevent interleaving of partial messages from concurrent virtual streams.\n\t\t\t\tconst newBuf = new Uint8Array(buffer.length + chunk.length);\n\t\t\t\tnewBuf.set(buffer);\n\t\t\t\tnewBuf.set(chunk, buffer.length);\n\t\t\t\tbuffer = newBuf;\n\n\t\t\t\t// Try to flush complete messages from the buffer\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst boundary = this.#messageSize(buffer);\n\t\t\t\t\tif (boundary === undefined) break;\n\n\t\t\t\t\tconst toFlush = buffer.subarray(0, boundary);\n\t\t\t\t\tbuffer = buffer.subarray(boundary);\n\n\t\t\t\t\tif (!registered) {\n\t\t\t\t\t\t// First message: extract requestId and register before flushing\n\t\t\t\t\t\tconst parsed = this.#tryParseOutgoing(toFlush);\n\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\tregisteredRequestId = parsed.requestId;\n\t\t\t\t\t\t\tthis.#streams.set(parsed.requestId, { controller });\n\t\t\t\t\t\t\tregistered = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tawait this.#writeMutex.runExclusive(() => this.#writer.write(toFlush));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tconst stream = new Stream({ readable, writable: sendWritable });\n\t\tstream.reader.version = this.version;\n\t\tstream.writer.version = this.version;\n\t\treturn stream;\n\t}\n\n\t/**\n\t * Open a real WebTransport bidi stream (for v16 SubscribeNamespace).\n\t */\n\tasync openNativeBi(): Promise<Stream> {\n\t\treturn Stream.open(this.#quic, this.version);\n\t}\n\n\t/**\n\t * Allocate the next request ID, blocking if flow control limit reached.\n\t */\n\tasync nextRequestId(): Promise<bigint | undefined> {\n\t\tfor (;;) {\n\t\t\tif (this.#closed) return undefined;\n\t\t\tconst id = this.#requestId;\n\t\t\tif (id < this.#maxRequestId) {\n\t\t\t\tthis.#requestId += 2n;\n\t\t\t\treturn id;\n\t\t\t}\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tthis.#maxRequestIdResolves.push(resolve);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Main run loop — reads control stream messages and routes to virtual streams.\n\t * Must be called after construction. Runs until the control stream closes.\n\t */\n\tasync run(): Promise<void> {\n\t\ttry {\n\t\t\t// v16: also accept real bidi streams (for SubscribeNamespace)\n\t\t\tif (this.version === Version.DRAFT_16) {\n\t\t\t\tvoid this.#acceptNativeBidis();\n\t\t\t}\n\n\t\t\tfor (;;) {\n\t\t\t\tconst done = await this.#reader.done();\n\t\t\t\tif (done) break;\n\n\t\t\t\tconst typeId = await this.#reader.u53();\n\t\t\t\tconst size = await this.#reader.u16();\n\t\t\t\tconst body = await this.#reader.read(size);\n\n\t\t\t\tconst classified = await this.#classify(typeId, body);\n\n\t\t\t\tif (classified.route === Route.GoAway) {\n\t\t\t\t\tconsole.warn(\"received GOAWAY on control stream\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst { route, requestId } = classified;\n\n\t\t\t\tswitch (route) {\n\t\t\t\t\tcase Route.NewRequest:\n\t\t\t\t\t\tthis.#newRequest(typeId, size, body, requestId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Route.Response:\n\t\t\t\t\t\tthis.#pushMessage(requestId, typeId, size, body);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Route.ErrorResponse:\n\t\t\t\t\t\tthis.#pushMessage(requestId, typeId, size, body);\n\t\t\t\t\t\tthis.#closeStream(requestId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Route.CloseStream:\n\t\t\t\t\t\tthis.#closeStream(requestId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Route.FollowUp:\n\t\t\t\t\t\tthis.#pushMessage(requestId, typeId, size, body);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Route.MaxRequestId:\n\t\t\t\t\t\tthis.#maxRequestId = requestId;\n\t\t\t\t\t\tfor (const resolve of this.#maxRequestIdResolves) resolve();\n\t\t\t\t\t\tthis.#maxRequestIdResolves = [];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/** Accept real WebTransport bidi streams and queue them for acceptBi (v16). */\n\tasync #acceptNativeBidis(): Promise<void> {\n\t\ttry {\n\t\t\tfor (;;) {\n\t\t\t\tconst stream = await Stream.accept(this.#quic, this.version);\n\t\t\t\tif (!stream) break;\n\n\t\t\t\tconst waiter = this.#incomingWaiters.shift();\n\t\t\t\tif (waiter) {\n\t\t\t\t\twaiter(stream);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#incomingQueue.push(stream);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Session closed\n\t\t}\n\t}\n\n\t#newRequest(typeId: number, size: number, body: Uint8Array, requestId: bigint) {\n\t\tlet controller!: ReadableStreamDefaultController<Uint8Array>;\n\t\tconst readable = new ReadableStream<Uint8Array>({\n\t\t\tstart(c) {\n\t\t\t\tcontroller = c;\n\t\t\t},\n\t\t\tcancel: () => {\n\t\t\t\tthis.#streams.delete(requestId);\n\t\t\t},\n\t\t});\n\n\t\tconst sendWritable = this.#createSendWritable();\n\n\t\tconst stream = new Stream({ readable, writable: sendWritable });\n\t\tstream.reader.version = this.version;\n\t\tstream.writer.version = this.version;\n\n\t\tthis.#streams.set(requestId, { controller });\n\n\t\t// Push initial message bytes so the dispatcher can read typeId + decode\n\t\tcontroller.enqueue(this.#encodeRaw(typeId, size, body));\n\n\t\t// Queue for acceptBi\n\t\tconst waiter = this.#incomingWaiters.shift();\n\t\tif (waiter) {\n\t\t\twaiter(stream);\n\t\t} else {\n\t\t\tthis.#incomingQueue.push(stream);\n\t\t}\n\t}\n\n\t#pushMessage(requestId: bigint, typeId: number, size: number, body: Uint8Array) {\n\t\tconst entry = this.#streams.get(requestId);\n\t\tif (!entry) {\n\t\t\tconsole.warn(`adapter: no stream for requestId=${requestId} typeId=0x${typeId.toString(16)}`);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tentry.controller.enqueue(this.#encodeRaw(typeId, size, body));\n\t\t} catch {\n\t\t\t// Stream already closed\n\t\t}\n\t}\n\n\t#closeStream(requestId: bigint) {\n\t\tconst entry = this.#streams.get(requestId);\n\t\tif (!entry) return;\n\t\tconsole.debug(`adapter: closing stream requestId=${requestId}`);\n\t\tthis.#streams.delete(requestId);\n\t\tthis.#subscribeNamespaces.delete(requestId);\n\t\tconst namespace = this.#namespacesByRequestId.get(requestId);\n\t\tif (namespace !== undefined) {\n\t\t\tthis.#namespaces.delete(namespace);\n\t\t\tthis.#namespacesByRequestId.delete(requestId);\n\t\t}\n\t\ttry {\n\t\t\tentry.controller.close();\n\t\t} catch {\n\t\t\t// Already closed\n\t\t}\n\t}\n\n\t/**\n\t * Returns the total byte size of the first complete message in buffer,\n\t * or undefined if the buffer doesn't contain a complete message yet.\n\t * Message format: [typeId varint][size u16 BE][body of `size` bytes]\n\t */\n\t#messageSize(buffer: Uint8Array): number | undefined {\n\t\tif (buffer.length === 0) return undefined;\n\n\t\tconst typeSize = 1 << ((buffer[0] & 0xc0) >> 6);\n\t\tif (buffer.length < typeSize) return undefined;\n\n\t\tconst [, afterType] = Varint.decode(buffer);\n\t\tif (afterType.length < 2) return undefined;\n\n\t\tconst size = (afterType[0] << 8) | afterType[1];\n\t\tconst totalSize = buffer.length - afterType.length + 2 + size;\n\t\tif (buffer.length < totalSize) return undefined;\n\n\t\treturn totalSize;\n\t}\n\n\t/**\n\t * Try to parse the first outgoing message from accumulated bytes.\n\t * Returns the requestId if enough data is available, undefined otherwise.\n\t */\n\t#tryParseOutgoing(buffer: Uint8Array): { requestId: bigint } | undefined {\n\t\tif (buffer.length === 0) return undefined;\n\n\t\t// Check typeId varint size before decoding\n\t\tconst typeSize = 1 << ((buffer[0] & 0xc0) >> 6);\n\t\tif (buffer.length < typeSize) return undefined;\n\n\t\tconst [typeId, afterType] = Varint.decode(buffer);\n\n\t\t// Need 2 bytes for u16 size\n\t\tif (afterType.length < 2) return undefined;\n\n\t\tconst size = (afterType[0] << 8) | afterType[1];\n\t\tconst bodyStart = afterType.subarray(2);\n\n\t\t// Need full body\n\t\tif (bodyStart.length < size) return undefined;\n\n\t\tconst body = bodyStart.subarray(0, size);\n\n\t\t// Decode requestId from body (QUIC varint)\n\t\tconst [reqId] = Varint.decode(body);\n\t\tconst requestId = BigInt(reqId);\n\n\t\t// PublishNamespace (0x06): also parse namespace for v14/v15 reverse lookup\n\t\tif (typeId === 0x06) {\n\t\t\ttry {\n\t\t\t\tconst [, afterReqId] = Varint.decode(body);\n\t\t\t\tthis.#parseAndRegisterNamespace(afterReqId, requestId);\n\t\t\t} catch {\n\t\t\t\t// Non-critical: only needed for v14/v15 PublishNamespaceDone/Cancel\n\t\t\t}\n\t\t}\n\n\t\t// SubscribeNamespace (0x11): register for follow-up routing\n\t\tif (typeId === 0x11) {\n\t\t\tthis.#subscribeNamespaces.add(requestId);\n\t\t}\n\n\t\treturn { requestId };\n\t}\n\n\t/**\n\t * Parse a namespace from raw bytes and register it for reverse lookup.\n\t */\n\t#parseAndRegisterNamespace(buf: Uint8Array, requestId: bigint) {\n\t\tconst decoder = new TextDecoder();\n\t\tconst [partCount, afterCount] = Varint.decode(buf);\n\t\tlet cursor = afterCount;\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < partCount; i++) {\n\t\t\tconst [len, afterLen] = Varint.decode(cursor);\n\t\t\tparts.push(decoder.decode(afterLen.subarray(0, len)));\n\t\t\tcursor = afterLen.subarray(len);\n\t\t}\n\t\tconst namespace = parts.join(\"/\");\n\t\tthis.#namespaces.set(namespace, requestId);\n\t\tthis.#namespacesByRequestId.set(requestId, namespace);\n\t}\n\n\t/** Create a WritableStream that buffers and writes complete messages to the control stream under mutex. */\n\t#createSendWritable(): WritableStream<Uint8Array> {\n\t\tlet buffer = new Uint8Array(0);\n\t\treturn new WritableStream<Uint8Array>({\n\t\t\twrite: async (chunk) => {\n\t\t\t\tconst newBuf = new Uint8Array(buffer.length + chunk.length);\n\t\t\t\tnewBuf.set(buffer);\n\t\t\t\tnewBuf.set(chunk, buffer.length);\n\t\t\t\tbuffer = newBuf;\n\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst boundary = this.#messageSize(buffer);\n\t\t\t\t\tif (boundary === undefined) break;\n\n\t\t\t\t\tconst toFlush = buffer.subarray(0, boundary);\n\t\t\t\t\tbuffer = buffer.subarray(boundary);\n\t\t\t\t\tawait this.#writeMutex.runExclusive(() => this.#writer.write(toFlush));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\t/** Encode raw message bytes: [typeId varint][size u16 BE][body] */\n\t#encodeRaw(typeId: number, size: number, body: Uint8Array): Uint8Array {\n\t\t// v14-v16 always use QUIC varint\n\t\tconst typeIdBytes = Varint.encodeTo(new ArrayBuffer(9), typeId);\n\t\tconst result = new Uint8Array(typeIdBytes.byteLength + 2 + body.byteLength);\n\t\tresult.set(typeIdBytes, 0);\n\t\tconst sizeView = new DataView(result.buffer, typeIdBytes.byteLength, 2);\n\t\tsizeView.setUint16(0, size);\n\t\tresult.set(body, typeIdBytes.byteLength + 2);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Classify a control message and extract its requestId for routing.\n\t */\n\tasync #classify(\n\t\ttypeId: number,\n\t\tbody: Uint8Array,\n\t): Promise<{ route: typeof Route.GoAway } | { route: Exclude<Route, typeof Route.GoAway>; requestId: bigint }> {\n\t\tconst readRequestId = async (): Promise<bigint> => {\n\t\t\tconst r = new Reader(undefined, body, this.version);\n\t\t\treturn await r.u62();\n\t\t};\n\n\t\tconst readNamespaceRequestId = async (): Promise<bigint> => {\n\t\t\tconst r = new Reader(undefined, body, this.version);\n\t\t\tconst namespace = await Namespace.decode(r);\n\t\t\tconst requestId = this.#namespaces.get(namespace);\n\t\t\tif (requestId === undefined) throw new Error(`unknown namespace: ${namespace}`);\n\t\t\tthis.#namespaces.delete(namespace);\n\t\t\treturn requestId;\n\t\t};\n\n\t\tswitch (typeId) {\n\t\t\t// === FollowUp: route to existing stream ===\n\t\t\tcase 0x02: {\n\t\t\t\t// SubscribeUpdate / REQUEST_UPDATE\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.FollowUp, requestId };\n\t\t\t}\n\n\t\t\t// === NewRequest: create virtual stream ===\n\t\t\tcase 0x03: // Subscribe\n\t\t\tcase 0x16: // Fetch\n\t\t\tcase 0x1d: // Publish\n\t\t\tcase 0x0d: {\n\t\t\t\t// TrackStatusRequest\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.NewRequest, requestId };\n\t\t\t}\n\t\t\tcase 0x06: {\n\t\t\t\t// PublishNamespace — also store namespace for v14/v15 reverse lookup\n\t\t\t\tconst r = new Reader(undefined, body, this.version);\n\t\t\t\tconst requestId = await r.u62();\n\t\t\t\tconst namespace = await Namespace.decode(r);\n\t\t\t\tthis.#namespaces.set(namespace, requestId);\n\t\t\t\tthis.#namespacesByRequestId.set(requestId, namespace);\n\t\t\t\treturn { route: Route.NewRequest, requestId };\n\t\t\t}\n\t\t\tcase 0x11: {\n\t\t\t\t// SubscribeNamespace (v14/v15 only on control stream)\n\t\t\t\tif (this.version !== Version.DRAFT_14 && this.version !== Version.DRAFT_15) {\n\t\t\t\t\tthrow new Error(\"unexpected SubscribeNamespace on control stream\");\n\t\t\t\t}\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.NewRequest, requestId };\n\t\t\t}\n\n\t\t\t// === Response: push bytes, keep stream open ===\n\t\t\tcase 0x04: {\n\t\t\t\t// SubscribeOk\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.Response, requestId };\n\t\t\t}\n\t\t\tcase 0x18: {\n\t\t\t\t// FetchOk\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.Response, requestId };\n\t\t\t}\n\t\t\tcase 0x1e: {\n\t\t\t\t// PublishOk\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.Response, requestId };\n\t\t\t}\n\t\t\tcase 0x07: {\n\t\t\t\t// v14: PublishNamespaceOk, v15+: RequestOk\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.Response, requestId };\n\t\t\t}\n\t\t\tcase 0x12: {\n\t\t\t\t// SubscribeNamespaceOk (v14 only)\n\t\t\t\tif (this.version !== Version.DRAFT_14) throw new Error(\"unexpected SubscribeNamespaceOk\");\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.Response, requestId };\n\t\t\t}\n\n\t\t\t// === ErrorResponse: push bytes + close ===\n\t\t\tcase 0x05: {\n\t\t\t\t// SubscribeError (v14) / RequestError (v15+)\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.ErrorResponse, requestId };\n\t\t\t}\n\t\t\tcase 0x19: {\n\t\t\t\t// FetchError (v14 only)\n\t\t\t\tif (this.version !== Version.DRAFT_14) throw new Error(\"unexpected FetchError\");\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.ErrorResponse, requestId };\n\t\t\t}\n\t\t\tcase 0x1f: {\n\t\t\t\t// PublishError (v14 only)\n\t\t\t\tif (this.version !== Version.DRAFT_14) throw new Error(\"unexpected PublishError\");\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.ErrorResponse, requestId };\n\t\t\t}\n\t\t\tcase 0x08: {\n\t\t\t\tif (this.version === Version.DRAFT_14) {\n\t\t\t\t\t// PublishNamespaceError\n\t\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\t\treturn { route: Route.ErrorResponse, requestId };\n\t\t\t\t}\n\t\t\t\t// v15: Namespace entry (no requestId) — route to SubscribeNamespace stream\n\t\t\t\tconst subNs08 = this.#subscribeNamespaces.values().next().value;\n\t\t\t\tif (subNs08 === undefined) throw new Error(\"unexpected message 0x08: no SubscribeNamespace stream\");\n\t\t\t\treturn { route: Route.FollowUp, requestId: subNs08 };\n\t\t\t}\n\t\t\tcase 0x0e: {\n\t\t\t\t// v15: NamespaceDone entry (no requestId) — route to SubscribeNamespace stream\n\t\t\t\tconst subNs0e = this.#subscribeNamespaces.values().next().value;\n\t\t\t\tif (subNs0e === undefined) throw new Error(\"unexpected message 0x0e: no SubscribeNamespace stream\");\n\t\t\t\treturn { route: Route.FollowUp, requestId: subNs0e };\n\t\t\t}\n\t\t\tcase 0x13: {\n\t\t\t\t// SubscribeNamespaceError (v14 only)\n\t\t\t\tif (this.version !== Version.DRAFT_14) throw new Error(\"unexpected SubscribeNamespaceError\");\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.ErrorResponse, requestId };\n\t\t\t}\n\n\t\t\t// === CloseStream: close recv (no bytes pushed) ===\n\t\t\tcase 0x0a: {\n\t\t\t\t// Unsubscribe\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t}\n\t\t\tcase 0x0b: {\n\t\t\t\t// PublishDone\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t}\n\t\t\tcase 0x17: {\n\t\t\t\t// FetchCancel\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t}\n\t\t\tcase 0x09: {\n\t\t\t\t// PublishNamespaceDone: v16 uses requestId, v14/v15 uses namespace\n\t\t\t\tif (this.version === Version.DRAFT_16) {\n\t\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t\t}\n\t\t\t\tconst requestId = await readNamespaceRequestId();\n\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t}\n\t\t\tcase 0x0c: {\n\t\t\t\t// PublishNamespaceCancel: v16 uses requestId, v14/v15 uses namespace\n\t\t\t\tif (this.version === Version.DRAFT_16) {\n\t\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t\t}\n\t\t\t\tconst requestId = await readNamespaceRequestId();\n\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t}\n\t\t\tcase 0x14: {\n\t\t\t\t// UnsubscribeNamespace (v14/v15 only)\n\t\t\t\tif (this.version !== Version.DRAFT_14 && this.version !== Version.DRAFT_15) {\n\t\t\t\t\tthrow new Error(\"unexpected UnsubscribeNamespace\");\n\t\t\t\t}\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.CloseStream, requestId };\n\t\t\t}\n\n\t\t\t// === Utility ===\n\t\t\tcase 0x15: {\n\t\t\t\t// MaxRequestId\n\t\t\t\tconst requestId = await readRequestId();\n\t\t\t\treturn { route: Route.MaxRequestId, requestId };\n\t\t\t}\n\t\t\tcase 0x1a: {\n\t\t\t\t// RequestsBlocked — connection-level, consume and ignore\n\t\t\t\tawait readRequestId();\n\t\t\t\treturn { route: Route.Ignore, requestId: 0n };\n\t\t\t}\n\n\t\t\t// === Terminal ===\n\t\t\tcase 0x10: // GoAway\n\t\t\t\treturn { route: Route.GoAway };\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`unknown control message type: 0x${typeId.toString(16)}`);\n\t\t}\n\t}\n\n\tclose() {\n\t\tif (this.#closed) return;\n\t\tthis.#closed = true;\n\t\tconsole.debug(\"adapter: close() called\");\n\n\t\t// Close all virtual streams\n\t\tfor (const entry of this.#streams.values()) {\n\t\t\ttry {\n\t\t\t\tentry.controller.close();\n\t\t\t} catch {\n\t\t\t\t// Already closed\n\t\t\t}\n\t\t}\n\t\tthis.#streams.clear();\n\n\t\t// Resolve any waiting acceptBi callers\n\t\tfor (const waiter of this.#incomingWaiters) {\n\t\t\twaiter(undefined);\n\t\t}\n\t\tthis.#incomingWaiters = [];\n\n\t\t// Clear namespace mappings\n\t\tthis.#namespaces.clear();\n\t\tthis.#namespacesByRequestId.clear();\n\t\tthis.#subscribeNamespaces.clear();\n\n\t\t// Unblock maxRequestId waiters\n\t\tfor (const resolve of this.#maxRequestIdResolves) resolve();\n\t\tthis.#maxRequestIdResolves = [];\n\t}\n}\n"]}
@@ -0,0 +1,65 @@
1
+ import type { Announced } from "../announced";
2
+ import type { Broadcast } from "../broadcast";
3
+ import type { Established } from "../connection/established";
4
+ import * as Path from "../path";
5
+ import { type Stream } from "../stream";
6
+ import { type IetfVersion } from "./version";
7
+ /**
8
+ * Represents a connection to a MoQ server using moq-transport protocol.
9
+ *
10
+ * @public
11
+ */
12
+ export declare class Connection implements Established {
13
+ #private;
14
+ readonly url: URL;
15
+ readonly version: string;
16
+ /**
17
+ * Creates a new Connection instance.
18
+ * @param url - The URL of the connection
19
+ * @param quic - The WebTransport session
20
+ * @param control - The control/setup stream
21
+ * @param maxRequestId - The initial max request ID
22
+ * @param version - The negotiated protocol version
23
+ *
24
+ * @internal
25
+ */
26
+ constructor({ url, quic, control, maxRequestId, version, }: {
27
+ url: URL;
28
+ quic: WebTransport;
29
+ control: Stream;
30
+ maxRequestId: bigint;
31
+ version: IetfVersion;
32
+ });
33
+ /**
34
+ * Closes the connection.
35
+ */
36
+ close(): void;
37
+ /**
38
+ * Publishes a broadcast to the connection.
39
+ * @param name - The broadcast path to publish
40
+ * @param broadcast - The broadcast to publish
41
+ */
42
+ publish(path: Path.Valid, broadcast: Broadcast): void;
43
+ /**
44
+ * Gets an announced reader for the specified prefix.
45
+ * @param prefix - The prefix for announcements
46
+ * @returns An Announced instance
47
+ */
48
+ announced(prefix?: Path.Valid): Announced;
49
+ /**
50
+ * Consumes a broadcast from the connection.
51
+ *
52
+ * @remarks
53
+ * If the broadcast is not found, a "not found" error will be thrown when requesting any tracks.
54
+ *
55
+ * @param broadcast - The path of the broadcast to consume
56
+ * @returns A Broadcast instance
57
+ */
58
+ consume(broadcast: Path.Valid): Broadcast;
59
+ /**
60
+ * Returns a promise that resolves when the connection is closed.
61
+ * @returns A promise that resolves when closed
62
+ */
63
+ get closed(): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/ietf/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAwB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAWjE,OAAO,EAAE,KAAK,WAAW,EAAwB,MAAM,cAAc,CAAC;AAEtE;;;;GAIG;AACH,qBAAa,UAAW,YAAW,WAAW;;IAE7C,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAGlB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAiBzB;;;;;;;;;OASG;IACH,YAAY,EACX,GAAG,EACH,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,OAAO,GACP,EAAE;QACF,GAAG,EAAE,GAAG,CAAC;QACT,IAAI,EAAE,YAAY,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,WAAW,CAAC;KACrB,EAwBA;IAED;;OAEG;IACH,KAAK,SAYJ;IAcD;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,QAE7C;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAM,aAAe,GAAG,SAAS,CAE1C;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,GAAG,SAAS,CAExC;IA2HD;;;OAGG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;CACD"}
@@ -0,0 +1,248 @@
1
+ /* @ts-self-types="./connection.d.ts" */
2
+ import * as Path from "../path.js";
3
+ import { Readers } from "../stream.js";
4
+ import { ControlStreamAdapter, NativeSession } from "./adapter.js";
5
+ import { GoAway } from "./goaway.js";
6
+ import { Group } from "./object.js";
7
+ import { Publish } from "./publish.js";
8
+ import { PublishNamespace } from "./publish_namespace.js";
9
+ import { Publisher } from "./publisher.js";
10
+ import { Subscribe, SubscribeUpdate } from "./subscribe.js";
11
+ import { SubscribeNamespace, SubscribeNamespaceLegacy } from "./subscribe_namespace.js";
12
+ import { Subscriber } from "./subscriber.js";
13
+ import { TrackStatusRequest } from "./track.js";
14
+ import { Version, versionName } from "./version.js";
15
+ /**
16
+ * Represents a connection to a MoQ server using moq-transport protocol.
17
+ *
18
+ * @public
19
+ */
20
+ export class Connection {
21
+ // The URL of the connection.
22
+ url;
23
+ // The negotiated protocol version.
24
+ version;
25
+ // The established WebTransport session.
26
+ #quic;
27
+ // Session abstraction: adapter for v14-v16, native for v17.
28
+ #session;
29
+ // Module for contributing tracks.
30
+ #publisher;
31
+ // Module for distributing tracks.
32
+ #subscriber;
33
+ // Just to avoid logging when `close()` is called.
34
+ #closed = false;
35
+ /**
36
+ * Creates a new Connection instance.
37
+ * @param url - The URL of the connection
38
+ * @param quic - The WebTransport session
39
+ * @param control - The control/setup stream
40
+ * @param maxRequestId - The initial max request ID
41
+ * @param version - The negotiated protocol version
42
+ *
43
+ * @internal
44
+ */
45
+ constructor({ url, quic, control, maxRequestId, version, }) {
46
+ this.url = url;
47
+ this.version = versionName(version);
48
+ this.#quic = quic;
49
+ // Two-path dispatch: v14-v16 uses adapter, v17+ uses native bidi streams
50
+ if (version >= Version.DRAFT_17) {
51
+ this.#session = new NativeSession(quic, version);
52
+ // v17+: control/setup stream only carries GoAway
53
+ void this.#runGoAway(control, version);
54
+ }
55
+ else {
56
+ const adapter = new ControlStreamAdapter(quic, control, version, maxRequestId);
57
+ this.#session = adapter;
58
+ // Start the adapter read loop (routes control messages to virtual streams)
59
+ void adapter.run().catch((err) => {
60
+ if (!this.#closed)
61
+ console.error("adapter error", err);
62
+ this.close();
63
+ });
64
+ }
65
+ this.#publisher = new Publisher(this.#quic, this.#session);
66
+ this.#subscriber = new Subscriber(this.#session);
67
+ void this.#run();
68
+ }
69
+ /**
70
+ * Closes the connection.
71
+ */
72
+ close() {
73
+ if (this.#closed)
74
+ return;
75
+ this.#closed = true;
76
+ this.#session.close?.();
77
+ try {
78
+ this.#quic.close();
79
+ }
80
+ catch {
81
+ // ignore
82
+ }
83
+ }
84
+ async #run() {
85
+ try {
86
+ await Promise.all([this.#runBidis(), this.#runUnis()]);
87
+ }
88
+ catch (err) {
89
+ if (!this.#closed) {
90
+ console.error("fatal error running connection", err);
91
+ }
92
+ }
93
+ finally {
94
+ this.close();
95
+ }
96
+ }
97
+ /**
98
+ * Publishes a broadcast to the connection.
99
+ * @param name - The broadcast path to publish
100
+ * @param broadcast - The broadcast to publish
101
+ */
102
+ publish(path, broadcast) {
103
+ this.#publisher.publish(path, broadcast);
104
+ }
105
+ /**
106
+ * Gets an announced reader for the specified prefix.
107
+ * @param prefix - The prefix for announcements
108
+ * @returns An Announced instance
109
+ */
110
+ announced(prefix = Path.empty()) {
111
+ return this.#subscriber.announced(prefix);
112
+ }
113
+ /**
114
+ * Consumes a broadcast from the connection.
115
+ *
116
+ * @remarks
117
+ * If the broadcast is not found, a "not found" error will be thrown when requesting any tracks.
118
+ *
119
+ * @param broadcast - The path of the broadcast to consume
120
+ * @returns A Broadcast instance
121
+ */
122
+ consume(broadcast) {
123
+ return this.#subscriber.consume(broadcast);
124
+ }
125
+ /**
126
+ * Accepts bidi streams (virtual for v14-v16, real for v17) and dispatches.
127
+ */
128
+ async #runBidis() {
129
+ for (;;) {
130
+ const stream = await this.#session.acceptBi();
131
+ if (!stream)
132
+ break;
133
+ void this.#runBidi(stream).catch((err) => {
134
+ console.error("error processing bidi stream", err);
135
+ stream.abort(new Error("bidi stream error"));
136
+ });
137
+ }
138
+ }
139
+ /**
140
+ * Unified bidi stream dispatch — reads typeId and routes to handler.
141
+ * Matches the lite module's runBidi pattern.
142
+ */
143
+ async #runBidi(stream) {
144
+ const typeId = await stream.reader.u53();
145
+ switch (typeId) {
146
+ // Draft-18 SUBSCRIBE_NAMESPACE (0x50) and the legacy 0x11 message decode
147
+ // to the same request_id + namespace; the legacy options field is ignored.
148
+ case SubscribeNamespace.id: {
149
+ const msg = await SubscribeNamespace.decode(stream.reader, this.#session.version);
150
+ await this.#publisher.runSubscribeNamespace(msg, stream);
151
+ break;
152
+ }
153
+ case SubscribeNamespaceLegacy.id: {
154
+ const legacy = await SubscribeNamespaceLegacy.decode(stream.reader, this.#session.version);
155
+ const msg = new SubscribeNamespace({ requestId: legacy.requestId, namespace: legacy.namespace });
156
+ await this.#publisher.runSubscribeNamespace(msg, stream);
157
+ break;
158
+ }
159
+ case SubscribeUpdate.id: {
160
+ // REQUEST_UPDATE (0x02) is a follow-up, not a valid initial message
161
+ stream.abort(new Error("unexpected REQUEST_UPDATE as initial message"));
162
+ break;
163
+ }
164
+ // Publisher handles incoming requests
165
+ case Subscribe.id: {
166
+ const msg = await Subscribe.decode(stream.reader, this.#session.version);
167
+ await this.#publisher.runSubscribe(msg, stream);
168
+ break;
169
+ }
170
+ case TrackStatusRequest.id: {
171
+ const msg = await TrackStatusRequest.decode(stream.reader, this.#session.version);
172
+ await this.#publisher.runTrackStatusRequest(msg, stream);
173
+ break;
174
+ }
175
+ // Subscriber handles incoming notifications
176
+ case PublishNamespace.id: {
177
+ const msg = await PublishNamespace.decode(stream.reader, this.#session.version);
178
+ await this.#subscriber.runPublishNamespace(msg, stream);
179
+ break;
180
+ }
181
+ case Publish.id: {
182
+ const msg = await Publish.decode(stream.reader, this.#session.version);
183
+ await this.#subscriber.runPublish(msg, stream);
184
+ break;
185
+ }
186
+ default:
187
+ console.warn(`unexpected bidi stream type: 0x${typeId.toString(16)}`);
188
+ stream.abort(new Error("unexpected stream type"));
189
+ }
190
+ }
191
+ /**
192
+ * Handles unidirectional streams for media delivery (groups).
193
+ */
194
+ async #runUnis() {
195
+ const readers = new Readers(this.#quic, this.#session.version);
196
+ for (;;) {
197
+ const stream = await readers.next();
198
+ if (!stream)
199
+ break;
200
+ this.#runUni(stream)
201
+ .then(() => {
202
+ stream.stop(new Error("cancel"));
203
+ })
204
+ .catch((err) => {
205
+ console.error("error processing object stream", err);
206
+ stream.stop(err);
207
+ });
208
+ }
209
+ }
210
+ async #runUni(stream) {
211
+ const header = await Group.decode(stream, this.#session.version);
212
+ await this.#subscriber.handleGroup(header, stream);
213
+ }
214
+ /**
215
+ * v17+ only: reads GoAway from the setup/control stream.
216
+ */
217
+ async #runGoAway(controlStream, version) {
218
+ try {
219
+ const done = await controlStream.reader.done();
220
+ if (done)
221
+ return;
222
+ const typeId = await controlStream.reader.u53();
223
+ if (typeId === GoAway.id) {
224
+ const msg = await GoAway.decode(controlStream.reader, version);
225
+ console.warn(`received GOAWAY with redirect URI: ${msg.newSessionUri}`);
226
+ }
227
+ else {
228
+ console.warn(`unexpected message on setup stream: 0x${typeId.toString(16)}`);
229
+ }
230
+ }
231
+ catch (err) {
232
+ if (!this.#closed) {
233
+ console.error("error reading setup stream", err);
234
+ }
235
+ }
236
+ finally {
237
+ this.close();
238
+ }
239
+ }
240
+ /**
241
+ * Returns a promise that resolves when the connection is closed.
242
+ * @returns A promise that resolves when closed
243
+ */
244
+ get closed() {
245
+ return this.#quic.closed.then(() => undefined);
246
+ }
247
+ }
248
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/ietf/connection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAe,OAAO,EAAe,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAoB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEtE;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACtB,6BAA6B;IACpB,GAAG,CAAM;IAElB,mCAAmC;IAC1B,OAAO,CAAS;IAEzB,wCAAwC;IACxC,KAAK,CAAe;IAEpB,4DAA4D;IAC5D,QAAQ,CAAU;IAElB,kCAAkC;IAClC,UAAU,CAAY;IAEtB,kCAAkC;IAClC,WAAW,CAAa;IAExB,kDAAkD;IAClD,OAAO,GAAG,KAAK,CAAC;IAEhB;;;;;;;;;OASG;IACH,YAAY,EACX,GAAG,EACH,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,OAAO,GAOP;QACA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,yEAAyE;QACzE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,iDAAiD;YACjD,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACP,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YAC/E,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;YACxB,2EAA2E;YAC3E,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACzC,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QAExB,IAAI,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,CAAC;YACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACF,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAgB,EAAE,SAAoB;QAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAqB;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACd,SAAS,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM;gBAAE,MAAM;YAEnB,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACjD,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;gBACnD,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAEzC,QAAQ,MAAM,EAAE,CAAC;YAChB,yEAAyE;YACzE,2EAA2E;YAC3E,KAAK,kBAAkB,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClF,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM;YACP,CAAC;YACD,KAAK,wBAAwB,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3F,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACjG,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM;YACP,CAAC;YACD,KAAK,eAAe,CAAC,EAAE,EAAE,CAAC;gBACzB,oEAAoE;gBACpE,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACxE,MAAM;YACP,CAAC;YACD,sCAAsC;YACtC,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzE,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM;YACP,CAAC;YACD,KAAK,kBAAkB,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClF,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM;YACP,CAAC;YAED,4CAA4C;YAC5C,KAAK,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAChF,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACxD,MAAM;YACP,CAAC;YACD,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvE,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC/C,MAAM;YACP,CAAC;YAED;gBACC,OAAO,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtE,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACb,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE/D,SAAS,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM;gBAAE,MAAM;YAEnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;iBAClB,IAAI,CAAC,GAAG,EAAE;gBACV,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACvB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC3B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,aAAqB,EAAE,OAAoB;QAC3D,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,IAAI;gBAAE,OAAO;YAEjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChD,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,sCAAsC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;CACD","sourcesContent":["import type { Announced } from \"../announced.ts\";\nimport type { Broadcast } from \"../broadcast.ts\";\nimport type { Established } from \"../connection/established.ts\";\nimport * as Path from \"../path.ts\";\nimport { type Reader, Readers, type Stream } from \"../stream.ts\";\nimport { ControlStreamAdapter, NativeSession, type Session } from \"./adapter.ts\";\nimport { GoAway } from \"./goaway.ts\";\nimport { Group } from \"./object.ts\";\nimport { Publish } from \"./publish.ts\";\nimport { PublishNamespace } from \"./publish_namespace.ts\";\nimport { Publisher } from \"./publisher.ts\";\nimport { Subscribe, SubscribeUpdate } from \"./subscribe.ts\";\nimport { SubscribeNamespace, SubscribeNamespaceLegacy } from \"./subscribe_namespace.ts\";\nimport { Subscriber } from \"./subscriber.ts\";\nimport { TrackStatusRequest } from \"./track.ts\";\nimport { type IetfVersion, Version, versionName } from \"./version.ts\";\n\n/**\n * Represents a connection to a MoQ server using moq-transport protocol.\n *\n * @public\n */\nexport class Connection implements Established {\n\t// The URL of the connection.\n\treadonly url: URL;\n\n\t// The negotiated protocol version.\n\treadonly version: string;\n\n\t// The established WebTransport session.\n\t#quic: WebTransport;\n\n\t// Session abstraction: adapter for v14-v16, native for v17.\n\t#session: Session;\n\n\t// Module for contributing tracks.\n\t#publisher: Publisher;\n\n\t// Module for distributing tracks.\n\t#subscriber: Subscriber;\n\n\t// Just to avoid logging when `close()` is called.\n\t#closed = false;\n\n\t/**\n\t * Creates a new Connection instance.\n\t * @param url - The URL of the connection\n\t * @param quic - The WebTransport session\n\t * @param control - The control/setup stream\n\t * @param maxRequestId - The initial max request ID\n\t * @param version - The negotiated protocol version\n\t *\n\t * @internal\n\t */\n\tconstructor({\n\t\turl,\n\t\tquic,\n\t\tcontrol,\n\t\tmaxRequestId,\n\t\tversion,\n\t}: {\n\t\turl: URL;\n\t\tquic: WebTransport;\n\t\tcontrol: Stream;\n\t\tmaxRequestId: bigint;\n\t\tversion: IetfVersion;\n\t}) {\n\t\tthis.url = url;\n\t\tthis.version = versionName(version);\n\t\tthis.#quic = quic;\n\n\t\t// Two-path dispatch: v14-v16 uses adapter, v17+ uses native bidi streams\n\t\tif (version >= Version.DRAFT_17) {\n\t\t\tthis.#session = new NativeSession(quic, version);\n\t\t\t// v17+: control/setup stream only carries GoAway\n\t\t\tvoid this.#runGoAway(control, version);\n\t\t} else {\n\t\t\tconst adapter = new ControlStreamAdapter(quic, control, version, maxRequestId);\n\t\t\tthis.#session = adapter;\n\t\t\t// Start the adapter read loop (routes control messages to virtual streams)\n\t\t\tvoid adapter.run().catch((err: unknown) => {\n\t\t\t\tif (!this.#closed) console.error(\"adapter error\", err);\n\t\t\t\tthis.close();\n\t\t\t});\n\t\t}\n\n\t\tthis.#publisher = new Publisher(this.#quic, this.#session);\n\t\tthis.#subscriber = new Subscriber(this.#session);\n\n\t\tvoid this.#run();\n\t}\n\n\t/**\n\t * Closes the connection.\n\t */\n\tclose() {\n\t\tif (this.#closed) return;\n\n\t\tthis.#closed = true;\n\n\t\tthis.#session.close?.();\n\n\t\ttry {\n\t\t\tthis.#quic.close();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tasync #run(): Promise<void> {\n\t\ttry {\n\t\t\tawait Promise.all([this.#runBidis(), this.#runUnis()]);\n\t\t} catch (err) {\n\t\t\tif (!this.#closed) {\n\t\t\t\tconsole.error(\"fatal error running connection\", err);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * Publishes a broadcast to the connection.\n\t * @param name - The broadcast path to publish\n\t * @param broadcast - The broadcast to publish\n\t */\n\tpublish(path: Path.Valid, broadcast: Broadcast) {\n\t\tthis.#publisher.publish(path, broadcast);\n\t}\n\n\t/**\n\t * Gets an announced reader for the specified prefix.\n\t * @param prefix - The prefix for announcements\n\t * @returns An Announced instance\n\t */\n\tannounced(prefix = Path.empty()): Announced {\n\t\treturn this.#subscriber.announced(prefix);\n\t}\n\n\t/**\n\t * Consumes a broadcast from the connection.\n\t *\n\t * @remarks\n\t * If the broadcast is not found, a \"not found\" error will be thrown when requesting any tracks.\n\t *\n\t * @param broadcast - The path of the broadcast to consume\n\t * @returns A Broadcast instance\n\t */\n\tconsume(broadcast: Path.Valid): Broadcast {\n\t\treturn this.#subscriber.consume(broadcast);\n\t}\n\n\t/**\n\t * Accepts bidi streams (virtual for v14-v16, real for v17) and dispatches.\n\t */\n\tasync #runBidis() {\n\t\tfor (;;) {\n\t\t\tconst stream = await this.#session.acceptBi();\n\t\t\tif (!stream) break;\n\n\t\t\tvoid this.#runBidi(stream).catch((err: unknown) => {\n\t\t\t\tconsole.error(\"error processing bidi stream\", err);\n\t\t\t\tstream.abort(new Error(\"bidi stream error\"));\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Unified bidi stream dispatch — reads typeId and routes to handler.\n\t * Matches the lite module's runBidi pattern.\n\t */\n\tasync #runBidi(stream: Stream) {\n\t\tconst typeId = await stream.reader.u53();\n\n\t\tswitch (typeId) {\n\t\t\t// Draft-18 SUBSCRIBE_NAMESPACE (0x50) and the legacy 0x11 message decode\n\t\t\t// to the same request_id + namespace; the legacy options field is ignored.\n\t\t\tcase SubscribeNamespace.id: {\n\t\t\t\tconst msg = await SubscribeNamespace.decode(stream.reader, this.#session.version);\n\t\t\t\tawait this.#publisher.runSubscribeNamespace(msg, stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SubscribeNamespaceLegacy.id: {\n\t\t\t\tconst legacy = await SubscribeNamespaceLegacy.decode(stream.reader, this.#session.version);\n\t\t\t\tconst msg = new SubscribeNamespace({ requestId: legacy.requestId, namespace: legacy.namespace });\n\t\t\t\tawait this.#publisher.runSubscribeNamespace(msg, stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase SubscribeUpdate.id: {\n\t\t\t\t// REQUEST_UPDATE (0x02) is a follow-up, not a valid initial message\n\t\t\t\tstream.abort(new Error(\"unexpected REQUEST_UPDATE as initial message\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Publisher handles incoming requests\n\t\t\tcase Subscribe.id: {\n\t\t\t\tconst msg = await Subscribe.decode(stream.reader, this.#session.version);\n\t\t\t\tawait this.#publisher.runSubscribe(msg, stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TrackStatusRequest.id: {\n\t\t\t\tconst msg = await TrackStatusRequest.decode(stream.reader, this.#session.version);\n\t\t\t\tawait this.#publisher.runTrackStatusRequest(msg, stream);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Subscriber handles incoming notifications\n\t\t\tcase PublishNamespace.id: {\n\t\t\t\tconst msg = await PublishNamespace.decode(stream.reader, this.#session.version);\n\t\t\t\tawait this.#subscriber.runPublishNamespace(msg, stream);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Publish.id: {\n\t\t\t\tconst msg = await Publish.decode(stream.reader, this.#session.version);\n\t\t\t\tawait this.#subscriber.runPublish(msg, stream);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`unexpected bidi stream type: 0x${typeId.toString(16)}`);\n\t\t\t\tstream.abort(new Error(\"unexpected stream type\"));\n\t\t}\n\t}\n\n\t/**\n\t * Handles unidirectional streams for media delivery (groups).\n\t */\n\tasync #runUnis() {\n\t\tconst readers = new Readers(this.#quic, this.#session.version);\n\n\t\tfor (;;) {\n\t\t\tconst stream = await readers.next();\n\t\t\tif (!stream) break;\n\n\t\t\tthis.#runUni(stream)\n\t\t\t\t.then(() => {\n\t\t\t\t\tstream.stop(new Error(\"cancel\"));\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tconsole.error(\"error processing object stream\", err);\n\t\t\t\t\tstream.stop(err);\n\t\t\t\t});\n\t\t}\n\t}\n\n\tasync #runUni(stream: Reader) {\n\t\tconst header = await Group.decode(stream, this.#session.version);\n\t\tawait this.#subscriber.handleGroup(header, stream);\n\t}\n\n\t/**\n\t * v17+ only: reads GoAway from the setup/control stream.\n\t */\n\tasync #runGoAway(controlStream: Stream, version: IetfVersion) {\n\t\ttry {\n\t\t\tconst done = await controlStream.reader.done();\n\t\t\tif (done) return;\n\n\t\t\tconst typeId = await controlStream.reader.u53();\n\t\t\tif (typeId === GoAway.id) {\n\t\t\t\tconst msg = await GoAway.decode(controlStream.reader, version);\n\t\t\t\tconsole.warn(`received GOAWAY with redirect URI: ${msg.newSessionUri}`);\n\t\t\t} else {\n\t\t\t\tconsole.warn(`unexpected message on setup stream: 0x${typeId.toString(16)}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!this.#closed) {\n\t\t\t\tconsole.error(\"error reading setup stream\", err);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * Returns a promise that resolves when the connection is closed.\n\t * @returns A promise that resolves when closed\n\t */\n\tget closed(): Promise<void> {\n\t\treturn this.#quic.closed.then(() => undefined);\n\t}\n}\n"]}
@@ -0,0 +1,135 @@
1
+ import type { Stream as StreamInner } from "../stream";
2
+ import { Fetch, FetchCancel, FetchError, FetchOk } from "./fetch";
3
+ import { GoAway } from "./goaway";
4
+ import { Publish, PublishDone, PublishError, PublishOk } from "./publish";
5
+ import { PublishNamespace, PublishNamespaceCancel, PublishNamespaceDone, PublishNamespaceError, PublishNamespaceOk } from "./publish_namespace";
6
+ import { MaxRequestId, RequestError, RequestOk, RequestsBlocked } from "./request";
7
+ import * as Setup from "./setup";
8
+ import { Subscribe, SubscribeError, SubscribeOk, SubscribeUpdate, Unsubscribe } from "./subscribe";
9
+ import { SubscribeNamespaceError, SubscribeNamespaceLegacy, SubscribeNamespaceOk, UnsubscribeNamespace } from "./subscribe_namespace";
10
+ import { TrackStatus, TrackStatusRequest } from "./track";
11
+ import { type IetfVersion } from "./version";
12
+ declare const MessagesV14: {
13
+ readonly [Setup.ClientSetup.id]: typeof Setup.ClientSetup;
14
+ readonly [Setup.ServerSetup.id]: typeof Setup.ServerSetup;
15
+ readonly [SubscribeUpdate.id]: typeof SubscribeUpdate;
16
+ readonly [Subscribe.id]: typeof Subscribe;
17
+ readonly [SubscribeOk.id]: typeof SubscribeOk;
18
+ readonly [SubscribeError.id]: typeof SubscribeError;
19
+ readonly [PublishNamespace.id]: typeof PublishNamespace;
20
+ readonly [PublishNamespaceOk.id]: typeof PublishNamespaceOk;
21
+ readonly [PublishNamespaceError.id]: typeof PublishNamespaceError;
22
+ readonly [PublishNamespaceCancel.id]: typeof PublishNamespaceCancel;
23
+ readonly [TrackStatusRequest.id]: typeof TrackStatusRequest;
24
+ readonly [TrackStatus.id]: typeof TrackStatus;
25
+ readonly [GoAway.id]: typeof GoAway;
26
+ readonly [Fetch.id]: typeof Fetch;
27
+ readonly [FetchCancel.id]: typeof FetchCancel;
28
+ readonly [FetchOk.id]: typeof FetchOk;
29
+ readonly [FetchError.id]: typeof FetchError;
30
+ readonly [SubscribeNamespaceLegacy.id]: typeof SubscribeNamespaceLegacy;
31
+ readonly [SubscribeNamespaceOk.id]: typeof SubscribeNamespaceOk;
32
+ readonly [SubscribeNamespaceError.id]: typeof SubscribeNamespaceError;
33
+ readonly [UnsubscribeNamespace.id]: typeof UnsubscribeNamespace;
34
+ readonly [Publish.id]: typeof Publish;
35
+ readonly [PublishOk.id]: typeof PublishOk;
36
+ readonly [PublishError.id]: typeof PublishError;
37
+ readonly [MaxRequestId.id]: typeof MaxRequestId;
38
+ readonly [RequestsBlocked.id]: typeof RequestsBlocked;
39
+ readonly 9: typeof PublishNamespaceDone;
40
+ readonly 10: typeof Unsubscribe;
41
+ readonly 11: typeof PublishDone;
42
+ };
43
+ declare const MessagesV15: {
44
+ readonly [Setup.ClientSetup.id]: typeof Setup.ClientSetup;
45
+ readonly [Setup.ServerSetup.id]: typeof Setup.ServerSetup;
46
+ readonly [SubscribeUpdate.id]: typeof SubscribeUpdate;
47
+ readonly [Subscribe.id]: typeof Subscribe;
48
+ readonly [SubscribeOk.id]: typeof SubscribeOk;
49
+ readonly [RequestError.id]: typeof RequestError;
50
+ readonly [PublishNamespace.id]: typeof PublishNamespace;
51
+ readonly [RequestOk.id]: typeof RequestOk;
52
+ readonly [PublishNamespaceCancel.id]: typeof PublishNamespaceCancel;
53
+ readonly [TrackStatusRequest.id]: typeof TrackStatusRequest;
54
+ readonly [GoAway.id]: typeof GoAway;
55
+ readonly [Fetch.id]: typeof Fetch;
56
+ readonly [FetchCancel.id]: typeof FetchCancel;
57
+ readonly [FetchOk.id]: typeof FetchOk;
58
+ readonly [SubscribeNamespaceLegacy.id]: typeof SubscribeNamespaceLegacy;
59
+ readonly [UnsubscribeNamespace.id]: typeof UnsubscribeNamespace;
60
+ readonly [Publish.id]: typeof Publish;
61
+ readonly [MaxRequestId.id]: typeof MaxRequestId;
62
+ readonly [RequestsBlocked.id]: typeof RequestsBlocked;
63
+ readonly 9: typeof PublishNamespaceDone;
64
+ readonly 10: typeof Unsubscribe;
65
+ readonly 11: typeof PublishDone;
66
+ };
67
+ declare const MessagesV16: {
68
+ readonly [Setup.ClientSetup.id]: typeof Setup.ClientSetup;
69
+ readonly [Setup.ServerSetup.id]: typeof Setup.ServerSetup;
70
+ readonly [SubscribeUpdate.id]: typeof SubscribeUpdate;
71
+ readonly [Subscribe.id]: typeof Subscribe;
72
+ readonly [SubscribeOk.id]: typeof SubscribeOk;
73
+ readonly [RequestError.id]: typeof RequestError;
74
+ readonly [PublishNamespace.id]: typeof PublishNamespace;
75
+ readonly [RequestOk.id]: typeof RequestOk;
76
+ readonly [PublishNamespaceCancel.id]: typeof PublishNamespaceCancel;
77
+ readonly [TrackStatusRequest.id]: typeof TrackStatusRequest;
78
+ readonly [GoAway.id]: typeof GoAway;
79
+ readonly [Fetch.id]: typeof Fetch;
80
+ readonly [FetchCancel.id]: typeof FetchCancel;
81
+ readonly [FetchOk.id]: typeof FetchOk;
82
+ readonly [Publish.id]: typeof Publish;
83
+ readonly [MaxRequestId.id]: typeof MaxRequestId;
84
+ readonly [RequestsBlocked.id]: typeof RequestsBlocked;
85
+ readonly 9: typeof PublishNamespaceDone;
86
+ readonly 10: typeof Unsubscribe;
87
+ readonly 11: typeof PublishDone;
88
+ };
89
+ declare const MessagesV17: {
90
+ readonly [Setup.Setup.id]: typeof Setup.Setup;
91
+ readonly [SubscribeUpdate.id]: typeof SubscribeUpdate;
92
+ readonly [Subscribe.id]: typeof Subscribe;
93
+ readonly [SubscribeOk.id]: typeof SubscribeOk;
94
+ readonly [RequestError.id]: typeof RequestError;
95
+ readonly [PublishNamespace.id]: typeof PublishNamespace;
96
+ readonly [RequestOk.id]: typeof RequestOk;
97
+ readonly [TrackStatusRequest.id]: typeof TrackStatusRequest;
98
+ readonly [GoAway.id]: typeof GoAway;
99
+ readonly [Fetch.id]: typeof Fetch;
100
+ readonly [FetchOk.id]: typeof FetchOk;
101
+ readonly [SubscribeNamespaceLegacy.id]: typeof SubscribeNamespaceLegacy;
102
+ readonly [Publish.id]: typeof Publish;
103
+ readonly 11: typeof PublishDone;
104
+ };
105
+ type V14MessageType = (typeof MessagesV14)[keyof typeof MessagesV14];
106
+ type V15MessageType = (typeof MessagesV15)[keyof typeof MessagesV15];
107
+ type V16MessageType = (typeof MessagesV16)[keyof typeof MessagesV16];
108
+ type V17MessageType = (typeof MessagesV17)[keyof typeof MessagesV17];
109
+ type MessageType = V14MessageType | V15MessageType | V16MessageType | V17MessageType;
110
+ export type Message = InstanceType<MessageType>;
111
+ export declare class Stream {
112
+ #private;
113
+ stream: StreamInner;
114
+ version: IetfVersion;
115
+ constructor({ stream, maxRequestId, version, }: {
116
+ stream: StreamInner;
117
+ maxRequestId: bigint;
118
+ version?: IetfVersion;
119
+ });
120
+ /**
121
+ * Writes a control message to the control stream with proper framing.
122
+ * Format: Message Type (varint) + Message Length (u16) + Message Payload
123
+ */
124
+ write<T extends Message>(message: T): Promise<void>;
125
+ /**
126
+ * Reads a control message from the control stream.
127
+ * Returns the message type and a reader for the payload.
128
+ */
129
+ read(): Promise<Message>;
130
+ maxRequestId(max: bigint): void;
131
+ nextRequestId(): Promise<bigint | undefined>;
132
+ close(): void;
133
+ }
134
+ export {};
135
+ //# sourceMappingURL=control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/ietf/control.ts"],"names":[],"mappings":"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"}