@moqtap/codec 0.2.0 → 0.2.2
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/dist/core/buffer-reader.d.ts +15 -0
- package/dist/core/buffer-reader.d.ts.map +1 -0
- package/dist/core/buffer-reader.js +98 -0
- package/dist/core/buffer-reader.js.map +1 -0
- package/dist/core/buffer-writer.d.ts +16 -0
- package/dist/core/buffer-writer.d.ts.map +1 -0
- package/dist/core/buffer-writer.js +86 -0
- package/dist/core/buffer-writer.js.map +1 -0
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +2 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hex.d.ts +5 -0
- package/dist/core/hex.d.ts.map +1 -0
- package/dist/core/hex.js +17 -0
- package/dist/core/hex.js.map +1 -0
- package/dist/core/session-types.d.ts +99 -0
- package/dist/core/session-types.d.ts.map +1 -0
- package/dist/core/session-types.js +2 -0
- package/dist/core/session-types.js.map +1 -0
- package/dist/core/types.d.ts +235 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/drafts/draft07/announce-fsm.d.ts +2 -0
- package/dist/drafts/draft07/announce-fsm.d.ts.map +1 -0
- package/dist/drafts/draft07/announce-fsm.js +2 -0
- package/dist/drafts/draft07/announce-fsm.js.map +1 -0
- package/dist/drafts/draft07/codec.d.ts +17 -0
- package/dist/drafts/draft07/codec.d.ts.map +1 -0
- package/dist/drafts/draft07/codec.js +722 -0
- package/dist/drafts/draft07/codec.js.map +1 -0
- package/dist/drafts/draft07/data-streams.d.ts +9 -0
- package/dist/drafts/draft07/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft07/data-streams.js +228 -0
- package/dist/drafts/draft07/data-streams.js.map +1 -0
- package/dist/drafts/draft07/index.d.ts +14 -0
- package/dist/drafts/draft07/index.d.ts.map +1 -0
- package/dist/drafts/draft07/index.js +18 -0
- package/dist/drafts/draft07/index.js.map +1 -0
- package/dist/drafts/draft07/messages.d.ts +32 -0
- package/dist/drafts/draft07/messages.d.ts.map +1 -0
- package/dist/drafts/draft07/messages.js +42 -0
- package/dist/drafts/draft07/messages.js.map +1 -0
- package/dist/drafts/draft07/parameters.d.ts +4 -0
- package/dist/drafts/draft07/parameters.d.ts.map +1 -0
- package/dist/drafts/draft07/parameters.js +10 -0
- package/dist/drafts/draft07/parameters.js.map +1 -0
- package/dist/drafts/draft07/rules.d.ts +8 -0
- package/dist/drafts/draft07/rules.d.ts.map +1 -0
- package/dist/drafts/draft07/rules.js +95 -0
- package/dist/drafts/draft07/rules.js.map +1 -0
- package/dist/drafts/draft07/session-fsm.d.ts +38 -0
- package/dist/drafts/draft07/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft07/session-fsm.js +354 -0
- package/dist/drafts/draft07/session-fsm.js.map +1 -0
- package/dist/drafts/draft07/session.d.ts +4 -0
- package/dist/drafts/draft07/session.d.ts.map +1 -0
- package/dist/drafts/draft07/session.js +5 -0
- package/dist/drafts/draft07/session.js.map +1 -0
- package/dist/drafts/draft07/subscription-fsm.d.ts +2 -0
- package/dist/drafts/draft07/subscription-fsm.d.ts.map +1 -0
- package/dist/drafts/draft07/subscription-fsm.js +2 -0
- package/dist/drafts/draft07/subscription-fsm.js.map +1 -0
- package/dist/drafts/draft07/types.d.ts +61 -0
- package/dist/drafts/draft07/types.d.ts.map +1 -0
- package/dist/drafts/draft07/types.js +4 -0
- package/dist/drafts/draft07/types.js.map +1 -0
- package/dist/drafts/draft07/varint.d.ts +4 -0
- package/dist/drafts/draft07/varint.d.ts.map +1 -0
- package/dist/drafts/draft07/varint.js +22 -0
- package/dist/drafts/draft07/varint.js.map +1 -0
- package/dist/drafts/draft08/codec.d.ts +29 -0
- package/dist/drafts/draft08/codec.d.ts.map +1 -0
- package/dist/drafts/draft08/codec.js +729 -0
- package/dist/drafts/draft08/codec.js.map +1 -0
- package/dist/drafts/draft08/data-streams.d.ts +12 -0
- package/dist/drafts/draft08/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft08/data-streams.js +345 -0
- package/dist/drafts/draft08/data-streams.js.map +1 -0
- package/dist/drafts/draft08/index.d.ts +9 -0
- package/dist/drafts/draft08/index.d.ts.map +1 -0
- package/dist/drafts/draft08/index.js +7 -0
- package/dist/drafts/draft08/index.js.map +1 -0
- package/dist/drafts/draft08/messages.d.ts +34 -0
- package/dist/drafts/draft08/messages.d.ts.map +1 -0
- package/dist/drafts/draft08/messages.js +66 -0
- package/dist/drafts/draft08/messages.js.map +1 -0
- package/dist/drafts/draft08/rules.d.ts +8 -0
- package/dist/drafts/draft08/rules.d.ts.map +1 -0
- package/dist/drafts/draft08/rules.js +83 -0
- package/dist/drafts/draft08/rules.js.map +1 -0
- package/dist/drafts/draft08/session-fsm.d.ts +47 -0
- package/dist/drafts/draft08/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft08/session-fsm.js +483 -0
- package/dist/drafts/draft08/session-fsm.js.map +1 -0
- package/dist/drafts/draft08/session.d.ts +5 -0
- package/dist/drafts/draft08/session.d.ts.map +1 -0
- package/dist/drafts/draft08/session.js +5 -0
- package/dist/drafts/draft08/session.js.map +1 -0
- package/dist/drafts/draft08/types.d.ts +268 -0
- package/dist/drafts/draft08/types.d.ts.map +1 -0
- package/dist/drafts/draft08/types.js +4 -0
- package/dist/drafts/draft08/types.js.map +1 -0
- package/dist/drafts/draft09/codec.d.ts +21 -0
- package/dist/drafts/draft09/codec.d.ts.map +1 -0
- package/dist/drafts/draft09/codec.js +721 -0
- package/dist/drafts/draft09/codec.js.map +1 -0
- package/dist/drafts/draft09/data-streams.d.ts +12 -0
- package/dist/drafts/draft09/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft09/data-streams.js +307 -0
- package/dist/drafts/draft09/data-streams.js.map +1 -0
- package/dist/drafts/draft09/index.d.ts +9 -0
- package/dist/drafts/draft09/index.d.ts.map +1 -0
- package/dist/drafts/draft09/index.js +7 -0
- package/dist/drafts/draft09/index.js.map +1 -0
- package/dist/drafts/draft09/messages.d.ts +34 -0
- package/dist/drafts/draft09/messages.d.ts.map +1 -0
- package/dist/drafts/draft09/messages.js +66 -0
- package/dist/drafts/draft09/messages.js.map +1 -0
- package/dist/drafts/draft09/rules.d.ts +8 -0
- package/dist/drafts/draft09/rules.d.ts.map +1 -0
- package/dist/drafts/draft09/rules.js +83 -0
- package/dist/drafts/draft09/rules.js.map +1 -0
- package/dist/drafts/draft09/session-fsm.d.ts +47 -0
- package/dist/drafts/draft09/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft09/session-fsm.js +483 -0
- package/dist/drafts/draft09/session-fsm.js.map +1 -0
- package/dist/drafts/draft09/session.d.ts +5 -0
- package/dist/drafts/draft09/session.d.ts.map +1 -0
- package/dist/drafts/draft09/session.js +5 -0
- package/dist/drafts/draft09/session.js.map +1 -0
- package/dist/drafts/draft09/types.d.ts +268 -0
- package/dist/drafts/draft09/types.d.ts.map +1 -0
- package/dist/drafts/draft09/types.js +4 -0
- package/dist/drafts/draft09/types.js.map +1 -0
- package/dist/drafts/draft10/codec.d.ts +21 -0
- package/dist/drafts/draft10/codec.d.ts.map +1 -0
- package/dist/drafts/draft10/codec.js +721 -0
- package/dist/drafts/draft10/codec.js.map +1 -0
- package/dist/drafts/draft10/data-streams.d.ts +12 -0
- package/dist/drafts/draft10/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft10/data-streams.js +307 -0
- package/dist/drafts/draft10/data-streams.js.map +1 -0
- package/dist/drafts/draft10/index.d.ts +9 -0
- package/dist/drafts/draft10/index.d.ts.map +1 -0
- package/dist/drafts/draft10/index.js +7 -0
- package/dist/drafts/draft10/index.js.map +1 -0
- package/dist/drafts/draft10/messages.d.ts +34 -0
- package/dist/drafts/draft10/messages.d.ts.map +1 -0
- package/dist/drafts/draft10/messages.js +66 -0
- package/dist/drafts/draft10/messages.js.map +1 -0
- package/dist/drafts/draft10/rules.d.ts +8 -0
- package/dist/drafts/draft10/rules.d.ts.map +1 -0
- package/dist/drafts/draft10/rules.js +83 -0
- package/dist/drafts/draft10/rules.js.map +1 -0
- package/dist/drafts/draft10/session-fsm.d.ts +47 -0
- package/dist/drafts/draft10/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft10/session-fsm.js +483 -0
- package/dist/drafts/draft10/session-fsm.js.map +1 -0
- package/dist/drafts/draft10/session.d.ts +5 -0
- package/dist/drafts/draft10/session.d.ts.map +1 -0
- package/dist/drafts/draft10/session.js +5 -0
- package/dist/drafts/draft10/session.js.map +1 -0
- package/dist/drafts/draft10/types.d.ts +268 -0
- package/dist/drafts/draft10/types.d.ts.map +1 -0
- package/dist/drafts/draft10/types.js +4 -0
- package/dist/drafts/draft10/types.js.map +1 -0
- package/dist/drafts/draft11/codec.d.ts +25 -0
- package/dist/drafts/draft11/codec.d.ts.map +1 -0
- package/dist/drafts/draft11/codec.js +775 -0
- package/dist/drafts/draft11/codec.js.map +1 -0
- package/dist/drafts/draft11/data-streams.d.ts +10 -0
- package/dist/drafts/draft11/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft11/data-streams.js +253 -0
- package/dist/drafts/draft11/data-streams.js.map +1 -0
- package/dist/drafts/draft11/index.d.ts +9 -0
- package/dist/drafts/draft11/index.d.ts.map +1 -0
- package/dist/drafts/draft11/index.js +7 -0
- package/dist/drafts/draft11/index.js.map +1 -0
- package/dist/drafts/draft11/messages.d.ts +33 -0
- package/dist/drafts/draft11/messages.d.ts.map +1 -0
- package/dist/drafts/draft11/messages.js +65 -0
- package/dist/drafts/draft11/messages.js.map +1 -0
- package/dist/drafts/draft11/rules.d.ts +8 -0
- package/dist/drafts/draft11/rules.d.ts.map +1 -0
- package/dist/drafts/draft11/rules.js +88 -0
- package/dist/drafts/draft11/rules.js.map +1 -0
- package/dist/drafts/draft11/session-fsm.d.ts +52 -0
- package/dist/drafts/draft11/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft11/session-fsm.js +530 -0
- package/dist/drafts/draft11/session-fsm.js.map +1 -0
- package/dist/drafts/draft11/session.d.ts +5 -0
- package/dist/drafts/draft11/session.d.ts.map +1 -0
- package/dist/drafts/draft11/session.js +5 -0
- package/dist/drafts/draft11/session.js.map +1 -0
- package/dist/drafts/draft11/types.d.ts +266 -0
- package/dist/drafts/draft11/types.d.ts.map +1 -0
- package/dist/drafts/draft11/types.js +4 -0
- package/dist/drafts/draft11/types.js.map +1 -0
- package/dist/drafts/draft12/codec.d.ts +27 -0
- package/dist/drafts/draft12/codec.d.ts.map +1 -0
- package/dist/drafts/draft12/codec.js +918 -0
- package/dist/drafts/draft12/codec.js.map +1 -0
- package/dist/drafts/draft12/data-streams.d.ts +10 -0
- package/dist/drafts/draft12/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft12/data-streams.js +254 -0
- package/dist/drafts/draft12/data-streams.js.map +1 -0
- package/dist/drafts/draft12/index.d.ts +9 -0
- package/dist/drafts/draft12/index.d.ts.map +1 -0
- package/dist/drafts/draft12/index.js +7 -0
- package/dist/drafts/draft12/index.js.map +1 -0
- package/dist/drafts/draft12/messages.d.ts +37 -0
- package/dist/drafts/draft12/messages.d.ts.map +1 -0
- package/dist/drafts/draft12/messages.js +77 -0
- package/dist/drafts/draft12/messages.js.map +1 -0
- package/dist/drafts/draft12/rules.d.ts +8 -0
- package/dist/drafts/draft12/rules.d.ts.map +1 -0
- package/dist/drafts/draft12/rules.js +94 -0
- package/dist/drafts/draft12/rules.js.map +1 -0
- package/dist/drafts/draft12/session-fsm.d.ts +55 -0
- package/dist/drafts/draft12/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft12/session-fsm.js +569 -0
- package/dist/drafts/draft12/session-fsm.js.map +1 -0
- package/dist/drafts/draft12/session.d.ts +5 -0
- package/dist/drafts/draft12/session.d.ts.map +1 -0
- package/dist/drafts/draft12/session.js +5 -0
- package/dist/drafts/draft12/session.js.map +1 -0
- package/dist/drafts/draft12/types.d.ts +294 -0
- package/dist/drafts/draft12/types.d.ts.map +1 -0
- package/dist/drafts/draft12/types.js +4 -0
- package/dist/drafts/draft12/types.js.map +1 -0
- package/dist/drafts/draft13/codec.d.ts +27 -0
- package/dist/drafts/draft13/codec.d.ts.map +1 -0
- package/dist/drafts/draft13/codec.js +1000 -0
- package/dist/drafts/draft13/codec.js.map +1 -0
- package/dist/drafts/draft13/data-streams.d.ts +10 -0
- package/dist/drafts/draft13/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft13/data-streams.js +254 -0
- package/dist/drafts/draft13/data-streams.js.map +1 -0
- package/dist/drafts/draft13/index.d.ts +9 -0
- package/dist/drafts/draft13/index.d.ts.map +1 -0
- package/dist/drafts/draft13/index.js +7 -0
- package/dist/drafts/draft13/index.js.map +1 -0
- package/dist/drafts/draft13/messages.d.ts +38 -0
- package/dist/drafts/draft13/messages.d.ts.map +1 -0
- package/dist/drafts/draft13/messages.js +79 -0
- package/dist/drafts/draft13/messages.js.map +1 -0
- package/dist/drafts/draft13/rules.d.ts +8 -0
- package/dist/drafts/draft13/rules.d.ts.map +1 -0
- package/dist/drafts/draft13/rules.js +96 -0
- package/dist/drafts/draft13/rules.js.map +1 -0
- package/dist/drafts/draft13/session-fsm.d.ts +56 -0
- package/dist/drafts/draft13/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft13/session-fsm.js +581 -0
- package/dist/drafts/draft13/session-fsm.js.map +1 -0
- package/dist/drafts/draft13/session.d.ts +5 -0
- package/dist/drafts/draft13/session.d.ts.map +1 -0
- package/dist/drafts/draft13/session.js +5 -0
- package/dist/drafts/draft13/session.js.map +1 -0
- package/dist/drafts/draft13/types.d.ts +310 -0
- package/dist/drafts/draft13/types.d.ts.map +1 -0
- package/dist/drafts/draft13/types.js +4 -0
- package/dist/drafts/draft13/types.js.map +1 -0
- package/dist/drafts/draft14/codec.d.ts +34 -0
- package/dist/drafts/draft14/codec.d.ts.map +1 -0
- package/dist/drafts/draft14/codec.js +752 -0
- package/dist/drafts/draft14/codec.js.map +1 -0
- package/dist/drafts/draft14/data-streams.d.ts +56 -0
- package/dist/drafts/draft14/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft14/data-streams.js +729 -0
- package/dist/drafts/draft14/data-streams.js.map +1 -0
- package/dist/drafts/draft14/index.d.ts +9 -0
- package/dist/drafts/draft14/index.d.ts.map +1 -0
- package/dist/drafts/draft14/index.js +7 -0
- package/dist/drafts/draft14/index.js.map +1 -0
- package/dist/drafts/draft14/messages.d.ts +36 -0
- package/dist/drafts/draft14/messages.d.ts.map +1 -0
- package/dist/drafts/draft14/messages.js +71 -0
- package/dist/drafts/draft14/messages.js.map +1 -0
- package/dist/drafts/draft14/rules.d.ts +8 -0
- package/dist/drafts/draft14/rules.d.ts.map +1 -0
- package/dist/drafts/draft14/rules.js +101 -0
- package/dist/drafts/draft14/rules.js.map +1 -0
- package/dist/drafts/draft14/session-fsm.d.ts +58 -0
- package/dist/drafts/draft14/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft14/session-fsm.js +648 -0
- package/dist/drafts/draft14/session-fsm.js.map +1 -0
- package/dist/drafts/draft14/session.d.ts +5 -0
- package/dist/drafts/draft14/session.d.ts.map +1 -0
- package/dist/drafts/draft14/session.js +5 -0
- package/dist/drafts/draft14/session.js.map +1 -0
- package/dist/drafts/draft14/types.d.ts +263 -0
- package/dist/drafts/draft14/types.d.ts.map +1 -0
- package/dist/drafts/draft14/types.js +4 -0
- package/dist/drafts/draft14/types.js.map +1 -0
- package/dist/drafts/draft15/codec.d.ts +33 -0
- package/dist/drafts/draft15/codec.d.ts.map +1 -0
- package/dist/drafts/draft15/codec.js +742 -0
- package/dist/drafts/draft15/codec.js.map +1 -0
- package/dist/drafts/draft15/data-streams.d.ts +45 -0
- package/dist/drafts/draft15/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft15/data-streams.js +675 -0
- package/dist/drafts/draft15/data-streams.js.map +1 -0
- package/dist/drafts/draft15/index.d.ts +9 -0
- package/dist/drafts/draft15/index.d.ts.map +1 -0
- package/dist/drafts/draft15/index.js +7 -0
- package/dist/drafts/draft15/index.js.map +1 -0
- package/dist/drafts/draft15/messages.d.ts +31 -0
- package/dist/drafts/draft15/messages.d.ts.map +1 -0
- package/dist/drafts/draft15/messages.js +59 -0
- package/dist/drafts/draft15/messages.js.map +1 -0
- package/dist/drafts/draft15/rules.d.ts +8 -0
- package/dist/drafts/draft15/rules.d.ts.map +1 -0
- package/dist/drafts/draft15/rules.js +83 -0
- package/dist/drafts/draft15/rules.js.map +1 -0
- package/dist/drafts/draft15/session-fsm.d.ts +48 -0
- package/dist/drafts/draft15/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft15/session-fsm.js +479 -0
- package/dist/drafts/draft15/session-fsm.js.map +1 -0
- package/dist/drafts/draft15/session.d.ts +5 -0
- package/dist/drafts/draft15/session.d.ts.map +1 -0
- package/dist/drafts/draft15/session.js +5 -0
- package/dist/drafts/draft15/session.js.map +1 -0
- package/dist/drafts/draft15/types.d.ts +232 -0
- package/dist/drafts/draft15/types.d.ts.map +1 -0
- package/dist/drafts/draft15/types.js +4 -0
- package/dist/drafts/draft15/types.js.map +1 -0
- package/dist/drafts/draft16/codec.d.ts +29 -0
- package/dist/drafts/draft16/codec.d.ts.map +1 -0
- package/dist/drafts/draft16/codec.js +747 -0
- package/dist/drafts/draft16/codec.js.map +1 -0
- package/dist/drafts/draft16/data-streams.d.ts +34 -0
- package/dist/drafts/draft16/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft16/data-streams.js +667 -0
- package/dist/drafts/draft16/data-streams.js.map +1 -0
- package/dist/drafts/draft16/index.d.ts +9 -0
- package/dist/drafts/draft16/index.d.ts.map +1 -0
- package/dist/drafts/draft16/index.js +7 -0
- package/dist/drafts/draft16/index.js.map +1 -0
- package/dist/drafts/draft16/messages.d.ts +32 -0
- package/dist/drafts/draft16/messages.d.ts.map +1 -0
- package/dist/drafts/draft16/messages.js +62 -0
- package/dist/drafts/draft16/messages.js.map +1 -0
- package/dist/drafts/draft16/rules.d.ts +8 -0
- package/dist/drafts/draft16/rules.d.ts.map +1 -0
- package/dist/drafts/draft16/rules.js +84 -0
- package/dist/drafts/draft16/rules.js.map +1 -0
- package/dist/drafts/draft16/session-fsm.d.ts +48 -0
- package/dist/drafts/draft16/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft16/session-fsm.js +474 -0
- package/dist/drafts/draft16/session-fsm.js.map +1 -0
- package/dist/drafts/draft16/session.d.ts +5 -0
- package/dist/drafts/draft16/session.d.ts.map +1 -0
- package/dist/drafts/draft16/session.js +5 -0
- package/dist/drafts/draft16/session.js.map +1 -0
- package/dist/drafts/draft16/types.d.ts +238 -0
- package/dist/drafts/draft16/types.d.ts.map +1 -0
- package/dist/drafts/draft16/types.js +4 -0
- package/dist/drafts/draft16/types.js.map +1 -0
- package/dist/drafts/draft17/codec.d.ts +29 -0
- package/dist/drafts/draft17/codec.d.ts.map +1 -0
- package/dist/drafts/draft17/codec.js +799 -0
- package/dist/drafts/draft17/codec.js.map +1 -0
- package/dist/drafts/draft17/data-streams.d.ts +13 -0
- package/dist/drafts/draft17/data-streams.d.ts.map +1 -0
- package/dist/drafts/draft17/data-streams.js +633 -0
- package/dist/drafts/draft17/data-streams.js.map +1 -0
- package/dist/drafts/draft17/index.d.ts +8 -0
- package/dist/drafts/draft17/index.d.ts.map +1 -0
- package/dist/drafts/draft17/index.js +6 -0
- package/dist/drafts/draft17/index.js.map +1 -0
- package/dist/drafts/draft17/messages.d.ts +25 -0
- package/dist/drafts/draft17/messages.d.ts.map +1 -0
- package/dist/drafts/draft17/messages.js +48 -0
- package/dist/drafts/draft17/messages.js.map +1 -0
- package/dist/drafts/draft17/rules.d.ts +8 -0
- package/dist/drafts/draft17/rules.d.ts.map +1 -0
- package/dist/drafts/draft17/rules.js +71 -0
- package/dist/drafts/draft17/rules.js.map +1 -0
- package/dist/drafts/draft17/session-fsm.d.ts +45 -0
- package/dist/drafts/draft17/session-fsm.d.ts.map +1 -0
- package/dist/drafts/draft17/session-fsm.js +328 -0
- package/dist/drafts/draft17/session-fsm.js.map +1 -0
- package/dist/drafts/draft17/session.d.ts +5 -0
- package/dist/drafts/draft17/session.d.ts.map +1 -0
- package/dist/drafts/draft17/session.js +6 -0
- package/dist/drafts/draft17/session.js.map +1 -0
- package/dist/drafts/draft17/types.d.ts +219 -0
- package/dist/drafts/draft17/types.d.ts.map +1 -0
- package/dist/drafts/draft17/types.js +3 -0
- package/dist/drafts/draft17/types.js.map +1 -0
- package/dist/index.d.ts +46 -38
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -110
- package/dist/index.js.map +1 -0
- package/dist/session.d.ts +4 -8
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +32 -26
- package/dist/session.js.map +1 -0
- package/package.json +2 -2
- package/src/core/buffer-reader.ts +1 -1
- package/src/core/hex.ts +17 -0
- package/src/drafts/draft07/codec.ts +933 -991
- package/src/drafts/draft07/data-streams.ts +240 -0
- package/src/drafts/draft07/index.ts +89 -69
- package/src/drafts/draft07/messages.ts +42 -44
- package/src/drafts/draft07/rules.ts +101 -104
- package/src/drafts/draft07/types.ts +72 -0
- package/src/drafts/draft08/codec.ts +944 -1254
- package/src/drafts/draft08/data-streams.ts +359 -0
- package/src/drafts/draft08/types.ts +384 -377
- package/src/drafts/draft09/codec.ts +936 -1235
- package/src/drafts/draft09/data-streams.ts +332 -0
- package/src/drafts/draft09/types.ts +384 -376
- package/src/drafts/draft10/codec.ts +936 -1235
- package/src/drafts/draft10/data-streams.ts +332 -0
- package/src/drafts/draft10/types.ts +384 -376
- package/src/drafts/draft11/codec.ts +979 -1198
- package/src/drafts/draft11/data-streams.ts +269 -0
- package/src/drafts/draft11/types.ts +381 -375
- package/src/drafts/draft12/codec.ts +1113 -1354
- package/src/drafts/draft12/data-streams.ts +275 -0
- package/src/drafts/draft12/types.ts +419 -414
- package/src/drafts/draft13/codec.ts +1197 -1438
- package/src/drafts/draft13/data-streams.ts +275 -0
- package/src/drafts/draft13/types.ts +438 -433
- package/src/drafts/draft14/codec.ts +1034 -1480
- package/src/drafts/draft14/data-streams.ts +798 -0
- package/src/drafts/draft14/types.ts +381 -365
- package/src/drafts/draft15/codec.ts +969 -1661
- package/src/drafts/draft15/data-streams.ts +778 -0
- package/src/drafts/draft15/types.ts +339 -336
- package/src/drafts/draft16/codec.ts +957 -1623
- package/src/drafts/draft16/data-streams.ts +773 -0
- package/src/drafts/draft16/types.ts +357 -354
- package/src/drafts/draft17/codec.ts +962 -1621
- package/src/drafts/draft17/data-streams.ts +742 -0
- package/src/drafts/draft17/types.ts +313 -310
|
@@ -1,1480 +1,1034 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
result.
|
|
132
|
-
} else {
|
|
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
|
-
w
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
msg
|
|
181
|
-
|
|
182
|
-
)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
w
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
w
|
|
195
|
-
|
|
196
|
-
w.writeVarInt(msg.
|
|
197
|
-
w.writeVarInt(msg.
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
)
|
|
213
|
-
w.writeVarInt(msg.
|
|
214
|
-
w.writeVarInt(msg.
|
|
215
|
-
w.writeVarInt(msg.
|
|
216
|
-
w.
|
|
217
|
-
w.writeVarInt(msg.
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
msg
|
|
227
|
-
w
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
w
|
|
233
|
-
|
|
234
|
-
w.writeVarInt(msg.
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
msg
|
|
240
|
-
w
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
w
|
|
250
|
-
)
|
|
251
|
-
w.writeVarInt(msg.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
w
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
w
|
|
267
|
-
|
|
268
|
-
w.writeVarInt(msg.
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
w.writeVarInt(msg.
|
|
278
|
-
w.
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
w.writeVarInt(msg.
|
|
287
|
-
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
function
|
|
291
|
-
msg: Draft14Message & { type: "
|
|
292
|
-
w: BufferWriter,
|
|
293
|
-
): void {
|
|
294
|
-
w.writeVarInt(msg.request_id);
|
|
295
|
-
w.
|
|
296
|
-
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
function
|
|
300
|
-
msg: Draft14Message & { type: "
|
|
301
|
-
w: BufferWriter,
|
|
302
|
-
): void {
|
|
303
|
-
w.writeVarInt(msg.request_id);
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
w.writeVarInt(msg.
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
)
|
|
320
|
-
w.
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
)
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
function
|
|
333
|
-
msg: Draft14Message & { type: "
|
|
334
|
-
w: BufferWriter,
|
|
335
|
-
): void {
|
|
336
|
-
w.writeVarInt(msg.request_id);
|
|
337
|
-
w.
|
|
338
|
-
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
function
|
|
342
|
-
msg: Draft14Message & { type: "
|
|
343
|
-
w: BufferWriter,
|
|
344
|
-
): void {
|
|
345
|
-
w.writeVarInt(msg.request_id);
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
msg
|
|
351
|
-
w
|
|
352
|
-
)
|
|
353
|
-
w.writeVarInt(msg.
|
|
354
|
-
w.writeVarInt(msg.
|
|
355
|
-
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
function
|
|
359
|
-
msg
|
|
360
|
-
w
|
|
361
|
-
)
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
function
|
|
366
|
-
|
|
367
|
-
w
|
|
368
|
-
|
|
369
|
-
w.writeVarInt(msg.
|
|
370
|
-
w.writeVarInt(msg.
|
|
371
|
-
w.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
w
|
|
377
|
-
|
|
378
|
-
w.writeVarInt(msg.
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
)
|
|
386
|
-
w.
|
|
387
|
-
w.
|
|
388
|
-
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
function
|
|
392
|
-
msg: Draft14Message & { type: "
|
|
393
|
-
w: BufferWriter,
|
|
394
|
-
): void {
|
|
395
|
-
w.writeVarInt(msg.request_id);
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
msg
|
|
410
|
-
w
|
|
411
|
-
)
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
w
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
)
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
function
|
|
452
|
-
const
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
const
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
const
|
|
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
|
-
if (
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
const
|
|
537
|
-
|
|
538
|
-
const
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
const
|
|
557
|
-
const
|
|
558
|
-
const
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
const
|
|
581
|
-
return { type: "
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
function
|
|
585
|
-
const request_id = r.readVarInt();
|
|
586
|
-
const
|
|
587
|
-
const
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
const
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
const
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
const
|
|
639
|
-
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
const
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
const
|
|
662
|
-
const
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
const
|
|
677
|
-
const
|
|
678
|
-
const
|
|
679
|
-
const parameters = decodeParams(r);
|
|
680
|
-
return {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
const
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
const parameters = decodeParams(r);
|
|
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
|
-
function
|
|
745
|
-
const request_id = r.readVarInt();
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
[
|
|
770
|
-
[
|
|
771
|
-
[
|
|
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
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
const payloadLength = Number(r.readVarInt());
|
|
1036
|
-
const payload = r.readBytes(payloadLength);
|
|
1037
|
-
return {
|
|
1038
|
-
ok: true,
|
|
1039
|
-
value: { type: "datagram", trackAlias, groupId, objectId, payloadLength, payload },
|
|
1040
|
-
bytesRead: r.offset,
|
|
1041
|
-
};
|
|
1042
|
-
} catch (e) {
|
|
1043
|
-
if (e instanceof DecodeError) return { ok: false, error: e };
|
|
1044
|
-
throw e;
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
/**
|
|
1049
|
-
* Decode a fetch data stream from raw bytes.
|
|
1050
|
-
*/
|
|
1051
|
-
export function decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream> {
|
|
1052
|
-
try {
|
|
1053
|
-
const r = new BufferReader(bytes);
|
|
1054
|
-
const streamType = r.readVarInt();
|
|
1055
|
-
if (streamType !== 2n) {
|
|
1056
|
-
return {
|
|
1057
|
-
ok: false,
|
|
1058
|
-
error: new DecodeError(
|
|
1059
|
-
"CONSTRAINT_VIOLATION",
|
|
1060
|
-
`Expected fetch stream type 2, got ${streamType}`,
|
|
1061
|
-
0,
|
|
1062
|
-
),
|
|
1063
|
-
};
|
|
1064
|
-
}
|
|
1065
|
-
const subscribeRequestId = r.readVarInt();
|
|
1066
|
-
const objects: ObjectPayload[] = [];
|
|
1067
|
-
while (r.remaining > 0) {
|
|
1068
|
-
const objectId = r.readVarInt();
|
|
1069
|
-
const payloadLength = Number(r.readVarInt());
|
|
1070
|
-
const payload = r.readBytes(payloadLength);
|
|
1071
|
-
objects.push({ type: "object", objectId, payloadLength, payload });
|
|
1072
|
-
}
|
|
1073
|
-
return {
|
|
1074
|
-
ok: true,
|
|
1075
|
-
value: { type: "fetch", subscribeRequestId, objects },
|
|
1076
|
-
bytesRead: r.offset,
|
|
1077
|
-
};
|
|
1078
|
-
} catch (e) {
|
|
1079
|
-
if (e instanceof DecodeError) return { ok: false, error: e };
|
|
1080
|
-
throw e;
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
|
|
1084
|
-
/**
|
|
1085
|
-
* Decode a data stream, dispatching by stream type.
|
|
1086
|
-
*/
|
|
1087
|
-
export function decodeDataStream(
|
|
1088
|
-
streamType: "subgroup" | "datagram" | "fetch",
|
|
1089
|
-
bytes: Uint8Array,
|
|
1090
|
-
): DecodeResult<Draft14DataStream> {
|
|
1091
|
-
switch (streamType) {
|
|
1092
|
-
case "subgroup":
|
|
1093
|
-
return decodeSubgroupStream(bytes);
|
|
1094
|
-
case "datagram":
|
|
1095
|
-
return decodeDatagram(bytes);
|
|
1096
|
-
case "fetch":
|
|
1097
|
-
return decodeFetchStream(bytes);
|
|
1098
|
-
default: {
|
|
1099
|
-
const _exhaustive: never = streamType;
|
|
1100
|
-
throw new Error(`Unknown stream type: ${_exhaustive}`);
|
|
1101
|
-
}
|
|
1102
|
-
}
|
|
1103
|
-
}
|
|
1104
|
-
|
|
1105
|
-
// ─── Stream Decoders ───────────────────────────────────────────────────────────
|
|
1106
|
-
|
|
1107
|
-
/**
|
|
1108
|
-
* Create a TransformStream that decodes a continuous byte stream (e.g. the
|
|
1109
|
-
* WebTransport bidirectional control stream) into individual Draft14Message
|
|
1110
|
-
* objects. Uses the varint(type) + uint16_BE(length) + payload framing.
|
|
1111
|
-
*/
|
|
1112
|
-
export function createStreamDecoder(): TransformStream<Uint8Array, Draft14Message> {
|
|
1113
|
-
let buffer = new Uint8Array(0);
|
|
1114
|
-
|
|
1115
|
-
return new TransformStream<Uint8Array, Draft14Message>({
|
|
1116
|
-
transform(chunk, controller) {
|
|
1117
|
-
// Accumulate incoming data
|
|
1118
|
-
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
1119
|
-
newBuffer.set(buffer, 0);
|
|
1120
|
-
newBuffer.set(chunk, buffer.length);
|
|
1121
|
-
buffer = newBuffer;
|
|
1122
|
-
|
|
1123
|
-
// Try to decode messages from the buffer
|
|
1124
|
-
while (buffer.length > 0) {
|
|
1125
|
-
const result = decodeMessage(buffer);
|
|
1126
|
-
if (!result.ok) {
|
|
1127
|
-
if (result.error.code === "UNEXPECTED_END") {
|
|
1128
|
-
// Need more data -- wait for next chunk
|
|
1129
|
-
break;
|
|
1130
|
-
}
|
|
1131
|
-
// Fatal decode error
|
|
1132
|
-
controller.error(result.error);
|
|
1133
|
-
return;
|
|
1134
|
-
}
|
|
1135
|
-
controller.enqueue(result.value);
|
|
1136
|
-
// Advance the buffer past the consumed bytes
|
|
1137
|
-
buffer = buffer.slice(result.bytesRead);
|
|
1138
|
-
}
|
|
1139
|
-
},
|
|
1140
|
-
|
|
1141
|
-
flush(controller) {
|
|
1142
|
-
// If there is remaining data in the buffer, it is a truncated message
|
|
1143
|
-
if (buffer.length > 0) {
|
|
1144
|
-
controller.error(
|
|
1145
|
-
new DecodeError("UNEXPECTED_END", "Stream ended with incomplete message data", 0),
|
|
1146
|
-
);
|
|
1147
|
-
}
|
|
1148
|
-
},
|
|
1149
|
-
});
|
|
1150
|
-
}
|
|
1151
|
-
|
|
1152
|
-
/**
|
|
1153
|
-
* Create a TransformStream that decodes a subgroup data stream.
|
|
1154
|
-
* First emits a SubgroupStreamHeader, then emits ObjectPayload events.
|
|
1155
|
-
*
|
|
1156
|
-
* Subgroup stream framing:
|
|
1157
|
-
* varint(0x00) + varint(trackAlias) + varint(groupId) + varint(subgroupId)
|
|
1158
|
-
* + uint8(publisherPriority) + [varint(objectId) + varint(payloadLength) + bytes(payload)]*
|
|
1159
|
-
*/
|
|
1160
|
-
export function createSubgroupStreamDecoder(): TransformStream<
|
|
1161
|
-
Uint8Array,
|
|
1162
|
-
SubgroupStreamHeader | ObjectPayload
|
|
1163
|
-
> {
|
|
1164
|
-
let buffer = new Uint8Array(0);
|
|
1165
|
-
let headerEmitted = false;
|
|
1166
|
-
|
|
1167
|
-
return new TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>({
|
|
1168
|
-
transform(chunk, controller) {
|
|
1169
|
-
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
1170
|
-
newBuffer.set(buffer, 0);
|
|
1171
|
-
newBuffer.set(chunk, buffer.length);
|
|
1172
|
-
buffer = newBuffer;
|
|
1173
|
-
|
|
1174
|
-
// First, parse the header if not yet emitted
|
|
1175
|
-
if (!headerEmitted) {
|
|
1176
|
-
try {
|
|
1177
|
-
const r = new BufferReader(buffer);
|
|
1178
|
-
const streamType = r.readVarInt();
|
|
1179
|
-
if (streamType !== 0n) {
|
|
1180
|
-
controller.error(
|
|
1181
|
-
new DecodeError(
|
|
1182
|
-
"CONSTRAINT_VIOLATION",
|
|
1183
|
-
`Expected subgroup stream type 0, got ${streamType}`,
|
|
1184
|
-
0,
|
|
1185
|
-
),
|
|
1186
|
-
);
|
|
1187
|
-
return;
|
|
1188
|
-
}
|
|
1189
|
-
const trackAlias = r.readVarInt();
|
|
1190
|
-
const groupId = r.readVarInt();
|
|
1191
|
-
const subgroupId = r.readVarInt();
|
|
1192
|
-
const publisherPriority = r.readUint8();
|
|
1193
|
-
|
|
1194
|
-
controller.enqueue({
|
|
1195
|
-
type: "subgroup_header",
|
|
1196
|
-
trackAlias,
|
|
1197
|
-
groupId,
|
|
1198
|
-
subgroupId,
|
|
1199
|
-
publisherPriority,
|
|
1200
|
-
});
|
|
1201
|
-
headerEmitted = true;
|
|
1202
|
-
buffer = buffer.slice(r.offset);
|
|
1203
|
-
} catch (e) {
|
|
1204
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1205
|
-
return; // Need more data
|
|
1206
|
-
}
|
|
1207
|
-
controller.error(e);
|
|
1208
|
-
return;
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
// Parse objects
|
|
1213
|
-
while (buffer.length > 0) {
|
|
1214
|
-
try {
|
|
1215
|
-
const r = new BufferReader(buffer);
|
|
1216
|
-
const objectId = r.readVarInt();
|
|
1217
|
-
const payloadLength = Number(r.readVarInt());
|
|
1218
|
-
const payload = r.readBytes(payloadLength);
|
|
1219
|
-
controller.enqueue({ type: "object", objectId, payloadLength, payload });
|
|
1220
|
-
buffer = buffer.slice(r.offset);
|
|
1221
|
-
} catch (e) {
|
|
1222
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1223
|
-
break; // Need more data
|
|
1224
|
-
}
|
|
1225
|
-
controller.error(e);
|
|
1226
|
-
return;
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
},
|
|
1230
|
-
|
|
1231
|
-
flush(controller) {
|
|
1232
|
-
if (buffer.length > 0) {
|
|
1233
|
-
controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
|
|
1234
|
-
}
|
|
1235
|
-
},
|
|
1236
|
-
});
|
|
1237
|
-
}
|
|
1238
|
-
|
|
1239
|
-
/**
|
|
1240
|
-
* Create a TransformStream that decodes a fetch data stream.
|
|
1241
|
-
* First emits a FetchStreamHeader, then emits ObjectPayload events.
|
|
1242
|
-
*
|
|
1243
|
-
* Fetch stream framing:
|
|
1244
|
-
* varint(0x02) + varint(subscribeRequestId)
|
|
1245
|
-
* + [varint(objectId) + varint(payloadLength) + bytes(payload)]*
|
|
1246
|
-
*/
|
|
1247
|
-
export function createFetchStreamDecoder(): TransformStream<
|
|
1248
|
-
Uint8Array,
|
|
1249
|
-
FetchStreamHeader | ObjectPayload
|
|
1250
|
-
> {
|
|
1251
|
-
let buffer = new Uint8Array(0);
|
|
1252
|
-
let headerEmitted = false;
|
|
1253
|
-
|
|
1254
|
-
return new TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>({
|
|
1255
|
-
transform(chunk, controller) {
|
|
1256
|
-
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
1257
|
-
newBuffer.set(buffer, 0);
|
|
1258
|
-
newBuffer.set(chunk, buffer.length);
|
|
1259
|
-
buffer = newBuffer;
|
|
1260
|
-
|
|
1261
|
-
// First, parse the header if not yet emitted
|
|
1262
|
-
if (!headerEmitted) {
|
|
1263
|
-
try {
|
|
1264
|
-
const r = new BufferReader(buffer);
|
|
1265
|
-
const streamType = r.readVarInt();
|
|
1266
|
-
if (streamType !== 2n) {
|
|
1267
|
-
controller.error(
|
|
1268
|
-
new DecodeError(
|
|
1269
|
-
"CONSTRAINT_VIOLATION",
|
|
1270
|
-
`Expected fetch stream type 2, got ${streamType}`,
|
|
1271
|
-
0,
|
|
1272
|
-
),
|
|
1273
|
-
);
|
|
1274
|
-
return;
|
|
1275
|
-
}
|
|
1276
|
-
const subscribeRequestId = r.readVarInt();
|
|
1277
|
-
|
|
1278
|
-
controller.enqueue({
|
|
1279
|
-
type: "fetch_header",
|
|
1280
|
-
subscribeRequestId,
|
|
1281
|
-
});
|
|
1282
|
-
headerEmitted = true;
|
|
1283
|
-
buffer = buffer.slice(r.offset);
|
|
1284
|
-
} catch (e) {
|
|
1285
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1286
|
-
return; // Need more data
|
|
1287
|
-
}
|
|
1288
|
-
controller.error(e);
|
|
1289
|
-
return;
|
|
1290
|
-
}
|
|
1291
|
-
}
|
|
1292
|
-
|
|
1293
|
-
// Parse objects
|
|
1294
|
-
while (buffer.length > 0) {
|
|
1295
|
-
try {
|
|
1296
|
-
const r = new BufferReader(buffer);
|
|
1297
|
-
const objectId = r.readVarInt();
|
|
1298
|
-
const payloadLength = Number(r.readVarInt());
|
|
1299
|
-
const payload = r.readBytes(payloadLength);
|
|
1300
|
-
controller.enqueue({ type: "object", objectId, payloadLength, payload });
|
|
1301
|
-
buffer = buffer.slice(r.offset);
|
|
1302
|
-
} catch (e) {
|
|
1303
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1304
|
-
break; // Need more data
|
|
1305
|
-
}
|
|
1306
|
-
controller.error(e);
|
|
1307
|
-
return;
|
|
1308
|
-
}
|
|
1309
|
-
}
|
|
1310
|
-
},
|
|
1311
|
-
|
|
1312
|
-
flush(controller) {
|
|
1313
|
-
if (buffer.length > 0) {
|
|
1314
|
-
controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
|
|
1315
|
-
}
|
|
1316
|
-
},
|
|
1317
|
-
});
|
|
1318
|
-
}
|
|
1319
|
-
|
|
1320
|
-
/**
|
|
1321
|
-
* Create a unified auto-detecting data stream decoder.
|
|
1322
|
-
* Reads the stream type varint from the first bytes, then delegates to
|
|
1323
|
-
* the appropriate decoder (subgroup or fetch).
|
|
1324
|
-
*/
|
|
1325
|
-
export function createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent> {
|
|
1326
|
-
let buffer = new Uint8Array(0);
|
|
1327
|
-
let detectedType: "subgroup" | "fetch" | null = null;
|
|
1328
|
-
let headerEmitted = false;
|
|
1329
|
-
|
|
1330
|
-
// We peek the stream type then create the appropriate inner decoder,
|
|
1331
|
-
// forwarding all remaining data through it. To avoid complexity of
|
|
1332
|
-
// piping inner TransformStreams we just inline the same logic.
|
|
1333
|
-
|
|
1334
|
-
return new TransformStream<Uint8Array, DataStreamEvent>({
|
|
1335
|
-
transform(chunk, controller) {
|
|
1336
|
-
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
1337
|
-
newBuffer.set(buffer, 0);
|
|
1338
|
-
newBuffer.set(chunk, buffer.length);
|
|
1339
|
-
buffer = newBuffer;
|
|
1340
|
-
|
|
1341
|
-
// Detect stream type if not yet done
|
|
1342
|
-
if (detectedType === null) {
|
|
1343
|
-
try {
|
|
1344
|
-
const r = new BufferReader(buffer);
|
|
1345
|
-
const streamType = r.readVarInt();
|
|
1346
|
-
if (streamType === 0n) {
|
|
1347
|
-
detectedType = "subgroup";
|
|
1348
|
-
} else if (streamType === 2n) {
|
|
1349
|
-
detectedType = "fetch";
|
|
1350
|
-
} else {
|
|
1351
|
-
controller.error(
|
|
1352
|
-
new DecodeError("CONSTRAINT_VIOLATION", `Unknown data stream type: ${streamType}`, 0),
|
|
1353
|
-
);
|
|
1354
|
-
return;
|
|
1355
|
-
}
|
|
1356
|
-
// Do NOT advance buffer - the inner header parser expects the stream type
|
|
1357
|
-
} catch (e) {
|
|
1358
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1359
|
-
return; // Need more data
|
|
1360
|
-
}
|
|
1361
|
-
controller.error(e);
|
|
1362
|
-
return;
|
|
1363
|
-
}
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
if (detectedType === "subgroup") {
|
|
1367
|
-
// Parse subgroup header if not yet emitted
|
|
1368
|
-
if (!headerEmitted) {
|
|
1369
|
-
try {
|
|
1370
|
-
const r = new BufferReader(buffer);
|
|
1371
|
-
r.readVarInt(); // stream type (0x00)
|
|
1372
|
-
const trackAlias = r.readVarInt();
|
|
1373
|
-
const groupId = r.readVarInt();
|
|
1374
|
-
const subgroupId = r.readVarInt();
|
|
1375
|
-
const publisherPriority = r.readUint8();
|
|
1376
|
-
controller.enqueue({
|
|
1377
|
-
type: "subgroup_header",
|
|
1378
|
-
trackAlias,
|
|
1379
|
-
groupId,
|
|
1380
|
-
subgroupId,
|
|
1381
|
-
publisherPriority,
|
|
1382
|
-
});
|
|
1383
|
-
headerEmitted = true;
|
|
1384
|
-
buffer = buffer.slice(r.offset);
|
|
1385
|
-
} catch (e) {
|
|
1386
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1387
|
-
return;
|
|
1388
|
-
}
|
|
1389
|
-
controller.error(e);
|
|
1390
|
-
return;
|
|
1391
|
-
}
|
|
1392
|
-
}
|
|
1393
|
-
} else {
|
|
1394
|
-
// Parse fetch header if not yet emitted
|
|
1395
|
-
if (!headerEmitted) {
|
|
1396
|
-
try {
|
|
1397
|
-
const r = new BufferReader(buffer);
|
|
1398
|
-
r.readVarInt(); // stream type (0x02)
|
|
1399
|
-
const subscribeRequestId = r.readVarInt();
|
|
1400
|
-
controller.enqueue({
|
|
1401
|
-
type: "fetch_header",
|
|
1402
|
-
subscribeRequestId,
|
|
1403
|
-
});
|
|
1404
|
-
headerEmitted = true;
|
|
1405
|
-
buffer = buffer.slice(r.offset);
|
|
1406
|
-
} catch (e) {
|
|
1407
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1408
|
-
return;
|
|
1409
|
-
}
|
|
1410
|
-
controller.error(e);
|
|
1411
|
-
return;
|
|
1412
|
-
}
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
// Parse objects
|
|
1417
|
-
while (buffer.length > 0) {
|
|
1418
|
-
try {
|
|
1419
|
-
const r = new BufferReader(buffer);
|
|
1420
|
-
const objectId = r.readVarInt();
|
|
1421
|
-
const payloadLength = Number(r.readVarInt());
|
|
1422
|
-
const payload = r.readBytes(payloadLength);
|
|
1423
|
-
controller.enqueue({ type: "object", objectId, payloadLength, payload });
|
|
1424
|
-
buffer = buffer.slice(r.offset);
|
|
1425
|
-
} catch (e) {
|
|
1426
|
-
if (e instanceof DecodeError && e.code === "UNEXPECTED_END") {
|
|
1427
|
-
break;
|
|
1428
|
-
}
|
|
1429
|
-
controller.error(e);
|
|
1430
|
-
return;
|
|
1431
|
-
}
|
|
1432
|
-
}
|
|
1433
|
-
},
|
|
1434
|
-
|
|
1435
|
-
flush(controller) {
|
|
1436
|
-
if (buffer.length > 0) {
|
|
1437
|
-
controller.error(new DecodeError("UNEXPECTED_END", "Stream ended with incomplete data", 0));
|
|
1438
|
-
}
|
|
1439
|
-
},
|
|
1440
|
-
});
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
|
-
// ─── Codec Factory ─────────────────────────────────────────────────────────────
|
|
1444
|
-
|
|
1445
|
-
export interface Draft14Codec extends BaseCodec<Draft14Message> {
|
|
1446
|
-
readonly draft: "draft-ietf-moq-transport-14";
|
|
1447
|
-
encodeSubgroupStream(stream: SubgroupStream): Uint8Array;
|
|
1448
|
-
encodeDatagram(dg: DatagramObject): Uint8Array;
|
|
1449
|
-
encodeFetchStream(stream: FetchStream): Uint8Array;
|
|
1450
|
-
decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream>;
|
|
1451
|
-
decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject>;
|
|
1452
|
-
decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream>;
|
|
1453
|
-
decodeDataStream(
|
|
1454
|
-
streamType: "subgroup" | "datagram" | "fetch",
|
|
1455
|
-
bytes: Uint8Array,
|
|
1456
|
-
): DecodeResult<Draft14DataStream>;
|
|
1457
|
-
createStreamDecoder(): TransformStream<Uint8Array, Draft14Message>;
|
|
1458
|
-
createSubgroupStreamDecoder(): TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>;
|
|
1459
|
-
createFetchStreamDecoder(): TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>;
|
|
1460
|
-
createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent>;
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
|
-
export function createDraft14Codec(): Draft14Codec {
|
|
1464
|
-
return {
|
|
1465
|
-
draft: "draft-ietf-moq-transport-14",
|
|
1466
|
-
encodeMessage,
|
|
1467
|
-
decodeMessage,
|
|
1468
|
-
encodeSubgroupStream,
|
|
1469
|
-
encodeDatagram,
|
|
1470
|
-
encodeFetchStream,
|
|
1471
|
-
decodeSubgroupStream,
|
|
1472
|
-
decodeDatagram,
|
|
1473
|
-
decodeFetchStream,
|
|
1474
|
-
decodeDataStream,
|
|
1475
|
-
createStreamDecoder,
|
|
1476
|
-
createSubgroupStreamDecoder,
|
|
1477
|
-
createFetchStreamDecoder,
|
|
1478
|
-
createDataStreamDecoder,
|
|
1479
|
-
};
|
|
1480
|
-
}
|
|
1
|
+
import { bytesToHex, hexToBytes } from "../../core/hex.js";
|
|
2
|
+
import { BufferReader } from "../../core/buffer-reader.js";
|
|
3
|
+
import { BufferWriter } from "../../core/buffer-writer.js";
|
|
4
|
+
import type { BaseCodec, DecodeResult } from "../../core/types.js";
|
|
5
|
+
import { DecodeError } from "../../core/types.js";
|
|
6
|
+
import {
|
|
7
|
+
MESSAGE_ID_MAP,
|
|
8
|
+
MSG_CLIENT_SETUP,
|
|
9
|
+
MSG_FETCH,
|
|
10
|
+
MSG_FETCH_CANCEL,
|
|
11
|
+
MSG_FETCH_ERROR,
|
|
12
|
+
MSG_FETCH_OK,
|
|
13
|
+
MSG_GOAWAY,
|
|
14
|
+
MSG_MAX_REQUEST_ID,
|
|
15
|
+
MSG_PUBLISH,
|
|
16
|
+
MSG_PUBLISH_DONE,
|
|
17
|
+
MSG_PUBLISH_ERROR,
|
|
18
|
+
MSG_PUBLISH_NAMESPACE,
|
|
19
|
+
MSG_PUBLISH_NAMESPACE_CANCEL,
|
|
20
|
+
MSG_PUBLISH_NAMESPACE_DONE,
|
|
21
|
+
MSG_PUBLISH_NAMESPACE_ERROR,
|
|
22
|
+
MSG_PUBLISH_NAMESPACE_OK,
|
|
23
|
+
MSG_PUBLISH_OK,
|
|
24
|
+
MSG_REQUESTS_BLOCKED,
|
|
25
|
+
MSG_SERVER_SETUP,
|
|
26
|
+
MSG_SUBSCRIBE,
|
|
27
|
+
MSG_SUBSCRIBE_ERROR,
|
|
28
|
+
MSG_SUBSCRIBE_NAMESPACE,
|
|
29
|
+
MSG_SUBSCRIBE_NAMESPACE_ERROR,
|
|
30
|
+
MSG_SUBSCRIBE_NAMESPACE_OK,
|
|
31
|
+
MSG_SUBSCRIBE_OK,
|
|
32
|
+
MSG_SUBSCRIBE_UPDATE,
|
|
33
|
+
MSG_TRACK_STATUS,
|
|
34
|
+
MSG_TRACK_STATUS_ERROR,
|
|
35
|
+
MSG_TRACK_STATUS_OK,
|
|
36
|
+
MSG_UNSUBSCRIBE,
|
|
37
|
+
MSG_UNSUBSCRIBE_NAMESPACE,
|
|
38
|
+
PARAM_MAX_REQUEST_ID,
|
|
39
|
+
PARAM_PATH,
|
|
40
|
+
PARAM_ROLE,
|
|
41
|
+
} from "./messages.js";
|
|
42
|
+
import type {
|
|
43
|
+
DatagramObject,
|
|
44
|
+
DataStreamEvent,
|
|
45
|
+
Draft14DataStream,
|
|
46
|
+
Draft14Message,
|
|
47
|
+
Draft14Params,
|
|
48
|
+
FetchObjectPayload,
|
|
49
|
+
FetchStream,
|
|
50
|
+
FetchStreamHeader,
|
|
51
|
+
ObjectPayload,
|
|
52
|
+
SubgroupStream,
|
|
53
|
+
SubgroupStreamHeader,
|
|
54
|
+
UnknownParam,
|
|
55
|
+
} from "./types.js";
|
|
56
|
+
// ─── Parameter Encoding/Decoding ───────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
function encodeParams(params: Draft14Params, writer: BufferWriter): void {
|
|
59
|
+
// Count total params
|
|
60
|
+
let count = 0;
|
|
61
|
+
if (params.role !== undefined) count++;
|
|
62
|
+
if (params.path !== undefined) count++;
|
|
63
|
+
if (params.max_request_id !== undefined) count++;
|
|
64
|
+
if (params.unknown) count += params.unknown.length;
|
|
65
|
+
|
|
66
|
+
writer.writeVarInt(count);
|
|
67
|
+
|
|
68
|
+
// ROLE (0x00) - even, varint value
|
|
69
|
+
if (params.role !== undefined) {
|
|
70
|
+
writer.writeVarInt(PARAM_ROLE);
|
|
71
|
+
writer.writeVarInt(params.role);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// PATH (0x01) - odd, length-prefixed bytes
|
|
75
|
+
if (params.path !== undefined) {
|
|
76
|
+
writer.writeVarInt(PARAM_PATH);
|
|
77
|
+
const encoded = new TextEncoder().encode(params.path);
|
|
78
|
+
writer.writeVarInt(encoded.byteLength);
|
|
79
|
+
writer.writeBytes(encoded);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// MAX_REQUEST_ID (0x02) - even, varint value
|
|
83
|
+
if (params.max_request_id !== undefined) {
|
|
84
|
+
writer.writeVarInt(PARAM_MAX_REQUEST_ID);
|
|
85
|
+
writer.writeVarInt(params.max_request_id);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Unknown params
|
|
89
|
+
if (params.unknown) {
|
|
90
|
+
for (const u of params.unknown) {
|
|
91
|
+
const id = BigInt(u.id);
|
|
92
|
+
writer.writeVarInt(id);
|
|
93
|
+
const raw = hexToBytes(u.raw_hex);
|
|
94
|
+
writer.writeVarInt(raw.byteLength);
|
|
95
|
+
writer.writeBytes(raw);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function decodeParams(reader: BufferReader): Draft14Params {
|
|
101
|
+
const count = Number(reader.readVarInt());
|
|
102
|
+
const result: Draft14Params = {};
|
|
103
|
+
const unknown: UnknownParam[] = [];
|
|
104
|
+
|
|
105
|
+
for (let i = 0; i < count; i++) {
|
|
106
|
+
const paramType = reader.readVarInt();
|
|
107
|
+
|
|
108
|
+
if (paramType % 2n === 0n) {
|
|
109
|
+
// Even: value is a varint directly
|
|
110
|
+
const value = reader.readVarInt();
|
|
111
|
+
if (paramType === PARAM_ROLE) {
|
|
112
|
+
result.role = value;
|
|
113
|
+
} else if (paramType === PARAM_MAX_REQUEST_ID) {
|
|
114
|
+
result.max_request_id = value;
|
|
115
|
+
} else {
|
|
116
|
+
// Unknown even param — encode the varint value as raw bytes
|
|
117
|
+
const tmpWriter = new BufferWriter(16);
|
|
118
|
+
tmpWriter.writeVarInt(value);
|
|
119
|
+
const raw = tmpWriter.finish();
|
|
120
|
+
unknown.push({
|
|
121
|
+
id: `0x${paramType.toString(16)}`,
|
|
122
|
+
length: raw.byteLength,
|
|
123
|
+
raw_hex: bytesToHex(raw),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
// Odd: value is length-prefixed bytes
|
|
128
|
+
const length = Number(reader.readVarInt());
|
|
129
|
+
const bytes = reader.readBytes(length);
|
|
130
|
+
if (paramType === PARAM_PATH) {
|
|
131
|
+
result.path = new TextDecoder().decode(bytes);
|
|
132
|
+
} else {
|
|
133
|
+
unknown.push({
|
|
134
|
+
id: `0x${paramType.toString(16)}`,
|
|
135
|
+
length,
|
|
136
|
+
raw_hex: bytesToHex(bytes),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (unknown.length > 0) {
|
|
143
|
+
result.unknown = unknown;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ─── Payload Encoders ──────────────────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
function encodeClientSetupPayload(
|
|
152
|
+
msg: Draft14Message & { type: "client_setup" },
|
|
153
|
+
w: BufferWriter,
|
|
154
|
+
): void {
|
|
155
|
+
w.writeVarInt(msg.supported_versions.length);
|
|
156
|
+
for (const v of msg.supported_versions) {
|
|
157
|
+
w.writeVarInt(v);
|
|
158
|
+
}
|
|
159
|
+
encodeParams(msg.parameters, w);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function encodeServerSetupPayload(
|
|
163
|
+
msg: Draft14Message & { type: "server_setup" },
|
|
164
|
+
w: BufferWriter,
|
|
165
|
+
): void {
|
|
166
|
+
w.writeVarInt(msg.selected_version);
|
|
167
|
+
encodeParams(msg.parameters, w);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function encodeSubscribePayload(
|
|
171
|
+
msg: Draft14Message & { type: "subscribe" },
|
|
172
|
+
w: BufferWriter,
|
|
173
|
+
): void {
|
|
174
|
+
w.writeVarInt(msg.request_id);
|
|
175
|
+
w.writeTuple(msg.track_namespace);
|
|
176
|
+
w.writeString(msg.track_name);
|
|
177
|
+
w.writeUint8(Number(msg.subscriber_priority));
|
|
178
|
+
w.writeVarInt(msg.group_order);
|
|
179
|
+
w.writeVarInt(msg.forward);
|
|
180
|
+
w.writeVarInt(msg.filter_type);
|
|
181
|
+
const ft = Number(msg.filter_type);
|
|
182
|
+
if (ft >= 3) {
|
|
183
|
+
w.writeVarInt(msg.start_group!);
|
|
184
|
+
w.writeVarInt(msg.start_object!);
|
|
185
|
+
}
|
|
186
|
+
if (ft === 4) {
|
|
187
|
+
w.writeVarInt(msg.end_group!);
|
|
188
|
+
}
|
|
189
|
+
encodeParams(msg.parameters, w);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function encodeSubscribeOkPayload(
|
|
193
|
+
msg: Draft14Message & { type: "subscribe_ok" },
|
|
194
|
+
w: BufferWriter,
|
|
195
|
+
): void {
|
|
196
|
+
w.writeVarInt(msg.request_id);
|
|
197
|
+
w.writeVarInt(msg.track_alias);
|
|
198
|
+
w.writeVarInt(msg.expires);
|
|
199
|
+
w.writeVarInt(msg.group_order);
|
|
200
|
+
w.writeVarInt(msg.content_exists);
|
|
201
|
+
if (Number(msg.content_exists) === 1) {
|
|
202
|
+
w.writeVarInt(msg.largest_group!);
|
|
203
|
+
w.writeVarInt(msg.largest_object!);
|
|
204
|
+
}
|
|
205
|
+
encodeParams(msg.parameters, w);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function encodeSubscribeUpdatePayload(
|
|
209
|
+
msg: Draft14Message & { type: "subscribe_update" },
|
|
210
|
+
w: BufferWriter,
|
|
211
|
+
): void {
|
|
212
|
+
w.writeVarInt(msg.request_id);
|
|
213
|
+
w.writeVarInt(msg.start_group);
|
|
214
|
+
w.writeVarInt(msg.start_object);
|
|
215
|
+
w.writeVarInt(msg.end_group);
|
|
216
|
+
w.writeUint8(Number(msg.subscriber_priority));
|
|
217
|
+
w.writeVarInt(msg.forward);
|
|
218
|
+
encodeParams(msg.parameters, w);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function encodeSubscribeErrorPayload(
|
|
222
|
+
msg: Draft14Message & { type: "subscribe_error" },
|
|
223
|
+
w: BufferWriter,
|
|
224
|
+
): void {
|
|
225
|
+
w.writeVarInt(msg.request_id);
|
|
226
|
+
w.writeVarInt(msg.error_code);
|
|
227
|
+
w.writeString(msg.reason_phrase);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function encodeUnsubscribePayload(
|
|
231
|
+
msg: Draft14Message & { type: "unsubscribe" },
|
|
232
|
+
w: BufferWriter,
|
|
233
|
+
): void {
|
|
234
|
+
w.writeVarInt(msg.request_id);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function encodePublishPayload(msg: Draft14Message & { type: "publish" }, w: BufferWriter): void {
|
|
238
|
+
w.writeVarInt(msg.request_id);
|
|
239
|
+
w.writeTuple(msg.track_namespace);
|
|
240
|
+
w.writeString(msg.track_name);
|
|
241
|
+
w.writeVarInt(msg.forward);
|
|
242
|
+
encodeParams(msg.parameters, w);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function encodePublishOkPayload(
|
|
246
|
+
msg: Draft14Message & { type: "publish_ok" },
|
|
247
|
+
w: BufferWriter,
|
|
248
|
+
): void {
|
|
249
|
+
w.writeVarInt(msg.request_id);
|
|
250
|
+
w.writeVarInt(msg.track_alias);
|
|
251
|
+
w.writeVarInt(msg.forward);
|
|
252
|
+
encodeParams(msg.parameters, w);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function encodePublishErrorPayload(
|
|
256
|
+
msg: Draft14Message & { type: "publish_error" },
|
|
257
|
+
w: BufferWriter,
|
|
258
|
+
): void {
|
|
259
|
+
w.writeVarInt(msg.request_id);
|
|
260
|
+
w.writeVarInt(msg.error_code);
|
|
261
|
+
w.writeString(msg.reason_phrase);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function encodePublishDonePayload(
|
|
265
|
+
msg: Draft14Message & { type: "publish_done" },
|
|
266
|
+
w: BufferWriter,
|
|
267
|
+
): void {
|
|
268
|
+
w.writeVarInt(msg.request_id);
|
|
269
|
+
w.writeVarInt(msg.status_code);
|
|
270
|
+
w.writeString(msg.reason_phrase);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function encodePublishNamespacePayload(
|
|
274
|
+
msg: Draft14Message & { type: "publish_namespace" },
|
|
275
|
+
w: BufferWriter,
|
|
276
|
+
): void {
|
|
277
|
+
w.writeVarInt(msg.request_id);
|
|
278
|
+
w.writeTuple(msg.track_namespace);
|
|
279
|
+
encodeParams(msg.parameters, w);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function encodePublishNamespaceOkPayload(
|
|
283
|
+
msg: Draft14Message & { type: "publish_namespace_ok" },
|
|
284
|
+
w: BufferWriter,
|
|
285
|
+
): void {
|
|
286
|
+
w.writeVarInt(msg.request_id);
|
|
287
|
+
encodeParams(msg.parameters, w);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function encodePublishNamespaceErrorPayload(
|
|
291
|
+
msg: Draft14Message & { type: "publish_namespace_error" },
|
|
292
|
+
w: BufferWriter,
|
|
293
|
+
): void {
|
|
294
|
+
w.writeVarInt(msg.request_id);
|
|
295
|
+
w.writeVarInt(msg.error_code);
|
|
296
|
+
w.writeString(msg.reason_phrase);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function encodePublishNamespaceDonePayload(
|
|
300
|
+
msg: Draft14Message & { type: "publish_namespace_done" },
|
|
301
|
+
w: BufferWriter,
|
|
302
|
+
): void {
|
|
303
|
+
w.writeVarInt(msg.request_id);
|
|
304
|
+
w.writeVarInt(msg.status_code);
|
|
305
|
+
w.writeString(msg.reason_phrase);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function encodePublishNamespaceCancelPayload(
|
|
309
|
+
msg: Draft14Message & { type: "publish_namespace_cancel" },
|
|
310
|
+
w: BufferWriter,
|
|
311
|
+
): void {
|
|
312
|
+
w.writeVarInt(msg.request_id);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function encodeSubscribeNamespacePayload(
|
|
316
|
+
msg: Draft14Message & { type: "subscribe_namespace" },
|
|
317
|
+
w: BufferWriter,
|
|
318
|
+
): void {
|
|
319
|
+
w.writeVarInt(msg.request_id);
|
|
320
|
+
w.writeTuple(msg.namespace_prefix);
|
|
321
|
+
encodeParams(msg.parameters, w);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function encodeSubscribeNamespaceOkPayload(
|
|
325
|
+
msg: Draft14Message & { type: "subscribe_namespace_ok" },
|
|
326
|
+
w: BufferWriter,
|
|
327
|
+
): void {
|
|
328
|
+
w.writeVarInt(msg.request_id);
|
|
329
|
+
encodeParams(msg.parameters, w);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function encodeSubscribeNamespaceErrorPayload(
|
|
333
|
+
msg: Draft14Message & { type: "subscribe_namespace_error" },
|
|
334
|
+
w: BufferWriter,
|
|
335
|
+
): void {
|
|
336
|
+
w.writeVarInt(msg.request_id);
|
|
337
|
+
w.writeVarInt(msg.error_code);
|
|
338
|
+
w.writeString(msg.reason_phrase);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function encodeUnsubscribeNamespacePayload(
|
|
342
|
+
msg: Draft14Message & { type: "unsubscribe_namespace" },
|
|
343
|
+
w: BufferWriter,
|
|
344
|
+
): void {
|
|
345
|
+
w.writeVarInt(msg.request_id);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function encodeFetchPayload(msg: Draft14Message & { type: "fetch" }, w: BufferWriter): void {
|
|
349
|
+
w.writeVarInt(msg.request_id);
|
|
350
|
+
w.writeTuple(msg.track_namespace);
|
|
351
|
+
w.writeString(msg.track_name);
|
|
352
|
+
w.writeVarInt(msg.start_group);
|
|
353
|
+
w.writeVarInt(msg.start_object);
|
|
354
|
+
w.writeVarInt(msg.end_group);
|
|
355
|
+
encodeParams(msg.parameters, w);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function encodeFetchOkPayload(msg: Draft14Message & { type: "fetch_ok" }, w: BufferWriter): void {
|
|
359
|
+
w.writeVarInt(msg.request_id);
|
|
360
|
+
w.writeVarInt(msg.track_alias);
|
|
361
|
+
w.writeVarInt(msg.end_of_track);
|
|
362
|
+
encodeParams(msg.parameters, w);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function encodeFetchErrorPayload(
|
|
366
|
+
msg: Draft14Message & { type: "fetch_error" },
|
|
367
|
+
w: BufferWriter,
|
|
368
|
+
): void {
|
|
369
|
+
w.writeVarInt(msg.request_id);
|
|
370
|
+
w.writeVarInt(msg.error_code);
|
|
371
|
+
w.writeString(msg.reason_phrase);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function encodeFetchCancelPayload(
|
|
375
|
+
msg: Draft14Message & { type: "fetch_cancel" },
|
|
376
|
+
w: BufferWriter,
|
|
377
|
+
): void {
|
|
378
|
+
w.writeVarInt(msg.request_id);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function encodeTrackStatusPayload(
|
|
382
|
+
msg: Draft14Message & { type: "track_status" },
|
|
383
|
+
w: BufferWriter,
|
|
384
|
+
): void {
|
|
385
|
+
w.writeVarInt(msg.request_id);
|
|
386
|
+
w.writeTuple(msg.track_namespace);
|
|
387
|
+
w.writeString(msg.track_name);
|
|
388
|
+
encodeParams(msg.parameters, w);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
function encodeTrackStatusOkPayload(
|
|
392
|
+
msg: Draft14Message & { type: "track_status_ok" },
|
|
393
|
+
w: BufferWriter,
|
|
394
|
+
): void {
|
|
395
|
+
w.writeVarInt(msg.request_id);
|
|
396
|
+
w.writeVarInt(msg.status_code);
|
|
397
|
+
const sc = Number(msg.status_code);
|
|
398
|
+
if (sc === 0 || sc === 3) {
|
|
399
|
+
w.writeVarInt(msg.largest_group!);
|
|
400
|
+
w.writeVarInt(msg.largest_object!);
|
|
401
|
+
}
|
|
402
|
+
encodeParams(msg.parameters, w);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function encodeTrackStatusErrorPayload(
|
|
406
|
+
msg: Draft14Message & { type: "track_status_error" },
|
|
407
|
+
w: BufferWriter,
|
|
408
|
+
): void {
|
|
409
|
+
w.writeVarInt(msg.request_id);
|
|
410
|
+
w.writeVarInt(msg.error_code);
|
|
411
|
+
w.writeString(msg.reason_phrase);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function encodeGoAwayPayload(msg: Draft14Message & { type: "goaway" }, w: BufferWriter): void {
|
|
415
|
+
w.writeString(msg.new_session_uri);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function encodeMaxRequestIdPayload(
|
|
419
|
+
msg: Draft14Message & { type: "max_request_id" },
|
|
420
|
+
w: BufferWriter,
|
|
421
|
+
): void {
|
|
422
|
+
w.writeVarInt(msg.request_id);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function encodeRequestsBlockedPayload(
|
|
426
|
+
msg: Draft14Message & { type: "requests_blocked" },
|
|
427
|
+
w: BufferWriter,
|
|
428
|
+
): void {
|
|
429
|
+
w.writeVarInt(msg.request_id);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// ─── Payload Decoders ──────────────────────────────────────────────────────────
|
|
433
|
+
|
|
434
|
+
function decodeClientSetupPayload(r: BufferReader): Draft14Message {
|
|
435
|
+
const numVersions = Number(r.readVarInt());
|
|
436
|
+
if (numVersions === 0) {
|
|
437
|
+
throw new DecodeError(
|
|
438
|
+
"CONSTRAINT_VIOLATION",
|
|
439
|
+
"CLIENT_SETUP must offer at least one version",
|
|
440
|
+
r.offset,
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
const supported_versions: bigint[] = [];
|
|
444
|
+
for (let i = 0; i < numVersions; i++) {
|
|
445
|
+
supported_versions.push(r.readVarInt());
|
|
446
|
+
}
|
|
447
|
+
const parameters = decodeParams(r);
|
|
448
|
+
return { type: "client_setup", supported_versions, parameters };
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function decodeServerSetupPayload(r: BufferReader): Draft14Message {
|
|
452
|
+
const selected_version = r.readVarInt();
|
|
453
|
+
const parameters = decodeParams(r);
|
|
454
|
+
return { type: "server_setup", selected_version, parameters };
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function decodeSubscribePayload(r: BufferReader): Draft14Message {
|
|
458
|
+
const request_id = r.readVarInt();
|
|
459
|
+
const track_namespace = r.readTuple();
|
|
460
|
+
const track_name = r.readString();
|
|
461
|
+
const subscriber_priority = BigInt(r.readUint8());
|
|
462
|
+
const group_order = r.readVarInt();
|
|
463
|
+
const forward = r.readVarInt();
|
|
464
|
+
const filter_type = r.readVarInt();
|
|
465
|
+
const ft = Number(filter_type);
|
|
466
|
+
|
|
467
|
+
if (ft < 1 || ft > 4) {
|
|
468
|
+
throw new DecodeError("CONSTRAINT_VIOLATION", `Invalid filter_type: ${ft}`, r.offset);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
let start_group: bigint | undefined;
|
|
472
|
+
let start_object: bigint | undefined;
|
|
473
|
+
let end_group: bigint | undefined;
|
|
474
|
+
|
|
475
|
+
if (ft >= 3) {
|
|
476
|
+
start_group = r.readVarInt();
|
|
477
|
+
start_object = r.readVarInt();
|
|
478
|
+
}
|
|
479
|
+
if (ft === 4) {
|
|
480
|
+
end_group = r.readVarInt();
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const parameters = decodeParams(r);
|
|
484
|
+
|
|
485
|
+
const msg: Draft14Message & { type: "subscribe" } = {
|
|
486
|
+
type: "subscribe",
|
|
487
|
+
request_id,
|
|
488
|
+
track_namespace,
|
|
489
|
+
track_name,
|
|
490
|
+
subscriber_priority,
|
|
491
|
+
group_order,
|
|
492
|
+
forward,
|
|
493
|
+
filter_type,
|
|
494
|
+
parameters,
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
if (start_group !== undefined) {
|
|
498
|
+
return { ...msg, start_group, start_object, end_group } as Draft14Message;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
return msg;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function decodeSubscribeOkPayload(r: BufferReader): Draft14Message {
|
|
505
|
+
const request_id = r.readVarInt();
|
|
506
|
+
const track_alias = r.readVarInt();
|
|
507
|
+
const expires = r.readVarInt();
|
|
508
|
+
const group_order = r.readVarInt();
|
|
509
|
+
const content_exists = r.readVarInt();
|
|
510
|
+
|
|
511
|
+
let largest_group: bigint | undefined;
|
|
512
|
+
let largest_object: bigint | undefined;
|
|
513
|
+
|
|
514
|
+
if (Number(content_exists) === 1) {
|
|
515
|
+
largest_group = r.readVarInt();
|
|
516
|
+
largest_object = r.readVarInt();
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const parameters = decodeParams(r);
|
|
520
|
+
|
|
521
|
+
const msg: Draft14Message = {
|
|
522
|
+
type: "subscribe_ok",
|
|
523
|
+
request_id,
|
|
524
|
+
track_alias,
|
|
525
|
+
expires,
|
|
526
|
+
group_order,
|
|
527
|
+
content_exists,
|
|
528
|
+
parameters,
|
|
529
|
+
...(largest_group !== undefined ? { largest_group, largest_object } : {}),
|
|
530
|
+
} as Draft14Message;
|
|
531
|
+
|
|
532
|
+
return msg;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
function decodeSubscribeUpdatePayload(r: BufferReader): Draft14Message {
|
|
536
|
+
const request_id = r.readVarInt();
|
|
537
|
+
const start_group = r.readVarInt();
|
|
538
|
+
const start_object = r.readVarInt();
|
|
539
|
+
const end_group = r.readVarInt();
|
|
540
|
+
const subscriber_priority = BigInt(r.readUint8());
|
|
541
|
+
const forward = r.readVarInt();
|
|
542
|
+
const parameters = decodeParams(r);
|
|
543
|
+
return {
|
|
544
|
+
type: "subscribe_update",
|
|
545
|
+
request_id,
|
|
546
|
+
start_group,
|
|
547
|
+
start_object,
|
|
548
|
+
end_group,
|
|
549
|
+
subscriber_priority,
|
|
550
|
+
forward,
|
|
551
|
+
parameters,
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
function decodeSubscribeErrorPayload(r: BufferReader): Draft14Message {
|
|
556
|
+
const request_id = r.readVarInt();
|
|
557
|
+
const error_code = r.readVarInt();
|
|
558
|
+
const reason_phrase = r.readString();
|
|
559
|
+
return { type: "subscribe_error", request_id, error_code, reason_phrase };
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
function decodeUnsubscribePayload(r: BufferReader): Draft14Message {
|
|
563
|
+
const request_id = r.readVarInt();
|
|
564
|
+
return { type: "unsubscribe", request_id };
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function decodePublishPayload(r: BufferReader): Draft14Message {
|
|
568
|
+
const request_id = r.readVarInt();
|
|
569
|
+
const track_namespace = r.readTuple();
|
|
570
|
+
const track_name = r.readString();
|
|
571
|
+
const forward = r.readVarInt();
|
|
572
|
+
const parameters = decodeParams(r);
|
|
573
|
+
return { type: "publish", request_id, track_namespace, track_name, forward, parameters };
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
function decodePublishOkPayload(r: BufferReader): Draft14Message {
|
|
577
|
+
const request_id = r.readVarInt();
|
|
578
|
+
const track_alias = r.readVarInt();
|
|
579
|
+
const forward = r.readVarInt();
|
|
580
|
+
const parameters = decodeParams(r);
|
|
581
|
+
return { type: "publish_ok", request_id, track_alias, forward, parameters };
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
function decodePublishErrorPayload(r: BufferReader): Draft14Message {
|
|
585
|
+
const request_id = r.readVarInt();
|
|
586
|
+
const error_code = r.readVarInt();
|
|
587
|
+
const reason_phrase = r.readString();
|
|
588
|
+
return { type: "publish_error", request_id, error_code, reason_phrase };
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
function decodePublishDonePayload(r: BufferReader): Draft14Message {
|
|
592
|
+
const request_id = r.readVarInt();
|
|
593
|
+
const status_code = r.readVarInt();
|
|
594
|
+
const reason_phrase = r.readString();
|
|
595
|
+
return { type: "publish_done", request_id, status_code, reason_phrase };
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
function decodePublishNamespacePayload(r: BufferReader): Draft14Message {
|
|
599
|
+
const request_id = r.readVarInt();
|
|
600
|
+
const track_namespace = r.readTuple();
|
|
601
|
+
const parameters = decodeParams(r);
|
|
602
|
+
return { type: "publish_namespace", request_id, track_namespace, parameters };
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
function decodePublishNamespaceOkPayload(r: BufferReader): Draft14Message {
|
|
606
|
+
const request_id = r.readVarInt();
|
|
607
|
+
const parameters = decodeParams(r);
|
|
608
|
+
return { type: "publish_namespace_ok", request_id, parameters };
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
function decodePublishNamespaceErrorPayload(r: BufferReader): Draft14Message {
|
|
612
|
+
const request_id = r.readVarInt();
|
|
613
|
+
const error_code = r.readVarInt();
|
|
614
|
+
const reason_phrase = r.readString();
|
|
615
|
+
return { type: "publish_namespace_error", request_id, error_code, reason_phrase };
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
function decodePublishNamespaceDonePayload(r: BufferReader): Draft14Message {
|
|
619
|
+
const request_id = r.readVarInt();
|
|
620
|
+
const status_code = r.readVarInt();
|
|
621
|
+
const reason_phrase = r.readString();
|
|
622
|
+
return { type: "publish_namespace_done", request_id, status_code, reason_phrase };
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
function decodePublishNamespaceCancelPayload(r: BufferReader): Draft14Message {
|
|
626
|
+
const request_id = r.readVarInt();
|
|
627
|
+
return { type: "publish_namespace_cancel", request_id };
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
function decodeSubscribeNamespacePayload(r: BufferReader): Draft14Message {
|
|
631
|
+
const request_id = r.readVarInt();
|
|
632
|
+
const namespace_prefix = r.readTuple();
|
|
633
|
+
const parameters = decodeParams(r);
|
|
634
|
+
return { type: "subscribe_namespace", request_id, namespace_prefix, parameters };
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
function decodeSubscribeNamespaceOkPayload(r: BufferReader): Draft14Message {
|
|
638
|
+
const request_id = r.readVarInt();
|
|
639
|
+
const parameters = decodeParams(r);
|
|
640
|
+
return { type: "subscribe_namespace_ok", request_id, parameters };
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
function decodeSubscribeNamespaceErrorPayload(r: BufferReader): Draft14Message {
|
|
644
|
+
const request_id = r.readVarInt();
|
|
645
|
+
const error_code = r.readVarInt();
|
|
646
|
+
const reason_phrase = r.readString();
|
|
647
|
+
return { type: "subscribe_namespace_error", request_id, error_code, reason_phrase };
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
function decodeUnsubscribeNamespacePayload(r: BufferReader): Draft14Message {
|
|
651
|
+
const request_id = r.readVarInt();
|
|
652
|
+
return { type: "unsubscribe_namespace", request_id };
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
function decodeFetchPayload(r: BufferReader): Draft14Message {
|
|
656
|
+
const request_id = r.readVarInt();
|
|
657
|
+
const track_namespace = r.readTuple();
|
|
658
|
+
const track_name = r.readString();
|
|
659
|
+
const start_group = r.readVarInt();
|
|
660
|
+
const start_object = r.readVarInt();
|
|
661
|
+
const end_group = r.readVarInt();
|
|
662
|
+
const parameters = decodeParams(r);
|
|
663
|
+
return {
|
|
664
|
+
type: "fetch",
|
|
665
|
+
request_id,
|
|
666
|
+
track_namespace,
|
|
667
|
+
track_name,
|
|
668
|
+
start_group,
|
|
669
|
+
start_object,
|
|
670
|
+
end_group,
|
|
671
|
+
parameters,
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
function decodeFetchOkPayload(r: BufferReader): Draft14Message {
|
|
676
|
+
const request_id = r.readVarInt();
|
|
677
|
+
const track_alias = r.readVarInt();
|
|
678
|
+
const end_of_track = r.readVarInt();
|
|
679
|
+
const parameters = decodeParams(r);
|
|
680
|
+
return { type: "fetch_ok", request_id, track_alias, end_of_track, parameters };
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
function decodeFetchErrorPayload(r: BufferReader): Draft14Message {
|
|
684
|
+
const request_id = r.readVarInt();
|
|
685
|
+
const error_code = r.readVarInt();
|
|
686
|
+
const reason_phrase = r.readString();
|
|
687
|
+
return { type: "fetch_error", request_id, error_code, reason_phrase };
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
function decodeFetchCancelPayload(r: BufferReader): Draft14Message {
|
|
691
|
+
const request_id = r.readVarInt();
|
|
692
|
+
return { type: "fetch_cancel", request_id };
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
function decodeTrackStatusPayload(r: BufferReader): Draft14Message {
|
|
696
|
+
const request_id = r.readVarInt();
|
|
697
|
+
const track_namespace = r.readTuple();
|
|
698
|
+
const track_name = r.readString();
|
|
699
|
+
const parameters = decodeParams(r);
|
|
700
|
+
return { type: "track_status", request_id, track_namespace, track_name, parameters };
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
function decodeTrackStatusOkPayload(r: BufferReader): Draft14Message {
|
|
704
|
+
const request_id = r.readVarInt();
|
|
705
|
+
const status_code = r.readVarInt();
|
|
706
|
+
const sc = Number(status_code);
|
|
707
|
+
|
|
708
|
+
let largest_group: bigint | undefined;
|
|
709
|
+
let largest_object: bigint | undefined;
|
|
710
|
+
|
|
711
|
+
if (sc === 0 || sc === 3) {
|
|
712
|
+
largest_group = r.readVarInt();
|
|
713
|
+
largest_object = r.readVarInt();
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
const parameters = decodeParams(r);
|
|
717
|
+
|
|
718
|
+
return {
|
|
719
|
+
type: "track_status_ok",
|
|
720
|
+
request_id,
|
|
721
|
+
status_code,
|
|
722
|
+
parameters,
|
|
723
|
+
...(largest_group !== undefined ? { largest_group, largest_object } : {}),
|
|
724
|
+
} as Draft14Message;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
function decodeTrackStatusErrorPayload(r: BufferReader): Draft14Message {
|
|
728
|
+
const request_id = r.readVarInt();
|
|
729
|
+
const error_code = r.readVarInt();
|
|
730
|
+
const reason_phrase = r.readString();
|
|
731
|
+
return { type: "track_status_error", request_id, error_code, reason_phrase };
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
function decodeGoAwayPayload(r: BufferReader): Draft14Message {
|
|
735
|
+
const new_session_uri = r.readString();
|
|
736
|
+
return { type: "goaway", new_session_uri };
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
function decodeMaxRequestIdPayload(r: BufferReader): Draft14Message {
|
|
740
|
+
const request_id = r.readVarInt();
|
|
741
|
+
return { type: "max_request_id", request_id };
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
function decodeRequestsBlockedPayload(r: BufferReader): Draft14Message {
|
|
745
|
+
const request_id = r.readVarInt();
|
|
746
|
+
return { type: "requests_blocked", request_id };
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
// ─── Payload dispatch tables ───────────────────────────────────────────────────
|
|
750
|
+
|
|
751
|
+
const payloadDecoders: ReadonlyMap<bigint, (r: BufferReader) => Draft14Message> = new Map([
|
|
752
|
+
[MSG_CLIENT_SETUP, decodeClientSetupPayload],
|
|
753
|
+
[MSG_SERVER_SETUP, decodeServerSetupPayload],
|
|
754
|
+
[MSG_SUBSCRIBE, decodeSubscribePayload],
|
|
755
|
+
[MSG_SUBSCRIBE_OK, decodeSubscribeOkPayload],
|
|
756
|
+
[MSG_SUBSCRIBE_UPDATE, decodeSubscribeUpdatePayload],
|
|
757
|
+
[MSG_SUBSCRIBE_ERROR, decodeSubscribeErrorPayload],
|
|
758
|
+
[MSG_UNSUBSCRIBE, decodeUnsubscribePayload],
|
|
759
|
+
[MSG_PUBLISH, decodePublishPayload],
|
|
760
|
+
[MSG_PUBLISH_OK, decodePublishOkPayload],
|
|
761
|
+
[MSG_PUBLISH_ERROR, decodePublishErrorPayload],
|
|
762
|
+
[MSG_PUBLISH_DONE, decodePublishDonePayload],
|
|
763
|
+
[MSG_PUBLISH_NAMESPACE, decodePublishNamespacePayload],
|
|
764
|
+
[MSG_PUBLISH_NAMESPACE_OK, decodePublishNamespaceOkPayload],
|
|
765
|
+
[MSG_PUBLISH_NAMESPACE_ERROR, decodePublishNamespaceErrorPayload],
|
|
766
|
+
[MSG_PUBLISH_NAMESPACE_DONE, decodePublishNamespaceDonePayload],
|
|
767
|
+
[MSG_PUBLISH_NAMESPACE_CANCEL, decodePublishNamespaceCancelPayload],
|
|
768
|
+
[MSG_SUBSCRIBE_NAMESPACE, decodeSubscribeNamespacePayload],
|
|
769
|
+
[MSG_SUBSCRIBE_NAMESPACE_OK, decodeSubscribeNamespaceOkPayload],
|
|
770
|
+
[MSG_SUBSCRIBE_NAMESPACE_ERROR, decodeSubscribeNamespaceErrorPayload],
|
|
771
|
+
[MSG_UNSUBSCRIBE_NAMESPACE, decodeUnsubscribeNamespacePayload],
|
|
772
|
+
[MSG_FETCH, decodeFetchPayload],
|
|
773
|
+
[MSG_FETCH_OK, decodeFetchOkPayload],
|
|
774
|
+
[MSG_FETCH_ERROR, decodeFetchErrorPayload],
|
|
775
|
+
[MSG_FETCH_CANCEL, decodeFetchCancelPayload],
|
|
776
|
+
[MSG_TRACK_STATUS, decodeTrackStatusPayload],
|
|
777
|
+
[MSG_TRACK_STATUS_OK, decodeTrackStatusOkPayload],
|
|
778
|
+
[MSG_TRACK_STATUS_ERROR, decodeTrackStatusErrorPayload],
|
|
779
|
+
[MSG_GOAWAY, decodeGoAwayPayload],
|
|
780
|
+
[MSG_MAX_REQUEST_ID, decodeMaxRequestIdPayload],
|
|
781
|
+
[MSG_REQUESTS_BLOCKED, decodeRequestsBlockedPayload],
|
|
782
|
+
]);
|
|
783
|
+
|
|
784
|
+
// ─── Public API ────────────────────────────────────────────────────────────────
|
|
785
|
+
|
|
786
|
+
/**
|
|
787
|
+
* Encode a draft-14 control message with type(varint) + length(uint16 BE) + payload.
|
|
788
|
+
*/
|
|
789
|
+
export function encodeMessage(message: Draft14Message): Uint8Array {
|
|
790
|
+
const typeId = MESSAGE_ID_MAP.get(message.type);
|
|
791
|
+
if (typeId === undefined) {
|
|
792
|
+
throw new Error(`Unknown message type: ${message.type}`);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
// Encode payload into a separate buffer
|
|
796
|
+
const payloadWriter = new BufferWriter();
|
|
797
|
+
encodePayload(message, payloadWriter);
|
|
798
|
+
const payload = payloadWriter.finish();
|
|
799
|
+
|
|
800
|
+
if (payload.byteLength > 0xffff) {
|
|
801
|
+
throw new Error(`Payload too large for 16-bit length: ${payload.byteLength}`);
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
// Write framed message: type(varint) + length(uint16 BE) + payload
|
|
805
|
+
const writer = new BufferWriter();
|
|
806
|
+
writer.writeVarInt(typeId);
|
|
807
|
+
writer.writeUint8((payload.byteLength >> 8) & 0xff);
|
|
808
|
+
writer.writeUint8(payload.byteLength & 0xff);
|
|
809
|
+
writer.writeBytes(payload);
|
|
810
|
+
|
|
811
|
+
return writer.finish();
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
function encodePayload(msg: Draft14Message, w: BufferWriter): void {
|
|
815
|
+
switch (msg.type) {
|
|
816
|
+
case "client_setup":
|
|
817
|
+
return encodeClientSetupPayload(msg, w);
|
|
818
|
+
case "server_setup":
|
|
819
|
+
return encodeServerSetupPayload(msg, w);
|
|
820
|
+
case "subscribe":
|
|
821
|
+
return encodeSubscribePayload(msg, w);
|
|
822
|
+
case "subscribe_ok":
|
|
823
|
+
return encodeSubscribeOkPayload(msg, w);
|
|
824
|
+
case "subscribe_update":
|
|
825
|
+
return encodeSubscribeUpdatePayload(msg, w);
|
|
826
|
+
case "subscribe_error":
|
|
827
|
+
return encodeSubscribeErrorPayload(msg, w);
|
|
828
|
+
case "unsubscribe":
|
|
829
|
+
return encodeUnsubscribePayload(msg, w);
|
|
830
|
+
case "publish":
|
|
831
|
+
return encodePublishPayload(msg, w);
|
|
832
|
+
case "publish_ok":
|
|
833
|
+
return encodePublishOkPayload(msg, w);
|
|
834
|
+
case "publish_error":
|
|
835
|
+
return encodePublishErrorPayload(msg, w);
|
|
836
|
+
case "publish_done":
|
|
837
|
+
return encodePublishDonePayload(msg, w);
|
|
838
|
+
case "publish_namespace":
|
|
839
|
+
return encodePublishNamespacePayload(msg, w);
|
|
840
|
+
case "publish_namespace_ok":
|
|
841
|
+
return encodePublishNamespaceOkPayload(msg, w);
|
|
842
|
+
case "publish_namespace_error":
|
|
843
|
+
return encodePublishNamespaceErrorPayload(msg, w);
|
|
844
|
+
case "publish_namespace_done":
|
|
845
|
+
return encodePublishNamespaceDonePayload(msg, w);
|
|
846
|
+
case "publish_namespace_cancel":
|
|
847
|
+
return encodePublishNamespaceCancelPayload(msg, w);
|
|
848
|
+
case "subscribe_namespace":
|
|
849
|
+
return encodeSubscribeNamespacePayload(msg, w);
|
|
850
|
+
case "subscribe_namespace_ok":
|
|
851
|
+
return encodeSubscribeNamespaceOkPayload(msg, w);
|
|
852
|
+
case "subscribe_namespace_error":
|
|
853
|
+
return encodeSubscribeNamespaceErrorPayload(msg, w);
|
|
854
|
+
case "unsubscribe_namespace":
|
|
855
|
+
return encodeUnsubscribeNamespacePayload(msg, w);
|
|
856
|
+
case "fetch":
|
|
857
|
+
return encodeFetchPayload(msg, w);
|
|
858
|
+
case "fetch_ok":
|
|
859
|
+
return encodeFetchOkPayload(msg, w);
|
|
860
|
+
case "fetch_error":
|
|
861
|
+
return encodeFetchErrorPayload(msg, w);
|
|
862
|
+
case "fetch_cancel":
|
|
863
|
+
return encodeFetchCancelPayload(msg, w);
|
|
864
|
+
case "track_status":
|
|
865
|
+
return encodeTrackStatusPayload(msg, w);
|
|
866
|
+
case "track_status_ok":
|
|
867
|
+
return encodeTrackStatusOkPayload(msg, w);
|
|
868
|
+
case "track_status_error":
|
|
869
|
+
return encodeTrackStatusErrorPayload(msg, w);
|
|
870
|
+
case "goaway":
|
|
871
|
+
return encodeGoAwayPayload(msg, w);
|
|
872
|
+
case "max_request_id":
|
|
873
|
+
return encodeMaxRequestIdPayload(msg, w);
|
|
874
|
+
case "requests_blocked":
|
|
875
|
+
return encodeRequestsBlockedPayload(msg, w);
|
|
876
|
+
default: {
|
|
877
|
+
const _exhaustive: never = msg;
|
|
878
|
+
throw new Error(`Unhandled message type: ${(_exhaustive as Draft14Message).type}`);
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
/**
|
|
884
|
+
* Decode a draft-14 control message from bytes (type + uint16 length + payload).
|
|
885
|
+
*/
|
|
886
|
+
export function decodeMessage(bytes: Uint8Array): DecodeResult<Draft14Message> {
|
|
887
|
+
try {
|
|
888
|
+
const reader = new BufferReader(bytes);
|
|
889
|
+
const typeId = reader.readVarInt();
|
|
890
|
+
|
|
891
|
+
// Read 16-bit big-endian payload length
|
|
892
|
+
const lenHi = reader.readUint8();
|
|
893
|
+
const lenLo = reader.readUint8();
|
|
894
|
+
const payloadLength = (lenHi << 8) | lenLo;
|
|
895
|
+
|
|
896
|
+
// Read exactly payloadLength bytes
|
|
897
|
+
const payloadBytes = reader.readBytes(payloadLength);
|
|
898
|
+
const payloadReader = new BufferReader(payloadBytes);
|
|
899
|
+
|
|
900
|
+
const decoder = payloadDecoders.get(typeId);
|
|
901
|
+
if (!decoder) {
|
|
902
|
+
return {
|
|
903
|
+
ok: false,
|
|
904
|
+
error: new DecodeError(
|
|
905
|
+
"UNKNOWN_MESSAGE_TYPE",
|
|
906
|
+
`Unknown message type ID: 0x${typeId.toString(16)}`,
|
|
907
|
+
0,
|
|
908
|
+
),
|
|
909
|
+
};
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
const message = decoder(payloadReader);
|
|
913
|
+
return { ok: true, value: message, bytesRead: reader.offset };
|
|
914
|
+
} catch (e) {
|
|
915
|
+
if (e instanceof DecodeError) {
|
|
916
|
+
return { ok: false, error: e };
|
|
917
|
+
}
|
|
918
|
+
throw e;
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
// ─── Data Stream Re-exports ───────────────────────────────────────────────────
|
|
923
|
+
|
|
924
|
+
import {
|
|
925
|
+
encodeSubgroupStream,
|
|
926
|
+
decodeSubgroupStream,
|
|
927
|
+
encodeDatagram,
|
|
928
|
+
decodeDatagram,
|
|
929
|
+
encodeFetchStream,
|
|
930
|
+
decodeFetchStream,
|
|
931
|
+
decodeDataStream,
|
|
932
|
+
createSubgroupStreamDecoder,
|
|
933
|
+
createFetchStreamDecoder,
|
|
934
|
+
createDataStreamDecoder,
|
|
935
|
+
} from "./data-streams.js";
|
|
936
|
+
|
|
937
|
+
export {
|
|
938
|
+
encodeSubgroupStream,
|
|
939
|
+
decodeSubgroupStream,
|
|
940
|
+
encodeDatagram,
|
|
941
|
+
decodeDatagram,
|
|
942
|
+
encodeFetchStream,
|
|
943
|
+
decodeFetchStream,
|
|
944
|
+
decodeDataStream,
|
|
945
|
+
createSubgroupStreamDecoder,
|
|
946
|
+
createFetchStreamDecoder,
|
|
947
|
+
createDataStreamDecoder,
|
|
948
|
+
};
|
|
949
|
+
|
|
950
|
+
// ─── Stream Decoders ───────────────────────────────────────────────────────────
|
|
951
|
+
|
|
952
|
+
/**
|
|
953
|
+
* Create a TransformStream that decodes a continuous byte stream (e.g. the
|
|
954
|
+
* WebTransport bidirectional control stream) into individual Draft14Message
|
|
955
|
+
* objects. Uses the varint(type) + uint16_BE(length) + payload framing.
|
|
956
|
+
*/
|
|
957
|
+
export function createStreamDecoder(): TransformStream<Uint8Array, Draft14Message> {
|
|
958
|
+
let buffer = new Uint8Array(0);
|
|
959
|
+
|
|
960
|
+
return new TransformStream<Uint8Array, Draft14Message>({
|
|
961
|
+
transform(chunk, controller) {
|
|
962
|
+
// Accumulate incoming data
|
|
963
|
+
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
964
|
+
newBuffer.set(buffer, 0);
|
|
965
|
+
newBuffer.set(chunk, buffer.length);
|
|
966
|
+
buffer = newBuffer;
|
|
967
|
+
|
|
968
|
+
// Try to decode messages from the buffer
|
|
969
|
+
while (buffer.length > 0) {
|
|
970
|
+
const result = decodeMessage(buffer);
|
|
971
|
+
if (!result.ok) {
|
|
972
|
+
if (result.error.code === "UNEXPECTED_END") {
|
|
973
|
+
// Need more data -- wait for next chunk
|
|
974
|
+
break;
|
|
975
|
+
}
|
|
976
|
+
// Fatal decode error
|
|
977
|
+
controller.error(result.error);
|
|
978
|
+
return;
|
|
979
|
+
}
|
|
980
|
+
controller.enqueue(result.value);
|
|
981
|
+
// Advance the buffer past the consumed bytes
|
|
982
|
+
buffer = buffer.slice(result.bytesRead);
|
|
983
|
+
}
|
|
984
|
+
},
|
|
985
|
+
|
|
986
|
+
flush(controller) {
|
|
987
|
+
// If there is remaining data in the buffer, it is a truncated message
|
|
988
|
+
if (buffer.length > 0) {
|
|
989
|
+
controller.error(
|
|
990
|
+
new DecodeError("UNEXPECTED_END", "Stream ended with incomplete message data", 0),
|
|
991
|
+
);
|
|
992
|
+
}
|
|
993
|
+
},
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
// ─── Codec Factory ─────────────────────────────────────────────────────────────
|
|
998
|
+
|
|
999
|
+
export interface Draft14Codec extends BaseCodec<Draft14Message> {
|
|
1000
|
+
readonly draft: "draft-ietf-moq-transport-14";
|
|
1001
|
+
encodeSubgroupStream(stream: SubgroupStream): Uint8Array;
|
|
1002
|
+
encodeDatagram(dg: DatagramObject): Uint8Array;
|
|
1003
|
+
encodeFetchStream(stream: FetchStream): Uint8Array;
|
|
1004
|
+
decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream>;
|
|
1005
|
+
decodeDatagram(bytes: Uint8Array): DecodeResult<DatagramObject>;
|
|
1006
|
+
decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream>;
|
|
1007
|
+
decodeDataStream(
|
|
1008
|
+
streamType: "subgroup" | "datagram" | "fetch",
|
|
1009
|
+
bytes: Uint8Array,
|
|
1010
|
+
): DecodeResult<Draft14DataStream>;
|
|
1011
|
+
createStreamDecoder(): TransformStream<Uint8Array, Draft14Message>;
|
|
1012
|
+
createSubgroupStreamDecoder(): TransformStream<Uint8Array, SubgroupStreamHeader | ObjectPayload>;
|
|
1013
|
+
createFetchStreamDecoder(): TransformStream<Uint8Array, FetchStreamHeader | ObjectPayload>;
|
|
1014
|
+
createDataStreamDecoder(): TransformStream<Uint8Array, DataStreamEvent>;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
export function createDraft14Codec(): Draft14Codec {
|
|
1018
|
+
return {
|
|
1019
|
+
draft: "draft-ietf-moq-transport-14",
|
|
1020
|
+
encodeMessage,
|
|
1021
|
+
decodeMessage,
|
|
1022
|
+
encodeSubgroupStream,
|
|
1023
|
+
encodeDatagram,
|
|
1024
|
+
encodeFetchStream,
|
|
1025
|
+
decodeSubgroupStream,
|
|
1026
|
+
decodeDatagram,
|
|
1027
|
+
decodeFetchStream,
|
|
1028
|
+
decodeDataStream,
|
|
1029
|
+
createStreamDecoder,
|
|
1030
|
+
createSubgroupStreamDecoder,
|
|
1031
|
+
createFetchStreamDecoder,
|
|
1032
|
+
createDataStreamDecoder,
|
|
1033
|
+
};
|
|
1034
|
+
}
|