@moqtap/codec 0.2.3 → 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.
- package/LICENSE +21 -21
- package/README.md +100 -99
- package/dist/{chunk-RZHAPEXO.js → chunk-2A57DRXV.js} +36 -10
- package/dist/{chunk-73MWUKSJ.js → chunk-2UTVXWFF.js} +190 -102
- package/dist/{chunk-JTVCOMBI.cjs → chunk-3XKO6PCR.cjs} +290 -183
- package/dist/{chunk-ACQ4CUJP.cjs → chunk-4BDEU3D4.cjs} +237 -158
- package/dist/{chunk-4N4INRE7.cjs → chunk-4HBKHNU2.cjs} +144 -110
- package/dist/{chunk-2ZT6CVSE.js → chunk-4IVZZOY3.js} +269 -162
- package/dist/{chunk-GLBQDG4L.cjs → chunk-5O764MBD.cjs} +508 -117
- package/dist/chunk-7KBAWOBA.js +1212 -0
- package/dist/{chunk-JSQM2MG3.js → chunk-7QOPNSDF.js} +44 -12
- package/dist/{chunk-SYHW3FLI.cjs → chunk-7RE6KSIY.cjs} +28 -8
- package/dist/{chunk-YG5KJESI.js → chunk-AY6IAHUM.js} +28 -8
- package/dist/{chunk-EFM5T7OM.js → chunk-BLQDWOSG.js} +36 -10
- package/dist/{chunk-UYXTY6ZQ.cjs → chunk-E65QKRSN.cjs} +20 -12
- package/dist/{chunk-BISI45MN.cjs → chunk-EAHE3IOG.cjs} +44 -12
- package/dist/{chunk-PZBPH2D7.js → chunk-GCBFHZW6.js} +216 -137
- package/dist/{chunk-GXEW4COZ.cjs → chunk-H5NSL4MO.cjs} +36 -10
- package/dist/chunk-HZHSO7EW.cjs +1212 -0
- package/dist/{chunk-KZCYQ7ED.cjs → chunk-IILNSDEQ.cjs} +69 -41
- package/dist/{chunk-4XYGE53S.cjs → chunk-J3XCPBW3.cjs} +36 -10
- package/dist/{chunk-6AEHWULA.cjs → chunk-JKOEJZ5B.cjs} +28 -8
- package/dist/{chunk-RUPCJTC3.cjs → chunk-JL3NEW3O.cjs} +23 -1
- package/dist/{chunk-G7GI7LJA.js → chunk-LORZMJJB.js} +36 -10
- package/dist/{chunk-DUBCL3WF.cjs → chunk-LV5C6MEC.cjs} +36 -10
- package/dist/{chunk-ENURAVHI.cjs → chunk-MYXAD5JC.cjs} +44 -12
- package/dist/{chunk-FXZ2MYKJ.js → chunk-MZ7HUCGJ.js} +20 -12
- package/dist/{chunk-S74DWJE2.cjs → chunk-OKG2HT25.cjs} +277 -88
- package/dist/{chunk-BGWGVINJ.cjs → chunk-PKEOQSSZ.cjs} +144 -110
- package/dist/{chunk-2GODRVT5.js → chunk-Q46ZURKX.js} +325 -48
- package/dist/{chunk-UR6JKS56.js → chunk-Q7IGWV3P.js} +41 -9
- package/dist/{chunk-XSNX2IUJ.js → chunk-RW4UG7CN.js} +121 -87
- package/dist/{chunk-DWK5ZQZ4.js → chunk-RZTLQAKF.js} +28 -8
- package/dist/{chunk-UNS34PTA.cjs → chunk-S6IPIN66.cjs} +44 -12
- package/dist/{chunk-YIG2C3LF.cjs → chunk-SDWRXXOO.cjs} +214 -126
- package/dist/{chunk-CEH7ESNC.js → chunk-SHMA4PBY.js} +121 -87
- package/dist/{chunk-MC7W6PMI.js → chunk-U3ZVLT5L.js} +483 -135
- package/dist/{chunk-VJUUZ4W2.cjs → chunk-UJU63EFY.cjs} +374 -97
- package/dist/{chunk-7L43FE6P.js → chunk-VOU7PNHI.js} +23 -1
- package/dist/{chunk-E6E3NQYU.js → chunk-WRHGCVYN.js} +44 -12
- package/dist/{chunk-FPISPJ5N.cjs → chunk-XNWYLVGU.cjs} +529 -181
- package/dist/{chunk-U3IPZYPX.js → chunk-XS77RBY7.js} +228 -39
- package/dist/{chunk-JGG7CMSZ.cjs → chunk-XZE5R57R.cjs} +144 -110
- package/dist/{chunk-77MNXX3M.js → chunk-Y6KCSM3V.js} +121 -87
- package/dist/{chunk-TLYNOOQP.cjs → chunk-YTPZZI2M.cjs} +41 -9
- package/dist/{chunk-7DUBLRXC.js → chunk-YWRCSQBA.js} +44 -12
- package/dist/{chunk-MRJWLGYH.js → chunk-Z3VKP3PJ.js} +69 -41
- package/dist/{chunk-E6P74GDT.js → chunk-Z6U26IRI.js} +464 -73
- package/dist/{codec-FvGCxIhr.d.ts → codec-25u4_1HS.d.ts} +4 -4
- package/dist/{codec-DRcsBCsb.d.ts → codec-3Ppy_5Gd.d.ts} +4 -4
- package/dist/{codec-BdVMRMOI.d.ts → codec-BB0U8MF2.d.cts} +4 -4
- package/dist/{codec-B2cH-f5V.d.cts → codec-BHHfBTnV.d.ts} +4 -4
- package/dist/{codec-B5K73Bdj.d.ts → codec-BN6jk0Td.d.cts} +4 -4
- package/dist/{codec-R8GrCPt2.d.ts → codec-BU0gaSZm.d.ts} +4 -4
- package/dist/{codec-Bq-tLtfP.d.ts → codec-C-Yk2RNa.d.ts} +4 -4
- package/dist/codec-CFWQY9Lj.d.cts +18 -0
- package/dist/{codec-CPlK3Pi5.d.ts → codec-COy4uuPO.d.cts} +4 -4
- package/dist/codec-CewFCsEy.d.ts +18 -0
- package/dist/{codec-KXHvXZVb.d.cts → codec-Ck7ZwFF1.d.cts} +4 -4
- package/dist/{codec-DZhZSIii.d.cts → codec-D2QVSH9D.d.ts} +4 -4
- package/dist/{codec-BwFgpeQu.d.ts → codec-DDUBJGn0.d.cts} +4 -4
- package/dist/{codec-BFeliJFc.d.ts → codec-DNfml-se.d.ts} +4 -4
- package/dist/{codec-C4n1PS09.d.cts → codec-DoOGjjDq.d.cts} +4 -4
- package/dist/{codec-Bap882Fh.d.cts → codec-J7ekOSMc.d.ts} +4 -4
- package/dist/{codec-SKBeHQk7.d.ts → codec-R9TJCq-E.d.cts} +4 -4
- package/dist/{codec-DNUIgLqc.d.cts → codec-ZwV-Njt6.d.ts} +4 -4
- package/dist/{codec-HgBgHkFI.d.cts → codec-j819z_hL.d.cts} +4 -4
- package/dist/{codec-DY4QH364.d.cts → codec-w8z2j_uo.d.cts} +4 -4
- package/dist/{codec-CPvPq0sb.d.cts → codec-wtt6WF1K.d.ts} +4 -4
- package/dist/{codec-BUMjz0J4.d.cts → codec-z6_2PSzi.d.cts} +4 -4
- package/dist/draft10-session.cjs +2 -2
- package/dist/draft10-session.d.cts +6 -6
- package/dist/draft10-session.d.ts +6 -6
- package/dist/draft10-session.js +1 -1
- package/dist/draft10.cjs +8 -5
- package/dist/draft10.d.cts +14 -12
- package/dist/draft10.d.ts +14 -12
- package/dist/draft10.js +16 -13
- package/dist/draft11-session.cjs +2 -2
- package/dist/draft11-session.d.cts +6 -6
- package/dist/draft11-session.d.ts +6 -6
- package/dist/draft11-session.js +1 -1
- package/dist/draft11.cjs +8 -5
- package/dist/draft11.d.cts +14 -12
- package/dist/draft11.d.ts +14 -12
- package/dist/draft11.js +16 -13
- package/dist/draft12-session.cjs +2 -2
- package/dist/draft12-session.d.cts +6 -6
- package/dist/draft12-session.d.ts +6 -6
- package/dist/draft12-session.js +1 -1
- package/dist/draft12.cjs +8 -5
- package/dist/draft12.d.cts +16 -14
- package/dist/draft12.d.ts +16 -14
- package/dist/draft12.js +16 -13
- package/dist/draft13-session.cjs +2 -2
- package/dist/draft13-session.d.cts +6 -6
- package/dist/draft13-session.d.ts +6 -6
- package/dist/draft13-session.js +1 -1
- package/dist/draft13.cjs +8 -5
- package/dist/draft13.d.cts +16 -14
- package/dist/draft13.d.ts +16 -14
- package/dist/draft13.js +16 -13
- package/dist/draft14-session.cjs +2 -2
- package/dist/draft14-session.d.cts +6 -6
- package/dist/draft14-session.d.ts +6 -6
- package/dist/draft14-session.js +1 -1
- package/dist/draft14.cjs +14 -5
- package/dist/draft14.d.cts +14 -12
- package/dist/draft14.d.ts +14 -12
- package/dist/draft14.js +13 -4
- package/dist/draft15-session.cjs +2 -2
- package/dist/draft15-session.d.cts +6 -6
- package/dist/draft15-session.d.ts +6 -6
- package/dist/draft15-session.js +1 -1
- package/dist/draft15.cjs +8 -5
- package/dist/draft15.d.cts +14 -12
- package/dist/draft15.d.ts +14 -12
- package/dist/draft15.js +16 -13
- package/dist/draft16-session.cjs +2 -2
- package/dist/draft16-session.d.cts +6 -6
- package/dist/draft16-session.d.ts +6 -6
- package/dist/draft16-session.js +1 -1
- package/dist/draft16.cjs +8 -5
- package/dist/draft16.d.cts +14 -12
- package/dist/draft16.d.ts +14 -12
- package/dist/draft16.js +16 -13
- package/dist/draft17-session.cjs +2 -2
- package/dist/draft17-session.d.cts +7 -7
- package/dist/draft17-session.d.ts +7 -7
- package/dist/draft17-session.js +1 -1
- package/dist/draft17.cjs +8 -5
- package/dist/draft17.d.cts +11 -9
- package/dist/draft17.d.ts +11 -9
- package/dist/draft17.js +16 -13
- package/dist/draft7-session.cjs +2 -2
- package/dist/draft7-session.d.cts +6 -5
- package/dist/draft7-session.d.ts +6 -5
- package/dist/draft7-session.js +1 -1
- package/dist/draft7.cjs +71 -14
- package/dist/draft7.d.cts +53 -134
- package/dist/draft7.d.ts +53 -134
- package/dist/draft7.js +76 -19
- package/dist/draft8-session.cjs +2 -2
- package/dist/draft8-session.d.cts +6 -6
- package/dist/draft8-session.d.ts +6 -6
- package/dist/draft8-session.js +1 -1
- package/dist/draft8.cjs +8 -5
- package/dist/draft8.d.cts +14 -12
- package/dist/draft8.d.ts +14 -12
- package/dist/draft8.js +7 -4
- package/dist/draft9-session.cjs +2 -2
- package/dist/draft9-session.d.cts +6 -6
- package/dist/draft9-session.d.ts +6 -6
- package/dist/draft9-session.js +1 -1
- package/dist/draft9.cjs +8 -5
- package/dist/draft9.d.cts +14 -12
- package/dist/draft9.d.ts +14 -12
- package/dist/draft9.js +7 -4
- package/dist/index.cjs +52 -74
- package/dist/index.d.cts +41 -60
- package/dist/index.d.ts +41 -60
- package/dist/index.js +40 -62
- package/dist/{session-types-CJIFbTPd.d.ts → session-types-C7UONex5.d.cts} +28 -27
- package/dist/{session-types-Cbq8IGCP.d.cts → session-types-X-IYEGoG.d.ts} +28 -27
- package/dist/session.cjs +46 -13
- package/dist/session.d.cts +28 -9
- package/dist/session.d.ts +28 -9
- package/dist/session.js +46 -13
- package/dist/{types-DxSFvL2b.d.cts → types--Q7_DcvP.d.cts} +43 -39
- package/dist/{types-DxSFvL2b.d.ts → types--Q7_DcvP.d.ts} +43 -39
- package/dist/{types-B0FT5Qs2.d.ts → types-0IWbU9Z_.d.cts} +36 -36
- package/dist/{types-B0FT5Qs2.d.cts → types-0IWbU9Z_.d.ts} +36 -36
- package/dist/{types-gQsr0AAA.d.cts → types-B3g5G9KP.d.cts} +36 -36
- package/dist/{types-gQsr0AAA.d.ts → types-B3g5G9KP.d.ts} +36 -36
- package/dist/{types-Pme7sua0.d.cts → types-BFpFNM_m.d.cts} +57 -32
- package/dist/{types-Pme7sua0.d.ts → types-BFpFNM_m.d.ts} +57 -32
- package/dist/{types-8gUGeMgs.d.ts → types-Br7fm2mf.d.cts} +48 -26
- package/dist/{types-8gUGeMgs.d.cts → types-Br7fm2mf.d.ts} +48 -26
- package/dist/{types-BeAVNU-F.d.cts → types-C2qKTRR_.d.cts} +50 -45
- package/dist/{types-BeAVNU-F.d.ts → types-C2qKTRR_.d.ts} +50 -45
- package/dist/{types-DKpsfD3i.d.cts → types-DEaypVsD.d.cts} +115 -55
- package/dist/{types-DKpsfD3i.d.ts → types-DEaypVsD.d.ts} +115 -55
- package/dist/types-Dl4IaAHR.d.cts +282 -0
- package/dist/types-Dl4IaAHR.d.ts +282 -0
- package/dist/{types-CDa7F5ct.d.cts → types-DrQpTW1G.d.cts} +58 -50
- package/dist/{types-CDa7F5ct.d.ts → types-DrQpTW1G.d.ts} +58 -50
- package/dist/types-DuIO7cWK.d.cts +25 -0
- package/dist/types-DuIO7cWK.d.ts +25 -0
- package/dist/{types-B9A2g05r.d.cts → types-DuxfOYiO.d.cts} +47 -31
- package/dist/{types-B9A2g05r.d.ts → types-DuxfOYiO.d.ts} +47 -31
- package/dist/{types-D1dI_oTX.d.cts → types-jV1yDDBA.d.cts} +36 -36
- package/dist/{types-D1dI_oTX.d.ts → types-jV1yDDBA.d.ts} +36 -36
- package/package.json +192 -192
- package/src/core/buffer-reader.ts +130 -130
- package/src/core/buffer-writer.ts +100 -100
- package/src/core/errors.ts +1 -1
- package/src/core/hex.ts +21 -21
- package/src/core/session-types.ts +61 -59
- package/src/core/types.ts +18 -361
- package/src/drafts/draft07/codec.ts +1058 -938
- package/src/drafts/draft07/data-streams.ts +240 -240
- package/src/drafts/draft07/index.ts +124 -89
- package/src/drafts/draft07/messages.ts +76 -42
- package/src/drafts/draft07/rules.ts +107 -101
- package/src/drafts/draft07/session-fsm.ts +315 -287
- package/src/drafts/draft07/session.ts +8 -6
- package/src/drafts/draft07/types.ts +406 -72
- package/src/drafts/draft07/varint.ts +51 -51
- package/src/drafts/draft08/codec.ts +985 -953
- package/src/drafts/draft08/data-streams.ts +363 -359
- package/src/drafts/draft08/index.ts +10 -9
- package/src/drafts/draft08/messages.ts +59 -59
- package/src/drafts/draft08/rules.ts +73 -73
- package/src/drafts/draft08/session-fsm.ts +335 -303
- package/src/drafts/draft08/session.ts +6 -7
- package/src/drafts/draft08/types.ts +380 -384
- package/src/drafts/draft09/codec.ts +977 -945
- package/src/drafts/draft09/data-streams.ts +336 -332
- package/src/drafts/draft09/index.ts +10 -9
- package/src/drafts/draft09/messages.ts +59 -59
- package/src/drafts/draft09/rules.ts +73 -73
- package/src/drafts/draft09/session-fsm.ts +335 -303
- package/src/drafts/draft09/session.ts +6 -7
- package/src/drafts/draft09/types.ts +380 -384
- package/src/drafts/draft10/codec.ts +977 -945
- package/src/drafts/draft10/data-streams.ts +336 -332
- package/src/drafts/draft10/index.ts +10 -9
- package/src/drafts/draft10/messages.ts +59 -59
- package/src/drafts/draft10/rules.ts +73 -73
- package/src/drafts/draft10/session-fsm.ts +335 -303
- package/src/drafts/draft10/session.ts +6 -7
- package/src/drafts/draft10/types.ts +380 -384
- package/src/drafts/draft11/codec.ts +1054 -988
- package/src/drafts/draft11/data-streams.ts +316 -269
- package/src/drafts/draft11/index.ts +10 -9
- package/src/drafts/draft11/messages.ts +60 -59
- package/src/drafts/draft11/rules.ts +73 -73
- package/src/drafts/draft11/session-fsm.ts +359 -333
- package/src/drafts/draft11/session.ts +6 -7
- package/src/drafts/draft11/types.ts +385 -381
- package/src/drafts/draft12/codec.ts +1178 -1122
- package/src/drafts/draft12/data-streams.ts +324 -275
- package/src/drafts/draft12/index.ts +10 -9
- package/src/drafts/draft12/messages.ts +67 -66
- package/src/drafts/draft12/rules.ts +79 -79
- package/src/drafts/draft12/session-fsm.ts +384 -358
- package/src/drafts/draft12/session.ts +6 -7
- package/src/drafts/draft12/types.ts +424 -419
- package/src/drafts/draft13/codec.ts +1296 -1206
- package/src/drafts/draft13/data-streams.ts +326 -275
- package/src/drafts/draft13/index.ts +10 -9
- package/src/drafts/draft13/messages.ts +73 -68
- package/src/drafts/draft13/rules.ts +81 -81
- package/src/drafts/draft13/session-fsm.ts +392 -366
- package/src/drafts/draft13/session.ts +6 -7
- package/src/drafts/draft13/types.ts +447 -438
- package/src/drafts/draft14/codec.ts +1347 -1043
- package/src/drafts/draft14/data-streams.ts +831 -813
- package/src/drafts/draft14/index.ts +17 -9
- package/src/drafts/draft14/messages.ts +65 -65
- package/src/drafts/draft14/rules.ts +81 -81
- package/src/drafts/draft14/session-fsm.ts +415 -405
- package/src/drafts/draft14/session.ts +6 -7
- package/src/drafts/draft14/types.ts +451 -381
- package/src/drafts/draft15/codec.ts +1138 -978
- package/src/drafts/draft15/data-streams.ts +842 -794
- package/src/drafts/draft15/index.ts +10 -9
- package/src/drafts/draft15/messages.ts +54 -53
- package/src/drafts/draft15/rules.ts +67 -67
- package/src/drafts/draft15/session-fsm.ts +319 -299
- package/src/drafts/draft15/session.ts +6 -7
- package/src/drafts/draft15/types.ts +357 -339
- package/src/drafts/draft16/codec.ts +1242 -966
- package/src/drafts/draft16/data-streams.ts +835 -789
- package/src/drafts/draft16/index.ts +10 -9
- package/src/drafts/draft16/messages.ts +56 -55
- package/src/drafts/draft16/rules.ts +69 -69
- package/src/drafts/draft16/session-fsm.ts +319 -299
- package/src/drafts/draft16/session.ts +6 -7
- package/src/drafts/draft16/types.ts +386 -357
- package/src/drafts/draft17/codec.ts +1209 -971
- package/src/drafts/draft17/data-streams.ts +969 -758
- package/src/drafts/draft17/index.ts +9 -7
- package/src/drafts/draft17/messages.ts +43 -42
- package/src/drafts/draft17/rules.ts +58 -58
- package/src/drafts/draft17/session-fsm.ts +248 -216
- package/src/drafts/draft17/session.ts +5 -5
- package/src/drafts/draft17/types.ts +337 -313
- package/src/index.ts +85 -274
- package/src/session.ts +62 -23
- package/dist/chunk-FZDIEHQL.cjs +0 -1042
- package/dist/chunk-HDWJ2GDE.js +0 -24
- package/dist/chunk-KNDYS3DK.cjs +0 -24
- package/dist/chunk-N2KBF5Q2.js +0 -1042
- package/dist/types-QNXoxC9Y.d.cts +0 -236
- package/dist/types-QNXoxC9Y.d.ts +0 -236
- package/src/drafts/draft07/announce-fsm.ts +0 -2
- package/src/drafts/draft07/parameters.ts +0 -12
- package/src/drafts/draft07/subscription-fsm.ts +0 -3
|
@@ -1,938 +1,1058 @@
|
|
|
1
|
-
import { BufferReader } from
|
|
2
|
-
import { BufferWriter } from
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
function
|
|
242
|
-
writer.
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
writer.writeVarInt(msg.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
writer.
|
|
261
|
-
writer.
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
writer.
|
|
276
|
-
writer.
|
|
277
|
-
writer.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
writer.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
function
|
|
293
|
-
msg
|
|
294
|
-
writer
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
writer.writeVarInt(msg.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
writer.writeVarInt(
|
|
307
|
-
writer.writeVarInt(msg.
|
|
308
|
-
writer.writeVarInt(msg.
|
|
309
|
-
writer.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
const
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
const
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
const
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
const
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
const
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
const
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
function
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
const
|
|
770
|
-
|
|
771
|
-
const
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
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_ANNOUNCE,
|
|
9
|
+
MSG_ANNOUNCE_CANCEL,
|
|
10
|
+
MSG_ANNOUNCE_ERROR,
|
|
11
|
+
MSG_ANNOUNCE_OK,
|
|
12
|
+
MSG_CLIENT_SETUP,
|
|
13
|
+
MSG_FETCH,
|
|
14
|
+
MSG_FETCH_CANCEL,
|
|
15
|
+
MSG_FETCH_ERROR,
|
|
16
|
+
MSG_FETCH_OK,
|
|
17
|
+
MSG_GOAWAY,
|
|
18
|
+
MSG_MAX_SUBSCRIBE_ID,
|
|
19
|
+
MSG_OBJECT_DATAGRAM,
|
|
20
|
+
MSG_SERVER_SETUP,
|
|
21
|
+
MSG_SUBSCRIBE,
|
|
22
|
+
MSG_SUBSCRIBE_ANNOUNCES,
|
|
23
|
+
MSG_SUBSCRIBE_ANNOUNCES_ERROR,
|
|
24
|
+
MSG_SUBSCRIBE_ANNOUNCES_OK,
|
|
25
|
+
MSG_SUBSCRIBE_DONE,
|
|
26
|
+
MSG_SUBSCRIBE_ERROR,
|
|
27
|
+
MSG_SUBSCRIBE_OK,
|
|
28
|
+
MSG_SUBSCRIBE_UPDATE,
|
|
29
|
+
MSG_TRACK_STATUS,
|
|
30
|
+
MSG_TRACK_STATUS_REQUEST,
|
|
31
|
+
MSG_UNANNOUNCE,
|
|
32
|
+
MSG_UNSUBSCRIBE,
|
|
33
|
+
MSG_UNSUBSCRIBE_ANNOUNCES,
|
|
34
|
+
PARAM_AUTHORIZATION_INFO,
|
|
35
|
+
PARAM_DELIVERY_TIMEOUT,
|
|
36
|
+
PARAM_MAX_CACHE_DURATION,
|
|
37
|
+
SETUP_PARAM_MAX_SUBSCRIBE_ID,
|
|
38
|
+
SETUP_PARAM_PATH,
|
|
39
|
+
SETUP_PARAM_ROLE,
|
|
40
|
+
} from './messages.js'
|
|
41
|
+
import type {
|
|
42
|
+
Announce,
|
|
43
|
+
AnnounceCancel,
|
|
44
|
+
AnnounceError,
|
|
45
|
+
AnnounceOk,
|
|
46
|
+
ClientSetup,
|
|
47
|
+
DatagramObject as Draft07DatagramObject,
|
|
48
|
+
Draft07Message,
|
|
49
|
+
Draft07Params,
|
|
50
|
+
Draft07SetupParams,
|
|
51
|
+
Fetch,
|
|
52
|
+
FetchCancel,
|
|
53
|
+
FetchError,
|
|
54
|
+
FetchOk,
|
|
55
|
+
FetchStream,
|
|
56
|
+
GoAway,
|
|
57
|
+
MaxSubscribeId,
|
|
58
|
+
ObjectDatagram,
|
|
59
|
+
ServerSetup,
|
|
60
|
+
SubgroupStream,
|
|
61
|
+
Subscribe,
|
|
62
|
+
SubscribeAnnounces,
|
|
63
|
+
SubscribeAnnouncesError,
|
|
64
|
+
SubscribeAnnouncesOk,
|
|
65
|
+
SubscribeDone,
|
|
66
|
+
SubscribeError,
|
|
67
|
+
SubscribeOk,
|
|
68
|
+
SubscribeUpdate,
|
|
69
|
+
TrackStatus,
|
|
70
|
+
TrackStatusRequest,
|
|
71
|
+
Unannounce,
|
|
72
|
+
UnknownParam,
|
|
73
|
+
Unsubscribe,
|
|
74
|
+
UnsubscribeAnnounces,
|
|
75
|
+
} from './types.js'
|
|
76
|
+
import { decodeVarInt, encodeVarInt } from './varint.js'
|
|
77
|
+
|
|
78
|
+
const textEncoder = /* @__PURE__ */ new TextEncoder()
|
|
79
|
+
const textDecoder = /* @__PURE__ */ new TextDecoder()
|
|
80
|
+
|
|
81
|
+
// Data stream type IDs that NEVER appear as control messages.
|
|
82
|
+
// Note: 0x04 (stream_header_subgroup) excluded — shares ID with subscribe_ok.
|
|
83
|
+
// Note: 0x05 (fetch_header) excluded — shares ID with subscribe_error.
|
|
84
|
+
// Callers must use decodeSubgroupStream/decodeFetchStream directly.
|
|
85
|
+
const DATA_STREAM_TYPE_IDS: ReadonlySet<bigint> = new Set([MSG_OBJECT_DATAGRAM])
|
|
86
|
+
|
|
87
|
+
// ─── Setup Parameter Encoding/Decoding ────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
function encodeSetupParams(params: Draft07SetupParams, w: BufferWriter): void {
|
|
90
|
+
let count = 0
|
|
91
|
+
if (params.role !== undefined) count++
|
|
92
|
+
if (params.path !== undefined) count++
|
|
93
|
+
if (params.max_subscribe_id !== undefined) count++
|
|
94
|
+
if (params.unknown) count += params.unknown.length
|
|
95
|
+
|
|
96
|
+
w.writeVarInt(count)
|
|
97
|
+
|
|
98
|
+
if (params.role !== undefined) {
|
|
99
|
+
w.writeVarInt(SETUP_PARAM_ROLE)
|
|
100
|
+
const tmpW = new BufferWriter(16)
|
|
101
|
+
tmpW.writeVarInt(params.role)
|
|
102
|
+
const raw = tmpW.finish()
|
|
103
|
+
w.writeVarInt(raw.byteLength)
|
|
104
|
+
w.writeBytes(raw)
|
|
105
|
+
}
|
|
106
|
+
if (params.path !== undefined) {
|
|
107
|
+
w.writeVarInt(SETUP_PARAM_PATH)
|
|
108
|
+
const encoded = textEncoder.encode(params.path)
|
|
109
|
+
w.writeVarInt(encoded.byteLength)
|
|
110
|
+
w.writeBytes(encoded)
|
|
111
|
+
}
|
|
112
|
+
if (params.max_subscribe_id !== undefined) {
|
|
113
|
+
w.writeVarInt(SETUP_PARAM_MAX_SUBSCRIBE_ID)
|
|
114
|
+
const tmpW = new BufferWriter(16)
|
|
115
|
+
tmpW.writeVarInt(params.max_subscribe_id)
|
|
116
|
+
const raw = tmpW.finish()
|
|
117
|
+
w.writeVarInt(raw.byteLength)
|
|
118
|
+
w.writeBytes(raw)
|
|
119
|
+
}
|
|
120
|
+
if (params.unknown) {
|
|
121
|
+
for (const u of params.unknown) {
|
|
122
|
+
w.writeVarInt(BigInt(u.id))
|
|
123
|
+
const raw = hexToBytes(u.raw_hex)
|
|
124
|
+
w.writeVarInt(raw.byteLength)
|
|
125
|
+
w.writeBytes(raw)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function decodeSetupParams(r: BufferReader): Draft07SetupParams {
|
|
131
|
+
const count = Number(r.readVarInt())
|
|
132
|
+
const result: Draft07SetupParams = {}
|
|
133
|
+
const unknown: UnknownParam[] = []
|
|
134
|
+
|
|
135
|
+
for (let i = 0; i < count; i++) {
|
|
136
|
+
const paramType = r.readVarInt()
|
|
137
|
+
const length = Number(r.readVarInt())
|
|
138
|
+
|
|
139
|
+
if (paramType === SETUP_PARAM_ROLE) {
|
|
140
|
+
const blob = r.readBytes(length)
|
|
141
|
+
const tmpReader = new BufferReader(blob)
|
|
142
|
+
result.role = tmpReader.readVarInt()
|
|
143
|
+
} else if (paramType === SETUP_PARAM_PATH) {
|
|
144
|
+
const bytes = r.readBytes(length)
|
|
145
|
+
result.path = textDecoder.decode(bytes)
|
|
146
|
+
} else if (paramType === SETUP_PARAM_MAX_SUBSCRIBE_ID) {
|
|
147
|
+
const blob = r.readBytes(length)
|
|
148
|
+
const tmpReader = new BufferReader(blob)
|
|
149
|
+
result.max_subscribe_id = tmpReader.readVarInt()
|
|
150
|
+
} else {
|
|
151
|
+
const bytes = r.readBytes(length)
|
|
152
|
+
unknown.push({
|
|
153
|
+
id: `0x${paramType.toString(16)}`,
|
|
154
|
+
length,
|
|
155
|
+
raw_hex: bytesToHex(bytes),
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (unknown.length > 0) result.unknown = unknown
|
|
161
|
+
return result
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ─── Version-Specific Parameter Encoding/Decoding ─────────────────────────────
|
|
165
|
+
|
|
166
|
+
function encodeParams(params: Draft07Params, w: BufferWriter): void {
|
|
167
|
+
let count = params.unknown ? params.unknown.length : 0
|
|
168
|
+
if (params.authorization_info !== undefined) count++
|
|
169
|
+
if (params.delivery_timeout !== undefined) count++
|
|
170
|
+
if (params.max_cache_duration !== undefined) count++
|
|
171
|
+
w.writeVarInt(count)
|
|
172
|
+
|
|
173
|
+
if (params.authorization_info !== undefined) {
|
|
174
|
+
w.writeVarInt(PARAM_AUTHORIZATION_INFO)
|
|
175
|
+
const encoded = textEncoder.encode(params.authorization_info)
|
|
176
|
+
w.writeVarInt(encoded.byteLength)
|
|
177
|
+
w.writeBytes(encoded)
|
|
178
|
+
}
|
|
179
|
+
if (params.delivery_timeout !== undefined) {
|
|
180
|
+
w.writeVarInt(PARAM_DELIVERY_TIMEOUT)
|
|
181
|
+
const tmpW = new BufferWriter(16)
|
|
182
|
+
tmpW.writeVarInt(params.delivery_timeout)
|
|
183
|
+
const raw = tmpW.finish()
|
|
184
|
+
w.writeVarInt(raw.byteLength)
|
|
185
|
+
w.writeBytes(raw)
|
|
186
|
+
}
|
|
187
|
+
if (params.max_cache_duration !== undefined) {
|
|
188
|
+
w.writeVarInt(PARAM_MAX_CACHE_DURATION)
|
|
189
|
+
const tmpW = new BufferWriter(16)
|
|
190
|
+
tmpW.writeVarInt(params.max_cache_duration)
|
|
191
|
+
const raw = tmpW.finish()
|
|
192
|
+
w.writeVarInt(raw.byteLength)
|
|
193
|
+
w.writeBytes(raw)
|
|
194
|
+
}
|
|
195
|
+
if (params.unknown) {
|
|
196
|
+
for (const u of params.unknown) {
|
|
197
|
+
w.writeVarInt(BigInt(u.id))
|
|
198
|
+
const raw = hexToBytes(u.raw_hex)
|
|
199
|
+
w.writeVarInt(raw.byteLength)
|
|
200
|
+
w.writeBytes(raw)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function decodeParams(r: BufferReader): Draft07Params {
|
|
206
|
+
const count = Number(r.readVarInt())
|
|
207
|
+
const result: Draft07Params = {}
|
|
208
|
+
const unknown: UnknownParam[] = []
|
|
209
|
+
|
|
210
|
+
for (let i = 0; i < count; i++) {
|
|
211
|
+
const paramType = r.readVarInt()
|
|
212
|
+
const length = Number(r.readVarInt())
|
|
213
|
+
|
|
214
|
+
if (paramType === PARAM_AUTHORIZATION_INFO) {
|
|
215
|
+
const bytes = r.readBytes(length)
|
|
216
|
+
result.authorization_info = textDecoder.decode(bytes)
|
|
217
|
+
} else if (paramType === PARAM_DELIVERY_TIMEOUT) {
|
|
218
|
+
const blob = r.readBytes(length)
|
|
219
|
+
const tmpReader = new BufferReader(blob)
|
|
220
|
+
result.delivery_timeout = tmpReader.readVarInt()
|
|
221
|
+
} else if (paramType === PARAM_MAX_CACHE_DURATION) {
|
|
222
|
+
const blob = r.readBytes(length)
|
|
223
|
+
const tmpReader = new BufferReader(blob)
|
|
224
|
+
result.max_cache_duration = tmpReader.readVarInt()
|
|
225
|
+
} else {
|
|
226
|
+
const bytes = r.readBytes(length)
|
|
227
|
+
unknown.push({
|
|
228
|
+
id: `0x${paramType.toString(16)}`,
|
|
229
|
+
length,
|
|
230
|
+
raw_hex: bytesToHex(bytes),
|
|
231
|
+
})
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (unknown.length > 0) result.unknown = unknown
|
|
236
|
+
return result
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ─── Payload Encoders ──────────────────────────────────────────────────────────
|
|
240
|
+
|
|
241
|
+
function encodeClientSetupPayload(msg: ClientSetup, writer: BufferWriter): void {
|
|
242
|
+
writer.writeVarInt(msg.supported_versions.length)
|
|
243
|
+
for (const version of msg.supported_versions) {
|
|
244
|
+
writer.writeVarInt(version)
|
|
245
|
+
}
|
|
246
|
+
encodeSetupParams(msg.parameters, writer)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function encodeServerSetupPayload(msg: ServerSetup, writer: BufferWriter): void {
|
|
250
|
+
writer.writeVarInt(msg.selected_version)
|
|
251
|
+
encodeSetupParams(msg.parameters, writer)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function encodeSubscribePayload(msg: Subscribe, writer: BufferWriter): void {
|
|
255
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
256
|
+
writer.writeVarInt(msg.track_alias)
|
|
257
|
+
writer.writeTuple(msg.track_namespace)
|
|
258
|
+
writer.writeString(msg.track_name)
|
|
259
|
+
writer.writeUint8(msg.subscriber_priority)
|
|
260
|
+
writer.writeUint8(msg.group_order)
|
|
261
|
+
writer.writeVarInt(msg.filter_type)
|
|
262
|
+
if (msg.filter_type === 3n || msg.filter_type === 4n) {
|
|
263
|
+
writer.writeVarInt(msg.start_group!)
|
|
264
|
+
writer.writeVarInt(msg.start_object!)
|
|
265
|
+
}
|
|
266
|
+
if (msg.filter_type === 4n) {
|
|
267
|
+
writer.writeVarInt(msg.end_group!)
|
|
268
|
+
writer.writeVarInt(msg.end_object!)
|
|
269
|
+
}
|
|
270
|
+
encodeParams(msg.parameters, writer)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function encodeSubscribeOkPayload(msg: SubscribeOk, writer: BufferWriter): void {
|
|
274
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
275
|
+
writer.writeVarInt(msg.expires)
|
|
276
|
+
writer.writeUint8(msg.group_order)
|
|
277
|
+
writer.writeUint8(msg.content_exists)
|
|
278
|
+
if (msg.content_exists) {
|
|
279
|
+
writer.writeVarInt(msg.largest_group_id!)
|
|
280
|
+
writer.writeVarInt(msg.largest_object_id!)
|
|
281
|
+
}
|
|
282
|
+
encodeParams(msg.parameters, writer)
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function encodeSubscribeErrorPayload(msg: SubscribeError, writer: BufferWriter): void {
|
|
286
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
287
|
+
writer.writeVarInt(msg.error_code)
|
|
288
|
+
writer.writeString(msg.reason_phrase)
|
|
289
|
+
writer.writeVarInt(msg.track_alias)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function encodeSubscribeDonePayload(msg: SubscribeDone, writer: BufferWriter): void {
|
|
293
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
294
|
+
writer.writeVarInt(msg.status_code)
|
|
295
|
+
writer.writeString(msg.reason_phrase)
|
|
296
|
+
writer.writeUint8(msg.content_exists)
|
|
297
|
+
if (msg.content_exists) {
|
|
298
|
+
writer.writeVarInt(msg.final_group!)
|
|
299
|
+
writer.writeVarInt(msg.final_object!)
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function encodeSubscribeUpdatePayload(msg: SubscribeUpdate, writer: BufferWriter): void {
|
|
304
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
305
|
+
writer.writeVarInt(msg.start_group)
|
|
306
|
+
writer.writeVarInt(msg.start_object)
|
|
307
|
+
writer.writeVarInt(msg.end_group)
|
|
308
|
+
writer.writeVarInt(msg.end_object)
|
|
309
|
+
writer.writeUint8(msg.subscriber_priority)
|
|
310
|
+
encodeParams(msg.parameters, writer)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function encodeUnsubscribePayload(msg: Unsubscribe, writer: BufferWriter): void {
|
|
314
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function encodeAnnouncePayload(msg: Announce, writer: BufferWriter): void {
|
|
318
|
+
writer.writeTuple(msg.track_namespace)
|
|
319
|
+
encodeParams(msg.parameters, writer)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function encodeAnnounceOkPayload(msg: AnnounceOk, writer: BufferWriter): void {
|
|
323
|
+
writer.writeTuple(msg.track_namespace)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function encodeAnnounceErrorPayload(msg: AnnounceError, writer: BufferWriter): void {
|
|
327
|
+
writer.writeTuple(msg.track_namespace)
|
|
328
|
+
writer.writeVarInt(msg.error_code)
|
|
329
|
+
writer.writeString(msg.reason_phrase)
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function encodeAnnounceCancelPayload(msg: AnnounceCancel, writer: BufferWriter): void {
|
|
333
|
+
writer.writeTuple(msg.track_namespace)
|
|
334
|
+
writer.writeVarInt(msg.error_code)
|
|
335
|
+
writer.writeString(msg.reason_phrase)
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function encodeUnannouncePayload(msg: Unannounce, writer: BufferWriter): void {
|
|
339
|
+
writer.writeTuple(msg.track_namespace)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function encodeTrackStatusRequestPayload(msg: TrackStatusRequest, writer: BufferWriter): void {
|
|
343
|
+
writer.writeTuple(msg.track_namespace)
|
|
344
|
+
writer.writeString(msg.track_name)
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function encodeTrackStatusPayload(msg: TrackStatus, writer: BufferWriter): void {
|
|
348
|
+
writer.writeTuple(msg.track_namespace)
|
|
349
|
+
writer.writeString(msg.track_name)
|
|
350
|
+
writer.writeVarInt(msg.status_code)
|
|
351
|
+
writer.writeVarInt(msg.last_group_id)
|
|
352
|
+
writer.writeVarInt(msg.last_object_id)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function encodeGoAwayPayload(msg: GoAway, writer: BufferWriter): void {
|
|
356
|
+
writer.writeString(msg.new_session_uri)
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function encodeSubscribeAnnouncesPayload(msg: SubscribeAnnounces, writer: BufferWriter): void {
|
|
360
|
+
writer.writeTuple(msg.track_namespace_prefix)
|
|
361
|
+
encodeParams(msg.parameters, writer)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function encodeSubscribeAnnouncesOkPayload(msg: SubscribeAnnouncesOk, writer: BufferWriter): void {
|
|
365
|
+
writer.writeTuple(msg.track_namespace_prefix)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function encodeSubscribeAnnouncesErrorPayload(
|
|
369
|
+
msg: SubscribeAnnouncesError,
|
|
370
|
+
writer: BufferWriter,
|
|
371
|
+
): void {
|
|
372
|
+
writer.writeTuple(msg.track_namespace_prefix)
|
|
373
|
+
writer.writeVarInt(msg.error_code)
|
|
374
|
+
writer.writeString(msg.reason_phrase)
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function encodeUnsubscribeAnnouncesPayload(msg: UnsubscribeAnnounces, writer: BufferWriter): void {
|
|
378
|
+
writer.writeTuple(msg.track_namespace_prefix)
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function encodeMaxSubscribeIdPayload(msg: MaxSubscribeId, writer: BufferWriter): void {
|
|
382
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
function encodeFetchPayload(msg: Fetch, writer: BufferWriter): void {
|
|
386
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
387
|
+
writer.writeTuple(msg.track_namespace)
|
|
388
|
+
writer.writeString(msg.track_name)
|
|
389
|
+
writer.writeUint8(msg.subscriber_priority)
|
|
390
|
+
writer.writeUint8(msg.group_order)
|
|
391
|
+
writer.writeVarInt(msg.start_group)
|
|
392
|
+
writer.writeVarInt(msg.start_object)
|
|
393
|
+
writer.writeVarInt(msg.end_group)
|
|
394
|
+
writer.writeVarInt(msg.end_object)
|
|
395
|
+
encodeParams(msg.parameters, writer)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function encodeFetchOkPayload(msg: FetchOk, writer: BufferWriter): void {
|
|
399
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
400
|
+
writer.writeUint8(msg.group_order)
|
|
401
|
+
writer.writeUint8(msg.end_of_track)
|
|
402
|
+
writer.writeVarInt(msg.largest_group_id)
|
|
403
|
+
writer.writeVarInt(msg.largest_object_id)
|
|
404
|
+
encodeParams(msg.parameters, writer)
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function encodeFetchErrorPayload(msg: FetchError, writer: BufferWriter): void {
|
|
408
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
409
|
+
writer.writeVarInt(msg.error_code)
|
|
410
|
+
writer.writeString(msg.reason_phrase)
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function encodeFetchCancelPayload(msg: FetchCancel, writer: BufferWriter): void {
|
|
414
|
+
writer.writeVarInt(msg.subscribe_id)
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Data stream encoders (no type+length framing)
|
|
418
|
+
function encodeObjectPayload(
|
|
419
|
+
msg: { object_status?: number; payload: Uint8Array },
|
|
420
|
+
writer: BufferWriter,
|
|
421
|
+
): void {
|
|
422
|
+
if (msg.payload.byteLength === 0) {
|
|
423
|
+
writer.writeVarInt(0) // payloadLength = 0 signals objectStatus follows
|
|
424
|
+
writer.writeVarInt(msg.object_status ?? 0)
|
|
425
|
+
} else {
|
|
426
|
+
writer.writeVarInt(msg.payload.byteLength)
|
|
427
|
+
writer.writeBytes(msg.payload)
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function encodeObjectDatagram(msg: ObjectDatagram, writer: BufferWriter): void {
|
|
432
|
+
writer.writeVarInt(MSG_OBJECT_DATAGRAM)
|
|
433
|
+
writer.writeVarInt(msg.track_alias)
|
|
434
|
+
writer.writeVarInt(msg.group_id)
|
|
435
|
+
writer.writeVarInt(msg.object_id)
|
|
436
|
+
writer.writeUint8(msg.publisher_priority)
|
|
437
|
+
encodeObjectPayload(msg, writer)
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// ─── Payload encode dispatch ──────────────────────────────────────────────────
|
|
441
|
+
|
|
442
|
+
function encodePayload(msg: Draft07Message, w: BufferWriter): void {
|
|
443
|
+
switch (msg.type) {
|
|
444
|
+
case 'client_setup':
|
|
445
|
+
return encodeClientSetupPayload(msg, w)
|
|
446
|
+
case 'server_setup':
|
|
447
|
+
return encodeServerSetupPayload(msg, w)
|
|
448
|
+
case 'subscribe':
|
|
449
|
+
return encodeSubscribePayload(msg, w)
|
|
450
|
+
case 'subscribe_ok':
|
|
451
|
+
return encodeSubscribeOkPayload(msg, w)
|
|
452
|
+
case 'subscribe_error':
|
|
453
|
+
return encodeSubscribeErrorPayload(msg, w)
|
|
454
|
+
case 'subscribe_update':
|
|
455
|
+
return encodeSubscribeUpdatePayload(msg, w)
|
|
456
|
+
case 'subscribe_done':
|
|
457
|
+
return encodeSubscribeDonePayload(msg, w)
|
|
458
|
+
case 'unsubscribe':
|
|
459
|
+
return encodeUnsubscribePayload(msg, w)
|
|
460
|
+
case 'announce':
|
|
461
|
+
return encodeAnnouncePayload(msg, w)
|
|
462
|
+
case 'announce_ok':
|
|
463
|
+
return encodeAnnounceOkPayload(msg, w)
|
|
464
|
+
case 'announce_error':
|
|
465
|
+
return encodeAnnounceErrorPayload(msg, w)
|
|
466
|
+
case 'unannounce':
|
|
467
|
+
return encodeUnannouncePayload(msg, w)
|
|
468
|
+
case 'announce_cancel':
|
|
469
|
+
return encodeAnnounceCancelPayload(msg, w)
|
|
470
|
+
case 'subscribe_announces':
|
|
471
|
+
return encodeSubscribeAnnouncesPayload(msg, w)
|
|
472
|
+
case 'subscribe_announces_ok':
|
|
473
|
+
return encodeSubscribeAnnouncesOkPayload(msg, w)
|
|
474
|
+
case 'subscribe_announces_error':
|
|
475
|
+
return encodeSubscribeAnnouncesErrorPayload(msg, w)
|
|
476
|
+
case 'unsubscribe_announces':
|
|
477
|
+
return encodeUnsubscribeAnnouncesPayload(msg, w)
|
|
478
|
+
case 'fetch':
|
|
479
|
+
return encodeFetchPayload(msg, w)
|
|
480
|
+
case 'fetch_ok':
|
|
481
|
+
return encodeFetchOkPayload(msg, w)
|
|
482
|
+
case 'fetch_error':
|
|
483
|
+
return encodeFetchErrorPayload(msg, w)
|
|
484
|
+
case 'fetch_cancel':
|
|
485
|
+
return encodeFetchCancelPayload(msg, w)
|
|
486
|
+
case 'track_status_request':
|
|
487
|
+
return encodeTrackStatusRequestPayload(msg, w)
|
|
488
|
+
case 'track_status':
|
|
489
|
+
return encodeTrackStatusPayload(msg, w)
|
|
490
|
+
case 'goaway':
|
|
491
|
+
return encodeGoAwayPayload(msg, w)
|
|
492
|
+
case 'max_subscribe_id':
|
|
493
|
+
return encodeMaxSubscribeIdPayload(msg, w)
|
|
494
|
+
default:
|
|
495
|
+
throw new Error(`Unhandled message type: ${(msg as Draft07Message).type}`)
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// ─── Payload Decoders ──────────────────────────────────────────────────────────
|
|
500
|
+
|
|
501
|
+
function decodeClientSetupPayload(reader: BufferReader): Draft07Message {
|
|
502
|
+
const numVersions = reader.readVarInt()
|
|
503
|
+
if (numVersions === 0n) {
|
|
504
|
+
throw new DecodeError(
|
|
505
|
+
'CONSTRAINT_VIOLATION',
|
|
506
|
+
'supported_versions must not be empty',
|
|
507
|
+
reader.offset,
|
|
508
|
+
)
|
|
509
|
+
}
|
|
510
|
+
const supported_versions: bigint[] = []
|
|
511
|
+
for (let i = 0n; i < numVersions; i++) {
|
|
512
|
+
supported_versions.push(reader.readVarInt())
|
|
513
|
+
}
|
|
514
|
+
const parameters = decodeSetupParams(reader)
|
|
515
|
+
return { type: 'client_setup', supported_versions, parameters }
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
function decodeServerSetupPayload(reader: BufferReader): Draft07Message {
|
|
519
|
+
const selected_version = reader.readVarInt()
|
|
520
|
+
const parameters = decodeSetupParams(reader)
|
|
521
|
+
return { type: 'server_setup', selected_version, parameters }
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function decodeSubscribePayload(reader: BufferReader): Draft07Message {
|
|
525
|
+
const subscribe_id = reader.readVarInt()
|
|
526
|
+
const track_alias = reader.readVarInt()
|
|
527
|
+
const track_namespace = reader.readTuple()
|
|
528
|
+
const track_name = reader.readString()
|
|
529
|
+
const subscriber_priority = reader.readUint8()
|
|
530
|
+
const group_order = reader.readUint8()
|
|
531
|
+
const filter_type = reader.readVarInt()
|
|
532
|
+
|
|
533
|
+
if (filter_type < 1n || filter_type > 4n) {
|
|
534
|
+
throw new DecodeError(
|
|
535
|
+
'CONSTRAINT_VIOLATION',
|
|
536
|
+
`Invalid filter type: ${filter_type}`,
|
|
537
|
+
reader.offset,
|
|
538
|
+
)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
const base = {
|
|
542
|
+
type: 'subscribe' as const,
|
|
543
|
+
subscribe_id,
|
|
544
|
+
track_alias,
|
|
545
|
+
track_namespace,
|
|
546
|
+
track_name,
|
|
547
|
+
subscriber_priority,
|
|
548
|
+
group_order,
|
|
549
|
+
filter_type,
|
|
550
|
+
parameters: undefined as unknown as Draft07Params,
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
if (filter_type === 3n) {
|
|
554
|
+
const start_group = reader.readVarInt()
|
|
555
|
+
const start_object = reader.readVarInt()
|
|
556
|
+
base.parameters = decodeParams(reader)
|
|
557
|
+
return { ...base, start_group, start_object }
|
|
558
|
+
}
|
|
559
|
+
if (filter_type === 4n) {
|
|
560
|
+
const start_group = reader.readVarInt()
|
|
561
|
+
const start_object = reader.readVarInt()
|
|
562
|
+
const end_group = reader.readVarInt()
|
|
563
|
+
const end_object = reader.readVarInt()
|
|
564
|
+
base.parameters = decodeParams(reader)
|
|
565
|
+
return { ...base, start_group, start_object, end_group, end_object }
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
base.parameters = decodeParams(reader)
|
|
569
|
+
return base
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
function decodeSubscribeOkPayload(reader: BufferReader): Draft07Message {
|
|
573
|
+
const subscribe_id = reader.readVarInt()
|
|
574
|
+
const expires = reader.readVarInt()
|
|
575
|
+
const group_order = reader.readUint8()
|
|
576
|
+
const content_exists = reader.readUint8()
|
|
577
|
+
|
|
578
|
+
if (content_exists) {
|
|
579
|
+
const largest_group_id = reader.readVarInt()
|
|
580
|
+
const largest_object_id = reader.readVarInt()
|
|
581
|
+
const parameters = decodeParams(reader)
|
|
582
|
+
return {
|
|
583
|
+
type: 'subscribe_ok' as const,
|
|
584
|
+
subscribe_id,
|
|
585
|
+
expires,
|
|
586
|
+
group_order,
|
|
587
|
+
content_exists,
|
|
588
|
+
largest_group_id,
|
|
589
|
+
largest_object_id,
|
|
590
|
+
parameters,
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
const parameters = decodeParams(reader)
|
|
595
|
+
return {
|
|
596
|
+
type: 'subscribe_ok' as const,
|
|
597
|
+
subscribe_id,
|
|
598
|
+
expires,
|
|
599
|
+
group_order,
|
|
600
|
+
content_exists,
|
|
601
|
+
parameters,
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
function decodeSubscribeErrorPayload(reader: BufferReader): Draft07Message {
|
|
606
|
+
const subscribe_id = reader.readVarInt()
|
|
607
|
+
const error_code = reader.readVarInt()
|
|
608
|
+
const reason_phrase = reader.readString()
|
|
609
|
+
const track_alias = reader.readVarInt()
|
|
610
|
+
return {
|
|
611
|
+
type: 'subscribe_error',
|
|
612
|
+
subscribe_id,
|
|
613
|
+
error_code,
|
|
614
|
+
reason_phrase,
|
|
615
|
+
track_alias,
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
function decodeSubscribeDonePayload(reader: BufferReader): Draft07Message {
|
|
620
|
+
const subscribe_id = reader.readVarInt()
|
|
621
|
+
const status_code = reader.readVarInt()
|
|
622
|
+
const reason_phrase = reader.readString()
|
|
623
|
+
const content_exists = reader.readUint8()
|
|
624
|
+
|
|
625
|
+
if (content_exists) {
|
|
626
|
+
const final_group = reader.readVarInt()
|
|
627
|
+
const final_object = reader.readVarInt()
|
|
628
|
+
return {
|
|
629
|
+
type: 'subscribe_done' as const,
|
|
630
|
+
subscribe_id,
|
|
631
|
+
status_code,
|
|
632
|
+
reason_phrase,
|
|
633
|
+
content_exists,
|
|
634
|
+
final_group,
|
|
635
|
+
final_object,
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
return {
|
|
640
|
+
type: 'subscribe_done' as const,
|
|
641
|
+
subscribe_id,
|
|
642
|
+
status_code,
|
|
643
|
+
reason_phrase,
|
|
644
|
+
content_exists,
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
function decodeSubscribeUpdatePayload(reader: BufferReader): Draft07Message {
|
|
649
|
+
const subscribe_id = reader.readVarInt()
|
|
650
|
+
const start_group = reader.readVarInt()
|
|
651
|
+
const start_object = reader.readVarInt()
|
|
652
|
+
const end_group = reader.readVarInt()
|
|
653
|
+
const end_object = reader.readVarInt()
|
|
654
|
+
const subscriber_priority = reader.readUint8()
|
|
655
|
+
const parameters = decodeParams(reader)
|
|
656
|
+
return {
|
|
657
|
+
type: 'subscribe_update',
|
|
658
|
+
subscribe_id,
|
|
659
|
+
start_group,
|
|
660
|
+
start_object,
|
|
661
|
+
end_group,
|
|
662
|
+
end_object,
|
|
663
|
+
subscriber_priority,
|
|
664
|
+
parameters,
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
function decodeUnsubscribePayload(reader: BufferReader): Draft07Message {
|
|
669
|
+
const subscribe_id = reader.readVarInt()
|
|
670
|
+
return { type: 'unsubscribe', subscribe_id }
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
function decodeAnnouncePayload(reader: BufferReader): Draft07Message {
|
|
674
|
+
const track_namespace = reader.readTuple()
|
|
675
|
+
const parameters = decodeParams(reader)
|
|
676
|
+
return { type: 'announce', track_namespace, parameters }
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function decodeAnnounceOkPayload(reader: BufferReader): Draft07Message {
|
|
680
|
+
const track_namespace = reader.readTuple()
|
|
681
|
+
return { type: 'announce_ok', track_namespace }
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function decodeAnnounceErrorPayload(reader: BufferReader): Draft07Message {
|
|
685
|
+
const track_namespace = reader.readTuple()
|
|
686
|
+
const error_code = reader.readVarInt()
|
|
687
|
+
const reason_phrase = reader.readString()
|
|
688
|
+
return { type: 'announce_error', track_namespace, error_code, reason_phrase }
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
function decodeAnnounceCancelPayload(reader: BufferReader): Draft07Message {
|
|
692
|
+
const track_namespace = reader.readTuple()
|
|
693
|
+
const error_code = reader.readVarInt()
|
|
694
|
+
const reason_phrase = reader.readString()
|
|
695
|
+
return { type: 'announce_cancel', track_namespace, error_code, reason_phrase }
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
function decodeUnannouncePayload(reader: BufferReader): Draft07Message {
|
|
699
|
+
const track_namespace = reader.readTuple()
|
|
700
|
+
return { type: 'unannounce', track_namespace }
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
function decodeTrackStatusRequestPayload(reader: BufferReader): Draft07Message {
|
|
704
|
+
const track_namespace = reader.readTuple()
|
|
705
|
+
const track_name = reader.readString()
|
|
706
|
+
return { type: 'track_status_request', track_namespace, track_name }
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
function decodeTrackStatusPayload(reader: BufferReader): Draft07Message {
|
|
710
|
+
const track_namespace = reader.readTuple()
|
|
711
|
+
const track_name = reader.readString()
|
|
712
|
+
const status_code = reader.readVarInt()
|
|
713
|
+
const last_group_id = reader.readVarInt()
|
|
714
|
+
const last_object_id = reader.readVarInt()
|
|
715
|
+
return {
|
|
716
|
+
type: 'track_status',
|
|
717
|
+
track_namespace,
|
|
718
|
+
track_name,
|
|
719
|
+
status_code,
|
|
720
|
+
last_group_id,
|
|
721
|
+
last_object_id,
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
function decodeGoAwayPayload(reader: BufferReader): Draft07Message {
|
|
726
|
+
const new_session_uri = reader.readString()
|
|
727
|
+
return { type: 'goaway', new_session_uri }
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
function decodeSubscribeAnnouncesPayload(reader: BufferReader): Draft07Message {
|
|
731
|
+
const track_namespace_prefix = reader.readTuple()
|
|
732
|
+
const parameters = decodeParams(reader)
|
|
733
|
+
return { type: 'subscribe_announces', track_namespace_prefix, parameters }
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
function decodeSubscribeAnnouncesOkPayload(reader: BufferReader): Draft07Message {
|
|
737
|
+
const track_namespace_prefix = reader.readTuple()
|
|
738
|
+
return { type: 'subscribe_announces_ok', track_namespace_prefix }
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
function decodeSubscribeAnnouncesErrorPayload(reader: BufferReader): Draft07Message {
|
|
742
|
+
const track_namespace_prefix = reader.readTuple()
|
|
743
|
+
const error_code = reader.readVarInt()
|
|
744
|
+
const reason_phrase = reader.readString()
|
|
745
|
+
return {
|
|
746
|
+
type: 'subscribe_announces_error',
|
|
747
|
+
track_namespace_prefix,
|
|
748
|
+
error_code,
|
|
749
|
+
reason_phrase,
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
function decodeUnsubscribeAnnouncesPayload(reader: BufferReader): Draft07Message {
|
|
754
|
+
const track_namespace_prefix = reader.readTuple()
|
|
755
|
+
return { type: 'unsubscribe_announces', track_namespace_prefix }
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
function decodeMaxSubscribeIdPayload(reader: BufferReader): Draft07Message {
|
|
759
|
+
const subscribe_id = reader.readVarInt()
|
|
760
|
+
return { type: 'max_subscribe_id', subscribe_id }
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
function decodeFetchPayload(reader: BufferReader): Draft07Message {
|
|
764
|
+
const subscribe_id = reader.readVarInt()
|
|
765
|
+
const track_namespace = reader.readTuple()
|
|
766
|
+
const track_name = reader.readString()
|
|
767
|
+
const subscriber_priority = reader.readUint8()
|
|
768
|
+
const group_order = reader.readUint8()
|
|
769
|
+
const start_group = reader.readVarInt()
|
|
770
|
+
const start_object = reader.readVarInt()
|
|
771
|
+
const end_group = reader.readVarInt()
|
|
772
|
+
const end_object = reader.readVarInt()
|
|
773
|
+
const parameters = decodeParams(reader)
|
|
774
|
+
return {
|
|
775
|
+
type: 'fetch' as const,
|
|
776
|
+
subscribe_id,
|
|
777
|
+
track_namespace,
|
|
778
|
+
track_name,
|
|
779
|
+
subscriber_priority,
|
|
780
|
+
group_order,
|
|
781
|
+
start_group,
|
|
782
|
+
start_object,
|
|
783
|
+
end_group,
|
|
784
|
+
end_object,
|
|
785
|
+
parameters,
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
function decodeFetchOkPayload(reader: BufferReader): Draft07Message {
|
|
790
|
+
const subscribe_id = reader.readVarInt()
|
|
791
|
+
const group_order = reader.readUint8()
|
|
792
|
+
const end_of_track = reader.readUint8()
|
|
793
|
+
const largest_group_id = reader.readVarInt()
|
|
794
|
+
const largest_object_id = reader.readVarInt()
|
|
795
|
+
const parameters = decodeParams(reader)
|
|
796
|
+
return {
|
|
797
|
+
type: 'fetch_ok' as const,
|
|
798
|
+
subscribe_id,
|
|
799
|
+
group_order,
|
|
800
|
+
end_of_track,
|
|
801
|
+
largest_group_id,
|
|
802
|
+
largest_object_id,
|
|
803
|
+
parameters,
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
function decodeFetchErrorPayload(reader: BufferReader): Draft07Message {
|
|
808
|
+
const subscribe_id = reader.readVarInt()
|
|
809
|
+
const error_code = reader.readVarInt()
|
|
810
|
+
const reason_phrase = reader.readString()
|
|
811
|
+
return { type: 'fetch_error', subscribe_id, error_code, reason_phrase }
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
function decodeFetchCancelPayload(reader: BufferReader): Draft07Message {
|
|
815
|
+
const subscribe_id = reader.readVarInt()
|
|
816
|
+
return { type: 'fetch_cancel', subscribe_id }
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
function decodeObjectDatagram(reader: BufferReader): ObjectDatagram {
|
|
820
|
+
const track_alias = reader.readVarInt()
|
|
821
|
+
const group_id = reader.readVarInt()
|
|
822
|
+
const object_id = reader.readVarInt()
|
|
823
|
+
const publisher_priority = reader.readUint8()
|
|
824
|
+
const payloadLength = Number(reader.readVarInt())
|
|
825
|
+
if (payloadLength === 0) {
|
|
826
|
+
// Object Status follows when payload length is 0
|
|
827
|
+
const object_status = reader.remaining > 0 ? Number(reader.readVarInt()) : 0
|
|
828
|
+
return {
|
|
829
|
+
type: 'object_datagram' as const,
|
|
830
|
+
track_alias,
|
|
831
|
+
group_id,
|
|
832
|
+
object_id,
|
|
833
|
+
publisher_priority,
|
|
834
|
+
object_status,
|
|
835
|
+
payload: new Uint8Array(0),
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
const payload = reader.readBytesView(payloadLength)
|
|
839
|
+
return {
|
|
840
|
+
type: 'object_datagram' as const,
|
|
841
|
+
track_alias,
|
|
842
|
+
group_id,
|
|
843
|
+
object_id,
|
|
844
|
+
publisher_priority,
|
|
845
|
+
payload,
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
// ─── Payload dispatch tables ──────────────────────────────────────────────────
|
|
850
|
+
|
|
851
|
+
type Decoder = (reader: BufferReader) => Draft07Message
|
|
852
|
+
|
|
853
|
+
const payloadDecoders: ReadonlyMap<bigint, Decoder> = new Map([
|
|
854
|
+
[MSG_CLIENT_SETUP, decodeClientSetupPayload],
|
|
855
|
+
[MSG_SERVER_SETUP, decodeServerSetupPayload],
|
|
856
|
+
[MSG_SUBSCRIBE, decodeSubscribePayload],
|
|
857
|
+
[MSG_SUBSCRIBE_OK, decodeSubscribeOkPayload],
|
|
858
|
+
[MSG_SUBSCRIBE_ERROR, decodeSubscribeErrorPayload],
|
|
859
|
+
[MSG_SUBSCRIBE_DONE, decodeSubscribeDonePayload],
|
|
860
|
+
[MSG_SUBSCRIBE_UPDATE, decodeSubscribeUpdatePayload],
|
|
861
|
+
[MSG_UNSUBSCRIBE, decodeUnsubscribePayload],
|
|
862
|
+
[MSG_ANNOUNCE, decodeAnnouncePayload],
|
|
863
|
+
[MSG_ANNOUNCE_OK, decodeAnnounceOkPayload],
|
|
864
|
+
[MSG_ANNOUNCE_ERROR, decodeAnnounceErrorPayload],
|
|
865
|
+
[MSG_ANNOUNCE_CANCEL, decodeAnnounceCancelPayload],
|
|
866
|
+
[MSG_UNANNOUNCE, decodeUnannouncePayload],
|
|
867
|
+
[MSG_TRACK_STATUS_REQUEST, decodeTrackStatusRequestPayload],
|
|
868
|
+
[MSG_TRACK_STATUS, decodeTrackStatusPayload],
|
|
869
|
+
[MSG_GOAWAY, decodeGoAwayPayload],
|
|
870
|
+
[MSG_SUBSCRIBE_ANNOUNCES, decodeSubscribeAnnouncesPayload],
|
|
871
|
+
[MSG_SUBSCRIBE_ANNOUNCES_OK, decodeSubscribeAnnouncesOkPayload],
|
|
872
|
+
[MSG_SUBSCRIBE_ANNOUNCES_ERROR, decodeSubscribeAnnouncesErrorPayload],
|
|
873
|
+
[MSG_UNSUBSCRIBE_ANNOUNCES, decodeUnsubscribeAnnouncesPayload],
|
|
874
|
+
[MSG_MAX_SUBSCRIBE_ID, decodeMaxSubscribeIdPayload],
|
|
875
|
+
[MSG_FETCH, decodeFetchPayload],
|
|
876
|
+
[MSG_FETCH_OK, decodeFetchOkPayload],
|
|
877
|
+
[MSG_FETCH_ERROR, decodeFetchErrorPayload],
|
|
878
|
+
[MSG_FETCH_CANCEL, decodeFetchCancelPayload],
|
|
879
|
+
])
|
|
880
|
+
|
|
881
|
+
// Data stream decoders keyed by wire ID (for disambiguation)
|
|
882
|
+
const dataStreamDecoders = new Map<bigint, Decoder>([[MSG_OBJECT_DATAGRAM, decodeObjectDatagram]])
|
|
883
|
+
|
|
884
|
+
// ─── Public API ────────────────────────────────────────────────────────────────
|
|
885
|
+
|
|
886
|
+
function encodeMessage(message: Draft07Message): Uint8Array {
|
|
887
|
+
// Check if it's a data stream message (no type+length framing)
|
|
888
|
+
if (message.type === 'object_datagram') {
|
|
889
|
+
const writer = new BufferWriter()
|
|
890
|
+
encodeObjectDatagram(message as ObjectDatagram, writer)
|
|
891
|
+
return writer.finish()
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
// Control message: type + length + payload framing
|
|
895
|
+
const typeId = MESSAGE_ID_MAP.get(message.type)
|
|
896
|
+
if (typeId === undefined) {
|
|
897
|
+
throw new Error(`Unknown message type: ${message.type}`)
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
const payloadWriter = new BufferWriter()
|
|
901
|
+
encodePayload(message, payloadWriter)
|
|
902
|
+
const payload = payloadWriter.finishView()
|
|
903
|
+
|
|
904
|
+
const writer = new BufferWriter(payload.byteLength + 16)
|
|
905
|
+
writer.writeVarInt(typeId)
|
|
906
|
+
writer.writeVarInt(payload.byteLength)
|
|
907
|
+
writer.writeBytes(payload)
|
|
908
|
+
return writer.finish()
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
function decodeMessage(bytes: Uint8Array): DecodeResult<Draft07Message> {
|
|
912
|
+
try {
|
|
913
|
+
const reader = new BufferReader(bytes, 0)
|
|
914
|
+
const typeId = reader.readVarInt()
|
|
915
|
+
|
|
916
|
+
// Check if this is a data stream type (no length framing)
|
|
917
|
+
if (DATA_STREAM_TYPE_IDS.has(typeId)) {
|
|
918
|
+
const decoder = dataStreamDecoders.get(typeId)
|
|
919
|
+
if (!decoder) {
|
|
920
|
+
return {
|
|
921
|
+
ok: false,
|
|
922
|
+
error: new DecodeError(
|
|
923
|
+
'UNKNOWN_MESSAGE_TYPE',
|
|
924
|
+
`Unknown data stream type ID: 0x${typeId.toString(16)}`,
|
|
925
|
+
0,
|
|
926
|
+
),
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
const message = decoder(reader)
|
|
930
|
+
return { ok: true, value: message, bytesRead: reader.offset }
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
// Control message: read length, then decode payload from bounded sub-reader
|
|
934
|
+
const payloadLength = Number(reader.readVarInt())
|
|
935
|
+
|
|
936
|
+
if (reader.remaining < payloadLength) {
|
|
937
|
+
return {
|
|
938
|
+
ok: false,
|
|
939
|
+
error: new DecodeError(
|
|
940
|
+
'UNEXPECTED_END',
|
|
941
|
+
`Not enough bytes for payload: need ${payloadLength}, have ${reader.remaining}`,
|
|
942
|
+
reader.offset,
|
|
943
|
+
),
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
const payloadBytes = reader.readBytes(payloadLength)
|
|
948
|
+
const totalBytesRead = reader.offset
|
|
949
|
+
|
|
950
|
+
const decoder = payloadDecoders.get(typeId)
|
|
951
|
+
if (!decoder) {
|
|
952
|
+
return {
|
|
953
|
+
ok: false,
|
|
954
|
+
error: new DecodeError(
|
|
955
|
+
'UNKNOWN_MESSAGE_TYPE',
|
|
956
|
+
`Unknown message type ID: 0x${typeId.toString(16)}`,
|
|
957
|
+
0,
|
|
958
|
+
),
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
const payloadReader = new BufferReader(payloadBytes, 0)
|
|
963
|
+
const message = decoder(payloadReader)
|
|
964
|
+
return { ok: true, value: message, bytesRead: totalBytesRead }
|
|
965
|
+
} catch (e) {
|
|
966
|
+
if (e instanceof DecodeError) {
|
|
967
|
+
return { ok: false, error: e }
|
|
968
|
+
}
|
|
969
|
+
throw e
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
export {
|
|
974
|
+
decodeDatagram,
|
|
975
|
+
decodeFetchStream,
|
|
976
|
+
decodeSubgroupStream,
|
|
977
|
+
encodeDatagram,
|
|
978
|
+
encodeFetchStream,
|
|
979
|
+
encodeSubgroupStream,
|
|
980
|
+
} from './data-streams.js'
|
|
981
|
+
|
|
982
|
+
import {
|
|
983
|
+
decodeDatagram,
|
|
984
|
+
decodeFetchStream,
|
|
985
|
+
decodeSubgroupStream,
|
|
986
|
+
encodeDatagram,
|
|
987
|
+
encodeFetchStream,
|
|
988
|
+
encodeSubgroupStream,
|
|
989
|
+
} from './data-streams.js'
|
|
990
|
+
|
|
991
|
+
export function createStreamDecoder(): TransformStream<Uint8Array, Draft07Message> {
|
|
992
|
+
let buffer = new Uint8Array(0)
|
|
993
|
+
let offset = 0
|
|
994
|
+
return new TransformStream<Uint8Array, Draft07Message>({
|
|
995
|
+
transform(chunk, controller) {
|
|
996
|
+
if (offset > 0) {
|
|
997
|
+
buffer = buffer.subarray(offset)
|
|
998
|
+
offset = 0
|
|
999
|
+
}
|
|
1000
|
+
const newBuffer = new Uint8Array(buffer.length + chunk.length)
|
|
1001
|
+
newBuffer.set(buffer, 0)
|
|
1002
|
+
newBuffer.set(chunk, buffer.length)
|
|
1003
|
+
buffer = newBuffer
|
|
1004
|
+
while (offset < buffer.length) {
|
|
1005
|
+
const result = decodeMessage(buffer.subarray(offset))
|
|
1006
|
+
if (!result.ok) {
|
|
1007
|
+
if (result.error.code === 'UNEXPECTED_END') break
|
|
1008
|
+
controller.error(result.error)
|
|
1009
|
+
return
|
|
1010
|
+
}
|
|
1011
|
+
controller.enqueue(result.value)
|
|
1012
|
+
offset += result.bytesRead
|
|
1013
|
+
}
|
|
1014
|
+
},
|
|
1015
|
+
flush(controller) {
|
|
1016
|
+
if (offset < buffer.length) {
|
|
1017
|
+
controller.error(
|
|
1018
|
+
new DecodeError('UNEXPECTED_END', 'Stream ended with incomplete message data', 0),
|
|
1019
|
+
)
|
|
1020
|
+
}
|
|
1021
|
+
},
|
|
1022
|
+
})
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
// ─── Codec Factory ────────────────────────────────────────────────────────────
|
|
1026
|
+
|
|
1027
|
+
export interface Draft07Codec extends BaseCodec<Draft07Message> {
|
|
1028
|
+
readonly draft: '07'
|
|
1029
|
+
encodeVarInt(value: number | bigint): Uint8Array
|
|
1030
|
+
decodeVarInt(bytes: Uint8Array, offset?: number): DecodeResult<bigint>
|
|
1031
|
+
encodeSubgroupStream(stream: SubgroupStream): Uint8Array
|
|
1032
|
+
decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream>
|
|
1033
|
+
encodeDatagram(dg: Draft07DatagramObject): Uint8Array
|
|
1034
|
+
decodeDatagram(bytes: Uint8Array): DecodeResult<Draft07DatagramObject>
|
|
1035
|
+
encodeFetchStream(stream: FetchStream): Uint8Array
|
|
1036
|
+
decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream>
|
|
1037
|
+
createStreamDecoder(): TransformStream<Uint8Array, Draft07Message>
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
export function createDraft07Codec(): Draft07Codec {
|
|
1041
|
+
return {
|
|
1042
|
+
draft: '07',
|
|
1043
|
+
encodeMessage,
|
|
1044
|
+
decodeMessage,
|
|
1045
|
+
encodeVarInt,
|
|
1046
|
+
decodeVarInt,
|
|
1047
|
+
createStreamDecoder,
|
|
1048
|
+
encodeSubgroupStream,
|
|
1049
|
+
decodeSubgroupStream,
|
|
1050
|
+
encodeDatagram,
|
|
1051
|
+
decodeDatagram,
|
|
1052
|
+
encodeFetchStream,
|
|
1053
|
+
decodeFetchStream,
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
// Export data-stream decoder map for callers that need to disambiguate
|
|
1058
|
+
export { dataStreamDecoders }
|