@moqtap/codec 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +16 -4
  3. package/dist/chunk-BMJMY6FX.cjs +868 -0
  4. package/dist/chunk-MAXEHYVB.cjs +2362 -0
  5. package/dist/{chunk-3YAR3I3S.js → chunk-Q7NSUXXB.js} +3 -1
  6. package/dist/{chunk-VWXUT5R2.cjs → chunk-TVSFDQYE.cjs} +3 -1
  7. package/dist/chunk-WX5PU7HF.js +868 -0
  8. package/dist/chunk-YJGOD3Y4.js +2362 -0
  9. package/dist/{codec-BLYAy2OP.d.ts → codec--CVeqGQv.d.ts} +1 -1
  10. package/dist/{codec-DujHf55Z.d.ts → codec-BJ7BHuiZ.d.ts} +1 -1
  11. package/dist/{codec-D47r_-Rl.d.ts → codec-BKsVu3Fr.d.ts} +1 -1
  12. package/dist/{codec-BNS3gS77.d.ts → codec-BMwgZIgG.d.ts} +1 -1
  13. package/dist/{codec-CI0BjmHc.d.ts → codec-BNy5syCU.d.ts} +1 -1
  14. package/dist/{codec-v6Vloc7H.d.ts → codec-BQa6Qsav.d.ts} +1 -1
  15. package/dist/codec-Bym-K2q2.d.cts +49 -0
  16. package/dist/{codec-D2JbI2tp.d.ts → codec-C006F75E.d.ts} +1 -1
  17. package/dist/codec-C5evFHL-.d.ts +49 -0
  18. package/dist/{codec-DQWQSam3.d.cts → codec-C6Mx4bwz.d.cts} +1 -1
  19. package/dist/{codec-DL0njGkL.d.ts → codec-CA6nbbEk.d.ts} +1 -1
  20. package/dist/{codec-D89DWXbv.d.cts → codec-CSBFdPgP.d.cts} +1 -1
  21. package/dist/{codec-DvcJgYKq.d.cts → codec-CXCjya_G.d.cts} +1 -1
  22. package/dist/{codec-hvkJfCF5.d.cts → codec-C_xxsbKy.d.cts} +1 -1
  23. package/dist/{codec-BOyrk_C9.d.cts → codec-Cfo_z5ET.d.cts} +1 -1
  24. package/dist/{codec-xeuGZY77.d.cts → codec-CgZdadPt.d.cts} +2 -2
  25. package/dist/{codec-WwwUipaU.d.ts → codec-Cl73EfRW.d.ts} +1 -1
  26. package/dist/{codec-BOtv3R5j.d.cts → codec-CtvFK4aV.d.cts} +1 -1
  27. package/dist/{codec-DAePx2NL.d.ts → codec-CviAa4lp.d.ts} +2 -2
  28. package/dist/{codec-DJmV04i0.d.ts → codec-D4RvFQmu.d.ts} +1 -1
  29. package/dist/{codec-cou9XBMF.d.cts → codec-DAyiF5sq.d.cts} +1 -1
  30. package/dist/{codec-CyApDKwf.d.cts → codec-DJmqoIsp.d.cts} +1 -1
  31. package/dist/{codec-NMsTK0GX.d.cts → codec-DchsPfr3.d.cts} +1 -1
  32. package/dist/{codec-DplRgIKq.d.ts → codec-Dl_QIXMz.d.ts} +1 -1
  33. package/dist/{codec-N3g1lxQQ.d.cts → codec-DzLvG8Wb.d.cts} +1 -1
  34. package/dist/{codec-D95gT98n.d.cts → codec-DzkdW4kO.d.cts} +1 -1
  35. package/dist/{codec-CWj5iTxA.d.ts → codec-O-1Js7h4.d.ts} +1 -1
  36. package/dist/{codec-BqqoYdh_.d.cts → codec-vddqy0KY.d.cts} +1 -1
  37. package/dist/draft07-session.d.cts +3 -3
  38. package/dist/draft07-session.d.ts +3 -3
  39. package/dist/draft07.d.cts +3 -3
  40. package/dist/draft07.d.ts +3 -3
  41. package/dist/draft08-session.d.cts +3 -3
  42. package/dist/draft08-session.d.ts +3 -3
  43. package/dist/draft08.d.cts +4 -4
  44. package/dist/draft08.d.ts +4 -4
  45. package/dist/draft09-session.d.cts +3 -3
  46. package/dist/draft09-session.d.ts +3 -3
  47. package/dist/draft09.d.cts +4 -4
  48. package/dist/draft09.d.ts +4 -4
  49. package/dist/draft10-session.d.cts +3 -3
  50. package/dist/draft10-session.d.ts +3 -3
  51. package/dist/draft10.d.cts +4 -4
  52. package/dist/draft10.d.ts +4 -4
  53. package/dist/draft11-session.d.cts +3 -3
  54. package/dist/draft11-session.d.ts +3 -3
  55. package/dist/draft11.d.cts +4 -4
  56. package/dist/draft11.d.ts +4 -4
  57. package/dist/draft12-session.d.cts +3 -3
  58. package/dist/draft12-session.d.ts +3 -3
  59. package/dist/draft12.d.cts +4 -4
  60. package/dist/draft12.d.ts +4 -4
  61. package/dist/draft13-session.d.cts +3 -3
  62. package/dist/draft13-session.d.ts +3 -3
  63. package/dist/draft13.d.cts +4 -4
  64. package/dist/draft13.d.ts +4 -4
  65. package/dist/draft14-session.d.cts +3 -3
  66. package/dist/draft14-session.d.ts +3 -3
  67. package/dist/draft14.d.cts +4 -4
  68. package/dist/draft14.d.ts +4 -4
  69. package/dist/draft15-session.d.cts +3 -3
  70. package/dist/draft15-session.d.ts +3 -3
  71. package/dist/draft15.d.cts +4 -4
  72. package/dist/draft15.d.ts +4 -4
  73. package/dist/draft16-session.d.cts +3 -3
  74. package/dist/draft16-session.d.ts +3 -3
  75. package/dist/draft16.d.cts +4 -4
  76. package/dist/draft16.d.ts +4 -4
  77. package/dist/draft17-session.d.cts +3 -3
  78. package/dist/draft17-session.d.ts +3 -3
  79. package/dist/draft17.d.cts +3 -3
  80. package/dist/draft17.d.ts +3 -3
  81. package/dist/draft18-session.d.cts +3 -3
  82. package/dist/draft18-session.d.ts +3 -3
  83. package/dist/draft18.d.cts +3 -3
  84. package/dist/draft18.d.ts +3 -3
  85. package/dist/draft19-session.d.cts +3 -3
  86. package/dist/draft19-session.d.ts +3 -3
  87. package/dist/draft19.cjs +2 -2
  88. package/dist/draft19.d.cts +3 -3
  89. package/dist/draft19.d.ts +3 -3
  90. package/dist/draft19.js +1 -1
  91. package/dist/draft20-session.cjs +8 -0
  92. package/dist/draft20-session.d.cts +195 -0
  93. package/dist/draft20-session.d.ts +195 -0
  94. package/dist/draft20-session.js +8 -0
  95. package/dist/draft20.cjs +217 -0
  96. package/dist/draft20.d.cts +175 -0
  97. package/dist/draft20.d.ts +175 -0
  98. package/dist/draft20.js +217 -0
  99. package/dist/index.cjs +9 -3
  100. package/dist/index.d.cts +32 -17
  101. package/dist/index.d.ts +32 -17
  102. package/dist/index.js +8 -2
  103. package/dist/{session-types-KsqyVp6y.d.cts → session-types-B9idsih-.d.cts} +13 -1
  104. package/dist/{session-types-C0l_-Ups.d.ts → session-types-Dn7b3RZM.d.ts} +13 -1
  105. package/dist/session.cjs +5 -1
  106. package/dist/session.d.cts +5 -3
  107. package/dist/session.d.ts +5 -3
  108. package/dist/session.js +5 -1
  109. package/dist/types-CWCQwuvy.d.cts +359 -0
  110. package/dist/types-CWCQwuvy.d.ts +359 -0
  111. package/dist/{types-CdCSIfvI.d.cts → types-DG5_iKuv.d.cts} +1 -1
  112. package/dist/{types-CdCSIfvI.d.ts → types-DG5_iKuv.d.ts} +1 -1
  113. package/package.json +16 -3
  114. package/src/core/session-types.ts +7 -0
  115. package/src/core/types.ts +1 -0
  116. package/src/drafts/draft19/codec.ts +4 -2
  117. package/src/drafts/draft20/codec.ts +1737 -0
  118. package/src/drafts/draft20/data-streams.ts +1291 -0
  119. package/src/drafts/draft20/error-codes.ts +135 -0
  120. package/src/drafts/draft20/index.ts +165 -0
  121. package/src/drafts/draft20/messages.ts +68 -0
  122. package/src/drafts/draft20/rules.ts +107 -0
  123. package/src/drafts/draft20/session-fsm.ts +1063 -0
  124. package/src/drafts/draft20/session.ts +21 -0
  125. package/src/drafts/draft20/types.ts +455 -0
  126. package/src/index.ts +20 -2
  127. package/src/session.ts +4 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,49 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@moqtap/codec` will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ This file starts at 0.9.0. Earlier releases are in the git history.
9
+
10
+ ## [0.9.0] - 2026-09-03
11
+
12
+ Draft-20 support, and a fix to draft-19 that changes which state machine a
13
+ draft-19 session runs.
14
+
15
+ ### Added
16
+
17
+ - **Draft-20**: codec, message and data-stream tables, wire rules, error codes
18
+ and session FSM, exported as `@moqtap/codec/draft20` and
19
+ `@moqtap/codec/draft20/session`. `createCodec({ draft: '20' })` and
20
+ `createDraft20Codec()` both reach it.
21
+ - `PUBLISH_STATE_NOTIFY` (`0x22`), the one control message draft-20 adds. It is
22
+ unilateral and not subject to `MAX_REQUEST_UPDATES`.
23
+ - Draft-20's rewritten `FETCH`. The message keeps codepoint `0x16` but drops the
24
+ Fetch Type discriminator, carries Track Namespace and Track Name inline, and
25
+ moves its range into a `LOCATION_FILTER` parameter. Nothing on the wire
26
+ distinguishes it from a draft-19 `FETCH` at the type byte, so a session
27
+ decoded under the wrong draft will silently misparse it — pick the draft from
28
+ the negotiated `moqt-NN` protocol string, not from message content.
29
+ - `INCLUDE_PROPERTIES` (`0x35`), a uint8 boolean defaulting to `1`.
30
+
31
+ ### Fixed
32
+
33
+ - **`createDraft19Codec()` reported `draft: '18'`.** Since `createSessionState()`
34
+ keys off `codec.draft`, every draft-19 session was validated by the draft-18
35
+ FSM. Draft-19 sessions now run the draft-19 FSM, which enforces rules the
36
+ draft-18 one does not — a session that passed validation on 0.8.1 may now be
37
+ rejected, correctly.
38
+
39
+ ### Changed
40
+
41
+ - Draft-20 ranges are **inclusive**. An end location names the last object, not
42
+ one past it; do not carry a draft-19 `+ 1` forward.
43
+ - Retired error codes decode rather than being refused. Draft-20 Section 14
44
+ requires an unknown error code in any error context to be treated as
45
+ `INTERNAL_ERROR`, and forbids closing the session over one in `REQUEST_ERROR`
46
+ or `PUBLISH_DONE`. The `RETIRED_*` sets remain exported as advisory
47
+ diagnostics — useful for "this peer looks like draft-19" — but are no longer
48
+ decode gates.
49
+ - `@moqtap/test-vectors` dependency raised to `^0.13.0` for the draft-20 corpus.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  MoQT (Media over QUIC Transport) wire-format codec and session state machine for JavaScript/TypeScript.
4
4
 
5
- - Multi-draft support (drafts 07 through 19)
5
+ - Multi-draft support (drafts 07 through 20)
6
6
  - Stateless encode/decode of all MoQT control messages and data streams
7
7
  - Protocol session state machine with FSM-based validation per draft
8
8
  - Zero runtime dependencies
@@ -43,10 +43,11 @@ Or use the factory if your application supports multiple drafts:
43
43
  ```typescript
44
44
  import { createCodec, DRAFT_VERSIONS } from '@moqtap/codec'
45
45
 
46
- const codec = createCodec({ draft: '19' }) // '07' through '19'
46
+ const codec = createCodec({ draft: '20' }) // '07' through '20'
47
47
 
48
- // DRAFT_VERSIONS provides wire version numbers under short aliases:
49
- // DRAFT_VERSIONS['07'] — 0xff000007n
48
+ // DRAFT_VERSIONS provides version identifiers under short aliases:
49
+ // DRAFT_VERSIONS['07'] — 0xff000007n, a real draft-07 wire value
50
+ // DRAFT_VERSIONS['20'] — 0xff000014n, derived; see the note below
50
51
  ```
51
52
 
52
53
  ## Subpath Exports
@@ -69,10 +70,21 @@ Each draft is available as a subpath import with its own codec and session state
69
70
  | `@moqtap/codec/draft17` | Draft-17 codec |
70
71
  | `@moqtap/codec/draft18` | Draft-18 codec |
71
72
  | `@moqtap/codec/draft19` | Draft-19 codec |
73
+ | `@moqtap/codec/draft20` | Draft-20 codec |
72
74
  | `@moqtap/codec/draft{N}/session` | Session state machine for draft N |
73
75
 
74
76
  > **Note:** A default (versionless) codec will be available once the MoQT specification reaches RFC status. Until then, always specify a draft version.
75
77
 
78
+ `DRAFT_VERSIONS` is a table of numeric keys, and only the entries up to `'14'` are values a peer
79
+ ever puts on the wire. From draft-15 the version is negotiated by ALPN (raw QUIC) or
80
+ `WT-Available-Protocols` (WebTransport) as the string `moqt-NN`, and no version number is sent at
81
+ all — so `DRAFT_VERSIONS['20']` is a derived identifier, not something observed. Each draft module
82
+ from 15 on exports the real one:
83
+
84
+ ```typescript
85
+ import { PROTOCOL_STRING } from '@moqtap/codec/draft20' // 'moqt-20'
86
+ ```
87
+
76
88
  ## Draft-Specific Imports
77
89
 
78
90
  For applications targeting a single draft version: