@norskvideo/moq-net 0.1.2 → 0.1.4
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 +1 -0
- package/announced.d.ts +111 -21
- package/announced.d.ts.map +1 -1
- package/announced.js +213 -40
- package/announced.js.map +1 -1
- package/broadcast.d.ts +80 -25
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +270 -49
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +6 -0
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +42 -13
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts +5 -0
- package/connection/browser.d.ts.map +1 -0
- package/connection/browser.js +31 -0
- package/connection/browser.js.map +1 -0
- package/connection/connect.d.ts +43 -1
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +118 -123
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +43 -16
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/handshake.d.ts +12 -1
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +30 -14
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +8 -0
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +6 -0
- package/connection/index.js.map +1 -1
- package/connection/reload.d.ts +66 -9
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +192 -66
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +92 -0
- package/connection/stats.d.ts.map +1 -0
- package/connection/stats.js +35 -0
- package/connection/stats.js.map +1 -0
- package/connection/transport.d.ts +10 -0
- package/connection/transport.d.ts.map +1 -0
- package/connection/transport.js +12 -0
- package/connection/transport.js.map +1 -0
- package/consume.d.ts +44 -0
- package/consume.d.ts.map +1 -0
- package/consume.js +60 -0
- package/consume.js.map +1 -0
- package/datagram.d.ts +23 -0
- package/datagram.d.ts.map +1 -0
- package/datagram.js +3 -0
- package/datagram.js.map +1 -0
- package/error.d.ts +76 -0
- package/error.d.ts.map +1 -0
- package/error.js +107 -0
- package/error.js.map +1 -0
- package/group.d.ts +143 -38
- package/group.d.ts.map +1 -1
- package/group.js +270 -68
- package/group.js.map +1 -1
- package/ietf/adapter.d.ts +2 -2
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +20 -10
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +73 -5
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/aliases.js +121 -14
- package/ietf/aliases.js.map +1 -1
- package/ietf/cluster.d.ts +141 -0
- package/ietf/cluster.d.ts.map +1 -0
- package/ietf/cluster.js +204 -0
- package/ietf/cluster.js.map +1 -0
- package/ietf/connection.d.ts +39 -6
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +73 -12
- package/ietf/connection.js.map +1 -1
- package/ietf/fetch.d.ts +17 -0
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +21 -0
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +87 -0
- package/ietf/filter.d.ts.map +1 -0
- package/ietf/filter.js +292 -0
- package/ietf/filter.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +3 -0
- package/ietf/index.js.map +1 -1
- package/ietf/namespace.d.ts +6 -0
- package/ietf/namespace.d.ts.map +1 -1
- package/ietf/namespace.js +27 -2
- package/ietf/namespace.js.map +1 -1
- package/ietf/object.d.ts +54 -6
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +178 -25
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +35 -10
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +236 -45
- package/ietf/parameters.js.map +1 -1
- package/ietf/priority.d.ts +5 -0
- package/ietf/priority.d.ts.map +1 -0
- package/ietf/priority.js +10 -0
- package/ietf/priority.js.map +1 -0
- package/ietf/properties.d.ts +13 -2
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +65 -8
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +13 -3
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +16 -2
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +25 -6
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +40 -7
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +751 -134
- package/ietf/publisher.js.map +1 -1
- package/ietf/request.js +1 -1
- package/ietf/request.js.map +1 -1
- package/ietf/solicit.d.ts +41 -0
- package/ietf/solicit.d.ts.map +1 -0
- package/ietf/solicit.js +47 -0
- package/ietf/solicit.js.map +1 -0
- package/ietf/subscribe.d.ts +41 -2
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +103 -22
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +21 -7
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +31 -14
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +20 -7
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +512 -142
- package/ietf/subscriber.js.map +1 -1
- package/ietf/version.d.ts +7 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +7 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +10 -5
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +29 -0
- package/internal.d.ts.map +1 -0
- package/internal.js +8 -0
- package/internal.js.map +1 -0
- package/lite/announce.d.ts +62 -15
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +230 -94
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +69 -20
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +128 -81
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +23 -0
- package/lite/datagram.d.ts.map +1 -0
- package/lite/datagram.js +57 -0
- package/lite/datagram.js.map +1 -0
- package/lite/datagram_stream.d.ts +8 -0
- package/lite/datagram_stream.d.ts.map +1 -0
- package/lite/datagram_stream.js +44 -0
- package/lite/datagram_stream.js.map +1 -0
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +2 -2
- package/lite/fetch.js.map +1 -1
- package/lite/index.d.ts +3 -0
- package/lite/index.d.ts.map +1 -1
- package/lite/index.js +3 -0
- package/lite/index.js.map +1 -1
- package/lite/priority.d.ts +67 -0
- package/lite/priority.d.ts.map +1 -0
- package/lite/priority.js +114 -0
- package/lite/priority.js.map +1 -0
- package/lite/probe.d.ts +18 -2
- package/lite/probe.d.ts.map +1 -1
- package/lite/probe.js +24 -22
- package/lite/probe.js.map +1 -1
- package/lite/publisher.d.ts +14 -7
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +406 -84
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +83 -6
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +203 -31
- package/lite/setup.js.map +1 -1
- package/lite/stream.d.ts +12 -3
- package/lite/stream.d.ts.map +1 -1
- package/lite/stream.js +7 -4
- package/lite/stream.js.map +1 -1
- package/lite/subscribe.d.ts +37 -23
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +70 -55
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +29 -23
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +689 -112
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +25 -13
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +60 -35
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +39 -4
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +139 -17
- package/lite/version.js.map +1 -1
- package/mock.d.ts +53 -3
- package/mock.d.ts.map +1 -1
- package/mock.js +110 -21
- package/mock.js.map +1 -1
- package/{lite/origin.d.ts → origin.d.ts} +25 -1
- package/origin.d.ts.map +1 -0
- package/{lite/origin.js → origin.js} +25 -1
- package/origin.js.map +1 -0
- package/package.json +6 -4
- package/path.d.ts +67 -0
- package/path.d.ts.map +1 -1
- package/path.js +128 -0
- package/path.js.map +1 -1
- package/stream.d.ts +94 -4
- package/stream.d.ts.map +1 -1
- package/stream.js +128 -17
- package/stream.js.map +1 -1
- package/time.d.ts +109 -86
- package/time.d.ts.map +1 -1
- package/time.js +80 -30
- package/time.js.map +1 -1
- package/track.d.ts +298 -47
- package/track.d.ts.map +1 -1
- package/track.js +721 -109
- package/track.js.map +1 -1
- package/util/timeout.d.ts +5 -0
- package/util/timeout.d.ts.map +1 -0
- package/util/timeout.js +18 -0
- package/util/timeout.js.map +1 -0
- package/util/utf8.d.ts +3 -0
- package/util/utf8.d.ts.map +1 -0
- package/util/utf8.js +7 -0
- package/util/utf8.js.map +1 -0
- package/varint.d.ts +14 -3
- package/varint.d.ts.map +1 -1
- package/varint.js +23 -12
- package/varint.js.map +1 -1
- package/zod.d.ts +5 -5
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/bandwidth.d.ts +0 -11
- package/bandwidth.d.ts.map +0 -1
- package/bandwidth.js +0 -7
- package/bandwidth.js.map +0 -1
- package/connection/cert.test.d.ts +0 -2
- package/connection/cert.test.d.ts.map +0 -1
- package/connection/cert.test.js +0 -26
- package/connection/cert.test.js.map +0 -1
- package/connection/reload.test.d.ts +0 -2
- package/connection/reload.test.d.ts.map +0 -1
- package/connection/reload.test.js +0 -39
- package/connection/reload.test.js.map +0 -1
- package/group.test.d.ts +0 -2
- package/group.test.d.ts.map +0 -1
- package/group.test.js +0 -66
- package/group.test.js.map +0 -1
- package/ietf/aliases.test.d.ts +0 -2
- package/ietf/aliases.test.d.ts.map +0 -1
- package/ietf/aliases.test.js +0 -30
- package/ietf/aliases.test.js.map +0 -1
- package/ietf/ietf.test.d.ts +0 -2
- package/ietf/ietf.test.d.ts.map +0 -1
- package/ietf/ietf.test.js +0 -873
- package/ietf/ietf.test.js.map +0 -1
- package/integration.test.d.ts +0 -2
- package/integration.test.d.ts.map +0 -1
- package/integration.test.js +0 -90
- package/integration.test.js.map +0 -1
- package/lite/origin.d.ts.map +0 -1
- package/lite/origin.js.map +0 -1
- package/lite/subscriber.test.d.ts +0 -2
- package/lite/subscriber.test.d.ts.map +0 -1
- package/lite/subscriber.test.js +0 -30
- package/lite/subscriber.test.js.map +0 -1
- package/lite/track.test.d.ts +0 -2
- package/lite/track.test.d.ts.map +0 -1
- package/lite/track.test.js +0 -53
- package/lite/track.test.js.map +0 -1
- package/path.test.d.ts +0 -2
- package/path.test.d.ts.map +0 -1
- package/path.test.js +0 -169
- package/path.test.js.map +0 -1
- package/stream.test.d.ts +0 -2
- package/stream.test.d.ts.map +0 -1
- package/stream.test.js +0 -210
- package/stream.test.js.map +0 -1
- package/track.test.d.ts +0 -2
- package/track.test.d.ts.map +0 -1
- package/track.test.js +0 -56
- package/track.test.js.map +0 -1
- package/util/error.d.ts +0 -3
- package/util/error.d.ts.map +0 -1
- package/util/error.js +0 -9
- package/util/error.js.map +0 -1
- package/util/index.d.ts +0 -2
- package/util/index.d.ts.map +0 -1
- package/util/index.js +0 -3
- package/util/index.js.map +0 -1
- package/varint.test.d.ts +0 -2
- package/varint.test.d.ts.map +0 -1
- package/varint.test.js +0 -106
- package/varint.test.js.map +0 -1
package/ietf/subscriber.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/ietf/subscriber.ts"],"names":[],"mappings":"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","sourcesContent":["import { Announced } from \"../announced.ts\";\nimport { Broadcast, type TrackRequest } from \"../broadcast.ts\";\nimport { Group } from \"../group.ts\";\nimport * as Path from \"../path.ts\";\nimport type { Reader, Stream } from \"../stream.ts\";\nimport type { Track } from \"../track.ts\";\nimport { error } from \"../util/error.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport { TrackAliases } from \"./aliases.ts\";\nimport { Frame, type Group as GroupMessage } from \"./object.ts\";\nimport { type Publish, PublishError } from \"./publish.ts\";\nimport { type PublishNamespace, PublishNamespaceError, PublishNamespaceOk } from \"./publish_namespace.ts\";\nimport { RequestError, RequestOk } from \"./request.ts\";\nimport { Subscribe, SubscribeError, SubscribeOk, Unsubscribe } from \"./subscribe.ts\";\nimport {\n\tPublishBlocked,\n\tSubscribeNamespace,\n\tSubscribeNamespaceEntry,\n\tSubscribeNamespaceEntryDone,\n\tSubscribeNamespaceLegacy,\n\tSubscribeNamespaceOk,\n\tUnsubscribeNamespace,\n} from \"./subscribe_namespace.ts\";\nimport { Version } from \"./version.ts\";\n\n/**\n * Handles subscribing to broadcasts using moq-transport protocol.\n * Uses the stream-per-request pattern (real bidi streams for v17, virtual for v14-v16).\n *\n * @internal\n */\nexport class Subscriber {\n\t#session: Session;\n\n\t// Publisher-chosen aliases used by incoming group streams.\n\t#aliases = new TrackAliases<Track>();\n\n\t// Any currently active announcements.\n\t#announced = new Set<Path.Valid>();\n\n\t// Any consumers that want each new announcement.\n\t#announcedConsumers = new Set<Announced>();\n\n\t/**\n\t * Creates a new Subscriber instance.\n\t * @param session - The session abstraction for bidi streams and request IDs\n\t *\n\t * @internal\n\t */\n\tconstructor(session: Session) {\n\t\tthis.#session = session;\n\t}\n\n\t/**\n\t * Gets an announced reader for the specified prefix.\n\t */\n\tannounced(prefix = Path.empty()): Announced {\n\t\tconst announced = new Announced(prefix);\n\t\tfor (const active of this.#announced) {\n\t\t\tif (!Path.hasPrefix(prefix, active)) continue;\n\t\t\tannounced.append({ path: active, active: true });\n\t\t}\n\t\tthis.#announcedConsumers.add(announced);\n\n\t\tvoid this.#runAnnounced(announced, prefix).finally(() => {\n\t\t\tthis.#announcedConsumers.delete(announced);\n\t\t\tannounced.close();\n\t\t});\n\n\t\treturn announced;\n\t}\n\n\tasync #runAnnounced(announced: Announced, prefix: Path.Valid) {\n\t\tconst version = this.#session.version;\n\n\t\t// v14/v15: SubscribeNamespace on control stream (via adapter virtual stream)\n\t\t// v16+: SubscribeNamespace on its own real bidi stream\n\n\t\tconst requestId = await this.#session.nextRequestId();\n\t\tif (requestId === undefined) return;\n\n\t\ttry {\n\t\t\t// v16: use a real bidi stream (not virtual control stream)\n\t\t\tconst stream =\n\t\t\t\tversion === Version.DRAFT_16 && this.#session.openNativeBi\n\t\t\t\t\t? await this.#session.openNativeBi()\n\t\t\t\t\t: await this.#session.openBi();\n\n\t\t\ttry {\n\t\t\t\t// Draft-18+ uses SUBSCRIBE_NAMESPACE (0x50); earlier drafts use the\n\t\t\t\t// legacy 0x11 message with a Subscribe Options field.\n\t\t\t\tif (\n\t\t\t\t\tversion === Version.DRAFT_14 ||\n\t\t\t\t\tversion === Version.DRAFT_15 ||\n\t\t\t\t\tversion === Version.DRAFT_16 ||\n\t\t\t\t\tversion === Version.DRAFT_17\n\t\t\t\t) {\n\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceLegacy.id);\n\t\t\t\t\tawait new SubscribeNamespaceLegacy({ namespace: prefix, requestId }).encode(stream.writer, version);\n\t\t\t\t} else {\n\t\t\t\t\tawait stream.writer.u53(SubscribeNamespace.id);\n\t\t\t\t\tawait new SubscribeNamespace({ namespace: prefix, requestId }).encode(stream.writer, version);\n\t\t\t\t}\n\t\t\t\tconsole.debug(`subscribe_namespace written: requestId=${requestId}`);\n\n\t\t\t\t// Read response\n\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\tif (respTypeId === RequestOk.id) {\n\t\t\t\t\tawait RequestOk.decode(stream.reader, version);\n\t\t\t\t} else if (respTypeId === SubscribeNamespaceOk.id) {\n\t\t\t\t\t// v14: SubscribeNamespaceOk\n\t\t\t\t\tconst size = await stream.reader.u16();\n\t\t\t\t\tawait stream.reader.read(size);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`SubscribeNamespace rejected: typeId=0x${respTypeId.toString(16)}`);\n\t\t\t\t}\n\n\t\t\t\t// Loop reading Namespace/NamespaceDone entries\n\t\t\t\tconst readLoop = (async () => {\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tconst done = await stream.reader.done();\n\t\t\t\t\t\tif (done) break;\n\n\t\t\t\t\t\tconst msgType = await stream.reader.u53();\n\t\t\t\t\t\tif (msgType === SubscribeNamespaceEntry.id) {\n\t\t\t\t\t\t\tconst entry = await SubscribeNamespaceEntry.decode(stream.reader, version);\n\t\t\t\t\t\t\tconst path = Path.join(prefix, entry.suffix);\n\t\t\t\t\t\t\tconsole.debug(`announced: broadcast=${path} active=true`);\n\n\t\t\t\t\t\t\tthis.#announced.add(path);\n\t\t\t\t\t\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\t\t\t\t\t\tif (!Path.hasPrefix(consumer.prefix, path)) continue;\n\t\t\t\t\t\t\t\tconsumer.append({ path, active: true });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (msgType === SubscribeNamespaceEntryDone.id) {\n\t\t\t\t\t\t\tconst entry = await SubscribeNamespaceEntryDone.decode(stream.reader, version);\n\t\t\t\t\t\t\tconst path = Path.join(prefix, entry.suffix);\n\t\t\t\t\t\t\tconsole.debug(`announced: broadcast=${path} active=false`);\n\n\t\t\t\t\t\t\tthis.#announced.delete(path);\n\t\t\t\t\t\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\t\t\t\t\t\tif (!Path.hasPrefix(consumer.prefix, path)) continue;\n\t\t\t\t\t\t\t\tconsumer.append({ path, active: false });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (msgType === PublishBlocked.id && version === Version.DRAFT_17) {\n\t\t\t\t\t\t\tconst blocked = await PublishBlocked.decode(stream.reader, version);\n\t\t\t\t\t\t\tconsole.debug(`publish_blocked: suffix=${blocked.suffix} track=${blocked.trackName}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`unexpected message on subscribe_namespace stream: 0x${msgType.toString(16)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\t// Wait for either the read loop or the announced to close\n\t\t\t\tawait Promise.race([readLoop, announced.closed]);\n\n\t\t\t\t// For v14/v15: send UnsubscribeNamespace before closing\n\t\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait stream.writer.u53(UnsubscribeNamespace.id);\n\t\t\t\t\t\tconst unsub = new UnsubscribeNamespace({ requestId });\n\t\t\t\t\t\tawait unsub.encode(stream.writer, version);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Stream might already be closed\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err) {\n\t\t\t\tstream.abort(error(err));\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`subscribe_namespace error: ${e.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Consumes a broadcast from the connection.\n\t */\n\tconsume(path: Path.Valid): Broadcast {\n\t\tconst broadcast = new Broadcast();\n\n\t\tvoid (async () => {\n\t\t\tfor (;;) {\n\t\t\t\tconst request = await broadcast.requested();\n\t\t\t\tif (!request) break;\n\t\t\t\tvoid this.#runSubscribe(path, request);\n\t\t\t}\n\t\t})();\n\n\t\treturn broadcast;\n\t}\n\n\tasync #runSubscribe(broadcast: Path.Valid, request: TrackRequest) {\n\t\tconst version = this.#session.version;\n\t\tconst requestId = await this.#session.nextRequestId();\n\t\tif (requestId === undefined) {\n\t\t\trequest.track.close(new Error(\"session closed\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.debug(`subscribe start: id=${requestId} broadcast=${broadcast} track=${request.track.name}`);\n\n\t\ttry {\n\t\t\tconst stream = await this.#session.openBi();\n\n\t\t\ttry {\n\t\t\t\t// Write Subscribe\n\t\t\t\tawait stream.writer.u53(Subscribe.id);\n\t\t\t\tconst msg = new Subscribe({\n\t\t\t\t\trequestId,\n\t\t\t\t\ttrackNamespace: broadcast,\n\t\t\t\t\ttrackName: request.track.name,\n\t\t\t\t\tsubscriberPriority: request.priority,\n\t\t\t\t});\n\t\t\t\tawait msg.encode(stream.writer, version);\n\t\t\t\tconsole.debug(`subscribe written: id=${requestId} broadcast=${broadcast} track=${request.track.name}`);\n\n\t\t\t\t// Read response (SubscribeOk or error)\n\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\tif (respTypeId === SubscribeOk.id) {\n\t\t\t\t\tconst ok = await SubscribeOk.decode(stream.reader, version);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#aliases.set(ok.trackAlias, request.track);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tthis.#session.close();\n\t\t\t\t\t\tthrow err;\n\t\t\t\t\t}\n\t\t\t\t\tconsole.debug(\n\t\t\t\t\t\t`subscribe ok: id=${requestId} broadcast=${broadcast} track=${request.track.name} alias=${ok.trackAlias}`,\n\t\t\t\t\t);\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Wait for stream close (= PublishDone) or track close (= local unsubscribe)\n\t\t\t\t\t\tawait Promise.race([stream.reader.closed, request.track.closed]);\n\n\t\t\t\t\t\t// For v14-v16: send Unsubscribe before closing (removed in v17+)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tversion === Version.DRAFT_14 ||\n\t\t\t\t\t\t\tversion === Version.DRAFT_15 ||\n\t\t\t\t\t\t\tversion === Version.DRAFT_16\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait stream.writer.u53(Unsubscribe.id);\n\t\t\t\t\t\t\t\tconst unsub = new Unsubscribe({ requestId });\n\t\t\t\t\t\t\t\tawait unsub.encode(stream.writer, version);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// Stream might already be closed\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trequest.track.close();\n\t\t\t\t\t\tstream.close();\n\t\t\t\t\t\tconsole.debug(\n\t\t\t\t\t\t\t`subscribe close: id=${requestId} broadcast=${broadcast} track=${request.track.name}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.#aliases.delete(ok.trackAlias, request.track);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Error response\n\t\t\t\t\tlet reasonPhrase = \"unknown error\";\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (respTypeId === RequestError.id) {\n\t\t\t\t\t\t\t// SubscribeError (v14) or RequestError (v15+)\n\t\t\t\t\t\t\tconst err =\n\t\t\t\t\t\t\t\tversion === Version.DRAFT_14\n\t\t\t\t\t\t\t\t\t? await SubscribeError.decode(stream.reader, version)\n\t\t\t\t\t\t\t\t\t: await RequestError.decode(stream.reader, version);\n\t\t\t\t\t\t\treasonPhrase = `code=${err.errorCode} reason=${err.reasonPhrase}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Decoding error response failed, use default message\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(`SUBSCRIBE error: ${reasonPhrase}`);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tstream.abort(error(err));\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst e = error(err);\n\t\t\trequest.track.close(e);\n\t\t\tconsole.warn(\n\t\t\t\t`subscribe error: id=${requestId} broadcast=${broadcast} track=${request.track.name} error=${e.message}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming PUBLISH_NAMESPACE on a bidi stream.\n\t * Tracks announced broadcasts and notifies consumers.\n\t *\n\t * @internal\n\t */\n\tasync runPublishNamespace(msg: PublishNamespace, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst path = msg.trackNamespace;\n\n\t\tif (this.#announced.has(path)) {\n\t\t\tconsole.warn(\"duplicate PublishNamespace\");\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(PublishNamespaceError.id);\n\t\t\t\tconst err = new PublishNamespaceError({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\terrorCode: 409,\n\t\t\t\t\treasonPhrase: \"duplicate namespace\",\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\t\tconst err = new RequestError({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t\terrorCode: 409,\n\t\t\t\t\treasonPhrase: \"duplicate namespace\",\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t}\n\t\t\tstream.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#announced.add(path);\n\n\t\ttry {\n\t\t\t// Send OK first — must complete before notifying consumers,\n\t\t\t// because consumers may trigger Subscribe writes that would\n\t\t\t// interleave with our OK on the control stream.\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(PublishNamespaceOk.id);\n\t\t\t\tconst ok = new PublishNamespaceOk({ requestId: msg.requestId });\n\t\t\t\tawait ok.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestOk.id);\n\t\t\t\tconst ok = new RequestOk({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t});\n\t\t\t\tawait ok.encode(stream.writer, version);\n\t\t\t}\n\n\t\t\tconsole.debug(`announced: broadcast=${path} active=true`);\n\n\t\t\t// Notify consumers after OK is written\n\t\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\t\tconst suffix = Path.stripPrefix(consumer.prefix, path);\n\t\t\t\tif (suffix === null) continue;\n\t\t\t\tconsumer.append({ path, active: true });\n\t\t\t}\n\n\t\t\t// Wait for stream close (= PublishNamespaceDone)\n\t\t\tconsole.debug(`runPublishNamespace: awaiting stream.reader.closed for ${path}`);\n\t\t\tawait stream.reader.closed;\n\t\t\tconsole.debug(`runPublishNamespace: stream.reader.closed resolved for ${path}`);\n\t\t} finally {\n\t\t\tthis.#announced.delete(path);\n\t\t\tconsole.debug(`announced: broadcast=${path} active=false`);\n\n\t\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\t\tconst suffix = Path.stripPrefix(consumer.prefix, path);\n\t\t\t\tif (suffix === null) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconsumer.append({ path, active: false });\n\t\t\t\t} catch {\n\t\t\t\t\t// Consumer already closed, will be cleaned up\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming PUBLISH on a bidi stream.\n\t * We don't support reverse publish, so send error.\n\t *\n\t * @internal\n\t */\n\tasync runPublish(msg: Publish, stream: Stream) {\n\t\tconst version = this.#session.version;\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\tawait stream.writer.u53(PublishError.id);\n\t\t\tconst err = new PublishError({\n\t\t\t\trequestId: msg.requestId,\n\t\t\t\terrorCode: 500,\n\t\t\t\treasonPhrase: \"publish not supported\",\n\t\t\t});\n\t\t\tawait err.encode(stream.writer, version);\n\t\t} else {\n\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\tconst err = new RequestError({\n\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\terrorCode: 500,\n\t\t\t\treasonPhrase: \"publish not supported\",\n\t\t\t});\n\t\t\tawait err.encode(stream.writer, version);\n\t\t}\n\t\tstream.close();\n\t}\n\n\t/**\n\t * Handles an ObjectStream message (group + frames on uni stream).\n\t *\n\t * @internal\n\t */\n\tasync handleGroup(group: GroupMessage, stream: Reader) {\n\t\tconst producer = new Group(group.groupId);\n\n\t\tif (group.subGroupId !== 0) {\n\t\t\tthrow new Error(\"subgroups are not supported\");\n\t\t}\n\n\t\ttry {\n\t\t\t// The control message establishing this alias can arrive after the data stream.\n\t\t\tconst track = await this.#aliases.get(group.trackAlias);\n\n\t\t\ttrack.writeGroup(producer);\n\n\t\t\tfor (;;) {\n\t\t\t\tconst done = await Promise.race([stream.done(), producer.closed, track.closed]);\n\t\t\t\tif (done !== false) break;\n\n\t\t\t\tconst frame = await Frame.decode(stream, group.flags);\n\t\t\t\tif (frame.payload === undefined) break;\n\n\t\t\t\tproducer.writeFrame(frame.payload, frame.extensions);\n\t\t\t}\n\n\t\t\tproducer.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tproducer.close(e);\n\t\t\tstream.stop(e);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/ietf/subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,EAA8B,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAgB,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,yEAAyE;AACzE,wEAAwE;AACxE,qDAAqD;AACrD,MAAM,uBAAuB,GAAG,MAAM,CAAC;AA4BvC;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACtB,QAAQ,CAAU;IAElB,yFAAyF;IACzF,yFAAyF;IACzF,kBAAkB;IAClB,QAAQ,CAAgB;IAExB,2DAA2D;IAC3D,QAAQ,GAAG,IAAI,YAAY,EAAkB,CAAC;IAE9C,iFAAiF;IACjF,qFAAqF;IACrF,yEAAyE;IACzE,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE3C,qFAAqF;IACrF,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IAEjC,mFAAmF;IACnF,mFAAmF;IACnF,2EAA2E;IAC3E,eAAe,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,8EAA8E;IAC9E,EAAE;IACF,wEAAwE;IACxE,sFAAsF;IACtF,sFAAsF;IACtF,qFAAqF;IACrF,qDAAqD;IACrD,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE3C,iDAAiD;IACjD,mBAAmB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEnD;;;;OAIG;IACH,YAAY,EACX,OAAO,EACP,OAAO,GAMP;QACA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,MAAkC;QAC5C,OAAO,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;QAC9B,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;YAC9B,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,KAAK,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACvD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,SAAS,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,IAAgB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO;QAEtB,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,cAAc,CAAC,CAAC;QAC1D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;YAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAgB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACrC,OAAO;QACR,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE7B,oFAAoF;QACpF,8EAA8E;QAC9E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,eAAe,CAAC,CAAC;QAE3D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACJ,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACR,8CAA8C;YAC/C,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAA4B,EAAE,MAAkB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEtC,8EAA8E;QAC9E,sEAAsE;QACtE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;QAEnC,mFAAmF;QACnF,mFAAmF;QACnF,kFAAkF;QAClF,oFAAoF;QACpF,yEAAyE;QACzE,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,6EAA6E;QAC7E,uDAAuD;QAEvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO;QAEpC,IAAI,CAAC;YACJ,2DAA2D;YAC3D,MAAM,MAAM,GACX,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY;gBACzD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;gBACpC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAEjC,IAAI,CAAC;gBACJ,oEAAoE;gBACpE,sDAAsD;gBACtD,IACC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAC5B,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAC5B,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAC5B,OAAO,KAAK,OAAO,CAAC,QAAQ,EAC3B,CAAC;oBACF,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;oBACrD,MAAM,IAAI,wBAAwB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACrG,CAAC;qBAAM,CAAC;oBACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;oBAC/C,MAAM,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/F,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,0CAA0C,SAAS,EAAE,CAAC,CAAC;gBAErE,gBAAgB;gBAChB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC7C,IAAI,UAAU,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC;oBACjC,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChD,CAAC;qBAAM,IAAI,UAAU,KAAK,oBAAoB,CAAC,EAAE,EAAE,CAAC;oBACnD,4BAA4B;oBAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBACvC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrF,CAAC;gBAED,+CAA+C;gBAC/C,MAAM,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;oBAC5B,SAAS,CAAC;wBACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;wBACxC,IAAI,IAAI;4BAAE,MAAM;wBAEhB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;wBAC1C,IAAI,OAAO,KAAK,uBAAuB,CAAC,EAAE,EAAE,CAAC;4BAC5C,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,MAAM,CACjD,MAAM,CAAC,MAAM,EACb,OAAO,EACP,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CACjC,CAAC;4BACF,IAAI,QAAQ;gCAAE,MAAM;4BACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;4BAE7C,+DAA+D;4BAC/D,6DAA6D;4BAC7D,8DAA8D;4BAC9D,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gCACpC,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;gCACjE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oCAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gCAClD,SAAS;4BACV,CAAC;4BAED,8DAA8D;4BAC9D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gCACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gCACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC;wBACF,CAAC;6BAAM,IAAI,OAAO,KAAK,2BAA2B,CAAC,EAAE,EAAE,CAAC;4BACvD,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;4BAC/E,IAAI,QAAQ;gCAAE,MAAM;4BACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;4BAE7C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gCACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC;wBACF,CAAC;6BAAM,IAAI,OAAO,KAAK,cAAc,CAAC,EAAE,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;4BAC1E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;4BACpE,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;wBACvF,CAAC;6BAAM,CAAC;4BACP,MAAM,IAAI,KAAK,CACd,uDAAuD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAC7E,CAAC;wBACH,CAAC;oBACF,CAAC;gBACF,CAAC,CAAC,EAAE,CAAC;gBAEL,2EAA2E;gBAC3E,wEAAwE;gBACxE,0EAA0E;gBAC1E,0EAA0E;gBAC1E,yDAAyD;gBACzD,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;oBAC/B,IAAI,GAAG,YAAY,iBAAiB;wBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC7D,CAAC,CAAC,CAAC;gBAEH,0DAA0D;gBAC1D,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAEjD,wDAAwD;gBACxD,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAClE,IAAI,CAAC;wBACJ,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;wBACjD,MAAM,KAAK,GAAG,IAAI,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;wBACtD,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC5C,CAAC;oBAAC,MAAM,CAAC;wBACR,iCAAiC;oBAClC,CAAC;gBACF,CAAC;gBAED,MAAM,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAExD,gFAAgF;YAChF,iFAAiF;YACjF,6EAA6E;YAC7E,kDAAkD;YAClD,IAAI,CAAC,YAAY,iBAAiB;gBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAE1D,gFAAgF;YAChF,iFAAiF;YACjF,gFAAgF;YAChF,6DAA6D;YAC7D,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;gBAAS,CAAC;YACV,6EAA6E;YAC7E,8EAA8E;YAC9E,4EAA4E;YAC5E,qEAAqE;YACrE,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,IAAgB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,cAAc,CAAC,IAAgB;QAC9B,qFAAqF;QACrF,sEAAsE;QACtE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAExC,KAAK,CAAC,KAAK,IAAI,EAAE;YAChB,SAAS,CAAC;gBACT,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC3C,IAAI,CAAC,OAAO;oBAAE,MAAM;gBACpB,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAqB,EAAE,OAAsB;QAChE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC5C,OAAO;QACR,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,uBAAuB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/F,wEAAwE;QACxE,4EAA4E;QAC5E,iEAAiE;QACjE,wEAAwE;QACxE,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpD,mEAAmE;QACnE,qEAAqE;QACrE,qDAAqD;QACrD,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAElF,kFAAkF;QAClF,kFAAkF;QAClF,mFAAmF;QACnF,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;YAC/C,SAAS,CAAC;gBACT,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO,IAAI,CAAC;YAChF,CAAC;QACF,CAAC,CAAC;QAEF,IAAI,MAAc,CAAC;QACnB,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjC,WAAW,CACV,KAAK,EACL,uBAAuB,EACvB,6BAA6B,uBAAuB,6DAA6D,CACjH;gBACD,aAAa,EAAE;aACf,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAEnF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,oBAAoB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CACX,uBAAuB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAClG,CAAC;YACF,4EAA4E;YAC5E,iFAAiF;YACjF,gDAAgD;YAChD,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,MAAM,OAAO,GAAG,KAAK,EAAE,UAAmB,EAAE,EAAE;gBAC7C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;gBAEvB,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAClG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAChD,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI;oBAAE,OAAO;gBAElC,8EAA8E;gBAC9E,+EAA+E;gBAC/E,6EAA6E;gBAC7E,8EAA8E;gBAC9E,wBAAwB;gBACxB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU;oBAAE,OAAO;gBACvC,IAAI,GAAG,IAAI,CAAC;gBAEZ,gFAAgF;gBAChF,kFAAkF;gBAClF,6EAA6E;gBAC7E,sDAAsD;gBACtD,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACxF,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC;YAEF,6EAA6E;YAC7E,8EAA8E;YAC9E,4EAA4E;YAC5E,gCAAgC;YAChC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,CAAC,IAAI,CACT,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EACnB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CACnB,CAAC;YACF,OAAO;QACR,CAAC;QAED,IAAI,CAAC;YACJ,+EAA+E;YAC/E,6CAA6C;YAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAE5B,qFAAqF;YACrF,wFAAwF;YACxF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBACzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC;gBAC/C,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC;aACtC,CAAC,CAAC;YAEH,yFAAyF;YACzF,uFAAuF;YACvF,mCAAmC;YACnC,IAAI,QAAQ,GAAG,UAAU,CAAC;YAC1B,SAAS,CAAC;gBACT,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9E,IAAI,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC9F,QAAQ,GAAG,MAAM,CAAC;gBAClB,MAAM;YACP,CAAC;YAED,kFAAkF;YAClF,kEAAkE;YAClE,IAAI,QAAQ,KAAK,cAAc;gBAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAEhF,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAChG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CACX,uBAAuB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAClG,CAAC;QACH,CAAC;gBAAS,CAAC;YACV,8EAA8E;YAC9E,uDAAuD;YACvD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrF,CAAC;IACF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,SAAiB;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;YAAE,OAAO;QAEzG,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACR,6EAA6E;QAC9E,CAAC;IACF,CAAC;IAED,uEAAuE;IACvE,sEAAsE;IACtE,uEAAuE;IACvE,oCAAoC;IACpC,KAAK,CAAC,cAAc,CACnB,KAA0B,EAC1B,SAAqB,EACrB,OAAsB,EACtB,QAAwB,EACxB,SAAiB;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEtC,KAAK,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAE5C,oFAAoF;QACpF,kFAAkF;QAClF,yCAAyC;QACzC,IAAI,KAAK,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAE/E,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;YACzB,SAAS;YACT,cAAc,EAAE,SAAS;YACzB,SAAS,EAAE,OAAO,CAAC,IAAI;YACvB,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,gFAAgF;YAChF,kFAAkF;YAClF,kFAAkF;YAClF,kFAAkF;YAClF,+EAA+E;YAC/E,kBAAkB;YAClB,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;SAC3B,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAElB,oFAAoF;QACpF,sFAAsF;QACtF,+CAA+C;QAC/C,IAAI,KAAK,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACpF,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjG,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACnD,IAAI,UAAU,KAAK,WAAW,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,YAAY,GAAG,eAAe,CAAC;YACnC,IAAI,CAAC;gBACJ,IAAI,UAAU,KAAK,YAAY,CAAC,EAAE,EAAE,CAAC;oBACpC,MAAM,GAAG,GACR,OAAO,KAAK,OAAO,CAAC,QAAQ;wBAC3B,CAAC,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;wBAC3D,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC5D,YAAY,GAAG,QAAQ,GAAG,CAAC,SAAS,WAAW,GAAG,CAAC,YAAY,EAAE,CAAC;gBACnE,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,sDAAsD;YACvD,CAAC;YACD,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAC1C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,mFAAmF;YACnF,iFAAiF;YACjF,yEAAyE;YACzE,IAAI,GAAG,YAAY,mBAAmB;gBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC9D,MAAM,GAAG,CAAC;QACX,CAAC;QACD,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;IACvD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAqB,EAAE,MAAc;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC;QAEhC,mFAAmF;QACnF,kFAAkF;QAClF,iFAAiF;QACjF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,mDAAmD,IAAI,EAAE,CAAC,CAAC;YACzE,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,IAAI,YAAY,CAAC;gBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS,EAAE,GAAG;gBACd,YAAY,EAAE,kBAAkB;aAChC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QAED,kFAAkF;QAClF,gFAAgF;QAChF,gFAAgF;QAChF,kFAAkF;QAClF,mFAAmF;QACnF,qDAAqD;QACrD,MAAM,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC;QAC5E,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;gBAClD,MAAM,IAAI,qBAAqB,CAAC;oBAC/B,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,SAAS,EAAE,GAAG;oBACd,YAAY,EAAE,qBAAqB;iBACnC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,IAAI,YAAY,CAAC;oBACtB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,SAAS,EAAE,GAAG;oBACd,YAAY,EAAE,qBAAqB;iBACnC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QAED,6EAA6E;QAC7E,kFAAkF;QAClF,iFAAiF;QACjF,mBAAmB;QACnB,IAAI,MAAM;YAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC;YACJ,gEAAgE;YAChE,4DAA4D;YAC5D,gDAAgD;YAChD,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC/C,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBAChE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC;oBACxB,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;iBACnG,CAAC,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;YAED,0EAA0E;YAC1E,uEAAuE;YACvE,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAE3B,8EAA8E;YAC9E,4EAA4E;YAC5E,wEAAwE;YACxE,MAAM,IAAI,GAAG,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;YACpD,SAAS,CAAC;gBACT,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;oBAAE,MAAM;gBAEtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACzC,IAAI,IAAI,IAAI,MAAM,KAAK,oBAAoB,CAAC,EAAE,EAAE,CAAC;oBAChD,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC1D,MAAM;gBACP,CAAC;gBACD,IAAI,MAAM,KAAK,gBAAgB,CAAC,EAAE,EAAE,CAAC;oBACpC,MAAM,IAAI,iBAAiB,CAC1B,qDAAqD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAC1E,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAExG,yEAAyE;gBACzE,2EAA2E;gBAC3E,iCAAiC;gBACjC,IAAI,MAAM,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;oBAC1E,MAAM,IAAI,iBAAiB,CAAC,oDAAoD,CAAC,CAAC;gBACnF,CAAC;gBAED,qEAAqE;gBACrE,uEAAuE;gBACvE,sCAAsC;gBACtC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBACrC,IAAI,QAAQ,EAAE,CAAC;wBACd,QAAQ,GAAG,KAAK,CAAC;wBACjB,OAAO,CAAC,KAAK,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;wBAChF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;oBACD,SAAS;gBACV,CAAC;gBAED,uEAAuE;gBACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,QAAQ,GAAG,IAAI,CAAC;oBAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,MAAM;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE9C,8EAA8E;YAC9E,6EAA6E;YAC7E,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,GAAY,EAAE,MAAc;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEtC,oFAAoF;QACpF,oFAAoF;QACpF,EAAE;QACF,qFAAqF;QACrF,6EAA6E;QAC7E,MAAM,aAAa,GAAG,GAAG,CAAC;QAE1B,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC;gBAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS,EAAE,aAAa;gBACxB,YAAY,EAAE,uBAAuB;aACrC,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC;gBAC5B,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBACnG,SAAS,EAAE,aAAa;gBACxB,YAAY,EAAE,uBAAuB;aACrC,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,KAAmB,EAAE,MAAc;QACpD,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;QAED,kFAAkF;QAClF,mFAAmF;QACnF,oFAAoF;QACpF,oFAAoF;QACpF,iEAAiE;QACjE,EAAE;QACF,mFAAmF;QACnF,sFAAsF;QACtF,qFAAqF;QACrF,wCAAwC;QACxC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACjG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACzD,OAAO;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,CAAC;YACJ,gFAAgF;YAChF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAExD,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAE3B,SAAS,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChF,IAAI,IAAI,KAAK,KAAK;oBAAE,MAAM;gBAE1B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAC/B,MAAM,EACN,KAAK,CAAC,KAAK,EACX,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,CACrB,CAAC;gBACF,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;oBAAE,MAAM;gBAEvC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChG,CAAC;YAED,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,6EAA6E;YAC7E,iFAAiF;YACjF,uCAAuC;YACvC,IAAI,CAAC,YAAY,iBAAiB,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,sDAAsD,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YACzF,CAAC;YACD,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACF,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,gBAAiB,SAAQ,SAAS,CAAC,QAAQ;IAChD,qGAAqG;IACrG,YAAY,KAAa;QACxB,KAAK,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;IAED,qFAAqF;IAC5E,KAAK;QACb,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAEQ,UAAU;QAClB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;IACpF,CAAC;CACD","sourcesContent":["import * as announce from \"../announced.ts\";\nimport * as broadcast from \"../broadcast.ts\";\nimport { BroadcastCache } from \"../consume.ts\";\nimport { error, ProtocolViolation, reason } from \"../error.ts\";\nimport * as netGroup from \"../group.ts\";\nimport * as Path from \"../path.ts\";\nimport type { Reader, Stream } from \"../stream.ts\";\nimport { type Timescale, Timestamp } from \"../time.ts\";\nimport type * as track from \"../track.ts\";\nimport { withTimeout } from \"../util/timeout.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport { DuplicateTrackAlias, RetiredTrackAlias, TrackAliases } from \"./aliases.ts\";\nimport * as Cluster from \"./cluster.ts\";\nimport { Frame, type Group as GroupMessage } from \"./object.ts\";\nimport { toWire } from \"./priority.ts\";\nimport { type Publish, PublishError } from \"./publish.ts\";\nimport {\n\tPublishNamespace,\n\tPublishNamespaceDone,\n\tPublishNamespaceError,\n\tPublishNamespaceOk,\n} from \"./publish_namespace.ts\";\nimport { RequestError, RequestOk } from \"./request.ts\";\nimport { joinFilter, Subscribe, SubscribeError, SubscribeOk, Unsubscribe } from \"./subscribe.ts\";\nimport {\n\tPublishBlocked,\n\tSubscribeNamespace,\n\tSubscribeNamespaceEntry,\n\tSubscribeNamespaceEntryDone,\n\tSubscribeNamespaceLegacy,\n\tSubscribeNamespaceOk,\n\tUnsubscribeNamespace,\n} from \"./subscribe_namespace.ts\";\nimport { Version } from \"./version.ts\";\n\n// Bound on how long stream-open plus SUBSCRIBE_OK may take. Browsers cap\n// concurrent QUIC streams (Chrome ~100); past the cap openBi() silently\n// blocks. The timeout turns that into a clear error.\nconst SUBSCRIBE_OK_TIMEOUT_MS = 10_000;\n\n// Out-parameter for #openSubscribe: lets the caller observe partial progress\n// (stream opened, trackAlias registered) so it can clean up on timeout even\n// before the setup promise settles.\ntype SubscribeSetupState = {\n\tstream?: Stream;\n\tregisteredAlias?: bigint;\n\t/**\n\t * Whether the caller has given up. Setup checks this once the stream exists so a request\n\t * opened after the timeout still unwinds: nothing else settles setup if the peer has\n\t * gone quiet, and the cleanup that fired first saw no stream to tear down.\n\t */\n\tcancelled?: boolean;\n\t/**\n\t * Whether the SUBSCRIBE reached the wire. From that moment the publisher may be serving,\n\t * even before it answers, so abandoning owes it a cancellation regardless of whether we\n\t * ever saw the SUBSCRIBE_OK.\n\t */\n\tsent?: boolean;\n\t/**\n\t * Whether the publisher answered with an error. It has torn the request down already, so\n\t * there is nothing left to cancel and naming the dead request id at it risks being read\n\t * as a protocol violation.\n\t */\n\trejected?: boolean;\n};\n\n/**\n * Handles subscribing to broadcasts using moq-transport protocol.\n * Uses the stream-per-request pattern (real bidi streams for v17, virtual for v14-v16).\n *\n * @internal\n */\nexport class Subscriber {\n\t#session: Session;\n\n\t// The Hop IDs this session declared; see {@link Cluster}. What the peer declared is what\n\t// says whether an advertisement carries a hop path, and ours is what a path looping back\n\t// to us contains.\n\t#cluster?: Cluster.Hops;\n\n\t// Publisher-chosen aliases used by incoming group streams.\n\t#aliases = new TrackAliases<track.Producer>();\n\n\t// Units for each track's object Timestamps, from the TIMESCALE Track Property in\n\t// SUBSCRIBE_OK. A track missing from this map declared no timeline, so the publisher\n\t// opted out of timestamps and its frames are stamped on arrival instead.\n\t#timescales = new Map<bigint, Timescale>();\n\n\t// Dedup consumed broadcasts per path: repeat consume() calls share one subscription.\n\t#consumes = new BroadcastCache();\n\n\t// Paths with a legacy PUBLISH_NAMESPACE request in flight, reserved synchronously.\n\t// The count below is only taken once the OK is written, and two requests that both\n\t// got past the duplicate check before either attached would both take one.\n\t#legacyRequests = new Set<Path.Valid>();\n\n\t// Every announced path, counted by how many live advertisements reference it.\n\t//\n\t// A peer may advertise one namespace twice on a session: an unsolicited\n\t// PUBLISH_NAMESPACE and an inline NAMESPACE answering our own SUBSCRIBE_NAMESPACE are\n\t// two messages about one source, which the MoQ Solicit draft requires us to tolerate.\n\t// Counting them is what keeps the second from duplicating the announce and the first\n\t// to end from retracting what the other still holds.\n\t#announced = new Map<Path.Valid, number>();\n\n\t// Any consumers that want each new announcement.\n\t#announcedConsumers = new Set<announce.Producer>();\n\n\t/**\n\t * Creates a new Subscriber instance.\n\t *\n\t * @internal\n\t */\n\tconstructor({\n\t\tsession,\n\t\tcluster,\n\t}: {\n\t\t/** The session abstraction for bidi streams and request IDs. */\n\t\tsession: Session;\n\t\t/** The Hop IDs the SETUP exchange settled (MoQ Cluster). */\n\t\tcluster?: Cluster.Hops;\n\t}) {\n\t\tthis.#session = session;\n\t\tthis.#cluster = cluster;\n\t}\n\n\t/**\n\t * Whether an advertisement is ours coming back: its hop path already ran through us, so\n\t * subscribing via it would route us back to ourselves.\n\t *\n\t * A conforming peer withholds these (it knows our Hop ID), so this is the backstop that\n\t * keeps a mesh working when one member does not. A session that negotiated nothing\n\t * carries no path, and there is nothing to check.\n\t */\n\t#reflected(advert: Cluster.Advert | undefined): boolean {\n\t\treturn advert !== undefined && this.#cluster !== undefined && Cluster.loops(advert, this.#cluster.self);\n\t}\n\n\t/**\n\t * Gets an announced reader for the specified prefix.\n\t *\n\t * The peer is asked with SUBSCRIBE_NAMESPACE regardless of what it declared, and an\n\t * unsolicited PUBLISH_NAMESPACE lands here too, so a peer that only tells and one\n\t * that only answers are both discovered.\n\t */\n\tannounced(prefix = Path.empty()): announce.Consumer {\n\t\tconst announced = new announce.Producer(prefix);\n\t\tfor (const active of this.#announced.keys()) {\n\t\t\tconst suffix = Path.stripPrefix(prefix, active);\n\t\t\tif (suffix === null) continue;\n\t\t\tannounced.append({ path: suffix, active: true });\n\t\t}\n\t\tthis.#announcedConsumers.add(announced);\n\n\t\tvoid this.#runAnnounced(announced, prefix).finally(() => {\n\t\t\tthis.#announcedConsumers.delete(announced);\n\t\t\tannounced.close();\n\t\t});\n\n\t\treturn announced.consume();\n\t}\n\n\t/**\n\t * Record one more advertisement for a path, telling consumers only when it is the\n\t * first. A second one is the same namespace said twice, not news.\n\t */\n\t#attachAnnounce(path: Path.Valid) {\n\t\tconst count = this.#announced.get(path) ?? 0;\n\t\tthis.#announced.set(path, count + 1);\n\t\tif (count > 0) return;\n\n\t\tconsole.debug(`announced: broadcast=${path} active=true`);\n\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\tconst suffix = Path.stripPrefix(consumer.prefix, path);\n\t\t\tif (suffix === null) continue;\n\t\t\tconsumer.append({ path: suffix, active: true });\n\t\t}\n\t}\n\n\t/**\n\t * Drop one advertisement for a path, retracting it only once the last one goes.\n\t */\n\t#detachAnnounce(path: Path.Valid) {\n\t\tconst count = this.#announced.get(path);\n\t\tif (count === undefined) return;\n\t\tif (count > 1) {\n\t\t\tthis.#announced.set(path, count - 1);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#announced.delete(path);\n\n\t\t// The path is gone, so stop sharing its broadcast: a holder outliving the publisher\n\t\t// would otherwise hand the dead generation to whoever consumes the path next.\n\t\tthis.#consumes.evict(path);\n\t\tconsole.debug(`announced: broadcast=${path} active=false`);\n\n\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\tconst suffix = Path.stripPrefix(consumer.prefix, path);\n\t\t\tif (suffix === null) continue;\n\t\t\ttry {\n\t\t\t\tconsumer.append({ path: suffix, active: false });\n\t\t\t} catch {\n\t\t\t\t// Consumer already closed, will be cleaned up\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #runAnnounced(announced: announce.Producer, prefix: Path.Valid) {\n\t\tconst version = this.#session.version;\n\n\t\t// Suffixes live on this stream, so a repeat is recognized as an update to the\n\t\t// advertisement rather than a second one, which would leak the count.\n\t\tconst live = new Set<Path.Valid>();\n\n\t\t// Set once the teardown below has given back everything this stream held. The read\n\t\t// loop is not awaited when the local consumer closes first, and closing the stream\n\t\t// cancels the transport without discarding what the reader already buffered, so a\n\t\t// fully buffered entry can still decode afterwards. Attaching one then would take a\n\t\t// reference nobody is left to release, pinning the path for the session.\n\t\tlet released = false;\n\n\t\t// v14/v15: SubscribeNamespace on control stream (via adapter virtual stream)\n\t\t// v16+: SubscribeNamespace on its own real bidi stream\n\n\t\tconst requestId = await this.#session.nextRequestId();\n\t\tif (requestId === undefined) return;\n\n\t\ttry {\n\t\t\t// v16: use a real bidi stream (not virtual control stream)\n\t\t\tconst stream =\n\t\t\t\tversion === Version.DRAFT_16 && this.#session.openNativeBi\n\t\t\t\t\t? await this.#session.openNativeBi()\n\t\t\t\t\t: await this.#session.openBi();\n\n\t\t\ttry {\n\t\t\t\t// Draft-18+ uses SUBSCRIBE_NAMESPACE (0x50); earlier drafts use the\n\t\t\t\t// legacy 0x11 message with a Subscribe Options field.\n\t\t\t\tif (\n\t\t\t\t\tversion === Version.DRAFT_14 ||\n\t\t\t\t\tversion === Version.DRAFT_15 ||\n\t\t\t\t\tversion === Version.DRAFT_16 ||\n\t\t\t\t\tversion === Version.DRAFT_17\n\t\t\t\t) {\n\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceLegacy.id);\n\t\t\t\t\tawait new SubscribeNamespaceLegacy({ namespace: prefix, requestId }).encode(stream.writer, version);\n\t\t\t\t} else {\n\t\t\t\t\tawait stream.writer.u53(SubscribeNamespace.id);\n\t\t\t\t\tawait new SubscribeNamespace({ namespace: prefix, requestId }).encode(stream.writer, version);\n\t\t\t\t}\n\t\t\t\tconsole.debug(`subscribe_namespace written: requestId=${requestId}`);\n\n\t\t\t\t// Read response\n\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\tif (respTypeId === RequestOk.id) {\n\t\t\t\t\tawait RequestOk.decode(stream.reader, version);\n\t\t\t\t} else if (respTypeId === SubscribeNamespaceOk.id) {\n\t\t\t\t\t// v14: SubscribeNamespaceOk\n\t\t\t\t\tconst size = await stream.reader.u16();\n\t\t\t\t\tawait stream.reader.read(size);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`SubscribeNamespace rejected: typeId=0x${respTypeId.toString(16)}`);\n\t\t\t\t}\n\n\t\t\t\t// Loop reading Namespace/NamespaceDone entries\n\t\t\t\tconst readLoop = (async () => {\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tconst done = await stream.reader.done();\n\t\t\t\t\t\tif (done) break;\n\n\t\t\t\t\t\tconst msgType = await stream.reader.u53();\n\t\t\t\t\t\tif (msgType === SubscribeNamespaceEntry.id) {\n\t\t\t\t\t\t\tconst entry = await SubscribeNamespaceEntry.decode(\n\t\t\t\t\t\t\t\tstream.reader,\n\t\t\t\t\t\t\t\tversion,\n\t\t\t\t\t\t\t\tCluster.negotiated(this.#cluster),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (released) break;\n\t\t\t\t\t\t\tconst path = Path.join(prefix, entry.suffix);\n\n\t\t\t\t\t\t\t// A repeat updates the advertisement in place, so one that now\n\t\t\t\t\t\t\t// loops back through us has taken a route we can't subscribe\n\t\t\t\t\t\t\t// over: the path is gone even though the message says active.\n\t\t\t\t\t\t\tif (this.#reflected(entry.cluster)) {\n\t\t\t\t\t\t\t\tconsole.debug(`dropping reflected namespace: broadcast=${path}`);\n\t\t\t\t\t\t\t\tif (live.delete(path)) this.#detachAnnounce(path);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// A repeat updates the advertisement; only the first is news.\n\t\t\t\t\t\t\tif (!live.has(path)) {\n\t\t\t\t\t\t\t\tlive.add(path);\n\t\t\t\t\t\t\t\tthis.#attachAnnounce(path);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (msgType === SubscribeNamespaceEntryDone.id) {\n\t\t\t\t\t\t\tconst entry = await SubscribeNamespaceEntryDone.decode(stream.reader, version);\n\t\t\t\t\t\t\tif (released) break;\n\t\t\t\t\t\t\tconst path = Path.join(prefix, entry.suffix);\n\n\t\t\t\t\t\t\tif (live.delete(path)) {\n\t\t\t\t\t\t\t\tthis.#detachAnnounce(path);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (msgType === PublishBlocked.id && version === Version.DRAFT_17) {\n\t\t\t\t\t\t\tconst blocked = await PublishBlocked.decode(stream.reader, version);\n\t\t\t\t\t\t\tconsole.debug(`publish_blocked: suffix=${blocked.suffix} track=${blocked.trackName}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`unexpected message on subscribe_namespace stream: 0x${msgType.toString(16)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\t// The race below can end through the consumer's close while a message that\n\t\t\t\t// already arrived is still decoding, which leaves the loop with nothing\n\t\t\t\t// awaiting it: a violation decoded after that would land nowhere, and its\n\t\t\t\t// rejection would go unhandled. Idempotent with the catch below, which is\n\t\t\t\t// what runs when the loop is the one that ends the race.\n\t\t\t\treadLoop.catch((err: unknown) => {\n\t\t\t\t\tif (err instanceof ProtocolViolation) this.#session.close();\n\t\t\t\t});\n\n\t\t\t\t// Wait for either the read loop or the announced to close\n\t\t\t\tawait Promise.race([readLoop, announced.closed]);\n\n\t\t\t\t// For v14/v15: send UnsubscribeNamespace before closing\n\t\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait stream.writer.u53(UnsubscribeNamespace.id);\n\t\t\t\t\t\tconst unsub = new UnsubscribeNamespace({ requestId });\n\t\t\t\t\t\tawait unsub.encode(stream.writer, version);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Stream might already be closed\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err) {\n\t\t\t\tstream.abort(error(err));\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`subscribe_namespace error: ${reason(e)}`);\n\n\t\t\t// An advertisement is decoded here rather than in the session dispatch, so this\n\t\t\t// is the only place a malformed one surfaces. The cluster draft requires closing\n\t\t\t// the session over those, and the stream alone is not enough: the peer would\n\t\t\t// just repeat it on the next SUBSCRIBE_NAMESPACE.\n\t\t\tif (e instanceof ProtocolViolation) this.#session.close();\n\n\t\t\t// Abort the stream rather than letting the caller's `finally` close it cleanly.\n\t\t\t// A rejected namespace subscription is a failure, and a consumer that can't tell\n\t\t\t// it from \"nothing is published under this prefix\" waits forever on a broadcast\n\t\t\t// that will never be announced. Matches the lite subscriber.\n\t\t\tannounced.close(e);\n\t\t} finally {\n\t\t\t// The stream owns every advertisement it carried, so release them however it\n\t\t\t// ends: a clean close, a decode error, or the peer resetting it. Without this\n\t\t\t// each namespace keeps its count and the source never detaches, which would\n\t\t\t// pin the path for the session even after the other source withdrew.\n\t\t\treleased = true;\n\t\t\tfor (const path of live) {\n\t\t\t\tthis.#detachAnnounce(path);\n\t\t\t}\n\t\t\tlive.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Consumes a broadcast from the connection.\n\t *\n\t * Deduplicated per path: repeat calls for the same still-live path share one reference-counted\n\t * broadcast (and one upstream subscription). The shared broadcast closes once every caller has\n\t * closed its handle, so callers close normally.\n\t */\n\tconsume(path: Path.Valid): broadcast.Consumer {\n\t\treturn this.#consumes.get(path) ?? this.#consumes.insert(path, this.#createConsume(path));\n\t}\n\n\t#createConsume(path: Path.Valid): broadcast.Consumer {\n\t\t// moq-transport has no one-shot group fetch; ConsumeBroadcast rejects it. Track info\n\t\t// is resolved by the subscribe path (the inherited resolveTrackInfo).\n\t\tconst consumer = new ConsumeBroadcast();\n\n\t\tvoid (async () => {\n\t\t\tfor (;;) {\n\t\t\t\tconst request = await consumer.requested();\n\t\t\t\tif (!request) break;\n\t\t\t\tvoid this.#runSubscribe(path, request);\n\t\t\t}\n\t\t})();\n\n\t\treturn consumer;\n\t}\n\n\tasync #runSubscribe(broadcast: Path.Valid, request: track.Request) {\n\t\tconst requestId = await this.#session.nextRequestId();\n\t\tif (requestId === undefined) {\n\t\t\trequest.reject(new Error(\"session closed\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.debug(`subscribe start: id=${requestId} broadcast=${broadcast} track=${request.name}`);\n\n\t\t// IETF negotiates group order in SUBSCRIBE_OK; this implementation only\n\t\t// supports descending (newest-first), so commit ordered: false. (There's no\n\t\t// per-frame timescale, so the rest stay at their defaults.) This\n\t\t// resolves the consumer's track.info() and gives us the write side that\n\t\t// incoming object streams are routed into.\n\t\tconst producer = request.accept({ ordered: false });\n\n\t\t// Open the stream and wait for SUBSCRIBE_OK under a timeout. State\n\t\t// flows back via `state` so the timeout path can clean up the stream\n\t\t// and any registration if setup eventually finishes.\n\t\tconst state: SubscribeSetupState = {};\n\t\tconst setup = this.#openSubscribe(state, broadcast, request, producer, requestId);\n\n\t\t// The publisher can be serving before it answers, so waiting only on the response\n\t\t// would miss the local side going away and leave it serving a track nobody reads.\n\t\t// Demand returning before we commit is not abandonment, matching the serving loop.\n\t\tconst waitAbandoned = async (): Promise<null> => {\n\t\t\tfor (;;) {\n\t\t\t\tawait producer.unused();\n\t\t\t\tif (producer.closed.peek() !== undefined || !producer.used.peek()) return null;\n\t\t\t}\n\t\t};\n\n\t\tlet stream: Stream;\n\t\tlet trackAlias: bigint;\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\twithTimeout(\n\t\t\t\t\tsetup,\n\t\t\t\t\tSUBSCRIBE_OK_TIMEOUT_MS,\n\t\t\t\t\t`subscribe timed out after ${SUBSCRIBE_OK_TIMEOUT_MS}ms waiting for SUBSCRIBE_OK (browser stream limit reached?)`,\n\t\t\t\t),\n\t\t\t\twaitAbandoned(),\n\t\t\t]);\n\n\t\t\tif (result === null) throw new Error(\"subscribe abandoned before it was accepted\");\n\n\t\t\tstream = result.stream;\n\t\t\ttrackAlias = result.alias;\n\t\t\tconsole.debug(`subscribe ok: id=${requestId} broadcast=${broadcast} track=${request.name}`);\n\t\t} catch (err) {\n\t\t\tconst e = error(err);\n\t\t\tproducer.close(e);\n\t\t\tconsole.warn(\n\t\t\t\t`subscribe error: id=${requestId} broadcast=${broadcast} track=${request.name} error=${reason(e)}`,\n\t\t\t);\n\t\t\t// Runs now for whatever is already open, and again if `setup` settles late.\n\t\t\t// Retirement is repeated because a late SUBSCRIBE_OK can register an alias after\n\t\t\t// the first pass; the stream is torn down once.\n\t\t\tlet torn = false;\n\t\t\tconst cleanup = async (afterSetup: boolean) => {\n\t\t\t\tstate.cancelled = true;\n\n\t\t\t\tif (state.registeredAlias !== undefined && this.#aliases.retire(state.registeredAlias, producer)) {\n\t\t\t\t\tthis.#timescales.delete(state.registeredAlias);\n\t\t\t\t}\n\n\t\t\t\tif (!state.stream || torn) return;\n\n\t\t\t\t// A SUBSCRIBE still being written must not be torn down from here. Aborting a\n\t\t\t\t// Web Stream waits for the in-flight write, so the request can still reach the\n\t\t\t\t// peer while the abort destroys the stream we would have cancelled on. Setup\n\t\t\t\t// unwinds on the cancelled flag once that write lands, and its pass below has\n\t\t\t\t// the finished picture.\n\t\t\t\tif (!state.sent && !afterSetup) return;\n\t\t\t\ttorn = true;\n\n\t\t\t\t// Once the SUBSCRIBE is out the publisher may be serving, whether or not it has\n\t\t\t\t// answered yet: data streams are independent of the request stream. Aborting says\n\t\t\t\t// nothing on v14-16, where the request rides a virtual stream whose reset is\n\t\t\t\t// local, so the UNSUBSCRIBE has to go out explicitly.\n\t\t\t\tif (state.sent && !state.rejected) await this.#cancelSubscribe(state.stream, requestId);\n\t\t\t\tstate.stream.abort(e);\n\t\t\t};\n\n\t\t\t// Tear down what is already open rather than waiting on `setup`. A peer that\n\t\t\t// opened the stream and then went quiet never settles it, and deferring would\n\t\t\t// leave the request outstanding for the life of the session -- which is the\n\t\t\t// timeout case, not a rare one.\n\t\t\tvoid cleanup(false);\n\t\t\tsetup.then(\n\t\t\t\t() => cleanup(true),\n\t\t\t\t() => cleanup(true),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Which terminal fired decides whether we owe the publisher a cancellation, so\n\t\t\t// tag them rather than racing bare promises.\n\t\t\tconst publisherEnded = Symbol(\"publisher\");\n\t\t\tconst localEnded = Symbol(\"local\");\n\t\t\tconst idle = Symbol(\"idle\");\n\n\t\t\t// Terminal conditions settle at most once (stream close = PublishDone, track close =\n\t\t\t// local unsubscribe); race them once so the demand loop doesn't re-subscribe each pass.\n\t\t\tconst done = Promise.race([\n\t\t\t\tstream.reader.closed.then(() => publisherEnded),\n\t\t\t\tproducer.closed.then(() => localEnded),\n\t\t\t]);\n\n\t\t\t// Serve until a terminal condition fires or the last local subscriber leaves. The unused\n\t\t\t// wake is level-triggered: re-check demand so a subscriber that returns before we tear\n\t\t\t// down resumes on the same stream.\n\t\t\tlet terminal = localEnded;\n\t\t\tfor (;;) {\n\t\t\t\tconst reason = await Promise.race([done, producer.unused().then(() => idle)]);\n\t\t\t\tif (reason === idle && producer.closed.peek() === undefined && producer.used.peek()) continue;\n\t\t\t\tterminal = reason;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// The publisher already ended the request, so there is nothing to cancel. Sending\n\t\t\t// UNSUBSCRIBE here would name a request it has already torn down.\n\t\t\tif (terminal !== publisherEnded) await this.#cancelSubscribe(stream, requestId);\n\n\t\t\tproducer.close();\n\t\t\tstream.close();\n\t\t\tconsole.debug(`subscribe close: id=${requestId} broadcast=${broadcast} track=${request.name}`);\n\t\t} catch (err) {\n\t\t\tconst e = error(err);\n\t\t\tproducer.close(e);\n\t\t\tstream.abort(e);\n\t\t\tconsole.warn(\n\t\t\t\t`subscribe error: id=${requestId} broadcast=${broadcast} track=${request.name} error=${reason(e)}`,\n\t\t\t);\n\t\t} finally {\n\t\t\t// Only the owner tears down the alias metadata: a later subscription may have\n\t\t\t// reclaimed the alias and installed its own timescale.\n\t\t\tif (this.#aliases.retire(trackAlias, producer)) this.#timescales.delete(trackAlias);\n\t\t}\n\t}\n\n\t/**\n\t * Tell the publisher to stop serving a subscription we are walking away from.\n\t *\n\t * v14-16 cancel with UNSUBSCRIBE (draft-16 section 9.12), which is what lets the\n\t * publisher destroy the subscription (section 5.1.1); v17+ removed the message and\n\t * rely on the stream reset instead. Every path that abandons an Established\n\t * subscription goes through here, because those versions carry the request over a\n\t * virtual stream whose reset never reaches the peer.\n\t */\n\tasync #cancelSubscribe(stream: Stream, requestId: bigint) {\n\t\tconst version = this.#session.version;\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16) return;\n\n\t\ttry {\n\t\t\tawait stream.writer.u53(Unsubscribe.id);\n\t\t\tawait new Unsubscribe({ requestId }).encode(stream.writer, version);\n\t\t} catch {\n\t\t\t// The stream may already be gone; there is nothing further to tell the peer.\n\t\t}\n\t}\n\n\t// Opens the subscribe stream, sends SUBSCRIBE, and reads the response.\n\t// `state` is populated as soon as the stream opens and again when the\n\t// trackAlias is registered, so the caller can clean both up on timeout\n\t// even before this promise settles.\n\tasync #openSubscribe(\n\t\tstate: SubscribeSetupState,\n\t\tbroadcast: Path.Valid,\n\t\trequest: track.Request,\n\t\tproducer: track.Producer,\n\t\trequestId: bigint,\n\t): Promise<{ stream: Stream; alias: bigint }> {\n\t\tconst version = this.#session.version;\n\n\t\tstate.stream = await this.#session.openBi();\n\n\t\t// The timeout can fire while the open is still in flight, in which case cleanup ran\n\t\t// with nothing to release. Bail now that the stream is recorded, so settling this\n\t\t// promise hands it back to be torn down.\n\t\tif (state.cancelled) throw new Error(\"subscribe cancelled before it was sent\");\n\n\t\tawait state.stream.writer.u53(Subscribe.id);\n\t\tconst msg = new Subscribe({\n\t\t\trequestId,\n\t\t\ttrackNamespace: broadcast,\n\t\t\ttrackName: request.name,\n\t\t\tsubscriberPriority: toWire(request.priority),\n\t\t\t// No fill is requested: the fill's fetch stream and the live subscription split\n\t\t\t// the group across two streams, and this subscriber does not reassemble them into\n\t\t\t// one group yet. A lenient publisher (like ours) replays the whole in-range group\n\t\t\t// on the subscription instead; a strict one only delivers from the next published\n\t\t\t// object, and that mid-group stream is dropped, degrading the join to the next\n\t\t\t// group boundary.\n\t\t\tfilter: joinFilter(version),\n\t\t});\n\t\tawait msg.encode(state.stream.writer, version);\n\t\tstate.sent = true;\n\n\t\t// The caller may have given up while that write was in flight. It deliberately left\n\t\t// the stream alone, so unwind here and let its cleanup send the cancellation now that\n\t\t// the SUBSCRIBE has actually reached the peer.\n\t\tif (state.cancelled) throw new Error(\"subscribe cancelled while it was being sent\");\n\t\tconsole.debug(`subscribe written: id=${requestId} broadcast=${broadcast} track=${request.name}`);\n\n\t\tconst respTypeId = await state.stream.reader.u53();\n\t\tif (respTypeId !== SubscribeOk.id) {\n\t\t\tlet reasonPhrase = \"unknown error\";\n\t\t\ttry {\n\t\t\t\tif (respTypeId === RequestError.id) {\n\t\t\t\t\tconst err =\n\t\t\t\t\t\tversion === Version.DRAFT_14\n\t\t\t\t\t\t\t? await SubscribeError.decode(state.stream.reader, version)\n\t\t\t\t\t\t\t: await RequestError.decode(state.stream.reader, version);\n\t\t\t\t\treasonPhrase = `code=${err.errorCode} reason=${err.reasonPhrase}`;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Decoding error response failed, use default message\n\t\t\t}\n\t\t\tstate.rejected = true;\n\t\t\tthrow new Error(`SUBSCRIBE error: ${reasonPhrase}`);\n\t\t}\n\n\t\tconst ok = await SubscribeOk.decode(state.stream.reader, version);\n\n\t\ttry {\n\t\t\tthis.#aliases.set(ok.trackAlias, producer, { broadcast, name: request.name });\n\t\t\tconst timescale = ok.properties.timescale;\n\t\t\tif (timescale !== undefined) {\n\t\t\t\tthis.#timescales.set(ok.trackAlias, timescale);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\t// Only one alias naming two different tracks is the session's problem. A publisher\n\t\t\t// sharing an alias between subscriptions to one track is allowed to do that, and\n\t\t\t// disconnecting over it would drop every other broadcast on the session.\n\t\t\tif (err instanceof DuplicateTrackAlias) this.#session.close();\n\t\t\tthrow err;\n\t\t}\n\t\tstate.registeredAlias = ok.trackAlias;\n\t\treturn { stream: state.stream, alias: ok.trackAlias };\n\t}\n\n\t/**\n\t * Handles an incoming PUBLISH_NAMESPACE on a bidi stream.\n\t * Tracks announced broadcasts and notifies consumers.\n\t *\n\t * @internal\n\t */\n\tasync runPublishNamespace(msg: PublishNamespace, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst path = msg.trackNamespace;\n\n\t\t// A path that already ran through us looped back. Refuse it rather than holding an\n\t\t// advertisement we could never subscribe through. The peer knows our Hop ID, so a\n\t\t// conforming one never offers it; 0 as the retry interval says not to come back.\n\t\tif (this.#reflected(msg.cluster)) {\n\t\t\tconsole.debug(`dropping reflected publish_namespace: broadcast=${path}`);\n\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\tawait new RequestError({\n\t\t\t\trequestId: msg.requestId,\n\t\t\t\terrorCode: 400,\n\t\t\t\treasonPhrase: \"route loops back\",\n\t\t\t}).encode(stream.writer, version);\n\t\t\tstream.close();\n\t\t\treturn;\n\t\t}\n\n\t\t// Draft-14/15 key their namespace-scoped messages by name, not request ID, so the\n\t\t// adapter can hold only one request per namespace: a second would overwrite the\n\t\t// first, and the withdrawals would then close the wrong stream and fail to find\n\t\t// the other. Nothing is lost by refusing it, because the case that makes a second\n\t\t// reference legitimate (an inline NAMESPACE for a path a PUBLISH_NAMESPACE already\n\t\t// carried) needs a message those drafts do not have.\n\t\tconst legacy = version === Version.DRAFT_14 || version === Version.DRAFT_15;\n\t\tif (legacy && (this.#announced.has(path) || this.#legacyRequests.has(path))) {\n\t\t\tconsole.warn(\"duplicate PublishNamespace\");\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(PublishNamespaceError.id);\n\t\t\t\tawait new PublishNamespaceError({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\terrorCode: 409,\n\t\t\t\t\treasonPhrase: \"duplicate namespace\",\n\t\t\t\t}).encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\t\tawait new RequestError({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\terrorCode: 409,\n\t\t\t\t\treasonPhrase: \"duplicate namespace\",\n\t\t\t\t}).encode(stream.writer, version);\n\t\t\t}\n\t\t\tstream.close();\n\t\t\treturn;\n\t\t}\n\n\t\t// Everywhere else a path this session already knows is not refused: the same\n\t\t// namespace can reach us twice, and the count is what tells the second apart from\n\t\t// news. This request owns exactly one of those references and gives it back when\n\t\t// the stream ends.\n\t\tif (legacy) this.#legacyRequests.add(path);\n\t\tlet attached = false;\n\n\t\ttry {\n\t\t\t// Send OK first. This must complete before notifying consumers,\n\t\t\t// because consumers may trigger Subscribe writes that would\n\t\t\t// interleave with our OK on the control stream.\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(PublishNamespaceOk.id);\n\t\t\t\tconst ok = new PublishNamespaceOk({ requestId: msg.requestId });\n\t\t\t\tawait ok.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestOk.id);\n\t\t\t\tconst ok = new RequestOk({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t});\n\t\t\t\tawait ok.encode(stream.writer, version);\n\t\t\t}\n\n\t\t\t// Only now is the advertisement ours to announce, for the reason above: a\n\t\t\t// consumer reacting with a SUBSCRIBE must not interleave with that OK.\n\t\t\tattached = true;\n\t\t\tthis.#attachAnnounce(path);\n\n\t\t\t// An advertisement is updated in place, by repeating PUBLISH_NAMESPACE on the\n\t\t\t// stream that already carries it, so read until the stream ends rather than\n\t\t\t// waiting on the close. Nothing else would deliver a re-parented route.\n\t\t\tconst done = version === Version.DRAFT_16 || legacy;\n\t\t\tfor (;;) {\n\t\t\t\tif (await stream.reader.done()) break;\n\n\t\t\t\tconst typeId = await stream.reader.u53();\n\t\t\t\tif (done && typeId === PublishNamespaceDone.id) {\n\t\t\t\t\tawait PublishNamespaceDone.decode(stream.reader, version);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (typeId !== PublishNamespace.id) {\n\t\t\t\t\tthrow new ProtocolViolation(\n\t\t\t\t\t\t`unexpected message on publish_namespace stream: 0x${typeId.toString(16)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst update = await PublishNamespace.decode(stream.reader, version, Cluster.negotiated(this.#cluster));\n\n\t\t\t\t// The stream is the advertisement, so an update on it must name the same\n\t\t\t\t// one. Applying a mismatched update would retarget this path with metadata\n\t\t\t\t// meant for a different request.\n\t\t\t\tif (update.requestId !== msg.requestId || update.trackNamespace !== path) {\n\t\t\t\t\tthrow new ProtocolViolation(\"publish_namespace update does not match its stream\");\n\t\t\t\t}\n\n\t\t\t\t// A path that now runs through us is unusable, so give it back. Keep\n\t\t\t\t// reading: this stream is the advertisement's only channel, so a later\n\t\t\t\t// clean path arrives here or nowhere.\n\t\t\t\tif (this.#reflected(update.cluster)) {\n\t\t\t\t\tif (attached) {\n\t\t\t\t\t\tattached = false;\n\t\t\t\t\t\tconsole.debug(`publish_namespace now loops back, detaching: broadcast=${path}`);\n\t\t\t\t\t\tthis.#detachAnnounce(path);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Re-attach: a clean path replaced the reflected one we detached from.\n\t\t\t\tif (!attached) {\n\t\t\t\t\tattached = true;\n\t\t\t\t\tthis.#attachAnnounce(path);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (legacy) this.#legacyRequests.delete(path);\n\n\t\t\t// Give back exactly what was taken: a request that never got its OK out never\n\t\t\t// referenced the path, and retracting there would drop someone else's count.\n\t\t\tif (attached) {\n\t\t\t\tthis.#detachAnnounce(path);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming PUBLISH on a bidi stream.\n\t * We don't support reverse publish, so send error.\n\t *\n\t * @internal\n\t */\n\tasync runPublish(msg: Publish, stream: Stream) {\n\t\tconst version = this.#session.version;\n\n\t\t// NOT_SUPPORTED, from the PUBLISH error codes in draft-19 section 10.10. We decline\n\t\t// the method itself rather than this particular track, which is UNINTERESTED (0x4).\n\t\t//\n\t\t// The alias the message carries is deliberately not recorded. Nothing will ever bind\n\t\t// it, and a rejected request has no lifetime of ours to hang the cleanup on.\n\t\tconst NOT_SUPPORTED = 0x3;\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\tawait stream.writer.u53(PublishError.id);\n\t\t\tconst err = new PublishError({\n\t\t\t\trequestId: msg.requestId,\n\t\t\t\terrorCode: NOT_SUPPORTED,\n\t\t\t\treasonPhrase: \"publish not supported\",\n\t\t\t});\n\t\t\tawait err.encode(stream.writer, version);\n\t\t} else {\n\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\tconst err = new RequestError({\n\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\terrorCode: NOT_SUPPORTED,\n\t\t\t\treasonPhrase: \"publish not supported\",\n\t\t\t});\n\t\t\tawait err.encode(stream.writer, version);\n\t\t}\n\t\tstream.close();\n\t}\n\n\t/**\n\t * Handles an ObjectStream message (group + frames on uni stream).\n\t *\n\t * @internal\n\t */\n\tasync handleGroup(group: GroupMessage, stream: Reader) {\n\t\tif (group.subGroupId !== 0) {\n\t\t\tthrow new Error(\"subgroups are not supported\");\n\t\t}\n\n\t\t// FIRST_OBJECT clear says this stream starts partway through the group, which the\n\t\t// draft lets a publisher do to answer a filter. Nothing above here can use it: the\n\t\t// objects that would arrive are not decodable without the missing head, and a group\n\t\t// is the unit an application resyncs on. Drop it and pick up at the next group, the\n\t\t// same degradation as a publisher that no longer holds the head.\n\t\t//\n\t\t// This only saves reading a stream we would throw away. The bit is the publisher's\n\t\t// claim, so what is enforced is the object ids themselves: `Frame.decode` holds every\n\t\t// object to starting at 0 and incrementing by 1, whatever the header said and on the\n\t\t// drafts that have no such bit to read.\n\t\tif (!group.flags.firstObject) {\n\t\t\tconsole.debug(`dropping a group with no head: alias=${group.trackAlias} group=${group.groupId}`);\n\t\t\tstream.stop(new Error(\"a group must start at object 0\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst producer = new netGroup.Producer(group.groupId);\n\n\t\ttry {\n\t\t\t// The control message establishing this alias can arrive after the data stream.\n\t\t\tconst track = await this.#aliases.get(group.trackAlias);\n\n\t\t\ttrack.writeGroup(producer);\n\n\t\t\tfor (;;) {\n\t\t\t\tconst done = await Promise.race([stream.done(), producer.closed, track.closed]);\n\t\t\t\tif (done !== false) break;\n\n\t\t\t\tconst frame = await Frame.decode(\n\t\t\t\t\tstream,\n\t\t\t\t\tgroup.flags,\n\t\t\t\t\tthis.#timescales.get(group.trackAlias),\n\t\t\t\t\tthis.#session.version,\n\t\t\t\t);\n\t\t\t\tif (frame.payload === undefined) break;\n\n\t\t\t\tproducer.writeFrame({ payload: frame.payload, timestamp: frame.timestamp ?? Timestamp.now() });\n\t\t\t}\n\n\t\t\tproducer.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\t// Ours: we cancelled the subscription and the publisher has not stopped yet.\n\t\t\t// Anything else on this alias is the publisher sending data for a track it never\n\t\t\t// acknowledged, which is worth seeing.\n\t\t\tif (e instanceof RetiredTrackAlias) {\n\t\t\t\tconsole.debug(`dropping group for a cancelled subscription: alias=${group.trackAlias}`);\n\t\t\t}\n\t\t\tproducer.close(e);\n\t\t\tstream.stop(e);\n\t\t}\n\t}\n}\n\n/**\n * A broadcast consumed from a moq-transport session. Track info is resolved by the\n * subscribe path (the inherited `resolveTrackInfo`), but the protocol has no one-shot\n * group fetch, so `track.Consumer.fetchGroup()` is rejected.\n */\nclass ConsumeBroadcast extends broadcast.Consumer {\n\t// biome-ignore lint/complexity/noUselessConstructor: widens the protected base constructor to public\n\tconstructor(state?: never) {\n\t\tsuper(state);\n\t}\n\n\t// Preserve the subclass when the consume cache shares this broadcast across callers.\n\toverride clone(): ConsumeBroadcast {\n\t\treturn new ConsumeBroadcast(this.shareState());\n\t}\n\n\toverride fetchGroup(): Promise<netGroup.Consumer> {\n\t\treturn Promise.reject(new Error(\"fetch group is not supported for moq-transport\"));\n\t}\n}\n"]}
|
package/ietf/version.d.ts
CHANGED
|
@@ -37,6 +37,11 @@ export declare const Version: {
|
|
|
37
37
|
* https://www.ietf.org/archive/id/draft-ietf-moq-transport-19.txt
|
|
38
38
|
*/
|
|
39
39
|
readonly DRAFT_19: 4278190099;
|
|
40
|
+
/**
|
|
41
|
+
* draft-ietf-moq-transport-20
|
|
42
|
+
* https://www.ietf.org/archive/id/draft-ietf-moq-transport-20.txt
|
|
43
|
+
*/
|
|
44
|
+
readonly DRAFT_20: 4278190100;
|
|
40
45
|
};
|
|
41
46
|
export type Version = (typeof Version)[keyof typeof Version];
|
|
42
47
|
export declare const ALPN: {
|
|
@@ -46,11 +51,12 @@ export declare const ALPN: {
|
|
|
46
51
|
readonly DRAFT_17: "moqt-17";
|
|
47
52
|
readonly DRAFT_18: "moqt-18";
|
|
48
53
|
readonly DRAFT_19: "moqt-19";
|
|
54
|
+
readonly DRAFT_20: "moqt-20";
|
|
49
55
|
};
|
|
50
56
|
/**
|
|
51
57
|
* IETF protocol versions used by the ietf/ module.
|
|
52
58
|
* Use this narrower type for version-branched encode/decode to get exhaustive matching.
|
|
53
59
|
*/
|
|
54
|
-
export type IetfVersion = typeof Version.DRAFT_14 | typeof Version.DRAFT_15 | typeof Version.DRAFT_16 | typeof Version.DRAFT_17 | typeof Version.DRAFT_18 | typeof Version.DRAFT_19;
|
|
60
|
+
export type IetfVersion = typeof Version.DRAFT_14 | typeof Version.DRAFT_15 | typeof Version.DRAFT_16 | typeof Version.DRAFT_17 | typeof Version.DRAFT_18 | typeof Version.DRAFT_19 | typeof Version.DRAFT_20;
|
|
55
61
|
export declare function versionName(v: Version): string;
|
|
56
62
|
//# sourceMappingURL=version.d.ts.map
|
package/ietf/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/ietf/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO;IACnB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;CACX,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAG7D,eAAO,MAAM,IAAI;aAChB,QAAQ,EAAE,QAAQ;aAClB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;CACV,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,WAAW,GACpB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/ietf/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO;IACnB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;aACH,QAAQ,EAAE,UAAU;CACX,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAG7D,eAAO,MAAM,IAAI;aAChB,QAAQ,EAAE,QAAQ;aAClB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;aACnB,QAAQ,EAAE,SAAS;CACV,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,WAAW,GACpB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,GACvB,OAAO,OAAO,CAAC,QAAQ,CAAC;AAa3B,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE9C"}
|
package/ietf/version.js
CHANGED
|
@@ -38,6 +38,11 @@ export const Version = {
|
|
|
38
38
|
* https://www.ietf.org/archive/id/draft-ietf-moq-transport-19.txt
|
|
39
39
|
*/
|
|
40
40
|
DRAFT_19: 0xff000013,
|
|
41
|
+
/**
|
|
42
|
+
* draft-ietf-moq-transport-20
|
|
43
|
+
* https://www.ietf.org/archive/id/draft-ietf-moq-transport-20.txt
|
|
44
|
+
*/
|
|
45
|
+
DRAFT_20: 0xff000014,
|
|
41
46
|
};
|
|
42
47
|
// ALPN / WebTransport subprotocol identifiers for draft versions.
|
|
43
48
|
export const ALPN = {
|
|
@@ -47,6 +52,7 @@ export const ALPN = {
|
|
|
47
52
|
DRAFT_17: "moqt-17",
|
|
48
53
|
DRAFT_18: "moqt-18",
|
|
49
54
|
DRAFT_19: "moqt-19",
|
|
55
|
+
DRAFT_20: "moqt-20",
|
|
50
56
|
};
|
|
51
57
|
const VERSION_NAMES = {
|
|
52
58
|
[Version.DRAFT_07]: "moq-transport-07",
|
|
@@ -56,6 +62,7 @@ const VERSION_NAMES = {
|
|
|
56
62
|
[Version.DRAFT_17]: "moq-transport-17",
|
|
57
63
|
[Version.DRAFT_18]: "moq-transport-18",
|
|
58
64
|
[Version.DRAFT_19]: "moq-transport-19",
|
|
65
|
+
[Version.DRAFT_20]: "moq-transport-20",
|
|
59
66
|
};
|
|
60
67
|
export function versionName(v) {
|
|
61
68
|
return VERSION_NAMES[v] ?? `unknown(0x${v.toString(16)})`;
|
package/ietf/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/ietf/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;CACX,CAAC;AAIX,kEAAkE;AAClE,MAAM,CAAC,MAAM,IAAI,GAAG;IACnB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;CACV,CAAC;
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/ietf/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;OAGG;IACH,QAAQ,EAAE,UAAU;CACX,CAAC;AAIX,kEAAkE;AAClE,MAAM,CAAC,MAAM,IAAI,GAAG;IACnB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;CACV,CAAC;AAeX,MAAM,aAAa,GAA2B;IAC7C,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;IACtC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB;CACtC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,CAAU;IACrC,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC;AAC3D,CAAC","sourcesContent":["/**\n * Supported MoQ Transport protocol versions\n */\nexport const Version = {\n\t/**\n\t * draft-ietf-moq-transport-07\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-07.txt\n\t */\n\tDRAFT_07: 0xff000007,\n\n\t/**\n\t * draft-ietf-moq-transport-14\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-14.txt\n\t */\n\tDRAFT_14: 0xff00000e,\n\n\t/**\n\t * draft-ietf-moq-transport-15\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-15.txt\n\t */\n\tDRAFT_15: 0xff00000f,\n\n\t/**\n\t * draft-ietf-moq-transport-16\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-16.txt\n\t */\n\tDRAFT_16: 0xff000010,\n\n\t/**\n\t * draft-ietf-moq-transport-17\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-17.txt\n\t */\n\tDRAFT_17: 0xff000011,\n\n\t/**\n\t * draft-ietf-moq-transport-18\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-18.txt\n\t */\n\tDRAFT_18: 0xff000012,\n\n\t/**\n\t * draft-ietf-moq-transport-19\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-19.txt\n\t */\n\tDRAFT_19: 0xff000013,\n\n\t/**\n\t * draft-ietf-moq-transport-20\n\t * https://www.ietf.org/archive/id/draft-ietf-moq-transport-20.txt\n\t */\n\tDRAFT_20: 0xff000014,\n} as const;\n\nexport type Version = (typeof Version)[keyof typeof Version];\n\n// ALPN / WebTransport subprotocol identifiers for draft versions.\nexport const ALPN = {\n\tDRAFT_14: \"moq-00\",\n\tDRAFT_15: \"moqt-15\",\n\tDRAFT_16: \"moqt-16\",\n\tDRAFT_17: \"moqt-17\",\n\tDRAFT_18: \"moqt-18\",\n\tDRAFT_19: \"moqt-19\",\n\tDRAFT_20: \"moqt-20\",\n} as const;\n\n/**\n * IETF protocol versions used by the ietf/ module.\n * Use this narrower type for version-branched encode/decode to get exhaustive matching.\n */\nexport type IetfVersion =\n\t| typeof Version.DRAFT_14\n\t| typeof Version.DRAFT_15\n\t| typeof Version.DRAFT_16\n\t| typeof Version.DRAFT_17\n\t| typeof Version.DRAFT_18\n\t| typeof Version.DRAFT_19\n\t| typeof Version.DRAFT_20;\n\nconst VERSION_NAMES: Record<number, string> = {\n\t[Version.DRAFT_07]: \"moq-transport-07\",\n\t[Version.DRAFT_14]: \"moq-transport-14\",\n\t[Version.DRAFT_15]: \"moq-transport-15\",\n\t[Version.DRAFT_16]: \"moq-transport-16\",\n\t[Version.DRAFT_17]: \"moq-transport-17\",\n\t[Version.DRAFT_18]: \"moq-transport-18\",\n\t[Version.DRAFT_19]: \"moq-transport-19\",\n\t[Version.DRAFT_20]: \"moq-transport-20\",\n};\n\nexport function versionName(v: Version): string {\n\treturn VERSION_NAMES[v] ?? `unknown(0x${v.toString(16)})`;\n}\n"]}
|
package/index.d.ts
CHANGED
|
@@ -6,17 +6,22 @@
|
|
|
6
6
|
*/
|
|
7
7
|
/** Re-export of {@link https://jsr.io/@moq/signals | @moq/signals}, the reactive primitives used throughout this package. */
|
|
8
8
|
export * as Signals from "@norskvideo/moq-signals";
|
|
9
|
-
|
|
10
|
-
export * from "./
|
|
11
|
-
|
|
9
|
+
/** Broadcast announcement streams. */
|
|
10
|
+
export * as Announce from "./announced";
|
|
11
|
+
/** Broadcast role handles. */
|
|
12
|
+
export * as Broadcast from "./broadcast";
|
|
12
13
|
/** Connection helpers: connect to or accept a MoQ session and reconnect on failure. */
|
|
13
14
|
export * as Connection from "./connection/index";
|
|
14
|
-
|
|
15
|
+
/** The error a read or write rejects with when the peer resets a stream, carrying its code. */
|
|
16
|
+
export { RemoteError } from "./error";
|
|
17
|
+
/** Group role handles and frame helpers. */
|
|
18
|
+
export * as Group from "./group";
|
|
15
19
|
/** Broadcast path utilities with delimiter-aware prefix matching. */
|
|
16
20
|
export * as Path from "./path";
|
|
17
21
|
/** Branded time types (nanoseconds, microseconds, milliseconds, seconds) with conversions. */
|
|
18
22
|
export * as Time from "./time";
|
|
19
|
-
|
|
23
|
+
/** Track role handles. */
|
|
24
|
+
export * as Track from "./track";
|
|
20
25
|
/** QUIC variable-length integer encoding and decoding. */
|
|
21
26
|
export * as Varint from "./varint";
|
|
22
27
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6HAA6H;AAC7H,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6HAA6H;AAC7H,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,sCAAsC;AACtC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,8BAA8B;AAC9B,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,uFAAuF;AACvF,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,+FAA+F;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,4CAA4C;AAC5C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,qEAAqE;AACrE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,8FAA8F;AAC9F,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,0BAA0B;AAC1B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,0DAA0D;AAC1D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC"}
|
package/index.js
CHANGED
|
@@ -7,17 +7,22 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as Signals_1 from "@norskvideo/moq-signals";
|
|
9
9
|
export { Signals_1 as Signals };
|
|
10
|
-
|
|
11
|
-
export
|
|
12
|
-
|
|
10
|
+
import * as Announce_1 from "./announced.js";
|
|
11
|
+
export { Announce_1 as Announce };
|
|
12
|
+
import * as Broadcast_1 from "./broadcast.js";
|
|
13
|
+
export { Broadcast_1 as Broadcast };
|
|
13
14
|
import * as Connection_1 from "./connection/index.js";
|
|
14
15
|
export { Connection_1 as Connection };
|
|
15
|
-
|
|
16
|
+
/** The error a read or write rejects with when the peer resets a stream, carrying its code. */
|
|
17
|
+
export { RemoteError } from "./error.js";
|
|
18
|
+
import * as Group_1 from "./group.js";
|
|
19
|
+
export { Group_1 as Group };
|
|
16
20
|
import * as Path_1 from "./path.js";
|
|
17
21
|
export { Path_1 as Path };
|
|
18
22
|
import * as Time_1 from "./time.js";
|
|
19
23
|
export { Time_1 as Time };
|
|
20
|
-
|
|
24
|
+
import * as Track_1 from "./track.js";
|
|
25
|
+
export { Track_1 as Track };
|
|
21
26
|
import * as Varint_1 from "./varint.js";
|
|
22
27
|
export { Varint_1 as Varint };
|
|
23
28
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;2BAGsB,cAAc;sBAA3B,OAAO;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;2BAGsB,cAAc;sBAA3B,OAAO;4BAEO,gBAAgB;uBAA9B,QAAQ;6BAEO,gBAAgB;wBAA/B,SAAS;8BAEO,uBAAuB;yBAAvC,UAAU;AACtB,+FAA+F;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;yBAElB,YAAY;oBAAvB,KAAK;wBAEK,WAAW;mBAArB,IAAI;wBAEM,WAAW;mBAArB,IAAI;yBAEO,YAAY;oBAAvB,KAAK;0BAEO,aAAa;qBAAzB,MAAM","sourcesContent":["/**\n * MoQ networking layer for browsers: connect to a relay, then publish and consume\n * broadcasts, tracks, groups, and frames over WebTransport (or a WebSocket fallback).\n *\n * @module\n */\n\n/** Re-export of {@link https://jsr.io/@moq/signals | @moq/signals}, the reactive primitives used throughout this package. */\nexport * as Signals from \"@moq/signals\";\n/** Broadcast announcement streams. */\nexport * as Announce from \"./announced.ts\";\n/** Broadcast role handles. */\nexport * as Broadcast from \"./broadcast.ts\";\n/** Connection helpers: connect to or accept a MoQ session and reconnect on failure. */\nexport * as Connection from \"./connection/index.ts\";\n/** The error a read or write rejects with when the peer resets a stream, carrying its code. */\nexport { RemoteError } from \"./error.ts\";\n/** Group role handles and frame helpers. */\nexport * as Group from \"./group.ts\";\n/** Broadcast path utilities with delimiter-aware prefix matching. */\nexport * as Path from \"./path.ts\";\n/** Branded time types (nanoseconds, microseconds, milliseconds, seconds) with conversions. */\nexport * as Time from \"./time.ts\";\n/** Track role handles. */\nexport * as Track from \"./track.ts\";\n/** QUIC variable-length integer encoding and decoding. */\nexport * as Varint from \"./varint.ts\";\n"]}
|
package/internal.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package-internal constructor hooks. Classes keep their constructors private so consumers
|
|
3
|
+
* can't mint detached handles; sibling modules create instances through these hooks instead.
|
|
4
|
+
* Not exported from the package entrypoint.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { Producer, Request } from "./track";
|
|
9
|
+
/** The next group or datagram sequence shared by dynamic producers of one broadcast track. */
|
|
10
|
+
export interface TrackSequence {
|
|
11
|
+
next: number;
|
|
12
|
+
}
|
|
13
|
+
/** Per-track sequence namespaces owned by one broadcast generation. */
|
|
14
|
+
export type TrackSequences = Map<string, TrackSequence>;
|
|
15
|
+
/** Inputs for creating a package-internal track request. */
|
|
16
|
+
export interface TrackRequestOptions {
|
|
17
|
+
/** The requested track name. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** The producer that will serve the request. */
|
|
20
|
+
producer: Producer;
|
|
21
|
+
/** Sequence namespaces shared by the broadcast generation. */
|
|
22
|
+
sequences: TrackSequences;
|
|
23
|
+
}
|
|
24
|
+
/** Hooks assigned in static blocks by the owning class. */
|
|
25
|
+
export declare const hooks: {
|
|
26
|
+
/** Mint a track {@link Request}; assigned by `track.ts`. */
|
|
27
|
+
makeRequest: (options: TrackRequestOptions) => Request;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpD,8FAA8F;AAC9F,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAExD,4DAA4D;AAC5D,MAAM,WAAW,mBAAmB;IACnC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,QAAQ,EAAE,QAAQ,CAAC;IACnB,8DAA8D;IAC9D,SAAS,EAAE,cAAc,CAAC;CAC1B;AAED,2DAA2D;AAC3D,eAAO,MAAM,KAAK,EAAE;IACnB,4DAA4D;IAC5D,WAAW,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC;CAKvD,CAAC"}
|
package/internal.js
ADDED
package/internal.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AA2BA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,KAAK,GAGd;IACH,WAAW,EAAE,GAAG,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACxC,CAAC;CACD,CAAC","sourcesContent":["/**\n * Package-internal constructor hooks. Classes keep their constructors private so consumers\n * can't mint detached handles; sibling modules create instances through these hooks instead.\n * Not exported from the package entrypoint.\n *\n * @module\n */\nimport type { Producer, Request } from \"./track.ts\";\n\n/** The next group or datagram sequence shared by dynamic producers of one broadcast track. */\nexport interface TrackSequence {\n\tnext: number;\n}\n\n/** Per-track sequence namespaces owned by one broadcast generation. */\nexport type TrackSequences = Map<string, TrackSequence>;\n\n/** Inputs for creating a package-internal track request. */\nexport interface TrackRequestOptions {\n\t/** The requested track name. */\n\tname: string;\n\t/** The producer that will serve the request. */\n\tproducer: Producer;\n\t/** Sequence namespaces shared by the broadcast generation. */\n\tsequences: TrackSequences;\n}\n\n/** Hooks assigned in static blocks by the owning class. */\nexport const hooks: {\n\t/** Mint a track {@link Request}; assigned by `track.ts`. */\n\tmakeRequest: (options: TrackRequestOptions) => Request;\n} = {\n\tmakeRequest: () => {\n\t\tthrow new Error(\"track.ts not loaded\");\n\t},\n};\n"]}
|
package/lite/announce.d.ts
CHANGED
|
@@ -1,29 +1,68 @@
|
|
|
1
|
+
import { type Origin } from "../origin";
|
|
1
2
|
import * as Path from "../path";
|
|
2
3
|
import type { Reader, Writer } from "../stream";
|
|
3
|
-
import { type Origin } from "./origin";
|
|
4
4
|
import { Version } from "./version";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
/**
|
|
6
|
+
* An announcement on the Announce Stream, advertising or retracting a broadcast.
|
|
7
|
+
*
|
|
8
|
+
* On lite-06+ these are three independently-typed messages (`ANNOUNCE_START`,
|
|
9
|
+
* `ANNOUNCE_END`, `ANNOUNCE_RESTART`), each framed as `Type | Length | Body` like the
|
|
10
|
+
* subscribe stream's responses. Each `active` (ANNOUNCE_START) implicitly assigns the
|
|
11
|
+
* next announce id (a per-stream ordinal starting at 0); `endedId`/`restart` reference
|
|
12
|
+
* that id instead of repeating the path. Older versions send a single ANNOUNCE_BROADCAST
|
|
13
|
+
* message that retracts by path (`ended`).
|
|
14
|
+
*/
|
|
15
|
+
export type AnnounceBroadcast =
|
|
16
|
+
/** A broadcast is now available, carrying the path suffix, the hop chain, and
|
|
17
|
+
* (lite-06+) the route cost. An absent cost encodes as zero. */
|
|
18
|
+
{
|
|
19
|
+
status: "active";
|
|
8
20
|
suffix: Path.Valid;
|
|
9
|
-
active: boolean;
|
|
10
21
|
hops: Origin[];
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
cost?: bigint;
|
|
23
|
+
}
|
|
24
|
+
/** Pre-lite-06: a broadcast is no longer available, retracted by path. */
|
|
25
|
+
| {
|
|
26
|
+
status: "ended";
|
|
27
|
+
suffix: Path.Valid;
|
|
28
|
+
}
|
|
29
|
+
/** Lite06+: a broadcast is no longer available, retracted by announce id.
|
|
30
|
+
* The id is retired; referencing it again is a protocol violation. */
|
|
31
|
+
| {
|
|
32
|
+
status: "endedId";
|
|
33
|
+
id: bigint;
|
|
19
34
|
}
|
|
20
|
-
|
|
35
|
+
/** Lite06+: atomically replace the announcement with this id (e.g. a new hop
|
|
36
|
+
* chain after a relay failover, or a route whose cost moved). The id stays live. */
|
|
37
|
+
| {
|
|
38
|
+
status: "restart";
|
|
39
|
+
id: bigint;
|
|
40
|
+
hops: Origin[];
|
|
41
|
+
cost?: bigint;
|
|
42
|
+
};
|
|
43
|
+
/** Encode one announcement, including its type discriminator (lite-06+) and length prefix. */
|
|
44
|
+
export declare function encodeAnnounceBroadcast(w: Writer, msg: AnnounceBroadcast, version: Version): Promise<void>;
|
|
45
|
+
/** Decode one announcement, including its type discriminator (lite-06+) and length prefix. */
|
|
46
|
+
export declare function decodeAnnounceBroadcast(r: Reader, version: Version): Promise<AnnounceBroadcast>;
|
|
47
|
+
/** Like {@link decodeAnnounceBroadcast} but resolves `undefined` on a clean FIN. */
|
|
48
|
+
export declare function decodeAnnounceBroadcastMaybe(r: Reader, version: Version): Promise<AnnounceBroadcast | undefined>;
|
|
49
|
+
/**
|
|
50
|
+
* ANNOUNCE_REQUEST: sent by the subscriber to request ANNOUNCE_BROADCAST messages
|
|
51
|
+
* for a path prefix. Renamed from `AnnounceInterest` in lite-05.
|
|
52
|
+
*/
|
|
53
|
+
export declare class AnnounceRequest {
|
|
21
54
|
#private;
|
|
22
55
|
prefix: Path.Valid;
|
|
56
|
+
/** Lite04/05 only: the 62-bit Origin id of the peer asking for announces, which the
|
|
57
|
+
* publisher uses to skip announces that already passed through it. Zero means "no
|
|
58
|
+
* exclusion". Not on the wire elsewhere, so a value set here is ignored when encoding
|
|
59
|
+
* for another version and decodes as zero.
|
|
60
|
+
*
|
|
61
|
+
* Must be a bigint: peer origins are up to 62 bits and overflow u53. */
|
|
23
62
|
excludeHop: bigint;
|
|
24
63
|
constructor(prefix: Path.Valid, excludeHop?: bigint);
|
|
25
64
|
encode(w: Writer, version: Version): Promise<void>;
|
|
26
|
-
static decode(r: Reader, version: Version): Promise<
|
|
65
|
+
static decode(r: Reader, version: Version): Promise<AnnounceRequest>;
|
|
27
66
|
}
|
|
28
67
|
export declare class AnnounceInit {
|
|
29
68
|
#private;
|
|
@@ -32,4 +71,12 @@ export declare class AnnounceInit {
|
|
|
32
71
|
encode(w: Writer, version: Version): Promise<void>;
|
|
33
72
|
static decode(r: Reader, version: Version): Promise<AnnounceInit>;
|
|
34
73
|
}
|
|
74
|
+
export declare class AnnounceOk {
|
|
75
|
+
#private;
|
|
76
|
+
origin: Origin;
|
|
77
|
+
active: number;
|
|
78
|
+
constructor(origin: Origin, active: number);
|
|
79
|
+
encode(w: Writer, version: Version): Promise<void>;
|
|
80
|
+
static decode(r: Reader, version: Version): Promise<AnnounceOk>;
|
|
81
|
+
}
|
|
35
82
|
//# sourceMappingURL=announce.d.ts.map
|
package/lite/announce.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.d.ts","sourceRoot":"","sources":["../../src/lite/announce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,
|
|
1
|
+
{"version":3,"file":"announce.d.ts","sourceRoot":"","sources":["../../src/lite/announce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAgC,MAAM,cAAc,CAAC;AACnF,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAA6D,OAAO,EAAE,MAAM,cAAc,CAAC;AAclG;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB;AAC5B;gEACgE;AAC9D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACzE,0EAA0E;GACxE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAA;CAAE;AACzC;sEACsE;GACpE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AACnC;oFACoF;GAClF;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAwJpE,8FAA8F;AAC9F,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhH;AAED,8FAA8F;AAC9F,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAMrG;AAED,oFAAoF;AACpF,wBAAsB,4BAA4B,CACjD,CAAC,EAAE,MAAM,EACT,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAOxC;AAED;;;GAGG;AACH,qBAAa,eAAe;;IAC3B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;IACnB;;;;;4EAKwE;IACxE,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,GAAE,MAAW,EAGtD;IAeK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAEzE;CACD;AAKD,qBAAa,YAAY;;IACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAEvB,YAAY,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAE9B;IA4BK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAGtE;CACD;AASD,qBAAa,UAAU;;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAEf,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAGzC;IAsBK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvD;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAGpE;CACD"}
|