@moqtap/codec 0.9.0 → 0.11.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 (232) hide show
  1. package/CHANGELOG.md +173 -0
  2. package/dist/auth-redaction-DsdLq4Qs.d.cts +102 -0
  3. package/dist/auth-redaction-DsdLq4Qs.d.ts +102 -0
  4. package/dist/{chunk-PU2KV7VP.cjs → chunk-27K5BUAG.cjs} +485 -515
  5. package/dist/{chunk-BV6MITLO.js → chunk-3RNQMGKA.js} +365 -390
  6. package/dist/{chunk-2XH6PHXR.js → chunk-5AWIXOLB.js} +442 -467
  7. package/dist/{chunk-4XLYCT5Q.cjs → chunk-5IMHJIAZ.cjs} +52 -2
  8. package/dist/{chunk-TVSFDQYE.cjs → chunk-5JGZCKJO.cjs} +513 -531
  9. package/dist/{chunk-IADVBKEJ.cjs → chunk-73K4OSAN.cjs} +407 -432
  10. package/dist/{chunk-N2V7Z37J.js → chunk-7VQKRGRD.js} +19 -3
  11. package/dist/{chunk-UZO5Z2XT.cjs → chunk-A3UCQOIB.cjs} +490 -515
  12. package/dist/{chunk-JKMYAUGY.js → chunk-A7PDMVXM.js} +35 -11
  13. package/dist/{chunk-VZHL2U2N.cjs → chunk-A7VQO6YC.cjs} +54 -38
  14. package/dist/{chunk-KCH4BQXK.cjs → chunk-ACQHZLRZ.cjs} +73 -47
  15. package/dist/{chunk-H6DTAIWM.js → chunk-BBICOMW6.js} +47 -19
  16. package/dist/{chunk-MAXEHYVB.cjs → chunk-BNIUVOCJ.cjs} +554 -612
  17. package/dist/{chunk-QGIHC6BA.cjs → chunk-CNC6ANS4.cjs} +70 -46
  18. package/dist/{chunk-NH4L6NIY.js → chunk-FDLQSWHK.js} +437 -467
  19. package/dist/{chunk-IJAF6PAY.js → chunk-FFNOE4UR.js} +19 -3
  20. package/dist/{chunk-CZNW3R5E.cjs → chunk-GMENT63T.cjs} +54 -38
  21. package/dist/{chunk-7ENEWAMZ.cjs → chunk-HM7BLRVP.cjs} +305 -305
  22. package/dist/{chunk-XHAP2YST.js → chunk-HZONHFNO.js} +19 -3
  23. package/dist/{chunk-EVCPBFSR.cjs → chunk-ILYABWDK.cjs} +83 -55
  24. package/dist/{chunk-IDV2JYJ6.cjs → chunk-KRSFTZVO.cjs} +56 -40
  25. package/dist/{chunk-RIIA4ALQ.cjs → chunk-KSPH6KMH.cjs} +54 -38
  26. package/dist/{chunk-UA5XFP4O.cjs → chunk-KTY4LAUV.cjs} +485 -494
  27. package/dist/{chunk-RZTLQAKF.js → chunk-OJNLJT5D.js} +0 -1
  28. package/dist/{chunk-YJGOD3Y4.js → chunk-PJK2ZS3I.js} +492 -550
  29. package/dist/{chunk-TMXRYOBS.js → chunk-PSMZKHOC.js} +444 -453
  30. package/dist/{chunk-7RE6KSIY.cjs → chunk-Q5JQGHWY.cjs} +0 -1
  31. package/dist/{chunk-23KRITJ6.js → chunk-SQTUQY5E.js} +37 -11
  32. package/dist/{chunk-XQGEOFGE.js → chunk-WCRLAKDW.js} +253 -253
  33. package/dist/{chunk-KYVTM5VI.js → chunk-WL2YUEXH.js} +19 -3
  34. package/dist/{chunk-Q7NSUXXB.js → chunk-YCNIVZS7.js} +464 -482
  35. package/dist/{chunk-KLPWJU6W.js → chunk-YRZQVNZO.js} +50 -0
  36. package/dist/{codec-Bym-K2q2.d.cts → codec-76xzrLTL.d.cts} +21 -2
  37. package/dist/{codec-BKsVu3Fr.d.ts → codec-8p40WdLg.d.ts} +21 -2
  38. package/dist/{codec-Dl_QIXMz.d.ts → codec-BN2Bu0KI.d.ts} +20 -1
  39. package/dist/{codec-D4RvFQmu.d.ts → codec-Bb6GKTrv.d.ts} +21 -2
  40. package/dist/{codec-DAyiF5sq.d.cts → codec-BgpfHoAd.d.cts} +21 -2
  41. package/dist/{codec-CA6nbbEk.d.ts → codec-BkheTXO7.d.ts} +21 -2
  42. package/dist/{codec-DchsPfr3.d.cts → codec-BwVDkokh.d.cts} +21 -2
  43. package/dist/{codec-CgZdadPt.d.cts → codec-C5s1eBJX.d.cts} +21 -2
  44. package/dist/codec-CM5yd6n3.d.ts +38 -0
  45. package/dist/{codec-DJmqoIsp.d.cts → codec-Cb8HC3XV.d.cts} +21 -2
  46. package/dist/codec-Clu_skx8.d.cts +38 -0
  47. package/dist/{codec-DzkdW4kO.d.cts → codec-CpOpemR8.d.cts} +20 -1
  48. package/dist/{codec-CXCjya_G.d.cts → codec-Cshdl9Tt.d.cts} +20 -1
  49. package/dist/{codec-CSBFdPgP.d.cts → codec-DELe00w_.d.cts} +21 -2
  50. package/dist/{codec-C_xxsbKy.d.cts → codec-DHzKAUCa.d.cts} +21 -2
  51. package/dist/{codec--CVeqGQv.d.ts → codec-DdVBtvx7.d.ts} +20 -1
  52. package/dist/{codec-CviAa4lp.d.ts → codec-DlxGuYMv.d.ts} +21 -2
  53. package/dist/{codec-BNy5syCU.d.ts → codec-DxtgPxJS.d.ts} +20 -1
  54. package/dist/{codec-CtvFK4aV.d.cts → codec-GAY4lybi.d.cts} +21 -2
  55. package/dist/{codec-Cfo_z5ET.d.cts → codec-I8u2pfS4.d.cts} +20 -1
  56. package/dist/{codec-vddqy0KY.d.cts → codec-XLrnreeu.d.cts} +21 -2
  57. package/dist/{codec-O-1Js7h4.d.ts → codec-c0YEwwWn.d.ts} +21 -2
  58. package/dist/{codec-Cl73EfRW.d.ts → codec-ejDu-va6.d.ts} +21 -2
  59. package/dist/{codec-C006F75E.d.ts → codec-kaBUzdpV.d.ts} +21 -2
  60. package/dist/{codec-C5evFHL-.d.ts → codec-mVYqkIUF.d.ts} +21 -2
  61. package/dist/{codec-BMwgZIgG.d.ts → codec-qSbO5nOa.d.ts} +21 -2
  62. package/dist/{codec-BQa6Qsav.d.ts → codec-yYKGOipj.d.ts} +21 -2
  63. package/dist/{codec-DzLvG8Wb.d.cts → codec-zfzg9uiy.d.cts} +21 -2
  64. package/dist/draft07.cjs +48 -4
  65. package/dist/draft07.d.cts +42 -2
  66. package/dist/draft07.d.ts +42 -2
  67. package/dist/draft07.js +49 -5
  68. package/dist/draft08.cjs +76 -3
  69. package/dist/draft08.d.cts +70 -2
  70. package/dist/draft08.d.ts +70 -2
  71. package/dist/draft08.js +77 -4
  72. package/dist/draft09.cjs +76 -3
  73. package/dist/draft09.d.cts +70 -2
  74. package/dist/draft09.d.ts +70 -2
  75. package/dist/draft09.js +77 -4
  76. package/dist/draft10.cjs +76 -3
  77. package/dist/draft10.d.cts +70 -2
  78. package/dist/draft10.d.ts +70 -2
  79. package/dist/draft10.js +77 -4
  80. package/dist/draft11-session.d.cts +1 -1
  81. package/dist/draft11-session.d.ts +1 -1
  82. package/dist/draft11.cjs +104 -3
  83. package/dist/draft11.d.cts +100 -4
  84. package/dist/draft11.d.ts +100 -4
  85. package/dist/draft11.js +105 -4
  86. package/dist/draft12-session.d.cts +1 -1
  87. package/dist/draft12-session.d.ts +1 -1
  88. package/dist/draft12.cjs +113 -3
  89. package/dist/draft12.d.cts +109 -4
  90. package/dist/draft12.d.ts +109 -4
  91. package/dist/draft12.js +114 -4
  92. package/dist/draft13-session.d.cts +1 -1
  93. package/dist/draft13-session.d.ts +1 -1
  94. package/dist/draft13.cjs +105 -3
  95. package/dist/draft13.d.cts +101 -4
  96. package/dist/draft13.d.ts +101 -4
  97. package/dist/draft13.js +106 -4
  98. package/dist/draft14-session.d.cts +1 -1
  99. package/dist/draft14-session.d.ts +1 -1
  100. package/dist/draft14.cjs +107 -3
  101. package/dist/draft14.d.cts +103 -30
  102. package/dist/draft14.d.ts +103 -30
  103. package/dist/draft14.js +108 -4
  104. package/dist/draft15-session.d.cts +1 -1
  105. package/dist/draft15-session.d.ts +1 -1
  106. package/dist/draft15.cjs +69 -3
  107. package/dist/draft15.d.cts +65 -22
  108. package/dist/draft15.d.ts +65 -22
  109. package/dist/draft15.js +70 -4
  110. package/dist/draft16-session.cjs +2 -2
  111. package/dist/draft16-session.d.cts +1 -1
  112. package/dist/draft16-session.d.ts +1 -1
  113. package/dist/draft16-session.js +1 -1
  114. package/dist/draft16.cjs +76 -8
  115. package/dist/draft16.d.cts +67 -13
  116. package/dist/draft16.d.ts +67 -13
  117. package/dist/draft16.js +73 -5
  118. package/dist/draft17-session.d.cts +1 -1
  119. package/dist/draft17-session.d.ts +1 -1
  120. package/dist/draft17.cjs +77 -3
  121. package/dist/draft17.d.cts +73 -4
  122. package/dist/draft17.d.ts +73 -4
  123. package/dist/draft17.js +78 -4
  124. package/dist/draft18-session.d.cts +1 -1
  125. package/dist/draft18-session.d.ts +1 -1
  126. package/dist/draft18.cjs +8 -3
  127. package/dist/draft18.d.cts +4 -3
  128. package/dist/draft18.d.ts +4 -3
  129. package/dist/draft18.js +9 -4
  130. package/dist/draft19-session.d.cts +1 -1
  131. package/dist/draft19-session.d.ts +1 -1
  132. package/dist/draft19.cjs +11 -4
  133. package/dist/draft19.d.cts +4 -3
  134. package/dist/draft19.d.ts +4 -3
  135. package/dist/draft19.js +12 -5
  136. package/dist/draft20-session.d.cts +1 -1
  137. package/dist/draft20-session.d.ts +1 -1
  138. package/dist/draft20.cjs +8 -3
  139. package/dist/draft20.d.cts +4 -3
  140. package/dist/draft20.d.ts +4 -3
  141. package/dist/draft20.js +9 -4
  142. package/dist/index.cjs +30 -30
  143. package/dist/index.d.cts +25 -24
  144. package/dist/index.d.ts +25 -24
  145. package/dist/index.js +15 -15
  146. package/dist/session.cjs +2 -2
  147. package/dist/session.d.cts +10 -10
  148. package/dist/session.d.ts +10 -10
  149. package/dist/session.js +1 -1
  150. package/dist/{types-zHgCS6o5.d.cts → types-Btp416jt.d.cts} +15 -7
  151. package/dist/{types-zHgCS6o5.d.ts → types-Btp416jt.d.ts} +15 -7
  152. package/dist/{types-Cm9fjeYC.d.cts → types-BxTL1NXw.d.cts} +9 -2
  153. package/dist/{types-Cm9fjeYC.d.ts → types-BxTL1NXw.d.ts} +9 -2
  154. package/dist/{types-Bio-91Rt.d.cts → types-CI_SX4Xe.d.cts} +2 -2
  155. package/dist/{types-Bio-91Rt.d.ts → types-CI_SX4Xe.d.ts} +2 -2
  156. package/dist/{types-HI_bbXka.d.cts → types-CmqT0jUf.d.cts} +1 -1
  157. package/dist/{types-HI_bbXka.d.ts → types-CmqT0jUf.d.ts} +1 -1
  158. package/dist/{types-CPaYBsMG.d.cts → types-CuibHYcf.d.cts} +9 -2
  159. package/dist/{types-CPaYBsMG.d.ts → types-CuibHYcf.d.ts} +9 -2
  160. package/dist/{types-CWCQwuvy.d.cts → types-CwN7AEoL.d.cts} +24 -12
  161. package/dist/{types-CWCQwuvy.d.ts → types-CwN7AEoL.d.ts} +24 -12
  162. package/dist/{types-Ck45Ex5S.d.cts → types-D0kTgUuL.d.cts} +1 -1
  163. package/dist/{types-Ck45Ex5S.d.ts → types-D0kTgUuL.d.ts} +1 -1
  164. package/dist/{types-D9eiB_9A.d.cts → types-DAnalt5K.d.cts} +9 -2
  165. package/dist/{types-D9eiB_9A.d.ts → types-DAnalt5K.d.ts} +9 -2
  166. package/dist/{types-CXlSn0I9.d.cts → types-DjxexghA.d.cts} +2 -2
  167. package/dist/{types-CXlSn0I9.d.ts → types-DjxexghA.d.ts} +2 -2
  168. package/dist/{types-Cqp10JtB.d.cts → types-DxXNP32l.d.cts} +10 -2
  169. package/dist/{types-Cqp10JtB.d.ts → types-DxXNP32l.d.ts} +10 -2
  170. package/package.json +3 -3
  171. package/src/core/auth-redaction.ts +192 -0
  172. package/src/drafts/draft07/codec.ts +40 -0
  173. package/src/drafts/draft07/error-codes.ts +44 -0
  174. package/src/drafts/draft07/index.ts +15 -0
  175. package/src/drafts/draft08/codec.ts +40 -0
  176. package/src/drafts/draft08/error-codes.ts +76 -0
  177. package/src/drafts/draft08/index.ts +21 -0
  178. package/src/drafts/draft09/codec.ts +40 -0
  179. package/src/drafts/draft09/error-codes.ts +76 -0
  180. package/src/drafts/draft09/index.ts +21 -0
  181. package/src/drafts/draft10/codec.ts +40 -0
  182. package/src/drafts/draft10/error-codes.ts +76 -0
  183. package/src/drafts/draft10/index.ts +21 -0
  184. package/src/drafts/draft11/codec.ts +71 -8
  185. package/src/drafts/draft11/error-codes.ts +106 -0
  186. package/src/drafts/draft11/index.ts +23 -0
  187. package/src/drafts/draft11/types.ts +1 -1
  188. package/src/drafts/draft12/codec.ts +83 -16
  189. package/src/drafts/draft12/error-codes.ts +116 -0
  190. package/src/drafts/draft12/index.ts +25 -0
  191. package/src/drafts/draft12/types.ts +2 -2
  192. package/src/drafts/draft13/codec.ts +75 -11
  193. package/src/drafts/draft13/error-codes.ts +107 -0
  194. package/src/drafts/draft13/index.ts +23 -0
  195. package/src/drafts/draft13/types.ts +3 -3
  196. package/src/drafts/draft14/codec.ts +79 -12
  197. package/src/drafts/draft14/data-streams.ts +331 -259
  198. package/src/drafts/draft14/error-codes.ts +109 -0
  199. package/src/drafts/draft14/index.ts +23 -0
  200. package/src/drafts/draft14/types.ts +1 -1
  201. package/src/drafts/draft15/codec.ts +71 -8
  202. package/src/drafts/draft15/data-streams.ts +489 -444
  203. package/src/drafts/draft15/error-codes.ts +66 -0
  204. package/src/drafts/draft15/index.ts +15 -0
  205. package/src/drafts/draft15/types.ts +9 -2
  206. package/src/drafts/draft16/codec.ts +149 -49
  207. package/src/drafts/draft16/data-streams.ts +513 -442
  208. package/src/drafts/draft16/error-codes.ts +68 -0
  209. package/src/drafts/draft16/index.ts +15 -0
  210. package/src/drafts/draft16/messages.ts +4 -4
  211. package/src/drafts/draft16/session-fsm.ts +0 -1
  212. package/src/drafts/draft16/types.ts +24 -10
  213. package/src/drafts/draft17/codec.ts +77 -10
  214. package/src/drafts/draft17/data-streams.ts +567 -488
  215. package/src/drafts/draft17/index.ts +15 -0
  216. package/src/drafts/draft17/types.ts +9 -2
  217. package/src/drafts/draft18/codec.ts +70 -7
  218. package/src/drafts/draft18/data-streams.ts +570 -482
  219. package/src/drafts/draft18/index.ts +3 -0
  220. package/src/drafts/draft18/types.ts +18 -10
  221. package/src/drafts/draft19/codec.ts +95 -23
  222. package/src/drafts/draft19/data-streams.ts +570 -482
  223. package/src/drafts/draft19/error-codes.ts +3 -1
  224. package/src/drafts/draft19/index.ts +3 -0
  225. package/src/drafts/draft19/messages.ts +3 -1
  226. package/src/drafts/draft19/types.ts +32 -18
  227. package/src/drafts/draft20/codec.ts +115 -36
  228. package/src/drafts/draft20/data-streams.ts +610 -563
  229. package/src/drafts/draft20/index.ts +3 -0
  230. package/src/drafts/draft20/types.ts +31 -13
  231. package/dist/codec-BJ7BHuiZ.d.ts +0 -18
  232. package/dist/codec-C6Mx4bwz.d.cts +0 -18
@@ -0,0 +1,68 @@
1
+ // Draft-16 error, status and termination code registries.
2
+
3
+ export const SessionErrorCode = {
4
+ NoError: 0x0n,
5
+ InternalError: 0x1n,
6
+ Unauthorized: 0x2n,
7
+ ProtocolViolation: 0x3n,
8
+ InvalidRequestId: 0x4n,
9
+ DuplicateTrackAlias: 0x5n,
10
+ KeyValueFormattingError: 0x6n,
11
+ TooManyRequests: 0x7n,
12
+ InvalidPath: 0x8n,
13
+ MalformedPath: 0x9n,
14
+ GoawayTimeout: 0x10n,
15
+ ControlMessageTimeout: 0x11n,
16
+ DataStreamTimeout: 0x12n,
17
+ AuthTokenCacheOverflow: 0x13n,
18
+ DuplicateAuthTokenAlias: 0x14n,
19
+ VersionNegotiationFailed: 0x15n,
20
+ MalformedAuthToken: 0x16n,
21
+ UnknownAuthTokenAlias: 0x17n,
22
+ ExpiredAuthToken: 0x18n,
23
+ InvalidAuthority: 0x19n,
24
+ MalformedAuthority: 0x1an,
25
+ } as const
26
+ export type SessionErrorCodeValue = (typeof SessionErrorCode)[keyof typeof SessionErrorCode]
27
+
28
+ export const RequestErrorCode = {
29
+ InternalError: 0x0n,
30
+ Unauthorized: 0x1n,
31
+ Timeout: 0x2n,
32
+ NotSupported: 0x3n,
33
+ MalformedAuthToken: 0x4n,
34
+ ExpiredAuthToken: 0x5n,
35
+ DoesNotExist: 0x10n,
36
+ InvalidRange: 0x11n,
37
+ MalformedTrack: 0x12n,
38
+ DuplicateSubscription: 0x19n,
39
+ Uninterested: 0x20n,
40
+ PrefixOverlap: 0x30n,
41
+ InvalidJoiningRequestId: 0x32n,
42
+ } as const
43
+ export type RequestErrorCodeValue = (typeof RequestErrorCode)[keyof typeof RequestErrorCode]
44
+
45
+ export const PublishDoneStatusCode = {
46
+ InternalError: 0x0n,
47
+ Unauthorized: 0x1n,
48
+ TrackEnded: 0x2n,
49
+ SubscriptionEnded: 0x3n,
50
+ GoingAway: 0x4n,
51
+ Expired: 0x5n,
52
+ TooFarBehind: 0x6n,
53
+ UpdateFailed: 0x8n,
54
+ MalformedTrack: 0x12n,
55
+ } as const
56
+ export type PublishDoneStatusCodeValue =
57
+ (typeof PublishDoneStatusCode)[keyof typeof PublishDoneStatusCode]
58
+
59
+ export const DataStreamResetErrorCode = {
60
+ InternalError: 0x0n,
61
+ Cancelled: 0x1n,
62
+ DeliveryTimeout: 0x2n,
63
+ SessionClosed: 0x3n,
64
+ UnknownObjectStatus: 0x4n,
65
+ MalformedTrack: 0x12n,
66
+ } as const
67
+ export type DataStreamResetErrorCodeValue =
68
+ (typeof DataStreamResetErrorCode)[keyof typeof DataStreamResetErrorCode]
@@ -1,5 +1,7 @@
1
1
  export const DRAFT_VERSION = 0xff000010n
2
2
 
3
+ export type { AuthRedaction } from '../../core/auth-redaction.js'
4
+ export { REDACTION_FILL } from '../../core/auth-redaction.js'
3
5
  export type { Draft16Codec } from './codec.js'
4
6
  export {
5
7
  createDataStreamDecoder,
@@ -16,7 +18,20 @@ export {
16
18
  encodeFetchStream,
17
19
  encodeMessage,
18
20
  encodeSubgroupStream,
21
+ redactAuthTokens,
19
22
  } from './codec.js'
23
+ export type {
24
+ DataStreamResetErrorCodeValue,
25
+ PublishDoneStatusCodeValue,
26
+ RequestErrorCodeValue,
27
+ SessionErrorCodeValue,
28
+ } from './error-codes.js'
29
+ export {
30
+ DataStreamResetErrorCode,
31
+ PublishDoneStatusCode,
32
+ RequestErrorCode,
33
+ SessionErrorCode,
34
+ } from './error-codes.js'
20
35
  export {
21
36
  MESSAGE_ID_MAP,
22
37
  MESSAGE_TYPE_MAP,
@@ -1,21 +1,21 @@
1
1
  // Draft-16 message type wire IDs
2
2
 
3
- export const MSG_REQUEST_UPDATE = 0x02n // renamed from SUBSCRIBE_UPDATE
3
+ export const MSG_REQUEST_UPDATE = 0x02n
4
4
  export const MSG_SUBSCRIBE = 0x03n
5
5
  export const MSG_SUBSCRIBE_OK = 0x04n
6
6
  export const MSG_REQUEST_ERROR = 0x05n
7
7
  export const MSG_PUBLISH_NAMESPACE = 0x06n
8
8
  export const MSG_REQUEST_OK = 0x07n
9
- export const MSG_NAMESPACE = 0x08n // new in draft-16
9
+ export const MSG_NAMESPACE = 0x08n // NAMESPACE (draft-16 Section 9.21); draft-15 has no 0x8 control message
10
10
  export const MSG_PUBLISH_NAMESPACE_DONE = 0x09n
11
11
  export const MSG_UNSUBSCRIBE = 0x0an
12
12
  export const MSG_PUBLISH_DONE = 0x0bn
13
13
  export const MSG_PUBLISH_NAMESPACE_CANCEL = 0x0cn
14
14
  export const MSG_TRACK_STATUS = 0x0dn
15
- export const MSG_NAMESPACE_DONE = 0x0en // new in draft-16
15
+ export const MSG_NAMESPACE_DONE = 0x0en // NAMESPACE_DONE (draft-16 Section 9.23); draft-15 has no 0xE control message
16
16
  export const MSG_GOAWAY = 0x10n
17
17
  export const MSG_SUBSCRIBE_NAMESPACE = 0x11n
18
- // 0x14 (UNSUBSCRIBE_NAMESPACE) removed in draft-16
18
+ // 0x14 is unassigned in draft-16 (Section 9, Table 1); draft-15 binds it to UNSUBSCRIBE_NAMESPACE.
19
19
  export const MSG_MAX_REQUEST_ID = 0x15n
20
20
  export const MSG_FETCH = 0x16n
21
21
  export const MSG_FETCH_CANCEL = 0x17n
@@ -370,7 +370,6 @@ export class Draft16SessionFSM {
370
370
  return { ok: true, phase: this._phase, sideEffects }
371
371
  }
372
372
 
373
- // Renamed from handleSubscribeUpdate in draft-15
374
373
  private handleRequestUpdate(
375
374
  message: Draft16Message,
376
375
  sideEffects: SideEffect[],
@@ -20,7 +20,7 @@ export interface AuthorizationToken {
20
20
  export interface Draft16SetupParams {
21
21
  path?: string // 0x01 odd
22
22
  max_request_id?: bigint // 0x02 even
23
- authorization_token?: AuthorizationToken // 0x03 odd
23
+ authorization_token?: readonly AuthorizationToken[] // 0x03 odd
24
24
  max_auth_token_cache_size?: bigint // 0x04 even
25
25
  authority?: string // 0x05 odd
26
26
  moqt_implementation?: string // 0x07 odd
@@ -41,7 +41,9 @@ export interface LargestObject {
41
41
  readonly object: bigint
42
42
  }
43
43
 
44
- // Track extensions (separate parameter set in draft-16)
44
+ // Track Extensions a trailing sequence of Extension Headers on SUBSCRIBE_OK, PUBLISH and
45
+ // FETCH_OK, carried alongside the parameters rather than among them; draft-16 is the only
46
+ // draft that carries it
45
47
  export interface Draft16TrackExtensions {
46
48
  delivery_timeout?: bigint // 0x02 even
47
49
  max_cache_duration?: bigint // 0x04 even
@@ -52,7 +54,7 @@ export interface Draft16TrackExtensions {
52
54
  // Version-specific parameters (well-known + unknown)
53
55
  export interface Draft16Params {
54
56
  delivery_timeout?: bigint // 0x02 even
55
- authorization_token?: AuthorizationToken // 0x03 odd
57
+ authorization_token?: readonly AuthorizationToken[] // 0x03 odd
56
58
  max_cache_duration?: bigint // 0x04 even
57
59
  expires?: bigint // 0x08 even
58
60
  largest_object?: LargestObject // 0x09 odd (length-prefixed)
@@ -109,7 +111,8 @@ export interface Draft16ServerSetup extends Draft16BaseMessage {
109
111
  readonly parameters: Draft16SetupParams
110
112
  }
111
113
 
112
- // Subscribefields moved to parameters
114
+ // SUBSCRIBEtype 0x3; drafts 07-14 carry the subscriber priority, group order, filter and
115
+ // (from draft-11) forward flag as fields of the message, drafts 15 and 16 as parameters
113
116
  export interface Draft16Subscribe extends Draft16BaseMessage {
114
117
  readonly type: 'subscribe'
115
118
  readonly request_id: bigint
@@ -126,7 +129,7 @@ export interface Draft16SubscribeOk extends Draft16BaseMessage {
126
129
  readonly track_extensions?: Draft16TrackExtensions
127
130
  }
128
131
 
129
- // Renamed from subscribe_update in draft-15
132
+ // Request Update type 0x2; drafts 07-15 name the same codepoint SUBSCRIBE_UPDATE
130
133
  export interface Draft16RequestUpdate extends Draft16BaseMessage {
131
134
  readonly type: 'request_update'
132
135
  readonly request_id: bigint
@@ -172,13 +175,17 @@ export interface Draft16PublishNamespace extends Draft16BaseMessage {
172
175
  readonly parameters: Draft16Params
173
176
  }
174
177
 
175
- // Simplified in draft-16: just request_id
178
+ // PUBLISH_NAMESPACE_DONE type 0x9, keyed by request_id here; drafts 07-15 carry the Track
179
+ // Namespace in that position and name the codepoint UNANNOUNCE before draft-14; no draft from
180
+ // 17 on carries the message
176
181
  export interface Draft16PublishNamespaceDone extends Draft16BaseMessage {
177
182
  readonly type: 'publish_namespace_done'
178
183
  readonly request_id: bigint
179
184
  }
180
185
 
181
- // Changed in draft-16: request_id + error_code + reason_phrase
186
+ // PUBLISH_NAMESPACE_CANCEL type 0xC, keyed by request_id here; drafts 07-15 carry the Track
187
+ // Namespace in that position with the same error_code + reason_phrase after it, and name the
188
+ // codepoint ANNOUNCE_CANCEL before draft-14; no draft from 17 on carries the message
182
189
  export interface Draft16PublishNamespaceCancel extends Draft16BaseMessage {
183
190
  readonly type: 'publish_namespace_cancel'
184
191
  readonly request_id: bigint
@@ -186,7 +193,7 @@ export interface Draft16PublishNamespaceCancel extends Draft16BaseMessage {
186
193
  readonly reason_phrase: string
187
194
  }
188
195
 
189
- // subscribe_namespace gains subscribe_options in draft-16
196
+ // Only drafts 16 and 17 carry a subscribe_options field on SUBSCRIBE_NAMESPACE
190
197
  export interface Draft16SubscribeNamespace extends Draft16BaseMessage {
191
198
  readonly type: 'subscribe_namespace'
192
199
  readonly request_id: bigint
@@ -207,7 +214,7 @@ export interface Draft16NamespaceDone extends Draft16BaseMessage {
207
214
  readonly namespace_suffix: string[]
208
215
  }
209
216
 
210
- // unsubscribe_namespace is REMOVED in draft-16
217
+ // No draft from 16 on carries UNSUBSCRIBE_NAMESPACE; drafts 13 through 15 do
211
218
 
212
219
  // Fetch — same structure as draft-15
213
220
  export interface StandaloneFetch {
@@ -264,7 +271,7 @@ export interface Draft16RequestOk extends Draft16BaseMessage {
264
271
  readonly parameters: Draft16Params
265
272
  }
266
273
 
267
- // request_error gains retry_interval in draft-16
274
+ // REQUEST_ERROR type 0x5; draft-15's carries no retry_interval, every draft from 16 on does
268
275
  export interface Draft16RequestError extends Draft16BaseMessage {
269
276
  readonly type: 'request_error'
270
277
  readonly request_id: bigint
@@ -371,10 +378,17 @@ export type Draft16DataStream = SubgroupStream | DatagramObject | FetchStream
371
378
  // Streaming data stream decoder types
372
379
  export interface SubgroupStreamHeader {
373
380
  readonly type: 'subgroup_header'
381
+ /**
382
+ * The stream Type Flags, the same value `SubgroupStream.headerType` carries.
383
+ * Without it the incremental decoder drops every flag the header encodes
384
+ * and a consumer cannot tell the modes apart.
385
+ */
386
+ readonly headerType: number
374
387
  readonly trackAlias: bigint
375
388
  readonly groupId: bigint
376
389
  readonly subgroupId: bigint
377
390
  readonly publisherPriority: number
391
+ readonly endOfGroup?: boolean
378
392
  }
379
393
 
380
394
  export interface FetchStreamHeader {
@@ -1,3 +1,4 @@
1
+ import { type AuthRedaction, recordAuthValueSpan, redactWith } from '../../core/auth-redaction.js'
1
2
  import { Draft17BufferReader as BufferReader } from '../../core/buffer-reader.js'
2
3
  import { Draft17BufferWriter as BufferWriter } from '../../core/buffer-writer.js'
3
4
  import { bytesToHex, hexToBytes } from '../../core/hex.js'
@@ -68,12 +69,12 @@ function encodeSetupOptions(opts: Draft17SetupOptions, writer: BufferWriter): vo
68
69
  },
69
70
  })
70
71
  }
71
- if (opts.authorization_token !== undefined) {
72
+ for (const token of opts.authorization_token ?? []) {
72
73
  entries.push({
73
74
  type: SETUP_OPT_AUTHORIZATION_TOKEN,
74
75
  encode: (w) => {
75
76
  const tmpW = new BufferWriter(64)
76
- encodeAuthorizationToken(opts.authorization_token!, tmpW)
77
+ encodeAuthorizationToken(token, tmpW)
77
78
  const raw = tmpW.finish()
78
79
  w.writeVarInt(BigInt(raw.byteLength))
79
80
  w.writeBytes(raw)
@@ -168,7 +169,9 @@ function decodeSetupOptions(reader: BufferReader, payloadEnd: number): Draft17Se
168
169
  if (optType === SETUP_OPT_PATH) {
169
170
  result.path = textDecoder.decode(bytes)
170
171
  } else if (optType === SETUP_OPT_AUTHORIZATION_TOKEN) {
171
- result.authorization_token = decodeAuthorizationToken(new BufferReader(bytes))
172
+ const token = decodeAuthorizationToken(new BufferReader(bytes))
173
+ noteAuthTokenValue(reader.offset - length, length, token.token_value)
174
+ result.authorization_token = [...(result.authorization_token ?? []), token]
172
175
  } else if (optType === SETUP_OPT_AUTHORITY) {
173
176
  result.authority = textDecoder.decode(bytes)
174
177
  } else if (optType === SETUP_OPT_MOQT_IMPLEMENTATION) {
@@ -197,10 +200,14 @@ function encodeAuthorizationToken(token: AuthorizationToken, w: BufferWriter): v
197
200
  w.writeVarInt(token.token_alias ?? 0n)
198
201
  }
199
202
  if (aliasType === 1 || aliasType === 3) {
200
- // REGISTER, USE_VALUE: token_type + token_value present
203
+ // REGISTER, USE_VALUE: token_type + token_value present.
204
+ // In draft-17 the Token Value is NOT length-prefixed inside the Token
205
+ // structure; it consumes the remainder of the outer length-prefixed buffer.
206
+ // Figure 5 writes it as `Token Value (..)`, and the only length genuinely
207
+ // present is the Key-Value-Pair's own, which is what "uses Length-prefixed
208
+ // encoding" describes. Draft-18 repeats that figure and prose verbatim.
201
209
  w.writeVarInt(token.token_type ?? 0n)
202
210
  const tv = token.token_value ?? new Uint8Array(0)
203
- w.writeVarInt(BigInt(tv.byteLength))
204
211
  w.writeBytes(tv)
205
212
  }
206
213
  }
@@ -215,8 +222,8 @@ function decodeAuthorizationToken(r: BufferReader): AuthorizationToken {
215
222
  }
216
223
  if (aliasType === 1 || aliasType === 3) {
217
224
  ;(result as { token_type: bigint }).token_type = r.readVarInt()
218
- const len = Number(r.readVarInt())
219
- const bytes = r.readBytes(len)
225
+ // Token Value extends to the end of the outer length-prefixed buffer
226
+ const bytes = r.readBytes(r.remaining)
220
227
  ;(result as { token_value: Uint8Array }).token_value = bytes
221
228
  }
222
229
 
@@ -283,12 +290,12 @@ function encodeParams(params: Draft17Params, writer: BufferWriter): void {
283
290
  encode: (w) => w.writeVarInt(params.delivery_timeout!),
284
291
  })
285
292
  }
286
- if (params.authorization_token !== undefined) {
293
+ for (const token of params.authorization_token ?? []) {
287
294
  entries.push({
288
295
  type: PARAM_AUTHORIZATION_TOKEN,
289
296
  encode: (w) => {
290
297
  const tmpW = new BufferWriter(64)
291
- encodeAuthorizationToken(params.authorization_token!, tmpW)
298
+ encodeAuthorizationToken(token, tmpW)
292
299
  const raw = tmpW.finish()
293
300
  w.writeVarInt(BigInt(raw.byteLength))
294
301
  w.writeBytes(raw)
@@ -411,7 +418,9 @@ function decodeParams(reader: BufferReader, messageType: string): Draft17Params
411
418
  } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
412
419
  const length = Number(reader.readVarInt())
413
420
  const bytes = reader.readBytes(length)
414
- result.authorization_token = decodeAuthorizationToken(new BufferReader(bytes))
421
+ const token = decodeAuthorizationToken(new BufferReader(bytes))
422
+ noteAuthTokenValue(reader.offset - length, length, token.token_value)
423
+ result.authorization_token = [...(result.authorization_token ?? []), token]
415
424
  } else if (paramType === PARAM_RENDEZVOUS_TIMEOUT) {
416
425
  result.rendezvous_timeout = reader.readVarInt()
417
426
  } else if (paramType === PARAM_EXPIRES) {
@@ -1244,3 +1253,61 @@ export function createDraft17Codec(): Draft17Codec {
1244
1253
  createDataStreamDecoder,
1245
1254
  }
1246
1255
  }
1256
+
1257
+ /**
1258
+ * Record where a Token Value sits, so it can be overwritten before the frame
1259
+ * reaches anything that keeps it.
1260
+ *
1261
+ * The span falls out of the decode with no second walk. The Token Value is the
1262
+ * last field of the Token structure, so its start is the parameter value's end
1263
+ * minus the value's own length. The fields before it are left alone
1264
+ * deliberately: Alias Type, Token Alias and Token Type are structure rather
1265
+ * than secret, and they are what distinguishes a session that failed to
1266
+ * authenticate from one that never tried.
1267
+ *
1268
+ * A token carrying no value at all -- DELETE and USE_ALIAS -- records nothing,
1269
+ * and its frame passes through untouched.
1270
+ */
1271
+ function noteAuthTokenValue(
1272
+ valueStart: number,
1273
+ valueLength: number,
1274
+ value: Uint8Array | undefined,
1275
+ ): void {
1276
+ if (value === undefined || value.byteLength === 0) return
1277
+ recordAuthValueSpan(valueStart + valueLength - value.byteLength, value.byteLength)
1278
+ }
1279
+
1280
+ /**
1281
+ * Overwrite every Authorization Token value in a draft-17 control frame.
1282
+ *
1283
+ * One decode, whose *output is discarded*: the point is not to read the
1284
+ * message, it is to learn where the credentials were so the caller never has to
1285
+ * hold a frame that contains one. A caller that also wants the message should
1286
+ * decode the **redacted** frame with {@link decodeMessage}, which then cannot
1287
+ * produce a value because there is no longer one in the bytes.
1288
+ *
1289
+ * A frame that fails to decode is still redacted as far as the decode got. That
1290
+ * is the useful direction to fail in: a value that was read is a value that was
1291
+ * exposed, whatever went wrong after it.
1292
+ *
1293
+ * See {@link AuthRedaction.incomplete} for the one result a caller must not
1294
+ * treat as clean, and {@link AuthRedaction.decoded} for the residual it cannot
1295
+ * close.
1296
+ */
1297
+ export function redactAuthTokens(bytes: Uint8Array): AuthRedaction {
1298
+ let payloadStart: number
1299
+ try {
1300
+ const probe = new BufferReader(bytes)
1301
+ probe.readVarInt()
1302
+ probe.readUint8()
1303
+ probe.readUint8()
1304
+ payloadStart = probe.offset
1305
+ } catch {
1306
+ // Too short to carry a message header, and so too short for the parameters
1307
+ // that carry a credential. Reported as not decoded rather than as clean: a
1308
+ // framer only ever emits complete frames, so a caller that gets here is
1309
+ // holding something this function did not check.
1310
+ return { bytes, redacted: 0, incomplete: false, decoded: false }
1311
+ }
1312
+ return redactWith(bytes, payloadStart, () => decodeMessage(bytes).ok)
1313
+ }