@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
@@ -2,6 +2,8 @@
2
2
 
3
3
  export const DRAFT_VERSION = 0xff000011n
4
4
 
5
+ export type { AuthRedaction } from '../../core/auth-redaction.js'
6
+ export { REDACTION_FILL } from '../../core/auth-redaction.js'
5
7
  export type { Draft17Codec } from './codec.js'
6
8
  export {
7
9
  createDataStreamDecoder,
@@ -18,7 +20,20 @@ export {
18
20
  encodeFetchStream,
19
21
  encodeMessage,
20
22
  encodeSubgroupStream,
23
+ redactAuthTokens,
21
24
  } from './codec.js'
25
+ export type {
26
+ DataStreamResetCodeValue,
27
+ PublishDoneCodeValue,
28
+ RequestErrorCodeValue,
29
+ SessionTerminationCodeValue,
30
+ } from './error-codes.js'
31
+ export {
32
+ DataStreamResetCode,
33
+ PublishDoneCode,
34
+ RequestErrorCode,
35
+ SessionTerminationCode,
36
+ } from './error-codes.js'
22
37
 
23
38
  export {
24
39
  MESSAGE_ID_MAP,
@@ -18,7 +18,7 @@ export interface AuthorizationToken {
18
18
  // Setup options (KVP encoding, no count prefix)
19
19
  export interface Draft17SetupOptions {
20
20
  path?: string // 0x01 odd
21
- authorization_token?: AuthorizationToken // 0x03 odd
21
+ authorization_token?: readonly AuthorizationToken[] // 0x03 odd
22
22
  max_auth_token_cache_size?: bigint // 0x04 even
23
23
  authority?: string // 0x05 odd
24
24
  moqt_implementation?: string // 0x07 odd
@@ -42,7 +42,7 @@ export interface LargestObject {
42
42
  // Version-specific parameters (delta-encoded types, count-prefixed)
43
43
  export interface Draft17Params {
44
44
  delivery_timeout?: bigint // 0x02 varint
45
- authorization_token?: AuthorizationToken // 0x03 length-prefixed nested
45
+ authorization_token?: readonly AuthorizationToken[] // 0x03 length-prefixed nested
46
46
  rendezvous_timeout?: bigint // 0x04 varint
47
47
  expires?: bigint // 0x08 varint
48
48
  largest_object?: LargestObject // 0x09 Location (2 bare varints)
@@ -322,10 +322,17 @@ export type Draft17DataStream = SubgroupStream | DatagramObject | FetchStream
322
322
  // Streaming data stream decoder types
323
323
  export interface SubgroupStreamHeader {
324
324
  readonly type: 'subgroup_header'
325
+ /**
326
+ * The stream Type Flags, the same value `SubgroupStream.headerType` carries.
327
+ * Without it the incremental decoder discarded every flag the header
328
+ * encodes and a consumer could not tell the modes apart.
329
+ */
330
+ readonly headerType: number
325
331
  readonly trackAlias: bigint
326
332
  readonly groupId: bigint
327
333
  readonly subgroupId: bigint
328
334
  readonly publisherPriority: number
335
+ readonly endOfGroup?: boolean
329
336
  }
330
337
 
331
338
  export interface FetchStreamHeader {
@@ -1,3 +1,4 @@
1
+ import { type AuthRedaction, recordAuthValueSpan, redactWith } from '../../core/auth-redaction.js'
1
2
  import { MoqtBufferReader as BufferReader } from '../../core/buffer-reader.js'
2
3
  import { MoqtBufferWriter as BufferWriter } from '../../core/buffer-writer.js'
3
4
  import { bytesToHex, hexToBytes } from '../../core/hex.js'
@@ -71,12 +72,12 @@ function encodeSetupOptions(opts: Draft18SetupOptions, writer: BufferWriter): vo
71
72
  },
72
73
  })
73
74
  }
74
- if (opts.authorization_token !== undefined) {
75
+ for (const token of opts.authorization_token ?? []) {
75
76
  entries.push({
76
77
  type: SETUP_OPT_AUTHORIZATION_TOKEN,
77
78
  encode: (w) => {
78
79
  const tmpW = new BufferWriter(64)
79
- encodeAuthorizationToken(opts.authorization_token!, tmpW)
80
+ encodeAuthorizationToken(token, tmpW)
80
81
  const raw = tmpW.finish()
81
82
  w.writeVarInt(BigInt(raw.byteLength))
82
83
  w.writeBytes(raw)
@@ -171,7 +172,9 @@ function decodeSetupOptions(reader: BufferReader, payloadEnd: number): Draft18Se
171
172
  if (optType === SETUP_OPT_PATH) {
172
173
  result.path = textDecoder.decode(bytes)
173
174
  } else if (optType === SETUP_OPT_AUTHORIZATION_TOKEN) {
174
- result.authorization_token = decodeAuthorizationToken(new BufferReader(bytes))
175
+ const token = decodeAuthorizationToken(new BufferReader(bytes))
176
+ noteAuthTokenValue(reader.offset - length, length, token.token_value)
177
+ result.authorization_token = [...(result.authorization_token ?? []), token]
175
178
  } else if (optType === SETUP_OPT_AUTHORITY) {
176
179
  result.authority = textDecoder.decode(bytes)
177
180
  } else if (optType === SETUP_OPT_MOQT_IMPLEMENTATION) {
@@ -315,12 +318,12 @@ function encodeParams(params: Draft18Params, writer: BufferWriter): void {
315
318
  encode: (w) => w.writeVarInt(params.object_delivery_timeout!),
316
319
  })
317
320
  }
318
- if (params.authorization_token !== undefined) {
321
+ for (const token of params.authorization_token ?? []) {
319
322
  entries.push({
320
323
  type: PARAM_AUTHORIZATION_TOKEN,
321
324
  encode: (w) => {
322
325
  const tmpW = new BufferWriter(64)
323
- encodeAuthorizationToken(params.authorization_token!, tmpW)
326
+ encodeAuthorizationToken(token, tmpW)
324
327
  const raw = tmpW.finish()
325
328
  w.writeVarInt(BigInt(raw.byteLength))
326
329
  w.writeBytes(raw)
@@ -469,7 +472,9 @@ function decodeParams(reader: BufferReader, messageType: string): Draft18Params
469
472
  } else if (paramType === PARAM_AUTHORIZATION_TOKEN) {
470
473
  const length = Number(reader.readVarInt())
471
474
  const bytes = reader.readBytes(length)
472
- result.authorization_token = decodeAuthorizationToken(new BufferReader(bytes))
475
+ const token = decodeAuthorizationToken(new BufferReader(bytes))
476
+ noteAuthTokenValue(reader.offset - length, length, token.token_value)
477
+ result.authorization_token = [...(result.authorization_token ?? []), token]
473
478
  } else if (paramType === PARAM_RENDEZVOUS_TIMEOUT) {
474
479
  result.rendezvous_timeout = reader.readVarInt()
475
480
  } else if (paramType === PARAM_SUBGROUP_DELIVERY_TIMEOUT) {
@@ -484,7 +489,7 @@ function decodeParams(reader: BufferReader, messageType: string): Draft18Params
484
489
  } else if (paramType === PARAM_FILL_TIMEOUT) {
485
490
  result.fill_timeout = reader.readVarInt()
486
491
  } else if (paramType === PARAM_FORWARD) {
487
- // uint8 in draft-18 (was varint in draft-17)
492
+ // uint8 (Section 10.2.12); drafts 15 and 16 encode this as a varint
488
493
  result.forward = BigInt(reader.readUint8())
489
494
  } else if (paramType === PARAM_SUBSCRIBER_PRIORITY) {
490
495
  // uint8: single raw byte
@@ -1344,3 +1349,61 @@ export function createDraft18Codec(): Draft18Codec {
1344
1349
  createDataStreamDecoder,
1345
1350
  }
1346
1351
  }
1352
+
1353
+ /**
1354
+ * Record where a Token Value sits, so it can be overwritten before the frame
1355
+ * reaches anything that keeps it.
1356
+ *
1357
+ * The span falls out of the decode with no second walk. The Token Value is the
1358
+ * last field of the Token structure, so its start is the parameter value's end
1359
+ * minus the value's own length. The fields before it are left alone
1360
+ * deliberately: Alias Type, Token Alias and Token Type are structure rather
1361
+ * than secret, and they are what distinguishes a session that failed to
1362
+ * authenticate from one that never tried.
1363
+ *
1364
+ * A token carrying no value at all -- DELETE and USE_ALIAS -- records nothing,
1365
+ * and its frame passes through untouched.
1366
+ */
1367
+ function noteAuthTokenValue(
1368
+ valueStart: number,
1369
+ valueLength: number,
1370
+ value: Uint8Array | undefined,
1371
+ ): void {
1372
+ if (value === undefined || value.byteLength === 0) return
1373
+ recordAuthValueSpan(valueStart + valueLength - value.byteLength, value.byteLength)
1374
+ }
1375
+
1376
+ /**
1377
+ * Overwrite every Authorization Token value in a draft-18 control frame.
1378
+ *
1379
+ * One decode, whose *output is discarded*: the point is not to read the
1380
+ * message, it is to learn where the credentials were so the caller never has to
1381
+ * hold a frame that contains one. A caller that also wants the message should
1382
+ * decode the **redacted** frame with {@link decodeMessage}, which then cannot
1383
+ * produce a value because there is no longer one in the bytes.
1384
+ *
1385
+ * A frame that fails to decode is still redacted as far as the decode got. That
1386
+ * is the useful direction to fail in: a value that was read is a value that was
1387
+ * exposed, whatever went wrong after it.
1388
+ *
1389
+ * See {@link AuthRedaction.incomplete} for the one result a caller must not
1390
+ * treat as clean, and {@link AuthRedaction.decoded} for the residual it cannot
1391
+ * close.
1392
+ */
1393
+ export function redactAuthTokens(bytes: Uint8Array): AuthRedaction {
1394
+ let payloadStart: number
1395
+ try {
1396
+ const probe = new BufferReader(bytes)
1397
+ probe.readVarInt()
1398
+ probe.readUint8()
1399
+ probe.readUint8()
1400
+ payloadStart = probe.offset
1401
+ } catch {
1402
+ // Too short to carry a message header, and so too short for the parameters
1403
+ // that carry a credential. Reported as not decoded rather than as clean: a
1404
+ // framer only ever emits complete frames, so a caller that gets here is
1405
+ // holding something this function did not check.
1406
+ return { bytes, redacted: 0, incomplete: false, decoded: false }
1407
+ }
1408
+ return redactWith(bytes, payloadStart, () => decodeMessage(bytes).ok)
1409
+ }