@moqtap/codec 0.2.0 → 0.2.1
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 +192 -192
- 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 +969 -1198
- package/src/drafts/draft11/data-streams.ts +269 -0
- package/src/drafts/draft11/types.ts +381 -375
- package/src/drafts/draft12/codec.ts +1126 -1354
- package/src/drafts/draft12/data-streams.ts +275 -0
- package/src/drafts/draft12/types.ts +419 -414
- package/src/drafts/draft13/codec.ts +1210 -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,991 +1,933 @@
|
|
|
1
|
-
import { BufferReader } from "../../core/buffer-reader.js";
|
|
2
|
-
import { BufferWriter } from "../../core/buffer-writer.js";
|
|
3
|
-
import type {
|
|
4
|
-
Announce,
|
|
5
|
-
AnnounceCancel,
|
|
6
|
-
AnnounceError,
|
|
7
|
-
AnnounceOk,
|
|
8
|
-
ClientSetup,
|
|
9
|
-
Codec,
|
|
10
|
-
DecodeResult,
|
|
11
|
-
Fetch,
|
|
12
|
-
FetchCancel,
|
|
13
|
-
FetchError,
|
|
14
|
-
FetchOk,
|
|
15
|
-
FilterType,
|
|
16
|
-
GoAway,
|
|
17
|
-
GroupOrderValue,
|
|
18
|
-
MaxSubscribeId,
|
|
19
|
-
MoqtMessage,
|
|
20
|
-
MoqtMessageType,
|
|
21
|
-
ObjectDatagram,
|
|
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
|
-
MESSAGE_TYPE_IDS.
|
|
103
|
-
]);
|
|
104
|
-
|
|
105
|
-
// --- Control message type (excludes data stream types) ---
|
|
106
|
-
type ControlMessageType = Exclude<
|
|
107
|
-
MoqtMessageType,
|
|
108
|
-
| "object_stream"
|
|
109
|
-
| "object_datagram"
|
|
110
|
-
| "stream_header_track"
|
|
111
|
-
| "stream_header_group"
|
|
112
|
-
| "stream_header_subgroup"
|
|
113
|
-
>;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
writer.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
writer.writeVarInt(msg.
|
|
133
|
-
writer.
|
|
134
|
-
writer.
|
|
135
|
-
writer.
|
|
136
|
-
|
|
137
|
-
writer
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
writer.writeVarInt(msg.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
writer.writeVarInt(msg.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
writer.writeVarInt(msg.
|
|
152
|
-
|
|
153
|
-
writer
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
writer.writeVarInt(msg.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
writer.writeVarInt(msg.
|
|
164
|
-
writer.
|
|
165
|
-
writer.
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
writer.writeVarInt(msg.
|
|
171
|
-
writer.
|
|
172
|
-
writer.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
writer.writeVarInt(msg.
|
|
176
|
-
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
writer.writeVarInt(msg.
|
|
182
|
-
writer.writeVarInt(msg.
|
|
183
|
-
writer.writeVarInt(msg.
|
|
184
|
-
writer.writeVarInt(msg.
|
|
185
|
-
writer.
|
|
186
|
-
writer.
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
writer.
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
writer.
|
|
205
|
-
writer.
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
writer.
|
|
211
|
-
writer.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
writer.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
writer.
|
|
226
|
-
writer.
|
|
227
|
-
writer.writeVarInt(msg.
|
|
228
|
-
writer.writeVarInt(msg.
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
writer.
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
writer.
|
|
247
|
-
writer.
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
writer.
|
|
261
|
-
writer.
|
|
262
|
-
writer.
|
|
263
|
-
|
|
264
|
-
writer
|
|
265
|
-
writer.writeVarInt(msg.
|
|
266
|
-
writer.writeVarInt(msg.
|
|
267
|
-
writer.writeVarInt(msg.
|
|
268
|
-
writer.
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
writer
|
|
275
|
-
writer.
|
|
276
|
-
writer.writeVarInt(msg.
|
|
277
|
-
writer.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
writer.writeVarInt(msg.
|
|
283
|
-
writer.
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
writer.writeVarInt(
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
writer.
|
|
301
|
-
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
writer.writeVarInt(
|
|
307
|
-
writer.writeVarInt(msg.
|
|
308
|
-
writer.writeVarInt(msg.
|
|
309
|
-
writer.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
writer
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
writer
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
const
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
const
|
|
464
|
-
const
|
|
465
|
-
const
|
|
466
|
-
const
|
|
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
|
-
const
|
|
497
|
-
const
|
|
498
|
-
const
|
|
499
|
-
const
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
const
|
|
532
|
-
const
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
const
|
|
560
|
-
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
const
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
const
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
const
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
const
|
|
594
|
-
return { type: "
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
function
|
|
598
|
-
const
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
const
|
|
604
|
-
const
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
const
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
const
|
|
658
|
-
const
|
|
659
|
-
const
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
function
|
|
754
|
-
|
|
755
|
-
const
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
const
|
|
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
|
-
function createStreamDecoderImpl(): TransformStream<Uint8Array, MoqtMessage> {
|
|
938
|
-
let buffer = new Uint8Array(0);
|
|
939
|
-
|
|
940
|
-
return new TransformStream<Uint8Array, MoqtMessage>({
|
|
941
|
-
transform(chunk, controller) {
|
|
942
|
-
// Accumulate incoming data
|
|
943
|
-
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
944
|
-
newBuffer.set(buffer, 0);
|
|
945
|
-
newBuffer.set(chunk, buffer.length);
|
|
946
|
-
buffer = newBuffer;
|
|
947
|
-
|
|
948
|
-
// Try to decode messages from the buffer
|
|
949
|
-
while (buffer.length > 0) {
|
|
950
|
-
const result = decodeMessageImpl(buffer);
|
|
951
|
-
if (!result.ok) {
|
|
952
|
-
if (result.error.code === "UNEXPECTED_END") {
|
|
953
|
-
// Need more data -- wait for next chunk
|
|
954
|
-
break;
|
|
955
|
-
}
|
|
956
|
-
// Fatal decode error
|
|
957
|
-
controller.error(result.error);
|
|
958
|
-
return;
|
|
959
|
-
}
|
|
960
|
-
controller.enqueue(result.value);
|
|
961
|
-
// Advance the buffer past the consumed bytes
|
|
962
|
-
buffer = buffer.slice(result.bytesRead);
|
|
963
|
-
}
|
|
964
|
-
},
|
|
965
|
-
|
|
966
|
-
flush(controller) {
|
|
967
|
-
// If there is remaining data in the buffer, it is a truncated message
|
|
968
|
-
if (buffer.length > 0) {
|
|
969
|
-
controller.error(
|
|
970
|
-
new DecodeError("UNEXPECTED_END", "Stream ended with incomplete message data", 0),
|
|
971
|
-
);
|
|
972
|
-
}
|
|
973
|
-
},
|
|
974
|
-
});
|
|
975
|
-
}
|
|
976
|
-
|
|
977
|
-
// --- Factory ---
|
|
978
|
-
|
|
979
|
-
export function createDraft07Codec(): Codec {
|
|
980
|
-
return {
|
|
981
|
-
draft: "draft-ietf-moq-transport-07",
|
|
982
|
-
encodeMessage: encodeMessageImpl,
|
|
983
|
-
decodeMessage: decodeMessageImpl,
|
|
984
|
-
encodeVarInt,
|
|
985
|
-
decodeVarInt,
|
|
986
|
-
createStreamDecoder: createStreamDecoderImpl,
|
|
987
|
-
};
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
// Export data-stream decoder map for callers that need to disambiguate
|
|
991
|
-
export { dataStreamDecoders };
|
|
1
|
+
import { BufferReader } from "../../core/buffer-reader.js";
|
|
2
|
+
import { BufferWriter } from "../../core/buffer-writer.js";
|
|
3
|
+
import type {
|
|
4
|
+
Announce,
|
|
5
|
+
AnnounceCancel,
|
|
6
|
+
AnnounceError,
|
|
7
|
+
AnnounceOk,
|
|
8
|
+
ClientSetup,
|
|
9
|
+
Codec,
|
|
10
|
+
DecodeResult,
|
|
11
|
+
Fetch,
|
|
12
|
+
FetchCancel,
|
|
13
|
+
FetchError,
|
|
14
|
+
FetchOk,
|
|
15
|
+
FilterType,
|
|
16
|
+
GoAway,
|
|
17
|
+
GroupOrderValue,
|
|
18
|
+
MaxSubscribeId,
|
|
19
|
+
MoqtMessage,
|
|
20
|
+
MoqtMessageType,
|
|
21
|
+
ObjectDatagram,
|
|
22
|
+
ServerSetup,
|
|
23
|
+
StreamHeaderSubgroup,
|
|
24
|
+
Subscribe,
|
|
25
|
+
SubscribeAnnounces,
|
|
26
|
+
SubscribeAnnouncesError,
|
|
27
|
+
SubscribeAnnouncesOk,
|
|
28
|
+
SubscribeDone,
|
|
29
|
+
SubscribeError,
|
|
30
|
+
SubscribeOk,
|
|
31
|
+
SubscribeUpdate,
|
|
32
|
+
TrackStatus,
|
|
33
|
+
TrackStatusRequest,
|
|
34
|
+
Unannounce,
|
|
35
|
+
Unsubscribe,
|
|
36
|
+
UnsubscribeAnnounces,
|
|
37
|
+
} from "../../core/types.js";
|
|
38
|
+
import { DecodeError } from "../../core/types.js";
|
|
39
|
+
import type {
|
|
40
|
+
DatagramObject as Draft07DatagramObject,
|
|
41
|
+
FetchStream,
|
|
42
|
+
SubgroupStream,
|
|
43
|
+
} from "./types.js";
|
|
44
|
+
import { MESSAGE_TYPE_IDS } from "./messages.js";
|
|
45
|
+
import { decodeVarInt, encodeVarInt } from "./varint.js";
|
|
46
|
+
|
|
47
|
+
// --- FilterType mapping ---
|
|
48
|
+
|
|
49
|
+
const FILTER_TYPE_TO_WIRE: Record<FilterType, bigint> = {
|
|
50
|
+
latest_group: 1n,
|
|
51
|
+
latest_object: 2n,
|
|
52
|
+
absolute_start: 3n,
|
|
53
|
+
absolute_range: 4n,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const WIRE_TO_FILTER_TYPE: Map<bigint, FilterType> = new Map([
|
|
57
|
+
[1n, "latest_group"],
|
|
58
|
+
[2n, "latest_object"],
|
|
59
|
+
[3n, "absolute_start"],
|
|
60
|
+
[4n, "absolute_range"],
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
// --- GroupOrderValue mapping ---
|
|
64
|
+
|
|
65
|
+
const GROUP_ORDER_TO_WIRE: Record<GroupOrderValue, number> = {
|
|
66
|
+
original: 0,
|
|
67
|
+
ascending: 1,
|
|
68
|
+
descending: 2,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const WIRE_TO_GROUP_ORDER: Map<number, GroupOrderValue> = new Map([
|
|
72
|
+
[0, "original"],
|
|
73
|
+
[1, "ascending"],
|
|
74
|
+
[2, "descending"],
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
// --- Encode helpers ---
|
|
78
|
+
|
|
79
|
+
function writeGroupOrder(writer: BufferWriter, value: GroupOrderValue): void {
|
|
80
|
+
const wire = GROUP_ORDER_TO_WIRE[value];
|
|
81
|
+
writer.writeUint8(wire);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function readGroupOrder(reader: BufferReader): GroupOrderValue {
|
|
85
|
+
const wire = reader.readUint8();
|
|
86
|
+
const value = WIRE_TO_GROUP_ORDER.get(wire);
|
|
87
|
+
if (value === undefined) {
|
|
88
|
+
throw new DecodeError(
|
|
89
|
+
"CONSTRAINT_VIOLATION",
|
|
90
|
+
`Invalid group order value: ${wire}`,
|
|
91
|
+
reader.offset - 1,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Data stream type IDs that NEVER appear as control messages.
|
|
98
|
+
// Note: 0x04 (stream_header_subgroup) excluded — shares ID with subscribe_ok.
|
|
99
|
+
// Note: 0x05 (fetch_header) excluded — shares ID with subscribe_error.
|
|
100
|
+
// Callers must use decodeSubgroupStream/decodeFetchStream directly.
|
|
101
|
+
const DATA_STREAM_TYPE_IDS: ReadonlySet<bigint> = new Set([
|
|
102
|
+
MESSAGE_TYPE_IDS.object_datagram,
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
// --- Control message type (excludes data stream types) ---
|
|
106
|
+
type ControlMessageType = Exclude<
|
|
107
|
+
MoqtMessageType,
|
|
108
|
+
| "object_stream"
|
|
109
|
+
| "object_datagram"
|
|
110
|
+
| "stream_header_track"
|
|
111
|
+
| "stream_header_group"
|
|
112
|
+
| "stream_header_subgroup"
|
|
113
|
+
>;
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
// --- Encode functions for each message type (payload only, no type ID) ---
|
|
117
|
+
|
|
118
|
+
function encodeClientSetup(msg: ClientSetup, writer: BufferWriter): void {
|
|
119
|
+
writer.writeVarInt(msg.supportedVersions.length);
|
|
120
|
+
for (const version of msg.supportedVersions) {
|
|
121
|
+
writer.writeVarInt(version);
|
|
122
|
+
}
|
|
123
|
+
writer.writeParameters(msg.parameters);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function encodeServerSetup(msg: ServerSetup, writer: BufferWriter): void {
|
|
127
|
+
writer.writeVarInt(msg.selectedVersion);
|
|
128
|
+
writer.writeParameters(msg.parameters);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function encodeSubscribe(msg: Subscribe, writer: BufferWriter): void {
|
|
132
|
+
writer.writeVarInt(msg.subscribeId);
|
|
133
|
+
writer.writeVarInt(msg.trackAlias);
|
|
134
|
+
writer.writeTuple(msg.trackNamespace);
|
|
135
|
+
writer.writeString(msg.trackName);
|
|
136
|
+
writer.writeUint8(msg.subscriberPriority);
|
|
137
|
+
writeGroupOrder(writer, msg.groupOrder);
|
|
138
|
+
writer.writeVarInt(FILTER_TYPE_TO_WIRE[msg.filterType]);
|
|
139
|
+
if (msg.filterType === "absolute_start" || msg.filterType === "absolute_range") {
|
|
140
|
+
writer.writeVarInt(msg.startGroup!);
|
|
141
|
+
writer.writeVarInt(msg.startObject!);
|
|
142
|
+
}
|
|
143
|
+
if (msg.filterType === "absolute_range") {
|
|
144
|
+
writer.writeVarInt(msg.endGroup!);
|
|
145
|
+
writer.writeVarInt(msg.endObject!);
|
|
146
|
+
}
|
|
147
|
+
writer.writeParameters(msg.parameters);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function encodeSubscribeOk(msg: SubscribeOk, writer: BufferWriter): void {
|
|
151
|
+
writer.writeVarInt(msg.subscribeId);
|
|
152
|
+
writer.writeVarInt(msg.expires);
|
|
153
|
+
writeGroupOrder(writer, msg.groupOrder);
|
|
154
|
+
writer.writeUint8(msg.contentExists ? 1 : 0);
|
|
155
|
+
if (msg.contentExists) {
|
|
156
|
+
writer.writeVarInt(msg.largestGroupId!);
|
|
157
|
+
writer.writeVarInt(msg.largestObjectId!);
|
|
158
|
+
}
|
|
159
|
+
writer.writeParameters(msg.parameters);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function encodeSubscribeError(msg: SubscribeError, writer: BufferWriter): void {
|
|
163
|
+
writer.writeVarInt(msg.subscribeId);
|
|
164
|
+
writer.writeVarInt(msg.errorCode);
|
|
165
|
+
writer.writeString(msg.reasonPhrase);
|
|
166
|
+
writer.writeVarInt(msg.trackAlias);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function encodeSubscribeDone(msg: SubscribeDone, writer: BufferWriter): void {
|
|
170
|
+
writer.writeVarInt(msg.subscribeId);
|
|
171
|
+
writer.writeVarInt(msg.statusCode);
|
|
172
|
+
writer.writeString(msg.reasonPhrase);
|
|
173
|
+
writer.writeUint8(msg.contentExists ? 1 : 0);
|
|
174
|
+
if (msg.contentExists) {
|
|
175
|
+
writer.writeVarInt(msg.finalGroupId!);
|
|
176
|
+
writer.writeVarInt(msg.finalObjectId!);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function encodeSubscribeUpdate(msg: SubscribeUpdate, writer: BufferWriter): void {
|
|
181
|
+
writer.writeVarInt(msg.subscribeId);
|
|
182
|
+
writer.writeVarInt(msg.startGroup);
|
|
183
|
+
writer.writeVarInt(msg.startObject);
|
|
184
|
+
writer.writeVarInt(msg.endGroup);
|
|
185
|
+
writer.writeVarInt(msg.endObject);
|
|
186
|
+
writer.writeUint8(msg.subscriberPriority);
|
|
187
|
+
writer.writeParameters(msg.parameters);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function encodeUnsubscribe(msg: Unsubscribe, writer: BufferWriter): void {
|
|
191
|
+
writer.writeVarInt(msg.subscribeId);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function encodeAnnounce(msg: Announce, writer: BufferWriter): void {
|
|
195
|
+
writer.writeTuple(msg.trackNamespace);
|
|
196
|
+
writer.writeParameters(msg.parameters);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function encodeAnnounceOk(msg: AnnounceOk, writer: BufferWriter): void {
|
|
200
|
+
writer.writeTuple(msg.trackNamespace);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function encodeAnnounceError(msg: AnnounceError, writer: BufferWriter): void {
|
|
204
|
+
writer.writeTuple(msg.trackNamespace);
|
|
205
|
+
writer.writeVarInt(msg.errorCode);
|
|
206
|
+
writer.writeString(msg.reasonPhrase);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function encodeAnnounceCancel(msg: AnnounceCancel, writer: BufferWriter): void {
|
|
210
|
+
writer.writeTuple(msg.trackNamespace);
|
|
211
|
+
writer.writeVarInt(msg.errorCode);
|
|
212
|
+
writer.writeString(msg.reasonPhrase);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function encodeUnannounce(msg: Unannounce, writer: BufferWriter): void {
|
|
216
|
+
writer.writeTuple(msg.trackNamespace);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function encodeTrackStatusRequest(msg: TrackStatusRequest, writer: BufferWriter): void {
|
|
220
|
+
writer.writeTuple(msg.trackNamespace);
|
|
221
|
+
writer.writeString(msg.trackName);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function encodeTrackStatus(msg: TrackStatus, writer: BufferWriter): void {
|
|
225
|
+
writer.writeTuple(msg.trackNamespace);
|
|
226
|
+
writer.writeString(msg.trackName);
|
|
227
|
+
writer.writeVarInt(msg.statusCode);
|
|
228
|
+
writer.writeVarInt(msg.lastGroupId);
|
|
229
|
+
writer.writeVarInt(msg.lastObjectId);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function encodeGoAway(msg: GoAway, writer: BufferWriter): void {
|
|
233
|
+
writer.writeString(msg.newSessionUri);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function encodeSubscribeAnnounces(msg: SubscribeAnnounces, writer: BufferWriter): void {
|
|
237
|
+
writer.writeTuple(msg.trackNamespace);
|
|
238
|
+
writer.writeParameters(msg.parameters);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function encodeSubscribeAnnouncesOk(msg: SubscribeAnnouncesOk, writer: BufferWriter): void {
|
|
242
|
+
writer.writeTuple(msg.trackNamespace);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function encodeSubscribeAnnouncesError(msg: SubscribeAnnouncesError, writer: BufferWriter): void {
|
|
246
|
+
writer.writeTuple(msg.trackNamespace);
|
|
247
|
+
writer.writeVarInt(msg.errorCode);
|
|
248
|
+
writer.writeString(msg.reasonPhrase);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function encodeUnsubscribeAnnounces(msg: UnsubscribeAnnounces, writer: BufferWriter): void {
|
|
252
|
+
writer.writeTuple(msg.trackNamespace);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function encodeMaxSubscribeId(msg: MaxSubscribeId, writer: BufferWriter): void {
|
|
256
|
+
writer.writeVarInt(msg.subscribeId);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function encodeFetch(msg: Fetch, writer: BufferWriter): void {
|
|
260
|
+
writer.writeVarInt(msg.subscribeId);
|
|
261
|
+
writer.writeTuple(msg.trackNamespace);
|
|
262
|
+
writer.writeString(msg.trackName);
|
|
263
|
+
writer.writeUint8(msg.subscriberPriority);
|
|
264
|
+
writeGroupOrder(writer, msg.groupOrder);
|
|
265
|
+
writer.writeVarInt(msg.startGroup);
|
|
266
|
+
writer.writeVarInt(msg.startObject);
|
|
267
|
+
writer.writeVarInt(msg.endGroup);
|
|
268
|
+
writer.writeVarInt(msg.endObject);
|
|
269
|
+
writer.writeParameters(msg.parameters);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function encodeFetchOk(msg: FetchOk, writer: BufferWriter): void {
|
|
273
|
+
writer.writeVarInt(msg.subscribeId);
|
|
274
|
+
writeGroupOrder(writer, msg.groupOrder);
|
|
275
|
+
writer.writeUint8(msg.endOfTrack ? 1 : 0);
|
|
276
|
+
writer.writeVarInt(msg.largestGroupId);
|
|
277
|
+
writer.writeVarInt(msg.largestObjectId);
|
|
278
|
+
writer.writeParameters(msg.parameters);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function encodeFetchError(msg: FetchError, writer: BufferWriter): void {
|
|
282
|
+
writer.writeVarInt(msg.subscribeId);
|
|
283
|
+
writer.writeVarInt(msg.errorCode);
|
|
284
|
+
writer.writeString(msg.reasonPhrase);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function encodeFetchCancel(msg: FetchCancel, writer: BufferWriter): void {
|
|
288
|
+
writer.writeVarInt(msg.subscribeId);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Data stream encoders (no type+length framing)
|
|
292
|
+
function encodeObjectPayload(
|
|
293
|
+
msg: { objectStatus?: number; payload: Uint8Array },
|
|
294
|
+
writer: BufferWriter,
|
|
295
|
+
): void {
|
|
296
|
+
if (msg.payload.byteLength === 0) {
|
|
297
|
+
writer.writeVarInt(0); // payloadLength = 0 signals objectStatus follows
|
|
298
|
+
writer.writeVarInt(msg.objectStatus ?? 0);
|
|
299
|
+
} else {
|
|
300
|
+
writer.writeVarInt(msg.payload.byteLength);
|
|
301
|
+
writer.writeBytes(msg.payload);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function encodeObjectDatagram(msg: ObjectDatagram, writer: BufferWriter): void {
|
|
306
|
+
writer.writeVarInt(MESSAGE_TYPE_IDS.object_datagram);
|
|
307
|
+
writer.writeVarInt(msg.trackAlias);
|
|
308
|
+
writer.writeVarInt(msg.groupId);
|
|
309
|
+
writer.writeVarInt(msg.objectId);
|
|
310
|
+
writer.writeUint8(msg.publisherPriority);
|
|
311
|
+
encodeObjectPayload(msg, writer);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// --- Encode dispatch ---
|
|
315
|
+
|
|
316
|
+
// Control message encoders (payload-only, framing added by encodeMessageImpl)
|
|
317
|
+
const controlEncoders: Record<ControlMessageType, (msg: never, writer: BufferWriter) => void> = {
|
|
318
|
+
client_setup: encodeClientSetup as (msg: never, writer: BufferWriter) => void,
|
|
319
|
+
server_setup: encodeServerSetup as (msg: never, writer: BufferWriter) => void,
|
|
320
|
+
subscribe: encodeSubscribe as (msg: never, writer: BufferWriter) => void,
|
|
321
|
+
subscribe_ok: encodeSubscribeOk as (msg: never, writer: BufferWriter) => void,
|
|
322
|
+
subscribe_error: encodeSubscribeError as (msg: never, writer: BufferWriter) => void,
|
|
323
|
+
subscribe_done: encodeSubscribeDone as (msg: never, writer: BufferWriter) => void,
|
|
324
|
+
subscribe_update: encodeSubscribeUpdate as (msg: never, writer: BufferWriter) => void,
|
|
325
|
+
unsubscribe: encodeUnsubscribe as (msg: never, writer: BufferWriter) => void,
|
|
326
|
+
announce: encodeAnnounce as (msg: never, writer: BufferWriter) => void,
|
|
327
|
+
announce_ok: encodeAnnounceOk as (msg: never, writer: BufferWriter) => void,
|
|
328
|
+
announce_error: encodeAnnounceError as (msg: never, writer: BufferWriter) => void,
|
|
329
|
+
announce_cancel: encodeAnnounceCancel as (msg: never, writer: BufferWriter) => void,
|
|
330
|
+
unannounce: encodeUnannounce as (msg: never, writer: BufferWriter) => void,
|
|
331
|
+
track_status_request: encodeTrackStatusRequest as (msg: never, writer: BufferWriter) => void,
|
|
332
|
+
track_status: encodeTrackStatus as (msg: never, writer: BufferWriter) => void,
|
|
333
|
+
goaway: encodeGoAway as (msg: never, writer: BufferWriter) => void,
|
|
334
|
+
subscribe_announces: encodeSubscribeAnnounces as (msg: never, writer: BufferWriter) => void,
|
|
335
|
+
subscribe_announces_ok: encodeSubscribeAnnouncesOk as (msg: never, writer: BufferWriter) => void,
|
|
336
|
+
subscribe_announces_error: encodeSubscribeAnnouncesError as (
|
|
337
|
+
msg: never,
|
|
338
|
+
writer: BufferWriter,
|
|
339
|
+
) => void,
|
|
340
|
+
unsubscribe_announces: encodeUnsubscribeAnnounces as (msg: never, writer: BufferWriter) => void,
|
|
341
|
+
max_subscribe_id: encodeMaxSubscribeId as (msg: never, writer: BufferWriter) => void,
|
|
342
|
+
fetch: encodeFetch as (msg: never, writer: BufferWriter) => void,
|
|
343
|
+
fetch_ok: encodeFetchOk as (msg: never, writer: BufferWriter) => void,
|
|
344
|
+
fetch_error: encodeFetchError as (msg: never, writer: BufferWriter) => void,
|
|
345
|
+
fetch_cancel: encodeFetchCancel as (msg: never, writer: BufferWriter) => void,
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
// Data stream encoders (write type + fields directly, no length framing)
|
|
349
|
+
const dataStreamEncoders: Partial<
|
|
350
|
+
Record<MoqtMessageType, (msg: never, writer: BufferWriter) => void>
|
|
351
|
+
> = {
|
|
352
|
+
object_datagram: encodeObjectDatagram as (msg: never, writer: BufferWriter) => void,
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
// --- Decode functions for each message type ---
|
|
356
|
+
|
|
357
|
+
function decodeClientSetup(reader: BufferReader): ClientSetup {
|
|
358
|
+
const numVersions = reader.readVarInt();
|
|
359
|
+
if (numVersions === 0n) {
|
|
360
|
+
throw new DecodeError(
|
|
361
|
+
"CONSTRAINT_VIOLATION",
|
|
362
|
+
"supported_versions must not be empty",
|
|
363
|
+
reader.offset,
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
const supportedVersions: bigint[] = [];
|
|
367
|
+
for (let i = 0n; i < numVersions; i++) {
|
|
368
|
+
supportedVersions.push(reader.readVarInt());
|
|
369
|
+
}
|
|
370
|
+
const parameters = reader.readParameters();
|
|
371
|
+
return { type: "client_setup", supportedVersions, parameters };
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function decodeServerSetup(reader: BufferReader): ServerSetup {
|
|
375
|
+
const selectedVersion = reader.readVarInt();
|
|
376
|
+
const parameters = reader.readParameters();
|
|
377
|
+
return { type: "server_setup", selectedVersion, parameters };
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function decodeSubscribe(reader: BufferReader): Subscribe {
|
|
381
|
+
const subscribeId = reader.readVarInt();
|
|
382
|
+
const trackAlias = reader.readVarInt();
|
|
383
|
+
const trackNamespace = reader.readTuple();
|
|
384
|
+
const trackName = reader.readString();
|
|
385
|
+
const subscriberPriority = reader.readUint8();
|
|
386
|
+
const groupOrder = readGroupOrder(reader);
|
|
387
|
+
const filterTypeWire = reader.readVarInt();
|
|
388
|
+
const filterType = WIRE_TO_FILTER_TYPE.get(filterTypeWire);
|
|
389
|
+
if (filterType === undefined) {
|
|
390
|
+
throw new DecodeError(
|
|
391
|
+
"CONSTRAINT_VIOLATION",
|
|
392
|
+
`Invalid filter type: ${filterTypeWire}`,
|
|
393
|
+
reader.offset,
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const base = {
|
|
398
|
+
type: "subscribe" as const,
|
|
399
|
+
subscribeId,
|
|
400
|
+
trackAlias,
|
|
401
|
+
trackNamespace,
|
|
402
|
+
trackName,
|
|
403
|
+
subscriberPriority,
|
|
404
|
+
groupOrder,
|
|
405
|
+
filterType,
|
|
406
|
+
parameters: undefined as unknown as Map<bigint, Uint8Array>,
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
if (filterType === "absolute_start") {
|
|
410
|
+
const startGroup = reader.readVarInt();
|
|
411
|
+
const startObject = reader.readVarInt();
|
|
412
|
+
base.parameters = reader.readParameters();
|
|
413
|
+
return { ...base, startGroup, startObject };
|
|
414
|
+
}
|
|
415
|
+
if (filterType === "absolute_range") {
|
|
416
|
+
const startGroup = reader.readVarInt();
|
|
417
|
+
const startObject = reader.readVarInt();
|
|
418
|
+
const endGroup = reader.readVarInt();
|
|
419
|
+
const endObject = reader.readVarInt();
|
|
420
|
+
base.parameters = reader.readParameters();
|
|
421
|
+
return { ...base, startGroup, startObject, endGroup, endObject };
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
base.parameters = reader.readParameters();
|
|
425
|
+
return base;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function decodeSubscribeOk(reader: BufferReader): SubscribeOk {
|
|
429
|
+
const subscribeId = reader.readVarInt();
|
|
430
|
+
const expires = reader.readVarInt();
|
|
431
|
+
const groupOrder = readGroupOrder(reader);
|
|
432
|
+
const contentExistsWire = reader.readUint8();
|
|
433
|
+
const contentExists = contentExistsWire !== 0;
|
|
434
|
+
|
|
435
|
+
if (contentExists) {
|
|
436
|
+
const largestGroupId = reader.readVarInt();
|
|
437
|
+
const largestObjectId = reader.readVarInt();
|
|
438
|
+
const parameters = reader.readParameters();
|
|
439
|
+
return {
|
|
440
|
+
type: "subscribe_ok" as const,
|
|
441
|
+
subscribeId,
|
|
442
|
+
expires,
|
|
443
|
+
groupOrder,
|
|
444
|
+
contentExists,
|
|
445
|
+
largestGroupId,
|
|
446
|
+
largestObjectId,
|
|
447
|
+
parameters,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const parameters = reader.readParameters();
|
|
452
|
+
return {
|
|
453
|
+
type: "subscribe_ok" as const,
|
|
454
|
+
subscribeId,
|
|
455
|
+
expires,
|
|
456
|
+
groupOrder,
|
|
457
|
+
contentExists,
|
|
458
|
+
parameters,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function decodeSubscribeError(reader: BufferReader): SubscribeError {
|
|
463
|
+
const subscribeId = reader.readVarInt();
|
|
464
|
+
const errorCode = reader.readVarInt();
|
|
465
|
+
const reasonPhrase = reader.readString();
|
|
466
|
+
const trackAlias = reader.readVarInt();
|
|
467
|
+
return { type: "subscribe_error", subscribeId, errorCode, reasonPhrase, trackAlias };
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function decodeSubscribeDone(reader: BufferReader): SubscribeDone {
|
|
471
|
+
const subscribeId = reader.readVarInt();
|
|
472
|
+
const statusCode = reader.readVarInt();
|
|
473
|
+
const reasonPhrase = reader.readString();
|
|
474
|
+
const contentExistsWire = reader.readUint8();
|
|
475
|
+
const contentExists = contentExistsWire !== 0;
|
|
476
|
+
|
|
477
|
+
if (contentExists) {
|
|
478
|
+
const finalGroupId = reader.readVarInt();
|
|
479
|
+
const finalObjectId = reader.readVarInt();
|
|
480
|
+
return {
|
|
481
|
+
type: "subscribe_done" as const,
|
|
482
|
+
subscribeId,
|
|
483
|
+
statusCode,
|
|
484
|
+
reasonPhrase,
|
|
485
|
+
contentExists,
|
|
486
|
+
finalGroupId,
|
|
487
|
+
finalObjectId,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return { type: "subscribe_done" as const, subscribeId, statusCode, reasonPhrase, contentExists };
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
function decodeSubscribeUpdate(reader: BufferReader): SubscribeUpdate {
|
|
495
|
+
const subscribeId = reader.readVarInt();
|
|
496
|
+
const startGroup = reader.readVarInt();
|
|
497
|
+
const startObject = reader.readVarInt();
|
|
498
|
+
const endGroup = reader.readVarInt();
|
|
499
|
+
const endObject = reader.readVarInt();
|
|
500
|
+
const subscriberPriority = reader.readUint8();
|
|
501
|
+
const parameters = reader.readParameters();
|
|
502
|
+
return {
|
|
503
|
+
type: "subscribe_update",
|
|
504
|
+
subscribeId,
|
|
505
|
+
startGroup,
|
|
506
|
+
startObject,
|
|
507
|
+
endGroup,
|
|
508
|
+
endObject,
|
|
509
|
+
subscriberPriority,
|
|
510
|
+
parameters,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function decodeUnsubscribe(reader: BufferReader): Unsubscribe {
|
|
515
|
+
const subscribeId = reader.readVarInt();
|
|
516
|
+
return { type: "unsubscribe", subscribeId };
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function decodeAnnounce(reader: BufferReader): Announce {
|
|
520
|
+
const trackNamespace = reader.readTuple();
|
|
521
|
+
const parameters = reader.readParameters();
|
|
522
|
+
return { type: "announce", trackNamespace, parameters };
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function decodeAnnounceOk(reader: BufferReader): AnnounceOk {
|
|
526
|
+
const trackNamespace = reader.readTuple();
|
|
527
|
+
return { type: "announce_ok", trackNamespace };
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
function decodeAnnounceError(reader: BufferReader): AnnounceError {
|
|
531
|
+
const trackNamespace = reader.readTuple();
|
|
532
|
+
const errorCode = reader.readVarInt();
|
|
533
|
+
const reasonPhrase = reader.readString();
|
|
534
|
+
return { type: "announce_error", trackNamespace, errorCode, reasonPhrase };
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
function decodeAnnounceCancel(reader: BufferReader): AnnounceCancel {
|
|
538
|
+
const trackNamespace = reader.readTuple();
|
|
539
|
+
const errorCode = reader.readVarInt();
|
|
540
|
+
const reasonPhrase = reader.readString();
|
|
541
|
+
return { type: "announce_cancel", trackNamespace, errorCode, reasonPhrase };
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function decodeUnannounce(reader: BufferReader): Unannounce {
|
|
545
|
+
const trackNamespace = reader.readTuple();
|
|
546
|
+
return { type: "unannounce", trackNamespace };
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function decodeTrackStatusRequest(reader: BufferReader): TrackStatusRequest {
|
|
550
|
+
const trackNamespace = reader.readTuple();
|
|
551
|
+
const trackName = reader.readString();
|
|
552
|
+
return { type: "track_status_request", trackNamespace, trackName };
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
function decodeTrackStatus(reader: BufferReader): TrackStatus {
|
|
556
|
+
const trackNamespace = reader.readTuple();
|
|
557
|
+
const trackName = reader.readString();
|
|
558
|
+
const statusCode = reader.readVarInt();
|
|
559
|
+
const lastGroupId = reader.readVarInt();
|
|
560
|
+
const lastObjectId = reader.readVarInt();
|
|
561
|
+
return { type: "track_status", trackNamespace, trackName, statusCode, lastGroupId, lastObjectId };
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
function decodeGoAway(reader: BufferReader): GoAway {
|
|
565
|
+
const newSessionUri = reader.readString();
|
|
566
|
+
return { type: "goaway", newSessionUri };
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
function decodeSubscribeAnnounces(reader: BufferReader): SubscribeAnnounces {
|
|
570
|
+
const trackNamespace = reader.readTuple();
|
|
571
|
+
const parameters = reader.readParameters();
|
|
572
|
+
return { type: "subscribe_announces", trackNamespace, parameters };
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function decodeSubscribeAnnouncesOk(reader: BufferReader): SubscribeAnnouncesOk {
|
|
576
|
+
const trackNamespace = reader.readTuple();
|
|
577
|
+
return { type: "subscribe_announces_ok", trackNamespace };
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
function decodeSubscribeAnnouncesError(reader: BufferReader): SubscribeAnnouncesError {
|
|
581
|
+
const trackNamespace = reader.readTuple();
|
|
582
|
+
const errorCode = reader.readVarInt();
|
|
583
|
+
const reasonPhrase = reader.readString();
|
|
584
|
+
return { type: "subscribe_announces_error", trackNamespace, errorCode, reasonPhrase };
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function decodeUnsubscribeAnnounces(reader: BufferReader): UnsubscribeAnnounces {
|
|
588
|
+
const trackNamespace = reader.readTuple();
|
|
589
|
+
return { type: "unsubscribe_announces", trackNamespace };
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
function decodeMaxSubscribeId(reader: BufferReader): MaxSubscribeId {
|
|
593
|
+
const subscribeId = reader.readVarInt();
|
|
594
|
+
return { type: "max_subscribe_id", subscribeId };
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
function decodeFetch(reader: BufferReader): Fetch {
|
|
598
|
+
const subscribeId = reader.readVarInt();
|
|
599
|
+
const trackNamespace = reader.readTuple();
|
|
600
|
+
const trackName = reader.readString();
|
|
601
|
+
const subscriberPriority = reader.readUint8();
|
|
602
|
+
const groupOrder = readGroupOrder(reader);
|
|
603
|
+
const startGroup = reader.readVarInt();
|
|
604
|
+
const startObject = reader.readVarInt();
|
|
605
|
+
const endGroup = reader.readVarInt();
|
|
606
|
+
const endObject = reader.readVarInt();
|
|
607
|
+
const parameters = reader.readParameters();
|
|
608
|
+
return {
|
|
609
|
+
type: "fetch" as const,
|
|
610
|
+
subscribeId,
|
|
611
|
+
trackNamespace,
|
|
612
|
+
trackName,
|
|
613
|
+
subscriberPriority,
|
|
614
|
+
groupOrder,
|
|
615
|
+
startGroup,
|
|
616
|
+
startObject,
|
|
617
|
+
endGroup,
|
|
618
|
+
endObject,
|
|
619
|
+
parameters,
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
function decodeFetchOk(reader: BufferReader): FetchOk {
|
|
624
|
+
const subscribeId = reader.readVarInt();
|
|
625
|
+
const groupOrder = readGroupOrder(reader);
|
|
626
|
+
const endOfTrackWire = reader.readUint8();
|
|
627
|
+
const endOfTrack = endOfTrackWire !== 0;
|
|
628
|
+
const largestGroupId = reader.readVarInt();
|
|
629
|
+
const largestObjectId = reader.readVarInt();
|
|
630
|
+
const parameters = reader.readParameters();
|
|
631
|
+
return {
|
|
632
|
+
type: "fetch_ok" as const,
|
|
633
|
+
subscribeId,
|
|
634
|
+
groupOrder,
|
|
635
|
+
endOfTrack,
|
|
636
|
+
largestGroupId,
|
|
637
|
+
largestObjectId,
|
|
638
|
+
parameters,
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
function decodeFetchError(reader: BufferReader): FetchError {
|
|
643
|
+
const subscribeId = reader.readVarInt();
|
|
644
|
+
const errorCode = reader.readVarInt();
|
|
645
|
+
const reasonPhrase = reader.readString();
|
|
646
|
+
return { type: "fetch_error", subscribeId, errorCode, reasonPhrase };
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
function decodeFetchCancel(reader: BufferReader): FetchCancel {
|
|
650
|
+
const subscribeId = reader.readVarInt();
|
|
651
|
+
return { type: "fetch_cancel", subscribeId };
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
function decodeObjectDatagram(reader: BufferReader): ObjectDatagram {
|
|
655
|
+
const trackAlias = reader.readVarInt();
|
|
656
|
+
const groupId = reader.readVarInt();
|
|
657
|
+
const objectId = reader.readVarInt();
|
|
658
|
+
const publisherPriority = reader.readUint8();
|
|
659
|
+
const payloadLength = Number(reader.readVarInt());
|
|
660
|
+
if (payloadLength === 0) {
|
|
661
|
+
// Object Status follows when payload length is 0
|
|
662
|
+
const objectStatus = reader.remaining > 0 ? Number(reader.readVarInt()) : 0;
|
|
663
|
+
return {
|
|
664
|
+
type: "object_datagram" as const,
|
|
665
|
+
trackAlias,
|
|
666
|
+
groupId,
|
|
667
|
+
objectId,
|
|
668
|
+
publisherPriority,
|
|
669
|
+
objectStatus,
|
|
670
|
+
payload: new Uint8Array(0),
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
const payload = reader.readBytes(payloadLength);
|
|
674
|
+
return {
|
|
675
|
+
type: "object_datagram" as const,
|
|
676
|
+
trackAlias,
|
|
677
|
+
groupId,
|
|
678
|
+
objectId,
|
|
679
|
+
publisherPriority,
|
|
680
|
+
payload,
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
// --- Decode dispatch by wire type ID (control messages only) ---
|
|
686
|
+
|
|
687
|
+
type Decoder = (reader: BufferReader) => MoqtMessage;
|
|
688
|
+
|
|
689
|
+
const controlDecoders = new Map<bigint, Decoder>([
|
|
690
|
+
[MESSAGE_TYPE_IDS.client_setup, decodeClientSetup],
|
|
691
|
+
[MESSAGE_TYPE_IDS.server_setup, decodeServerSetup],
|
|
692
|
+
[MESSAGE_TYPE_IDS.subscribe, decodeSubscribe],
|
|
693
|
+
[MESSAGE_TYPE_IDS.subscribe_ok, decodeSubscribeOk],
|
|
694
|
+
[MESSAGE_TYPE_IDS.subscribe_error, decodeSubscribeError],
|
|
695
|
+
[MESSAGE_TYPE_IDS.subscribe_done, decodeSubscribeDone],
|
|
696
|
+
[MESSAGE_TYPE_IDS.subscribe_update, decodeSubscribeUpdate],
|
|
697
|
+
[MESSAGE_TYPE_IDS.unsubscribe, decodeUnsubscribe],
|
|
698
|
+
[MESSAGE_TYPE_IDS.announce, decodeAnnounce],
|
|
699
|
+
[MESSAGE_TYPE_IDS.announce_ok, decodeAnnounceOk],
|
|
700
|
+
[MESSAGE_TYPE_IDS.announce_error, decodeAnnounceError],
|
|
701
|
+
[MESSAGE_TYPE_IDS.announce_cancel, decodeAnnounceCancel],
|
|
702
|
+
[MESSAGE_TYPE_IDS.unannounce, decodeUnannounce],
|
|
703
|
+
[MESSAGE_TYPE_IDS.track_status_request, decodeTrackStatusRequest],
|
|
704
|
+
[MESSAGE_TYPE_IDS.track_status, decodeTrackStatus],
|
|
705
|
+
[MESSAGE_TYPE_IDS.goaway, decodeGoAway],
|
|
706
|
+
[MESSAGE_TYPE_IDS.subscribe_announces, decodeSubscribeAnnounces],
|
|
707
|
+
[MESSAGE_TYPE_IDS.subscribe_announces_ok, decodeSubscribeAnnouncesOk],
|
|
708
|
+
[MESSAGE_TYPE_IDS.subscribe_announces_error, decodeSubscribeAnnouncesError],
|
|
709
|
+
[MESSAGE_TYPE_IDS.unsubscribe_announces, decodeUnsubscribeAnnounces],
|
|
710
|
+
[MESSAGE_TYPE_IDS.max_subscribe_id, decodeMaxSubscribeId],
|
|
711
|
+
[MESSAGE_TYPE_IDS.fetch, decodeFetch],
|
|
712
|
+
[MESSAGE_TYPE_IDS.fetch_ok, decodeFetchOk],
|
|
713
|
+
[MESSAGE_TYPE_IDS.fetch_error, decodeFetchError],
|
|
714
|
+
[MESSAGE_TYPE_IDS.fetch_cancel, decodeFetchCancel],
|
|
715
|
+
]);
|
|
716
|
+
|
|
717
|
+
// Data stream decoders keyed by wire ID (for disambiguation)
|
|
718
|
+
const dataStreamDecoders = new Map<bigint, Decoder>([
|
|
719
|
+
[MESSAGE_TYPE_IDS.object_datagram, decodeObjectDatagram],
|
|
720
|
+
]);
|
|
721
|
+
|
|
722
|
+
// --- Message type to wire ID mapping ---
|
|
723
|
+
const MESSAGE_TYPE_TO_WIRE: Record<ControlMessageType, bigint> = {
|
|
724
|
+
client_setup: MESSAGE_TYPE_IDS.client_setup,
|
|
725
|
+
server_setup: MESSAGE_TYPE_IDS.server_setup,
|
|
726
|
+
subscribe: MESSAGE_TYPE_IDS.subscribe,
|
|
727
|
+
subscribe_ok: MESSAGE_TYPE_IDS.subscribe_ok,
|
|
728
|
+
subscribe_error: MESSAGE_TYPE_IDS.subscribe_error,
|
|
729
|
+
subscribe_done: MESSAGE_TYPE_IDS.subscribe_done,
|
|
730
|
+
subscribe_update: MESSAGE_TYPE_IDS.subscribe_update,
|
|
731
|
+
unsubscribe: MESSAGE_TYPE_IDS.unsubscribe,
|
|
732
|
+
announce: MESSAGE_TYPE_IDS.announce,
|
|
733
|
+
announce_ok: MESSAGE_TYPE_IDS.announce_ok,
|
|
734
|
+
announce_error: MESSAGE_TYPE_IDS.announce_error,
|
|
735
|
+
announce_cancel: MESSAGE_TYPE_IDS.announce_cancel,
|
|
736
|
+
unannounce: MESSAGE_TYPE_IDS.unannounce,
|
|
737
|
+
track_status_request: MESSAGE_TYPE_IDS.track_status_request,
|
|
738
|
+
track_status: MESSAGE_TYPE_IDS.track_status,
|
|
739
|
+
goaway: MESSAGE_TYPE_IDS.goaway,
|
|
740
|
+
subscribe_announces: MESSAGE_TYPE_IDS.subscribe_announces,
|
|
741
|
+
subscribe_announces_ok: MESSAGE_TYPE_IDS.subscribe_announces_ok,
|
|
742
|
+
subscribe_announces_error: MESSAGE_TYPE_IDS.subscribe_announces_error,
|
|
743
|
+
unsubscribe_announces: MESSAGE_TYPE_IDS.unsubscribe_announces,
|
|
744
|
+
max_subscribe_id: MESSAGE_TYPE_IDS.max_subscribe_id,
|
|
745
|
+
fetch: MESSAGE_TYPE_IDS.fetch,
|
|
746
|
+
fetch_ok: MESSAGE_TYPE_IDS.fetch_ok,
|
|
747
|
+
fetch_error: MESSAGE_TYPE_IDS.fetch_error,
|
|
748
|
+
fetch_cancel: MESSAGE_TYPE_IDS.fetch_cancel,
|
|
749
|
+
};
|
|
750
|
+
|
|
751
|
+
// --- Public codec API ---
|
|
752
|
+
|
|
753
|
+
function encodeMessageImpl(message: MoqtMessage): Uint8Array {
|
|
754
|
+
// Check if it's a data stream message (no type+length framing)
|
|
755
|
+
const dataEncoder = dataStreamEncoders[message.type];
|
|
756
|
+
if (dataEncoder) {
|
|
757
|
+
const writer = new BufferWriter();
|
|
758
|
+
dataEncoder(message as never, writer);
|
|
759
|
+
return writer.finish();
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
// Control message: type + length + payload framing
|
|
763
|
+
const controlEncoder = controlEncoders[message.type as ControlMessageType];
|
|
764
|
+
if (!controlEncoder) {
|
|
765
|
+
throw new Error(`Unknown message type: ${message.type}`);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// Encode payload first
|
|
769
|
+
const payloadWriter = new BufferWriter();
|
|
770
|
+
controlEncoder(message as never, payloadWriter);
|
|
771
|
+
const payload = payloadWriter.finish();
|
|
772
|
+
|
|
773
|
+
// Write type + length + payload
|
|
774
|
+
const frameWriter = new BufferWriter();
|
|
775
|
+
frameWriter.writeVarInt(MESSAGE_TYPE_TO_WIRE[message.type as ControlMessageType]);
|
|
776
|
+
frameWriter.writeVarInt(payload.byteLength);
|
|
777
|
+
frameWriter.writeBytes(payload);
|
|
778
|
+
return frameWriter.finish();
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
function decodeMessageImpl(bytes: Uint8Array): DecodeResult<MoqtMessage> {
|
|
782
|
+
try {
|
|
783
|
+
const reader = new BufferReader(bytes, 0);
|
|
784
|
+
const typeId = reader.readVarInt();
|
|
785
|
+
|
|
786
|
+
// Check if this is a data stream type (no length framing)
|
|
787
|
+
if (DATA_STREAM_TYPE_IDS.has(typeId)) {
|
|
788
|
+
const decoder = dataStreamDecoders.get(typeId);
|
|
789
|
+
if (!decoder) {
|
|
790
|
+
return {
|
|
791
|
+
ok: false,
|
|
792
|
+
error: new DecodeError(
|
|
793
|
+
"UNKNOWN_MESSAGE_TYPE",
|
|
794
|
+
`Unknown data stream type ID: 0x${typeId.toString(16)}`,
|
|
795
|
+
0,
|
|
796
|
+
),
|
|
797
|
+
};
|
|
798
|
+
}
|
|
799
|
+
const message = decoder(reader);
|
|
800
|
+
return { ok: true, value: message, bytesRead: reader.offset };
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
// Control message: read length, then decode payload from bounded sub-reader
|
|
804
|
+
const payloadLength = Number(reader.readVarInt());
|
|
805
|
+
const _headerBytes = reader.offset; // bytes consumed by type + length
|
|
806
|
+
|
|
807
|
+
if (reader.remaining < payloadLength) {
|
|
808
|
+
return {
|
|
809
|
+
ok: false,
|
|
810
|
+
error: new DecodeError(
|
|
811
|
+
"UNEXPECTED_END",
|
|
812
|
+
`Not enough bytes for payload: need ${payloadLength}, have ${reader.remaining}`,
|
|
813
|
+
reader.offset,
|
|
814
|
+
),
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
const payloadBytes = reader.readBytes(payloadLength);
|
|
819
|
+
const totalBytesRead = reader.offset;
|
|
820
|
+
|
|
821
|
+
const decoder = controlDecoders.get(typeId);
|
|
822
|
+
if (!decoder) {
|
|
823
|
+
return {
|
|
824
|
+
ok: false,
|
|
825
|
+
error: new DecodeError(
|
|
826
|
+
"UNKNOWN_MESSAGE_TYPE",
|
|
827
|
+
`Unknown message type ID: 0x${typeId.toString(16)}`,
|
|
828
|
+
0,
|
|
829
|
+
),
|
|
830
|
+
};
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
const payloadReader = new BufferReader(payloadBytes, 0);
|
|
834
|
+
const message = decoder(payloadReader);
|
|
835
|
+
return { ok: true, value: message, bytesRead: totalBytesRead };
|
|
836
|
+
} catch (e) {
|
|
837
|
+
if (e instanceof DecodeError) {
|
|
838
|
+
return { ok: false, error: e };
|
|
839
|
+
}
|
|
840
|
+
throw e;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
function createStreamDecoderImpl(): TransformStream<Uint8Array, MoqtMessage> {
|
|
845
|
+
let buffer = new Uint8Array(0);
|
|
846
|
+
|
|
847
|
+
return new TransformStream<Uint8Array, MoqtMessage>({
|
|
848
|
+
transform(chunk, controller) {
|
|
849
|
+
// Accumulate incoming data
|
|
850
|
+
const newBuffer = new Uint8Array(buffer.length + chunk.length);
|
|
851
|
+
newBuffer.set(buffer, 0);
|
|
852
|
+
newBuffer.set(chunk, buffer.length);
|
|
853
|
+
buffer = newBuffer;
|
|
854
|
+
|
|
855
|
+
// Try to decode messages from the buffer
|
|
856
|
+
while (buffer.length > 0) {
|
|
857
|
+
const result = decodeMessageImpl(buffer);
|
|
858
|
+
if (!result.ok) {
|
|
859
|
+
if (result.error.code === "UNEXPECTED_END") {
|
|
860
|
+
// Need more data -- wait for next chunk
|
|
861
|
+
break;
|
|
862
|
+
}
|
|
863
|
+
// Fatal decode error
|
|
864
|
+
controller.error(result.error);
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
controller.enqueue(result.value);
|
|
868
|
+
// Advance the buffer past the consumed bytes
|
|
869
|
+
buffer = buffer.slice(result.bytesRead);
|
|
870
|
+
}
|
|
871
|
+
},
|
|
872
|
+
|
|
873
|
+
flush(controller) {
|
|
874
|
+
// If there is remaining data in the buffer, it is a truncated message
|
|
875
|
+
if (buffer.length > 0) {
|
|
876
|
+
controller.error(
|
|
877
|
+
new DecodeError("UNEXPECTED_END", "Stream ended with incomplete message data", 0),
|
|
878
|
+
);
|
|
879
|
+
}
|
|
880
|
+
},
|
|
881
|
+
});
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// ─── Data stream encode/decode (re-exported from data-streams.ts) ─────────────
|
|
885
|
+
|
|
886
|
+
export {
|
|
887
|
+
encodeSubgroupStream,
|
|
888
|
+
encodeDatagram,
|
|
889
|
+
encodeFetchStream,
|
|
890
|
+
decodeSubgroupStream,
|
|
891
|
+
decodeDatagram,
|
|
892
|
+
decodeFetchStream,
|
|
893
|
+
} from "./data-streams.js";
|
|
894
|
+
|
|
895
|
+
import {
|
|
896
|
+
encodeSubgroupStream,
|
|
897
|
+
encodeDatagram,
|
|
898
|
+
encodeFetchStream,
|
|
899
|
+
decodeSubgroupStream,
|
|
900
|
+
decodeDatagram,
|
|
901
|
+
decodeFetchStream,
|
|
902
|
+
} from "./data-streams.js";
|
|
903
|
+
|
|
904
|
+
// --- Factory ---
|
|
905
|
+
|
|
906
|
+
export interface Draft07Codec extends Codec {
|
|
907
|
+
encodeSubgroupStream(stream: SubgroupStream): Uint8Array;
|
|
908
|
+
decodeSubgroupStream(bytes: Uint8Array): DecodeResult<SubgroupStream>;
|
|
909
|
+
encodeDatagram(dg: Draft07DatagramObject): Uint8Array;
|
|
910
|
+
decodeDatagram(bytes: Uint8Array): DecodeResult<Draft07DatagramObject>;
|
|
911
|
+
encodeFetchStream(stream: FetchStream): Uint8Array;
|
|
912
|
+
decodeFetchStream(bytes: Uint8Array): DecodeResult<FetchStream>;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
export function createDraft07Codec(): Draft07Codec {
|
|
916
|
+
return {
|
|
917
|
+
draft: "draft-ietf-moq-transport-07",
|
|
918
|
+
encodeMessage: encodeMessageImpl,
|
|
919
|
+
decodeMessage: decodeMessageImpl,
|
|
920
|
+
encodeVarInt,
|
|
921
|
+
decodeVarInt,
|
|
922
|
+
createStreamDecoder: createStreamDecoderImpl,
|
|
923
|
+
encodeSubgroupStream,
|
|
924
|
+
decodeSubgroupStream,
|
|
925
|
+
encodeDatagram,
|
|
926
|
+
decodeDatagram,
|
|
927
|
+
encodeFetchStream,
|
|
928
|
+
decodeFetchStream,
|
|
929
|
+
};
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
// Export data-stream decoder map for callers that need to disambiguate
|
|
933
|
+
export { dataStreamDecoders };
|