@moqtap/codec 0.2.2 → 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 +192 -192
  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 +19 -10
  158. package/src/drafts/draft11/data-streams.ts +269 -269
  159. package/src/drafts/draft12/codec.ts +19 -10
  160. package/src/drafts/draft12/data-streams.ts +275 -275
  161. package/src/drafts/draft13/codec.ts +19 -10
  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,798 +1,813 @@
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
- Draft14DataStream,
9
- FetchObjectPayload,
10
- FetchStream,
11
- FetchStreamHeader,
12
- ObjectPayload,
13
- SubgroupStream,
14
- SubgroupStreamHeader,
15
- } from "./types.js";
16
-
17
- // ─── Data Stream Constants ────────────────────────────────────────────────────
18
-
19
- const FETCH_STREAM_TYPE = 0x05n;
20
-
21
- // Valid subgroup stream types: 0x10-0x1D (12 types)
22
- // Bit 0: extensions present
23
- // Bit 1: subgroup-id mode (0=zero or first-object-id, with bit 2)
24
- // Bit 2: subgroup-id field present (when set, explicit subgroup ID)
25
- // Bit 3: end-of-group
26
- function isValidSubgroupType(t: number): boolean {
27
- // 12 defined types: 0x10-0x15, 0x18-0x1D
28
- return (t >= 0x10 && t <= 0x15) || (t >= 0x18 && t <= 0x1d);
29
- }
30
-
31
- // ─── Data Stream Encoding/Decoding ─────────────────────────────────────────────
32
-
33
- /**
34
- * Compute the subgroup stream type byte from header properties.
35
- */
36
- function computeSubgroupType(opts: {
37
- hasSubgroupField: boolean;
38
- subgroupIsFirstObjId: boolean;
39
- extensionsPresent: boolean;
40
- endOfGroup: boolean;
41
- }): number {
42
- let t = 0x10;
43
- if (opts.extensionsPresent) t |= 0x01;
44
- if (opts.subgroupIsFirstObjId) t |= 0x02;
45
- if (opts.hasSubgroupField) t |= 0x04;
46
- if (opts.endOfGroup) t |= 0x08;
47
- return t;
48
- }
49
-
50
- /**
51
- * Encode a subgroup stream header + objects.
52
- * Uses delta-encoded Object IDs per draft-14 §10.4.2.
53
- */
54
- export function encodeSubgroupStream(stream: SubgroupStream): Uint8Array {
55
- const w = new BufferWriter();
56
- w.writeVarInt(BigInt(stream.headerType));
57
- w.writeVarInt(stream.trackAlias);
58
- w.writeVarInt(stream.groupId);
59
-
60
- const hasSubgroupField = (stream.headerType & 0x04) !== 0;
61
- const extensionsPresent = (stream.headerType & 0x01) !== 0;
62
- if (hasSubgroupField) {
63
- w.writeVarInt(stream.subgroupId);
64
- }
65
- w.writeUint8(stream.publisherPriority);
66
-
67
- let prevObjectId = -1n;
68
- let first = true;
69
- for (const obj of stream.objects) {
70
- // Delta encoding: first object delta IS the object ID,
71
- // subsequent deltas: objectId - prevObjectId - 1
72
- const delta = first ? obj.objectId : obj.objectId - prevObjectId - 1n;
73
- w.writeVarInt(delta);
74
- first = false;
75
- prevObjectId = obj.objectId;
76
-
77
- // Extension headers
78
- if (extensionsPresent) {
79
- w.writeVarInt(BigInt(obj.extensionData.length));
80
- if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
81
- }
82
-
83
- if (obj.payloadLength === 0) {
84
- w.writeVarInt(0);
85
- w.writeVarInt(obj.status ?? 0n);
86
- } else {
87
- w.writeVarInt(obj.payloadLength);
88
- w.writeBytes(obj.payload);
89
- }
90
- }
91
- return w.finish();
92
- }
93
-
94
- /**
95
- * Encode a datagram object.
96
- * Draft-14 datagram types: 0x00-0x07, 0x20-0x21.
97
- */
98
- export function encodeDatagram(dg: DatagramObject): Uint8Array {
99
- const w = new BufferWriter();
100
- w.writeVarInt(BigInt(dg.datagramType));
101
- w.writeVarInt(dg.trackAlias);
102
- w.writeVarInt(dg.groupId);
103
-
104
- const objectIdPresent = (dg.datagramType & 0x04) === 0;
105
- const isStatus = dg.datagramType >= 0x20;
106
- const extensionsPresent = (dg.datagramType & 0x01) !== 0;
107
-
108
- if (objectIdPresent) {
109
- w.writeVarInt(dg.objectId);
110
- }
111
- w.writeUint8(dg.publisherPriority);
112
-
113
- if (extensionsPresent) {
114
- w.writeVarInt(0); // extension headers length = 0
115
- }
116
-
117
- if (isStatus) {
118
- w.writeVarInt(dg.objectStatus ?? 0n);
119
- } else {
120
- w.writeBytes(dg.payload);
121
- }
122
- return w.finish();
123
- }
124
-
125
- /**
126
- * Encode a fetch stream header + objects.
127
- * Draft-14 fetch: type 0x05, then per-object: GroupID, SubgroupID, ObjectID,
128
- * PublisherPriority(8), ExtensionHeadersLength, [Extensions], PayloadLength,
129
- * [ObjectStatus], Payload.
130
- */
131
- export function encodeFetchStream(stream: FetchStream): Uint8Array {
132
- const w = new BufferWriter();
133
- w.writeVarInt(FETCH_STREAM_TYPE);
134
- w.writeVarInt(stream.requestId);
135
- for (const obj of stream.objects) {
136
- w.writeVarInt(obj.groupId);
137
- w.writeVarInt(obj.subgroupId);
138
- w.writeVarInt(obj.objectId);
139
- w.writeUint8(obj.publisherPriority);
140
- w.writeVarInt(BigInt(obj.extensionData.length));
141
- if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
142
- if (obj.payloadLength === 0) {
143
- w.writeVarInt(0);
144
- w.writeVarInt(obj.status ?? 0n);
145
- } else {
146
- w.writeVarInt(obj.payloadLength);
147
- w.writeBytes(obj.payload);
148
- }
149
- }
150
- return w.finish();
151
- }
152
-
153
- /**
154
- * Decode a subgroup data stream from raw bytes.
155
- * Accepts types 0x10-0x15 and 0x18-0x1D. Delta-decodes Object IDs.
156
- */
157
- export function decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream> {
158
- try {
159
- const r = new BufferReader(bytes);
160
- const streamType = Number(r.readVarInt());
161
-
162
- if (!isValidSubgroupType(streamType)) {
163
- return {
164
- ok: false,
165
- error: new DecodeError(
166
- "CONSTRAINT_VIOLATION",
167
- `Expected subgroup stream type 0x10-0x1D, got 0x${streamType.toString(16)}`,
168
- 0,
169
- ),
170
- };
171
- }
172
-
173
- // Decode type flags
174
- const extensionsPresent = (streamType & 0x01) !== 0;
175
- const hasSubgroupField = (streamType & 0x04) !== 0;
176
- const subgroupIsFirstObjId = (streamType & 0x02) !== 0 && !hasSubgroupField;
177
-
178
- const trackAlias = r.readVarInt();
179
- const groupId = r.readVarInt();
180
-
181
- let subgroupId = 0n;
182
- if (hasSubgroupField) {
183
- subgroupId = r.readVarInt();
184
- }
185
- const publisherPriority = r.readUint8();
186
-
187
- const objects: ObjectPayload[] = [];
188
- let prevObjectId = -1n;
189
- let firstObject = true;
190
-
191
- while (r.remaining > 0) {
192
- const byteOffset = r.offset;
193
- const delta = r.readVarInt();
194
- let objectId: bigint;
195
- if (firstObject) {
196
- objectId = delta;
197
- if (subgroupIsFirstObjId) {
198
- subgroupId = objectId;
199
- }
200
- firstObject = false;
201
- } else {
202
- objectId = prevObjectId + 1n + delta;
203
- }
204
-
205
- // Read extension headers if type indicates they're present
206
- let extensionData = new Uint8Array(0);
207
- if (extensionsPresent) {
208
- const extLen = Number(r.readVarInt());
209
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
210
- }
211
-
212
- const payloadLength = Number(r.readVarInt());
213
- let payload: Uint8Array;
214
- let status: bigint | undefined;
215
- let payloadByteOffset: number;
216
- if (payloadLength === 0) {
217
- status = r.readVarInt();
218
- payloadByteOffset = r.offset;
219
- payload = new Uint8Array(0);
220
- } else {
221
- payloadByteOffset = r.offset;
222
- payload = r.readBytes(payloadLength);
223
- }
224
- const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
225
- if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
226
- objects.push(obj);
227
- prevObjectId = objectId;
228
- }
229
-
230
- return {
231
- ok: true,
232
- value: {
233
- type: "subgroup",
234
- headerType: streamType,
235
- trackAlias,
236
- groupId,
237
- subgroupId,
238
- publisherPriority,
239
- objects,
240
- },
241
- bytesRead: r.offset,
242
- };
243
- } catch (e) {
244
- if (e instanceof DecodeError) return { ok: false, error: e };
245
- throw e;
246
- }
247
- }
248
-
249
- /**
250
- * Decode a datagram object from raw bytes.
251
- * Accepts types 0x00-0x07 and 0x20-0x21.
252
- */
253
- export function decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject> {
254
- try {
255
- const r = new BufferReader(bytes);
256
- const dgType = Number(r.readVarInt());
257
-
258
- // Validate datagram type
259
- const validDatagram = (dgType >= 0x00 && dgType <= 0x07) || dgType === 0x20 || dgType === 0x21;
260
- if (!validDatagram) {
261
- return {
262
- ok: false,
263
- error: new DecodeError(
264
- "CONSTRAINT_VIOLATION",
265
- `Expected datagram type 0x00-0x07 or 0x20-0x21, got 0x${dgType.toString(16)}`,
266
- 0,
267
- ),
268
- };
269
- }
270
-
271
- const objectIdPresent = (dgType & 0x04) === 0;
272
- const endOfGroup = (dgType & 0x02) !== 0;
273
- const extensionsPresent = (dgType & 0x01) !== 0;
274
- const isStatus = dgType >= 0x20;
275
-
276
- const trackAlias = r.readVarInt();
277
- const groupId = r.readVarInt();
278
- let objectId = 0n;
279
- if (objectIdPresent) {
280
- objectId = r.readVarInt();
281
- }
282
- const publisherPriority = r.readUint8();
283
-
284
- if (extensionsPresent) {
285
- const extLen = Number(r.readVarInt());
286
- if (extLen > 0) {
287
- r.readBytes(extLen); // skip extension data
288
- }
289
- }
290
-
291
- let objectStatus: bigint | undefined;
292
- let payload: Uint8Array;
293
- if (isStatus) {
294
- objectStatus = r.readVarInt();
295
- payload = new Uint8Array(0);
296
- } else {
297
- payload = r.readBytes(r.remaining);
298
- }
299
- const payloadLength = payload.byteLength;
300
-
301
- const result: DatagramObject = {
302
- type: "datagram",
303
- datagramType: dgType,
304
- trackAlias,
305
- groupId,
306
- objectId,
307
- publisherPriority,
308
- payloadLength,
309
- payload,
310
- };
311
-
312
- if (endOfGroup) (result as unknown as Record<string, unknown>).endOfGroup = true;
313
- if (objectStatus !== undefined)
314
- (result as unknown as Record<string, unknown>).objectStatus = objectStatus;
315
-
316
- return { ok: true, value: result, bytesRead: r.offset };
317
- } catch (e) {
318
- if (e instanceof DecodeError) return { ok: false, error: e };
319
- throw e;
320
- }
321
- }
322
-
323
- /**
324
- * Decode a fetch data stream from raw bytes.
325
- * Draft-14 fetch: type 0x05, per-object has all fields (no serialization flags).
326
- */
327
- export function decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream> {
328
- try {
329
- const r = new BufferReader(bytes);
330
- const streamType = r.readVarInt();
331
- if (streamType !== FETCH_STREAM_TYPE) {
332
- return {
333
- ok: false,
334
- error: new DecodeError(
335
- "CONSTRAINT_VIOLATION",
336
- `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
337
- 0,
338
- ),
339
- };
340
- }
341
- const requestId = r.readVarInt();
342
- const objects: FetchObjectPayload[] = [];
343
- while (r.remaining > 0) {
344
- const byteOffset = r.offset;
345
- const groupId = r.readVarInt();
346
- const subgroupId = r.readVarInt();
347
- const objectId = r.readVarInt();
348
- const publisherPriority = r.readUint8();
349
- // Extension headers
350
- const extLen = Number(r.readVarInt());
351
- const extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
352
- const payloadLength = Number(r.readVarInt());
353
- let payload: Uint8Array;
354
- let status: bigint | undefined;
355
- let payloadByteOffset: number;
356
- if (payloadLength === 0) {
357
- status = r.readVarInt();
358
- payloadByteOffset = r.offset;
359
- payload = new Uint8Array(0);
360
- } else {
361
- payloadByteOffset = r.offset;
362
- payload = r.readBytes(payloadLength);
363
- }
364
- const obj: FetchObjectPayload = {
365
- type: "object",
366
- byteOffset,
367
- payloadByteOffset,
368
- groupId,
369
- subgroupId,
370
- objectId,
371
- publisherPriority,
372
- payloadLength,
373
- payload,
374
- extensionData,
375
- };
376
- if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
377
- objects.push(obj);
378
- }
379
- return {
380
- ok: true,
381
- value: { type: "fetch", requestId, objects },
382
- bytesRead: r.offset,
383
- };
384
- } catch (e) {
385
- if (e instanceof DecodeError) return { ok: false, error: e };
386
- throw e;
387
- }
388
- }
389
-
390
- /**
391
- * Decode a data stream, dispatching by stream type.
392
- */
393
- export function decodeDataStream(
394
- streamType: "subgroup" | "datagram" | "fetch",
395
- bytes: Uint8Array,
396
- ): DecodeResult<Draft14DataStream> {
397
- switch (streamType) {
398
- case "subgroup":
399
- return decodeSubgroupStream(bytes);
400
- case "datagram":
401
- return decodeDatagram(bytes);
402
- case "fetch":
403
- return decodeFetchStream(bytes);
404
- default: {
405
- const _exhaustive: never = streamType;
406
- throw new Error(`Unknown stream type: ${_exhaustive}`);
407
- }
408
- }
409
- }
410
-
411
- // ─── Data Stream Decoders ──────────────────────────────────────────────────────
412
-
413
- /**
414
- * Create a TransformStream that decodes a subgroup data stream.
415
- * First emits a SubgroupStreamHeader, then emits ObjectPayload events.
416
- * Accepts types 0x10-0x1D. Delta-decodes Object IDs.
417
- */
418
- export function createSubgroupStreamDecoder(): TransformStream<
419
- Uint8Array,
420
- SubgroupStreamHeader | ObjectPayload
421
- > {
422
- let buffer = new Uint8Array(0);
423
- let headerEmitted = false;
424
- let extensionsPresent = false;
425
- let prevObjectId = -1n;
426
- let firstObject = true;
427
-
428
- return new TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>({
429
- transform(chunk, controller) {
430
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
431
- newBuffer.set(buffer, 0);
432
- newBuffer.set(chunk, buffer.length);
433
- buffer = newBuffer;
434
-
435
- if (!headerEmitted) {
436
- try {
437
- const r = new BufferReader(buffer);
438
- const streamType = Number(r.readVarInt());
439
- if (!isValidSubgroupType(streamType)) {
440
- controller.error(
441
- new DecodeError(
442
- "CONSTRAINT_VIOLATION",
443
- `Expected subgroup stream type 0x10-0x1D, got 0x${streamType.toString(16)}`,
444
- 0,
445
- ),
446
- );
447
- return;
448
- }
449
- extensionsPresent = (streamType & 0x01) !== 0;
450
- const hasSubgroupField = (streamType & 0x04) !== 0;
451
- const trackAlias = r.readVarInt();
452
- const groupId = r.readVarInt();
453
- let subgroupId = 0n;
454
- if (hasSubgroupField) {
455
- subgroupId = r.readVarInt();
456
- }
457
- const publisherPriority = r.readUint8();
458
-
459
- controller.enqueue({
460
- type: "subgroup_header",
461
- headerType: streamType,
462
- trackAlias,
463
- groupId,
464
- subgroupId,
465
- publisherPriority,
466
- });
467
- headerEmitted = true;
468
- buffer = buffer.slice(r.offset);
469
- } catch (e) {
470
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
471
- return;
472
- }
473
- controller.error(e);
474
- return;
475
- }
476
- }
477
-
478
- while (buffer.length > 0) {
479
- try {
480
- const r = new BufferReader(buffer);
481
- const byteOffset = r.offset;
482
- const delta = r.readVarInt();
483
- const objectId = firstObject ? delta : prevObjectId + 1n + delta;
484
- firstObject = false;
485
-
486
- let extensionData = new Uint8Array(0);
487
- if (extensionsPresent) {
488
- const extLen = Number(r.readVarInt());
489
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
490
- }
491
-
492
- const payloadLength = Number(r.readVarInt());
493
- let payload: Uint8Array;
494
- let status: bigint | undefined;
495
- let payloadByteOffset: number;
496
- if (payloadLength === 0) {
497
- status = r.readVarInt();
498
- payloadByteOffset = r.offset;
499
- payload = new Uint8Array(0);
500
- } else {
501
- payloadByteOffset = r.offset;
502
- payload = r.readBytes(payloadLength);
503
- }
504
- const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
505
- if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
506
- controller.enqueue(obj);
507
- prevObjectId = objectId;
508
- buffer = buffer.slice(r.offset);
509
- } catch (e) {
510
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
511
- break;
512
- }
513
- controller.error(e);
514
- return;
515
- }
516
- }
517
- },
518
-
519
- flush(controller) {
520
- if (buffer.length > 0) {
521
- controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
522
- }
523
- },
524
- });
525
- }
526
-
527
- /**
528
- * Create a TransformStream that decodes a fetch data stream.
529
- * First emits a FetchStreamHeader, then emits FetchObjectPayload events.
530
- * Draft-14 fetch: type 0x05, per-object has all fields.
531
- */
532
- export function createFetchStreamDecoder(): TransformStream<
533
- Uint8Array,
534
- FetchStreamHeader | ObjectPayload
535
- > {
536
- let buffer = new Uint8Array(0);
537
- let headerEmitted = false;
538
-
539
- return new TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>({
540
- transform(chunk, controller) {
541
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
542
- newBuffer.set(buffer, 0);
543
- newBuffer.set(chunk, buffer.length);
544
- buffer = newBuffer;
545
-
546
- if (!headerEmitted) {
547
- try {
548
- const r = new BufferReader(buffer);
549
- const streamType = r.readVarInt();
550
- if (streamType !== FETCH_STREAM_TYPE) {
551
- controller.error(
552
- new DecodeError(
553
- "CONSTRAINT_VIOLATION",
554
- `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
555
- 0,
556
- ),
557
- );
558
- return;
559
- }
560
- const requestId = r.readVarInt();
561
-
562
- controller.enqueue({ type: "fetch_header", requestId });
563
- headerEmitted = true;
564
- buffer = buffer.slice(r.offset);
565
- } catch (e) {
566
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
567
- return;
568
- }
569
- controller.error(e);
570
- return;
571
- }
572
- }
573
-
574
- while (buffer.length > 0) {
575
- try {
576
- const r = new BufferReader(buffer);
577
- const byteOffset = r.offset;
578
- const groupId = r.readVarInt();
579
- const subgroupId = r.readVarInt();
580
- const objectId = r.readVarInt();
581
- const publisherPriority = r.readUint8();
582
- const extLen = Number(r.readVarInt());
583
- const extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
584
- const payloadLength = Number(r.readVarInt());
585
- let payload: Uint8Array;
586
- let status: bigint | undefined;
587
- let payloadByteOffset: number;
588
- if (payloadLength === 0) {
589
- status = r.readVarInt();
590
- payloadByteOffset = r.offset;
591
- payload = new Uint8Array(0);
592
- } else {
593
- payloadByteOffset = r.offset;
594
- payload = r.readBytes(payloadLength);
595
- }
596
- const obj: FetchObjectPayload = {
597
- type: "object",
598
- byteOffset,
599
- payloadByteOffset,
600
- groupId,
601
- subgroupId,
602
- objectId,
603
- publisherPriority,
604
- payloadLength,
605
- payload,
606
- extensionData,
607
- };
608
- if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
609
- controller.enqueue(obj);
610
- buffer = buffer.slice(r.offset);
611
- } catch (e) {
612
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
613
- break;
614
- }
615
- controller.error(e);
616
- return;
617
- }
618
- }
619
- },
620
-
621
- flush(controller) {
622
- if (buffer.length > 0) {
623
- controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
624
- }
625
- },
626
- });
627
- }
628
-
629
- /**
630
- * Create a unified auto-detecting data stream decoder.
631
- * Reads the stream type varint: 0x10-0x1D = subgroup, 0x05 = fetch.
632
- */
633
- export function createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent> {
634
- let buffer = new Uint8Array(0);
635
- let detectedType: "subgroup" | "fetch" | null = null;
636
- let headerEmitted = false;
637
- let extensionsPresent = false;
638
- let prevObjectId = -1n;
639
- let firstObject = true;
640
-
641
- return new TransformStream<Uint8Array, DataStreamEvent>({
642
- transform(chunk, controller) {
643
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
644
- newBuffer.set(buffer, 0);
645
- newBuffer.set(chunk, buffer.length);
646
- buffer = newBuffer;
647
-
648
- if (detectedType === null) {
649
- try {
650
- const r = new BufferReader(buffer);
651
- const streamType = Number(r.readVarInt());
652
- if (isValidSubgroupType(streamType)) {
653
- detectedType = "subgroup";
654
- } else if (streamType === 0x05) {
655
- detectedType = "fetch";
656
- } else {
657
- controller.error(
658
- new DecodeError(
659
- "CONSTRAINT_VIOLATION",
660
- `Unknown data stream type: 0x${streamType.toString(16)}`,
661
- 0,
662
- ),
663
- );
664
- return;
665
- }
666
- } catch (e) {
667
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
668
- return;
669
- }
670
- controller.error(e);
671
- return;
672
- }
673
- }
674
-
675
- if (detectedType === "subgroup") {
676
- if (!headerEmitted) {
677
- try {
678
- const r = new BufferReader(buffer);
679
- const streamType = Number(r.readVarInt());
680
- extensionsPresent = (streamType & 0x01) !== 0;
681
- const hasSubgroupField = (streamType & 0x04) !== 0;
682
- const trackAlias = r.readVarInt();
683
- const groupId = r.readVarInt();
684
- let subgroupId = 0n;
685
- if (hasSubgroupField) subgroupId = r.readVarInt();
686
- const publisherPriority = r.readUint8();
687
- controller.enqueue({
688
- type: "subgroup_header",
689
- headerType: streamType,
690
- trackAlias,
691
- groupId,
692
- subgroupId,
693
- publisherPriority,
694
- });
695
- headerEmitted = true;
696
- buffer = buffer.slice(r.offset);
697
- } catch (e) {
698
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") return;
699
- controller.error(e);
700
- return;
701
- }
702
- }
703
-
704
- while (buffer.length > 0) {
705
- try {
706
- const r = new BufferReader(buffer);
707
- const byteOffset = r.offset;
708
- const delta = r.readVarInt();
709
- const objectId = firstObject ? delta : prevObjectId + 1n + delta;
710
- firstObject = false;
711
- let extensionData = new Uint8Array(0);
712
- if (extensionsPresent) {
713
- const extLen = Number(r.readVarInt());
714
- extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
715
- }
716
- const payloadLength = Number(r.readVarInt());
717
- let payload: Uint8Array;
718
- let status: bigint | undefined;
719
- let payloadByteOffset: number;
720
- if (payloadLength === 0) {
721
- status = r.readVarInt();
722
- payloadByteOffset = r.offset;
723
- payload = new Uint8Array(0);
724
- } else {
725
- payloadByteOffset = r.offset;
726
- payload = r.readBytes(payloadLength);
727
- }
728
- const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
729
- if (status !== undefined)
730
- (obj as unknown as Record<string, unknown>).status = status;
731
- controller.enqueue(obj);
732
- prevObjectId = objectId;
733
- buffer = buffer.slice(r.offset);
734
- } catch (e) {
735
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") break;
736
- controller.error(e);
737
- return;
738
- }
739
- }
740
- } else {
741
- if (!headerEmitted) {
742
- try {
743
- const r = new BufferReader(buffer);
744
- r.readVarInt(); // stream type (0x05)
745
- const requestId = r.readVarInt();
746
- controller.enqueue({ type: "fetch_header", requestId });
747
- headerEmitted = true;
748
- buffer = buffer.slice(r.offset);
749
- } catch (e) {
750
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") return;
751
- controller.error(e);
752
- return;
753
- }
754
- }
755
-
756
- while (buffer.length > 0) {
757
- try {
758
- const r = new BufferReader(buffer);
759
- const byteOffset = r.offset;
760
- const groupId = r.readVarInt();
761
- const subgroupId = r.readVarInt();
762
- const objectId = r.readVarInt();
763
- const publisherPriority = r.readUint8();
764
- const extLen = Number(r.readVarInt());
765
- const extensionData = extLen > 0 ? r.readBytes(extLen) : new Uint8Array(0);
766
- const payloadLength = Number(r.readVarInt());
767
- let payload: Uint8Array;
768
- let status: bigint | undefined;
769
- let payloadByteOffset: number;
770
- if (payloadLength === 0) {
771
- status = r.readVarInt();
772
- payloadByteOffset = r.offset;
773
- payload = new Uint8Array(0);
774
- } else {
775
- payloadByteOffset = r.offset;
776
- payload = r.readBytes(payloadLength);
777
- }
778
- const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
779
- if (status !== undefined)
780
- (obj as unknown as Record<string, unknown>).status = status;
781
- controller.enqueue(obj);
782
- buffer = buffer.slice(r.offset);
783
- } catch (e) {
784
- if (e instanceof DecodeError && e.code === "UNEXPECTED_END") break;
785
- controller.error(e);
786
- return;
787
- }
788
- }
789
- }
790
- },
791
-
792
- flush(controller) {
793
- if (buffer.length > 0) {
794
- controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
795
- }
796
- },
797
- });
798
- }
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
+ Draft14DataStream,
9
+ FetchObjectPayload,
10
+ FetchStream,
11
+ FetchStreamHeader,
12
+ ObjectPayload,
13
+ SubgroupStream,
14
+ SubgroupStreamHeader,
15
+ } from "./types.js";
16
+
17
+ // ─── Data Stream Constants ────────────────────────────────────────────────────
18
+
19
+ const FETCH_STREAM_TYPE = 0x05n;
20
+
21
+ // Valid subgroup stream types: 0x10-0x1D (12 types)
22
+ // Bit 0: extensions present
23
+ // Bit 1: subgroup-id mode (0=zero or first-object-id, with bit 2)
24
+ // Bit 2: subgroup-id field present (when set, explicit subgroup ID)
25
+ // Bit 3: end-of-group
26
+ function isValidSubgroupType(t: number): boolean {
27
+ // 12 defined types: 0x10-0x15, 0x18-0x1D
28
+ return (t >= 0x10 && t <= 0x15) || (t >= 0x18 && t <= 0x1d);
29
+ }
30
+
31
+ // ─── Data Stream Encoding/Decoding ─────────────────────────────────────────────
32
+
33
+ /**
34
+ * Compute the subgroup stream type byte from header properties.
35
+ */
36
+ function computeSubgroupType(opts: {
37
+ hasSubgroupField: boolean;
38
+ subgroupIsFirstObjId: boolean;
39
+ extensionsPresent: boolean;
40
+ endOfGroup: boolean;
41
+ }): number {
42
+ let t = 0x10;
43
+ if (opts.extensionsPresent) t |= 0x01;
44
+ if (opts.subgroupIsFirstObjId) t |= 0x02;
45
+ if (opts.hasSubgroupField) t |= 0x04;
46
+ if (opts.endOfGroup) t |= 0x08;
47
+ return t;
48
+ }
49
+
50
+ /**
51
+ * Encode a subgroup stream header + objects.
52
+ * Uses delta-encoded Object IDs per draft-14 §10.4.2.
53
+ */
54
+ export function encodeSubgroupStream(stream: SubgroupStream): Uint8Array {
55
+ const w = new BufferWriter();
56
+ w.writeVarInt(BigInt(stream.headerType));
57
+ w.writeVarInt(stream.trackAlias);
58
+ w.writeVarInt(stream.groupId);
59
+
60
+ const hasSubgroupField = (stream.headerType & 0x04) !== 0;
61
+ const extensionsPresent = (stream.headerType & 0x01) !== 0;
62
+ if (hasSubgroupField) {
63
+ w.writeVarInt(stream.subgroupId);
64
+ }
65
+ w.writeUint8(stream.publisherPriority);
66
+
67
+ let prevObjectId = -1n;
68
+ let first = true;
69
+ for (const obj of stream.objects) {
70
+ // Delta encoding: first object delta IS the object ID,
71
+ // subsequent deltas: objectId - prevObjectId - 1
72
+ const delta = first ? obj.objectId : obj.objectId - prevObjectId - 1n;
73
+ w.writeVarInt(delta);
74
+ first = false;
75
+ prevObjectId = obj.objectId;
76
+
77
+ // Extension headers
78
+ if (extensionsPresent) {
79
+ w.writeVarInt(BigInt(obj.extensionData.length));
80
+ if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
81
+ }
82
+
83
+ if (obj.payloadLength === 0) {
84
+ w.writeVarInt(0);
85
+ w.writeVarInt(obj.status ?? 0n);
86
+ } else {
87
+ w.writeVarInt(obj.payloadLength);
88
+ w.writeBytes(obj.payload);
89
+ }
90
+ }
91
+ return w.finish();
92
+ }
93
+
94
+ /**
95
+ * Encode a datagram object.
96
+ * Draft-14 datagram types: 0x00-0x07, 0x20-0x21.
97
+ */
98
+ export function encodeDatagram(dg: DatagramObject): Uint8Array {
99
+ const w = new BufferWriter();
100
+ w.writeVarInt(BigInt(dg.datagramType));
101
+ w.writeVarInt(dg.trackAlias);
102
+ w.writeVarInt(dg.groupId);
103
+
104
+ const objectIdPresent = (dg.datagramType & 0x04) === 0;
105
+ const isStatus = dg.datagramType >= 0x20;
106
+ const extensionsPresent = (dg.datagramType & 0x01) !== 0;
107
+
108
+ if (objectIdPresent) {
109
+ w.writeVarInt(dg.objectId);
110
+ }
111
+ w.writeUint8(dg.publisherPriority);
112
+
113
+ if (extensionsPresent) {
114
+ w.writeVarInt(0); // extension headers length = 0
115
+ }
116
+
117
+ if (isStatus) {
118
+ w.writeVarInt(dg.objectStatus ?? 0n);
119
+ } else {
120
+ w.writeBytes(dg.payload);
121
+ }
122
+ return w.finish();
123
+ }
124
+
125
+ /**
126
+ * Encode a fetch stream header + objects.
127
+ * Draft-14 fetch: type 0x05, then per-object: GroupID, SubgroupID, ObjectID,
128
+ * PublisherPriority(8), ExtensionHeadersLength, [Extensions], PayloadLength,
129
+ * [ObjectStatus], Payload.
130
+ */
131
+ export function encodeFetchStream(stream: FetchStream): Uint8Array {
132
+ const w = new BufferWriter();
133
+ w.writeVarInt(FETCH_STREAM_TYPE);
134
+ w.writeVarInt(stream.requestId);
135
+ for (const obj of stream.objects) {
136
+ w.writeVarInt(obj.groupId);
137
+ w.writeVarInt(obj.subgroupId);
138
+ w.writeVarInt(obj.objectId);
139
+ w.writeUint8(obj.publisherPriority);
140
+ w.writeVarInt(BigInt(obj.extensionData.length));
141
+ if (obj.extensionData.length > 0) w.writeBytes(obj.extensionData);
142
+ if (obj.payloadLength === 0) {
143
+ w.writeVarInt(0);
144
+ w.writeVarInt(obj.status ?? 0n);
145
+ } else {
146
+ w.writeVarInt(obj.payloadLength);
147
+ w.writeBytes(obj.payload);
148
+ }
149
+ }
150
+ return w.finish();
151
+ }
152
+
153
+ /**
154
+ * Decode a subgroup data stream from raw bytes.
155
+ * Accepts types 0x10-0x15 and 0x18-0x1D. Delta-decodes Object IDs.
156
+ */
157
+ export function decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream> {
158
+ try {
159
+ const r = new BufferReader(bytes);
160
+ const streamType = Number(r.readVarInt());
161
+
162
+ if (!isValidSubgroupType(streamType)) {
163
+ return {
164
+ ok: false,
165
+ error: new DecodeError(
166
+ "CONSTRAINT_VIOLATION",
167
+ `Expected subgroup stream type 0x10-0x1D, got 0x${streamType.toString(16)}`,
168
+ 0,
169
+ ),
170
+ };
171
+ }
172
+
173
+ // Decode type flags
174
+ const extensionsPresent = (streamType & 0x01) !== 0;
175
+ const hasSubgroupField = (streamType & 0x04) !== 0;
176
+ const subgroupIsFirstObjId = (streamType & 0x02) !== 0 && !hasSubgroupField;
177
+
178
+ const trackAlias = r.readVarInt();
179
+ const groupId = r.readVarInt();
180
+
181
+ let subgroupId = 0n;
182
+ if (hasSubgroupField) {
183
+ subgroupId = r.readVarInt();
184
+ }
185
+ const publisherPriority = r.readUint8();
186
+
187
+ const objects: ObjectPayload[] = [];
188
+ let prevObjectId = -1n;
189
+ let firstObject = true;
190
+
191
+ while (r.remaining > 0) {
192
+ const byteOffset = r.offset;
193
+ const delta = r.readVarInt();
194
+ let objectId: bigint;
195
+ if (firstObject) {
196
+ objectId = delta;
197
+ if (subgroupIsFirstObjId) {
198
+ subgroupId = objectId;
199
+ }
200
+ firstObject = false;
201
+ } else {
202
+ objectId = prevObjectId + 1n + delta;
203
+ }
204
+
205
+ // Read extension headers if type indicates they're present
206
+ let extensionData = new Uint8Array(0);
207
+ if (extensionsPresent) {
208
+ const extLen = Number(r.readVarInt());
209
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
210
+ }
211
+
212
+ const payloadLength = Number(r.readVarInt());
213
+ let payload: Uint8Array;
214
+ let status: bigint | undefined;
215
+ let payloadByteOffset: number;
216
+ if (payloadLength === 0) {
217
+ status = r.readVarInt();
218
+ payloadByteOffset = r.offset;
219
+ payload = new Uint8Array(0);
220
+ } else {
221
+ payloadByteOffset = r.offset;
222
+ payload = r.readBytesView(payloadLength);
223
+ }
224
+ const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
225
+ if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
226
+ objects.push(obj);
227
+ prevObjectId = objectId;
228
+ }
229
+
230
+ return {
231
+ ok: true,
232
+ value: {
233
+ type: "subgroup",
234
+ headerType: streamType,
235
+ trackAlias,
236
+ groupId,
237
+ subgroupId,
238
+ publisherPriority,
239
+ objects,
240
+ },
241
+ bytesRead: r.offset,
242
+ };
243
+ } catch (e) {
244
+ if (e instanceof DecodeError) return { ok: false, error: e };
245
+ throw e;
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Decode a datagram object from raw bytes.
251
+ * Accepts types 0x00-0x07 and 0x20-0x21.
252
+ */
253
+ export function decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject> {
254
+ try {
255
+ const r = new BufferReader(bytes);
256
+ const dgType = Number(r.readVarInt());
257
+
258
+ // Validate datagram type
259
+ const validDatagram = (dgType >= 0x00 && dgType <= 0x07) || dgType === 0x20 || dgType === 0x21;
260
+ if (!validDatagram) {
261
+ return {
262
+ ok: false,
263
+ error: new DecodeError(
264
+ "CONSTRAINT_VIOLATION",
265
+ `Expected datagram type 0x00-0x07 or 0x20-0x21, got 0x${dgType.toString(16)}`,
266
+ 0,
267
+ ),
268
+ };
269
+ }
270
+
271
+ const objectIdPresent = (dgType & 0x04) === 0;
272
+ const endOfGroup = (dgType & 0x02) !== 0;
273
+ const extensionsPresent = (dgType & 0x01) !== 0;
274
+ const isStatus = dgType >= 0x20;
275
+
276
+ const trackAlias = r.readVarInt();
277
+ const groupId = r.readVarInt();
278
+ let objectId = 0n;
279
+ if (objectIdPresent) {
280
+ objectId = r.readVarInt();
281
+ }
282
+ const publisherPriority = r.readUint8();
283
+
284
+ if (extensionsPresent) {
285
+ const extLen = Number(r.readVarInt());
286
+ if (extLen > 0) {
287
+ r.readBytesView(extLen); // skip extension data
288
+ }
289
+ }
290
+
291
+ let objectStatus: bigint | undefined;
292
+ let payload: Uint8Array;
293
+ if (isStatus) {
294
+ objectStatus = r.readVarInt();
295
+ payload = new Uint8Array(0);
296
+ } else {
297
+ payload = r.readBytesView(r.remaining);
298
+ }
299
+ const payloadLength = payload.byteLength;
300
+
301
+ const result: DatagramObject = {
302
+ type: "datagram",
303
+ datagramType: dgType,
304
+ trackAlias,
305
+ groupId,
306
+ objectId,
307
+ publisherPriority,
308
+ payloadLength,
309
+ payload,
310
+ };
311
+
312
+ if (endOfGroup) (result as unknown as Record<string, unknown>).endOfGroup = true;
313
+ if (objectStatus !== undefined)
314
+ (result as unknown as Record<string, unknown>).objectStatus = objectStatus;
315
+
316
+ return { ok: true, value: result, bytesRead: r.offset };
317
+ } catch (e) {
318
+ if (e instanceof DecodeError) return { ok: false, error: e };
319
+ throw e;
320
+ }
321
+ }
322
+
323
+ /**
324
+ * Decode a fetch data stream from raw bytes.
325
+ * Draft-14 fetch: type 0x05, per-object has all fields (no serialization flags).
326
+ */
327
+ export function decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream> {
328
+ try {
329
+ const r = new BufferReader(bytes);
330
+ const streamType = r.readVarInt();
331
+ if (streamType !== FETCH_STREAM_TYPE) {
332
+ return {
333
+ ok: false,
334
+ error: new DecodeError(
335
+ "CONSTRAINT_VIOLATION",
336
+ `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
337
+ 0,
338
+ ),
339
+ };
340
+ }
341
+ const requestId = r.readVarInt();
342
+ const objects: FetchObjectPayload[] = [];
343
+ while (r.remaining > 0) {
344
+ const byteOffset = r.offset;
345
+ const groupId = r.readVarInt();
346
+ const subgroupId = r.readVarInt();
347
+ const objectId = r.readVarInt();
348
+ const publisherPriority = r.readUint8();
349
+ // Extension headers
350
+ const extLen = Number(r.readVarInt());
351
+ const extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
352
+ const payloadLength = Number(r.readVarInt());
353
+ let payload: Uint8Array;
354
+ let status: bigint | undefined;
355
+ let payloadByteOffset: number;
356
+ if (payloadLength === 0) {
357
+ status = r.readVarInt();
358
+ payloadByteOffset = r.offset;
359
+ payload = new Uint8Array(0);
360
+ } else {
361
+ payloadByteOffset = r.offset;
362
+ payload = r.readBytesView(payloadLength);
363
+ }
364
+ const obj: FetchObjectPayload = {
365
+ type: "object",
366
+ byteOffset,
367
+ payloadByteOffset,
368
+ groupId,
369
+ subgroupId,
370
+ objectId,
371
+ publisherPriority,
372
+ payloadLength,
373
+ payload,
374
+ extensionData,
375
+ };
376
+ if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
377
+ objects.push(obj);
378
+ }
379
+ return {
380
+ ok: true,
381
+ value: { type: "fetch", requestId, objects },
382
+ bytesRead: r.offset,
383
+ };
384
+ } catch (e) {
385
+ if (e instanceof DecodeError) return { ok: false, error: e };
386
+ throw e;
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Decode a data stream, dispatching by stream type.
392
+ */
393
+ export function decodeDataStream(
394
+ streamType: "subgroup" | "datagram" | "fetch",
395
+ bytes: Uint8Array,
396
+ ): DecodeResult<Draft14DataStream> {
397
+ switch (streamType) {
398
+ case "subgroup":
399
+ return decodeSubgroupStream(bytes);
400
+ case "datagram":
401
+ return decodeDatagram(bytes);
402
+ case "fetch":
403
+ return decodeFetchStream(bytes);
404
+ default: {
405
+ const _exhaustive: never = streamType;
406
+ throw new Error(`Unknown stream type: ${_exhaustive}`);
407
+ }
408
+ }
409
+ }
410
+
411
+ // ─── Data Stream Decoders ──────────────────────────────────────────────────────
412
+
413
+ /**
414
+ * Create a TransformStream that decodes a subgroup data stream.
415
+ * First emits a SubgroupStreamHeader, then emits ObjectPayload events.
416
+ * Accepts types 0x10-0x1D. Delta-decodes Object IDs.
417
+ */
418
+ export function createSubgroupStreamDecoder(): TransformStream<
419
+ Uint8Array,
420
+ SubgroupStreamHeader | ObjectPayload
421
+ > {
422
+ let buffer = new Uint8Array(0);
423
+ let offset = 0;
424
+ let headerEmitted = false;
425
+ let extensionsPresent = false;
426
+ let prevObjectId = -1n;
427
+ let firstObject = true;
428
+
429
+ return new TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>({
430
+ transform(chunk, controller) {
431
+ if (offset > 0) {
432
+ buffer = buffer.subarray(offset);
433
+ offset = 0;
434
+ }
435
+ const newBuffer = new Uint8Array(buffer.length + chunk.length);
436
+ newBuffer.set(buffer, 0);
437
+ newBuffer.set(chunk, buffer.length);
438
+ buffer = newBuffer;
439
+
440
+ if (!headerEmitted) {
441
+ try {
442
+ const r = new BufferReader(buffer.subarray(offset));
443
+ const streamType = Number(r.readVarInt());
444
+ if (!isValidSubgroupType(streamType)) {
445
+ controller.error(
446
+ new DecodeError(
447
+ "CONSTRAINT_VIOLATION",
448
+ `Expected subgroup stream type 0x10-0x1D, got 0x${streamType.toString(16)}`,
449
+ 0,
450
+ ),
451
+ );
452
+ return;
453
+ }
454
+ extensionsPresent = (streamType & 0x01) !== 0;
455
+ const hasSubgroupField = (streamType & 0x04) !== 0;
456
+ const trackAlias = r.readVarInt();
457
+ const groupId = r.readVarInt();
458
+ let subgroupId = 0n;
459
+ if (hasSubgroupField) {
460
+ subgroupId = r.readVarInt();
461
+ }
462
+ const publisherPriority = r.readUint8();
463
+
464
+ controller.enqueue({
465
+ type: "subgroup_header",
466
+ headerType: streamType,
467
+ trackAlias,
468
+ groupId,
469
+ subgroupId,
470
+ publisherPriority,
471
+ });
472
+ headerEmitted = true;
473
+ offset += r.offset;
474
+ } catch (e) {
475
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
476
+ return;
477
+ }
478
+ controller.error(e);
479
+ return;
480
+ }
481
+ }
482
+
483
+ while (offset < buffer.length) {
484
+ try {
485
+ const r = new BufferReader(buffer.subarray(offset));
486
+ const byteOffset = r.offset;
487
+ const delta = r.readVarInt();
488
+ const objectId = firstObject ? delta : prevObjectId + 1n + delta;
489
+ firstObject = false;
490
+
491
+ let extensionData = new Uint8Array(0);
492
+ if (extensionsPresent) {
493
+ const extLen = Number(r.readVarInt());
494
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
495
+ }
496
+
497
+ const payloadLength = Number(r.readVarInt());
498
+ let payload: Uint8Array;
499
+ let status: bigint | undefined;
500
+ let payloadByteOffset: number;
501
+ if (payloadLength === 0) {
502
+ status = r.readVarInt();
503
+ payloadByteOffset = r.offset;
504
+ payload = new Uint8Array(0);
505
+ } else {
506
+ payloadByteOffset = r.offset;
507
+ payload = r.readBytesView(payloadLength);
508
+ }
509
+ const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
510
+ if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
511
+ controller.enqueue(obj);
512
+ prevObjectId = objectId;
513
+ offset += r.offset;
514
+ } catch (e) {
515
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
516
+ break;
517
+ }
518
+ controller.error(e);
519
+ return;
520
+ }
521
+ }
522
+ },
523
+
524
+ flush(controller) {
525
+ if (offset < buffer.length) {
526
+ controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
527
+ }
528
+ },
529
+ });
530
+ }
531
+
532
+ /**
533
+ * Create a TransformStream that decodes a fetch data stream.
534
+ * First emits a FetchStreamHeader, then emits FetchObjectPayload events.
535
+ * Draft-14 fetch: type 0x05, per-object has all fields.
536
+ */
537
+ export function createFetchStreamDecoder(): TransformStream<
538
+ Uint8Array,
539
+ FetchStreamHeader | ObjectPayload
540
+ > {
541
+ let buffer = new Uint8Array(0);
542
+ let offset = 0;
543
+ let headerEmitted = false;
544
+
545
+ return new TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>({
546
+ transform(chunk, controller) {
547
+ if (offset > 0) {
548
+ buffer = buffer.subarray(offset);
549
+ offset = 0;
550
+ }
551
+ const newBuffer = new Uint8Array(buffer.length + chunk.length);
552
+ newBuffer.set(buffer, 0);
553
+ newBuffer.set(chunk, buffer.length);
554
+ buffer = newBuffer;
555
+
556
+ if (!headerEmitted) {
557
+ try {
558
+ const r = new BufferReader(buffer.subarray(offset));
559
+ const streamType = r.readVarInt();
560
+ if (streamType !== FETCH_STREAM_TYPE) {
561
+ controller.error(
562
+ new DecodeError(
563
+ "CONSTRAINT_VIOLATION",
564
+ `Expected fetch stream type 0x05, got 0x${streamType.toString(16)}`,
565
+ 0,
566
+ ),
567
+ );
568
+ return;
569
+ }
570
+ const requestId = r.readVarInt();
571
+
572
+ controller.enqueue({ type: "fetch_header", requestId });
573
+ headerEmitted = true;
574
+ offset += r.offset;
575
+ } catch (e) {
576
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
577
+ return;
578
+ }
579
+ controller.error(e);
580
+ return;
581
+ }
582
+ }
583
+
584
+ while (offset < buffer.length) {
585
+ try {
586
+ const r = new BufferReader(buffer.subarray(offset));
587
+ const byteOffset = r.offset;
588
+ const groupId = r.readVarInt();
589
+ const subgroupId = r.readVarInt();
590
+ const objectId = r.readVarInt();
591
+ const publisherPriority = r.readUint8();
592
+ const extLen = Number(r.readVarInt());
593
+ const extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
594
+ const payloadLength = Number(r.readVarInt());
595
+ let payload: Uint8Array;
596
+ let status: bigint | undefined;
597
+ let payloadByteOffset: number;
598
+ if (payloadLength === 0) {
599
+ status = r.readVarInt();
600
+ payloadByteOffset = r.offset;
601
+ payload = new Uint8Array(0);
602
+ } else {
603
+ payloadByteOffset = r.offset;
604
+ payload = r.readBytesView(payloadLength);
605
+ }
606
+ const obj: FetchObjectPayload = {
607
+ type: "object",
608
+ byteOffset,
609
+ payloadByteOffset,
610
+ groupId,
611
+ subgroupId,
612
+ objectId,
613
+ publisherPriority,
614
+ payloadLength,
615
+ payload,
616
+ extensionData,
617
+ };
618
+ if (status !== undefined) (obj as unknown as Record<string, unknown>).status = status;
619
+ controller.enqueue(obj);
620
+ offset += r.offset;
621
+ } catch (e) {
622
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
623
+ break;
624
+ }
625
+ controller.error(e);
626
+ return;
627
+ }
628
+ }
629
+ },
630
+
631
+ flush(controller) {
632
+ if (offset < buffer.length) {
633
+ controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
634
+ }
635
+ },
636
+ });
637
+ }
638
+
639
+ /**
640
+ * Create a unified auto-detecting data stream decoder.
641
+ * Reads the stream type varint: 0x10-0x1D = subgroup, 0x05 = fetch.
642
+ */
643
+ export function createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent> {
644
+ let buffer = new Uint8Array(0);
645
+ let offset = 0;
646
+ let detectedType: "subgroup" | "fetch" | null = null;
647
+ let headerEmitted = false;
648
+ let extensionsPresent = false;
649
+ let prevObjectId = -1n;
650
+ let firstObject = true;
651
+
652
+ return new TransformStream<Uint8Array, DataStreamEvent>({
653
+ transform(chunk, controller) {
654
+ if (offset > 0) {
655
+ buffer = buffer.subarray(offset);
656
+ offset = 0;
657
+ }
658
+ const newBuffer = new Uint8Array(buffer.length + chunk.length);
659
+ newBuffer.set(buffer, 0);
660
+ newBuffer.set(chunk, buffer.length);
661
+ buffer = newBuffer;
662
+
663
+ if (detectedType === null) {
664
+ try {
665
+ const r = new BufferReader(buffer.subarray(offset));
666
+ const streamType = Number(r.readVarInt());
667
+ if (isValidSubgroupType(streamType)) {
668
+ detectedType = "subgroup";
669
+ } else if (streamType === 0x05) {
670
+ detectedType = "fetch";
671
+ } else {
672
+ controller.error(
673
+ new DecodeError(
674
+ "CONSTRAINT_VIOLATION",
675
+ `Unknown data stream type: 0x${streamType.toString(16)}`,
676
+ 0,
677
+ ),
678
+ );
679
+ return;
680
+ }
681
+ } catch (e) {
682
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
683
+ return;
684
+ }
685
+ controller.error(e);
686
+ return;
687
+ }
688
+ }
689
+
690
+ if (detectedType === "subgroup") {
691
+ if (!headerEmitted) {
692
+ try {
693
+ const r = new BufferReader(buffer.subarray(offset));
694
+ const streamType = Number(r.readVarInt());
695
+ extensionsPresent = (streamType & 0x01) !== 0;
696
+ const hasSubgroupField = (streamType & 0x04) !== 0;
697
+ const trackAlias = r.readVarInt();
698
+ const groupId = r.readVarInt();
699
+ let subgroupId = 0n;
700
+ if (hasSubgroupField) subgroupId = r.readVarInt();
701
+ const publisherPriority = r.readUint8();
702
+ controller.enqueue({
703
+ type: "subgroup_header",
704
+ headerType: streamType,
705
+ trackAlias,
706
+ groupId,
707
+ subgroupId,
708
+ publisherPriority,
709
+ });
710
+ headerEmitted = true;
711
+ offset += r.offset;
712
+ } catch (e) {
713
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") return;
714
+ controller.error(e);
715
+ return;
716
+ }
717
+ }
718
+
719
+ while (offset < buffer.length) {
720
+ try {
721
+ const r = new BufferReader(buffer.subarray(offset));
722
+ const byteOffset = r.offset;
723
+ const delta = r.readVarInt();
724
+ const objectId = firstObject ? delta : prevObjectId + 1n + delta;
725
+ firstObject = false;
726
+ let extensionData = new Uint8Array(0);
727
+ if (extensionsPresent) {
728
+ const extLen = Number(r.readVarInt());
729
+ extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
730
+ }
731
+ const payloadLength = Number(r.readVarInt());
732
+ let payload: Uint8Array;
733
+ let status: bigint | undefined;
734
+ let payloadByteOffset: number;
735
+ if (payloadLength === 0) {
736
+ status = r.readVarInt();
737
+ payloadByteOffset = r.offset;
738
+ payload = new Uint8Array(0);
739
+ } else {
740
+ payloadByteOffset = r.offset;
741
+ payload = r.readBytesView(payloadLength);
742
+ }
743
+ const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
744
+ if (status !== undefined)
745
+ (obj as unknown as Record<string, unknown>).status = status;
746
+ controller.enqueue(obj);
747
+ prevObjectId = objectId;
748
+ offset += r.offset;
749
+ } catch (e) {
750
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") break;
751
+ controller.error(e);
752
+ return;
753
+ }
754
+ }
755
+ } else {
756
+ if (!headerEmitted) {
757
+ try {
758
+ const r = new BufferReader(buffer.subarray(offset));
759
+ r.readVarInt(); // stream type (0x05)
760
+ const requestId = r.readVarInt();
761
+ controller.enqueue({ type: "fetch_header", requestId });
762
+ headerEmitted = true;
763
+ offset += r.offset;
764
+ } catch (e) {
765
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") return;
766
+ controller.error(e);
767
+ return;
768
+ }
769
+ }
770
+
771
+ while (offset < buffer.length) {
772
+ try {
773
+ const r = new BufferReader(buffer.subarray(offset));
774
+ const byteOffset = r.offset;
775
+ const groupId = r.readVarInt();
776
+ const subgroupId = r.readVarInt();
777
+ const objectId = r.readVarInt();
778
+ const publisherPriority = r.readUint8();
779
+ const extLen = Number(r.readVarInt());
780
+ const extensionData = extLen > 0 ? r.readBytesView(extLen) : new Uint8Array(0);
781
+ const payloadLength = Number(r.readVarInt());
782
+ let payload: Uint8Array;
783
+ let status: bigint | undefined;
784
+ let payloadByteOffset: number;
785
+ if (payloadLength === 0) {
786
+ status = r.readVarInt();
787
+ payloadByteOffset = r.offset;
788
+ payload = new Uint8Array(0);
789
+ } else {
790
+ payloadByteOffset = r.offset;
791
+ payload = r.readBytesView(payloadLength);
792
+ }
793
+ const obj: ObjectPayload = { type: "object", byteOffset, payloadByteOffset, objectId, payloadLength, payload, extensionData };
794
+ if (status !== undefined)
795
+ (obj as unknown as Record<string, unknown>).status = status;
796
+ controller.enqueue(obj);
797
+ offset += r.offset;
798
+ } catch (e) {
799
+ if (e instanceof DecodeError && e.code === "UNEXPECTED_END") break;
800
+ controller.error(e);
801
+ return;
802
+ }
803
+ }
804
+ }
805
+ },
806
+
807
+ flush(controller) {
808
+ if (offset < buffer.length) {
809
+ controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
810
+ }
811
+ },
812
+ });
813
+ }