@moqtap/codec 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (716) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +100 -99
  3. package/dist/{chunk-RZHAPEXO.js → chunk-2A57DRXV.js} +36 -10
  4. package/dist/{chunk-PJRA2TQ5.js → chunk-2UTVXWFF.js} +388 -254
  5. package/dist/{chunk-IV2H5CFI.cjs → chunk-3XKO6PCR.cjs} +461 -322
  6. package/dist/{chunk-RVJAGE4S.cjs → chunk-4BDEU3D4.cjs} +415 -304
  7. package/dist/{chunk-XUUCOLWU.cjs → chunk-4HBKHNU2.cjs} +374 -329
  8. package/dist/{chunk-4RIXXEII.js → chunk-4IVZZOY3.js} +451 -312
  9. package/dist/{chunk-ZSPO2GF2.cjs → chunk-5O764MBD.cjs} +1320 -842
  10. package/dist/chunk-7KBAWOBA.js +1212 -0
  11. package/dist/{chunk-JSQM2MG3.js → chunk-7QOPNSDF.js} +44 -12
  12. package/dist/{chunk-SYHW3FLI.cjs → chunk-7RE6KSIY.cjs} +28 -8
  13. package/dist/{chunk-YG5KJESI.js → chunk-AY6IAHUM.js} +28 -8
  14. package/dist/{chunk-EFM5T7OM.js → chunk-BLQDWOSG.js} +36 -10
  15. package/dist/{chunk-KFTCU2P6.js → chunk-C6KUWLQC.js} +0 -3
  16. package/dist/{chunk-UYXTY6ZQ.cjs → chunk-E65QKRSN.cjs} +20 -12
  17. package/dist/{chunk-BISI45MN.cjs → chunk-EAHE3IOG.cjs} +44 -12
  18. package/dist/{chunk-IV2HRJVT.js → chunk-GCBFHZW6.js} +405 -294
  19. package/dist/{chunk-GXEW4COZ.cjs → chunk-H5NSL4MO.cjs} +36 -10
  20. package/dist/chunk-HZHSO7EW.cjs +1212 -0
  21. package/dist/{chunk-BPNL5YFQ.cjs → chunk-IILNSDEQ.cjs} +74 -46
  22. package/dist/{chunk-4XYGE53S.cjs → chunk-J3XCPBW3.cjs} +36 -10
  23. package/dist/{chunk-6AEHWULA.cjs → chunk-JKOEJZ5B.cjs} +28 -8
  24. package/dist/{chunk-FWISIR26.cjs → chunk-JL3NEW3O.cjs} +47 -4
  25. package/dist/{chunk-G7GI7LJA.js → chunk-LORZMJJB.js} +36 -10
  26. package/dist/{chunk-DUBCL3WF.cjs → chunk-LV5C6MEC.cjs} +36 -10
  27. package/dist/{chunk-ENURAVHI.cjs → chunk-MYXAD5JC.cjs} +44 -12
  28. package/dist/{chunk-FXZ2MYKJ.js → chunk-MZ7HUCGJ.js} +20 -12
  29. package/dist/{chunk-RWQ43Z4F.cjs → chunk-MZ7VU52O.cjs} +0 -3
  30. package/dist/{chunk-G26SJ6XS.cjs → chunk-OKG2HT25.cjs} +1193 -928
  31. package/dist/{chunk-IBVM4DMJ.cjs → chunk-PKEOQSSZ.cjs} +374 -329
  32. package/dist/{chunk-LH4NTURO.js → chunk-Q46ZURKX.js} +989 -602
  33. package/dist/{chunk-UR6JKS56.js → chunk-Q7IGWV3P.js} +41 -9
  34. package/dist/{chunk-ST24APEO.js → chunk-RW4UG7CN.js} +751 -682
  35. package/dist/{chunk-DWK5ZQZ4.js → chunk-RZTLQAKF.js} +28 -8
  36. package/dist/{chunk-UNS34PTA.cjs → chunk-S6IPIN66.cjs} +44 -12
  37. package/dist/{chunk-K4OLITS2.cjs → chunk-SDWRXXOO.cjs} +401 -267
  38. package/dist/{chunk-CXDHOMHG.js → chunk-SHMA4PBY.js} +476 -431
  39. package/dist/{chunk-U2B3B42P.js → chunk-U3ZVLT5L.js} +1176 -540
  40. package/dist/{chunk-HSVYF6XX.cjs → chunk-UJU63EFY.cjs} +1524 -1137
  41. package/dist/{chunk-A27S7HW7.js → chunk-VOU7PNHI.js} +47 -4
  42. package/dist/{chunk-E6E3NQYU.js → chunk-WRHGCVYN.js} +44 -12
  43. package/dist/chunk-XNWYLVGU.cjs +1854 -0
  44. package/dist/{chunk-NUX5BHWO.js → chunk-XS77RBY7.js} +1160 -895
  45. package/dist/{chunk-4YJANAXU.cjs → chunk-XZE5R57R.cjs} +829 -760
  46. package/dist/{chunk-NGVE2RZT.js → chunk-Y6KCSM3V.js} +476 -431
  47. package/dist/{chunk-TLYNOOQP.cjs → chunk-YTPZZI2M.cjs} +41 -9
  48. package/dist/{chunk-7DUBLRXC.js → chunk-YWRCSQBA.js} +44 -12
  49. package/dist/{chunk-MFAP7R6L.js → chunk-Z3VKP3PJ.js} +70 -42
  50. package/dist/{chunk-ZBKE2QRQ.js → chunk-Z6U26IRI.js} +1107 -629
  51. package/dist/codec-25u4_1HS.d.ts +35 -0
  52. package/dist/codec-3Ppy_5Gd.d.ts +23 -0
  53. package/dist/codec-BB0U8MF2.d.cts +34 -0
  54. package/dist/codec-BHHfBTnV.d.ts +34 -0
  55. package/dist/codec-BN6jk0Td.d.cts +30 -0
  56. package/dist/codec-BU0gaSZm.d.ts +29 -0
  57. package/dist/codec-C-Yk2RNa.d.ts +30 -0
  58. package/dist/codec-CFWQY9Lj.d.cts +18 -0
  59. package/dist/codec-COy4uuPO.d.cts +29 -0
  60. package/dist/codec-CewFCsEy.d.ts +18 -0
  61. package/dist/codec-Ck7ZwFF1.d.cts +35 -0
  62. package/dist/codec-D2QVSH9D.d.ts +30 -0
  63. package/dist/codec-DDUBJGn0.d.cts +23 -0
  64. package/dist/codec-DNfml-se.d.ts +27 -0
  65. package/dist/codec-DoOGjjDq.d.cts +29 -0
  66. package/dist/codec-J7ekOSMc.d.ts +29 -0
  67. package/dist/codec-R9TJCq-E.d.cts +31 -0
  68. package/dist/codec-ZwV-Njt6.d.ts +23 -0
  69. package/dist/codec-j819z_hL.d.cts +23 -0
  70. package/dist/codec-w8z2j_uo.d.cts +27 -0
  71. package/dist/codec-wtt6WF1K.d.ts +31 -0
  72. package/dist/codec-z6_2PSzi.d.cts +30 -0
  73. package/dist/draft10-session.cjs +2 -2
  74. package/dist/draft10-session.d.cts +6 -6
  75. package/dist/draft10-session.d.ts +6 -6
  76. package/dist/draft10-session.js +1 -1
  77. package/dist/draft10.cjs +8 -4
  78. package/dist/draft10.d.cts +23 -11
  79. package/dist/draft10.d.ts +23 -11
  80. package/dist/draft10.js +16 -12
  81. package/dist/draft11-session.cjs +2 -2
  82. package/dist/draft11-session.d.cts +6 -6
  83. package/dist/draft11-session.d.ts +6 -6
  84. package/dist/draft11-session.js +1 -1
  85. package/dist/draft11.cjs +8 -4
  86. package/dist/draft11.d.cts +21 -11
  87. package/dist/draft11.d.ts +21 -11
  88. package/dist/draft11.js +16 -12
  89. package/dist/draft12-session.cjs +2 -2
  90. package/dist/draft12-session.d.cts +6 -6
  91. package/dist/draft12-session.d.ts +6 -6
  92. package/dist/draft12-session.js +1 -1
  93. package/dist/draft12.cjs +8 -4
  94. package/dist/draft12.d.cts +23 -13
  95. package/dist/draft12.d.ts +23 -13
  96. package/dist/draft12.js +16 -12
  97. package/dist/draft13-session.cjs +2 -2
  98. package/dist/draft13-session.d.cts +6 -6
  99. package/dist/draft13-session.d.ts +6 -6
  100. package/dist/draft13-session.js +1 -1
  101. package/dist/draft13.cjs +8 -4
  102. package/dist/draft13.d.cts +23 -13
  103. package/dist/draft13.d.ts +23 -13
  104. package/dist/draft13.js +16 -12
  105. package/dist/draft14-session.cjs +2 -2
  106. package/dist/draft14-session.d.cts +6 -6
  107. package/dist/draft14-session.d.ts +6 -6
  108. package/dist/draft14-session.js +1 -1
  109. package/dist/draft14.cjs +14 -4
  110. package/dist/draft14.d.cts +67 -11
  111. package/dist/draft14.d.ts +67 -11
  112. package/dist/draft14.js +13 -3
  113. package/dist/draft15-session.cjs +2 -2
  114. package/dist/draft15-session.d.cts +6 -6
  115. package/dist/draft15-session.d.ts +6 -6
  116. package/dist/draft15-session.js +1 -1
  117. package/dist/draft15.cjs +8 -4
  118. package/dist/draft15.d.cts +56 -11
  119. package/dist/draft15.d.ts +56 -11
  120. package/dist/draft15.js +16 -12
  121. package/dist/draft16-session.cjs +2 -2
  122. package/dist/draft16-session.d.cts +6 -6
  123. package/dist/draft16-session.d.ts +6 -6
  124. package/dist/draft16-session.js +1 -1
  125. package/dist/draft16.cjs +8 -4
  126. package/dist/draft16.d.cts +45 -11
  127. package/dist/draft16.d.ts +45 -11
  128. package/dist/draft16.js +16 -12
  129. package/dist/draft17-session.cjs +2 -2
  130. package/dist/draft17-session.d.cts +7 -7
  131. package/dist/draft17-session.d.ts +7 -7
  132. package/dist/draft17-session.js +1 -1
  133. package/dist/draft17.cjs +8 -4
  134. package/dist/draft17.d.cts +21 -8
  135. package/dist/draft17.d.ts +21 -8
  136. package/dist/draft17.js +16 -12
  137. package/dist/draft7-session.cjs +3 -3
  138. package/dist/draft7-session.d.cts +6 -5
  139. package/dist/draft7-session.d.ts +6 -5
  140. package/dist/draft7-session.js +2 -2
  141. package/dist/draft7.cjs +83 -14
  142. package/dist/draft7.d.cts +59 -64
  143. package/dist/draft7.d.ts +59 -64
  144. package/dist/draft7.js +89 -20
  145. package/dist/draft8-session.cjs +2 -2
  146. package/dist/draft8-session.d.cts +6 -6
  147. package/dist/draft8-session.d.ts +6 -6
  148. package/dist/draft8-session.js +1 -1
  149. package/dist/draft8.cjs +8 -4
  150. package/dist/draft8.d.cts +23 -11
  151. package/dist/draft8.d.ts +23 -11
  152. package/dist/draft8.js +7 -3
  153. package/dist/draft9-session.cjs +2 -2
  154. package/dist/draft9-session.d.cts +6 -6
  155. package/dist/draft9-session.d.ts +6 -6
  156. package/dist/draft9-session.js +1 -1
  157. package/dist/draft9.cjs +8 -4
  158. package/dist/draft9.d.cts +23 -11
  159. package/dist/draft9.d.ts +23 -11
  160. package/dist/draft9.js +7 -3
  161. package/dist/index.cjs +52 -73
  162. package/dist/index.d.cts +41 -60
  163. package/dist/index.d.ts +55 -82
  164. package/dist/index.js +89 -93
  165. package/dist/{session-types-CJIFbTPd.d.ts → session-types-C7UONex5.d.cts} +28 -27
  166. package/dist/{session-types-Cbq8IGCP.d.cts → session-types-X-IYEGoG.d.ts} +28 -27
  167. package/dist/session.cjs +47 -14
  168. package/dist/session.d.cts +28 -9
  169. package/dist/session.d.ts +32 -9
  170. package/dist/session.js +59 -32
  171. package/dist/{types-4VxSL2Ho.d.ts → types--Q7_DcvP.d.cts} +49 -39
  172. package/dist/{types-4VxSL2Ho.d.cts → types--Q7_DcvP.d.ts} +49 -39
  173. package/dist/{types-Cw4WE9dh.d.ts → types-0IWbU9Z_.d.cts} +44 -36
  174. package/dist/{types-Cw4WE9dh.d.cts → types-0IWbU9Z_.d.ts} +44 -36
  175. package/dist/{types-D5gNQiDj.d.ts → types-B3g5G9KP.d.cts} +44 -36
  176. package/dist/{types-D5gNQiDj.d.cts → types-B3g5G9KP.d.ts} +44 -36
  177. package/dist/{types-B2afJZM-.d.cts → types-BFpFNM_m.d.cts} +60 -32
  178. package/dist/{types-B2afJZM-.d.ts → types-BFpFNM_m.d.ts} +60 -32
  179. package/dist/{types-ERexTpT8.d.ts → types-Br7fm2mf.d.cts} +51 -26
  180. package/dist/{types-ERexTpT8.d.cts → types-Br7fm2mf.d.ts} +51 -26
  181. package/dist/{types-Bg6QYNVt.d.cts → types-C2qKTRR_.d.cts} +55 -45
  182. package/dist/{types-Bg6QYNVt.d.ts → types-C2qKTRR_.d.ts} +55 -45
  183. package/dist/{types-BTFeKYCb.d.ts → types-DEaypVsD.d.cts} +133 -58
  184. package/dist/{types-BTFeKYCb.d.cts → types-DEaypVsD.d.ts} +133 -58
  185. package/dist/types-Dl4IaAHR.d.cts +282 -0
  186. package/dist/types-Dl4IaAHR.d.ts +282 -0
  187. package/dist/{types-C_1HrqBl.d.cts → types-DrQpTW1G.d.cts} +63 -50
  188. package/dist/{types-C_1HrqBl.d.ts → types-DrQpTW1G.d.ts} +63 -50
  189. package/dist/types-DuIO7cWK.d.cts +25 -0
  190. package/dist/types-DuIO7cWK.d.ts +25 -0
  191. package/dist/{types-DqCDFqgB.d.ts → types-DuxfOYiO.d.cts} +50 -31
  192. package/dist/{types-DqCDFqgB.d.cts → types-DuxfOYiO.d.ts} +50 -31
  193. package/dist/{types-r-CasCf1.d.cts → types-jV1yDDBA.d.cts} +43 -36
  194. package/dist/{types-r-CasCf1.d.ts → types-jV1yDDBA.d.ts} +43 -36
  195. package/package.json +15 -15
  196. package/src/core/buffer-reader.ts +69 -53
  197. package/src/core/buffer-writer.ts +55 -46
  198. package/src/core/errors.ts +1 -1
  199. package/src/core/hex.ts +21 -17
  200. package/src/core/session-types.ts +61 -59
  201. package/src/core/types.ts +18 -361
  202. package/src/drafts/draft07/codec.ts +1058 -933
  203. package/src/drafts/draft07/data-streams.ts +116 -116
  204. package/src/drafts/draft07/index.ts +124 -89
  205. package/src/drafts/draft07/messages.ts +76 -42
  206. package/src/drafts/draft07/rules.ts +107 -101
  207. package/src/drafts/draft07/session-fsm.ts +315 -287
  208. package/src/drafts/draft07/session.ts +8 -6
  209. package/src/drafts/draft07/types.ts +406 -72
  210. package/src/drafts/draft07/varint.ts +40 -12
  211. package/src/drafts/draft08/codec.ts +985 -944
  212. package/src/drafts/draft08/data-streams.ts +178 -174
  213. package/src/drafts/draft08/index.ts +10 -9
  214. package/src/drafts/draft08/messages.ts +59 -59
  215. package/src/drafts/draft08/rules.ts +73 -73
  216. package/src/drafts/draft08/session-fsm.ts +335 -303
  217. package/src/drafts/draft08/session.ts +6 -7
  218. package/src/drafts/draft08/types.ts +380 -384
  219. package/src/drafts/draft09/codec.ts +977 -936
  220. package/src/drafts/draft09/data-streams.ts +163 -159
  221. package/src/drafts/draft09/index.ts +10 -9
  222. package/src/drafts/draft09/messages.ts +59 -59
  223. package/src/drafts/draft09/rules.ts +73 -73
  224. package/src/drafts/draft09/session-fsm.ts +335 -303
  225. package/src/drafts/draft09/session.ts +6 -7
  226. package/src/drafts/draft09/types.ts +380 -384
  227. package/src/drafts/draft10/codec.ts +977 -936
  228. package/src/drafts/draft10/data-streams.ts +163 -159
  229. package/src/drafts/draft10/index.ts +10 -9
  230. package/src/drafts/draft10/messages.ts +59 -59
  231. package/src/drafts/draft10/rules.ts +73 -73
  232. package/src/drafts/draft10/session-fsm.ts +335 -303
  233. package/src/drafts/draft10/session.ts +6 -7
  234. package/src/drafts/draft10/types.ts +380 -384
  235. package/src/drafts/draft11/codec.ts +1054 -979
  236. package/src/drafts/draft11/data-streams.ts +189 -142
  237. package/src/drafts/draft11/index.ts +10 -9
  238. package/src/drafts/draft11/messages.ts +60 -59
  239. package/src/drafts/draft11/rules.ts +73 -73
  240. package/src/drafts/draft11/session-fsm.ts +359 -333
  241. package/src/drafts/draft11/session.ts +6 -7
  242. package/src/drafts/draft11/types.ts +385 -381
  243. package/src/drafts/draft12/codec.ts +1178 -1113
  244. package/src/drafts/draft12/data-streams.ts +192 -143
  245. package/src/drafts/draft12/index.ts +10 -9
  246. package/src/drafts/draft12/messages.ts +67 -66
  247. package/src/drafts/draft12/rules.ts +79 -79
  248. package/src/drafts/draft12/session-fsm.ts +384 -358
  249. package/src/drafts/draft12/session.ts +6 -7
  250. package/src/drafts/draft12/types.ts +424 -419
  251. package/src/drafts/draft13/codec.ts +1296 -1197
  252. package/src/drafts/draft13/data-streams.ts +194 -143
  253. package/src/drafts/draft13/index.ts +10 -9
  254. package/src/drafts/draft13/messages.ts +73 -68
  255. package/src/drafts/draft13/rules.ts +81 -81
  256. package/src/drafts/draft13/session-fsm.ts +392 -366
  257. package/src/drafts/draft13/session.ts +6 -7
  258. package/src/drafts/draft13/types.ts +447 -438
  259. package/src/drafts/draft14/codec.ts +1347 -1034
  260. package/src/drafts/draft14/data-streams.ts +429 -396
  261. package/src/drafts/draft14/index.ts +17 -9
  262. package/src/drafts/draft14/messages.ts +65 -65
  263. package/src/drafts/draft14/rules.ts +81 -81
  264. package/src/drafts/draft14/session-fsm.ts +415 -405
  265. package/src/drafts/draft14/session.ts +6 -7
  266. package/src/drafts/draft14/types.ts +451 -381
  267. package/src/drafts/draft15/codec.ts +1138 -969
  268. package/src/drafts/draft15/data-streams.ts +428 -364
  269. package/src/drafts/draft15/index.ts +10 -9
  270. package/src/drafts/draft15/messages.ts +54 -53
  271. package/src/drafts/draft15/rules.ts +67 -67
  272. package/src/drafts/draft15/session-fsm.ts +319 -299
  273. package/src/drafts/draft15/session.ts +6 -7
  274. package/src/drafts/draft15/types.ts +357 -339
  275. package/src/drafts/draft16/codec.ts +1242 -957
  276. package/src/drafts/draft16/data-streams.ts +433 -371
  277. package/src/drafts/draft16/index.ts +10 -9
  278. package/src/drafts/draft16/messages.ts +56 -55
  279. package/src/drafts/draft16/rules.ts +69 -69
  280. package/src/drafts/draft16/session-fsm.ts +319 -299
  281. package/src/drafts/draft16/session.ts +6 -7
  282. package/src/drafts/draft16/types.ts +386 -357
  283. package/src/drafts/draft17/codec.ts +1209 -962
  284. package/src/drafts/draft17/data-streams.ts +593 -366
  285. package/src/drafts/draft17/index.ts +9 -7
  286. package/src/drafts/draft17/messages.ts +43 -42
  287. package/src/drafts/draft17/rules.ts +58 -58
  288. package/src/drafts/draft17/session-fsm.ts +248 -216
  289. package/src/drafts/draft17/session.ts +5 -5
  290. package/src/drafts/draft17/types.ts +337 -313
  291. package/src/index.ts +85 -274
  292. package/src/session.ts +62 -23
  293. package/dist/chunk-7IVGHMKJ.cjs +0 -866
  294. package/dist/chunk-FUFTMAQD.cjs +0 -1218
  295. package/dist/chunk-TMNGRIPL.js +0 -866
  296. package/dist/codec-95k8CAu5.d.cts +0 -35
  297. package/dist/codec-AFuOxfsO.d.ts +0 -60
  298. package/dist/codec-B-UJ5Iow.d.cts +0 -75
  299. package/dist/codec-BC5jfvMb.d.ts +0 -35
  300. package/dist/codec-BECYPfY8.d.ts +0 -35
  301. package/dist/codec-BsPU1vNC.d.ts +0 -39
  302. package/dist/codec-BvpuF-6u.d.cts +0 -39
  303. package/dist/codec-C8jZI5Cx.d.cts +0 -39
  304. package/dist/codec-CAevkgf5.d.cts +0 -33
  305. package/dist/codec-CSUqCrRs.d.ts +0 -39
  306. package/dist/codec-C_HMXNK_.d.ts +0 -33
  307. package/dist/codec-CpuvYTSV.d.cts +0 -86
  308. package/dist/codec-D0x8-SCw.d.cts +0 -35
  309. package/dist/codec-D7ARhpG1.d.ts +0 -75
  310. package/dist/codec-DNAUGshO.d.cts +0 -60
  311. package/dist/codec-DPx_QNn0.d.ts +0 -31
  312. package/dist/codec-DRhCx_hw.d.ts +0 -86
  313. package/dist/codec-Db7YPe3l.d.ts +0 -31
  314. package/dist/codec-axkJpb7D.d.cts +0 -31
  315. package/dist/codec-ujAbFaep.d.cts +0 -31
  316. package/dist/core/buffer-reader.d.ts +0 -15
  317. package/dist/core/buffer-reader.d.ts.map +0 -1
  318. package/dist/core/buffer-reader.js +0 -98
  319. package/dist/core/buffer-reader.js.map +0 -1
  320. package/dist/core/buffer-writer.d.ts +0 -16
  321. package/dist/core/buffer-writer.d.ts.map +0 -1
  322. package/dist/core/buffer-writer.js +0 -86
  323. package/dist/core/buffer-writer.js.map +0 -1
  324. package/dist/core/errors.d.ts +0 -2
  325. package/dist/core/errors.d.ts.map +0 -1
  326. package/dist/core/errors.js +0 -2
  327. package/dist/core/errors.js.map +0 -1
  328. package/dist/core/hex.d.ts +0 -5
  329. package/dist/core/hex.d.ts.map +0 -1
  330. package/dist/core/hex.js +0 -17
  331. package/dist/core/hex.js.map +0 -1
  332. package/dist/core/session-types.d.ts +0 -99
  333. package/dist/core/session-types.d.ts.map +0 -1
  334. package/dist/core/session-types.js +0 -2
  335. package/dist/core/session-types.js.map +0 -1
  336. package/dist/core/types.d.ts +0 -235
  337. package/dist/core/types.d.ts.map +0 -1
  338. package/dist/core/types.js +0 -11
  339. package/dist/core/types.js.map +0 -1
  340. package/dist/drafts/draft07/announce-fsm.d.ts +0 -2
  341. package/dist/drafts/draft07/announce-fsm.d.ts.map +0 -1
  342. package/dist/drafts/draft07/announce-fsm.js +0 -2
  343. package/dist/drafts/draft07/announce-fsm.js.map +0 -1
  344. package/dist/drafts/draft07/codec.d.ts +0 -17
  345. package/dist/drafts/draft07/codec.d.ts.map +0 -1
  346. package/dist/drafts/draft07/codec.js +0 -722
  347. package/dist/drafts/draft07/codec.js.map +0 -1
  348. package/dist/drafts/draft07/data-streams.d.ts +0 -9
  349. package/dist/drafts/draft07/data-streams.d.ts.map +0 -1
  350. package/dist/drafts/draft07/data-streams.js +0 -228
  351. package/dist/drafts/draft07/data-streams.js.map +0 -1
  352. package/dist/drafts/draft07/index.d.ts +0 -14
  353. package/dist/drafts/draft07/index.d.ts.map +0 -1
  354. package/dist/drafts/draft07/index.js +0 -18
  355. package/dist/drafts/draft07/index.js.map +0 -1
  356. package/dist/drafts/draft07/messages.d.ts +0 -32
  357. package/dist/drafts/draft07/messages.d.ts.map +0 -1
  358. package/dist/drafts/draft07/messages.js +0 -42
  359. package/dist/drafts/draft07/messages.js.map +0 -1
  360. package/dist/drafts/draft07/parameters.d.ts +0 -4
  361. package/dist/drafts/draft07/parameters.d.ts.map +0 -1
  362. package/dist/drafts/draft07/parameters.js +0 -10
  363. package/dist/drafts/draft07/parameters.js.map +0 -1
  364. package/dist/drafts/draft07/rules.d.ts +0 -8
  365. package/dist/drafts/draft07/rules.d.ts.map +0 -1
  366. package/dist/drafts/draft07/rules.js +0 -95
  367. package/dist/drafts/draft07/rules.js.map +0 -1
  368. package/dist/drafts/draft07/session-fsm.d.ts +0 -38
  369. package/dist/drafts/draft07/session-fsm.d.ts.map +0 -1
  370. package/dist/drafts/draft07/session-fsm.js +0 -354
  371. package/dist/drafts/draft07/session-fsm.js.map +0 -1
  372. package/dist/drafts/draft07/session.d.ts +0 -4
  373. package/dist/drafts/draft07/session.d.ts.map +0 -1
  374. package/dist/drafts/draft07/session.js +0 -5
  375. package/dist/drafts/draft07/session.js.map +0 -1
  376. package/dist/drafts/draft07/subscription-fsm.d.ts +0 -2
  377. package/dist/drafts/draft07/subscription-fsm.d.ts.map +0 -1
  378. package/dist/drafts/draft07/subscription-fsm.js +0 -2
  379. package/dist/drafts/draft07/subscription-fsm.js.map +0 -1
  380. package/dist/drafts/draft07/types.d.ts +0 -61
  381. package/dist/drafts/draft07/types.d.ts.map +0 -1
  382. package/dist/drafts/draft07/types.js +0 -4
  383. package/dist/drafts/draft07/types.js.map +0 -1
  384. package/dist/drafts/draft07/varint.d.ts +0 -4
  385. package/dist/drafts/draft07/varint.d.ts.map +0 -1
  386. package/dist/drafts/draft07/varint.js +0 -22
  387. package/dist/drafts/draft07/varint.js.map +0 -1
  388. package/dist/drafts/draft08/codec.d.ts +0 -29
  389. package/dist/drafts/draft08/codec.d.ts.map +0 -1
  390. package/dist/drafts/draft08/codec.js +0 -729
  391. package/dist/drafts/draft08/codec.js.map +0 -1
  392. package/dist/drafts/draft08/data-streams.d.ts +0 -12
  393. package/dist/drafts/draft08/data-streams.d.ts.map +0 -1
  394. package/dist/drafts/draft08/data-streams.js +0 -345
  395. package/dist/drafts/draft08/data-streams.js.map +0 -1
  396. package/dist/drafts/draft08/index.d.ts +0 -9
  397. package/dist/drafts/draft08/index.d.ts.map +0 -1
  398. package/dist/drafts/draft08/index.js +0 -7
  399. package/dist/drafts/draft08/index.js.map +0 -1
  400. package/dist/drafts/draft08/messages.d.ts +0 -34
  401. package/dist/drafts/draft08/messages.d.ts.map +0 -1
  402. package/dist/drafts/draft08/messages.js +0 -66
  403. package/dist/drafts/draft08/messages.js.map +0 -1
  404. package/dist/drafts/draft08/rules.d.ts +0 -8
  405. package/dist/drafts/draft08/rules.d.ts.map +0 -1
  406. package/dist/drafts/draft08/rules.js +0 -83
  407. package/dist/drafts/draft08/rules.js.map +0 -1
  408. package/dist/drafts/draft08/session-fsm.d.ts +0 -47
  409. package/dist/drafts/draft08/session-fsm.d.ts.map +0 -1
  410. package/dist/drafts/draft08/session-fsm.js +0 -483
  411. package/dist/drafts/draft08/session-fsm.js.map +0 -1
  412. package/dist/drafts/draft08/session.d.ts +0 -5
  413. package/dist/drafts/draft08/session.d.ts.map +0 -1
  414. package/dist/drafts/draft08/session.js +0 -5
  415. package/dist/drafts/draft08/session.js.map +0 -1
  416. package/dist/drafts/draft08/types.d.ts +0 -268
  417. package/dist/drafts/draft08/types.d.ts.map +0 -1
  418. package/dist/drafts/draft08/types.js +0 -4
  419. package/dist/drafts/draft08/types.js.map +0 -1
  420. package/dist/drafts/draft09/codec.d.ts +0 -21
  421. package/dist/drafts/draft09/codec.d.ts.map +0 -1
  422. package/dist/drafts/draft09/codec.js +0 -721
  423. package/dist/drafts/draft09/codec.js.map +0 -1
  424. package/dist/drafts/draft09/data-streams.d.ts +0 -12
  425. package/dist/drafts/draft09/data-streams.d.ts.map +0 -1
  426. package/dist/drafts/draft09/data-streams.js +0 -307
  427. package/dist/drafts/draft09/data-streams.js.map +0 -1
  428. package/dist/drafts/draft09/index.d.ts +0 -9
  429. package/dist/drafts/draft09/index.d.ts.map +0 -1
  430. package/dist/drafts/draft09/index.js +0 -7
  431. package/dist/drafts/draft09/index.js.map +0 -1
  432. package/dist/drafts/draft09/messages.d.ts +0 -34
  433. package/dist/drafts/draft09/messages.d.ts.map +0 -1
  434. package/dist/drafts/draft09/messages.js +0 -66
  435. package/dist/drafts/draft09/messages.js.map +0 -1
  436. package/dist/drafts/draft09/rules.d.ts +0 -8
  437. package/dist/drafts/draft09/rules.d.ts.map +0 -1
  438. package/dist/drafts/draft09/rules.js +0 -83
  439. package/dist/drafts/draft09/rules.js.map +0 -1
  440. package/dist/drafts/draft09/session-fsm.d.ts +0 -47
  441. package/dist/drafts/draft09/session-fsm.d.ts.map +0 -1
  442. package/dist/drafts/draft09/session-fsm.js +0 -483
  443. package/dist/drafts/draft09/session-fsm.js.map +0 -1
  444. package/dist/drafts/draft09/session.d.ts +0 -5
  445. package/dist/drafts/draft09/session.d.ts.map +0 -1
  446. package/dist/drafts/draft09/session.js +0 -5
  447. package/dist/drafts/draft09/session.js.map +0 -1
  448. package/dist/drafts/draft09/types.d.ts +0 -268
  449. package/dist/drafts/draft09/types.d.ts.map +0 -1
  450. package/dist/drafts/draft09/types.js +0 -4
  451. package/dist/drafts/draft09/types.js.map +0 -1
  452. package/dist/drafts/draft10/codec.d.ts +0 -21
  453. package/dist/drafts/draft10/codec.d.ts.map +0 -1
  454. package/dist/drafts/draft10/codec.js +0 -721
  455. package/dist/drafts/draft10/codec.js.map +0 -1
  456. package/dist/drafts/draft10/data-streams.d.ts +0 -12
  457. package/dist/drafts/draft10/data-streams.d.ts.map +0 -1
  458. package/dist/drafts/draft10/data-streams.js +0 -307
  459. package/dist/drafts/draft10/data-streams.js.map +0 -1
  460. package/dist/drafts/draft10/index.d.ts +0 -9
  461. package/dist/drafts/draft10/index.d.ts.map +0 -1
  462. package/dist/drafts/draft10/index.js +0 -7
  463. package/dist/drafts/draft10/index.js.map +0 -1
  464. package/dist/drafts/draft10/messages.d.ts +0 -34
  465. package/dist/drafts/draft10/messages.d.ts.map +0 -1
  466. package/dist/drafts/draft10/messages.js +0 -66
  467. package/dist/drafts/draft10/messages.js.map +0 -1
  468. package/dist/drafts/draft10/rules.d.ts +0 -8
  469. package/dist/drafts/draft10/rules.d.ts.map +0 -1
  470. package/dist/drafts/draft10/rules.js +0 -83
  471. package/dist/drafts/draft10/rules.js.map +0 -1
  472. package/dist/drafts/draft10/session-fsm.d.ts +0 -47
  473. package/dist/drafts/draft10/session-fsm.d.ts.map +0 -1
  474. package/dist/drafts/draft10/session-fsm.js +0 -483
  475. package/dist/drafts/draft10/session-fsm.js.map +0 -1
  476. package/dist/drafts/draft10/session.d.ts +0 -5
  477. package/dist/drafts/draft10/session.d.ts.map +0 -1
  478. package/dist/drafts/draft10/session.js +0 -5
  479. package/dist/drafts/draft10/session.js.map +0 -1
  480. package/dist/drafts/draft10/types.d.ts +0 -268
  481. package/dist/drafts/draft10/types.d.ts.map +0 -1
  482. package/dist/drafts/draft10/types.js +0 -4
  483. package/dist/drafts/draft10/types.js.map +0 -1
  484. package/dist/drafts/draft11/codec.d.ts +0 -25
  485. package/dist/drafts/draft11/codec.d.ts.map +0 -1
  486. package/dist/drafts/draft11/codec.js +0 -775
  487. package/dist/drafts/draft11/codec.js.map +0 -1
  488. package/dist/drafts/draft11/data-streams.d.ts +0 -10
  489. package/dist/drafts/draft11/data-streams.d.ts.map +0 -1
  490. package/dist/drafts/draft11/data-streams.js +0 -253
  491. package/dist/drafts/draft11/data-streams.js.map +0 -1
  492. package/dist/drafts/draft11/index.d.ts +0 -9
  493. package/dist/drafts/draft11/index.d.ts.map +0 -1
  494. package/dist/drafts/draft11/index.js +0 -7
  495. package/dist/drafts/draft11/index.js.map +0 -1
  496. package/dist/drafts/draft11/messages.d.ts +0 -33
  497. package/dist/drafts/draft11/messages.d.ts.map +0 -1
  498. package/dist/drafts/draft11/messages.js +0 -65
  499. package/dist/drafts/draft11/messages.js.map +0 -1
  500. package/dist/drafts/draft11/rules.d.ts +0 -8
  501. package/dist/drafts/draft11/rules.d.ts.map +0 -1
  502. package/dist/drafts/draft11/rules.js +0 -88
  503. package/dist/drafts/draft11/rules.js.map +0 -1
  504. package/dist/drafts/draft11/session-fsm.d.ts +0 -52
  505. package/dist/drafts/draft11/session-fsm.d.ts.map +0 -1
  506. package/dist/drafts/draft11/session-fsm.js +0 -530
  507. package/dist/drafts/draft11/session-fsm.js.map +0 -1
  508. package/dist/drafts/draft11/session.d.ts +0 -5
  509. package/dist/drafts/draft11/session.d.ts.map +0 -1
  510. package/dist/drafts/draft11/session.js +0 -5
  511. package/dist/drafts/draft11/session.js.map +0 -1
  512. package/dist/drafts/draft11/types.d.ts +0 -266
  513. package/dist/drafts/draft11/types.d.ts.map +0 -1
  514. package/dist/drafts/draft11/types.js +0 -4
  515. package/dist/drafts/draft11/types.js.map +0 -1
  516. package/dist/drafts/draft12/codec.d.ts +0 -27
  517. package/dist/drafts/draft12/codec.d.ts.map +0 -1
  518. package/dist/drafts/draft12/codec.js +0 -918
  519. package/dist/drafts/draft12/codec.js.map +0 -1
  520. package/dist/drafts/draft12/data-streams.d.ts +0 -10
  521. package/dist/drafts/draft12/data-streams.d.ts.map +0 -1
  522. package/dist/drafts/draft12/data-streams.js +0 -254
  523. package/dist/drafts/draft12/data-streams.js.map +0 -1
  524. package/dist/drafts/draft12/index.d.ts +0 -9
  525. package/dist/drafts/draft12/index.d.ts.map +0 -1
  526. package/dist/drafts/draft12/index.js +0 -7
  527. package/dist/drafts/draft12/index.js.map +0 -1
  528. package/dist/drafts/draft12/messages.d.ts +0 -37
  529. package/dist/drafts/draft12/messages.d.ts.map +0 -1
  530. package/dist/drafts/draft12/messages.js +0 -77
  531. package/dist/drafts/draft12/messages.js.map +0 -1
  532. package/dist/drafts/draft12/rules.d.ts +0 -8
  533. package/dist/drafts/draft12/rules.d.ts.map +0 -1
  534. package/dist/drafts/draft12/rules.js +0 -94
  535. package/dist/drafts/draft12/rules.js.map +0 -1
  536. package/dist/drafts/draft12/session-fsm.d.ts +0 -55
  537. package/dist/drafts/draft12/session-fsm.d.ts.map +0 -1
  538. package/dist/drafts/draft12/session-fsm.js +0 -569
  539. package/dist/drafts/draft12/session-fsm.js.map +0 -1
  540. package/dist/drafts/draft12/session.d.ts +0 -5
  541. package/dist/drafts/draft12/session.d.ts.map +0 -1
  542. package/dist/drafts/draft12/session.js +0 -5
  543. package/dist/drafts/draft12/session.js.map +0 -1
  544. package/dist/drafts/draft12/types.d.ts +0 -294
  545. package/dist/drafts/draft12/types.d.ts.map +0 -1
  546. package/dist/drafts/draft12/types.js +0 -4
  547. package/dist/drafts/draft12/types.js.map +0 -1
  548. package/dist/drafts/draft13/codec.d.ts +0 -27
  549. package/dist/drafts/draft13/codec.d.ts.map +0 -1
  550. package/dist/drafts/draft13/codec.js +0 -1000
  551. package/dist/drafts/draft13/codec.js.map +0 -1
  552. package/dist/drafts/draft13/data-streams.d.ts +0 -10
  553. package/dist/drafts/draft13/data-streams.d.ts.map +0 -1
  554. package/dist/drafts/draft13/data-streams.js +0 -254
  555. package/dist/drafts/draft13/data-streams.js.map +0 -1
  556. package/dist/drafts/draft13/index.d.ts +0 -9
  557. package/dist/drafts/draft13/index.d.ts.map +0 -1
  558. package/dist/drafts/draft13/index.js +0 -7
  559. package/dist/drafts/draft13/index.js.map +0 -1
  560. package/dist/drafts/draft13/messages.d.ts +0 -38
  561. package/dist/drafts/draft13/messages.d.ts.map +0 -1
  562. package/dist/drafts/draft13/messages.js +0 -79
  563. package/dist/drafts/draft13/messages.js.map +0 -1
  564. package/dist/drafts/draft13/rules.d.ts +0 -8
  565. package/dist/drafts/draft13/rules.d.ts.map +0 -1
  566. package/dist/drafts/draft13/rules.js +0 -96
  567. package/dist/drafts/draft13/rules.js.map +0 -1
  568. package/dist/drafts/draft13/session-fsm.d.ts +0 -56
  569. package/dist/drafts/draft13/session-fsm.d.ts.map +0 -1
  570. package/dist/drafts/draft13/session-fsm.js +0 -581
  571. package/dist/drafts/draft13/session-fsm.js.map +0 -1
  572. package/dist/drafts/draft13/session.d.ts +0 -5
  573. package/dist/drafts/draft13/session.d.ts.map +0 -1
  574. package/dist/drafts/draft13/session.js +0 -5
  575. package/dist/drafts/draft13/session.js.map +0 -1
  576. package/dist/drafts/draft13/types.d.ts +0 -310
  577. package/dist/drafts/draft13/types.d.ts.map +0 -1
  578. package/dist/drafts/draft13/types.js +0 -4
  579. package/dist/drafts/draft13/types.js.map +0 -1
  580. package/dist/drafts/draft14/codec.d.ts +0 -34
  581. package/dist/drafts/draft14/codec.d.ts.map +0 -1
  582. package/dist/drafts/draft14/codec.js +0 -752
  583. package/dist/drafts/draft14/codec.js.map +0 -1
  584. package/dist/drafts/draft14/data-streams.d.ts +0 -56
  585. package/dist/drafts/draft14/data-streams.d.ts.map +0 -1
  586. package/dist/drafts/draft14/data-streams.js +0 -729
  587. package/dist/drafts/draft14/data-streams.js.map +0 -1
  588. package/dist/drafts/draft14/index.d.ts +0 -9
  589. package/dist/drafts/draft14/index.d.ts.map +0 -1
  590. package/dist/drafts/draft14/index.js +0 -7
  591. package/dist/drafts/draft14/index.js.map +0 -1
  592. package/dist/drafts/draft14/messages.d.ts +0 -36
  593. package/dist/drafts/draft14/messages.d.ts.map +0 -1
  594. package/dist/drafts/draft14/messages.js +0 -71
  595. package/dist/drafts/draft14/messages.js.map +0 -1
  596. package/dist/drafts/draft14/rules.d.ts +0 -8
  597. package/dist/drafts/draft14/rules.d.ts.map +0 -1
  598. package/dist/drafts/draft14/rules.js +0 -101
  599. package/dist/drafts/draft14/rules.js.map +0 -1
  600. package/dist/drafts/draft14/session-fsm.d.ts +0 -58
  601. package/dist/drafts/draft14/session-fsm.d.ts.map +0 -1
  602. package/dist/drafts/draft14/session-fsm.js +0 -648
  603. package/dist/drafts/draft14/session-fsm.js.map +0 -1
  604. package/dist/drafts/draft14/session.d.ts +0 -5
  605. package/dist/drafts/draft14/session.d.ts.map +0 -1
  606. package/dist/drafts/draft14/session.js +0 -5
  607. package/dist/drafts/draft14/session.js.map +0 -1
  608. package/dist/drafts/draft14/types.d.ts +0 -263
  609. package/dist/drafts/draft14/types.d.ts.map +0 -1
  610. package/dist/drafts/draft14/types.js +0 -4
  611. package/dist/drafts/draft14/types.js.map +0 -1
  612. package/dist/drafts/draft15/codec.d.ts +0 -33
  613. package/dist/drafts/draft15/codec.d.ts.map +0 -1
  614. package/dist/drafts/draft15/codec.js +0 -742
  615. package/dist/drafts/draft15/codec.js.map +0 -1
  616. package/dist/drafts/draft15/data-streams.d.ts +0 -45
  617. package/dist/drafts/draft15/data-streams.d.ts.map +0 -1
  618. package/dist/drafts/draft15/data-streams.js +0 -675
  619. package/dist/drafts/draft15/data-streams.js.map +0 -1
  620. package/dist/drafts/draft15/index.d.ts +0 -9
  621. package/dist/drafts/draft15/index.d.ts.map +0 -1
  622. package/dist/drafts/draft15/index.js +0 -7
  623. package/dist/drafts/draft15/index.js.map +0 -1
  624. package/dist/drafts/draft15/messages.d.ts +0 -31
  625. package/dist/drafts/draft15/messages.d.ts.map +0 -1
  626. package/dist/drafts/draft15/messages.js +0 -59
  627. package/dist/drafts/draft15/messages.js.map +0 -1
  628. package/dist/drafts/draft15/rules.d.ts +0 -8
  629. package/dist/drafts/draft15/rules.d.ts.map +0 -1
  630. package/dist/drafts/draft15/rules.js +0 -83
  631. package/dist/drafts/draft15/rules.js.map +0 -1
  632. package/dist/drafts/draft15/session-fsm.d.ts +0 -48
  633. package/dist/drafts/draft15/session-fsm.d.ts.map +0 -1
  634. package/dist/drafts/draft15/session-fsm.js +0 -479
  635. package/dist/drafts/draft15/session-fsm.js.map +0 -1
  636. package/dist/drafts/draft15/session.d.ts +0 -5
  637. package/dist/drafts/draft15/session.d.ts.map +0 -1
  638. package/dist/drafts/draft15/session.js +0 -5
  639. package/dist/drafts/draft15/session.js.map +0 -1
  640. package/dist/drafts/draft15/types.d.ts +0 -232
  641. package/dist/drafts/draft15/types.d.ts.map +0 -1
  642. package/dist/drafts/draft15/types.js +0 -4
  643. package/dist/drafts/draft15/types.js.map +0 -1
  644. package/dist/drafts/draft16/codec.d.ts +0 -29
  645. package/dist/drafts/draft16/codec.d.ts.map +0 -1
  646. package/dist/drafts/draft16/codec.js +0 -747
  647. package/dist/drafts/draft16/codec.js.map +0 -1
  648. package/dist/drafts/draft16/data-streams.d.ts +0 -34
  649. package/dist/drafts/draft16/data-streams.d.ts.map +0 -1
  650. package/dist/drafts/draft16/data-streams.js +0 -667
  651. package/dist/drafts/draft16/data-streams.js.map +0 -1
  652. package/dist/drafts/draft16/index.d.ts +0 -9
  653. package/dist/drafts/draft16/index.d.ts.map +0 -1
  654. package/dist/drafts/draft16/index.js +0 -7
  655. package/dist/drafts/draft16/index.js.map +0 -1
  656. package/dist/drafts/draft16/messages.d.ts +0 -32
  657. package/dist/drafts/draft16/messages.d.ts.map +0 -1
  658. package/dist/drafts/draft16/messages.js +0 -62
  659. package/dist/drafts/draft16/messages.js.map +0 -1
  660. package/dist/drafts/draft16/rules.d.ts +0 -8
  661. package/dist/drafts/draft16/rules.d.ts.map +0 -1
  662. package/dist/drafts/draft16/rules.js +0 -84
  663. package/dist/drafts/draft16/rules.js.map +0 -1
  664. package/dist/drafts/draft16/session-fsm.d.ts +0 -48
  665. package/dist/drafts/draft16/session-fsm.d.ts.map +0 -1
  666. package/dist/drafts/draft16/session-fsm.js +0 -474
  667. package/dist/drafts/draft16/session-fsm.js.map +0 -1
  668. package/dist/drafts/draft16/session.d.ts +0 -5
  669. package/dist/drafts/draft16/session.d.ts.map +0 -1
  670. package/dist/drafts/draft16/session.js +0 -5
  671. package/dist/drafts/draft16/session.js.map +0 -1
  672. package/dist/drafts/draft16/types.d.ts +0 -238
  673. package/dist/drafts/draft16/types.d.ts.map +0 -1
  674. package/dist/drafts/draft16/types.js +0 -4
  675. package/dist/drafts/draft16/types.js.map +0 -1
  676. package/dist/drafts/draft17/codec.d.ts +0 -29
  677. package/dist/drafts/draft17/codec.d.ts.map +0 -1
  678. package/dist/drafts/draft17/codec.js +0 -799
  679. package/dist/drafts/draft17/codec.js.map +0 -1
  680. package/dist/drafts/draft17/data-streams.d.ts +0 -13
  681. package/dist/drafts/draft17/data-streams.d.ts.map +0 -1
  682. package/dist/drafts/draft17/data-streams.js +0 -633
  683. package/dist/drafts/draft17/data-streams.js.map +0 -1
  684. package/dist/drafts/draft17/index.d.ts +0 -8
  685. package/dist/drafts/draft17/index.d.ts.map +0 -1
  686. package/dist/drafts/draft17/index.js +0 -6
  687. package/dist/drafts/draft17/index.js.map +0 -1
  688. package/dist/drafts/draft17/messages.d.ts +0 -25
  689. package/dist/drafts/draft17/messages.d.ts.map +0 -1
  690. package/dist/drafts/draft17/messages.js +0 -48
  691. package/dist/drafts/draft17/messages.js.map +0 -1
  692. package/dist/drafts/draft17/rules.d.ts +0 -8
  693. package/dist/drafts/draft17/rules.d.ts.map +0 -1
  694. package/dist/drafts/draft17/rules.js +0 -71
  695. package/dist/drafts/draft17/rules.js.map +0 -1
  696. package/dist/drafts/draft17/session-fsm.d.ts +0 -45
  697. package/dist/drafts/draft17/session-fsm.d.ts.map +0 -1
  698. package/dist/drafts/draft17/session-fsm.js +0 -328
  699. package/dist/drafts/draft17/session-fsm.js.map +0 -1
  700. package/dist/drafts/draft17/session.d.ts +0 -5
  701. package/dist/drafts/draft17/session.d.ts.map +0 -1
  702. package/dist/drafts/draft17/session.js +0 -6
  703. package/dist/drafts/draft17/session.js.map +0 -1
  704. package/dist/drafts/draft17/types.d.ts +0 -219
  705. package/dist/drafts/draft17/types.d.ts.map +0 -1
  706. package/dist/drafts/draft17/types.js +0 -3
  707. package/dist/drafts/draft17/types.js.map +0 -1
  708. package/dist/index.d.ts.map +0 -1
  709. package/dist/index.js.map +0 -1
  710. package/dist/session.d.ts.map +0 -1
  711. package/dist/session.js.map +0 -1
  712. package/dist/types-QNXoxC9Y.d.cts +0 -236
  713. package/dist/types-QNXoxC9Y.d.ts +0 -236
  714. package/src/drafts/draft07/announce-fsm.ts +0 -2
  715. package/src/drafts/draft07/parameters.ts +0 -12
  716. package/src/drafts/draft07/subscription-fsm.ts +0 -3
@@ -1,969 +1,1138 @@
1
- import { bytesToHex, hexToBytes } from "../../core/hex.js";
2
- import { BufferReader } from "../../core/buffer-reader.js";
3
- import { BufferWriter } from "../../core/buffer-writer.js";
4
- import type { BaseCodec, DecodeResult } from "../../core/types.js";
5
- import { DecodeError } from "../../core/types.js";
6
- import {
7
- MESSAGE_ID_MAP,
8
- MSG_CLIENT_SETUP,
9
- MSG_FETCH,
10
- MSG_FETCH_CANCEL,
11
- MSG_FETCH_OK,
12
- MSG_GOAWAY,
13
- MSG_MAX_REQUEST_ID,
14
- MSG_PUBLISH,
15
- MSG_PUBLISH_DONE,
16
- MSG_PUBLISH_NAMESPACE,
17
- MSG_PUBLISH_NAMESPACE_CANCEL,
18
- MSG_PUBLISH_NAMESPACE_DONE,
19
- MSG_PUBLISH_OK,
20
- MSG_REQUEST_ERROR,
21
- MSG_REQUEST_OK,
22
- MSG_REQUESTS_BLOCKED,
23
- MSG_SERVER_SETUP,
24
- MSG_SUBSCRIBE,
25
- MSG_SUBSCRIBE_NAMESPACE,
26
- MSG_SUBSCRIBE_OK,
27
- MSG_SUBSCRIBE_UPDATE,
28
- MSG_TRACK_STATUS,
29
- MSG_UNSUBSCRIBE,
30
- MSG_UNSUBSCRIBE_NAMESPACE,
31
- SETUP_PARAM_AUTHORITY,
32
- SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE,
33
- SETUP_PARAM_MAX_REQUEST_ID,
34
- SETUP_PARAM_MOQT_IMPLEMENTATION,
35
- SETUP_PARAM_PATH,
36
- } from "./messages.js";
37
- import type {
38
- DatagramObject,
39
- DataStreamEvent,
40
- Draft15DataStream,
41
- Draft15Fetch,
42
- Draft15Message,
43
- Draft15Params,
44
- Draft15SetupParams,
45
- FetchObjectPayload,
46
- FetchStream,
47
- FetchStreamHeader,
48
- JoiningFetch,
49
- ObjectPayload,
50
- StandaloneFetch,
51
- SubgroupStream,
52
- SubgroupStreamHeader,
53
- UnknownParam,
54
- } from "./types.js";
55
- // ─── Setup Parameter Encoding/Decoding ──────────────────────────────────────────
56
-
57
- function encodeSetupParams(params: Draft15SetupParams, writer: BufferWriter): void {
58
- let count = 0;
59
- if (params.path !== undefined) count++;
60
- if (params.max_request_id !== undefined) count++;
61
- if (params.max_auth_token_cache_size !== undefined) count++;
62
- if (params.authority !== undefined) count++;
63
- if (params.moqt_implementation !== undefined) count++;
64
- if (params.unknown) count += params.unknown.length;
65
-
66
- writer.writeVarInt(count);
67
-
68
- // PATH (0x01) - odd, length-prefixed bytes
69
- if (params.path !== undefined) {
70
- writer.writeVarInt(SETUP_PARAM_PATH);
71
- const encoded = new TextEncoder().encode(params.path);
72
- writer.writeVarInt(encoded.byteLength);
73
- writer.writeBytes(encoded);
74
- }
75
-
76
- // MAX_REQUEST_ID (0x02) - even, varint value
77
- if (params.max_request_id !== undefined) {
78
- writer.writeVarInt(SETUP_PARAM_MAX_REQUEST_ID);
79
- writer.writeVarInt(params.max_request_id);
80
- }
81
-
82
- // MAX_AUTH_TOKEN_CACHE_SIZE (0x04) - even, varint value
83
- if (params.max_auth_token_cache_size !== undefined) {
84
- writer.writeVarInt(SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE);
85
- writer.writeVarInt(params.max_auth_token_cache_size);
86
- }
87
-
88
- // AUTHORITY (0x05) - odd, length-prefixed bytes
89
- if (params.authority !== undefined) {
90
- writer.writeVarInt(SETUP_PARAM_AUTHORITY);
91
- const encoded = new TextEncoder().encode(params.authority);
92
- writer.writeVarInt(encoded.byteLength);
93
- writer.writeBytes(encoded);
94
- }
95
-
96
- // MOQT_IMPLEMENTATION (0x07) - odd, length-prefixed bytes
97
- if (params.moqt_implementation !== undefined) {
98
- writer.writeVarInt(SETUP_PARAM_MOQT_IMPLEMENTATION);
99
- const encoded = new TextEncoder().encode(params.moqt_implementation);
100
- writer.writeVarInt(encoded.byteLength);
101
- writer.writeBytes(encoded);
102
- }
103
-
104
- // Unknown params
105
- if (params.unknown) {
106
- for (const u of params.unknown) {
107
- const id = BigInt(u.id);
108
- writer.writeVarInt(id);
109
- if (id % 2n === 0n) {
110
- // Even: value is a varint — raw_hex contains the varint bytes
111
- const raw = hexToBytes(u.raw_hex);
112
- const tmpReader = new BufferReader(raw);
113
- const value = tmpReader.readVarInt();
114
- writer.writeVarInt(value);
115
- } else {
116
- // Odd: length-prefixed bytes
117
- const raw = hexToBytes(u.raw_hex);
118
- writer.writeVarInt(raw.byteLength);
119
- writer.writeBytes(raw);
120
- }
121
- }
122
- }
123
- }
124
-
125
- function decodeSetupParams(reader: BufferReader): Draft15SetupParams {
126
- const count = Number(reader.readVarInt());
127
- const result: Draft15SetupParams = {};
128
- const unknown: UnknownParam[] = [];
129
-
130
- for (let i = 0; i < count; i++) {
131
- const paramType = reader.readVarInt();
132
-
133
- if (paramType % 2n === 0n) {
134
- // Even: value is a varint directly
135
- const value = reader.readVarInt();
136
- if (paramType === SETUP_PARAM_MAX_REQUEST_ID) {
137
- result.max_request_id = value;
138
- } else if (paramType === SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE) {
139
- result.max_auth_token_cache_size = value;
140
- } else {
141
- const tmpWriter = new BufferWriter(16);
142
- tmpWriter.writeVarInt(value);
143
- const raw = tmpWriter.finish();
144
- unknown.push({
145
- id: `0x${paramType.toString(16)}`,
146
- length: raw.byteLength,
147
- raw_hex: bytesToHex(raw),
148
- });
149
- }
150
- } else {
151
- // Odd: value is length-prefixed bytes
152
- const length = Number(reader.readVarInt());
153
- const bytes = reader.readBytes(length);
154
- if (paramType === SETUP_PARAM_PATH) {
155
- result.path = new TextDecoder().decode(bytes);
156
- } else if (paramType === SETUP_PARAM_AUTHORITY) {
157
- result.authority = new TextDecoder().decode(bytes);
158
- } else if (paramType === SETUP_PARAM_MOQT_IMPLEMENTATION) {
159
- result.moqt_implementation = new TextDecoder().decode(bytes);
160
- } else {
161
- unknown.push({
162
- id: `0x${paramType.toString(16)}`,
163
- length,
164
- raw_hex: bytesToHex(bytes),
165
- });
166
- }
167
- }
168
- }
169
-
170
- if (unknown.length > 0) {
171
- result.unknown = unknown;
172
- }
173
-
174
- return result;
175
- }
176
-
177
- // ─── Version-Specific Parameter Encoding/Decoding ───────────────────────────────
178
-
179
- // Well-known version-specific parameter IDs
180
- const PARAM_EXPIRES = 0x08n; // even: varint
181
- const PARAM_LARGEST_OBJECT = 0x09n; // odd: length-prefixed (group varint + object varint)
182
- const PARAM_SUBSCRIBER_PRIORITY = 0x20n; // even: varint
183
- const PARAM_SUBSCRIPTION_FILTER = 0x21n; // odd: length-prefixed
184
- const PARAM_GROUP_ORDER = 0x22n; // even: varint
185
-
186
- function encodeParams(params: Draft15Params, writer: BufferWriter): void {
187
- // Count known + unknown params
188
- let count = params.unknown ? params.unknown.length : 0;
189
- if (params.expires !== undefined) count++;
190
- if (params.largest_object !== undefined) count++;
191
- if (params.subscriber_priority !== undefined) count++;
192
- if (params.subscription_filter !== undefined) count++;
193
- if (params.group_order !== undefined) count++;
194
- writer.writeVarInt(count);
195
-
196
- // Encode known params (sorted by ID for canonical encoding)
197
- if (params.expires !== undefined) {
198
- writer.writeVarInt(PARAM_EXPIRES);
199
- writer.writeVarInt(params.expires);
200
- }
201
- if (params.largest_object !== undefined) {
202
- writer.writeVarInt(PARAM_LARGEST_OBJECT);
203
- const tmpW = new BufferWriter(16);
204
- tmpW.writeVarInt(params.largest_object.group);
205
- tmpW.writeVarInt(params.largest_object.object);
206
- const raw = tmpW.finish();
207
- writer.writeVarInt(raw.byteLength);
208
- writer.writeBytes(raw);
209
- }
210
- if (params.subscriber_priority !== undefined) {
211
- writer.writeVarInt(PARAM_SUBSCRIBER_PRIORITY);
212
- writer.writeVarInt(params.subscriber_priority);
213
- }
214
- if (params.subscription_filter !== undefined) {
215
- writer.writeVarInt(PARAM_SUBSCRIPTION_FILTER);
216
- const tmpW = new BufferWriter(32);
217
- const f = params.subscription_filter;
218
- tmpW.writeVarInt(f.filter_type);
219
- if (f.filter_type === 3n || f.filter_type === 4n) {
220
- tmpW.writeVarInt(f.start_group!);
221
- tmpW.writeVarInt(f.start_object!);
222
- }
223
- if (f.filter_type === 4n) {
224
- tmpW.writeVarInt(f.end_group!);
225
- }
226
- const raw = tmpW.finish();
227
- writer.writeVarInt(raw.byteLength);
228
- writer.writeBytes(raw);
229
- }
230
- if (params.group_order !== undefined) {
231
- writer.writeVarInt(PARAM_GROUP_ORDER);
232
- writer.writeVarInt(params.group_order);
233
- }
234
-
235
- // Encode unknown params
236
- if (params.unknown) {
237
- for (const u of params.unknown) {
238
- const id = BigInt(u.id);
239
- writer.writeVarInt(id);
240
- if (id % 2n === 0n) {
241
- const raw = hexToBytes(u.raw_hex);
242
- const tmpReader = new BufferReader(raw);
243
- const value = tmpReader.readVarInt();
244
- writer.writeVarInt(value);
245
- } else {
246
- const raw = hexToBytes(u.raw_hex);
247
- writer.writeVarInt(raw.byteLength);
248
- writer.writeBytes(raw);
249
- }
250
- }
251
- }
252
- }
253
-
254
- function decodeParams(reader: BufferReader): Draft15Params {
255
- const count = Number(reader.readVarInt());
256
- const result: Draft15Params = {};
257
- const unknown: UnknownParam[] = [];
258
-
259
- for (let i = 0; i < count; i++) {
260
- const paramType = reader.readVarInt();
261
-
262
- if (paramType === PARAM_EXPIRES) {
263
- result.expires = reader.readVarInt();
264
- } else if (paramType === PARAM_SUBSCRIBER_PRIORITY) {
265
- result.subscriber_priority = reader.readVarInt();
266
- } else if (paramType === PARAM_GROUP_ORDER) {
267
- result.group_order = reader.readVarInt();
268
- } else if (paramType === PARAM_LARGEST_OBJECT) {
269
- const length = Number(reader.readVarInt());
270
- const startOff = reader.offset;
271
- const group = reader.readVarInt();
272
- const object = reader.readVarInt();
273
- // Skip any remaining bytes in the length-prefixed block
274
- const consumed = reader.offset - startOff;
275
- if (consumed < length) reader.readBytes(length - consumed);
276
- result.largest_object = { group, object };
277
- } else if (paramType === PARAM_SUBSCRIPTION_FILTER) {
278
- const length = Number(reader.readVarInt());
279
- const startOff = reader.offset;
280
- const filter_type = reader.readVarInt();
281
- const filter: {
282
- filter_type: bigint;
283
- start_group?: bigint;
284
- start_object?: bigint;
285
- end_group?: bigint;
286
- } = { filter_type };
287
- if (filter_type === 3n || filter_type === 4n) {
288
- filter.start_group = reader.readVarInt();
289
- filter.start_object = reader.readVarInt();
290
- }
291
- if (filter_type === 4n) {
292
- filter.end_group = reader.readVarInt();
293
- }
294
- // Skip any remaining bytes
295
- const consumed = reader.offset - startOff;
296
- if (consumed < length) reader.readBytes(length - consumed);
297
- result.subscription_filter = filter;
298
- } else if (paramType % 2n === 0n) {
299
- // Unknown even: varint value
300
- const value = reader.readVarInt();
301
- const tmpWriter = new BufferWriter(16);
302
- tmpWriter.writeVarInt(value);
303
- const raw = tmpWriter.finish();
304
- unknown.push({
305
- id: `0x${paramType.toString(16)}`,
306
- length: raw.byteLength,
307
- raw_hex: bytesToHex(raw),
308
- });
309
- } else {
310
- // Unknown odd: length-prefixed bytes
311
- const length = Number(reader.readVarInt());
312
- const bytes = reader.readBytes(length);
313
- unknown.push({
314
- id: `0x${paramType.toString(16)}`,
315
- length,
316
- raw_hex: bytesToHex(bytes),
317
- });
318
- }
319
- }
320
-
321
- if (unknown.length > 0) {
322
- result.unknown = unknown;
323
- }
324
-
325
- return result;
326
- }
327
-
328
- // ─── Payload Encoders ──────────────────────────────────────────────────────────
329
-
330
- function encodeClientSetupPayload(
331
- msg: Draft15Message & { type: "client_setup" },
332
- w: BufferWriter,
333
- ): void {
334
- encodeSetupParams(msg.parameters, w);
335
- }
336
-
337
- function encodeServerSetupPayload(
338
- msg: Draft15Message & { type: "server_setup" },
339
- w: BufferWriter,
340
- ): void {
341
- encodeSetupParams(msg.parameters, w);
342
- }
343
-
344
- function encodeSubscribePayload(
345
- msg: Draft15Message & { type: "subscribe" },
346
- w: BufferWriter,
347
- ): void {
348
- w.writeVarInt(msg.request_id);
349
- w.writeTuple(msg.track_namespace);
350
- w.writeString(msg.track_name);
351
- encodeParams(msg.parameters, w);
352
- }
353
-
354
- function encodeSubscribeOkPayload(
355
- msg: Draft15Message & { type: "subscribe_ok" },
356
- w: BufferWriter,
357
- ): void {
358
- w.writeVarInt(msg.request_id);
359
- w.writeVarInt(msg.track_alias);
360
- encodeParams(msg.parameters, w);
361
- }
362
-
363
- function encodeSubscribeUpdatePayload(
364
- msg: Draft15Message & { type: "subscribe_update" },
365
- w: BufferWriter,
366
- ): void {
367
- w.writeVarInt(msg.request_id);
368
- w.writeVarInt(msg.subscription_request_id);
369
- encodeParams(msg.parameters, w);
370
- }
371
-
372
- function encodeUnsubscribePayload(
373
- msg: Draft15Message & { type: "unsubscribe" },
374
- w: BufferWriter,
375
- ): void {
376
- w.writeVarInt(msg.request_id);
377
- }
378
-
379
- function encodePublishPayload(msg: Draft15Message & { type: "publish" }, w: BufferWriter): void {
380
- w.writeVarInt(msg.request_id);
381
- w.writeTuple(msg.track_namespace);
382
- w.writeString(msg.track_name);
383
- w.writeVarInt(msg.track_alias);
384
- encodeParams(msg.parameters, w);
385
- }
386
-
387
- function encodePublishOkPayload(
388
- msg: Draft15Message & { type: "publish_ok" },
389
- w: BufferWriter,
390
- ): void {
391
- w.writeVarInt(msg.request_id);
392
- encodeParams(msg.parameters, w);
393
- }
394
-
395
- function encodePublishDonePayload(
396
- msg: Draft15Message & { type: "publish_done" },
397
- w: BufferWriter,
398
- ): void {
399
- w.writeVarInt(msg.request_id);
400
- w.writeVarInt(msg.status_code);
401
- w.writeVarInt(msg.stream_count);
402
- w.writeString(msg.reason_phrase);
403
- }
404
-
405
- function encodePublishNamespacePayload(
406
- msg: Draft15Message & { type: "publish_namespace" },
407
- w: BufferWriter,
408
- ): void {
409
- w.writeVarInt(msg.request_id);
410
- w.writeTuple(msg.track_namespace);
411
- encodeParams(msg.parameters, w);
412
- }
413
-
414
- function encodePublishNamespaceDonePayload(
415
- msg: Draft15Message & { type: "publish_namespace_done" },
416
- w: BufferWriter,
417
- ): void {
418
- w.writeTuple(msg.track_namespace);
419
- }
420
-
421
- function encodePublishNamespaceCancelPayload(
422
- msg: Draft15Message & { type: "publish_namespace_cancel" },
423
- w: BufferWriter,
424
- ): void {
425
- w.writeTuple(msg.track_namespace);
426
- w.writeVarInt(msg.error_code);
427
- w.writeString(msg.reason_phrase);
428
- }
429
-
430
- function encodeSubscribeNamespacePayload(
431
- msg: Draft15Message & { type: "subscribe_namespace" },
432
- w: BufferWriter,
433
- ): void {
434
- w.writeVarInt(msg.request_id);
435
- w.writeTuple(msg.namespace_prefix);
436
- encodeParams(msg.parameters, w);
437
- }
438
-
439
- function encodeUnsubscribeNamespacePayload(
440
- msg: Draft15Message & { type: "unsubscribe_namespace" },
441
- w: BufferWriter,
442
- ): void {
443
- w.writeVarInt(msg.request_id);
444
- }
445
-
446
- function encodeFetchPayload(msg: Draft15Message & { type: "fetch" }, w: BufferWriter): void {
447
- w.writeVarInt(msg.request_id);
448
- w.writeVarInt(msg.fetch_type);
449
- const ft = Number(msg.fetch_type);
450
- if (ft === 1 && msg.standalone) {
451
- // Standalone Fetch
452
- w.writeTuple(msg.standalone.track_namespace);
453
- w.writeString(msg.standalone.track_name);
454
- // Start Location
455
- w.writeVarInt(msg.standalone.start_group);
456
- w.writeVarInt(msg.standalone.start_object);
457
- // End Location
458
- w.writeVarInt(msg.standalone.end_group);
459
- w.writeVarInt(msg.standalone.end_object);
460
- } else if ((ft === 2 || ft === 3) && msg.joining) {
461
- // Joining Fetch (relative=2, absolute=3)
462
- w.writeVarInt(msg.joining.joining_request_id);
463
- w.writeVarInt(msg.joining.joining_start);
464
- }
465
- encodeParams(msg.parameters, w);
466
- }
467
-
468
- function encodeFetchOkPayload(msg: Draft15Message & { type: "fetch_ok" }, w: BufferWriter): void {
469
- w.writeVarInt(msg.request_id);
470
- w.writeUint8(msg.end_of_track);
471
- // End Location
472
- w.writeVarInt(msg.end_group);
473
- w.writeVarInt(msg.end_object);
474
- encodeParams(msg.parameters, w);
475
- }
476
-
477
- function encodeFetchCancelPayload(
478
- msg: Draft15Message & { type: "fetch_cancel" },
479
- w: BufferWriter,
480
- ): void {
481
- w.writeVarInt(msg.request_id);
482
- }
483
-
484
- function encodeTrackStatusPayload(
485
- msg: Draft15Message & { type: "track_status" },
486
- w: BufferWriter,
487
- ): void {
488
- w.writeVarInt(msg.request_id);
489
- w.writeTuple(msg.track_namespace);
490
- w.writeString(msg.track_name);
491
- encodeParams(msg.parameters, w);
492
- }
493
-
494
- function encodeRequestOkPayload(
495
- msg: Draft15Message & { type: "request_ok" },
496
- w: BufferWriter,
497
- ): void {
498
- w.writeVarInt(msg.request_id);
499
- encodeParams(msg.parameters, w);
500
- }
501
-
502
- function encodeRequestErrorPayload(
503
- msg: Draft15Message & { type: "request_error" },
504
- w: BufferWriter,
505
- ): void {
506
- w.writeVarInt(msg.request_id);
507
- w.writeVarInt(msg.error_code);
508
- w.writeString(msg.reason_phrase);
509
- }
510
-
511
- function encodeGoAwayPayload(msg: Draft15Message & { type: "goaway" }, w: BufferWriter): void {
512
- w.writeString(msg.new_session_uri);
513
- }
514
-
515
- function encodeMaxRequestIdPayload(
516
- msg: Draft15Message & { type: "max_request_id" },
517
- w: BufferWriter,
518
- ): void {
519
- w.writeVarInt(msg.max_request_id);
520
- }
521
-
522
- function encodeRequestsBlockedPayload(
523
- msg: Draft15Message & { type: "requests_blocked" },
524
- w: BufferWriter,
525
- ): void {
526
- w.writeVarInt(msg.maximum_request_id);
527
- }
528
-
529
- // ─── Payload Decoders ──────────────────────────────────────────────────────────
530
-
531
- function decodeClientSetupPayload(r: BufferReader): Draft15Message {
532
- const parameters = decodeSetupParams(r);
533
- return { type: "client_setup", parameters };
534
- }
535
-
536
- function decodeServerSetupPayload(r: BufferReader): Draft15Message {
537
- const parameters = decodeSetupParams(r);
538
- return { type: "server_setup", parameters };
539
- }
540
-
541
- function decodeSubscribePayload(r: BufferReader): Draft15Message {
542
- const request_id = r.readVarInt();
543
- const track_namespace = r.readTuple();
544
- const track_name = r.readString();
545
- const parameters = decodeParams(r);
546
- return { type: "subscribe", request_id, track_namespace, track_name, parameters };
547
- }
548
-
549
- function decodeSubscribeOkPayload(r: BufferReader): Draft15Message {
550
- const request_id = r.readVarInt();
551
- const track_alias = r.readVarInt();
552
- const parameters = decodeParams(r);
553
- return { type: "subscribe_ok", request_id, track_alias, parameters };
554
- }
555
-
556
- function decodeSubscribeUpdatePayload(r: BufferReader): Draft15Message {
557
- const request_id = r.readVarInt();
558
- const subscription_request_id = r.readVarInt();
559
- const parameters = decodeParams(r);
560
- return { type: "subscribe_update", request_id, subscription_request_id, parameters };
561
- }
562
-
563
- function decodeUnsubscribePayload(r: BufferReader): Draft15Message {
564
- const request_id = r.readVarInt();
565
- return { type: "unsubscribe", request_id };
566
- }
567
-
568
- function decodePublishPayload(r: BufferReader): Draft15Message {
569
- const request_id = r.readVarInt();
570
- const track_namespace = r.readTuple();
571
- const track_name = r.readString();
572
- const track_alias = r.readVarInt();
573
- const parameters = decodeParams(r);
574
- return { type: "publish", request_id, track_namespace, track_name, track_alias, parameters };
575
- }
576
-
577
- function decodePublishOkPayload(r: BufferReader): Draft15Message {
578
- const request_id = r.readVarInt();
579
- const parameters = decodeParams(r);
580
- return { type: "publish_ok", request_id, parameters };
581
- }
582
-
583
- function decodePublishDonePayload(r: BufferReader): Draft15Message {
584
- const request_id = r.readVarInt();
585
- const status_code = r.readVarInt();
586
- const stream_count = r.readVarInt();
587
- const reason_phrase = r.readString();
588
- return { type: "publish_done", request_id, status_code, stream_count, reason_phrase };
589
- }
590
-
591
- function decodePublishNamespacePayload(r: BufferReader): Draft15Message {
592
- const request_id = r.readVarInt();
593
- const track_namespace = r.readTuple();
594
- const parameters = decodeParams(r);
595
- return { type: "publish_namespace", request_id, track_namespace, parameters };
596
- }
597
-
598
- function decodePublishNamespaceDonePayload(r: BufferReader): Draft15Message {
599
- const track_namespace = r.readTuple();
600
- return { type: "publish_namespace_done", track_namespace };
601
- }
602
-
603
- function decodePublishNamespaceCancelPayload(r: BufferReader): Draft15Message {
604
- const track_namespace = r.readTuple();
605
- const error_code = r.readVarInt();
606
- const reason_phrase = r.readString();
607
- return { type: "publish_namespace_cancel", track_namespace, error_code, reason_phrase };
608
- }
609
-
610
- function decodeSubscribeNamespacePayload(r: BufferReader): Draft15Message {
611
- const request_id = r.readVarInt();
612
- const namespace_prefix = r.readTuple();
613
- const parameters = decodeParams(r);
614
- return { type: "subscribe_namespace", request_id, namespace_prefix, parameters };
615
- }
616
-
617
- function decodeUnsubscribeNamespacePayload(r: BufferReader): Draft15Message {
618
- const request_id = r.readVarInt();
619
- return { type: "unsubscribe_namespace", request_id };
620
- }
621
-
622
- function decodeFetchPayload(r: BufferReader): Draft15Message {
623
- const request_id = r.readVarInt();
624
- const fetch_type = r.readVarInt();
625
- const ft = Number(fetch_type);
626
-
627
- if (ft < 1 || ft > 3) {
628
- throw new DecodeError("CONSTRAINT_VIOLATION", `Invalid fetch_type: ${ft}`, r.offset);
629
- }
630
-
631
- let standalone: StandaloneFetch | undefined;
632
- let joining: JoiningFetch | undefined;
633
-
634
- if (ft === 1) {
635
- // Standalone Fetch
636
- const track_namespace = r.readTuple();
637
- const track_name = r.readString();
638
- const start_group = r.readVarInt();
639
- const start_object = r.readVarInt();
640
- const end_group = r.readVarInt();
641
- const end_object = r.readVarInt();
642
- standalone = { track_namespace, track_name, start_group, start_object, end_group, end_object };
643
- } else {
644
- // Joining Fetch (relative=2, absolute=3)
645
- const joining_request_id = r.readVarInt();
646
- const joining_start = r.readVarInt();
647
- joining = { joining_request_id, joining_start };
648
- }
649
-
650
- const parameters = decodeParams(r);
651
-
652
- return {
653
- type: "fetch",
654
- request_id,
655
- fetch_type,
656
- standalone,
657
- joining,
658
- parameters,
659
- } as Draft15Fetch;
660
- }
661
-
662
- function decodeFetchOkPayload(r: BufferReader): Draft15Message {
663
- const request_id = r.readVarInt();
664
- const end_of_track = r.readUint8();
665
- const end_group = r.readVarInt();
666
- const end_object = r.readVarInt();
667
- const parameters = decodeParams(r);
668
- return { type: "fetch_ok", request_id, end_of_track, end_group, end_object, parameters };
669
- }
670
-
671
- function decodeFetchCancelPayload(r: BufferReader): Draft15Message {
672
- const request_id = r.readVarInt();
673
- return { type: "fetch_cancel", request_id };
674
- }
675
-
676
- function decodeTrackStatusPayload(r: BufferReader): Draft15Message {
677
- const request_id = r.readVarInt();
678
- const track_namespace = r.readTuple();
679
- const track_name = r.readString();
680
- const parameters = decodeParams(r);
681
- return { type: "track_status", request_id, track_namespace, track_name, parameters };
682
- }
683
-
684
- function decodeRequestOkPayload(r: BufferReader): Draft15Message {
685
- const request_id = r.readVarInt();
686
- const parameters = decodeParams(r);
687
- return { type: "request_ok", request_id, parameters };
688
- }
689
-
690
- function decodeRequestErrorPayload(r: BufferReader): Draft15Message {
691
- const request_id = r.readVarInt();
692
- const error_code = r.readVarInt();
693
- const reason_phrase = r.readString();
694
- return { type: "request_error", request_id, error_code, reason_phrase };
695
- }
696
-
697
- function decodeGoAwayPayload(r: BufferReader): Draft15Message {
698
- const new_session_uri = r.readString();
699
- return { type: "goaway", new_session_uri };
700
- }
701
-
702
- function decodeMaxRequestIdPayload(r: BufferReader): Draft15Message {
703
- const max_request_id = r.readVarInt();
704
- return { type: "max_request_id", max_request_id };
705
- }
706
-
707
- function decodeRequestsBlockedPayload(r: BufferReader): Draft15Message {
708
- const maximum_request_id = r.readVarInt();
709
- return { type: "requests_blocked", maximum_request_id };
710
- }
711
-
712
- // ─── Payload dispatch tables ───────────────────────────────────────────────────
713
-
714
- const payloadDecoders: ReadonlyMap<bigint, (r: BufferReader) => Draft15Message> = new Map([
715
- [MSG_CLIENT_SETUP, decodeClientSetupPayload],
716
- [MSG_SERVER_SETUP, decodeServerSetupPayload],
717
- [MSG_SUBSCRIBE, decodeSubscribePayload],
718
- [MSG_SUBSCRIBE_OK, decodeSubscribeOkPayload],
719
- [MSG_SUBSCRIBE_UPDATE, decodeSubscribeUpdatePayload],
720
- [MSG_UNSUBSCRIBE, decodeUnsubscribePayload],
721
- [MSG_PUBLISH, decodePublishPayload],
722
- [MSG_PUBLISH_OK, decodePublishOkPayload],
723
- [MSG_PUBLISH_DONE, decodePublishDonePayload],
724
- [MSG_PUBLISH_NAMESPACE, decodePublishNamespacePayload],
725
- [MSG_PUBLISH_NAMESPACE_DONE, decodePublishNamespaceDonePayload],
726
- [MSG_PUBLISH_NAMESPACE_CANCEL, decodePublishNamespaceCancelPayload],
727
- [MSG_SUBSCRIBE_NAMESPACE, decodeSubscribeNamespacePayload],
728
- [MSG_UNSUBSCRIBE_NAMESPACE, decodeUnsubscribeNamespacePayload],
729
- [MSG_FETCH, decodeFetchPayload],
730
- [MSG_FETCH_OK, decodeFetchOkPayload],
731
- [MSG_FETCH_CANCEL, decodeFetchCancelPayload],
732
- [MSG_TRACK_STATUS, decodeTrackStatusPayload],
733
- [MSG_REQUEST_OK, decodeRequestOkPayload],
734
- [MSG_REQUEST_ERROR, decodeRequestErrorPayload],
735
- [MSG_GOAWAY, decodeGoAwayPayload],
736
- [MSG_MAX_REQUEST_ID, decodeMaxRequestIdPayload],
737
- [MSG_REQUESTS_BLOCKED, decodeRequestsBlockedPayload],
738
- ]);
739
-
740
- // ─── Public API ────────────────────────────────────────────────────────────────
741
-
742
- /**
743
- * Encode a draft-15 control message with type(varint) + length(uint16 BE) + payload.
744
- */
745
- export function encodeMessage(message: Draft15Message): Uint8Array {
746
- const typeId = MESSAGE_ID_MAP.get(message.type);
747
- if (typeId === undefined) {
748
- throw new Error(`Unknown message type: ${message.type}`);
749
- }
750
-
751
- // Encode payload into a separate buffer
752
- const payloadWriter = new BufferWriter();
753
- encodePayload(message, payloadWriter);
754
- const payload = payloadWriter.finish();
755
-
756
- if (payload.byteLength > 0xffff) {
757
- throw new Error(`Payload too large for 16-bit length: ${payload.byteLength}`);
758
- }
759
-
760
- // Write framed message: type(varint) + length(uint16 BE) + payload
761
- const writer = new BufferWriter();
762
- writer.writeVarInt(typeId);
763
- writer.writeUint8((payload.byteLength >> 8) & 0xff);
764
- writer.writeUint8(payload.byteLength & 0xff);
765
- writer.writeBytes(payload);
766
-
767
- return writer.finish();
768
- }
769
-
770
- function encodePayload(msg: Draft15Message, w: BufferWriter): void {
771
- switch (msg.type) {
772
- case "client_setup":
773
- return encodeClientSetupPayload(msg, w);
774
- case "server_setup":
775
- return encodeServerSetupPayload(msg, w);
776
- case "subscribe":
777
- return encodeSubscribePayload(msg, w);
778
- case "subscribe_ok":
779
- return encodeSubscribeOkPayload(msg, w);
780
- case "subscribe_update":
781
- return encodeSubscribeUpdatePayload(msg, w);
782
- case "unsubscribe":
783
- return encodeUnsubscribePayload(msg, w);
784
- case "publish":
785
- return encodePublishPayload(msg, w);
786
- case "publish_ok":
787
- return encodePublishOkPayload(msg, w);
788
- case "publish_done":
789
- return encodePublishDonePayload(msg, w);
790
- case "publish_namespace":
791
- return encodePublishNamespacePayload(msg, w);
792
- case "publish_namespace_done":
793
- return encodePublishNamespaceDonePayload(msg, w);
794
- case "publish_namespace_cancel":
795
- return encodePublishNamespaceCancelPayload(msg, w);
796
- case "subscribe_namespace":
797
- return encodeSubscribeNamespacePayload(msg, w);
798
- case "unsubscribe_namespace":
799
- return encodeUnsubscribeNamespacePayload(msg, w);
800
- case "fetch":
801
- return encodeFetchPayload(msg, w);
802
- case "fetch_ok":
803
- return encodeFetchOkPayload(msg, w);
804
- case "fetch_cancel":
805
- return encodeFetchCancelPayload(msg, w);
806
- case "track_status":
807
- return encodeTrackStatusPayload(msg, w);
808
- case "request_ok":
809
- return encodeRequestOkPayload(msg, w);
810
- case "request_error":
811
- return encodeRequestErrorPayload(msg, w);
812
- case "goaway":
813
- return encodeGoAwayPayload(msg, w);
814
- case "max_request_id":
815
- return encodeMaxRequestIdPayload(msg, w);
816
- case "requests_blocked":
817
- return encodeRequestsBlockedPayload(msg, w);
818
- default: {
819
- const _exhaustive: never = msg;
820
- throw new Error(`Unhandled message type: ${(_exhaustive as Draft15Message).type}`);
821
- }
822
- }
823
- }
824
-
825
- /**
826
- * Decode a draft-15 control message from bytes (type + uint16 length + payload).
827
- */
828
- export function decodeMessage(bytes: Uint8Array): DecodeResult<Draft15Message> {
829
- try {
830
- const reader = new BufferReader(bytes);
831
- const typeId = reader.readVarInt();
832
-
833
- // Read 16-bit big-endian payload length
834
- const lenHi = reader.readUint8();
835
- const lenLo = reader.readUint8();
836
- const payloadLength = (lenHi << 8) | lenLo;
837
-
838
- // Read exactly payloadLength bytes
839
- const payloadBytes = reader.readBytes(payloadLength);
840
- const payloadReader = new BufferReader(payloadBytes);
841
-
842
- const decoder = payloadDecoders.get(typeId);
843
- if (!decoder) {
844
- return {
845
- ok: false,
846
- error: new DecodeError(
847
- "UNKNOWN_MESSAGE_TYPE",
848
- `Unknown message type ID: 0x${typeId.toString(16)}`,
849
- 0,
850
- ),
851
- };
852
- }
853
-
854
- const message = decoder(payloadReader);
855
- return { ok: true, value: message, bytesRead: reader.offset };
856
- } catch (e) {
857
- if (e instanceof DecodeError) {
858
- return { ok: false, error: e };
859
- }
860
- throw e;
861
- }
862
- }
863
-
864
- // ─── Data Stream Re-exports ───────────────────────────────────────────────────
865
-
866
- import {
867
- encodeSubgroupStream,
868
- decodeSubgroupStream,
869
- encodeDatagram,
870
- decodeDatagram,
871
- encodeFetchStream,
872
- decodeFetchStream,
873
- decodeDataStream,
874
- createSubgroupStreamDecoder,
875
- createFetchStreamDecoder,
876
- createDataStreamDecoder,
877
- } from "./data-streams.js";
878
-
879
- export {
880
- encodeSubgroupStream,
881
- decodeSubgroupStream,
882
- encodeDatagram,
883
- decodeDatagram,
884
- encodeFetchStream,
885
- decodeFetchStream,
886
- decodeDataStream,
887
- createSubgroupStreamDecoder,
888
- createFetchStreamDecoder,
889
- createDataStreamDecoder,
890
- };
891
-
892
- // ─── Stream Decoders ───────────────────────────────────────────────────────────
893
-
894
- /**
895
- * Create a TransformStream that decodes a continuous byte stream into
896
- * individual Draft15Message objects.
897
- */
898
- export function createStreamDecoder(): TransformStream<Uint8Array, Draft15Message> {
899
- let buffer = new Uint8Array(0);
900
-
901
- return new TransformStream<Uint8Array, Draft15Message>({
902
- transform(chunk, controller) {
903
- const newBuffer = new Uint8Array(buffer.length + chunk.length);
904
- newBuffer.set(buffer, 0);
905
- newBuffer.set(chunk, buffer.length);
906
- buffer = newBuffer;
907
-
908
- while (buffer.length > 0) {
909
- const result = decodeMessage(buffer);
910
- if (!result.ok) {
911
- if (result.error.code === "UNEXPECTED_END") {
912
- break;
913
- }
914
- controller.error(result.error);
915
- return;
916
- }
917
- controller.enqueue(result.value);
918
- buffer = buffer.slice(result.bytesRead);
919
- }
920
- },
921
-
922
- flush(controller) {
923
- if (buffer.length > 0) {
924
- controller.error(
925
- new DecodeError("UNEXPECTED_END", "Stream ended with incomplete message data", 0),
926
- );
927
- }
928
- },
929
- });
930
- }
931
-
932
- // ─── Codec Factory ─────────────────────────────────────────────────────────────
933
-
934
- export interface Draft15Codec extends BaseCodec<Draft15Message> {
935
- readonly draft: "draft-ietf-moq-transport-15";
936
- encodeSubgroupStream(stream: SubgroupStream): Uint8Array;
937
- encodeDatagram(dg: DatagramObject): Uint8Array;
938
- encodeFetchStream(stream: FetchStream): Uint8Array;
939
- decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream>;
940
- decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject>;
941
- decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream>;
942
- decodeDataStream(
943
- streamType: "subgroup" | "datagram" | "fetch",
944
- bytes: Uint8Array,
945
- ): DecodeResult<Draft15DataStream>;
946
- createStreamDecoder(): TransformStream<Uint8Array, Draft15Message>;
947
- createSubgroupStreamDecoder(): TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>;
948
- createFetchStreamDecoder(): TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>;
949
- createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent>;
950
- }
951
-
952
- export function createDraft15Codec(): Draft15Codec {
953
- return {
954
- draft: "draft-ietf-moq-transport-15",
955
- encodeMessage,
956
- decodeMessage,
957
- encodeSubgroupStream,
958
- encodeDatagram,
959
- encodeFetchStream,
960
- decodeSubgroupStream,
961
- decodeDatagram,
962
- decodeFetchStream,
963
- decodeDataStream,
964
- createStreamDecoder,
965
- createSubgroupStreamDecoder,
966
- createFetchStreamDecoder,
967
- createDataStreamDecoder,
968
- };
969
- }
1
+ import { BufferReader } from '../../core/buffer-reader.js'
2
+ import { BufferWriter } from '../../core/buffer-writer.js'
3
+ import { bytesToHex, hexToBytes } from '../../core/hex.js'
4
+ import type { BaseCodec, DecodeResult } from '../../core/types.js'
5
+ import { DecodeError } from '../../core/types.js'
6
+ import {
7
+ MESSAGE_ID_MAP,
8
+ MSG_CLIENT_SETUP,
9
+ MSG_FETCH,
10
+ MSG_FETCH_CANCEL,
11
+ MSG_FETCH_OK,
12
+ MSG_GOAWAY,
13
+ MSG_MAX_REQUEST_ID,
14
+ MSG_PUBLISH,
15
+ MSG_PUBLISH_DONE,
16
+ MSG_PUBLISH_NAMESPACE,
17
+ MSG_PUBLISH_NAMESPACE_CANCEL,
18
+ MSG_PUBLISH_NAMESPACE_DONE,
19
+ MSG_PUBLISH_OK,
20
+ MSG_REQUEST_ERROR,
21
+ MSG_REQUEST_OK,
22
+ MSG_REQUESTS_BLOCKED,
23
+ MSG_SERVER_SETUP,
24
+ MSG_SUBSCRIBE,
25
+ MSG_SUBSCRIBE_NAMESPACE,
26
+ MSG_SUBSCRIBE_OK,
27
+ MSG_SUBSCRIBE_UPDATE,
28
+ MSG_TRACK_STATUS,
29
+ MSG_UNSUBSCRIBE,
30
+ MSG_UNSUBSCRIBE_NAMESPACE,
31
+ SETUP_PARAM_AUTHORITY,
32
+ SETUP_PARAM_AUTHORIZATION_TOKEN,
33
+ SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE,
34
+ SETUP_PARAM_MAX_REQUEST_ID,
35
+ SETUP_PARAM_MOQT_IMPLEMENTATION,
36
+ SETUP_PARAM_PATH,
37
+ } from './messages.js'
38
+ import type {
39
+ AuthorizationToken,
40
+ DatagramObject,
41
+ DataStreamEvent,
42
+ Draft15DataStream,
43
+ Draft15Fetch,
44
+ Draft15Message,
45
+ Draft15Params,
46
+ Draft15SetupParams,
47
+ FetchStream,
48
+ FetchStreamHeader,
49
+ JoiningFetch,
50
+ ObjectPayload,
51
+ StandaloneFetch,
52
+ SubgroupStream,
53
+ SubgroupStreamHeader,
54
+ UnknownParam,
55
+ } from './types.js'
56
+
57
+ const textEncoder = /* @__PURE__ */ new TextEncoder()
58
+ const textDecoder = /* @__PURE__ */ new TextDecoder()
59
+
60
+ // ─── Setup Parameter Encoding/Decoding ──────────────────────────────────────────
61
+
62
+ function encodeSetupParams(params: Draft15SetupParams, writer: BufferWriter): void {
63
+ let count = 0
64
+ if (params.path !== undefined) count++
65
+ if (params.max_request_id !== undefined) count++
66
+ if (params.authorization_token !== undefined) count++
67
+ if (params.max_auth_token_cache_size !== undefined) count++
68
+ if (params.authority !== undefined) count++
69
+ if (params.moqt_implementation !== undefined) count++
70
+ if (params.unknown) count += params.unknown.length
71
+
72
+ writer.writeVarInt(count)
73
+
74
+ // PATH (0x01) - odd, length-prefixed bytes
75
+ if (params.path !== undefined) {
76
+ writer.writeVarInt(SETUP_PARAM_PATH)
77
+ const encoded = textEncoder.encode(params.path)
78
+ writer.writeVarInt(encoded.byteLength)
79
+ writer.writeBytes(encoded)
80
+ }
81
+
82
+ // MAX_REQUEST_ID (0x02) - even, varint value
83
+ if (params.max_request_id !== undefined) {
84
+ writer.writeVarInt(SETUP_PARAM_MAX_REQUEST_ID)
85
+ writer.writeVarInt(params.max_request_id)
86
+ }
87
+
88
+ // AUTHORIZATION_TOKEN (0x03) - odd, length-prefixed with nested structure
89
+ if (params.authorization_token !== undefined) {
90
+ writer.writeVarInt(SETUP_PARAM_AUTHORIZATION_TOKEN)
91
+ const tmpW = new BufferWriter(64)
92
+ encodeAuthorizationToken(params.authorization_token, tmpW)
93
+ const raw = tmpW.finish()
94
+ writer.writeVarInt(raw.byteLength)
95
+ writer.writeBytes(raw)
96
+ }
97
+
98
+ // MAX_AUTH_TOKEN_CACHE_SIZE (0x04) - even, varint value
99
+ if (params.max_auth_token_cache_size !== undefined) {
100
+ writer.writeVarInt(SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE)
101
+ writer.writeVarInt(params.max_auth_token_cache_size)
102
+ }
103
+
104
+ // AUTHORITY (0x05) - odd, length-prefixed bytes
105
+ if (params.authority !== undefined) {
106
+ writer.writeVarInt(SETUP_PARAM_AUTHORITY)
107
+ const encoded = textEncoder.encode(params.authority)
108
+ writer.writeVarInt(encoded.byteLength)
109
+ writer.writeBytes(encoded)
110
+ }
111
+
112
+ // MOQT_IMPLEMENTATION (0x07) - odd, length-prefixed bytes
113
+ if (params.moqt_implementation !== undefined) {
114
+ writer.writeVarInt(SETUP_PARAM_MOQT_IMPLEMENTATION)
115
+ const encoded = textEncoder.encode(params.moqt_implementation)
116
+ writer.writeVarInt(encoded.byteLength)
117
+ writer.writeBytes(encoded)
118
+ }
119
+
120
+ // Unknown params
121
+ if (params.unknown) {
122
+ for (const u of params.unknown) {
123
+ const id = BigInt(u.id)
124
+ writer.writeVarInt(id)
125
+ if (id % 2n === 0n) {
126
+ // Even: value is a varint — raw_hex contains the varint bytes
127
+ const raw = hexToBytes(u.raw_hex)
128
+ const tmpReader = new BufferReader(raw)
129
+ const value = tmpReader.readVarInt()
130
+ writer.writeVarInt(value)
131
+ } else {
132
+ // Odd: length-prefixed bytes
133
+ const raw = hexToBytes(u.raw_hex)
134
+ writer.writeVarInt(raw.byteLength)
135
+ writer.writeBytes(raw)
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ function decodeSetupParams(reader: BufferReader): Draft15SetupParams {
142
+ const count = Number(reader.readVarInt())
143
+ const result: Draft15SetupParams = {}
144
+ const unknown: UnknownParam[] = []
145
+
146
+ for (let i = 0; i < count; i++) {
147
+ const paramType = reader.readVarInt()
148
+
149
+ if (paramType % 2n === 0n) {
150
+ // Even: value is a varint directly
151
+ const value = reader.readVarInt()
152
+ if (paramType === SETUP_PARAM_MAX_REQUEST_ID) {
153
+ result.max_request_id = value
154
+ } else if (paramType === SETUP_PARAM_MAX_AUTH_TOKEN_CACHE_SIZE) {
155
+ result.max_auth_token_cache_size = value
156
+ } else {
157
+ const tmpWriter = new BufferWriter(16)
158
+ tmpWriter.writeVarInt(value)
159
+ const raw = tmpWriter.finish()
160
+ unknown.push({
161
+ id: `0x${paramType.toString(16)}`,
162
+ length: raw.byteLength,
163
+ raw_hex: bytesToHex(raw),
164
+ })
165
+ }
166
+ } else {
167
+ // Odd: value is length-prefixed bytes
168
+ const length = Number(reader.readVarInt())
169
+ const bytes = reader.readBytes(length)
170
+ if (paramType === SETUP_PARAM_PATH) {
171
+ result.path = textDecoder.decode(bytes)
172
+ } else if (paramType === SETUP_PARAM_AUTHORIZATION_TOKEN) {
173
+ result.authorization_token = decodeAuthorizationToken(new BufferReader(bytes))
174
+ } else if (paramType === SETUP_PARAM_AUTHORITY) {
175
+ result.authority = textDecoder.decode(bytes)
176
+ } else if (paramType === SETUP_PARAM_MOQT_IMPLEMENTATION) {
177
+ result.moqt_implementation = textDecoder.decode(bytes)
178
+ } else {
179
+ unknown.push({
180
+ id: `0x${paramType.toString(16)}`,
181
+ length,
182
+ raw_hex: bytesToHex(bytes),
183
+ })
184
+ }
185
+ }
186
+ }
187
+
188
+ if (unknown.length > 0) {
189
+ result.unknown = unknown
190
+ }
191
+
192
+ return result
193
+ }
194
+
195
+ // ─── Authorization Token Encoding/Decoding ────────────────────────────────────
196
+
197
+ function encodeAuthorizationToken(token: AuthorizationToken, w: BufferWriter): void {
198
+ w.writeVarInt(token.alias_type)
199
+ const aliasType = Number(token.alias_type)
200
+ if (aliasType === 0 || aliasType === 1) {
201
+ w.writeVarInt(token.token_alias!)
202
+ }
203
+ if (aliasType === 1 || aliasType === 3) {
204
+ w.writeVarInt(token.token_type!)
205
+ // token_value is the remaining bytes (no inner length prefix)
206
+ const tokenBytes = hexToBytes(token.token_value_hex!)
207
+ w.writeBytes(tokenBytes)
208
+ }
209
+ }
210
+
211
+ function decodeAuthorizationToken(r: BufferReader): AuthorizationToken {
212
+ const alias_type = r.readVarInt()
213
+ const aliasType = Number(alias_type)
214
+ const result: Record<string, unknown> = { alias_type }
215
+ if (aliasType === 0 || aliasType === 1) {
216
+ result.token_alias = r.readVarInt()
217
+ }
218
+ if (aliasType === 1 || aliasType === 3) {
219
+ result.token_type = r.readVarInt()
220
+ // token_value is the remaining bytes in the length-prefixed block
221
+ const tokenBytes = r.readBytesView(r.remaining)
222
+ result.token_value_hex = bytesToHex(tokenBytes)
223
+ }
224
+ return result as unknown as AuthorizationToken
225
+ }
226
+
227
+ // ─── Version-Specific Parameter Encoding/Decoding ───────────────────────────────
228
+
229
+ // Well-known version-specific parameter IDs
230
+ const PARAM_DELIVERY_TIMEOUT = 0x02n // even: varint
231
+ const PARAM_AUTHORIZATION_TOKEN = 0x03n // odd: length-prefixed (nested)
232
+ const PARAM_MAX_CACHE_DURATION = 0x04n // even: varint
233
+ const PARAM_EXPIRES = 0x08n // even: varint
234
+ const PARAM_LARGEST_OBJECT = 0x09n // odd: length-prefixed (group varint + object varint)
235
+ const PARAM_PUBLISHER_PRIORITY = 0x0en // even: varint
236
+ const PARAM_FORWARD = 0x10n // even: varint
237
+ const PARAM_SUBSCRIBER_PRIORITY = 0x20n // even: varint
238
+ const PARAM_SUBSCRIPTION_FILTER = 0x21n // odd: length-prefixed
239
+ const PARAM_GROUP_ORDER = 0x22n // even: varint
240
+ const PARAM_DYNAMIC_GROUPS = 0x30n // even: varint
241
+ const PARAM_NEW_GROUP_REQUEST = 0x32n // even: varint
242
+
243
+ function encodeParams(params: Draft15Params, writer: BufferWriter): void {
244
+ // Count known + unknown params
245
+ let count = params.unknown ? params.unknown.length : 0
246
+ if (params.delivery_timeout !== undefined) count++
247
+ if (params.authorization_token !== undefined) count++
248
+ if (params.max_cache_duration !== undefined) count++
249
+ if (params.expires !== undefined) count++
250
+ if (params.largest_object !== undefined) count++
251
+ if (params.publisher_priority !== undefined) count++
252
+ if (params.forward !== undefined) count++
253
+ if (params.subscriber_priority !== undefined) count++
254
+ if (params.subscription_filter !== undefined) count++
255
+ if (params.group_order !== undefined) count++
256
+ if (params.dynamic_groups !== undefined) count++
257
+ if (params.new_group_request !== undefined) count++
258
+ writer.writeVarInt(count)
259
+
260
+ // Encode known params (sorted by ID for canonical encoding)
261
+ if (params.delivery_timeout !== undefined) {
262
+ writer.writeVarInt(PARAM_DELIVERY_TIMEOUT)
263
+ writer.writeVarInt(params.delivery_timeout)
264
+ }
265
+ if (params.authorization_token !== undefined) {
266
+ writer.writeVarInt(PARAM_AUTHORIZATION_TOKEN)
267
+ const tmpW = new BufferWriter(64)
268
+ encodeAuthorizationToken(params.authorization_token, tmpW)
269
+ const raw = tmpW.finish()
270
+ writer.writeVarInt(raw.byteLength)
271
+ writer.writeBytes(raw)
272
+ }
273
+ if (params.max_cache_duration !== undefined) {
274
+ writer.writeVarInt(PARAM_MAX_CACHE_DURATION)
275
+ writer.writeVarInt(params.max_cache_duration)
276
+ }
277
+ if (params.expires !== undefined) {
278
+ writer.writeVarInt(PARAM_EXPIRES)
279
+ writer.writeVarInt(params.expires)
280
+ }
281
+ if (params.largest_object !== undefined) {
282
+ writer.writeVarInt(PARAM_LARGEST_OBJECT)
283
+ const tmpW = new BufferWriter(16)
284
+ tmpW.writeVarInt(params.largest_object.group)
285
+ tmpW.writeVarInt(params.largest_object.object)
286
+ const raw = tmpW.finish()
287
+ writer.writeVarInt(raw.byteLength)
288
+ writer.writeBytes(raw)
289
+ }
290
+ if (params.publisher_priority !== undefined) {
291
+ writer.writeVarInt(PARAM_PUBLISHER_PRIORITY)
292
+ writer.writeVarInt(params.publisher_priority)
293
+ }
294
+ if (params.forward !== undefined) {
295
+ writer.writeVarInt(PARAM_FORWARD)
296
+ writer.writeVarInt(params.forward)
297
+ }
298
+ if (params.subscriber_priority !== undefined) {
299
+ writer.writeVarInt(PARAM_SUBSCRIBER_PRIORITY)
300
+ writer.writeVarInt(params.subscriber_priority)
301
+ }
302
+ if (params.subscription_filter !== undefined) {
303
+ writer.writeVarInt(PARAM_SUBSCRIPTION_FILTER)
304
+ const tmpW = new BufferWriter(32)
305
+ const f = params.subscription_filter
306
+ tmpW.writeVarInt(f.filter_type)
307
+ if (f.filter_type === 3n || f.filter_type === 4n) {
308
+ tmpW.writeVarInt(f.start_group!)
309
+ tmpW.writeVarInt(f.start_object!)
310
+ }
311
+ if (f.filter_type === 4n) {
312
+ tmpW.writeVarInt(f.end_group!)
313
+ }
314
+ const raw = tmpW.finish()
315
+ writer.writeVarInt(raw.byteLength)
316
+ writer.writeBytes(raw)
317
+ }
318
+ if (params.group_order !== undefined) {
319
+ writer.writeVarInt(PARAM_GROUP_ORDER)
320
+ writer.writeVarInt(params.group_order)
321
+ }
322
+ if (params.dynamic_groups !== undefined) {
323
+ writer.writeVarInt(PARAM_DYNAMIC_GROUPS)
324
+ writer.writeVarInt(params.dynamic_groups)
325
+ }
326
+ if (params.new_group_request !== undefined) {
327
+ writer.writeVarInt(PARAM_NEW_GROUP_REQUEST)
328
+ writer.writeVarInt(params.new_group_request)
329
+ }
330
+
331
+ // Encode unknown params
332
+ if (params.unknown) {
333
+ for (const u of params.unknown) {
334
+ const id = BigInt(u.id)
335
+ writer.writeVarInt(id)
336
+ if (id % 2n === 0n) {
337
+ const raw = hexToBytes(u.raw_hex)
338
+ const tmpReader = new BufferReader(raw)
339
+ const value = tmpReader.readVarInt()
340
+ writer.writeVarInt(value)
341
+ } else {
342
+ const raw = hexToBytes(u.raw_hex)
343
+ writer.writeVarInt(raw.byteLength)
344
+ writer.writeBytes(raw)
345
+ }
346
+ }
347
+ }
348
+ }
349
+
350
+ function decodeParams(reader: BufferReader): Draft15Params {
351
+ const count = Number(reader.readVarInt())
352
+ const result: Draft15Params = {}
353
+ const unknown: UnknownParam[] = []
354
+
355
+ for (let i = 0; i < count; i++) {
356
+ const paramType = reader.readVarInt()
357
+
358
+ if (paramType === PARAM_DELIVERY_TIMEOUT) {
359
+ result.delivery_timeout = reader.readVarInt()
360
+ } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
361
+ const length = Number(reader.readVarInt())
362
+ const tokenBytes = reader.readBytes(length)
363
+ result.authorization_token = decodeAuthorizationToken(new BufferReader(tokenBytes))
364
+ } else if (paramType === PARAM_MAX_CACHE_DURATION) {
365
+ result.max_cache_duration = reader.readVarInt()
366
+ } else if (paramType === PARAM_EXPIRES) {
367
+ result.expires = reader.readVarInt()
368
+ } else if (paramType === PARAM_PUBLISHER_PRIORITY) {
369
+ result.publisher_priority = reader.readVarInt()
370
+ } else if (paramType === PARAM_FORWARD) {
371
+ result.forward = reader.readVarInt()
372
+ } else if (paramType === PARAM_SUBSCRIBER_PRIORITY) {
373
+ result.subscriber_priority = reader.readVarInt()
374
+ } else if (paramType === PARAM_GROUP_ORDER) {
375
+ result.group_order = reader.readVarInt()
376
+ } else if (paramType === PARAM_DYNAMIC_GROUPS) {
377
+ result.dynamic_groups = reader.readVarInt()
378
+ } else if (paramType === PARAM_NEW_GROUP_REQUEST) {
379
+ result.new_group_request = reader.readVarInt()
380
+ } else if (paramType === PARAM_LARGEST_OBJECT) {
381
+ const length = Number(reader.readVarInt())
382
+ const startOff = reader.offset
383
+ const group = reader.readVarInt()
384
+ const object = reader.readVarInt()
385
+ const consumed = reader.offset - startOff
386
+ if (consumed < length) reader.readBytes(length - consumed)
387
+ result.largest_object = { group, object }
388
+ } else if (paramType === PARAM_SUBSCRIPTION_FILTER) {
389
+ const length = Number(reader.readVarInt())
390
+ const startOff = reader.offset
391
+ const filter_type = reader.readVarInt()
392
+ const filter: {
393
+ filter_type: bigint
394
+ start_group?: bigint
395
+ start_object?: bigint
396
+ end_group?: bigint
397
+ } = { filter_type }
398
+ if (filter_type === 3n || filter_type === 4n) {
399
+ filter.start_group = reader.readVarInt()
400
+ filter.start_object = reader.readVarInt()
401
+ }
402
+ if (filter_type === 4n) {
403
+ filter.end_group = reader.readVarInt()
404
+ }
405
+ const consumed = reader.offset - startOff
406
+ if (consumed < length) reader.readBytes(length - consumed)
407
+ result.subscription_filter = filter
408
+ } else if (paramType % 2n === 0n) {
409
+ // Unknown even: varint value
410
+ const value = reader.readVarInt()
411
+ const tmpWriter = new BufferWriter(16)
412
+ tmpWriter.writeVarInt(value)
413
+ const raw = tmpWriter.finish()
414
+ unknown.push({
415
+ id: `0x${paramType.toString(16)}`,
416
+ length: raw.byteLength,
417
+ raw_hex: bytesToHex(raw),
418
+ })
419
+ } else {
420
+ // Unknown odd: length-prefixed bytes
421
+ const length = Number(reader.readVarInt())
422
+ const bytes = reader.readBytes(length)
423
+ unknown.push({
424
+ id: `0x${paramType.toString(16)}`,
425
+ length,
426
+ raw_hex: bytesToHex(bytes),
427
+ })
428
+ }
429
+ }
430
+
431
+ if (unknown.length > 0) {
432
+ result.unknown = unknown
433
+ }
434
+
435
+ return result
436
+ }
437
+
438
+ // ─── Payload Encoders ──────────────────────────────────────────────────────────
439
+
440
+ function encodeClientSetupPayload(
441
+ msg: Draft15Message & { type: 'client_setup' },
442
+ w: BufferWriter,
443
+ ): void {
444
+ encodeSetupParams(msg.parameters, w)
445
+ }
446
+
447
+ function encodeServerSetupPayload(
448
+ msg: Draft15Message & { type: 'server_setup' },
449
+ w: BufferWriter,
450
+ ): void {
451
+ encodeSetupParams(msg.parameters, w)
452
+ }
453
+
454
+ function encodeSubscribePayload(
455
+ msg: Draft15Message & { type: 'subscribe' },
456
+ w: BufferWriter,
457
+ ): void {
458
+ w.writeVarInt(msg.request_id)
459
+ w.writeTuple(msg.track_namespace)
460
+ w.writeString(msg.track_name)
461
+ encodeParams(msg.parameters, w)
462
+ }
463
+
464
+ function encodeSubscribeOkPayload(
465
+ msg: Draft15Message & { type: 'subscribe_ok' },
466
+ w: BufferWriter,
467
+ ): void {
468
+ w.writeVarInt(msg.request_id)
469
+ w.writeVarInt(msg.track_alias)
470
+ encodeParams(msg.parameters, w)
471
+ }
472
+
473
+ function encodeSubscribeUpdatePayload(
474
+ msg: Draft15Message & { type: 'subscribe_update' },
475
+ w: BufferWriter,
476
+ ): void {
477
+ w.writeVarInt(msg.request_id)
478
+ w.writeVarInt(msg.subscription_request_id)
479
+ encodeParams(msg.parameters, w)
480
+ }
481
+
482
+ function encodeUnsubscribePayload(
483
+ msg: Draft15Message & { type: 'unsubscribe' },
484
+ w: BufferWriter,
485
+ ): void {
486
+ w.writeVarInt(msg.request_id)
487
+ }
488
+
489
+ function encodePublishPayload(msg: Draft15Message & { type: 'publish' }, w: BufferWriter): void {
490
+ w.writeVarInt(msg.request_id)
491
+ w.writeTuple(msg.track_namespace)
492
+ w.writeString(msg.track_name)
493
+ w.writeVarInt(msg.track_alias)
494
+ encodeParams(msg.parameters, w)
495
+ }
496
+
497
+ function encodePublishOkPayload(
498
+ msg: Draft15Message & { type: 'publish_ok' },
499
+ w: BufferWriter,
500
+ ): void {
501
+ w.writeVarInt(msg.request_id)
502
+ encodeParams(msg.parameters, w)
503
+ }
504
+
505
+ function encodePublishDonePayload(
506
+ msg: Draft15Message & { type: 'publish_done' },
507
+ w: BufferWriter,
508
+ ): void {
509
+ w.writeVarInt(msg.request_id)
510
+ w.writeVarInt(msg.status_code)
511
+ w.writeVarInt(msg.stream_count)
512
+ w.writeString(msg.reason_phrase)
513
+ }
514
+
515
+ function encodePublishNamespacePayload(
516
+ msg: Draft15Message & { type: 'publish_namespace' },
517
+ w: BufferWriter,
518
+ ): void {
519
+ w.writeVarInt(msg.request_id)
520
+ w.writeTuple(msg.track_namespace)
521
+ encodeParams(msg.parameters, w)
522
+ }
523
+
524
+ function encodePublishNamespaceDonePayload(
525
+ msg: Draft15Message & { type: 'publish_namespace_done' },
526
+ w: BufferWriter,
527
+ ): void {
528
+ w.writeTuple(msg.track_namespace)
529
+ }
530
+
531
+ function encodePublishNamespaceCancelPayload(
532
+ msg: Draft15Message & { type: 'publish_namespace_cancel' },
533
+ w: BufferWriter,
534
+ ): void {
535
+ w.writeTuple(msg.track_namespace)
536
+ w.writeVarInt(msg.error_code)
537
+ w.writeString(msg.reason_phrase)
538
+ }
539
+
540
+ function encodeSubscribeNamespacePayload(
541
+ msg: Draft15Message & { type: 'subscribe_namespace' },
542
+ w: BufferWriter,
543
+ ): void {
544
+ w.writeVarInt(msg.request_id)
545
+ w.writeTuple(msg.namespace_prefix)
546
+ encodeParams(msg.parameters, w)
547
+ }
548
+
549
+ function encodeUnsubscribeNamespacePayload(
550
+ msg: Draft15Message & { type: 'unsubscribe_namespace' },
551
+ w: BufferWriter,
552
+ ): void {
553
+ w.writeVarInt(msg.request_id)
554
+ }
555
+
556
+ function encodeFetchPayload(msg: Draft15Message & { type: 'fetch' }, w: BufferWriter): void {
557
+ w.writeVarInt(msg.request_id)
558
+ w.writeVarInt(msg.fetch_type)
559
+ const ft = Number(msg.fetch_type)
560
+ if (ft === 1 && msg.standalone) {
561
+ // Standalone Fetch
562
+ w.writeTuple(msg.standalone.track_namespace)
563
+ w.writeString(msg.standalone.track_name)
564
+ // Start Location
565
+ w.writeVarInt(msg.standalone.start_group)
566
+ w.writeVarInt(msg.standalone.start_object)
567
+ // End Location
568
+ w.writeVarInt(msg.standalone.end_group)
569
+ w.writeVarInt(msg.standalone.end_object)
570
+ } else if ((ft === 2 || ft === 3) && msg.joining) {
571
+ // Joining Fetch (relative=2, absolute=3)
572
+ w.writeVarInt(msg.joining.joining_request_id)
573
+ w.writeVarInt(msg.joining.joining_start)
574
+ }
575
+ encodeParams(msg.parameters, w)
576
+ }
577
+
578
+ function encodeFetchOkPayload(msg: Draft15Message & { type: 'fetch_ok' }, w: BufferWriter): void {
579
+ w.writeVarInt(msg.request_id)
580
+ w.writeUint8(msg.end_of_track)
581
+ // End Location
582
+ w.writeVarInt(msg.end_group)
583
+ w.writeVarInt(msg.end_object)
584
+ encodeParams(msg.parameters, w)
585
+ }
586
+
587
+ function encodeFetchCancelPayload(
588
+ msg: Draft15Message & { type: 'fetch_cancel' },
589
+ w: BufferWriter,
590
+ ): void {
591
+ w.writeVarInt(msg.request_id)
592
+ }
593
+
594
+ function encodeTrackStatusPayload(
595
+ msg: Draft15Message & { type: 'track_status' },
596
+ w: BufferWriter,
597
+ ): void {
598
+ w.writeVarInt(msg.request_id)
599
+ w.writeTuple(msg.track_namespace)
600
+ w.writeString(msg.track_name)
601
+ encodeParams(msg.parameters, w)
602
+ }
603
+
604
+ function encodeRequestOkPayload(
605
+ msg: Draft15Message & { type: 'request_ok' },
606
+ w: BufferWriter,
607
+ ): void {
608
+ w.writeVarInt(msg.request_id)
609
+ encodeParams(msg.parameters, w)
610
+ }
611
+
612
+ function encodeRequestErrorPayload(
613
+ msg: Draft15Message & { type: 'request_error' },
614
+ w: BufferWriter,
615
+ ): void {
616
+ w.writeVarInt(msg.request_id)
617
+ w.writeVarInt(msg.error_code)
618
+ w.writeString(msg.reason_phrase)
619
+ }
620
+
621
+ function encodeGoAwayPayload(msg: Draft15Message & { type: 'goaway' }, w: BufferWriter): void {
622
+ w.writeString(msg.new_session_uri)
623
+ }
624
+
625
+ function encodeMaxRequestIdPayload(
626
+ msg: Draft15Message & { type: 'max_request_id' },
627
+ w: BufferWriter,
628
+ ): void {
629
+ w.writeVarInt(msg.max_request_id)
630
+ }
631
+
632
+ function encodeRequestsBlockedPayload(
633
+ msg: Draft15Message & { type: 'requests_blocked' },
634
+ w: BufferWriter,
635
+ ): void {
636
+ w.writeVarInt(msg.maximum_request_id)
637
+ }
638
+
639
+ // ─── Payload Decoders ──────────────────────────────────────────────────────────
640
+
641
+ function decodeClientSetupPayload(r: BufferReader): Draft15Message {
642
+ const parameters = decodeSetupParams(r)
643
+ return { type: 'client_setup', parameters }
644
+ }
645
+
646
+ function decodeServerSetupPayload(r: BufferReader): Draft15Message {
647
+ const parameters = decodeSetupParams(r)
648
+ return { type: 'server_setup', parameters }
649
+ }
650
+
651
+ function decodeSubscribePayload(r: BufferReader): Draft15Message {
652
+ const request_id = r.readVarInt()
653
+ const track_namespace = r.readTuple()
654
+ const track_name = r.readString()
655
+ const parameters = decodeParams(r)
656
+ return {
657
+ type: 'subscribe',
658
+ request_id,
659
+ track_namespace,
660
+ track_name,
661
+ parameters,
662
+ }
663
+ }
664
+
665
+ function decodeSubscribeOkPayload(r: BufferReader): Draft15Message {
666
+ const request_id = r.readVarInt()
667
+ const track_alias = r.readVarInt()
668
+ const parameters = decodeParams(r)
669
+ return { type: 'subscribe_ok', request_id, track_alias, parameters }
670
+ }
671
+
672
+ function decodeSubscribeUpdatePayload(r: BufferReader): Draft15Message {
673
+ const request_id = r.readVarInt()
674
+ const subscription_request_id = r.readVarInt()
675
+ const parameters = decodeParams(r)
676
+ return {
677
+ type: 'subscribe_update',
678
+ request_id,
679
+ subscription_request_id,
680
+ parameters,
681
+ }
682
+ }
683
+
684
+ function decodeUnsubscribePayload(r: BufferReader): Draft15Message {
685
+ const request_id = r.readVarInt()
686
+ return { type: 'unsubscribe', request_id }
687
+ }
688
+
689
+ function decodePublishPayload(r: BufferReader): Draft15Message {
690
+ const request_id = r.readVarInt()
691
+ const track_namespace = r.readTuple()
692
+ const track_name = r.readString()
693
+ const track_alias = r.readVarInt()
694
+ const parameters = decodeParams(r)
695
+ return {
696
+ type: 'publish',
697
+ request_id,
698
+ track_namespace,
699
+ track_name,
700
+ track_alias,
701
+ parameters,
702
+ }
703
+ }
704
+
705
+ function decodePublishOkPayload(r: BufferReader): Draft15Message {
706
+ const request_id = r.readVarInt()
707
+ const parameters = decodeParams(r)
708
+ return { type: 'publish_ok', request_id, parameters }
709
+ }
710
+
711
+ function decodePublishDonePayload(r: BufferReader): Draft15Message {
712
+ const request_id = r.readVarInt()
713
+ const status_code = r.readVarInt()
714
+ const stream_count = r.readVarInt()
715
+ const reason_phrase = r.readString()
716
+ return {
717
+ type: 'publish_done',
718
+ request_id,
719
+ status_code,
720
+ stream_count,
721
+ reason_phrase,
722
+ }
723
+ }
724
+
725
+ function decodePublishNamespacePayload(r: BufferReader): Draft15Message {
726
+ const request_id = r.readVarInt()
727
+ const track_namespace = r.readTuple()
728
+ const parameters = decodeParams(r)
729
+ return { type: 'publish_namespace', request_id, track_namespace, parameters }
730
+ }
731
+
732
+ function decodePublishNamespaceDonePayload(r: BufferReader): Draft15Message {
733
+ const track_namespace = r.readTuple()
734
+ return { type: 'publish_namespace_done', track_namespace }
735
+ }
736
+
737
+ function decodePublishNamespaceCancelPayload(r: BufferReader): Draft15Message {
738
+ const track_namespace = r.readTuple()
739
+ const error_code = r.readVarInt()
740
+ const reason_phrase = r.readString()
741
+ return {
742
+ type: 'publish_namespace_cancel',
743
+ track_namespace,
744
+ error_code,
745
+ reason_phrase,
746
+ }
747
+ }
748
+
749
+ function decodeSubscribeNamespacePayload(r: BufferReader): Draft15Message {
750
+ const request_id = r.readVarInt()
751
+ const namespace_prefix = r.readTuple()
752
+ const parameters = decodeParams(r)
753
+ return {
754
+ type: 'subscribe_namespace',
755
+ request_id,
756
+ namespace_prefix,
757
+ parameters,
758
+ }
759
+ }
760
+
761
+ function decodeUnsubscribeNamespacePayload(r: BufferReader): Draft15Message {
762
+ const request_id = r.readVarInt()
763
+ return { type: 'unsubscribe_namespace', request_id }
764
+ }
765
+
766
+ function decodeFetchPayload(r: BufferReader): Draft15Message {
767
+ const request_id = r.readVarInt()
768
+ const fetch_type = r.readVarInt()
769
+ const ft = Number(fetch_type)
770
+
771
+ if (ft < 1 || ft > 3) {
772
+ throw new DecodeError('CONSTRAINT_VIOLATION', `Invalid fetch_type: ${ft}`, r.offset)
773
+ }
774
+
775
+ let standalone: StandaloneFetch | undefined
776
+ let joining: JoiningFetch | undefined
777
+
778
+ if (ft === 1) {
779
+ // Standalone Fetch
780
+ const track_namespace = r.readTuple()
781
+ const track_name = r.readString()
782
+ const start_group = r.readVarInt()
783
+ const start_object = r.readVarInt()
784
+ const end_group = r.readVarInt()
785
+ const end_object = r.readVarInt()
786
+ standalone = {
787
+ track_namespace,
788
+ track_name,
789
+ start_group,
790
+ start_object,
791
+ end_group,
792
+ end_object,
793
+ }
794
+ } else {
795
+ // Joining Fetch (relative=2, absolute=3)
796
+ const joining_request_id = r.readVarInt()
797
+ const joining_start = r.readVarInt()
798
+ joining = { joining_request_id, joining_start }
799
+ }
800
+
801
+ const parameters = decodeParams(r)
802
+
803
+ return {
804
+ type: 'fetch',
805
+ request_id,
806
+ fetch_type,
807
+ standalone,
808
+ joining,
809
+ parameters,
810
+ } as Draft15Fetch
811
+ }
812
+
813
+ function decodeFetchOkPayload(r: BufferReader): Draft15Message {
814
+ const request_id = r.readVarInt()
815
+ const end_of_track = r.readUint8()
816
+ const end_group = r.readVarInt()
817
+ const end_object = r.readVarInt()
818
+ const parameters = decodeParams(r)
819
+ return {
820
+ type: 'fetch_ok',
821
+ request_id,
822
+ end_of_track,
823
+ end_group,
824
+ end_object,
825
+ parameters,
826
+ }
827
+ }
828
+
829
+ function decodeFetchCancelPayload(r: BufferReader): Draft15Message {
830
+ const request_id = r.readVarInt()
831
+ return { type: 'fetch_cancel', request_id }
832
+ }
833
+
834
+ function decodeTrackStatusPayload(r: BufferReader): Draft15Message {
835
+ const request_id = r.readVarInt()
836
+ const track_namespace = r.readTuple()
837
+ const track_name = r.readString()
838
+ const parameters = decodeParams(r)
839
+ return {
840
+ type: 'track_status',
841
+ request_id,
842
+ track_namespace,
843
+ track_name,
844
+ parameters,
845
+ }
846
+ }
847
+
848
+ function decodeRequestOkPayload(r: BufferReader): Draft15Message {
849
+ const request_id = r.readVarInt()
850
+ const parameters = decodeParams(r)
851
+ return { type: 'request_ok', request_id, parameters }
852
+ }
853
+
854
+ function decodeRequestErrorPayload(r: BufferReader): Draft15Message {
855
+ const request_id = r.readVarInt()
856
+ const error_code = r.readVarInt()
857
+ const reason_phrase = r.readString()
858
+ return { type: 'request_error', request_id, error_code, reason_phrase }
859
+ }
860
+
861
+ function decodeGoAwayPayload(r: BufferReader): Draft15Message {
862
+ const new_session_uri = r.readString()
863
+ return { type: 'goaway', new_session_uri }
864
+ }
865
+
866
+ function decodeMaxRequestIdPayload(r: BufferReader): Draft15Message {
867
+ const max_request_id = r.readVarInt()
868
+ return { type: 'max_request_id', max_request_id }
869
+ }
870
+
871
+ function decodeRequestsBlockedPayload(r: BufferReader): Draft15Message {
872
+ const maximum_request_id = r.readVarInt()
873
+ return { type: 'requests_blocked', maximum_request_id }
874
+ }
875
+
876
+ // ─── Payload dispatch tables ───────────────────────────────────────────────────
877
+
878
+ const payloadDecoders: ReadonlyMap<bigint, (r: BufferReader) => Draft15Message> = new Map([
879
+ [MSG_CLIENT_SETUP, decodeClientSetupPayload],
880
+ [MSG_SERVER_SETUP, decodeServerSetupPayload],
881
+ [MSG_SUBSCRIBE, decodeSubscribePayload],
882
+ [MSG_SUBSCRIBE_OK, decodeSubscribeOkPayload],
883
+ [MSG_SUBSCRIBE_UPDATE, decodeSubscribeUpdatePayload],
884
+ [MSG_UNSUBSCRIBE, decodeUnsubscribePayload],
885
+ [MSG_PUBLISH, decodePublishPayload],
886
+ [MSG_PUBLISH_OK, decodePublishOkPayload],
887
+ [MSG_PUBLISH_DONE, decodePublishDonePayload],
888
+ [MSG_PUBLISH_NAMESPACE, decodePublishNamespacePayload],
889
+ [MSG_PUBLISH_NAMESPACE_DONE, decodePublishNamespaceDonePayload],
890
+ [MSG_PUBLISH_NAMESPACE_CANCEL, decodePublishNamespaceCancelPayload],
891
+ [MSG_SUBSCRIBE_NAMESPACE, decodeSubscribeNamespacePayload],
892
+ [MSG_UNSUBSCRIBE_NAMESPACE, decodeUnsubscribeNamespacePayload],
893
+ [MSG_FETCH, decodeFetchPayload],
894
+ [MSG_FETCH_OK, decodeFetchOkPayload],
895
+ [MSG_FETCH_CANCEL, decodeFetchCancelPayload],
896
+ [MSG_TRACK_STATUS, decodeTrackStatusPayload],
897
+ [MSG_REQUEST_OK, decodeRequestOkPayload],
898
+ [MSG_REQUEST_ERROR, decodeRequestErrorPayload],
899
+ [MSG_GOAWAY, decodeGoAwayPayload],
900
+ [MSG_MAX_REQUEST_ID, decodeMaxRequestIdPayload],
901
+ [MSG_REQUESTS_BLOCKED, decodeRequestsBlockedPayload],
902
+ ])
903
+
904
+ // ─── Public API ────────────────────────────────────────────────────────────────
905
+
906
+ /**
907
+ * Encode a draft-15 control message with type(varint) + length(uint16 BE) + payload.
908
+ */
909
+ export function encodeMessage(message: Draft15Message): Uint8Array {
910
+ const typeId = MESSAGE_ID_MAP.get(message.type)
911
+ if (typeId === undefined) {
912
+ throw new Error(`Unknown message type: ${message.type}`)
913
+ }
914
+
915
+ // Encode payload into a separate buffer
916
+ const payloadWriter = new BufferWriter()
917
+ encodePayload(message, payloadWriter)
918
+ const payload = payloadWriter.finishView()
919
+
920
+ if (payload.byteLength > 0xffff) {
921
+ throw new Error(`Payload too large for 16-bit length: ${payload.byteLength}`)
922
+ }
923
+
924
+ // Write framed message: type(varint) + length(uint16 BE) + payload
925
+ const writer = new BufferWriter(payload.byteLength + 16)
926
+ writer.writeVarInt(typeId)
927
+ writer.writeUint8((payload.byteLength >> 8) & 0xff)
928
+ writer.writeUint8(payload.byteLength & 0xff)
929
+ writer.writeBytes(payload)
930
+
931
+ return writer.finish()
932
+ }
933
+
934
+ function encodePayload(msg: Draft15Message, w: BufferWriter): void {
935
+ switch (msg.type) {
936
+ case 'client_setup':
937
+ return encodeClientSetupPayload(msg, w)
938
+ case 'server_setup':
939
+ return encodeServerSetupPayload(msg, w)
940
+ case 'subscribe':
941
+ return encodeSubscribePayload(msg, w)
942
+ case 'subscribe_ok':
943
+ return encodeSubscribeOkPayload(msg, w)
944
+ case 'subscribe_update':
945
+ return encodeSubscribeUpdatePayload(msg, w)
946
+ case 'unsubscribe':
947
+ return encodeUnsubscribePayload(msg, w)
948
+ case 'publish':
949
+ return encodePublishPayload(msg, w)
950
+ case 'publish_ok':
951
+ return encodePublishOkPayload(msg, w)
952
+ case 'publish_done':
953
+ return encodePublishDonePayload(msg, w)
954
+ case 'publish_namespace':
955
+ return encodePublishNamespacePayload(msg, w)
956
+ case 'publish_namespace_done':
957
+ return encodePublishNamespaceDonePayload(msg, w)
958
+ case 'publish_namespace_cancel':
959
+ return encodePublishNamespaceCancelPayload(msg, w)
960
+ case 'subscribe_namespace':
961
+ return encodeSubscribeNamespacePayload(msg, w)
962
+ case 'unsubscribe_namespace':
963
+ return encodeUnsubscribeNamespacePayload(msg, w)
964
+ case 'fetch':
965
+ return encodeFetchPayload(msg, w)
966
+ case 'fetch_ok':
967
+ return encodeFetchOkPayload(msg, w)
968
+ case 'fetch_cancel':
969
+ return encodeFetchCancelPayload(msg, w)
970
+ case 'track_status':
971
+ return encodeTrackStatusPayload(msg, w)
972
+ case 'request_ok':
973
+ return encodeRequestOkPayload(msg, w)
974
+ case 'request_error':
975
+ return encodeRequestErrorPayload(msg, w)
976
+ case 'goaway':
977
+ return encodeGoAwayPayload(msg, w)
978
+ case 'max_request_id':
979
+ return encodeMaxRequestIdPayload(msg, w)
980
+ case 'requests_blocked':
981
+ return encodeRequestsBlockedPayload(msg, w)
982
+ default: {
983
+ const _exhaustive: never = msg
984
+ throw new Error(`Unhandled message type: ${(_exhaustive as Draft15Message).type}`)
985
+ }
986
+ }
987
+ }
988
+
989
+ /**
990
+ * Decode a draft-15 control message from bytes (type + uint16 length + payload).
991
+ */
992
+ export function decodeMessage(bytes: Uint8Array): DecodeResult<Draft15Message> {
993
+ try {
994
+ const reader = new BufferReader(bytes)
995
+ const typeId = reader.readVarInt()
996
+
997
+ // Read 16-bit big-endian payload length
998
+ const lenHi = reader.readUint8()
999
+ const lenLo = reader.readUint8()
1000
+ const payloadLength = (lenHi << 8) | lenLo
1001
+
1002
+ // Read exactly payloadLength bytes
1003
+ const payloadBytes = reader.readBytes(payloadLength)
1004
+ const payloadReader = new BufferReader(payloadBytes)
1005
+
1006
+ const decoder = payloadDecoders.get(typeId)
1007
+ if (!decoder) {
1008
+ return {
1009
+ ok: false,
1010
+ error: new DecodeError(
1011
+ 'UNKNOWN_MESSAGE_TYPE',
1012
+ `Unknown message type ID: 0x${typeId.toString(16)}`,
1013
+ 0,
1014
+ ),
1015
+ }
1016
+ }
1017
+
1018
+ const message = decoder(payloadReader)
1019
+ return { ok: true, value: message, bytesRead: reader.offset }
1020
+ } catch (e) {
1021
+ if (e instanceof DecodeError) {
1022
+ return { ok: false, error: e }
1023
+ }
1024
+ throw e
1025
+ }
1026
+ }
1027
+
1028
+ // ─── Data Stream Re-exports ───────────────────────────────────────────────────
1029
+
1030
+ import {
1031
+ createDataStreamDecoder,
1032
+ createFetchStreamDecoder,
1033
+ createSubgroupStreamDecoder,
1034
+ decodeDatagram,
1035
+ decodeDataStream,
1036
+ decodeFetchStream,
1037
+ decodeSubgroupStream,
1038
+ encodeDatagram,
1039
+ encodeFetchStream,
1040
+ encodeSubgroupStream,
1041
+ } from './data-streams.js'
1042
+
1043
+ export {
1044
+ createDataStreamDecoder,
1045
+ createFetchStreamDecoder,
1046
+ createSubgroupStreamDecoder,
1047
+ decodeDatagram,
1048
+ decodeDataStream,
1049
+ decodeFetchStream,
1050
+ decodeSubgroupStream,
1051
+ encodeDatagram,
1052
+ encodeFetchStream,
1053
+ encodeSubgroupStream,
1054
+ }
1055
+
1056
+ // ─── Stream Decoders ───────────────────────────────────────────────────────────
1057
+
1058
+ /**
1059
+ * Create a TransformStream that decodes a continuous byte stream into
1060
+ * individual Draft15Message objects.
1061
+ */
1062
+ export function createStreamDecoder(): TransformStream<Uint8Array, Draft15Message> {
1063
+ let buffer = new Uint8Array(0)
1064
+ let offset = 0
1065
+
1066
+ return new TransformStream<Uint8Array, Draft15Message>({
1067
+ transform(chunk, controller) {
1068
+ if (offset > 0) {
1069
+ buffer = buffer.subarray(offset)
1070
+ offset = 0
1071
+ }
1072
+ const newBuffer = new Uint8Array(buffer.length + chunk.length)
1073
+ newBuffer.set(buffer, 0)
1074
+ newBuffer.set(chunk, buffer.length)
1075
+ buffer = newBuffer
1076
+
1077
+ while (offset < buffer.length) {
1078
+ const result = decodeMessage(buffer.subarray(offset))
1079
+ if (!result.ok) {
1080
+ if (result.error.code === 'UNEXPECTED_END') {
1081
+ break
1082
+ }
1083
+ controller.error(result.error)
1084
+ return
1085
+ }
1086
+ controller.enqueue(result.value)
1087
+ offset += result.bytesRead
1088
+ }
1089
+ },
1090
+
1091
+ flush(controller) {
1092
+ if (offset < buffer.length) {
1093
+ controller.error(
1094
+ new DecodeError('UNEXPECTED_END', 'Stream ended with incomplete message data', 0),
1095
+ )
1096
+ }
1097
+ },
1098
+ })
1099
+ }
1100
+
1101
+ // ─── Codec Factory ─────────────────────────────────────────────────────────────
1102
+
1103
+ export interface Draft15Codec extends BaseCodec<Draft15Message> {
1104
+ readonly draft: '15'
1105
+ encodeSubgroupStream(stream: SubgroupStream): Uint8Array
1106
+ encodeDatagram(dg: DatagramObject): Uint8Array
1107
+ encodeFetchStream(stream: FetchStream): Uint8Array
1108
+ decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream>
1109
+ decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject>
1110
+ decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream>
1111
+ decodeDataStream(
1112
+ streamType: 'subgroup' | 'datagram' | 'fetch',
1113
+ bytes: Uint8Array,
1114
+ ): DecodeResult<Draft15DataStream>
1115
+ createStreamDecoder(): TransformStream<Uint8Array, Draft15Message>
1116
+ createSubgroupStreamDecoder(): TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>
1117
+ createFetchStreamDecoder(): TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>
1118
+ createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent>
1119
+ }
1120
+
1121
+ export function createDraft15Codec(): Draft15Codec {
1122
+ return {
1123
+ draft: '15',
1124
+ encodeMessage,
1125
+ decodeMessage,
1126
+ encodeSubgroupStream,
1127
+ encodeDatagram,
1128
+ encodeFetchStream,
1129
+ decodeSubgroupStream,
1130
+ decodeDatagram,
1131
+ decodeFetchStream,
1132
+ decodeDataStream,
1133
+ createStreamDecoder,
1134
+ createSubgroupStreamDecoder,
1135
+ createFetchStreamDecoder,
1136
+ createDataStreamDecoder,
1137
+ }
1138
+ }