@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.
- package/CHANGELOG.md +173 -0
- package/dist/auth-redaction-DsdLq4Qs.d.cts +102 -0
- package/dist/auth-redaction-DsdLq4Qs.d.ts +102 -0
- package/dist/{chunk-PU2KV7VP.cjs → chunk-27K5BUAG.cjs} +485 -515
- package/dist/{chunk-BV6MITLO.js → chunk-3RNQMGKA.js} +365 -390
- package/dist/{chunk-2XH6PHXR.js → chunk-5AWIXOLB.js} +442 -467
- package/dist/{chunk-4XLYCT5Q.cjs → chunk-5IMHJIAZ.cjs} +52 -2
- package/dist/{chunk-TVSFDQYE.cjs → chunk-5JGZCKJO.cjs} +513 -531
- package/dist/{chunk-IADVBKEJ.cjs → chunk-73K4OSAN.cjs} +407 -432
- package/dist/{chunk-N2V7Z37J.js → chunk-7VQKRGRD.js} +19 -3
- package/dist/{chunk-UZO5Z2XT.cjs → chunk-A3UCQOIB.cjs} +490 -515
- package/dist/{chunk-JKMYAUGY.js → chunk-A7PDMVXM.js} +35 -11
- package/dist/{chunk-VZHL2U2N.cjs → chunk-A7VQO6YC.cjs} +54 -38
- package/dist/{chunk-KCH4BQXK.cjs → chunk-ACQHZLRZ.cjs} +73 -47
- package/dist/{chunk-H6DTAIWM.js → chunk-BBICOMW6.js} +47 -19
- package/dist/{chunk-MAXEHYVB.cjs → chunk-BNIUVOCJ.cjs} +554 -612
- package/dist/{chunk-QGIHC6BA.cjs → chunk-CNC6ANS4.cjs} +70 -46
- package/dist/{chunk-NH4L6NIY.js → chunk-FDLQSWHK.js} +437 -467
- package/dist/{chunk-IJAF6PAY.js → chunk-FFNOE4UR.js} +19 -3
- package/dist/{chunk-CZNW3R5E.cjs → chunk-GMENT63T.cjs} +54 -38
- package/dist/{chunk-7ENEWAMZ.cjs → chunk-HM7BLRVP.cjs} +305 -305
- package/dist/{chunk-XHAP2YST.js → chunk-HZONHFNO.js} +19 -3
- package/dist/{chunk-EVCPBFSR.cjs → chunk-ILYABWDK.cjs} +83 -55
- package/dist/{chunk-IDV2JYJ6.cjs → chunk-KRSFTZVO.cjs} +56 -40
- package/dist/{chunk-RIIA4ALQ.cjs → chunk-KSPH6KMH.cjs} +54 -38
- package/dist/{chunk-UA5XFP4O.cjs → chunk-KTY4LAUV.cjs} +485 -494
- package/dist/{chunk-RZTLQAKF.js → chunk-OJNLJT5D.js} +0 -1
- package/dist/{chunk-YJGOD3Y4.js → chunk-PJK2ZS3I.js} +492 -550
- package/dist/{chunk-TMXRYOBS.js → chunk-PSMZKHOC.js} +444 -453
- package/dist/{chunk-7RE6KSIY.cjs → chunk-Q5JQGHWY.cjs} +0 -1
- package/dist/{chunk-23KRITJ6.js → chunk-SQTUQY5E.js} +37 -11
- package/dist/{chunk-XQGEOFGE.js → chunk-WCRLAKDW.js} +253 -253
- package/dist/{chunk-KYVTM5VI.js → chunk-WL2YUEXH.js} +19 -3
- package/dist/{chunk-Q7NSUXXB.js → chunk-YCNIVZS7.js} +464 -482
- package/dist/{chunk-KLPWJU6W.js → chunk-YRZQVNZO.js} +50 -0
- package/dist/{codec-Bym-K2q2.d.cts → codec-76xzrLTL.d.cts} +21 -2
- package/dist/{codec-BKsVu3Fr.d.ts → codec-8p40WdLg.d.ts} +21 -2
- package/dist/{codec-Dl_QIXMz.d.ts → codec-BN2Bu0KI.d.ts} +20 -1
- package/dist/{codec-D4RvFQmu.d.ts → codec-Bb6GKTrv.d.ts} +21 -2
- package/dist/{codec-DAyiF5sq.d.cts → codec-BgpfHoAd.d.cts} +21 -2
- package/dist/{codec-CA6nbbEk.d.ts → codec-BkheTXO7.d.ts} +21 -2
- package/dist/{codec-DchsPfr3.d.cts → codec-BwVDkokh.d.cts} +21 -2
- package/dist/{codec-CgZdadPt.d.cts → codec-C5s1eBJX.d.cts} +21 -2
- package/dist/codec-CM5yd6n3.d.ts +38 -0
- package/dist/{codec-DJmqoIsp.d.cts → codec-Cb8HC3XV.d.cts} +21 -2
- package/dist/codec-Clu_skx8.d.cts +38 -0
- package/dist/{codec-DzkdW4kO.d.cts → codec-CpOpemR8.d.cts} +20 -1
- package/dist/{codec-CXCjya_G.d.cts → codec-Cshdl9Tt.d.cts} +20 -1
- package/dist/{codec-CSBFdPgP.d.cts → codec-DELe00w_.d.cts} +21 -2
- package/dist/{codec-C_xxsbKy.d.cts → codec-DHzKAUCa.d.cts} +21 -2
- package/dist/{codec--CVeqGQv.d.ts → codec-DdVBtvx7.d.ts} +20 -1
- package/dist/{codec-CviAa4lp.d.ts → codec-DlxGuYMv.d.ts} +21 -2
- package/dist/{codec-BNy5syCU.d.ts → codec-DxtgPxJS.d.ts} +20 -1
- package/dist/{codec-CtvFK4aV.d.cts → codec-GAY4lybi.d.cts} +21 -2
- package/dist/{codec-Cfo_z5ET.d.cts → codec-I8u2pfS4.d.cts} +20 -1
- package/dist/{codec-vddqy0KY.d.cts → codec-XLrnreeu.d.cts} +21 -2
- package/dist/{codec-O-1Js7h4.d.ts → codec-c0YEwwWn.d.ts} +21 -2
- package/dist/{codec-Cl73EfRW.d.ts → codec-ejDu-va6.d.ts} +21 -2
- package/dist/{codec-C006F75E.d.ts → codec-kaBUzdpV.d.ts} +21 -2
- package/dist/{codec-C5evFHL-.d.ts → codec-mVYqkIUF.d.ts} +21 -2
- package/dist/{codec-BMwgZIgG.d.ts → codec-qSbO5nOa.d.ts} +21 -2
- package/dist/{codec-BQa6Qsav.d.ts → codec-yYKGOipj.d.ts} +21 -2
- package/dist/{codec-DzLvG8Wb.d.cts → codec-zfzg9uiy.d.cts} +21 -2
- package/dist/draft07.cjs +48 -4
- package/dist/draft07.d.cts +42 -2
- package/dist/draft07.d.ts +42 -2
- package/dist/draft07.js +49 -5
- package/dist/draft08.cjs +76 -3
- package/dist/draft08.d.cts +70 -2
- package/dist/draft08.d.ts +70 -2
- package/dist/draft08.js +77 -4
- package/dist/draft09.cjs +76 -3
- package/dist/draft09.d.cts +70 -2
- package/dist/draft09.d.ts +70 -2
- package/dist/draft09.js +77 -4
- package/dist/draft10.cjs +76 -3
- package/dist/draft10.d.cts +70 -2
- package/dist/draft10.d.ts +70 -2
- package/dist/draft10.js +77 -4
- package/dist/draft11-session.d.cts +1 -1
- package/dist/draft11-session.d.ts +1 -1
- package/dist/draft11.cjs +104 -3
- package/dist/draft11.d.cts +100 -4
- package/dist/draft11.d.ts +100 -4
- package/dist/draft11.js +105 -4
- package/dist/draft12-session.d.cts +1 -1
- package/dist/draft12-session.d.ts +1 -1
- package/dist/draft12.cjs +113 -3
- package/dist/draft12.d.cts +109 -4
- package/dist/draft12.d.ts +109 -4
- package/dist/draft12.js +114 -4
- package/dist/draft13-session.d.cts +1 -1
- package/dist/draft13-session.d.ts +1 -1
- package/dist/draft13.cjs +105 -3
- package/dist/draft13.d.cts +101 -4
- package/dist/draft13.d.ts +101 -4
- package/dist/draft13.js +106 -4
- package/dist/draft14-session.d.cts +1 -1
- package/dist/draft14-session.d.ts +1 -1
- package/dist/draft14.cjs +107 -3
- package/dist/draft14.d.cts +103 -30
- package/dist/draft14.d.ts +103 -30
- package/dist/draft14.js +108 -4
- package/dist/draft15-session.d.cts +1 -1
- package/dist/draft15-session.d.ts +1 -1
- package/dist/draft15.cjs +69 -3
- package/dist/draft15.d.cts +65 -22
- package/dist/draft15.d.ts +65 -22
- package/dist/draft15.js +70 -4
- package/dist/draft16-session.cjs +2 -2
- package/dist/draft16-session.d.cts +1 -1
- package/dist/draft16-session.d.ts +1 -1
- package/dist/draft16-session.js +1 -1
- package/dist/draft16.cjs +76 -8
- package/dist/draft16.d.cts +67 -13
- package/dist/draft16.d.ts +67 -13
- package/dist/draft16.js +73 -5
- package/dist/draft17-session.d.cts +1 -1
- package/dist/draft17-session.d.ts +1 -1
- package/dist/draft17.cjs +77 -3
- package/dist/draft17.d.cts +73 -4
- package/dist/draft17.d.ts +73 -4
- package/dist/draft17.js +78 -4
- package/dist/draft18-session.d.cts +1 -1
- package/dist/draft18-session.d.ts +1 -1
- package/dist/draft18.cjs +8 -3
- package/dist/draft18.d.cts +4 -3
- package/dist/draft18.d.ts +4 -3
- package/dist/draft18.js +9 -4
- package/dist/draft19-session.d.cts +1 -1
- package/dist/draft19-session.d.ts +1 -1
- package/dist/draft19.cjs +11 -4
- package/dist/draft19.d.cts +4 -3
- package/dist/draft19.d.ts +4 -3
- package/dist/draft19.js +12 -5
- package/dist/draft20-session.d.cts +1 -1
- package/dist/draft20-session.d.ts +1 -1
- package/dist/draft20.cjs +8 -3
- package/dist/draft20.d.cts +4 -3
- package/dist/draft20.d.ts +4 -3
- package/dist/draft20.js +9 -4
- package/dist/index.cjs +30 -30
- package/dist/index.d.cts +25 -24
- package/dist/index.d.ts +25 -24
- package/dist/index.js +15 -15
- package/dist/session.cjs +2 -2
- package/dist/session.d.cts +10 -10
- package/dist/session.d.ts +10 -10
- package/dist/session.js +1 -1
- package/dist/{types-zHgCS6o5.d.cts → types-Btp416jt.d.cts} +15 -7
- package/dist/{types-zHgCS6o5.d.ts → types-Btp416jt.d.ts} +15 -7
- package/dist/{types-Cm9fjeYC.d.cts → types-BxTL1NXw.d.cts} +9 -2
- package/dist/{types-Cm9fjeYC.d.ts → types-BxTL1NXw.d.ts} +9 -2
- package/dist/{types-Bio-91Rt.d.cts → types-CI_SX4Xe.d.cts} +2 -2
- package/dist/{types-Bio-91Rt.d.ts → types-CI_SX4Xe.d.ts} +2 -2
- package/dist/{types-HI_bbXka.d.cts → types-CmqT0jUf.d.cts} +1 -1
- package/dist/{types-HI_bbXka.d.ts → types-CmqT0jUf.d.ts} +1 -1
- package/dist/{types-CPaYBsMG.d.cts → types-CuibHYcf.d.cts} +9 -2
- package/dist/{types-CPaYBsMG.d.ts → types-CuibHYcf.d.ts} +9 -2
- package/dist/{types-CWCQwuvy.d.cts → types-CwN7AEoL.d.cts} +24 -12
- package/dist/{types-CWCQwuvy.d.ts → types-CwN7AEoL.d.ts} +24 -12
- package/dist/{types-Ck45Ex5S.d.cts → types-D0kTgUuL.d.cts} +1 -1
- package/dist/{types-Ck45Ex5S.d.ts → types-D0kTgUuL.d.ts} +1 -1
- package/dist/{types-D9eiB_9A.d.cts → types-DAnalt5K.d.cts} +9 -2
- package/dist/{types-D9eiB_9A.d.ts → types-DAnalt5K.d.ts} +9 -2
- package/dist/{types-CXlSn0I9.d.cts → types-DjxexghA.d.cts} +2 -2
- package/dist/{types-CXlSn0I9.d.ts → types-DjxexghA.d.ts} +2 -2
- package/dist/{types-Cqp10JtB.d.cts → types-DxXNP32l.d.cts} +10 -2
- package/dist/{types-Cqp10JtB.d.ts → types-DxXNP32l.d.ts} +10 -2
- package/package.json +3 -3
- package/src/core/auth-redaction.ts +192 -0
- package/src/drafts/draft07/codec.ts +40 -0
- package/src/drafts/draft07/error-codes.ts +44 -0
- package/src/drafts/draft07/index.ts +15 -0
- package/src/drafts/draft08/codec.ts +40 -0
- package/src/drafts/draft08/error-codes.ts +76 -0
- package/src/drafts/draft08/index.ts +21 -0
- package/src/drafts/draft09/codec.ts +40 -0
- package/src/drafts/draft09/error-codes.ts +76 -0
- package/src/drafts/draft09/index.ts +21 -0
- package/src/drafts/draft10/codec.ts +40 -0
- package/src/drafts/draft10/error-codes.ts +76 -0
- package/src/drafts/draft10/index.ts +21 -0
- package/src/drafts/draft11/codec.ts +71 -8
- package/src/drafts/draft11/error-codes.ts +106 -0
- package/src/drafts/draft11/index.ts +23 -0
- package/src/drafts/draft11/types.ts +1 -1
- package/src/drafts/draft12/codec.ts +83 -16
- package/src/drafts/draft12/error-codes.ts +116 -0
- package/src/drafts/draft12/index.ts +25 -0
- package/src/drafts/draft12/types.ts +2 -2
- package/src/drafts/draft13/codec.ts +75 -11
- package/src/drafts/draft13/error-codes.ts +107 -0
- package/src/drafts/draft13/index.ts +23 -0
- package/src/drafts/draft13/types.ts +3 -3
- package/src/drafts/draft14/codec.ts +79 -12
- package/src/drafts/draft14/data-streams.ts +331 -259
- package/src/drafts/draft14/error-codes.ts +109 -0
- package/src/drafts/draft14/index.ts +23 -0
- package/src/drafts/draft14/types.ts +1 -1
- package/src/drafts/draft15/codec.ts +71 -8
- package/src/drafts/draft15/data-streams.ts +489 -444
- package/src/drafts/draft15/error-codes.ts +66 -0
- package/src/drafts/draft15/index.ts +15 -0
- package/src/drafts/draft15/types.ts +9 -2
- package/src/drafts/draft16/codec.ts +149 -49
- package/src/drafts/draft16/data-streams.ts +513 -442
- package/src/drafts/draft16/error-codes.ts +68 -0
- package/src/drafts/draft16/index.ts +15 -0
- package/src/drafts/draft16/messages.ts +4 -4
- package/src/drafts/draft16/session-fsm.ts +0 -1
- package/src/drafts/draft16/types.ts +24 -10
- package/src/drafts/draft17/codec.ts +77 -10
- package/src/drafts/draft17/data-streams.ts +567 -488
- package/src/drafts/draft17/index.ts +15 -0
- package/src/drafts/draft17/types.ts +9 -2
- package/src/drafts/draft18/codec.ts +70 -7
- package/src/drafts/draft18/data-streams.ts +570 -482
- package/src/drafts/draft18/index.ts +3 -0
- package/src/drafts/draft18/types.ts +18 -10
- package/src/drafts/draft19/codec.ts +95 -23
- package/src/drafts/draft19/data-streams.ts +570 -482
- package/src/drafts/draft19/error-codes.ts +3 -1
- package/src/drafts/draft19/index.ts +3 -0
- package/src/drafts/draft19/messages.ts +3 -1
- package/src/drafts/draft19/types.ts +32 -18
- package/src/drafts/draft20/codec.ts +115 -36
- package/src/drafts/draft20/data-streams.ts +610 -563
- package/src/drafts/draft20/index.ts +3 -0
- package/src/drafts/draft20/types.ts +31 -13
- package/dist/codec-BJ7BHuiZ.d.ts +0 -18
- 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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|