@moqtap/codec 0.2.1 → 0.2.3

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 (576) hide show
  1. package/dist/{chunk-LH4NTURO.js → chunk-2GODRVT5.js} +699 -589
  2. package/dist/{chunk-4RIXXEII.js → chunk-2ZT6CVSE.js} +274 -242
  3. package/dist/{chunk-XUUCOLWU.cjs → chunk-4N4INRE7.cjs} +332 -321
  4. package/dist/{chunk-PJRA2TQ5.js → chunk-73MWUKSJ.js} +274 -228
  5. package/dist/{chunk-NGVE2RZT.js → chunk-77MNXX3M.js} +549 -538
  6. package/dist/{chunk-A27S7HW7.js → chunk-7L43FE6P.js} +24 -3
  7. package/dist/{chunk-RVJAGE4S.cjs → chunk-ACQ4CUJP.cjs} +297 -265
  8. package/dist/{chunk-IBVM4DMJ.cjs → chunk-BGWGVINJ.cjs} +332 -321
  9. package/dist/{chunk-KFTCU2P6.js → chunk-C6KUWLQC.js} +0 -3
  10. package/dist/{chunk-CXDHOMHG.js → chunk-CEH7ESNC.js} +549 -538
  11. package/dist/{chunk-ZBKE2QRQ.js → chunk-E6P74GDT.js} +686 -599
  12. package/dist/{chunk-FUFTMAQD.cjs → chunk-FPISPJ5N.cjs} +785 -497
  13. package/dist/{chunk-7IVGHMKJ.cjs → chunk-FZDIEHQL.cjs} +300 -124
  14. package/dist/{chunk-ZSPO2GF2.cjs → chunk-GLBQDG4L.cjs} +971 -884
  15. package/dist/chunk-HDWJ2GDE.js +24 -0
  16. package/dist/{chunk-4YJANAXU.cjs → chunk-JGG7CMSZ.cjs} +469 -434
  17. package/dist/{chunk-IV2H5CFI.cjs → chunk-JTVCOMBI.cjs} +298 -266
  18. package/dist/chunk-KNDYS3DK.cjs +24 -0
  19. package/dist/{chunk-BPNL5YFQ.cjs → chunk-KZCYQ7ED.cjs} +5 -5
  20. package/dist/{chunk-U2B3B42P.js → chunk-MC7W6PMI.js} +709 -421
  21. package/dist/{chunk-MFAP7R6L.js → chunk-MRJWLGYH.js} +1 -1
  22. package/dist/{chunk-RWQ43Z4F.cjs → chunk-MZ7VU52O.cjs} +0 -3
  23. package/dist/{chunk-TMNGRIPL.js → chunk-N2KBF5Q2.js} +285 -109
  24. package/dist/{chunk-IV2HRJVT.js → chunk-PZBPH2D7.js} +274 -242
  25. package/dist/{chunk-FWISIR26.cjs → chunk-RUPCJTC3.cjs} +24 -3
  26. package/dist/{chunk-G26SJ6XS.cjs → chunk-S74DWJE2.cjs} +1001 -925
  27. package/dist/{chunk-NUX5BHWO.js → chunk-U3IPZYPX.js} +1113 -1037
  28. package/dist/{chunk-HSVYF6XX.cjs → chunk-VJUUZ4W2.cjs} +1106 -996
  29. package/dist/{chunk-ST24APEO.js → chunk-XSNX2IUJ.js} +574 -539
  30. package/dist/{chunk-K4OLITS2.cjs → chunk-YIG2C3LF.cjs} +295 -249
  31. package/dist/{drafts/draft15/codec.d.ts → codec-B2cH-f5V.d.cts} +11 -10
  32. package/dist/codec-B5K73Bdj.d.ts +30 -0
  33. package/dist/{codec-C_HMXNK_.d.ts → codec-BFeliJFc.d.ts} +4 -10
  34. package/dist/codec-BUMjz0J4.d.cts +30 -0
  35. package/dist/{codec-D0x8-SCw.d.cts → codec-Bap882Fh.d.cts} +3 -9
  36. package/dist/codec-BdVMRMOI.d.ts +34 -0
  37. package/dist/codec-Bq-tLtfP.d.ts +30 -0
  38. package/dist/codec-BwFgpeQu.d.ts +23 -0
  39. package/dist/{codec-95k8CAu5.d.cts → codec-C4n1PS09.d.cts} +3 -9
  40. package/dist/{codec-BECYPfY8.d.ts → codec-CPlK3Pi5.d.ts} +3 -9
  41. package/dist/{drafts/draft08/codec.d.ts → codec-CPvPq0sb.d.cts} +11 -9
  42. package/dist/codec-DNUIgLqc.d.cts +23 -0
  43. package/dist/codec-DRcsBCsb.d.ts +23 -0
  44. package/dist/{codec-CAevkgf5.d.cts → codec-DY4QH364.d.cts} +4 -10
  45. package/dist/codec-DZhZSIii.d.cts +30 -0
  46. package/dist/{drafts/draft14/codec.d.ts → codec-FvGCxIhr.d.ts} +11 -10
  47. package/dist/codec-HgBgHkFI.d.cts +23 -0
  48. package/dist/codec-KXHvXZVb.d.cts +35 -0
  49. package/dist/{codec-BC5jfvMb.d.ts → codec-R8GrCPt2.d.ts} +3 -9
  50. package/dist/{codec-BsPU1vNC.d.ts → codec-SKBeHQk7.d.ts} +3 -11
  51. package/dist/draft10-session.d.cts +1 -1
  52. package/dist/draft10-session.d.ts +1 -1
  53. package/dist/draft10.cjs +4 -3
  54. package/dist/draft10.d.cts +15 -5
  55. package/dist/draft10.d.ts +15 -5
  56. package/dist/draft10.js +3 -2
  57. package/dist/draft11-session.d.cts +1 -1
  58. package/dist/draft11-session.d.ts +1 -1
  59. package/dist/draft11.cjs +4 -3
  60. package/dist/draft11.d.cts +13 -5
  61. package/dist/draft11.d.ts +13 -5
  62. package/dist/draft11.js +3 -2
  63. package/dist/draft12-session.d.cts +1 -1
  64. package/dist/draft12-session.d.ts +1 -1
  65. package/dist/draft12.cjs +4 -3
  66. package/dist/draft12.d.cts +13 -5
  67. package/dist/draft12.d.ts +13 -5
  68. package/dist/draft12.js +3 -2
  69. package/dist/draft13-session.d.cts +1 -1
  70. package/dist/draft13-session.d.ts +1 -1
  71. package/dist/draft13.cjs +4 -3
  72. package/dist/draft13.d.cts +13 -5
  73. package/dist/draft13.d.ts +13 -5
  74. package/dist/draft13.js +3 -2
  75. package/dist/draft14-session.d.cts +1 -1
  76. package/dist/draft14-session.d.ts +1 -1
  77. package/dist/draft14.cjs +4 -3
  78. package/dist/draft14.d.cts +59 -5
  79. package/dist/draft14.d.ts +59 -5
  80. package/dist/draft14.js +3 -2
  81. package/dist/draft15-session.d.cts +1 -1
  82. package/dist/draft15-session.d.ts +1 -1
  83. package/dist/draft15.cjs +4 -3
  84. package/dist/draft15.d.cts +48 -5
  85. package/dist/draft15.d.ts +48 -5
  86. package/dist/draft15.js +3 -2
  87. package/dist/draft16-session.d.cts +1 -1
  88. package/dist/draft16-session.d.ts +1 -1
  89. package/dist/draft16.cjs +4 -3
  90. package/dist/draft16.d.cts +37 -5
  91. package/dist/draft16.d.ts +37 -5
  92. package/dist/draft16.js +3 -2
  93. package/dist/draft17-session.d.cts +1 -1
  94. package/dist/draft17-session.d.ts +1 -1
  95. package/dist/draft17.cjs +4 -3
  96. package/dist/draft17.d.cts +16 -5
  97. package/dist/draft17.d.ts +16 -5
  98. package/dist/draft17.js +3 -2
  99. package/dist/draft7-session.cjs +3 -3
  100. package/dist/draft7-session.js +2 -2
  101. package/dist/draft7.cjs +18 -6
  102. package/dist/draft7.d.cts +84 -8
  103. package/dist/draft7.d.ts +84 -8
  104. package/dist/draft7.js +15 -3
  105. package/dist/draft8-session.d.cts +1 -1
  106. package/dist/draft8-session.d.ts +1 -1
  107. package/dist/draft8.cjs +4 -3
  108. package/dist/draft8.d.cts +15 -5
  109. package/dist/draft8.d.ts +15 -5
  110. package/dist/draft8.js +3 -2
  111. package/dist/draft9-session.d.cts +1 -1
  112. package/dist/draft9-session.d.ts +1 -1
  113. package/dist/draft9.cjs +4 -3
  114. package/dist/draft9.d.cts +15 -5
  115. package/dist/draft9.d.ts +15 -5
  116. package/dist/draft9.js +3 -2
  117. package/dist/index.cjs +25 -24
  118. package/dist/index.d.cts +20 -20
  119. package/dist/index.d.ts +38 -46
  120. package/dist/index.js +111 -93
  121. package/dist/session.cjs +3 -3
  122. package/dist/session.d.ts +8 -4
  123. package/dist/session.js +26 -32
  124. package/dist/{types-ERexTpT8.d.cts → types-8gUGeMgs.d.cts} +4 -1
  125. package/dist/{types-ERexTpT8.d.ts → types-8gUGeMgs.d.ts} +4 -1
  126. package/dist/{types-Cw4WE9dh.d.ts → types-B0FT5Qs2.d.cts} +9 -1
  127. package/dist/{types-Cw4WE9dh.d.cts → types-B0FT5Qs2.d.ts} +9 -1
  128. package/dist/{types-DqCDFqgB.d.cts → types-B9A2g05r.d.cts} +4 -1
  129. package/dist/{types-DqCDFqgB.d.ts → types-B9A2g05r.d.ts} +4 -1
  130. package/dist/{types-Bg6QYNVt.d.cts → types-BeAVNU-F.d.cts} +7 -2
  131. package/dist/{types-Bg6QYNVt.d.ts → types-BeAVNU-F.d.ts} +7 -2
  132. package/dist/{types-C_1HrqBl.d.ts → types-CDa7F5ct.d.cts} +7 -2
  133. package/dist/{types-C_1HrqBl.d.cts → types-CDa7F5ct.d.ts} +7 -2
  134. package/dist/{types-r-CasCf1.d.cts → types-D1dI_oTX.d.cts} +8 -1
  135. package/dist/{types-r-CasCf1.d.ts → types-D1dI_oTX.d.ts} +8 -1
  136. package/dist/{types-BTFeKYCb.d.ts → types-DKpsfD3i.d.cts} +19 -4
  137. package/dist/{types-BTFeKYCb.d.cts → types-DKpsfD3i.d.ts} +19 -4
  138. package/dist/{types-4VxSL2Ho.d.ts → types-DxSFvL2b.d.cts} +7 -1
  139. package/dist/{types-4VxSL2Ho.d.cts → types-DxSFvL2b.d.ts} +7 -1
  140. package/dist/{types-B2afJZM-.d.ts → types-Pme7sua0.d.cts} +4 -1
  141. package/dist/{types-B2afJZM-.d.cts → types-Pme7sua0.d.ts} +4 -1
  142. package/dist/{types-D5gNQiDj.d.ts → types-gQsr0AAA.d.cts} +9 -1
  143. package/dist/{types-D5gNQiDj.d.cts → types-gQsr0AAA.d.ts} +9 -1
  144. package/package.json +2 -2
  145. package/src/core/buffer-reader.ts +130 -114
  146. package/src/core/buffer-writer.ts +100 -91
  147. package/src/core/hex.ts +7 -3
  148. package/src/drafts/draft07/codec.ts +14 -9
  149. package/src/drafts/draft07/data-streams.ts +240 -240
  150. package/src/drafts/draft07/varint.ts +51 -23
  151. package/src/drafts/draft08/codec.ts +19 -10
  152. package/src/drafts/draft08/data-streams.ts +359 -359
  153. package/src/drafts/draft09/codec.ts +19 -10
  154. package/src/drafts/draft09/data-streams.ts +332 -332
  155. package/src/drafts/draft10/codec.ts +19 -10
  156. package/src/drafts/draft10/data-streams.ts +332 -332
  157. package/src/drafts/draft11/codec.ts +33 -14
  158. package/src/drafts/draft11/data-streams.ts +269 -269
  159. package/src/drafts/draft12/codec.ts +27 -31
  160. package/src/drafts/draft12/data-streams.ts +275 -275
  161. package/src/drafts/draft13/codec.ts +27 -31
  162. package/src/drafts/draft13/data-streams.ts +275 -275
  163. package/src/drafts/draft14/codec.ts +19 -10
  164. package/src/drafts/draft14/data-streams.ts +813 -798
  165. package/src/drafts/draft15/codec.ts +21 -12
  166. package/src/drafts/draft15/data-streams.ts +794 -778
  167. package/src/drafts/draft16/codec.ts +21 -12
  168. package/src/drafts/draft16/data-streams.ts +789 -773
  169. package/src/drafts/draft17/codec.ts +21 -12
  170. package/src/drafts/draft17/data-streams.ts +758 -742
  171. package/dist/codec-AFuOxfsO.d.ts +0 -60
  172. package/dist/codec-B-UJ5Iow.d.cts +0 -75
  173. package/dist/codec-BvpuF-6u.d.cts +0 -39
  174. package/dist/codec-C8jZI5Cx.d.cts +0 -39
  175. package/dist/codec-CSUqCrRs.d.ts +0 -39
  176. package/dist/codec-CpuvYTSV.d.cts +0 -86
  177. package/dist/codec-D7ARhpG1.d.ts +0 -75
  178. package/dist/codec-DNAUGshO.d.cts +0 -60
  179. package/dist/codec-DPx_QNn0.d.ts +0 -31
  180. package/dist/codec-DRhCx_hw.d.ts +0 -86
  181. package/dist/codec-Db7YPe3l.d.ts +0 -31
  182. package/dist/codec-axkJpb7D.d.cts +0 -31
  183. package/dist/codec-ujAbFaep.d.cts +0 -31
  184. package/dist/core/buffer-reader.d.ts +0 -15
  185. package/dist/core/buffer-reader.d.ts.map +0 -1
  186. package/dist/core/buffer-reader.js +0 -98
  187. package/dist/core/buffer-reader.js.map +0 -1
  188. package/dist/core/buffer-writer.d.ts +0 -16
  189. package/dist/core/buffer-writer.d.ts.map +0 -1
  190. package/dist/core/buffer-writer.js +0 -86
  191. package/dist/core/buffer-writer.js.map +0 -1
  192. package/dist/core/errors.d.ts +0 -2
  193. package/dist/core/errors.d.ts.map +0 -1
  194. package/dist/core/errors.js +0 -2
  195. package/dist/core/errors.js.map +0 -1
  196. package/dist/core/hex.d.ts +0 -5
  197. package/dist/core/hex.d.ts.map +0 -1
  198. package/dist/core/hex.js +0 -17
  199. package/dist/core/hex.js.map +0 -1
  200. package/dist/core/session-types.d.ts +0 -99
  201. package/dist/core/session-types.d.ts.map +0 -1
  202. package/dist/core/session-types.js +0 -2
  203. package/dist/core/session-types.js.map +0 -1
  204. package/dist/core/types.d.ts +0 -235
  205. package/dist/core/types.d.ts.map +0 -1
  206. package/dist/core/types.js +0 -11
  207. package/dist/core/types.js.map +0 -1
  208. package/dist/drafts/draft07/announce-fsm.d.ts +0 -2
  209. package/dist/drafts/draft07/announce-fsm.d.ts.map +0 -1
  210. package/dist/drafts/draft07/announce-fsm.js +0 -2
  211. package/dist/drafts/draft07/announce-fsm.js.map +0 -1
  212. package/dist/drafts/draft07/codec.d.ts +0 -17
  213. package/dist/drafts/draft07/codec.d.ts.map +0 -1
  214. package/dist/drafts/draft07/codec.js +0 -722
  215. package/dist/drafts/draft07/codec.js.map +0 -1
  216. package/dist/drafts/draft07/data-streams.d.ts +0 -9
  217. package/dist/drafts/draft07/data-streams.d.ts.map +0 -1
  218. package/dist/drafts/draft07/data-streams.js +0 -228
  219. package/dist/drafts/draft07/data-streams.js.map +0 -1
  220. package/dist/drafts/draft07/index.d.ts +0 -14
  221. package/dist/drafts/draft07/index.d.ts.map +0 -1
  222. package/dist/drafts/draft07/index.js +0 -18
  223. package/dist/drafts/draft07/index.js.map +0 -1
  224. package/dist/drafts/draft07/messages.d.ts +0 -32
  225. package/dist/drafts/draft07/messages.d.ts.map +0 -1
  226. package/dist/drafts/draft07/messages.js +0 -42
  227. package/dist/drafts/draft07/messages.js.map +0 -1
  228. package/dist/drafts/draft07/parameters.d.ts +0 -4
  229. package/dist/drafts/draft07/parameters.d.ts.map +0 -1
  230. package/dist/drafts/draft07/parameters.js +0 -10
  231. package/dist/drafts/draft07/parameters.js.map +0 -1
  232. package/dist/drafts/draft07/rules.d.ts +0 -8
  233. package/dist/drafts/draft07/rules.d.ts.map +0 -1
  234. package/dist/drafts/draft07/rules.js +0 -95
  235. package/dist/drafts/draft07/rules.js.map +0 -1
  236. package/dist/drafts/draft07/session-fsm.d.ts +0 -38
  237. package/dist/drafts/draft07/session-fsm.d.ts.map +0 -1
  238. package/dist/drafts/draft07/session-fsm.js +0 -354
  239. package/dist/drafts/draft07/session-fsm.js.map +0 -1
  240. package/dist/drafts/draft07/session.d.ts +0 -4
  241. package/dist/drafts/draft07/session.d.ts.map +0 -1
  242. package/dist/drafts/draft07/session.js +0 -5
  243. package/dist/drafts/draft07/session.js.map +0 -1
  244. package/dist/drafts/draft07/subscription-fsm.d.ts +0 -2
  245. package/dist/drafts/draft07/subscription-fsm.d.ts.map +0 -1
  246. package/dist/drafts/draft07/subscription-fsm.js +0 -2
  247. package/dist/drafts/draft07/subscription-fsm.js.map +0 -1
  248. package/dist/drafts/draft07/types.d.ts +0 -61
  249. package/dist/drafts/draft07/types.d.ts.map +0 -1
  250. package/dist/drafts/draft07/types.js +0 -4
  251. package/dist/drafts/draft07/types.js.map +0 -1
  252. package/dist/drafts/draft07/varint.d.ts +0 -4
  253. package/dist/drafts/draft07/varint.d.ts.map +0 -1
  254. package/dist/drafts/draft07/varint.js +0 -22
  255. package/dist/drafts/draft07/varint.js.map +0 -1
  256. package/dist/drafts/draft08/codec.d.ts.map +0 -1
  257. package/dist/drafts/draft08/codec.js +0 -729
  258. package/dist/drafts/draft08/codec.js.map +0 -1
  259. package/dist/drafts/draft08/data-streams.d.ts +0 -12
  260. package/dist/drafts/draft08/data-streams.d.ts.map +0 -1
  261. package/dist/drafts/draft08/data-streams.js +0 -345
  262. package/dist/drafts/draft08/data-streams.js.map +0 -1
  263. package/dist/drafts/draft08/index.d.ts +0 -9
  264. package/dist/drafts/draft08/index.d.ts.map +0 -1
  265. package/dist/drafts/draft08/index.js +0 -7
  266. package/dist/drafts/draft08/index.js.map +0 -1
  267. package/dist/drafts/draft08/messages.d.ts +0 -34
  268. package/dist/drafts/draft08/messages.d.ts.map +0 -1
  269. package/dist/drafts/draft08/messages.js +0 -66
  270. package/dist/drafts/draft08/messages.js.map +0 -1
  271. package/dist/drafts/draft08/rules.d.ts +0 -8
  272. package/dist/drafts/draft08/rules.d.ts.map +0 -1
  273. package/dist/drafts/draft08/rules.js +0 -83
  274. package/dist/drafts/draft08/rules.js.map +0 -1
  275. package/dist/drafts/draft08/session-fsm.d.ts +0 -47
  276. package/dist/drafts/draft08/session-fsm.d.ts.map +0 -1
  277. package/dist/drafts/draft08/session-fsm.js +0 -483
  278. package/dist/drafts/draft08/session-fsm.js.map +0 -1
  279. package/dist/drafts/draft08/session.d.ts +0 -5
  280. package/dist/drafts/draft08/session.d.ts.map +0 -1
  281. package/dist/drafts/draft08/session.js +0 -5
  282. package/dist/drafts/draft08/session.js.map +0 -1
  283. package/dist/drafts/draft08/types.d.ts +0 -268
  284. package/dist/drafts/draft08/types.d.ts.map +0 -1
  285. package/dist/drafts/draft08/types.js +0 -4
  286. package/dist/drafts/draft08/types.js.map +0 -1
  287. package/dist/drafts/draft09/codec.d.ts +0 -21
  288. package/dist/drafts/draft09/codec.d.ts.map +0 -1
  289. package/dist/drafts/draft09/codec.js +0 -721
  290. package/dist/drafts/draft09/codec.js.map +0 -1
  291. package/dist/drafts/draft09/data-streams.d.ts +0 -12
  292. package/dist/drafts/draft09/data-streams.d.ts.map +0 -1
  293. package/dist/drafts/draft09/data-streams.js +0 -307
  294. package/dist/drafts/draft09/data-streams.js.map +0 -1
  295. package/dist/drafts/draft09/index.d.ts +0 -9
  296. package/dist/drafts/draft09/index.d.ts.map +0 -1
  297. package/dist/drafts/draft09/index.js +0 -7
  298. package/dist/drafts/draft09/index.js.map +0 -1
  299. package/dist/drafts/draft09/messages.d.ts +0 -34
  300. package/dist/drafts/draft09/messages.d.ts.map +0 -1
  301. package/dist/drafts/draft09/messages.js +0 -66
  302. package/dist/drafts/draft09/messages.js.map +0 -1
  303. package/dist/drafts/draft09/rules.d.ts +0 -8
  304. package/dist/drafts/draft09/rules.d.ts.map +0 -1
  305. package/dist/drafts/draft09/rules.js +0 -83
  306. package/dist/drafts/draft09/rules.js.map +0 -1
  307. package/dist/drafts/draft09/session-fsm.d.ts +0 -47
  308. package/dist/drafts/draft09/session-fsm.d.ts.map +0 -1
  309. package/dist/drafts/draft09/session-fsm.js +0 -483
  310. package/dist/drafts/draft09/session-fsm.js.map +0 -1
  311. package/dist/drafts/draft09/session.d.ts +0 -5
  312. package/dist/drafts/draft09/session.d.ts.map +0 -1
  313. package/dist/drafts/draft09/session.js +0 -5
  314. package/dist/drafts/draft09/session.js.map +0 -1
  315. package/dist/drafts/draft09/types.d.ts +0 -268
  316. package/dist/drafts/draft09/types.d.ts.map +0 -1
  317. package/dist/drafts/draft09/types.js +0 -4
  318. package/dist/drafts/draft09/types.js.map +0 -1
  319. package/dist/drafts/draft10/codec.d.ts +0 -21
  320. package/dist/drafts/draft10/codec.d.ts.map +0 -1
  321. package/dist/drafts/draft10/codec.js +0 -721
  322. package/dist/drafts/draft10/codec.js.map +0 -1
  323. package/dist/drafts/draft10/data-streams.d.ts +0 -12
  324. package/dist/drafts/draft10/data-streams.d.ts.map +0 -1
  325. package/dist/drafts/draft10/data-streams.js +0 -307
  326. package/dist/drafts/draft10/data-streams.js.map +0 -1
  327. package/dist/drafts/draft10/index.d.ts +0 -9
  328. package/dist/drafts/draft10/index.d.ts.map +0 -1
  329. package/dist/drafts/draft10/index.js +0 -7
  330. package/dist/drafts/draft10/index.js.map +0 -1
  331. package/dist/drafts/draft10/messages.d.ts +0 -34
  332. package/dist/drafts/draft10/messages.d.ts.map +0 -1
  333. package/dist/drafts/draft10/messages.js +0 -66
  334. package/dist/drafts/draft10/messages.js.map +0 -1
  335. package/dist/drafts/draft10/rules.d.ts +0 -8
  336. package/dist/drafts/draft10/rules.d.ts.map +0 -1
  337. package/dist/drafts/draft10/rules.js +0 -83
  338. package/dist/drafts/draft10/rules.js.map +0 -1
  339. package/dist/drafts/draft10/session-fsm.d.ts +0 -47
  340. package/dist/drafts/draft10/session-fsm.d.ts.map +0 -1
  341. package/dist/drafts/draft10/session-fsm.js +0 -483
  342. package/dist/drafts/draft10/session-fsm.js.map +0 -1
  343. package/dist/drafts/draft10/session.d.ts +0 -5
  344. package/dist/drafts/draft10/session.d.ts.map +0 -1
  345. package/dist/drafts/draft10/session.js +0 -5
  346. package/dist/drafts/draft10/session.js.map +0 -1
  347. package/dist/drafts/draft10/types.d.ts +0 -268
  348. package/dist/drafts/draft10/types.d.ts.map +0 -1
  349. package/dist/drafts/draft10/types.js +0 -4
  350. package/dist/drafts/draft10/types.js.map +0 -1
  351. package/dist/drafts/draft11/codec.d.ts +0 -25
  352. package/dist/drafts/draft11/codec.d.ts.map +0 -1
  353. package/dist/drafts/draft11/codec.js +0 -775
  354. package/dist/drafts/draft11/codec.js.map +0 -1
  355. package/dist/drafts/draft11/data-streams.d.ts +0 -10
  356. package/dist/drafts/draft11/data-streams.d.ts.map +0 -1
  357. package/dist/drafts/draft11/data-streams.js +0 -253
  358. package/dist/drafts/draft11/data-streams.js.map +0 -1
  359. package/dist/drafts/draft11/index.d.ts +0 -9
  360. package/dist/drafts/draft11/index.d.ts.map +0 -1
  361. package/dist/drafts/draft11/index.js +0 -7
  362. package/dist/drafts/draft11/index.js.map +0 -1
  363. package/dist/drafts/draft11/messages.d.ts +0 -33
  364. package/dist/drafts/draft11/messages.d.ts.map +0 -1
  365. package/dist/drafts/draft11/messages.js +0 -65
  366. package/dist/drafts/draft11/messages.js.map +0 -1
  367. package/dist/drafts/draft11/rules.d.ts +0 -8
  368. package/dist/drafts/draft11/rules.d.ts.map +0 -1
  369. package/dist/drafts/draft11/rules.js +0 -88
  370. package/dist/drafts/draft11/rules.js.map +0 -1
  371. package/dist/drafts/draft11/session-fsm.d.ts +0 -52
  372. package/dist/drafts/draft11/session-fsm.d.ts.map +0 -1
  373. package/dist/drafts/draft11/session-fsm.js +0 -530
  374. package/dist/drafts/draft11/session-fsm.js.map +0 -1
  375. package/dist/drafts/draft11/session.d.ts +0 -5
  376. package/dist/drafts/draft11/session.d.ts.map +0 -1
  377. package/dist/drafts/draft11/session.js +0 -5
  378. package/dist/drafts/draft11/session.js.map +0 -1
  379. package/dist/drafts/draft11/types.d.ts +0 -266
  380. package/dist/drafts/draft11/types.d.ts.map +0 -1
  381. package/dist/drafts/draft11/types.js +0 -4
  382. package/dist/drafts/draft11/types.js.map +0 -1
  383. package/dist/drafts/draft12/codec.d.ts +0 -27
  384. package/dist/drafts/draft12/codec.d.ts.map +0 -1
  385. package/dist/drafts/draft12/codec.js +0 -918
  386. package/dist/drafts/draft12/codec.js.map +0 -1
  387. package/dist/drafts/draft12/data-streams.d.ts +0 -10
  388. package/dist/drafts/draft12/data-streams.d.ts.map +0 -1
  389. package/dist/drafts/draft12/data-streams.js +0 -254
  390. package/dist/drafts/draft12/data-streams.js.map +0 -1
  391. package/dist/drafts/draft12/index.d.ts +0 -9
  392. package/dist/drafts/draft12/index.d.ts.map +0 -1
  393. package/dist/drafts/draft12/index.js +0 -7
  394. package/dist/drafts/draft12/index.js.map +0 -1
  395. package/dist/drafts/draft12/messages.d.ts +0 -37
  396. package/dist/drafts/draft12/messages.d.ts.map +0 -1
  397. package/dist/drafts/draft12/messages.js +0 -77
  398. package/dist/drafts/draft12/messages.js.map +0 -1
  399. package/dist/drafts/draft12/rules.d.ts +0 -8
  400. package/dist/drafts/draft12/rules.d.ts.map +0 -1
  401. package/dist/drafts/draft12/rules.js +0 -94
  402. package/dist/drafts/draft12/rules.js.map +0 -1
  403. package/dist/drafts/draft12/session-fsm.d.ts +0 -55
  404. package/dist/drafts/draft12/session-fsm.d.ts.map +0 -1
  405. package/dist/drafts/draft12/session-fsm.js +0 -569
  406. package/dist/drafts/draft12/session-fsm.js.map +0 -1
  407. package/dist/drafts/draft12/session.d.ts +0 -5
  408. package/dist/drafts/draft12/session.d.ts.map +0 -1
  409. package/dist/drafts/draft12/session.js +0 -5
  410. package/dist/drafts/draft12/session.js.map +0 -1
  411. package/dist/drafts/draft12/types.d.ts +0 -294
  412. package/dist/drafts/draft12/types.d.ts.map +0 -1
  413. package/dist/drafts/draft12/types.js +0 -4
  414. package/dist/drafts/draft12/types.js.map +0 -1
  415. package/dist/drafts/draft13/codec.d.ts +0 -27
  416. package/dist/drafts/draft13/codec.d.ts.map +0 -1
  417. package/dist/drafts/draft13/codec.js +0 -1000
  418. package/dist/drafts/draft13/codec.js.map +0 -1
  419. package/dist/drafts/draft13/data-streams.d.ts +0 -10
  420. package/dist/drafts/draft13/data-streams.d.ts.map +0 -1
  421. package/dist/drafts/draft13/data-streams.js +0 -254
  422. package/dist/drafts/draft13/data-streams.js.map +0 -1
  423. package/dist/drafts/draft13/index.d.ts +0 -9
  424. package/dist/drafts/draft13/index.d.ts.map +0 -1
  425. package/dist/drafts/draft13/index.js +0 -7
  426. package/dist/drafts/draft13/index.js.map +0 -1
  427. package/dist/drafts/draft13/messages.d.ts +0 -38
  428. package/dist/drafts/draft13/messages.d.ts.map +0 -1
  429. package/dist/drafts/draft13/messages.js +0 -79
  430. package/dist/drafts/draft13/messages.js.map +0 -1
  431. package/dist/drafts/draft13/rules.d.ts +0 -8
  432. package/dist/drafts/draft13/rules.d.ts.map +0 -1
  433. package/dist/drafts/draft13/rules.js +0 -96
  434. package/dist/drafts/draft13/rules.js.map +0 -1
  435. package/dist/drafts/draft13/session-fsm.d.ts +0 -56
  436. package/dist/drafts/draft13/session-fsm.d.ts.map +0 -1
  437. package/dist/drafts/draft13/session-fsm.js +0 -581
  438. package/dist/drafts/draft13/session-fsm.js.map +0 -1
  439. package/dist/drafts/draft13/session.d.ts +0 -5
  440. package/dist/drafts/draft13/session.d.ts.map +0 -1
  441. package/dist/drafts/draft13/session.js +0 -5
  442. package/dist/drafts/draft13/session.js.map +0 -1
  443. package/dist/drafts/draft13/types.d.ts +0 -310
  444. package/dist/drafts/draft13/types.d.ts.map +0 -1
  445. package/dist/drafts/draft13/types.js +0 -4
  446. package/dist/drafts/draft13/types.js.map +0 -1
  447. package/dist/drafts/draft14/codec.d.ts.map +0 -1
  448. package/dist/drafts/draft14/codec.js +0 -752
  449. package/dist/drafts/draft14/codec.js.map +0 -1
  450. package/dist/drafts/draft14/data-streams.d.ts +0 -56
  451. package/dist/drafts/draft14/data-streams.d.ts.map +0 -1
  452. package/dist/drafts/draft14/data-streams.js +0 -729
  453. package/dist/drafts/draft14/data-streams.js.map +0 -1
  454. package/dist/drafts/draft14/index.d.ts +0 -9
  455. package/dist/drafts/draft14/index.d.ts.map +0 -1
  456. package/dist/drafts/draft14/index.js +0 -7
  457. package/dist/drafts/draft14/index.js.map +0 -1
  458. package/dist/drafts/draft14/messages.d.ts +0 -36
  459. package/dist/drafts/draft14/messages.d.ts.map +0 -1
  460. package/dist/drafts/draft14/messages.js +0 -71
  461. package/dist/drafts/draft14/messages.js.map +0 -1
  462. package/dist/drafts/draft14/rules.d.ts +0 -8
  463. package/dist/drafts/draft14/rules.d.ts.map +0 -1
  464. package/dist/drafts/draft14/rules.js +0 -101
  465. package/dist/drafts/draft14/rules.js.map +0 -1
  466. package/dist/drafts/draft14/session-fsm.d.ts +0 -58
  467. package/dist/drafts/draft14/session-fsm.d.ts.map +0 -1
  468. package/dist/drafts/draft14/session-fsm.js +0 -648
  469. package/dist/drafts/draft14/session-fsm.js.map +0 -1
  470. package/dist/drafts/draft14/session.d.ts +0 -5
  471. package/dist/drafts/draft14/session.d.ts.map +0 -1
  472. package/dist/drafts/draft14/session.js +0 -5
  473. package/dist/drafts/draft14/session.js.map +0 -1
  474. package/dist/drafts/draft14/types.d.ts +0 -263
  475. package/dist/drafts/draft14/types.d.ts.map +0 -1
  476. package/dist/drafts/draft14/types.js +0 -4
  477. package/dist/drafts/draft14/types.js.map +0 -1
  478. package/dist/drafts/draft15/codec.d.ts.map +0 -1
  479. package/dist/drafts/draft15/codec.js +0 -742
  480. package/dist/drafts/draft15/codec.js.map +0 -1
  481. package/dist/drafts/draft15/data-streams.d.ts +0 -45
  482. package/dist/drafts/draft15/data-streams.d.ts.map +0 -1
  483. package/dist/drafts/draft15/data-streams.js +0 -675
  484. package/dist/drafts/draft15/data-streams.js.map +0 -1
  485. package/dist/drafts/draft15/index.d.ts +0 -9
  486. package/dist/drafts/draft15/index.d.ts.map +0 -1
  487. package/dist/drafts/draft15/index.js +0 -7
  488. package/dist/drafts/draft15/index.js.map +0 -1
  489. package/dist/drafts/draft15/messages.d.ts +0 -31
  490. package/dist/drafts/draft15/messages.d.ts.map +0 -1
  491. package/dist/drafts/draft15/messages.js +0 -59
  492. package/dist/drafts/draft15/messages.js.map +0 -1
  493. package/dist/drafts/draft15/rules.d.ts +0 -8
  494. package/dist/drafts/draft15/rules.d.ts.map +0 -1
  495. package/dist/drafts/draft15/rules.js +0 -83
  496. package/dist/drafts/draft15/rules.js.map +0 -1
  497. package/dist/drafts/draft15/session-fsm.d.ts +0 -48
  498. package/dist/drafts/draft15/session-fsm.d.ts.map +0 -1
  499. package/dist/drafts/draft15/session-fsm.js +0 -479
  500. package/dist/drafts/draft15/session-fsm.js.map +0 -1
  501. package/dist/drafts/draft15/session.d.ts +0 -5
  502. package/dist/drafts/draft15/session.d.ts.map +0 -1
  503. package/dist/drafts/draft15/session.js +0 -5
  504. package/dist/drafts/draft15/session.js.map +0 -1
  505. package/dist/drafts/draft15/types.d.ts +0 -232
  506. package/dist/drafts/draft15/types.d.ts.map +0 -1
  507. package/dist/drafts/draft15/types.js +0 -4
  508. package/dist/drafts/draft15/types.js.map +0 -1
  509. package/dist/drafts/draft16/codec.d.ts +0 -29
  510. package/dist/drafts/draft16/codec.d.ts.map +0 -1
  511. package/dist/drafts/draft16/codec.js +0 -747
  512. package/dist/drafts/draft16/codec.js.map +0 -1
  513. package/dist/drafts/draft16/data-streams.d.ts +0 -34
  514. package/dist/drafts/draft16/data-streams.d.ts.map +0 -1
  515. package/dist/drafts/draft16/data-streams.js +0 -667
  516. package/dist/drafts/draft16/data-streams.js.map +0 -1
  517. package/dist/drafts/draft16/index.d.ts +0 -9
  518. package/dist/drafts/draft16/index.d.ts.map +0 -1
  519. package/dist/drafts/draft16/index.js +0 -7
  520. package/dist/drafts/draft16/index.js.map +0 -1
  521. package/dist/drafts/draft16/messages.d.ts +0 -32
  522. package/dist/drafts/draft16/messages.d.ts.map +0 -1
  523. package/dist/drafts/draft16/messages.js +0 -62
  524. package/dist/drafts/draft16/messages.js.map +0 -1
  525. package/dist/drafts/draft16/rules.d.ts +0 -8
  526. package/dist/drafts/draft16/rules.d.ts.map +0 -1
  527. package/dist/drafts/draft16/rules.js +0 -84
  528. package/dist/drafts/draft16/rules.js.map +0 -1
  529. package/dist/drafts/draft16/session-fsm.d.ts +0 -48
  530. package/dist/drafts/draft16/session-fsm.d.ts.map +0 -1
  531. package/dist/drafts/draft16/session-fsm.js +0 -474
  532. package/dist/drafts/draft16/session-fsm.js.map +0 -1
  533. package/dist/drafts/draft16/session.d.ts +0 -5
  534. package/dist/drafts/draft16/session.d.ts.map +0 -1
  535. package/dist/drafts/draft16/session.js +0 -5
  536. package/dist/drafts/draft16/session.js.map +0 -1
  537. package/dist/drafts/draft16/types.d.ts +0 -238
  538. package/dist/drafts/draft16/types.d.ts.map +0 -1
  539. package/dist/drafts/draft16/types.js +0 -4
  540. package/dist/drafts/draft16/types.js.map +0 -1
  541. package/dist/drafts/draft17/codec.d.ts +0 -29
  542. package/dist/drafts/draft17/codec.d.ts.map +0 -1
  543. package/dist/drafts/draft17/codec.js +0 -799
  544. package/dist/drafts/draft17/codec.js.map +0 -1
  545. package/dist/drafts/draft17/data-streams.d.ts +0 -13
  546. package/dist/drafts/draft17/data-streams.d.ts.map +0 -1
  547. package/dist/drafts/draft17/data-streams.js +0 -633
  548. package/dist/drafts/draft17/data-streams.js.map +0 -1
  549. package/dist/drafts/draft17/index.d.ts +0 -8
  550. package/dist/drafts/draft17/index.d.ts.map +0 -1
  551. package/dist/drafts/draft17/index.js +0 -6
  552. package/dist/drafts/draft17/index.js.map +0 -1
  553. package/dist/drafts/draft17/messages.d.ts +0 -25
  554. package/dist/drafts/draft17/messages.d.ts.map +0 -1
  555. package/dist/drafts/draft17/messages.js +0 -48
  556. package/dist/drafts/draft17/messages.js.map +0 -1
  557. package/dist/drafts/draft17/rules.d.ts +0 -8
  558. package/dist/drafts/draft17/rules.d.ts.map +0 -1
  559. package/dist/drafts/draft17/rules.js +0 -71
  560. package/dist/drafts/draft17/rules.js.map +0 -1
  561. package/dist/drafts/draft17/session-fsm.d.ts +0 -45
  562. package/dist/drafts/draft17/session-fsm.d.ts.map +0 -1
  563. package/dist/drafts/draft17/session-fsm.js +0 -328
  564. package/dist/drafts/draft17/session-fsm.js.map +0 -1
  565. package/dist/drafts/draft17/session.d.ts +0 -5
  566. package/dist/drafts/draft17/session.d.ts.map +0 -1
  567. package/dist/drafts/draft17/session.js +0 -6
  568. package/dist/drafts/draft17/session.js.map +0 -1
  569. package/dist/drafts/draft17/types.d.ts +0 -219
  570. package/dist/drafts/draft17/types.d.ts.map +0 -1
  571. package/dist/drafts/draft17/types.js +0 -3
  572. package/dist/drafts/draft17/types.js.map +0 -1
  573. package/dist/index.d.ts.map +0 -1
  574. package/dist/index.js.map +0 -1
  575. package/dist/session.d.ts.map +0 -1
  576. package/dist/session.js.map +0 -1
@@ -1,778 +1,794 @@
1
- import { BufferReader } from "../../core/buffer-reader.js";
2
- import { BufferWriter } from "../../core/buffer-writer.js";
3
- import type { DecodeResult } from "../../core/types.js";
4
- import { DecodeError } from "../../core/types.js";
5
- import type {
6
- DatagramObject,
7
- DataStreamEvent,
8
- Draft15DataStream,
9
- FetchObjectPayload,
10
- FetchStream,
11
- FetchStreamHeader,
12
- ObjectPayload,
13
- SubgroupStream,
14
- SubgroupStreamHeader,
15
- } from "./types.js";
16
-
17
- // ─── Data Stream Encoding/Decoding ─────────────────────────────────────────────
18
-
19
- // Draft-15 subgroup stream types use 0x10-0x1D range.
20
- // For MVP, we use 0x10 (subgroupId=0, no extensions, no endOfGroup, priority present).
21
- const _SUBGROUP_STREAM_TYPE_SIMPLE = 0x10n;
22
- // Draft-15 fetch stream type
23
- const FETCH_STREAM_TYPE = 0x05n;
24
-
25
- /**
26
- * Encode a subgroup stream header + objects.
27
- * Uses the headerType from the stream to reproduce the exact wire type byte.
28
- */
29
- export function encodeSubgroupStream(stream: SubgroupStream): Uint8Array {
30
- const w = new BufferWriter();
31
- const streamType = stream.headerType;
32
- w.writeVarInt(BigInt(streamType));
33
-
34
- const extensionsPresent = (streamType & 0x01) !== 0;
35
- const hasSubgroupField = (streamType & 0x04) !== 0;
36
- const hasPriority = streamType < 0x30;
37
-
38
- w.writeVarInt(stream.trackAlias);
39
- w.writeVarInt(stream.groupId);
40
- if (hasSubgroupField) {
41
- w.writeVarInt(stream.subgroupId);
42
- }
43
- if (hasPriority) {
44
- w.writeUint8(stream.publisherPriority);
45
- }
46
- // Objects: delta-encoded object IDs
47
- let prevObjectId = -1n;
48
- for (const obj of stream.objects) {
49
- const delta = prevObjectId < 0n ? obj.objectId : obj.objectId - prevObjectId - 1n;
50
- w.writeVarInt(delta);
51
- if (extensionsPresent) {
52
- w.writeVarInt(BigInt(obj.extensionData.length));
53
- if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
54
- }
55
- w.writeVarInt(obj.payloadLength);
56
- if (obj.payloadLength === 0) {
57
- w.writeVarInt(obj.status ?? 0n);
58
- } else {
59
- w.writeBytes(obj.payload);
60
- }
61
- prevObjectId = obj.objectId;
62
- }
63
- return w.finish();
64
- }
65
-
66
- /**
67
- * Encode a datagram object.
68
- * Uses type 0x00: Object ID present, priority present, no extensions, no EOG, payload.
69
- */
70
- export function encodeDatagram(dg: DatagramObject): Uint8Array {
71
- const w = new BufferWriter();
72
- // Determine datagram type byte from fields
73
- const dgType = dg.datagramType;
74
- w.writeVarInt(BigInt(dgType));
75
- w.writeVarInt(dg.trackAlias);
76
- w.writeVarInt(dg.groupId);
77
-
78
- // Datagram type flags:
79
- // bit 2 (0x04): object_id ABSENT when set
80
- // bit 1 (0x02): end-of-group
81
- // bit 5 (0x20): status (replaces payload)
82
- const objectIdAbsent = (dgType & 0x04) !== 0;
83
- const isStatus = (dgType & 0x20) !== 0;
84
-
85
- if (!objectIdAbsent) {
86
- w.writeVarInt(dg.objectId);
87
- }
88
- w.writeUint8(dg.publisherPriority);
89
-
90
- if (isStatus) {
91
- w.writeVarInt(dg.objectStatus ?? 0n);
92
- } else {
93
- w.writeBytes(dg.payload);
94
- }
95
- return w.finish();
96
- }
97
-
98
- /**
99
- * Encode a fetch stream header + objects.
100
- */
101
- export function encodeFetchStream(stream: FetchStream): Uint8Array {
102
- const w = new BufferWriter();
103
- w.writeVarInt(FETCH_STREAM_TYPE);
104
- w.writeVarInt(stream.requestId);
105
- for (const obj of stream.objects) {
106
- w.writeUint8(obj.serializationFlags);
107
- const flags = obj.serializationFlags;
108
- if (flags & 0x08) w.writeVarInt(obj.groupId);
109
- // subgroup encoding: bits 0-1
110
- const subgroupEncoding = flags & 0x03;
111
- if (subgroupEncoding === 0x03) w.writeVarInt(obj.subgroupId);
112
- if (flags & 0x04) w.writeVarInt(obj.objectId);
113
- if (flags & 0x10) w.writeUint8(obj.publisherPriority);
114
- if (flags & 0x20) {
115
- w.writeVarInt(BigInt(obj.extensionData.length));
116
- if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
117
- }
118
- w.writeVarInt(obj.payloadLength);
119
- if (obj.payloadLength === 0) {
120
- w.writeVarInt(obj.status ?? 0n);
121
- } else {
122
- w.writeBytes(obj.payload);
123
- }
124
- }
125
- return w.finish();
126
- }
127
-
128
- /**
129
- * Decode a subgroup data stream from raw bytes.
130
- */
131
- export function decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream> {
132
- try {
133
- const r = new BufferReader(bytes);
134
- const streamType = Number(r.readVarInt());
135
-
136
- // Valid subgroup types: 0x10-0x15, 0x18-0x1D, 0x30-0x35, 0x38-0x3D
137
- if (
138
- !((streamType >= 0x10 && streamType <= 0x1d) || (streamType >= 0x30 && streamType <= 0x3d)) ||
139
- (streamType & 0x06) === 0x06 // reserved SUBGROUP_ID_MODE (bits 2:1 = 0b11)
140
- ) {
141
- return {
142
- ok: false,
143
- error: new DecodeError(
144
- "CONSTRAINT_VIOLATION",
145
- `Expected subgroup stream type 0x10-0x15/0x18-0x1D/0x30-0x35/0x38-0x3D, got 0x${streamType.toString(16)}`,
146
- 0,
147
- ),
148
- };
149
- }
150
-
151
- // Decode type flags
152
- const extensionsPresent = (streamType & 0x01) !== 0;
153
- const hasSubgroupField = (streamType & 0x04) !== 0;
154
- const subgroupIsFirstObjId = (streamType & 0x02) !== 0 && !hasSubgroupField;
155
- const hasPriority = streamType < 0x30;
156
-
157
- const trackAlias = r.readVarInt();
158
- const groupId = r.readVarInt();
159
-
160
- let subgroupId = 0n;
161
- if (hasSubgroupField) {
162
- subgroupId = r.readVarInt();
163
- }
164
-
165
- let publisherPriority = 128; // default
166
- if (hasPriority) {
167
- publisherPriority = r.readUint8();
168
- }
169
-
170
- const objects: ObjectPayload[] = [];
171
- let prevObjectId = -1n;
172
- let firstObject = true;
173
-
174
- while (r.remaining > 0) {
175
- const byteOffset = r.offset;
176
- const delta = r.readVarInt();
177
- let objectId: bigint;
178
- if (firstObject) {
179
- objectId = delta;
180
- if (subgroupIsFirstObjId && firstObject) {
181
- subgroupId = objectId;
182
- }
183
- firstObject = false;
184
- } else {
185
- objectId = prevObjectId + 1n + delta;
186
- }
187
- let extensionData = new Uint8Array(0);
188
- if (extensionsPresent) {
189
- const extLen = Number(r.readVarInt());
190
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
191
- }
192
- const payloadLength = Number(r.readVarInt());
193
- let payload: Uint8Array;
194
- let status: bigint | undefined;
195
- let payloadByteOffset: number;
196
- if (payloadLength === 0) {
197
- // When payload_length is 0, an object status varint follows
198
- status = r.readVarInt();
199
- payloadByteOffset = r.offset;
200
- payload = new Uint8Array(0);
201
- } else {
202
- payloadByteOffset = r.offset;
203
- payload = r.readBytes(payloadLength);
204
- }
205
- const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, extensionData, payload };
206
- if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
207
- objects.push(obj);
208
- prevObjectId = objectId;
209
- }
210
-
211
- return {
212
- ok: true,
213
- value: {
214
- type: "subgroup",
215
- headerType: streamType,
216
- trackAlias,
217
- groupId,
218
- subgroupId,
219
- publisherPriority,
220
- objects,
221
- },
222
- bytesRead: r.offset,
223
- };
224
- } catch (e) {
225
- if (e instanceof DecodeError) return { ok: false, error: e };
226
- throw e;
227
- }
228
- }
229
-
230
- /**
231
- * Decode a datagram object from raw bytes.
232
- */
233
- export function decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject> {
234
- try {
235
- const r = new BufferReader(bytes);
236
- const dgType = Number(r.readVarInt());
237
-
238
- // Datagram type flags:
239
- // bit 2 (0x04): object_id ABSENT when set
240
- // bit 1 (0x02): end-of-group
241
- // bit 5 (0x20): status (replaces payload with status varint)
242
- const objectIdAbsent = (dgType & 0x04) !== 0;
243
- const endOfGroup = (dgType & 0x02) !== 0;
244
- const isStatus = (dgType & 0x20) !== 0;
245
-
246
- const trackAlias = r.readVarInt();
247
- const groupId = r.readVarInt();
248
- let objectId = 0n;
249
- if (!objectIdAbsent) {
250
- objectId = r.readVarInt();
251
- }
252
- const publisherPriority = r.readUint8();
253
-
254
- let objectStatus: bigint | undefined;
255
- let payload: Uint8Array;
256
- if (isStatus) {
257
- objectStatus = r.readVarInt();
258
- payload = new Uint8Array(0);
259
- } else {
260
- payload = r.readBytes(r.remaining);
261
- }
262
- const payloadLength = payload.byteLength;
263
-
264
- const result: DatagramObject = {
265
- type: "datagram",
266
- datagramType: dgType,
267
- trackAlias,
268
- groupId,
269
- objectId,
270
- publisherPriority,
271
- payloadLength,
272
- payload,
273
- };
274
-
275
- if (endOfGroup) (result as unknown as Record<string, unknown>).endOfGroup = true;
276
- if (objectStatus !== undefined)
277
- (result as unknown as Record<string, unknown>).objectStatus = objectStatus;
278
-
279
- return { ok: true, value: result, bytesRead: r.offset };
280
- } catch (e) {
281
- if (e instanceof DecodeError) return { ok: false, error: e };
282
- throw e;
283
- }
284
- }
285
-
286
- /**
287
- * Decode a fetch data stream from raw bytes.
288
- */
289
- export function decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream> {
290
- try {
291
- const r = new BufferReader(bytes);
292
- const streamType = r.readVarInt();
293
- if (streamType !== FETCH_STREAM_TYPE) {
294
- return {
295
- ok: false,
296
- error: new DecodeError(
297
- "CONSTRAINT_VIOLATION",
298
- `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
299
- 0,
300
- ),
301
- };
302
- }
303
- const requestId = r.readVarInt();
304
- const objects: FetchObjectPayload[] = [];
305
-
306
- let prevGroupId = 0n;
307
- let prevSubgroupId = 0n;
308
- let prevObjectId = 0n;
309
- let prevPriority = 128;
310
- let first = true;
311
-
312
- while (r.remaining > 0) {
313
- const byteOffset = r.offset;
314
- const flags = r.readUint8();
315
- const subgroupEncoding = flags & 0x03;
316
- const objectIdPresent = (flags & 0x04) !== 0;
317
- const groupIdPresent = (flags & 0x08) !== 0;
318
- const priorityPresent = (flags & 0x10) !== 0;
319
- const extensionsPresent = (flags & 0x20) !== 0;
320
-
321
- if (flags & 0xc0) {
322
- return {
323
- ok: false,
324
- error: new DecodeError(
325
- "CONSTRAINT_VIOLATION",
326
- "Reserved bits set in fetch object flags",
327
- r.offset,
328
- ),
329
- };
330
- }
331
-
332
- let groupId = prevGroupId;
333
- if (groupIdPresent) {
334
- groupId = r.readVarInt();
335
- } else if (first) {
336
- return {
337
- ok: false,
338
- error: new DecodeError(
339
- "CONSTRAINT_VIOLATION",
340
- "First fetch object must include groupId",
341
- r.offset,
342
- ),
343
- };
344
- }
345
-
346
- let subgroupId: bigint;
347
- if (subgroupEncoding === 0x00) {
348
- subgroupId = 0n;
349
- } else if (subgroupEncoding === 0x01) {
350
- if (first) {
351
- return {
352
- ok: false,
353
- error: new DecodeError(
354
- "CONSTRAINT_VIOLATION",
355
- "First fetch object cannot reference prior subgroupId",
356
- r.offset,
357
- ),
358
- };
359
- }
360
- subgroupId = prevSubgroupId;
361
- } else if (subgroupEncoding === 0x02) {
362
- if (first) {
363
- return {
364
- ok: false,
365
- error: new DecodeError(
366
- "CONSTRAINT_VIOLATION",
367
- "First fetch object cannot reference prior subgroupId",
368
- r.offset,
369
- ),
370
- };
371
- }
372
- subgroupId = prevSubgroupId + 1n;
373
- } else {
374
- subgroupId = r.readVarInt();
375
- }
376
-
377
- let objectId = prevObjectId + 1n;
378
- if (objectIdPresent) {
379
- objectId = r.readVarInt();
380
- } else if (first) {
381
- return {
382
- ok: false,
383
- error: new DecodeError(
384
- "CONSTRAINT_VIOLATION",
385
- "First fetch object must include objectId",
386
- r.offset,
387
- ),
388
- };
389
- }
390
-
391
- if (priorityPresent) {
392
- prevPriority = r.readUint8();
393
- }
394
-
395
- let extensionData = new Uint8Array(0);
396
- if (extensionsPresent) {
397
- const extLen = Number(r.readVarInt());
398
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
399
- }
400
-
401
- const payloadLength = Number(r.readVarInt());
402
- let payload: Uint8Array;
403
- let status: bigint | undefined;
404
- let payloadByteOffset: number;
405
- if (payloadLength > 0) {
406
- payloadByteOffset = r.offset;
407
- payload = r.readBytes(payloadLength);
408
- } else {
409
- status = r.readVarInt();
410
- payloadByteOffset = r.offset;
411
- payload = new Uint8Array(0);
412
- }
413
-
414
- const obj: FetchObjectPayload = {
415
- type: "object",
416
- byteOffset,
417
- payloadByteOffset,
418
- serializationFlags: flags,
419
- groupId,
420
- subgroupId,
421
- objectId,
422
- publisherPriority: prevPriority,
423
- payloadLength,
424
- extensionData,
425
- payload,
426
- };
427
- if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
428
- objects.push(obj);
429
-
430
- prevGroupId = groupId;
431
- prevSubgroupId = subgroupId;
432
- prevObjectId = objectId;
433
- first = false;
434
- }
435
-
436
- return {
437
- ok: true,
438
- value: { type: "fetch", requestId, objects },
439
- bytesRead: r.offset,
440
- };
441
- } catch (e) {
442
- if (e instanceof DecodeError) return { ok: false, error: e };
443
- throw e;
444
- }
445
- }
446
-
447
- /**
448
- * Decode a data stream, dispatching by stream type.
449
- */
450
- export function decodeDataStream(
451
- streamType: "subgroup" | "datagram" | "fetch",
452
- bytes: Uint8Array,
453
- ): DecodeResult<Draft15DataStream> {
454
- switch (streamType) {
455
- case "subgroup":
456
- return decodeSubgroupStream(bytes);
457
- case "datagram":
458
- return decodeDatagram(bytes);
459
- case "fetch":
460
- return decodeFetchStream(bytes);
461
- default: {
462
- const _exhaustive: never = streamType;
463
- throw new Error(`Unknown stream type: ${_exhaustive}`);
464
- }
465
- }
466
- }
467
-
468
- // ─── Data Stream Decoders ──────────────────────────────────────────────────────
469
-
470
- /**
471
- * Create a TransformStream that decodes a subgroup data stream.
472
- */
473
- export function createSubgroupStreamDecoder(): TransformStream<
474
- Uint8Array,
475
- SubgroupStreamHeader | ObjectPayload
476
- > {
477
- let buffer = new Uint8Array(0);
478
- let headerEmitted = false;
479
- let prevObjectId = -1n;
480
- let firstObject = true;
481
- let _subgroupIsFirstObjId = false;
482
- let _extensionsPresent = false;
483
-
484
- return new TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>({
485
- transform(chunk, controller) {
486
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
487
- newBuffer.set(buffer, 0);
488
- newBuffer.set(chunk, buffer.length);
489
- buffer = newBuffer;
490
-
491
- if (!headerEmitted) {
492
- try {
493
- const r = new BufferReader(buffer);
494
- const streamType = Number(r.readVarInt());
495
-
496
- if (
497
- !(
498
- (streamType >= 0x10 && streamType <= 0x1d) ||
499
- (streamType >= 0x30 && streamType <= 0x3d)
500
- )
501
- ) {
502
- controller.error(
503
- new DecodeError(
504
- "CONSTRAINT_VIOLATION",
505
- `Expected subgroup stream type, got 0x${streamType.toString(16)}`,
506
- 0,
507
- ),
508
- );
509
- return;
510
- }
511
-
512
- _extensionsPresent = (streamType & 0x01) !== 0;
513
- const hasSubgroupField = (streamType & 0x04) !== 0;
514
- _subgroupIsFirstObjId = (streamType & 0x02) !== 0 && !hasSubgroupField;
515
- const hasPriority = streamType < 0x30;
516
-
517
- const trackAlias = r.readVarInt();
518
- const groupId = r.readVarInt();
519
-
520
- let subgroupId = 0n;
521
- if (hasSubgroupField) {
522
- subgroupId = r.readVarInt();
523
- }
524
-
525
- let publisherPriority = 128;
526
- if (hasPriority) {
527
- publisherPriority = r.readUint8();
528
- }
529
-
530
- controller.enqueue({
531
- type: "subgroup_header",
532
- trackAlias,
533
- groupId,
534
- subgroupId,
535
- publisherPriority,
536
- });
537
- headerEmitted = true;
538
- buffer = buffer.slice(r.offset);
539
- } catch (e) {
540
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
541
- return;
542
- }
543
- controller.error(e);
544
- return;
545
- }
546
- }
547
-
548
- // Parse objects with delta-encoded IDs
549
- while (buffer.length > 0) {
550
- try {
551
- const r = new BufferReader(buffer);
552
- const byteOffset = r.offset;
553
- const delta = r.readVarInt();
554
- let objectId: bigint;
555
- if (firstObject) {
556
- objectId = delta;
557
- firstObject = false;
558
- } else {
559
- objectId = prevObjectId + 1n + delta;
560
- }
561
- let extensionData = new Uint8Array(0);
562
- if (_extensionsPresent) {
563
- const extLen = Number(r.readVarInt());
564
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
565
- }
566
- const payloadLength = Number(r.readVarInt());
567
- const payloadByteOffset = r.offset;
568
- const payload = payloadLength > 0 ? r.readBytes(payloadLength) : new Uint8Array(0);
569
- controller.enqueue({ type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, extensionData, payload });
570
- buffer = buffer.slice(r.offset);
571
- prevObjectId = objectId;
572
- } catch (e) {
573
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
574
- break;
575
- }
576
- controller.error(e);
577
- return;
578
- }
579
- }
580
- },
581
-
582
- flush(controller) {
583
- if (buffer.length > 0) {
584
- controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
585
- }
586
- },
587
- });
588
- }
589
-
590
- /**
591
- * Create a TransformStream that decodes a fetch data stream.
592
- */
593
- export function createFetchStreamDecoder(): TransformStream<
594
- Uint8Array,
595
- FetchStreamHeader | ObjectPayload
596
- > {
597
- let buffer = new Uint8Array(0);
598
- let headerEmitted = false;
599
-
600
- return new TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>({
601
- transform(chunk, controller) {
602
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
603
- newBuffer.set(buffer, 0);
604
- newBuffer.set(chunk, buffer.length);
605
- buffer = newBuffer;
606
-
607
- if (!headerEmitted) {
608
- try {
609
- const r = new BufferReader(buffer);
610
- const streamType = r.readVarInt();
611
- if (streamType !== FETCH_STREAM_TYPE) {
612
- controller.error(
613
- new DecodeError(
614
- "CONSTRAINT_VIOLATION",
615
- `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
616
- 0,
617
- ),
618
- );
619
- return;
620
- }
621
- const requestId = r.readVarInt();
622
- controller.enqueue({ type: "fetch_header", requestId });
623
- headerEmitted = true;
624
- buffer = buffer.slice(r.offset);
625
- } catch (e) {
626
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
627
- return;
628
- }
629
- controller.error(e);
630
- return;
631
- }
632
- }
633
-
634
- // Parse fetch objects with serialization flags
635
- // Simplified: just read flags + explicit fields
636
- while (buffer.length > 0) {
637
- try {
638
- const r = new BufferReader(buffer);
639
- const flags = r.readUint8();
640
- const objectIdPresent = (flags & 0x04) !== 0;
641
- const groupIdPresent = (flags & 0x08) !== 0;
642
- const priorityPresent = (flags & 0x10) !== 0;
643
- const extensionsPresent = (flags & 0x20) !== 0;
644
- const subgroupEncoding = flags & 0x03;
645
-
646
- if (groupIdPresent) r.readVarInt(); // groupId — consumed
647
- if (subgroupEncoding === 0x03) r.readVarInt(); // subgroupId — consumed
648
- let objectId = 0n;
649
- if (objectIdPresent) objectId = r.readVarInt();
650
- if (priorityPresent) r.readUint8(); // priority consumed
651
- let extensionData = new Uint8Array(0);
652
- if (extensionsPresent) {
653
- const extLen = Number(r.readVarInt());
654
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
655
- }
656
- const payloadLength = Number(r.readVarInt());
657
- const payloadByteOffset = r.offset;
658
- const payload = payloadLength > 0 ? r.readBytes(payloadLength) : new Uint8Array(0);
659
- controller.enqueue({ type: "object", objectId, payloadLength, extensionData, payload, byteOffset: 0, payloadByteOffset });
660
- buffer = buffer.slice(r.offset);
661
- } catch (e) {
662
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
663
- break;
664
- }
665
- controller.error(e);
666
- return;
667
- }
668
- }
669
- },
670
-
671
- flush(controller) {
672
- if (buffer.length > 0) {
673
- controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
674
- }
675
- },
676
- });
677
- }
678
-
679
- /**
680
- * Create a unified auto-detecting data stream decoder.
681
- */
682
- export function createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent> {
683
- let buffer = new Uint8Array(0);
684
- let inner: TransformStream<Uint8Array, DataStreamEvent> | null = null;
685
- const _innerWriter: WritableStreamDefaultWriter<Uint8Array> | null = null;
686
- const _innerReader: ReadableStreamDefaultReader<DataStreamEvent> | null = null;
687
-
688
- return new TransformStream<Uint8Array, DataStreamEvent>({
689
- transform(chunk, controller) {
690
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
691
- newBuffer.set(buffer, 0);
692
- newBuffer.set(chunk, buffer.length);
693
- buffer = newBuffer;
694
-
695
- if (inner === null) {
696
- // Need at least one byte to determine type
697
- if (buffer.length === 0) return;
698
- const firstByte = buffer[0]!;
699
-
700
- if ((firstByte >= 0x10 && firstByte <= 0x1d) || (firstByte >= 0x30 && firstByte <= 0x3d)) {
701
- // Subgroup delegate to subgroup decoder
702
- // We need to feed the full buffer including the type byte
703
- const decoder = createSubgroupStreamDecoder();
704
- inner = decoder as unknown as TransformStream<Uint8Array, DataStreamEvent>;
705
- } else if (firstByte === 0x05) {
706
- // Fetch
707
- const decoder = createFetchStreamDecoder();
708
- inner = decoder as unknown as TransformStream<Uint8Array, DataStreamEvent>;
709
- } else {
710
- controller.error(
711
- new DecodeError(
712
- "CONSTRAINT_VIOLATION",
713
- `Unknown data stream type: 0x${firstByte.toString(16)}`,
714
- 0,
715
- ),
716
- );
717
- return;
718
- }
719
-
720
- // For simplicity, process inline instead of piping
721
- // Just re-parse from buffer using the appropriate one-shot decoder
722
- }
723
-
724
- // Since inner TransformStream piping is complex, use a simpler approach:
725
- // Accumulate and attempt decode when flush is called
726
- // For the streaming case, we just buffer everything
727
- },
728
-
729
- flush(controller) {
730
- if (buffer.length === 0) return;
731
-
732
- const firstByte = buffer[0]!;
733
- let result: DecodeResult<Draft15DataStream>;
734
-
735
- if ((firstByte >= 0x10 && firstByte <= 0x1d) || (firstByte >= 0x30 && firstByte <= 0x3d)) {
736
- result = decodeSubgroupStream(buffer);
737
- } else if (firstByte === 0x05) {
738
- result = decodeFetchStream(buffer);
739
- } else {
740
- controller.error(
741
- new DecodeError(
742
- "CONSTRAINT_VIOLATION",
743
- `Unknown data stream type: 0x${firstByte.toString(16)}`,
744
- 0,
745
- ),
746
- );
747
- return;
748
- }
749
-
750
- if (!result.ok) {
751
- controller.error(result.error);
752
- return;
753
- }
754
-
755
- const stream = result.value;
756
- if (stream.type === "subgroup") {
757
- controller.enqueue({
758
- type: "subgroup_header",
759
- trackAlias: stream.trackAlias,
760
- groupId: stream.groupId,
761
- subgroupId: stream.subgroupId,
762
- publisherPriority: stream.publisherPriority,
763
- });
764
- for (const obj of stream.objects) {
765
- controller.enqueue(obj);
766
- }
767
- } else if (stream.type === "fetch") {
768
- controller.enqueue({
769
- type: "fetch_header",
770
- requestId: stream.requestId,
771
- });
772
- for (const obj of stream.objects) {
773
- controller.enqueue(obj);
774
- }
775
- }
776
- },
777
- });
778
- }
1
+ import { BufferReader } from "../../core/buffer-reader.js";
2
+ import { BufferWriter } from "../../core/buffer-writer.js";
3
+ import type { DecodeResult } from "../../core/types.js";
4
+ import { DecodeError } from "../../core/types.js";
5
+ import type {
6
+ DatagramObject,
7
+ DataStreamEvent,
8
+ Draft15DataStream,
9
+ FetchObjectPayload,
10
+ FetchStream,
11
+ FetchStreamHeader,
12
+ ObjectPayload,
13
+ SubgroupStream,
14
+ SubgroupStreamHeader,
15
+ } from "./types.js";
16
+
17
+ // ─── Data Stream Encoding/Decoding ─────────────────────────────────────────────
18
+
19
+ // Draft-15 subgroup stream types use 0x10-0x1D range.
20
+ // For MVP, we use 0x10 (subgroupId=0, no extensions, no endOfGroup, priority present).
21
+ const _SUBGROUP_STREAM_TYPE_SIMPLE = 0x10n;
22
+ // Draft-15 fetch stream type
23
+ const FETCH_STREAM_TYPE = 0x05n;
24
+
25
+ /**
26
+ * Encode a subgroup stream header + objects.
27
+ * Uses the headerType from the stream to reproduce the exact wire type byte.
28
+ */
29
+ export function encodeSubgroupStream(stream: SubgroupStream): Uint8Array {
30
+ const w = new BufferWriter();
31
+ const streamType = stream.headerType;
32
+ w.writeVarInt(BigInt(streamType));
33
+
34
+ const extensionsPresent = (streamType & 0x01) !== 0;
35
+ const hasSubgroupField = (streamType & 0x04) !== 0;
36
+ const hasPriority = streamType < 0x30;
37
+
38
+ w.writeVarInt(stream.trackAlias);
39
+ w.writeVarInt(stream.groupId);
40
+ if (hasSubgroupField) {
41
+ w.writeVarInt(stream.subgroupId);
42
+ }
43
+ if (hasPriority) {
44
+ w.writeUint8(stream.publisherPriority);
45
+ }
46
+ // Objects: delta-encoded object IDs
47
+ let prevObjectId = -1n;
48
+ for (const obj of stream.objects) {
49
+ const delta = prevObjectId < 0n ? obj.objectId : obj.objectId - prevObjectId - 1n;
50
+ w.writeVarInt(delta);
51
+ if (extensionsPresent) {
52
+ w.writeVarInt(BigInt(obj.extensionData.length));
53
+ if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
54
+ }
55
+ w.writeVarInt(obj.payloadLength);
56
+ if (obj.payloadLength === 0) {
57
+ w.writeVarInt(obj.status ?? 0n);
58
+ } else {
59
+ w.writeBytes(obj.payload);
60
+ }
61
+ prevObjectId = obj.objectId;
62
+ }
63
+ return w.finish();
64
+ }
65
+
66
+ /**
67
+ * Encode a datagram object.
68
+ * Uses type 0x00: Object ID present, priority present, no extensions, no EOG, payload.
69
+ */
70
+ export function encodeDatagram(dg: DatagramObject): Uint8Array {
71
+ const w = new BufferWriter();
72
+ // Determine datagram type byte from fields
73
+ const dgType = dg.datagramType;
74
+ w.writeVarInt(BigInt(dgType));
75
+ w.writeVarInt(dg.trackAlias);
76
+ w.writeVarInt(dg.groupId);
77
+
78
+ // Datagram type flags:
79
+ // bit 2 (0x04): object_id ABSENT when set
80
+ // bit 1 (0x02): end-of-group
81
+ // bit 5 (0x20): status (replaces payload)
82
+ const objectIdAbsent = (dgType & 0x04) !== 0;
83
+ const isStatus = (dgType & 0x20) !== 0;
84
+
85
+ if (!objectIdAbsent) {
86
+ w.writeVarInt(dg.objectId);
87
+ }
88
+ w.writeUint8(dg.publisherPriority);
89
+
90
+ if (isStatus) {
91
+ w.writeVarInt(dg.objectStatus ?? 0n);
92
+ } else {
93
+ w.writeBytes(dg.payload);
94
+ }
95
+ return w.finish();
96
+ }
97
+
98
+ /**
99
+ * Encode a fetch stream header + objects.
100
+ */
101
+ export function encodeFetchStream(stream: FetchStream): Uint8Array {
102
+ const w = new BufferWriter();
103
+ w.writeVarInt(FETCH_STREAM_TYPE);
104
+ w.writeVarInt(stream.requestId);
105
+ for (const obj of stream.objects) {
106
+ w.writeUint8(obj.serializationFlags);
107
+ const flags = obj.serializationFlags;
108
+ if (flags & 0x08) w.writeVarInt(obj.groupId);
109
+ // subgroup encoding: bits 0-1
110
+ const subgroupEncoding = flags & 0x03;
111
+ if (subgroupEncoding === 0x03) w.writeVarInt(obj.subgroupId);
112
+ if (flags & 0x04) w.writeVarInt(obj.objectId);
113
+ if (flags & 0x10) w.writeUint8(obj.publisherPriority);
114
+ if (flags & 0x20) {
115
+ w.writeVarInt(BigInt(obj.extensionData.length));
116
+ if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
117
+ }
118
+ w.writeVarInt(obj.payloadLength);
119
+ if (obj.payloadLength === 0) {
120
+ w.writeVarInt(obj.status ?? 0n);
121
+ } else {
122
+ w.writeBytes(obj.payload);
123
+ }
124
+ }
125
+ return w.finish();
126
+ }
127
+
128
+ /**
129
+ * Decode a subgroup data stream from raw bytes.
130
+ */
131
+ export function decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream> {
132
+ try {
133
+ const r = new BufferReader(bytes);
134
+ const streamType = Number(r.readVarInt());
135
+
136
+ // Valid subgroup types: 0x10-0x15, 0x18-0x1D, 0x30-0x35, 0x38-0x3D
137
+ if (
138
+ !((streamType >= 0x10 && streamType <= 0x1d) || (streamType >= 0x30 && streamType <= 0x3d)) ||
139
+ (streamType & 0x06) === 0x06 // reserved SUBGROUP_ID_MODE (bits 2:1 = 0b11)
140
+ ) {
141
+ return {
142
+ ok: false,
143
+ error: new DecodeError(
144
+ "CONSTRAINT_VIOLATION",
145
+ `Expected subgroup stream type 0x10-0x15/0x18-0x1D/0x30-0x35/0x38-0x3D, got 0x${streamType.toString(16)}`,
146
+ 0,
147
+ ),
148
+ };
149
+ }
150
+
151
+ // Decode type flags
152
+ const extensionsPresent = (streamType & 0x01) !== 0;
153
+ const hasSubgroupField = (streamType & 0x04) !== 0;
154
+ const subgroupIsFirstObjId = (streamType & 0x02) !== 0 && !hasSubgroupField;
155
+ const hasPriority = streamType < 0x30;
156
+
157
+ const trackAlias = r.readVarInt();
158
+ const groupId = r.readVarInt();
159
+
160
+ let subgroupId = 0n;
161
+ if (hasSubgroupField) {
162
+ subgroupId = r.readVarInt();
163
+ }
164
+
165
+ let publisherPriority = 128; // default
166
+ if (hasPriority) {
167
+ publisherPriority = r.readUint8();
168
+ }
169
+
170
+ const objects: ObjectPayload[] = [];
171
+ let prevObjectId = -1n;
172
+ let firstObject = true;
173
+
174
+ while (r.remaining > 0) {
175
+ const byteOffset = r.offset;
176
+ const delta = r.readVarInt();
177
+ let objectId: bigint;
178
+ if (firstObject) {
179
+ objectId = delta;
180
+ if (subgroupIsFirstObjId && firstObject) {
181
+ subgroupId = objectId;
182
+ }
183
+ firstObject = false;
184
+ } else {
185
+ objectId = prevObjectId + 1n + delta;
186
+ }
187
+ let extensionData = new Uint8Array(0);
188
+ if (extensionsPresent) {
189
+ const extLen = Number(r.readVarInt());
190
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
191
+ }
192
+ const payloadLength = Number(r.readVarInt());
193
+ let payload: Uint8Array;
194
+ let status: bigint | undefined;
195
+ let payloadByteOffset: number;
196
+ if (payloadLength === 0) {
197
+ // When payload_length is 0, an object status varint follows
198
+ status = r.readVarInt();
199
+ payloadByteOffset = r.offset;
200
+ payload = new Uint8Array(0);
201
+ } else {
202
+ payloadByteOffset = r.offset;
203
+ payload = r.readBytesView(payloadLength);
204
+ }
205
+ const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, extensionData, payload };
206
+ if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
207
+ objects.push(obj);
208
+ prevObjectId = objectId;
209
+ }
210
+
211
+ return {
212
+ ok: true,
213
+ value: {
214
+ type: "subgroup",
215
+ headerType: streamType,
216
+ trackAlias,
217
+ groupId,
218
+ subgroupId,
219
+ publisherPriority,
220
+ objects,
221
+ },
222
+ bytesRead: r.offset,
223
+ };
224
+ } catch (e) {
225
+ if (e instanceof DecodeError) return { ok: false, error: e };
226
+ throw e;
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Decode a datagram object from raw bytes.
232
+ */
233
+ export function decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject> {
234
+ try {
235
+ const r = new BufferReader(bytes);
236
+ const dgType = Number(r.readVarInt());
237
+
238
+ // Datagram type flags:
239
+ // bit 2 (0x04): object_id ABSENT when set
240
+ // bit 1 (0x02): end-of-group
241
+ // bit 5 (0x20): status (replaces payload with status varint)
242
+ const objectIdAbsent = (dgType & 0x04) !== 0;
243
+ const endOfGroup = (dgType & 0x02) !== 0;
244
+ const isStatus = (dgType & 0x20) !== 0;
245
+
246
+ const trackAlias = r.readVarInt();
247
+ const groupId = r.readVarInt();
248
+ let objectId = 0n;
249
+ if (!objectIdAbsent) {
250
+ objectId = r.readVarInt();
251
+ }
252
+ const publisherPriority = r.readUint8();
253
+
254
+ let objectStatus: bigint | undefined;
255
+ let payload: Uint8Array;
256
+ if (isStatus) {
257
+ objectStatus = r.readVarInt();
258
+ payload = new Uint8Array(0);
259
+ } else {
260
+ payload = r.readBytesView(r.remaining);
261
+ }
262
+ const payloadLength = payload.byteLength;
263
+
264
+ const result: DatagramObject = {
265
+ type: "datagram",
266
+ datagramType: dgType,
267
+ trackAlias,
268
+ groupId,
269
+ objectId,
270
+ publisherPriority,
271
+ payloadLength,
272
+ payload,
273
+ };
274
+
275
+ if (endOfGroup) (result as unknown as Record<string, unknown>).endOfGroup = true;
276
+ if (objectStatus !== undefined)
277
+ (result as unknown as Record<string, unknown>).objectStatus = objectStatus;
278
+
279
+ return { ok: true, value: result, bytesRead: r.offset };
280
+ } catch (e) {
281
+ if (e instanceof DecodeError) return { ok: false, error: e };
282
+ throw e;
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Decode a fetch data stream from raw bytes.
288
+ */
289
+ export function decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream> {
290
+ try {
291
+ const r = new BufferReader(bytes);
292
+ const streamType = r.readVarInt();
293
+ if (streamType !== FETCH_STREAM_TYPE) {
294
+ return {
295
+ ok: false,
296
+ error: new DecodeError(
297
+ "CONSTRAINT_VIOLATION",
298
+ `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
299
+ 0,
300
+ ),
301
+ };
302
+ }
303
+ const requestId = r.readVarInt();
304
+ const objects: FetchObjectPayload[] = [];
305
+
306
+ let prevGroupId = 0n;
307
+ let prevSubgroupId = 0n;
308
+ let prevObjectId = 0n;
309
+ let prevPriority = 128;
310
+ let first = true;
311
+
312
+ while (r.remaining > 0) {
313
+ const byteOffset = r.offset;
314
+ const flags = r.readUint8();
315
+ const subgroupEncoding = flags & 0x03;
316
+ const objectIdPresent = (flags & 0x04) !== 0;
317
+ const groupIdPresent = (flags & 0x08) !== 0;
318
+ const priorityPresent = (flags & 0x10) !== 0;
319
+ const extensionsPresent = (flags & 0x20) !== 0;
320
+
321
+ if (flags & 0xc0) {
322
+ return {
323
+ ok: false,
324
+ error: new DecodeError(
325
+ "CONSTRAINT_VIOLATION",
326
+ "Reserved bits set in fetch object flags",
327
+ r.offset,
328
+ ),
329
+ };
330
+ }
331
+
332
+ let groupId = prevGroupId;
333
+ if (groupIdPresent) {
334
+ groupId = r.readVarInt();
335
+ } else if (first) {
336
+ return {
337
+ ok: false,
338
+ error: new DecodeError(
339
+ "CONSTRAINT_VIOLATION",
340
+ "First fetch object must include groupId",
341
+ r.offset,
342
+ ),
343
+ };
344
+ }
345
+
346
+ let subgroupId: bigint;
347
+ if (subgroupEncoding === 0x00) {
348
+ subgroupId = 0n;
349
+ } else if (subgroupEncoding === 0x01) {
350
+ if (first) {
351
+ return {
352
+ ok: false,
353
+ error: new DecodeError(
354
+ "CONSTRAINT_VIOLATION",
355
+ "First fetch object cannot reference prior subgroupId",
356
+ r.offset,
357
+ ),
358
+ };
359
+ }
360
+ subgroupId = prevSubgroupId;
361
+ } else if (subgroupEncoding === 0x02) {
362
+ if (first) {
363
+ return {
364
+ ok: false,
365
+ error: new DecodeError(
366
+ "CONSTRAINT_VIOLATION",
367
+ "First fetch object cannot reference prior subgroupId",
368
+ r.offset,
369
+ ),
370
+ };
371
+ }
372
+ subgroupId = prevSubgroupId + 1n;
373
+ } else {
374
+ subgroupId = r.readVarInt();
375
+ }
376
+
377
+ let objectId = prevObjectId + 1n;
378
+ if (objectIdPresent) {
379
+ objectId = r.readVarInt();
380
+ } else if (first) {
381
+ return {
382
+ ok: false,
383
+ error: new DecodeError(
384
+ "CONSTRAINT_VIOLATION",
385
+ "First fetch object must include objectId",
386
+ r.offset,
387
+ ),
388
+ };
389
+ }
390
+
391
+ if (priorityPresent) {
392
+ prevPriority = r.readUint8();
393
+ }
394
+
395
+ let extensionData = new Uint8Array(0);
396
+ if (extensionsPresent) {
397
+ const extLen = Number(r.readVarInt());
398
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
399
+ }
400
+
401
+ const payloadLength = Number(r.readVarInt());
402
+ let payload: Uint8Array;
403
+ let status: bigint | undefined;
404
+ let payloadByteOffset: number;
405
+ if (payloadLength > 0) {
406
+ payloadByteOffset = r.offset;
407
+ payload = r.readBytesView(payloadLength);
408
+ } else {
409
+ status = r.readVarInt();
410
+ payloadByteOffset = r.offset;
411
+ payload = new Uint8Array(0);
412
+ }
413
+
414
+ const obj: FetchObjectPayload = {
415
+ type: "object",
416
+ byteOffset,
417
+ payloadByteOffset,
418
+ serializationFlags: flags,
419
+ groupId,
420
+ subgroupId,
421
+ objectId,
422
+ publisherPriority: prevPriority,
423
+ payloadLength,
424
+ extensionData,
425
+ payload,
426
+ };
427
+ if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
428
+ objects.push(obj);
429
+
430
+ prevGroupId = groupId;
431
+ prevSubgroupId = subgroupId;
432
+ prevObjectId = objectId;
433
+ first = false;
434
+ }
435
+
436
+ return {
437
+ ok: true,
438
+ value: { type: "fetch", requestId, objects },
439
+ bytesRead: r.offset,
440
+ };
441
+ } catch (e) {
442
+ if (e instanceof DecodeError) return { ok: false, error: e };
443
+ throw e;
444
+ }
445
+ }
446
+
447
+ /**
448
+ * Decode a data stream, dispatching by stream type.
449
+ */
450
+ export function decodeDataStream(
451
+ streamType: "subgroup" | "datagram" | "fetch",
452
+ bytes: Uint8Array,
453
+ ): DecodeResult<Draft15DataStream> {
454
+ switch (streamType) {
455
+ case "subgroup":
456
+ return decodeSubgroupStream(bytes);
457
+ case "datagram":
458
+ return decodeDatagram(bytes);
459
+ case "fetch":
460
+ return decodeFetchStream(bytes);
461
+ default: {
462
+ const _exhaustive: never = streamType;
463
+ throw new Error(`Unknown stream type: ${_exhaustive}`);
464
+ }
465
+ }
466
+ }
467
+
468
+ // ─── Data Stream Decoders ──────────────────────────────────────────────────────
469
+
470
+ /**
471
+ * Create a TransformStream that decodes a subgroup data stream.
472
+ */
473
+ export function createSubgroupStreamDecoder(): TransformStream<
474
+ Uint8Array,
475
+ SubgroupStreamHeader | ObjectPayload
476
+ > {
477
+ let buffer = new Uint8Array(0);
478
+ let offset = 0;
479
+ let headerEmitted = false;
480
+ let prevObjectId = -1n;
481
+ let firstObject = true;
482
+ let _subgroupIsFirstObjId = false;
483
+ let _extensionsPresent = false;
484
+
485
+ return new TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>({
486
+ transform(chunk, controller) {
487
+ if (offset > 0) {
488
+ buffer = buffer.subarray(offset);
489
+ offset = 0;
490
+ }
491
+ const newBuffer = new Uint8Array(buffer.length + chunk.length);
492
+ newBuffer.set(buffer, 0);
493
+ newBuffer.set(chunk, buffer.length);
494
+ buffer = newBuffer;
495
+
496
+ if (!headerEmitted) {
497
+ try {
498
+ const r = new BufferReader(buffer.subarray(offset));
499
+ const streamType = Number(r.readVarInt());
500
+
501
+ if (
502
+ !(
503
+ (streamType >= 0x10 && streamType <= 0x1d) ||
504
+ (streamType >= 0x30 && streamType <= 0x3d)
505
+ )
506
+ ) {
507
+ controller.error(
508
+ new DecodeError(
509
+ "CONSTRAINT_VIOLATION",
510
+ `Expected subgroup stream type, got 0x${streamType.toString(16)}`,
511
+ 0,
512
+ ),
513
+ );
514
+ return;
515
+ }
516
+
517
+ _extensionsPresent = (streamType & 0x01) !== 0;
518
+ const hasSubgroupField = (streamType & 0x04) !== 0;
519
+ _subgroupIsFirstObjId = (streamType & 0x02) !== 0 && !hasSubgroupField;
520
+ const hasPriority = streamType < 0x30;
521
+
522
+ const trackAlias = r.readVarInt();
523
+ const groupId = r.readVarInt();
524
+
525
+ let subgroupId = 0n;
526
+ if (hasSubgroupField) {
527
+ subgroupId = r.readVarInt();
528
+ }
529
+
530
+ let publisherPriority = 128;
531
+ if (hasPriority) {
532
+ publisherPriority = r.readUint8();
533
+ }
534
+
535
+ controller.enqueue({
536
+ type: "subgroup_header",
537
+ trackAlias,
538
+ groupId,
539
+ subgroupId,
540
+ publisherPriority,
541
+ });
542
+ headerEmitted = true;
543
+ offset += r.offset;
544
+ } catch (e) {
545
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
546
+ return;
547
+ }
548
+ controller.error(e);
549
+ return;
550
+ }
551
+ }
552
+
553
+ // Parse objects with delta-encoded IDs
554
+ while (offset < buffer.length) {
555
+ try {
556
+ const r = new BufferReader(buffer.subarray(offset));
557
+ const byteOffset = r.offset;
558
+ const delta = r.readVarInt();
559
+ let objectId: bigint;
560
+ if (firstObject) {
561
+ objectId = delta;
562
+ firstObject = false;
563
+ } else {
564
+ objectId = prevObjectId + 1n + delta;
565
+ }
566
+ let extensionData = new Uint8Array(0);
567
+ if (_extensionsPresent) {
568
+ const extLen = Number(r.readVarInt());
569
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
570
+ }
571
+ const payloadLength = Number(r.readVarInt());
572
+ const payloadByteOffset = r.offset;
573
+ const payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
574
+ controller.enqueue({ type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, extensionData, payload });
575
+ offset += r.offset;
576
+ prevObjectId = objectId;
577
+ } catch (e) {
578
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
579
+ break;
580
+ }
581
+ controller.error(e);
582
+ return;
583
+ }
584
+ }
585
+ },
586
+
587
+ flush(controller) {
588
+ if (offset < buffer.length) {
589
+ controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
590
+ }
591
+ },
592
+ });
593
+ }
594
+
595
+ /**
596
+ * Create a TransformStream that decodes a fetch data stream.
597
+ */
598
+ export function createFetchStreamDecoder(): TransformStream<
599
+ Uint8Array,
600
+ FetchStreamHeader | ObjectPayload
601
+ > {
602
+ let buffer = new Uint8Array(0);
603
+ let offset = 0;
604
+ let headerEmitted = false;
605
+
606
+ return new TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>({
607
+ transform(chunk, controller) {
608
+ if (offset > 0) {
609
+ buffer = buffer.subarray(offset);
610
+ offset = 0;
611
+ }
612
+ const newBuffer = new Uint8Array(buffer.length + chunk.length);
613
+ newBuffer.set(buffer, 0);
614
+ newBuffer.set(chunk, buffer.length);
615
+ buffer = newBuffer;
616
+
617
+ if (!headerEmitted) {
618
+ try {
619
+ const r = new BufferReader(buffer.subarray(offset));
620
+ const streamType = r.readVarInt();
621
+ if (streamType !== FETCH_STREAM_TYPE) {
622
+ controller.error(
623
+ new DecodeError(
624
+ "CONSTRAINT_VIOLATION",
625
+ `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
626
+ 0,
627
+ ),
628
+ );
629
+ return;
630
+ }
631
+ const requestId = r.readVarInt();
632
+ controller.enqueue({ type: "fetch_header", requestId });
633
+ headerEmitted = true;
634
+ offset += r.offset;
635
+ } catch (e) {
636
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
637
+ return;
638
+ }
639
+ controller.error(e);
640
+ return;
641
+ }
642
+ }
643
+
644
+ // Parse fetch objects with serialization flags
645
+ // Simplified: just read flags + explicit fields
646
+ while (offset < buffer.length) {
647
+ try {
648
+ const r = new BufferReader(buffer.subarray(offset));
649
+ const flags = r.readUint8();
650
+ const objectIdPresent = (flags & 0x04) !== 0;
651
+ const groupIdPresent = (flags & 0x08) !== 0;
652
+ const priorityPresent = (flags & 0x10) !== 0;
653
+ const extensionsPresent = (flags & 0x20) !== 0;
654
+ const subgroupEncoding = flags & 0x03;
655
+
656
+ if (groupIdPresent) r.readVarInt(); // groupId — consumed
657
+ if (subgroupEncoding === 0x03) r.readVarInt(); // subgroupId — consumed
658
+ let objectId = 0n;
659
+ if (objectIdPresent) objectId = r.readVarInt();
660
+ if (priorityPresent) r.readUint8(); // priority — consumed
661
+ let extensionData = new Uint8Array(0);
662
+ if (extensionsPresent) {
663
+ const extLen = Number(r.readVarInt());
664
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
665
+ }
666
+ const payloadLength = Number(r.readVarInt());
667
+ const payloadByteOffset = r.offset;
668
+ const payload = payloadLength > 0 ? r.readBytesView(payloadLength) : new Uint8Array(0);
669
+ controller.enqueue({ type: "object", objectId, payloadLength, extensionData, payload, byteOffset: 0, payloadByteOffset });
670
+ offset += r.offset;
671
+ } catch (e) {
672
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
673
+ break;
674
+ }
675
+ controller.error(e);
676
+ return;
677
+ }
678
+ }
679
+ },
680
+
681
+ flush(controller) {
682
+ if (offset < buffer.length) {
683
+ controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
684
+ }
685
+ },
686
+ });
687
+ }
688
+
689
+ /**
690
+ * Create a unified auto-detecting data stream decoder.
691
+ */
692
+ export function createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent> {
693
+ let buffer = new Uint8Array(0);
694
+ let offset = 0;
695
+ let inner: TransformStream<Uint8Array, DataStreamEvent> | null = null;
696
+ const _innerWriter: WritableStreamDefaultWriter<Uint8Array> | null = null;
697
+ const _innerReader: ReadableStreamDefaultReader<DataStreamEvent> | null = null;
698
+
699
+ return new TransformStream<Uint8Array, DataStreamEvent>({
700
+ transform(chunk, controller) {
701
+ if (offset > 0) {
702
+ buffer = buffer.subarray(offset);
703
+ offset = 0;
704
+ }
705
+ const newBuffer = new Uint8Array(buffer.length + chunk.length);
706
+ newBuffer.set(buffer, 0);
707
+ newBuffer.set(chunk, buffer.length);
708
+ buffer = newBuffer;
709
+
710
+ if (inner === null) {
711
+ // Need at least one byte to determine type
712
+ if (offset >= buffer.length) return;
713
+ const firstByte = buffer[offset]!;
714
+
715
+ if ((firstByte >= 0x10 && firstByte <= 0x1d) || (firstByte >= 0x30 && firstByte <= 0x3d)) {
716
+ // Subgroup — delegate to subgroup decoder
717
+ // We need to feed the full buffer including the type byte
718
+ const decoder = createSubgroupStreamDecoder();
719
+ inner = decoder as unknown as TransformStream<Uint8Array, DataStreamEvent>;
720
+ } else if (firstByte === 0x05) {
721
+ // Fetch
722
+ const decoder = createFetchStreamDecoder();
723
+ inner = decoder as unknown as TransformStream<Uint8Array, DataStreamEvent>;
724
+ } else {
725
+ controller.error(
726
+ new DecodeError(
727
+ "CONSTRAINT_VIOLATION",
728
+ `Unknown data stream type: 0x${firstByte.toString(16)}`,
729
+ 0,
730
+ ),
731
+ );
732
+ return;
733
+ }
734
+
735
+ // For simplicity, process inline instead of piping
736
+ // Just re-parse from buffer using the appropriate one-shot decoder
737
+ }
738
+
739
+ // Since inner TransformStream piping is complex, use a simpler approach:
740
+ // Accumulate and attempt decode when flush is called
741
+ // For the streaming case, we just buffer everything
742
+ },
743
+
744
+ flush(controller) {
745
+ if (offset >= buffer.length) return;
746
+ const view = buffer.subarray(offset);
747
+
748
+ const firstByte = view[0]!;
749
+ let result: DecodeResult<Draft15DataStream>;
750
+
751
+ if ((firstByte >= 0x10 && firstByte <= 0x1d) || (firstByte >= 0x30 && firstByte <= 0x3d)) {
752
+ result = decodeSubgroupStream(view);
753
+ } else if (firstByte === 0x05) {
754
+ result = decodeFetchStream(view);
755
+ } else {
756
+ controller.error(
757
+ new DecodeError(
758
+ "CONSTRAINT_VIOLATION",
759
+ `Unknown data stream type: 0x${firstByte.toString(16)}`,
760
+ 0,
761
+ ),
762
+ );
763
+ return;
764
+ }
765
+
766
+ if (!result.ok) {
767
+ controller.error(result.error);
768
+ return;
769
+ }
770
+
771
+ const stream = result.value;
772
+ if (stream.type === "subgroup") {
773
+ controller.enqueue({
774
+ type: "subgroup_header",
775
+ trackAlias: stream.trackAlias,
776
+ groupId: stream.groupId,
777
+ subgroupId: stream.subgroupId,
778
+ publisherPriority: stream.publisherPriority,
779
+ });
780
+ for (const obj of stream.objects) {
781
+ controller.enqueue(obj);
782
+ }
783
+ } else if (stream.type === "fetch") {
784
+ controller.enqueue({
785
+ type: "fetch_header",
786
+ requestId: stream.requestId,
787
+ });
788
+ for (const obj of stream.objects) {
789
+ controller.enqueue(obj);
790
+ }
791
+ }
792
+ },
793
+ });
794
+ }