@norskvideo/moq-net 0.1.8 → 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/README.md +2 -2
- package/announce.d.ts +7 -0
- package/announce.d.ts.map +1 -0
- package/announce.js +8 -0
- package/announce.js.map +1 -0
- package/announced.d.ts +49 -91
- package/announced.d.ts.map +1 -1
- package/announced.js +21 -156
- package/announced.js.map +1 -1
- package/bandwidth.d.ts +163 -0
- package/bandwidth.d.ts.map +1 -0
- package/bandwidth.js +304 -0
- package/bandwidth.js.map +1 -0
- package/bandwidth_api.d.ts +7 -0
- package/bandwidth_api.d.ts.map +1 -0
- package/bandwidth_api.js +8 -0
- package/bandwidth_api.js.map +1 -0
- package/broadcast.d.ts +44 -35
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +104 -60
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +16 -1
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +52 -28
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts.map +1 -1
- package/connection/browser.js +9 -7
- package/connection/browser.js.map +1 -1
- package/connection/connect.d.ts +30 -6
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +110 -54
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +17 -21
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/forward.d.ts +2 -0
- package/connection/forward.d.ts.map +1 -0
- package/connection/forward.js +173 -0
- package/connection/forward.js.map +1 -0
- package/connection/handshake.d.ts +1 -0
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +5 -2
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +5 -5
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +4 -5
- package/connection/index.js.map +1 -1
- package/connection/pool.d.ts +186 -0
- package/connection/pool.d.ts.map +1 -0
- package/connection/pool.js +361 -0
- package/connection/pool.js.map +1 -0
- package/connection/reload.d.ts +14 -93
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +217 -81
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +3 -26
- package/connection/stats.d.ts.map +1 -1
- package/connection/stats.js.map +1 -1
- package/connection/transport.d.ts +0 -7
- package/connection/transport.d.ts.map +1 -1
- package/consume.d.ts +1 -43
- package/consume.d.ts.map +1 -1
- package/consume.js +1 -1
- package/consume.js.map +1 -1
- package/error.d.ts +180 -29
- package/error.d.ts.map +1 -1
- package/error.js +331 -16
- package/error.js.map +1 -1
- package/errors.d.ts +7 -0
- package/errors.d.ts.map +1 -0
- package/errors.js +8 -0
- package/errors.js.map +1 -0
- package/group.d.ts +9 -43
- package/group.d.ts.map +1 -1
- package/group.js +284 -69
- package/group.js.map +1 -1
- package/hop.d.ts +115 -0
- package/hop.d.ts.map +1 -0
- package/hop.js +119 -0
- package/hop.js.map +1 -0
- package/ietf/adapter.d.ts +5 -1
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +105 -60
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +1 -78
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/cluster.d.ts +9 -123
- package/ietf/cluster.d.ts.map +1 -1
- package/ietf/cluster.js +84 -44
- package/ietf/cluster.js.map +1 -1
- package/ietf/connection.d.ts +6 -72
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +62 -56
- package/ietf/connection.js.map +1 -1
- package/ietf/error.d.ts +11 -0
- package/ietf/error.d.ts.map +1 -0
- package/ietf/error.js +193 -0
- package/ietf/error.js.map +1 -0
- package/ietf/fetch.d.ts +7 -20
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +52 -22
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +2 -0
- package/ietf/filter.d.ts.map +1 -1
- package/ietf/filter.js +10 -1
- package/ietf/filter.js.map +1 -1
- package/ietf/goaway.d.ts.map +1 -1
- package/ietf/goaway.js +22 -5
- package/ietf/goaway.js.map +1 -1
- package/ietf/hidden.d.ts +2 -0
- package/ietf/hidden.d.ts.map +1 -0
- package/ietf/hidden.js +30 -0
- package/ietf/hidden.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +2 -0
- package/ietf/index.js.map +1 -1
- package/ietf/object.d.ts +15 -8
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +51 -36
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +14 -2
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +97 -29
- package/ietf/parameters.js.map +1 -1
- package/ietf/properties.d.ts +1 -0
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +14 -0
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts +19 -2
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +40 -6
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +25 -0
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +63 -0
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +1 -82
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +483 -235
- package/ietf/publisher.js.map +1 -1
- package/ietf/solicit.d.ts +1 -40
- package/ietf/solicit.d.ts.map +1 -1
- package/ietf/subscribe.d.ts +8 -6
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +33 -27
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +8 -2
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +18 -8
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +1 -65
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +337 -123
- package/ietf/subscriber.js.map +1 -1
- package/ietf/token.d.ts +2 -0
- package/ietf/token.d.ts.map +1 -0
- package/ietf/token.js +99 -0
- package/ietf/token.js.map +1 -0
- package/ietf/track.d.ts +4 -0
- package/ietf/track.d.ts.map +1 -1
- package/ietf/track.js +6 -20
- package/ietf/track.js.map +1 -1
- package/ietf/version.d.ts +12 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +13 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +12 -7
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +115 -1
- package/internal.d.ts.map +1 -1
- package/internal.js +108 -0
- package/internal.js.map +1 -1
- package/lite/announce.d.ts +60 -10
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +176 -31
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +9 -59
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +34 -35
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +3 -2
- package/lite/datagram.d.ts.map +1 -1
- package/lite/datagram.js +7 -8
- package/lite/datagram.js.map +1 -1
- package/lite/fetch.d.ts +15 -1
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +39 -7
- package/lite/fetch.js.map +1 -1
- package/lite/goaway.d.ts.map +1 -1
- package/lite/goaway.js +7 -1
- package/lite/goaway.js.map +1 -1
- package/lite/group.d.ts +30 -12
- package/lite/group.d.ts.map +1 -1
- package/lite/group.js +68 -26
- package/lite/group.js.map +1 -1
- package/lite/message.d.ts +2 -2
- package/lite/message.d.ts.map +1 -1
- package/lite/message.js +14 -5
- package/lite/message.js.map +1 -1
- package/lite/priority.d.ts +1 -61
- package/lite/priority.d.ts.map +1 -1
- package/lite/priority.js +4 -5
- package/lite/priority.js.map +1 -1
- package/lite/publisher.d.ts +1 -69
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +630 -262
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +8 -8
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +33 -30
- package/lite/setup.js.map +1 -1
- package/lite/subscribe.d.ts +71 -17
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +205 -53
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +15 -56
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +451 -247
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +4 -10
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +34 -29
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +42 -6
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +126 -10
- package/lite/version.js.map +1 -1
- package/origin.d.ts +256 -29
- package/origin.d.ts.map +1 -1
- package/origin.js +1427 -37
- package/origin.js.map +1 -1
- package/package.json +8 -3
- package/path.d.ts +25 -7
- package/path.d.ts.map +1 -1
- package/path.js +5 -3
- package/path.js.map +1 -1
- package/stream.d.ts +73 -14
- package/stream.d.ts.map +1 -1
- package/stream.js +372 -141
- package/stream.js.map +1 -1
- package/tail.d.ts +18 -0
- package/tail.d.ts.map +1 -0
- package/tail.js +167 -0
- package/tail.js.map +1 -0
- package/time.d.ts +15 -2
- package/time.d.ts.map +1 -1
- package/time.js +28 -9
- package/time.js.map +1 -1
- package/track.d.ts +211 -83
- package/track.d.ts.map +1 -1
- package/track.js +816 -205
- package/track.js.map +1 -1
- package/util/abort.d.ts +2 -0
- package/util/abort.d.ts.map +1 -0
- package/util/abort.js +20 -0
- package/util/abort.js.map +1 -0
- package/util/log.d.ts +5 -0
- package/util/log.d.ts.map +1 -0
- package/util/log.js +17 -0
- package/util/log.js.map +1 -0
- package/util/u64.d.ts +39 -0
- package/util/u64.d.ts.map +1 -0
- package/util/u64.js +83 -0
- package/util/u64.js.map +1 -0
- package/util/varint.d.ts +29 -0
- package/util/varint.d.ts.map +1 -0
- package/util/varint.js +198 -0
- package/util/varint.js.map +1 -0
- package/varint.d.ts +10 -6
- package/varint.d.ts.map +1 -1
- package/varint.js +40 -237
- package/varint.js.map +1 -1
- package/wire.d.ts +80 -0
- package/wire.d.ts.map +1 -0
- package/wire.js +32 -0
- package/wire.js.map +1 -0
- package/zod.d.ts +1 -1
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/mock.d.ts +0 -66
- package/mock.d.ts.map +0 -1
- package/mock.js +0 -243
- package/mock.js.map +0 -1
package/ietf/filter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/ietf/filter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Location Filter carried by SUBSCRIBE, and draft-20's fill request.\n *\n * @module\n */\n\nimport type { Reader } from \"../stream.ts\";\nimport * as Varint from \"../varint.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/** Which Objects a subscription delivers. */\nexport type Filter =\n\t/** Every Object in the track, encoded by omitting the parameter. */\n\t| { kind: \"unfiltered\" }\n\t/** The next Object after the live edge, which can begin mid-group. */\n\t| { kind: \"nextObject\" }\n\t/**\n\t * The given number of groups back from the next group, always open ended.\n\t * Zero is the next group and one is the current one.\n\t */\n\t| { kind: \"relative\"; groups: bigint }\n\t/**\n\t * An absolute range. `endGroup` is the last group, inclusive; `endObject` further bounds\n\t * the last object in it, and its absence includes the whole end group.\n\t */\n\t| { kind: \"absolute\"; startGroup: bigint; startObject: bigint; endGroup?: bigint; endObject?: bigint };\n\n/** The tagged Filter Type of draft-19 and earlier. */\nconst TAG_NEXT_GROUP = 0x1n;\nconst TAG_LARGEST_OBJECT = 0x2n;\nconst TAG_ABSOLUTE_START = 0x3n;\nconst TAG_ABSOLUTE_RANGE = 0x4n;\n\n/**\n * Whether this is draft-20 or newer.\n *\n * Draft-20 replaced the Filter Type tag with up to four optional varints, where the number\n * present selects the meaning.\n */\nexport function isDraft20(version: IetfVersion): boolean {\n\treturn version === Version.DRAFT_20;\n}\n\n/**\n * Draft-17 replaced QUIC's two-bit-length varint with a leading-1-bits one. The two agree\n * below 64 and diverge above it, so getting this wrong is invisible until group or object\n * ids grow past that.\n */\nfunction usesLeadingOnes(version: IetfVersion): boolean {\n\treturn version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16;\n}\n\nfunction varint(v: bigint, version: IetfVersion): Uint8Array {\n\treturn usesLeadingOnes(version) ? Varint.encodeLeadingOnes(v) : Varint.encode(v);\n}\n\nfunction unvarint(buf: Uint8Array, version: IetfVersion): [bigint, Uint8Array] {\n\treturn usesLeadingOnes(version) ? Varint.decodeLeadingOnes(buf) : Varint.decodeBigInt(buf);\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n\tconst total = parts.reduce((n, p) => n + p.length, 0);\n\tconst out = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const part of parts) {\n\t\tout.set(part, offset);\n\t\toffset += part.length;\n\t}\n\treturn out;\n}\n\nfunction endDelta(startGroup: bigint, endGroup: bigint): bigint {\n\tif (endGroup < startGroup) {\n\t\tthrow new Error(`filter range runs backwards: ${startGroup} > ${endGroup}`);\n\t}\n\treturn endGroup - startGroup;\n}\n\n/** Encode a filter as its raw parameter value. Unfiltered encodes to zero bytes. */\nexport function encode(filter: Filter, version: IetfVersion): Uint8Array {\n\treturn isDraft20(version) ? encodeFields(filter, version) : encodeTag(filter, version);\n}\n\nfunction encodeFields(filter: Filter, version: IetfVersion): Uint8Array {\n\tswitch (filter.kind) {\n\t\tcase \"unfiltered\":\n\t\t\treturn new Uint8Array();\n\t\tcase \"nextObject\":\n\t\t\treturn concat([varint(0n, version), varint(0n, version)]);\n\t\tcase \"relative\":\n\t\t\treturn varint(filter.groups, version);\n\t\tcase \"absolute\": {\n\t\t\t// An open ended absolute {0, 0} is defined as equivalent to unfiltered, so it\n\t\t\t// normalizes rather than colliding with the two-zero-field nextObject spelling.\n\t\t\tif (filter.startGroup === 0n && filter.startObject === 0n && filter.endGroup === undefined) {\n\t\t\t\treturn new Uint8Array();\n\t\t\t}\n\t\t\tconst parts = [varint(filter.startGroup, version), varint(filter.startObject, version)];\n\t\t\tif (filter.endGroup !== undefined) {\n\t\t\t\tparts.push(varint(endDelta(filter.startGroup, filter.endGroup), version));\n\t\t\t\tif (filter.endObject !== undefined) {\n\t\t\t\t\tparts.push(varint(filter.endObject, version));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn concat(parts);\n\t\t}\n\t}\n}\n\nfunction encodeTag(filter: Filter, version: IetfVersion): Uint8Array {\n\tswitch (filter.kind) {\n\t\tcase \"unfiltered\":\n\t\t\t// No tag means \"everything\", which only the absolute spelling can say.\n\t\t\treturn concat([varint(TAG_ABSOLUTE_START, version), varint(0n, version), varint(0n, version)]);\n\t\tcase \"nextObject\":\n\t\t\treturn varint(TAG_LARGEST_OBJECT, version);\n\t\tcase \"relative\":\n\t\t\tif (filter.groups !== 0n) {\n\t\t\t\t// Only draft-20 can name a start further back than the next group without\n\t\t\t\t// knowing Largest Object, so there is no honest tag to fall back to.\n\t\t\t\tthrow new Error(`relative filter ${filter.groups} needs draft-20`);\n\t\t\t}\n\t\t\treturn varint(TAG_NEXT_GROUP, version);\n\t\tcase \"absolute\": {\n\t\t\t// Draft-19's AbsoluteRange ends on a group, so an object-bounded range has no\n\t\t\t// spelling. Refuse rather than widen the range the caller asked for.\n\t\t\tif (filter.endObject !== undefined) {\n\t\t\t\tthrow new Error(\"an object-bounded range needs draft-20\");\n\t\t\t}\n\t\t\tconst parts = [\n\t\t\t\tvarint(filter.endGroup === undefined ? TAG_ABSOLUTE_START : TAG_ABSOLUTE_RANGE, version),\n\t\t\t\tvarint(filter.startGroup, version),\n\t\t\t\tvarint(filter.startObject, version),\n\t\t\t];\n\t\t\tif (filter.endGroup !== undefined) {\n\t\t\t\tparts.push(varint(endDelta(filter.startGroup, filter.endGroup), version));\n\t\t\t}\n\t\t\treturn concat(parts);\n\t\t}\n\t}\n}\n\n/** Decode a filter from its raw parameter value. */\nexport function decode(data: Uint8Array, version: IetfVersion): Filter {\n\treturn isDraft20(version) ? decodeFields(data, version) : decodeTag(data, version);\n}\n\nfunction decodeFields(data: Uint8Array, version: IetfVersion): Filter {\n\tconst fields: bigint[] = [];\n\tlet rest = data;\n\twhile (rest.length > 0) {\n\t\tif (fields.length === 4) {\n\t\t\tthrow new Error(\"too many fields in LOCATION_FILTER\");\n\t\t}\n\t\tconst [value, next] = unvarint(rest, version);\n\t\tfields.push(value);\n\t\trest = next;\n\t}\n\n\tswitch (fields.length) {\n\t\tcase 0:\n\t\t\treturn { kind: \"unfiltered\" };\n\t\tcase 1:\n\t\t\treturn { kind: \"relative\", groups: fields[0] };\n\t\tdefault: {\n\t\t\tconst [startGroup, startObject] = fields;\n\t\t\t// Two zeroes is the Next Object spelling; anything else is an absolute start.\n\t\t\tif (fields.length === 2 && startGroup === 0n && startObject === 0n) {\n\t\t\t\treturn { kind: \"nextObject\" };\n\t\t\t}\n\t\t\tconst endGroup = fields.length >= 3 ? startGroup + fields[2] : undefined;\n\t\t\tconst endObject = fields.length === 4 ? fields[3] : undefined;\n\t\t\treturn { kind: \"absolute\", startGroup, startObject, endGroup, endObject };\n\t\t}\n\t}\n}\n\nfunction decodeTag(data: Uint8Array, version: IetfVersion): Filter {\n\tconst [tag, afterTag] = unvarint(data, version);\n\n\tconst readLocation = (buf: Uint8Array): [bigint, bigint, Uint8Array] => {\n\t\tconst [group, afterGroup] = unvarint(buf, version);\n\t\tconst [object, rest] = unvarint(afterGroup, version);\n\t\treturn [group, object, rest];\n\t};\n\n\tswitch (tag) {\n\t\tcase TAG_NEXT_GROUP:\n\t\t\texpectEmpty(afterTag);\n\t\t\treturn { kind: \"relative\", groups: 0n };\n\t\tcase TAG_LARGEST_OBJECT:\n\t\t\texpectEmpty(afterTag);\n\t\t\treturn { kind: \"nextObject\" };\n\t\tcase TAG_ABSOLUTE_START: {\n\t\t\tconst [startGroup, startObject, rest] = readLocation(afterTag);\n\t\t\texpectEmpty(rest);\n\t\t\treturn { kind: \"absolute\", startGroup, startObject };\n\t\t}\n\t\tcase TAG_ABSOLUTE_RANGE: {\n\t\t\tconst [startGroup, startObject, afterLocation] = readLocation(afterTag);\n\t\t\tconst [delta, rest] = unvarint(afterLocation, version);\n\t\t\texpectEmpty(rest);\n\t\t\treturn { kind: \"absolute\", startGroup, startObject, endGroup: startGroup + delta };\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`unsupported filter type: ${tag}`);\n\t}\n}\n\n/**\n * Read the tagged filter draft-14 carries inline in a SUBSCRIBE body, where the fields\n * following the tag have no length to delimit them.\n *\n * Every tag is read, including the absolute forms we do not serve. Rejecting one would tear\n * the session down over a filter the draft lets a subscriber send; what we do with it is\n * decided when the range is resolved.\n */\nexport async function decodeInline(r: Reader): Promise<Filter> {\n\tconst tag = await r.u62();\n\tswitch (tag) {\n\t\tcase TAG_NEXT_GROUP:\n\t\t\treturn { kind: \"relative\", groups: 0n };\n\t\tcase TAG_LARGEST_OBJECT:\n\t\t\treturn { kind: \"nextObject\" };\n\t\tcase TAG_ABSOLUTE_START:\n\t\t\treturn { kind: \"absolute\", startGroup: await r.u62(), startObject: await r.u62() };\n\t\tcase TAG_ABSOLUTE_RANGE: {\n\t\t\tconst startGroup = await r.u62();\n\t\t\tconst startObject = await r.u62();\n\t\t\tconst delta = await r.u62();\n\t\t\treturn { kind: \"absolute\", startGroup, startObject, endGroup: startGroup + delta };\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`unsupported filter type: ${tag}`);\n\t}\n}\n\nfunction expectEmpty(rest: Uint8Array): void {\n\tif (rest.length !== 0) {\n\t\tthrow new Error(\"trailing bytes in LOCATION_FILTER\");\n\t}\n}\n\n/**\n * A draft-20 fill: the backfill a subscriber asks for alongside its subscription.\n *\n * The publisher serves one whose range resolves to a single group, straight from the group\n * cache on a fetch stream. That covers the draft's own current-group join (a Next Object\n * subscription plus a `StartGroup=1` fill). Anything wider is refused by resetting the\n * fetch stream, the draft's fill-failure signal.\n */\nexport interface Fill {\n\t/**\n\t * The range to fill. `undefined` means the Location Filter was omitted, which inherits\n\t * the subscription's own filter; `unfiltered` (a zero length filter) means the whole\n\t * track up to Largest Object.\n\t */\n\tfilter?: Filter;\n\n\t/**\n\t * Whether the scope carried a Range Filter (0x25-0x28). Those narrow which objects pass,\n\t * which we do not implement, and serving the unfiltered range instead would deliver\n\t * objects the peer excluded. Never encoded; we send no range filters.\n\t */\n\trangeFilters: boolean;\n}\n\n/** LOCATION_FILTER, the only parameter we act on inside a fill. */\nconst FILL_LOCATION_FILTER = 0x21n;\n\n/**\n * The parameters draft-20 allows inside FILL_PARAMETERS, and how each frames its value.\n *\n * Tabulated rather than derived, because neither shortcut is right. The Key-Value-Pair rule\n * keys framing off the id's parity, but the Range Filters (0x25-0x28) carry an explicit\n * Length despite two of them having even ids. And a uint8 parameter is one raw byte rather\n * than a varint, so reading it as one misparses any value with a leading 1-bit. Either\n * mistake desyncs every parameter after it.\n */\n/**\n * Maps each to whether it carries a length prefix.\n *\n * The Key-Value-Pair rule keys the framing off the id's parity, but the Range Filters\n * (0x25-0x28) are written with an explicit `Length` field despite two of them having even\n * ids. Their own definition wins, so the framing is tabulated rather than derived: reading\n * 0x26 or 0x28 as a bare varint would desync every parameter after it.\n */\ntype Framing = \"byte\" | \"varint\" | \"bytes\";\n\nconst FILL_ALLOWED = new Map<bigint, Framing>([\n\t[0x0an, \"varint\"], // FILL_TIMEOUT\n\t[0x20n, \"byte\"], // SUBSCRIBER_PRIORITY, a uint8\n\t[FILL_LOCATION_FILTER, \"bytes\"],\n\t[0x22n, \"byte\"], // GROUP_ORDER, a uint8\n\t[0x25n, \"bytes\"], // SUBGROUP_FILTER\n\t[0x26n, \"bytes\"], // OBJECTID_FILTER, length prefixed despite an even id\n\t[0x27n, \"bytes\"], // PRIORITY_FILTER\n\t[0x28n, \"bytes\"], // OBJECT_PROPERTY_FILTER, likewise\n]);\n\n/**\n * Encode FILL_PARAMETERS, whose presence is what requests a backfill.\n *\n * The value is a nested parameter scope, encoded like a message's parameters.\n */\nexport function encodeFill(fill: Fill, version: IetfVersion): Uint8Array {\n\t// An omitted filter inherits the subscription's, so the scope is empty. An explicit\n\t// unfiltered still encodes, as a zero length filter meaning the whole track.\n\tif (fill.filter === undefined) {\n\t\treturn varint(0n, version);\n\t}\n\treturn concat([\n\t\tvarint(1n, version),\n\t\t// The first type in a scope is not delta encoded, so this is the raw id.\n\t\tvarint(FILL_LOCATION_FILTER, version),\n\t\tencodeLengthPrefixed(encode(fill.filter, version), version),\n\t]);\n}\n\n/** Decode FILL_PARAMETERS, returning the range it asks to fill. */\nexport function decodeFill(data: Uint8Array, version: IetfVersion): Fill {\n\tconst [count, afterCount] = unvarint(data, version);\n\tif (count > 64n) {\n\t\tthrow new Error(\"too many parameters in FILL_PARAMETERS\");\n\t}\n\n\tlet rest = afterCount;\n\tlet filter: Filter | undefined;\n\tlet rangeFilters = false;\n\tlet prev = 0n;\n\tfor (let i = 0n; i < count; i++) {\n\t\tconst [delta, afterType] = unvarint(rest, version);\n\t\tconst key = i === 0n ? delta : prev + delta;\n\t\tprev = key;\n\t\trest = afterType;\n\n\t\tconst framing = FILL_ALLOWED.get(key);\n\t\tif (framing === undefined) {\n\t\t\tthrow new Error(`parameter ${key} is not allowed inside FILL_PARAMETERS`);\n\t\t}\n\n\t\t// A Range Filter changes which objects the fill may contain, so its presence is\n\t\t// recorded even though its value is not interpreted.\n\t\trangeFilters ||= key >= 0x25n && key <= 0x28n;\n\n\t\t// The rest are parameters we do not act on, but their bytes still have to be\n\t\t// consumed or the remaining keys desync.\n\t\tif (framing === \"varint\") {\n\t\t\t[, rest] = unvarint(rest, version);\n\t\t\tcontinue;\n\t\t}\n\t\tif (framing === \"byte\") {\n\t\t\tif (rest.length < 1) throw new Error(\"truncated value inside FILL_PARAMETERS\");\n\t\t\trest = rest.slice(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [length, afterLength] = unvarint(rest, version);\n\t\tif (BigInt(afterLength.length) < length) {\n\t\t\tthrow new Error(\"truncated value inside FILL_PARAMETERS\");\n\t\t}\n\t\tconst value = afterLength.slice(0, Number(length));\n\t\trest = afterLength.slice(Number(length));\n\n\t\tif (key === FILL_LOCATION_FILTER) {\n\t\t\tif (filter !== undefined) {\n\t\t\t\tthrow new Error(\"duplicate LOCATION_FILTER inside FILL_PARAMETERS\");\n\t\t\t}\n\t\t\tfilter = decode(value, version);\n\t\t}\n\t}\n\n\tif (rest.length !== 0) {\n\t\tthrow new Error(\"trailing bytes in FILL_PARAMETERS\");\n\t}\n\n\treturn { filter, rangeFilters };\n}\n\nfunction encodeLengthPrefixed(value: Uint8Array, version: IetfVersion): Uint8Array {\n\treturn concat([varint(BigInt(value.length), version), value]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/ietf/filter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Location Filter carried by SUBSCRIBE, and draft-20's fill request.\n *\n * @module\n */\n\nimport type { Reader } from \"../stream.ts\";\nimport * as Varint from \"../varint.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/** Which Objects a subscription delivers. */\nexport type Filter =\n\t/** Every Object in the track, encoded by omitting the parameter. */\n\t| { kind: \"unfiltered\" }\n\t/** The next Object after the live edge, which can begin mid-group. */\n\t| { kind: \"nextObject\" }\n\t/**\n\t * The given number of groups back from the next group, always open ended.\n\t * Zero is the next group and one is the current one.\n\t */\n\t| { kind: \"relative\"; groups: bigint }\n\t/**\n\t * An absolute range. `endGroup` is the last group, inclusive; `endObject` further bounds\n\t * the last object in it, and its absence includes the whole end group.\n\t */\n\t| { kind: \"absolute\"; startGroup: bigint; startObject: bigint; endGroup?: bigint; endObject?: bigint };\n\n/** The tagged Filter Type of draft-19 and earlier. */\nconst TAG_NEXT_GROUP = 0x1n;\nconst TAG_LARGEST_OBJECT = 0x2n;\nconst TAG_ABSOLUTE_START = 0x3n;\nconst TAG_ABSOLUTE_RANGE = 0x4n;\n\n/**\n * Whether this is draft-20 or newer.\n *\n * Draft-20 replaced the Filter Type tag with up to four optional varints, where the number\n * present selects the meaning.\n */\nexport function isDraft20(version: IetfVersion): boolean {\n\treturn (\n\t\tversion !== Version.DRAFT_14 &&\n\t\tversion !== Version.DRAFT_15 &&\n\t\tversion !== Version.DRAFT_16 &&\n\t\tversion !== Version.DRAFT_17 &&\n\t\tversion !== Version.DRAFT_18 &&\n\t\tversion !== Version.DRAFT_19\n\t);\n}\n\n/** Whether the Range Filters (draft-19) exist on this draft. */\nexport function hasRangeFilters(version: IetfVersion): boolean {\n\treturn isDraft20(version) || version === Version.DRAFT_19;\n}\n\n/**\n * Draft-17 replaced QUIC's two-bit-length varint with a leading-1-bits one. The two agree\n * below 64 and diverge above it, so getting this wrong is invisible until group or object\n * ids grow past that.\n */\nfunction usesLeadingOnes(version: IetfVersion): boolean {\n\treturn version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16;\n}\n\nfunction varint(v: bigint, version: IetfVersion): Uint8Array {\n\treturn usesLeadingOnes(version) ? Varint.encodeLeadingOnes(v) : Varint.encode(v);\n}\n\nfunction unvarint(buf: Uint8Array, version: IetfVersion): [bigint, Uint8Array] {\n\treturn usesLeadingOnes(version) ? Varint.decodeLeadingOnes(buf) : Varint.decodeBigInt(buf);\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n\tconst total = parts.reduce((n, p) => n + p.length, 0);\n\tconst out = new Uint8Array(total);\n\tlet offset = 0;\n\tfor (const part of parts) {\n\t\tout.set(part, offset);\n\t\toffset += part.length;\n\t}\n\treturn out;\n}\n\nfunction endDelta(startGroup: bigint, endGroup: bigint): bigint {\n\tif (endGroup < startGroup) {\n\t\tthrow new Error(`filter range runs backwards: ${startGroup} > ${endGroup}`);\n\t}\n\treturn endGroup - startGroup;\n}\n\n/** Encode a filter as its raw parameter value. Unfiltered encodes to zero bytes. */\nexport function encode(filter: Filter, version: IetfVersion): Uint8Array {\n\treturn isDraft20(version) ? encodeFields(filter, version) : encodeTag(filter, version);\n}\n\nfunction encodeFields(filter: Filter, version: IetfVersion): Uint8Array {\n\tswitch (filter.kind) {\n\t\tcase \"unfiltered\":\n\t\t\treturn new Uint8Array();\n\t\tcase \"nextObject\":\n\t\t\treturn concat([varint(0n, version), varint(0n, version)]);\n\t\tcase \"relative\":\n\t\t\treturn varint(filter.groups, version);\n\t\tcase \"absolute\": {\n\t\t\t// An open ended absolute {0, 0} is defined as equivalent to unfiltered, so it\n\t\t\t// normalizes rather than colliding with the two-zero-field nextObject spelling.\n\t\t\tif (filter.startGroup === 0n && filter.startObject === 0n && filter.endGroup === undefined) {\n\t\t\t\treturn new Uint8Array();\n\t\t\t}\n\t\t\tconst parts = [varint(filter.startGroup, version), varint(filter.startObject, version)];\n\t\t\tif (filter.endGroup !== undefined) {\n\t\t\t\tparts.push(varint(endDelta(filter.startGroup, filter.endGroup), version));\n\t\t\t\tif (filter.endObject !== undefined) {\n\t\t\t\t\tparts.push(varint(filter.endObject, version));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn concat(parts);\n\t\t}\n\t}\n}\n\nfunction encodeTag(filter: Filter, version: IetfVersion): Uint8Array {\n\tswitch (filter.kind) {\n\t\tcase \"unfiltered\":\n\t\t\t// No tag means \"everything\", which only the absolute spelling can say.\n\t\t\treturn concat([varint(TAG_ABSOLUTE_START, version), varint(0n, version), varint(0n, version)]);\n\t\tcase \"nextObject\":\n\t\t\treturn varint(TAG_LARGEST_OBJECT, version);\n\t\tcase \"relative\":\n\t\t\tif (filter.groups !== 0n) {\n\t\t\t\t// Only draft-20 can name a start further back than the next group without\n\t\t\t\t// knowing Largest Object, so there is no honest tag to fall back to.\n\t\t\t\tthrow new Error(`relative filter ${filter.groups} needs draft-20`);\n\t\t\t}\n\t\t\treturn varint(TAG_NEXT_GROUP, version);\n\t\tcase \"absolute\": {\n\t\t\t// Draft-19's AbsoluteRange ends on a group, so an object-bounded range has no\n\t\t\t// spelling. Refuse rather than widen the range the caller asked for.\n\t\t\tif (filter.endObject !== undefined) {\n\t\t\t\tthrow new Error(\"an object-bounded range needs draft-20\");\n\t\t\t}\n\t\t\tconst parts = [\n\t\t\t\tvarint(filter.endGroup === undefined ? TAG_ABSOLUTE_START : TAG_ABSOLUTE_RANGE, version),\n\t\t\t\tvarint(filter.startGroup, version),\n\t\t\t\tvarint(filter.startObject, version),\n\t\t\t];\n\t\t\tif (filter.endGroup !== undefined) {\n\t\t\t\tparts.push(varint(endDelta(filter.startGroup, filter.endGroup), version));\n\t\t\t}\n\t\t\treturn concat(parts);\n\t\t}\n\t}\n}\n\n/** Decode a filter from its raw parameter value. */\nexport function decode(data: Uint8Array, version: IetfVersion): Filter {\n\treturn isDraft20(version) ? decodeFields(data, version) : decodeTag(data, version);\n}\n\nfunction decodeFields(data: Uint8Array, version: IetfVersion): Filter {\n\tconst fields: bigint[] = [];\n\tlet rest = data;\n\twhile (rest.length > 0) {\n\t\tif (fields.length === 4) {\n\t\t\tthrow new Error(\"too many fields in LOCATION_FILTER\");\n\t\t}\n\t\tconst [value, next] = unvarint(rest, version);\n\t\tfields.push(value);\n\t\trest = next;\n\t}\n\n\tswitch (fields.length) {\n\t\tcase 0:\n\t\t\treturn { kind: \"unfiltered\" };\n\t\tcase 1:\n\t\t\treturn { kind: \"relative\", groups: fields[0] };\n\t\tdefault: {\n\t\t\tconst [startGroup, startObject] = fields;\n\t\t\t// Two zeroes is the Next Object spelling; anything else is an absolute start.\n\t\t\tif (fields.length === 2 && startGroup === 0n && startObject === 0n) {\n\t\t\t\treturn { kind: \"nextObject\" };\n\t\t\t}\n\t\t\tconst endGroup = fields.length >= 3 ? startGroup + fields[2] : undefined;\n\t\t\tconst endObject = fields.length === 4 ? fields[3] : undefined;\n\t\t\treturn { kind: \"absolute\", startGroup, startObject, endGroup, endObject };\n\t\t}\n\t}\n}\n\nfunction decodeTag(data: Uint8Array, version: IetfVersion): Filter {\n\tconst [tag, afterTag] = unvarint(data, version);\n\n\tconst readLocation = (buf: Uint8Array): [bigint, bigint, Uint8Array] => {\n\t\tconst [group, afterGroup] = unvarint(buf, version);\n\t\tconst [object, rest] = unvarint(afterGroup, version);\n\t\treturn [group, object, rest];\n\t};\n\n\tswitch (tag) {\n\t\tcase TAG_NEXT_GROUP:\n\t\t\texpectEmpty(afterTag);\n\t\t\treturn { kind: \"relative\", groups: 0n };\n\t\tcase TAG_LARGEST_OBJECT:\n\t\t\texpectEmpty(afterTag);\n\t\t\treturn { kind: \"nextObject\" };\n\t\tcase TAG_ABSOLUTE_START: {\n\t\t\tconst [startGroup, startObject, rest] = readLocation(afterTag);\n\t\t\texpectEmpty(rest);\n\t\t\treturn { kind: \"absolute\", startGroup, startObject };\n\t\t}\n\t\tcase TAG_ABSOLUTE_RANGE: {\n\t\t\tconst [startGroup, startObject, afterLocation] = readLocation(afterTag);\n\t\t\tconst [delta, rest] = unvarint(afterLocation, version);\n\t\t\texpectEmpty(rest);\n\t\t\treturn { kind: \"absolute\", startGroup, startObject, endGroup: startGroup + delta };\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`unsupported filter type: ${tag}`);\n\t}\n}\n\n/**\n * Read the tagged filter draft-14 carries inline in a SUBSCRIBE body, where the fields\n * following the tag have no length to delimit them.\n *\n * Every tag is read, including the absolute forms we do not serve. Rejecting one would tear\n * the session down over a filter the draft lets a subscriber send; what we do with it is\n * decided when the range is resolved.\n */\nexport async function decodeInline(r: Reader): Promise<Filter> {\n\tconst tag = await r.u62();\n\tswitch (tag) {\n\t\tcase TAG_NEXT_GROUP:\n\t\t\treturn { kind: \"relative\", groups: 0n };\n\t\tcase TAG_LARGEST_OBJECT:\n\t\t\treturn { kind: \"nextObject\" };\n\t\tcase TAG_ABSOLUTE_START:\n\t\t\treturn { kind: \"absolute\", startGroup: await r.u62(), startObject: await r.u62() };\n\t\tcase TAG_ABSOLUTE_RANGE: {\n\t\t\tconst startGroup = await r.u62();\n\t\t\tconst startObject = await r.u62();\n\t\t\tconst delta = await r.u62();\n\t\t\treturn { kind: \"absolute\", startGroup, startObject, endGroup: startGroup + delta };\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`unsupported filter type: ${tag}`);\n\t}\n}\n\nfunction expectEmpty(rest: Uint8Array): void {\n\tif (rest.length !== 0) {\n\t\tthrow new Error(\"trailing bytes in LOCATION_FILTER\");\n\t}\n}\n\n/**\n * A draft-20 fill: the backfill a subscriber asks for alongside its subscription.\n *\n * The publisher serves one whose range resolves to a single group, straight from the group\n * cache on a fetch stream. That covers the draft's own current-group join (a Next Object\n * subscription plus a `StartGroup=1` fill). Anything wider is refused by resetting the\n * fetch stream, the draft's fill-failure signal.\n */\nexport interface Fill {\n\t/**\n\t * The range to fill. `undefined` means the Location Filter was omitted, which inherits\n\t * the subscription's own filter; `unfiltered` (a zero length filter) means the whole\n\t * track up to Largest Object.\n\t */\n\tfilter?: Filter;\n\n\t/**\n\t * Whether the scope carried a Range Filter (0x25-0x28). Those narrow which objects pass,\n\t * which we do not implement, and serving the unfiltered range instead would deliver\n\t * objects the peer excluded. Never encoded; we send no range filters.\n\t */\n\trangeFilters: boolean;\n}\n\n/** LOCATION_FILTER, the only parameter we act on inside a fill. */\nconst FILL_LOCATION_FILTER = 0x21n;\n\n/**\n * The parameters draft-20 allows inside FILL_PARAMETERS, and how each frames its value.\n *\n * Tabulated rather than derived, because neither shortcut is right. The Key-Value-Pair rule\n * keys framing off the id's parity, but the Range Filters (0x25-0x28) carry an explicit\n * Length despite two of them having even ids. And a uint8 parameter is one raw byte rather\n * than a varint, so reading it as one misparses any value with a leading 1-bit. Either\n * mistake desyncs every parameter after it.\n */\n/**\n * Maps each to whether it carries a length prefix.\n *\n * The Key-Value-Pair rule keys the framing off the id's parity, but the Range Filters\n * (0x25-0x28) are written with an explicit `Length` field despite two of them having even\n * ids. Their own definition wins, so the framing is tabulated rather than derived: reading\n * 0x26 or 0x28 as a bare varint would desync every parameter after it.\n */\ntype Framing = \"byte\" | \"varint\" | \"bytes\";\n\nconst FILL_ALLOWED = new Map<bigint, Framing>([\n\t[0x0an, \"varint\"], // FILL_TIMEOUT\n\t[0x20n, \"byte\"], // SUBSCRIBER_PRIORITY, a uint8\n\t[FILL_LOCATION_FILTER, \"bytes\"],\n\t[0x22n, \"byte\"], // GROUP_ORDER, a uint8\n\t[0x25n, \"bytes\"], // SUBGROUP_FILTER\n\t[0x26n, \"bytes\"], // OBJECTID_FILTER, length prefixed despite an even id\n\t[0x27n, \"bytes\"], // PRIORITY_FILTER\n\t[0x28n, \"bytes\"], // OBJECT_PROPERTY_FILTER, likewise\n]);\n\n/**\n * Encode FILL_PARAMETERS, whose presence is what requests a backfill.\n *\n * The value is a nested parameter scope, encoded like a message's parameters.\n */\nexport function encodeFill(fill: Fill, version: IetfVersion): Uint8Array {\n\t// An omitted filter inherits the subscription's, so the scope is empty. An explicit\n\t// unfiltered still encodes, as a zero length filter meaning the whole track.\n\tif (fill.filter === undefined) {\n\t\treturn varint(0n, version);\n\t}\n\treturn concat([\n\t\tvarint(1n, version),\n\t\t// The first type in a scope is not delta encoded, so this is the raw id.\n\t\tvarint(FILL_LOCATION_FILTER, version),\n\t\tencodeLengthPrefixed(encode(fill.filter, version), version),\n\t]);\n}\n\n/** Decode FILL_PARAMETERS, returning the range it asks to fill. */\nexport function decodeFill(data: Uint8Array, version: IetfVersion): Fill {\n\tconst [count, afterCount] = unvarint(data, version);\n\tif (count > 64n) {\n\t\tthrow new Error(\"too many parameters in FILL_PARAMETERS\");\n\t}\n\n\tlet rest = afterCount;\n\tlet filter: Filter | undefined;\n\tlet rangeFilters = false;\n\tlet prev = 0n;\n\tfor (let i = 0n; i < count; i++) {\n\t\tconst [delta, afterType] = unvarint(rest, version);\n\t\tconst key = i === 0n ? delta : prev + delta;\n\t\tprev = key;\n\t\trest = afterType;\n\n\t\tconst framing = FILL_ALLOWED.get(key);\n\t\tif (framing === undefined) {\n\t\t\tthrow new Error(`parameter ${key} is not allowed inside FILL_PARAMETERS`);\n\t\t}\n\n\t\t// A Range Filter changes which objects the fill may contain, so its presence is\n\t\t// recorded even though its value is not interpreted.\n\t\trangeFilters ||= key >= 0x25n && key <= 0x28n;\n\n\t\t// The rest are parameters we do not act on, but their bytes still have to be\n\t\t// consumed or the remaining keys desync.\n\t\tif (framing === \"varint\") {\n\t\t\t[, rest] = unvarint(rest, version);\n\t\t\tcontinue;\n\t\t}\n\t\tif (framing === \"byte\") {\n\t\t\tif (rest.length < 1) throw new Error(\"truncated value inside FILL_PARAMETERS\");\n\t\t\trest = rest.slice(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [length, afterLength] = unvarint(rest, version);\n\t\tif (BigInt(afterLength.length) < length) {\n\t\t\tthrow new Error(\"truncated value inside FILL_PARAMETERS\");\n\t\t}\n\t\tconst value = afterLength.slice(0, Number(length));\n\t\trest = afterLength.slice(Number(length));\n\n\t\tif (key === FILL_LOCATION_FILTER) {\n\t\t\tif (filter !== undefined) {\n\t\t\t\tthrow new Error(\"duplicate LOCATION_FILTER inside FILL_PARAMETERS\");\n\t\t\t}\n\t\t\tfilter = decode(value, version);\n\t\t}\n\t}\n\n\tif (rest.length !== 0) {\n\t\tthrow new Error(\"trailing bytes in FILL_PARAMETERS\");\n\t}\n\n\treturn { filter, rangeFilters };\n}\n\nfunction encodeLengthPrefixed(value: Uint8Array, version: IetfVersion): Uint8Array {\n\treturn concat([varint(BigInt(value.length), version), value]);\n}\n"]}
|
package/ietf/goaway.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goaway.d.ts","sourceRoot":"","sources":["../../src/ietf/goaway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAEzD,qBAAa,MAAM;;IAClB,MAAM,CAAC,EAAE,SAAQ;IAEjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,YAAY,EAAE,aAAa,EAAE,OAAY,EAAE,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAGvF;
|
|
1
|
+
{"version":3,"file":"goaway.d.ts","sourceRoot":"","sources":["../../src/ietf/goaway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAEzD,qBAAa,MAAM;;IAClB,MAAM,CAAC,EAAE,SAAQ;IAEjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,YAAY,EAAE,aAAa,EAAE,OAAY,EAAE,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAGvF;IAgBK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;CAqBD"}
|
package/ietf/goaway.js
CHANGED
|
@@ -13,7 +13,13 @@ export class GoAway {
|
|
|
13
13
|
await w.string(this.newSessionUri);
|
|
14
14
|
if (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {
|
|
15
15
|
await w.u62(this.timeout);
|
|
16
|
-
|
|
16
|
+
}
|
|
17
|
+
// Draft-18 (#1559) requires a Request ID on the control stream (the only
|
|
18
|
+
// place GOAWAY is sent); omitting it is a length mismatch a conformant
|
|
19
|
+
// peer must reject. We advertise 0 ("no requests processed"), matching
|
|
20
|
+
// the Rust encoder. Draft-19 removed the field again (#1623).
|
|
21
|
+
if (version === Version.DRAFT_18) {
|
|
22
|
+
await w.u62(0n);
|
|
17
23
|
}
|
|
18
24
|
}
|
|
19
25
|
async encode(w, version) {
|
|
@@ -24,10 +30,21 @@ export class GoAway {
|
|
|
24
30
|
}
|
|
25
31
|
static async #decode(r, version) {
|
|
26
32
|
const newSessionUri = await r.string();
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
// All drafts cap the New Session URI at 8,192 bytes; a longer one is a
|
|
34
|
+
// protocol violation. Matches the Rust decoder.
|
|
35
|
+
if (new TextEncoder().encode(newSessionUri).byteLength > 8192) {
|
|
36
|
+
throw new Error("GOAWAY new session URI exceeds 8,192 bytes");
|
|
37
|
+
}
|
|
38
|
+
let timeout = 0n;
|
|
39
|
+
if (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {
|
|
40
|
+
timeout = await r.u62();
|
|
41
|
+
}
|
|
42
|
+
// Draft-18 optional trailing Request ID (#1559). Drain remaining bytes
|
|
43
|
+
// so the outer message-frame size check passes.
|
|
44
|
+
// Draft-19 removed this field again (#1623).
|
|
45
|
+
if (version === Version.DRAFT_18) {
|
|
46
|
+
await r.readAll();
|
|
47
|
+
}
|
|
31
48
|
return new GoAway({ newSessionUri, timeout });
|
|
32
49
|
}
|
|
33
50
|
}
|
package/ietf/goaway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goaway.js","sourceRoot":"","sources":["../../src/ietf/goaway.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,OAAO,MAAM;IAClB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,aAAa,CAAS;IACtB,OAAO,CAAS;IAEhB,YAAY,EAAE,aAAa,EAAE,OAAO,GAAG,EAAE,EAA+C;QACvF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QAC5C,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"goaway.js","sourceRoot":"","sources":["../../src/ietf/goaway.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,OAAO,MAAM;IAClB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,aAAa,CAAS;IACtB,OAAO,CAAS;IAEhB,YAAY,EAAE,aAAa,EAAE,OAAO,GAAG,EAAE,EAA+C;QACvF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QAC5C,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,yEAAyE;QACzE,uEAAuE;QACvE,uEAAuE;QACvE,8DAA8D;QAC9D,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QACnD,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,uEAAuE;QACvE,gDAAgD;QAChD,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClG,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,uEAAuE;QACvE,gDAAgD;QAChD,6CAA6C;QAC7C,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;CACD","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nexport class GoAway {\n\tstatic id = 0x10;\n\n\tnewSessionUri: string;\n\ttimeout: bigint;\n\n\tconstructor({ newSessionUri, timeout = 0n }: { newSessionUri: string; timeout?: bigint }) {\n\t\tthis.newSessionUri = newSessionUri;\n\t\tthis.timeout = timeout;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tawait w.string(this.newSessionUri);\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {\n\t\t\tawait w.u62(this.timeout);\n\t\t}\n\t\t// Draft-18 (#1559) requires a Request ID on the control stream (the only\n\t\t// place GOAWAY is sent); omitting it is a length mismatch a conformant\n\t\t// peer must reject. We advertise 0 (\"no requests processed\"), matching\n\t\t// the Rust encoder. Draft-19 removed the field again (#1623).\n\t\tif (version === Version.DRAFT_18) {\n\t\t\tawait w.u62(0n);\n\t\t}\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (mw) => this.#encode(mw, version));\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<GoAway> {\n\t\treturn Message.decode(r, (mr) => GoAway.#decode(mr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<GoAway> {\n\t\tconst newSessionUri = await r.string();\n\t\t// All drafts cap the New Session URI at 8,192 bytes; a longer one is a\n\t\t// protocol violation. Matches the Rust decoder.\n\t\tif (new TextEncoder().encode(newSessionUri).byteLength > 8192) {\n\t\t\tthrow new Error(\"GOAWAY new session URI exceeds 8,192 bytes\");\n\t\t}\n\t\tlet timeout = 0n;\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) {\n\t\t\ttimeout = await r.u62();\n\t\t}\n\t\t// Draft-18 optional trailing Request ID (#1559). Drain remaining bytes\n\t\t// so the outer message-frame size check passes.\n\t\t// Draft-19 removed this field again (#1623).\n\t\tif (version === Version.DRAFT_18) {\n\t\t\tawait r.readAll();\n\t\t}\n\t\treturn new GoAway({ newSessionUri, timeout });\n\t}\n}\n"]}
|
package/ietf/hidden.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hidden.d.ts","sourceRoot":"","sources":["../../src/ietf/hidden.ts"],"names":[],"mappings":""}
|
package/ietf/hidden.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* @ts-self-types="./hidden.d.ts" */
|
|
2
|
+
import { SetupOption } from "./parameters.js";
|
|
3
|
+
/**
|
|
4
|
+
* The MoQ Hidden extension (draft-lcurley-moq-hidden-00).
|
|
5
|
+
*
|
|
6
|
+
* A namespace with a field starting with `.` below the prefix a subscription asked for is
|
|
7
|
+
* left out of discovery unless the SUBSCRIBE_NAMESPACE opts in with the HIDDEN parameter.
|
|
8
|
+
* An unknown parameter fails decoding, so the parameter is only sent to a peer whose SETUP
|
|
9
|
+
* carried the HIDDEN option. Peers that did not declare the option receive every namespace.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Whether the peer understands the HIDDEN parameter.
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export function hiddenFromSetup(params) {
|
|
20
|
+
return params.getVarint(SetupOption.Hidden) !== undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Declare that we understand the HIDDEN parameter.
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export function hiddenIntoSetup(params) {
|
|
28
|
+
params.setVarint(SetupOption.Hidden, 1n);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=hidden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hidden.js","sourceRoot":"","sources":["../../src/ietf/hidden.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AAEjE;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IACnD,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IACnD,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { SetupOption, type SetupOptions } from \"./parameters.ts\";\n\n/**\n * The MoQ Hidden extension (draft-lcurley-moq-hidden-00).\n *\n * A namespace with a field starting with `.` below the prefix a subscription asked for is\n * left out of discovery unless the SUBSCRIBE_NAMESPACE opts in with the HIDDEN parameter.\n * An unknown parameter fails decoding, so the parameter is only sent to a peer whose SETUP\n * carried the HIDDEN option. Peers that did not declare the option receive every namespace.\n *\n * @module\n * @internal\n */\n\n/**\n * Whether the peer understands the HIDDEN parameter.\n *\n * @internal\n */\nexport function hiddenFromSetup(params: SetupOptions): boolean {\n\treturn params.getVarint(SetupOption.Hidden) !== undefined;\n}\n\n/**\n * Declare that we understand the HIDDEN parameter.\n *\n * @internal\n */\nexport function hiddenIntoSetup(params: SetupOptions) {\n\tparams.setVarint(SetupOption.Hidden, 1n);\n}\n"]}
|
package/ietf/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * from "./connection";
|
|
|
4
4
|
export * from "./control";
|
|
5
5
|
export * from "./fetch";
|
|
6
6
|
export * from "./goaway";
|
|
7
|
+
export * from "./hidden";
|
|
7
8
|
export * from "./object";
|
|
8
9
|
export * from "./parameters";
|
|
9
10
|
export * from "./publish";
|
|
@@ -15,6 +16,7 @@ export * from "./solicit";
|
|
|
15
16
|
export * from "./subscribe";
|
|
16
17
|
export * from "./subscribe_namespace";
|
|
17
18
|
export * from "./subscriber";
|
|
19
|
+
export * from "./token";
|
|
18
20
|
export * from "./track";
|
|
19
21
|
export * from "./version";
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
package/ietf/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ietf/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ietf/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
|
package/ietf/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from "./connection.js";
|
|
|
6
6
|
export * from "./control.js";
|
|
7
7
|
export * from "./fetch.js";
|
|
8
8
|
export * from "./goaway.js";
|
|
9
|
+
export * from "./hidden.js";
|
|
9
10
|
export * from "./object.js";
|
|
10
11
|
export * from "./parameters.js";
|
|
11
12
|
export * from "./publish.js";
|
|
@@ -17,6 +18,7 @@ export * from "./solicit.js";
|
|
|
17
18
|
export * from "./subscribe.js";
|
|
18
19
|
export * from "./subscribe_namespace.js";
|
|
19
20
|
export * from "./subscriber.js";
|
|
21
|
+
export * from "./token.js";
|
|
20
22
|
export * from "./track.js";
|
|
21
23
|
export * from "./version.js";
|
|
22
24
|
//# sourceMappingURL=index.js.map
|
package/ietf/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ietf/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;2BACJ,cAAc;sBAA3B,OAAO;AACnB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC","sourcesContent":["export * from \"./adapter.ts\";\nexport * as Cluster from \"./cluster.ts\";\nexport * from \"./connection.ts\";\nexport * from \"./control.ts\";\nexport * from \"./fetch.ts\";\nexport * from \"./goaway.ts\";\nexport * from \"./object.ts\";\nexport * from \"./parameters.ts\";\nexport * from \"./publish.ts\";\nexport * from \"./publish_namespace.ts\";\nexport * from \"./publisher.ts\";\nexport * from \"./request.ts\";\nexport * from \"./setup.ts\";\nexport * from \"./solicit.ts\";\nexport * from \"./subscribe.ts\";\nexport * from \"./subscribe_namespace.ts\";\nexport * from \"./subscriber.ts\";\nexport * from \"./track.ts\";\nexport * from \"./version.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ietf/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;2BACJ,cAAc;sBAA3B,OAAO;AACnB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC","sourcesContent":["export * from \"./adapter.ts\";\nexport * as Cluster from \"./cluster.ts\";\nexport * from \"./connection.ts\";\nexport * from \"./control.ts\";\nexport * from \"./fetch.ts\";\nexport * from \"./goaway.ts\";\nexport * from \"./hidden.ts\";\nexport * from \"./object.ts\";\nexport * from \"./parameters.ts\";\nexport * from \"./publish.ts\";\nexport * from \"./publish_namespace.ts\";\nexport * from \"./publisher.ts\";\nexport * from \"./request.ts\";\nexport * from \"./setup.ts\";\nexport * from \"./solicit.ts\";\nexport * from \"./subscribe.ts\";\nexport * from \"./subscribe_namespace.ts\";\nexport * from \"./subscriber.ts\";\nexport * from \"./token.ts\";\nexport * from \"./track.ts\";\nexport * from \"./version.ts\";\n"]}
|
package/ietf/object.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Reader, Writer } from "../stream";
|
|
1
|
+
import { type Cursor, type Reader, Writer } from "../stream";
|
|
2
2
|
import { Timescale, Timestamp } from "../time";
|
|
3
3
|
import { type IetfVersion } from "./version";
|
|
4
4
|
export interface GroupFlags {
|
|
@@ -34,17 +34,24 @@ export declare class Group {
|
|
|
34
34
|
flags: GroupFlags;
|
|
35
35
|
});
|
|
36
36
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
37
|
-
|
|
37
|
+
/** Decode a SUBGROUP_HEADER. Pass `type` when the caller already read it to classify the stream. */
|
|
38
|
+
static decode(r: Reader, version: IetfVersion, type?: number): Promise<Group>;
|
|
38
39
|
}
|
|
39
40
|
/** A moq-transport object inside a group stream. */
|
|
40
41
|
export declare class Frame {
|
|
41
|
-
/** The object payload, or `undefined` for
|
|
42
|
+
/** The object payload, or `undefined` for an end of group or end of track marker. */
|
|
42
43
|
payload?: Uint8Array;
|
|
43
44
|
/** The presentation timestamp carried in object properties, when present. */
|
|
44
45
|
timestamp?: Timestamp;
|
|
45
|
-
|
|
46
|
+
/**
|
|
47
|
+
* An END_OF_TRACK marker: no object at or past its location exists. At object 0 its group
|
|
48
|
+
* does not exist either, so the track ends at that group; later in a group it ends after it.
|
|
49
|
+
*/
|
|
50
|
+
endOfTrack: boolean;
|
|
51
|
+
constructor({ payload, timestamp, endOfTrack, }?: {
|
|
46
52
|
payload?: Uint8Array;
|
|
47
53
|
timestamp?: Timestamp;
|
|
54
|
+
endOfTrack?: boolean;
|
|
48
55
|
});
|
|
49
56
|
/**
|
|
50
57
|
* Encode this frame using the group flags and negotiated IETF version.
|
|
@@ -52,9 +59,9 @@ export declare class Frame {
|
|
|
52
59
|
* `idDelta` is the first object's absolute Object ID and zero for every later one, so a
|
|
53
60
|
* group whose head was trimmed by a filter still puts the true numbering on the wire.
|
|
54
61
|
*/
|
|
55
|
-
encode(w: Writer, flags: GroupFlags, timescale: Timescale, version
|
|
56
|
-
/** Decode a frame using the group flags
|
|
57
|
-
static decode(
|
|
62
|
+
encode(w: Writer, flags: GroupFlags, timescale: Timescale, version: IetfVersion, idDelta?: number): Promise<void>;
|
|
63
|
+
/** Decode a frame using the group flags, at the cursor's negotiated IETF version. */
|
|
64
|
+
static decode(c: Cursor, flags: GroupFlags, timescale: Timescale | undefined): Frame;
|
|
58
65
|
}
|
|
59
66
|
/** Where a {@link FetchFrame} sits in the track, and whether it opens the stream. */
|
|
60
67
|
export interface FetchPosition {
|
|
@@ -83,6 +90,6 @@ export declare class FetchFrame {
|
|
|
83
90
|
timestamp?: Timestamp;
|
|
84
91
|
});
|
|
85
92
|
/** Encode this object at `position`, stamping it in the track's timescale. */
|
|
86
|
-
encode(w: Writer, position: FetchPosition, timescale: Timescale, version
|
|
93
|
+
encode(w: Writer, position: FetchPosition, timescale: Timescale, version: IetfVersion): Promise<void>;
|
|
87
94
|
}
|
|
88
95
|
//# sourceMappingURL=object.d.ts.map
|
package/ietf/object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/ietf/object.ts"],"names":[],"mappings":"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"}
|
package/ietf/object.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/* @ts-self-types="./object.d.ts" */
|
|
2
|
-
import {
|
|
2
|
+
import { ProtocolViolation, StreamCode, Stream as StreamError } from "../error.js";
|
|
3
|
+
import { asIetf, Writer } from "../stream.js";
|
|
3
4
|
import { Timescale, Timestamp } from "../time.js";
|
|
4
5
|
import { Version } from "./version.js";
|
|
6
|
+
// Implementation limit for object extension blocks, independent of the IETF draft.
|
|
7
|
+
const MAX_OBJECT_EXTENSIONS = 64 * 1024;
|
|
5
8
|
const GROUP_END = 0x03;
|
|
9
|
+
const END_OF_TRACK = 0x04;
|
|
6
10
|
// MOQ Object Property ids, shared with draft-ietf-moq-loc-04.
|
|
7
11
|
const PROP_TIMESCALE = 0x08n;
|
|
8
12
|
const PROP_TIMESTAMP = 0x10n;
|
|
@@ -71,18 +75,18 @@ async function encodeObjectExtensions(timestamp, timescale, version) {
|
|
|
71
75
|
}
|
|
72
76
|
return result;
|
|
73
77
|
}
|
|
74
|
-
|
|
78
|
+
function decodeObjectTime(c, timescale) {
|
|
75
79
|
let timestamp;
|
|
76
80
|
let overrideScale;
|
|
77
81
|
let prevType = 0n;
|
|
78
82
|
let first = true;
|
|
79
|
-
while (
|
|
80
|
-
const step =
|
|
81
|
-
const id = !hasDeltaObjectPropertyTypes(version) || first ? step : prevType + step;
|
|
83
|
+
while (c.remaining > 0) {
|
|
84
|
+
const step = c.u62();
|
|
85
|
+
const id = !hasDeltaObjectPropertyTypes(asIetf(c.version)) || first ? step : prevType + step;
|
|
82
86
|
first = false;
|
|
83
87
|
prevType = id;
|
|
84
88
|
if (id % 2n === 0n) {
|
|
85
|
-
const value =
|
|
89
|
+
const value = c.u62();
|
|
86
90
|
if (id === PROP_TIMESTAMP || id === PROP_TIMESTAMP_DRAFT03) {
|
|
87
91
|
timestamp = value;
|
|
88
92
|
}
|
|
@@ -91,8 +95,7 @@ async function decodeObjectTime(r, timescale, version) {
|
|
|
91
95
|
}
|
|
92
96
|
}
|
|
93
97
|
else {
|
|
94
|
-
|
|
95
|
-
await r.read(size);
|
|
98
|
+
c.read(c.u53());
|
|
96
99
|
}
|
|
97
100
|
}
|
|
98
101
|
if (timestamp === undefined) {
|
|
@@ -157,27 +160,24 @@ export class Group {
|
|
|
157
160
|
await w.u8(this.publisherPriority);
|
|
158
161
|
}
|
|
159
162
|
}
|
|
160
|
-
|
|
161
|
-
|
|
163
|
+
/** Decode a SUBGROUP_HEADER. Pass `type` when the caller already read it to classify the stream. */
|
|
164
|
+
static async decode(r, version, type) {
|
|
165
|
+
const raw = type ?? (await r.u53());
|
|
162
166
|
// Strip the draft-18 FIRST_OBJECT bit before the range check, but keep the value:
|
|
163
167
|
// it is the only signal that a subgroup starts partway through. Drafts that predate
|
|
164
168
|
// it carry no such signal, so they are taken at their word.
|
|
165
169
|
const legacy = !hasFirstObjectBit(version);
|
|
166
170
|
const firstObject = legacy || (raw & FIRST_OBJECT_BIT) !== 0;
|
|
167
171
|
const id = legacy ? raw : raw & ~FIRST_OBJECT_BIT;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
174
|
-
else if (id >= 0x30 && id <= 0x3f) {
|
|
175
|
-
hasPriority = false;
|
|
176
|
-
baseId = id - (0x30 - 0x10);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
throw new Error(`Unsupported group type: ${id}`);
|
|
172
|
+
// An invalid type MUST close the session, including the reserved SUBGROUP_ID_MODE
|
|
173
|
+
// 0b11 (draft-21 section 11.3.1).
|
|
174
|
+
const known = (id >= 0x10 && id <= 0x1f) || (id >= 0x30 && id <= 0x3f);
|
|
175
|
+
if (!known || (id & 0x06) === 0x06) {
|
|
176
|
+
throw new ProtocolViolation(`Unsupported group type: ${raw}`);
|
|
180
177
|
}
|
|
178
|
+
// 0x30-0x3F omit the priority and inherit it from the control message.
|
|
179
|
+
const hasPriority = id < 0x30;
|
|
180
|
+
const baseId = hasPriority ? id : id - (0x30 - 0x10);
|
|
181
181
|
const flags = {
|
|
182
182
|
hasExtensions: (baseId & 0x01) !== 0,
|
|
183
183
|
hasSubgroupObject: (baseId & 0x02) !== 0,
|
|
@@ -195,13 +195,19 @@ export class Group {
|
|
|
195
195
|
}
|
|
196
196
|
/** A moq-transport object inside a group stream. */
|
|
197
197
|
export class Frame {
|
|
198
|
-
/** The object payload, or `undefined` for
|
|
198
|
+
/** The object payload, or `undefined` for an end of group or end of track marker. */
|
|
199
199
|
payload;
|
|
200
200
|
/** The presentation timestamp carried in object properties, when present. */
|
|
201
201
|
timestamp;
|
|
202
|
-
|
|
202
|
+
/**
|
|
203
|
+
* An END_OF_TRACK marker: no object at or past its location exists. At object 0 its group
|
|
204
|
+
* does not exist either, so the track ends at that group; later in a group it ends after it.
|
|
205
|
+
*/
|
|
206
|
+
endOfTrack;
|
|
207
|
+
constructor({ payload, timestamp, endOfTrack = false, } = {}) {
|
|
203
208
|
this.payload = payload;
|
|
204
209
|
this.timestamp = timestamp;
|
|
210
|
+
this.endOfTrack = endOfTrack;
|
|
205
211
|
}
|
|
206
212
|
/**
|
|
207
213
|
* Encode this frame using the group flags and negotiated IETF version.
|
|
@@ -209,14 +215,18 @@ export class Frame {
|
|
|
209
215
|
* `idDelta` is the first object's absolute Object ID and zero for every later one, so a
|
|
210
216
|
* group whose head was trimmed by a filter still puts the true numbering on the wire.
|
|
211
217
|
*/
|
|
212
|
-
async encode(w, flags, timescale, version
|
|
218
|
+
async encode(w, flags, timescale, version, idDelta = 0) {
|
|
213
219
|
await w.u53(idDelta);
|
|
214
220
|
if (flags.hasExtensions) {
|
|
215
221
|
const extensions = await encodeObjectExtensions(this.timestamp, timescale, version);
|
|
216
222
|
await w.u53(extensions.byteLength);
|
|
217
223
|
await w.write(extensions);
|
|
218
224
|
}
|
|
219
|
-
if (this.
|
|
225
|
+
if (this.endOfTrack) {
|
|
226
|
+
await w.u53(0); // length = 0
|
|
227
|
+
await w.u53(END_OF_TRACK);
|
|
228
|
+
}
|
|
229
|
+
else if (this.payload !== undefined) {
|
|
220
230
|
await w.u53(this.payload.byteLength);
|
|
221
231
|
if (this.payload.byteLength === 0) {
|
|
222
232
|
await w.u53(0); // status = normal
|
|
@@ -230,30 +240,35 @@ export class Frame {
|
|
|
230
240
|
await w.u53(GROUP_END);
|
|
231
241
|
}
|
|
232
242
|
}
|
|
233
|
-
/** Decode a frame using the group flags
|
|
234
|
-
static
|
|
243
|
+
/** Decode a frame using the group flags, at the cursor's negotiated IETF version. */
|
|
244
|
+
static decode(c, flags, timescale) {
|
|
235
245
|
// The first object's delta is its absolute Object ID; every later one is the prior ID
|
|
236
246
|
// plus the delta plus one. moq-lite groups start at object 0 and never skip one, so
|
|
237
247
|
// a sequential group is a zero delta throughout, and any other value means the group
|
|
238
248
|
// either starts partway through or has a gap that would renumber the frames after it.
|
|
239
|
-
const delta =
|
|
249
|
+
const delta = c.u53();
|
|
240
250
|
if (delta !== 0) {
|
|
241
251
|
throw new Error(`object IDs must start at 0 and increment by 1, got a delta of ${delta}`);
|
|
242
252
|
}
|
|
243
253
|
let timestamp;
|
|
244
254
|
if (flags.hasExtensions) {
|
|
245
|
-
const extensionsLength =
|
|
246
|
-
|
|
255
|
+
const extensionsLength = c.u53();
|
|
256
|
+
if (extensionsLength > MAX_OBJECT_EXTENSIONS) {
|
|
257
|
+
throw new StreamError(StreamCode.MalformedTrack, { message: "object extensions exceed 64 KiB" });
|
|
258
|
+
}
|
|
247
259
|
// The track's TIMESCALE gives the units, or the object's own does; an object with
|
|
248
260
|
// neither is stamped on arrival by the caller, even if it carries a Timestamp.
|
|
249
|
-
timestamp =
|
|
261
|
+
timestamp = c.exact(extensionsLength, (e) => decodeObjectTime(e, timescale));
|
|
250
262
|
}
|
|
251
|
-
const payloadLength =
|
|
263
|
+
const payloadLength = c.u53();
|
|
252
264
|
if (payloadLength > 0) {
|
|
253
|
-
const payload =
|
|
265
|
+
const payload = c.read(payloadLength);
|
|
254
266
|
return new Frame({ payload, timestamp });
|
|
255
267
|
}
|
|
256
|
-
const status =
|
|
268
|
+
const status = c.u53();
|
|
269
|
+
// Defined on every implemented draft, whether or not the header marks the group's end.
|
|
270
|
+
if (status === END_OF_TRACK)
|
|
271
|
+
return new Frame({ endOfTrack: true });
|
|
257
272
|
if (flags.hasEnd) {
|
|
258
273
|
// Empty frame
|
|
259
274
|
if (status === 0)
|
|
@@ -290,7 +305,7 @@ export class FetchFrame {
|
|
|
290
305
|
this.timestamp = timestamp;
|
|
291
306
|
}
|
|
292
307
|
/** Encode this object at `position`, stamping it in the track's timescale. */
|
|
293
|
-
async encode(w, position, timescale, version
|
|
308
|
+
async encode(w, position, timescale, version) {
|
|
294
309
|
if (position.first) {
|
|
295
310
|
// Include the priority too: "same as the prior object" has no prior to refer to.
|
|
296
311
|
const properties = this.timestamp !== undefined ? FETCH_PROPERTIES : 0;
|