@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,100 +1,100 @@
|
|
|
1
|
-
const textEncoder = /* @__PURE__ */ new TextEncoder()
|
|
2
|
-
|
|
3
|
-
export class BufferWriter {
|
|
4
|
-
private buffer: Uint8Array
|
|
5
|
-
private view: DataView
|
|
6
|
-
private pos: number
|
|
7
|
-
|
|
8
|
-
constructor(initialSize = 256) {
|
|
9
|
-
this.buffer = new Uint8Array(initialSize)
|
|
10
|
-
this.view = new DataView(this.buffer.buffer)
|
|
11
|
-
this.pos = 0
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
get offset(): number {
|
|
15
|
-
return this.pos
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
private ensureCapacity(needed: number): void {
|
|
19
|
-
const required = this.pos + needed
|
|
20
|
-
if (required <= this.buffer.byteLength) return
|
|
21
|
-
|
|
22
|
-
let newSize = this.buffer.byteLength * 2
|
|
23
|
-
while (newSize < required) newSize *= 2
|
|
24
|
-
|
|
25
|
-
const newBuffer = new Uint8Array(newSize)
|
|
26
|
-
newBuffer.set(this.buffer)
|
|
27
|
-
this.buffer = newBuffer
|
|
28
|
-
this.view = new DataView(this.buffer.buffer)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
writeUint8(value: number): void {
|
|
32
|
-
this.ensureCapacity(1)
|
|
33
|
-
this.view.setUint8(this.pos, value)
|
|
34
|
-
this.pos += 1
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
writeBytes(bytes: Uint8Array): void {
|
|
38
|
-
this.ensureCapacity(bytes.byteLength)
|
|
39
|
-
this.buffer.set(bytes, this.pos)
|
|
40
|
-
this.pos += bytes.byteLength
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
writeVarInt(value: number | bigint): void {
|
|
44
|
-
const v = BigInt(value)
|
|
45
|
-
if (v < 0n) throw new Error(
|
|
46
|
-
|
|
47
|
-
if (v < 0x40n) {
|
|
48
|
-
this.ensureCapacity(1)
|
|
49
|
-
this.view.setUint8(this.pos, Number(v))
|
|
50
|
-
this.pos += 1
|
|
51
|
-
} else if (v < 0x4000n) {
|
|
52
|
-
this.ensureCapacity(2)
|
|
53
|
-
this.view.setUint16(this.pos, Number(v) | 0x4000)
|
|
54
|
-
this.pos += 2
|
|
55
|
-
} else if (v < 0x40000000n) {
|
|
56
|
-
this.ensureCapacity(4)
|
|
57
|
-
this.view.setUint32(this.pos, Number(v) | 0x80000000)
|
|
58
|
-
this.pos += 4
|
|
59
|
-
} else if (v < 0x4000000000000000n) {
|
|
60
|
-
this.ensureCapacity(8)
|
|
61
|
-
this.view.setBigUint64(this.pos, v | 0xc000000000000000n)
|
|
62
|
-
this.pos += 8
|
|
63
|
-
} else {
|
|
64
|
-
throw new Error(
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
writeString(str: string): void {
|
|
69
|
-
const encoded = textEncoder.encode(str)
|
|
70
|
-
this.writeVarInt(encoded.byteLength)
|
|
71
|
-
this.writeBytes(encoded)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
writeTuple(values: string[]): void {
|
|
75
|
-
this.writeVarInt(values.length)
|
|
76
|
-
for (const v of values) {
|
|
77
|
-
this.writeString(v)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
writeParameters(params: Map<bigint, Uint8Array>): void {
|
|
82
|
-
this.writeVarInt(params.size)
|
|
83
|
-
for (const [key, value] of params) {
|
|
84
|
-
this.writeVarInt(key)
|
|
85
|
-
this.writeVarInt(value.byteLength)
|
|
86
|
-
this.writeBytes(value)
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** Returns an owned copy of the written bytes. */
|
|
91
|
-
finish(): Uint8Array {
|
|
92
|
-
if (this.pos === this.buffer.byteLength) return this.buffer
|
|
93
|
-
return this.buffer.slice(0, this.pos)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** Returns a zero-copy view of the written bytes. Valid only until the next write. */
|
|
97
|
-
finishView(): Uint8Array {
|
|
98
|
-
return this.buffer.subarray(0, this.pos)
|
|
99
|
-
}
|
|
100
|
-
}
|
|
1
|
+
const textEncoder = /* @__PURE__ */ new TextEncoder()
|
|
2
|
+
|
|
3
|
+
export class BufferWriter {
|
|
4
|
+
private buffer: Uint8Array
|
|
5
|
+
private view: DataView
|
|
6
|
+
private pos: number
|
|
7
|
+
|
|
8
|
+
constructor(initialSize = 256) {
|
|
9
|
+
this.buffer = new Uint8Array(initialSize)
|
|
10
|
+
this.view = new DataView(this.buffer.buffer)
|
|
11
|
+
this.pos = 0
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
get offset(): number {
|
|
15
|
+
return this.pos
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private ensureCapacity(needed: number): void {
|
|
19
|
+
const required = this.pos + needed
|
|
20
|
+
if (required <= this.buffer.byteLength) return
|
|
21
|
+
|
|
22
|
+
let newSize = this.buffer.byteLength * 2
|
|
23
|
+
while (newSize < required) newSize *= 2
|
|
24
|
+
|
|
25
|
+
const newBuffer = new Uint8Array(newSize)
|
|
26
|
+
newBuffer.set(this.buffer)
|
|
27
|
+
this.buffer = newBuffer
|
|
28
|
+
this.view = new DataView(this.buffer.buffer)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
writeUint8(value: number): void {
|
|
32
|
+
this.ensureCapacity(1)
|
|
33
|
+
this.view.setUint8(this.pos, value)
|
|
34
|
+
this.pos += 1
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
writeBytes(bytes: Uint8Array): void {
|
|
38
|
+
this.ensureCapacity(bytes.byteLength)
|
|
39
|
+
this.buffer.set(bytes, this.pos)
|
|
40
|
+
this.pos += bytes.byteLength
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
writeVarInt(value: number | bigint): void {
|
|
44
|
+
const v = BigInt(value)
|
|
45
|
+
if (v < 0n) throw new Error('VarInt value must be non-negative')
|
|
46
|
+
|
|
47
|
+
if (v < 0x40n) {
|
|
48
|
+
this.ensureCapacity(1)
|
|
49
|
+
this.view.setUint8(this.pos, Number(v))
|
|
50
|
+
this.pos += 1
|
|
51
|
+
} else if (v < 0x4000n) {
|
|
52
|
+
this.ensureCapacity(2)
|
|
53
|
+
this.view.setUint16(this.pos, Number(v) | 0x4000)
|
|
54
|
+
this.pos += 2
|
|
55
|
+
} else if (v < 0x40000000n) {
|
|
56
|
+
this.ensureCapacity(4)
|
|
57
|
+
this.view.setUint32(this.pos, Number(v) | 0x80000000)
|
|
58
|
+
this.pos += 4
|
|
59
|
+
} else if (v < 0x4000000000000000n) {
|
|
60
|
+
this.ensureCapacity(8)
|
|
61
|
+
this.view.setBigUint64(this.pos, v | 0xc000000000000000n)
|
|
62
|
+
this.pos += 8
|
|
63
|
+
} else {
|
|
64
|
+
throw new Error('VarInt value exceeds 62-bit range')
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
writeString(str: string): void {
|
|
69
|
+
const encoded = textEncoder.encode(str)
|
|
70
|
+
this.writeVarInt(encoded.byteLength)
|
|
71
|
+
this.writeBytes(encoded)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
writeTuple(values: string[]): void {
|
|
75
|
+
this.writeVarInt(values.length)
|
|
76
|
+
for (const v of values) {
|
|
77
|
+
this.writeString(v)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
writeParameters(params: Map<bigint, Uint8Array>): void {
|
|
82
|
+
this.writeVarInt(params.size)
|
|
83
|
+
for (const [key, value] of params) {
|
|
84
|
+
this.writeVarInt(key)
|
|
85
|
+
this.writeVarInt(value.byteLength)
|
|
86
|
+
this.writeBytes(value)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Returns an owned copy of the written bytes. */
|
|
91
|
+
finish(): Uint8Array {
|
|
92
|
+
if (this.pos === this.buffer.byteLength) return this.buffer
|
|
93
|
+
return this.buffer.slice(0, this.pos)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Returns a zero-copy view of the written bytes. Valid only until the next write. */
|
|
97
|
+
finishView(): Uint8Array {
|
|
98
|
+
return this.buffer.subarray(0, this.pos)
|
|
99
|
+
}
|
|
100
|
+
}
|
package/src/core/errors.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { DecodeError, type DecodeErrorCode } from
|
|
1
|
+
export { DecodeError, type DecodeErrorCode } from './types.js'
|
package/src/core/hex.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
const HEX_TABLE = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>
|
|
2
|
-
i.toString(16).padStart(2,
|
|
3
|
-
)
|
|
4
|
-
|
|
5
|
-
/** Convert a Uint8Array to a lowercase hex string. */
|
|
6
|
-
export function bytesToHex(bytes: Uint8Array): string {
|
|
7
|
-
const parts = new Array<string>(bytes.byteLength)
|
|
8
|
-
for (let i = 0; i < bytes.byteLength; i++) {
|
|
9
|
-
parts[i] = HEX_TABLE[bytes[i]!]
|
|
10
|
-
}
|
|
11
|
-
return parts.join(
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/** Convert a hex string to a Uint8Array. */
|
|
15
|
-
export function hexToBytes(hex: string): Uint8Array {
|
|
16
|
-
const bytes = new Uint8Array(hex.length / 2)
|
|
17
|
-
for (let i = 0; i < hex.length; i += 2) {
|
|
18
|
-
bytes[i / 2] = Number.parseInt(hex.substring(i, i + 2), 16)
|
|
19
|
-
}
|
|
20
|
-
return bytes
|
|
21
|
-
}
|
|
1
|
+
const HEX_TABLE = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>
|
|
2
|
+
i.toString(16).padStart(2, '0'),
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
/** Convert a Uint8Array to a lowercase hex string. */
|
|
6
|
+
export function bytesToHex(bytes: Uint8Array): string {
|
|
7
|
+
const parts = new Array<string>(bytes.byteLength)
|
|
8
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
9
|
+
parts[i] = HEX_TABLE[bytes[i]!]!
|
|
10
|
+
}
|
|
11
|
+
return parts.join('')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Convert a hex string to a Uint8Array. */
|
|
15
|
+
export function hexToBytes(hex: string): Uint8Array {
|
|
16
|
+
const bytes = new Uint8Array(hex.length / 2)
|
|
17
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
18
|
+
bytes[i / 2] = Number.parseInt(hex.substring(i, i + 2), 16)
|
|
19
|
+
}
|
|
20
|
+
return bytes
|
|
21
|
+
}
|
|
@@ -1,90 +1,92 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Draft } from './types.js'
|
|
2
2
|
|
|
3
|
-
export type SessionPhase =
|
|
3
|
+
export type SessionPhase = 'idle' | 'setup' | 'ready' | 'draining' | 'closed' | 'error'
|
|
4
4
|
|
|
5
|
-
export type SubscriptionPhase =
|
|
5
|
+
export type SubscriptionPhase = 'pending' | 'active' | 'error' | 'done'
|
|
6
6
|
|
|
7
|
-
export type AnnouncePhase =
|
|
7
|
+
export type AnnouncePhase = 'pending' | 'active' | 'error'
|
|
8
8
|
|
|
9
|
-
export type PublishPhase =
|
|
9
|
+
export type PublishPhase = 'pending' | 'active' | 'error' | 'done'
|
|
10
10
|
|
|
11
|
-
export type FetchPhase =
|
|
11
|
+
export type FetchPhase = 'pending' | 'active' | 'error' | 'cancelled'
|
|
12
12
|
|
|
13
13
|
export interface SubscriptionState {
|
|
14
|
-
readonly subscribeId: bigint
|
|
15
|
-
readonly phase: SubscriptionPhase
|
|
16
|
-
readonly trackNamespace: string[]
|
|
17
|
-
readonly trackName: string
|
|
14
|
+
readonly subscribeId: bigint
|
|
15
|
+
readonly phase: SubscriptionPhase
|
|
16
|
+
readonly trackNamespace: string[]
|
|
17
|
+
readonly trackName: string
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export interface AnnounceState {
|
|
21
|
-
readonly namespace: string[]
|
|
22
|
-
readonly phase: AnnouncePhase
|
|
21
|
+
readonly namespace: string[]
|
|
22
|
+
readonly phase: AnnouncePhase
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export interface PublishState {
|
|
26
|
-
readonly requestId: bigint
|
|
27
|
-
readonly phase: PublishPhase
|
|
26
|
+
readonly requestId: bigint
|
|
27
|
+
readonly phase: PublishPhase
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export interface FetchState {
|
|
31
|
-
readonly requestId: bigint
|
|
32
|
-
readonly phase: FetchPhase
|
|
31
|
+
readonly requestId: bigint
|
|
32
|
+
readonly phase: FetchPhase
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
export
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
export type SessionStateOptionsRole = 'client' | 'server'
|
|
36
|
+
|
|
37
|
+
export interface SessionStateOptions<T extends Draft> {
|
|
38
|
+
codec: { draft: T }
|
|
39
|
+
role: SessionStateOptionsRole
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
export interface SessionState<M
|
|
41
|
-
readonly phase: SessionPhase
|
|
42
|
-
readonly role:
|
|
43
|
-
receive(message: M): TransitionResult<T
|
|
44
|
-
validateOutgoing(message: M): ValidationResult<T
|
|
45
|
-
send(message: M): TransitionResult<T
|
|
46
|
-
readonly subscriptions: ReadonlyMap<bigint, SubscriptionState
|
|
47
|
-
readonly announces: ReadonlyMap<string, AnnounceState
|
|
48
|
-
readonly legalOutgoing: ReadonlySet<T
|
|
49
|
-
readonly legalIncoming: ReadonlySet<T
|
|
50
|
-
reset(): void
|
|
42
|
+
export interface SessionState<M, T extends string> {
|
|
43
|
+
readonly phase: SessionPhase
|
|
44
|
+
readonly role: 'client' | 'server'
|
|
45
|
+
receive(message: M): TransitionResult<T>
|
|
46
|
+
validateOutgoing(message: M): ValidationResult<T>
|
|
47
|
+
send(message: M): TransitionResult<T>
|
|
48
|
+
readonly subscriptions: ReadonlyMap<bigint, SubscriptionState>
|
|
49
|
+
readonly announces: ReadonlyMap<string, AnnounceState>
|
|
50
|
+
readonly legalOutgoing: ReadonlySet<T>
|
|
51
|
+
readonly legalIncoming: ReadonlySet<T>
|
|
52
|
+
reset(): void
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
export type TransitionResult<T extends string
|
|
55
|
+
export type TransitionResult<T extends string> =
|
|
54
56
|
| { ok: true; phase: SessionPhase; sideEffects: SideEffect[] }
|
|
55
|
-
| { ok: false; violation: ProtocolViolation<T> }
|
|
57
|
+
| { ok: false; violation: ProtocolViolation<T> }
|
|
56
58
|
|
|
57
|
-
export type ValidationResult<T extends string
|
|
59
|
+
export type ValidationResult<T extends string> =
|
|
58
60
|
| { ok: true }
|
|
59
|
-
| { ok: false; violation: ProtocolViolation<T> }
|
|
61
|
+
| { ok: false; violation: ProtocolViolation<T> }
|
|
60
62
|
|
|
61
|
-
export interface ProtocolViolation<T extends string
|
|
62
|
-
readonly code: ProtocolViolationCode
|
|
63
|
-
readonly message: string
|
|
64
|
-
readonly currentPhase: SessionPhase
|
|
65
|
-
readonly offendingMessage: T
|
|
63
|
+
export interface ProtocolViolation<T extends string> {
|
|
64
|
+
readonly code: ProtocolViolationCode
|
|
65
|
+
readonly message: string
|
|
66
|
+
readonly currentPhase: SessionPhase
|
|
67
|
+
readonly offendingMessage: T
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
export type ProtocolViolationCode =
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
|
|
|
77
|
-
|
|
|
71
|
+
| 'MESSAGE_BEFORE_SETUP'
|
|
72
|
+
| 'UNEXPECTED_MESSAGE'
|
|
73
|
+
| 'DUPLICATE_SUBSCRIBE_ID'
|
|
74
|
+
| 'UNKNOWN_SUBSCRIBE_ID'
|
|
75
|
+
| 'DUPLICATE_REQUEST_ID'
|
|
76
|
+
| 'UNKNOWN_REQUEST_ID'
|
|
77
|
+
| 'ROLE_VIOLATION'
|
|
78
|
+
| 'STATE_VIOLATION'
|
|
79
|
+
| 'SETUP_VIOLATION'
|
|
78
80
|
|
|
79
81
|
export type SideEffect =
|
|
80
|
-
| { type:
|
|
81
|
-
| { type:
|
|
82
|
-
| { type:
|
|
83
|
-
| { type:
|
|
84
|
-
| { type:
|
|
85
|
-
| { type:
|
|
86
|
-
| { type:
|
|
87
|
-
| { type:
|
|
88
|
-
| { type:
|
|
89
|
-
| { type:
|
|
90
|
-
| { type:
|
|
82
|
+
| { type: 'subscription-activated'; subscribeId: bigint }
|
|
83
|
+
| { type: 'subscription-ended'; subscribeId: bigint; reason: string }
|
|
84
|
+
| { type: 'announce-activated'; namespace: string[] }
|
|
85
|
+
| { type: 'announce-ended'; namespace: string[] }
|
|
86
|
+
| { type: 'publish-activated'; requestId: bigint }
|
|
87
|
+
| { type: 'publish-ended'; requestId: bigint; reason: string }
|
|
88
|
+
| { type: 'fetch-activated'; requestId: bigint }
|
|
89
|
+
| { type: 'fetch-ended'; requestId: bigint; reason: string }
|
|
90
|
+
| { type: 'session-ready' }
|
|
91
|
+
| { type: 'session-draining'; goAwayUri: string }
|
|
92
|
+
| { type: 'session-closed' }
|