@norskvideo/moq-net 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/README.md +2 -2
  2. package/announce.d.ts +7 -0
  3. package/announce.d.ts.map +1 -0
  4. package/announce.js +8 -0
  5. package/announce.js.map +1 -0
  6. package/announced.d.ts +49 -91
  7. package/announced.d.ts.map +1 -1
  8. package/announced.js +21 -156
  9. package/announced.js.map +1 -1
  10. package/bandwidth.d.ts +163 -0
  11. package/bandwidth.d.ts.map +1 -0
  12. package/bandwidth.js +304 -0
  13. package/bandwidth.js.map +1 -0
  14. package/bandwidth_api.d.ts +7 -0
  15. package/bandwidth_api.d.ts.map +1 -0
  16. package/bandwidth_api.js +8 -0
  17. package/bandwidth_api.js.map +1 -0
  18. package/broadcast.d.ts +44 -35
  19. package/broadcast.d.ts.map +1 -1
  20. package/broadcast.js +104 -60
  21. package/broadcast.js.map +1 -1
  22. package/connection/accept.d.ts +16 -1
  23. package/connection/accept.d.ts.map +1 -1
  24. package/connection/accept.js +52 -28
  25. package/connection/accept.js.map +1 -1
  26. package/connection/browser.d.ts.map +1 -1
  27. package/connection/browser.js +9 -7
  28. package/connection/browser.js.map +1 -1
  29. package/connection/connect.d.ts +30 -6
  30. package/connection/connect.d.ts.map +1 -1
  31. package/connection/connect.js +110 -54
  32. package/connection/connect.js.map +1 -1
  33. package/connection/established.d.ts +17 -21
  34. package/connection/established.d.ts.map +1 -1
  35. package/connection/established.js.map +1 -1
  36. package/connection/forward.d.ts +2 -0
  37. package/connection/forward.d.ts.map +1 -0
  38. package/connection/forward.js +173 -0
  39. package/connection/forward.js.map +1 -0
  40. package/connection/handshake.d.ts +1 -0
  41. package/connection/handshake.d.ts.map +1 -1
  42. package/connection/handshake.js +5 -2
  43. package/connection/handshake.js.map +1 -1
  44. package/connection/index.d.ts +5 -5
  45. package/connection/index.d.ts.map +1 -1
  46. package/connection/index.js +4 -5
  47. package/connection/index.js.map +1 -1
  48. package/connection/pool.d.ts +186 -0
  49. package/connection/pool.d.ts.map +1 -0
  50. package/connection/pool.js +361 -0
  51. package/connection/pool.js.map +1 -0
  52. package/connection/reload.d.ts +14 -93
  53. package/connection/reload.d.ts.map +1 -1
  54. package/connection/reload.js +217 -81
  55. package/connection/reload.js.map +1 -1
  56. package/connection/stats.d.ts +3 -26
  57. package/connection/stats.d.ts.map +1 -1
  58. package/connection/stats.js.map +1 -1
  59. package/connection/transport.d.ts +0 -7
  60. package/connection/transport.d.ts.map +1 -1
  61. package/consume.d.ts +1 -43
  62. package/consume.d.ts.map +1 -1
  63. package/consume.js +1 -1
  64. package/consume.js.map +1 -1
  65. package/error.d.ts +180 -29
  66. package/error.d.ts.map +1 -1
  67. package/error.js +331 -16
  68. package/error.js.map +1 -1
  69. package/errors.d.ts +7 -0
  70. package/errors.d.ts.map +1 -0
  71. package/errors.js +8 -0
  72. package/errors.js.map +1 -0
  73. package/group.d.ts +9 -43
  74. package/group.d.ts.map +1 -1
  75. package/group.js +284 -69
  76. package/group.js.map +1 -1
  77. package/hop.d.ts +115 -0
  78. package/hop.d.ts.map +1 -0
  79. package/hop.js +119 -0
  80. package/hop.js.map +1 -0
  81. package/ietf/adapter.d.ts +5 -1
  82. package/ietf/adapter.d.ts.map +1 -1
  83. package/ietf/adapter.js +105 -60
  84. package/ietf/adapter.js.map +1 -1
  85. package/ietf/aliases.d.ts +1 -78
  86. package/ietf/aliases.d.ts.map +1 -1
  87. package/ietf/cluster.d.ts +9 -123
  88. package/ietf/cluster.d.ts.map +1 -1
  89. package/ietf/cluster.js +84 -44
  90. package/ietf/cluster.js.map +1 -1
  91. package/ietf/connection.d.ts +6 -72
  92. package/ietf/connection.d.ts.map +1 -1
  93. package/ietf/connection.js +62 -56
  94. package/ietf/connection.js.map +1 -1
  95. package/ietf/error.d.ts +11 -0
  96. package/ietf/error.d.ts.map +1 -0
  97. package/ietf/error.js +193 -0
  98. package/ietf/error.js.map +1 -0
  99. package/ietf/fetch.d.ts +7 -20
  100. package/ietf/fetch.d.ts.map +1 -1
  101. package/ietf/fetch.js +52 -22
  102. package/ietf/fetch.js.map +1 -1
  103. package/ietf/filter.d.ts +2 -0
  104. package/ietf/filter.d.ts.map +1 -1
  105. package/ietf/filter.js +10 -1
  106. package/ietf/filter.js.map +1 -1
  107. package/ietf/goaway.d.ts.map +1 -1
  108. package/ietf/goaway.js +22 -5
  109. package/ietf/goaway.js.map +1 -1
  110. package/ietf/hidden.d.ts +2 -0
  111. package/ietf/hidden.d.ts.map +1 -0
  112. package/ietf/hidden.js +30 -0
  113. package/ietf/hidden.js.map +1 -0
  114. package/ietf/index.d.ts +2 -0
  115. package/ietf/index.d.ts.map +1 -1
  116. package/ietf/index.js +2 -0
  117. package/ietf/index.js.map +1 -1
  118. package/ietf/object.d.ts +15 -8
  119. package/ietf/object.d.ts.map +1 -1
  120. package/ietf/object.js +51 -36
  121. package/ietf/object.js.map +1 -1
  122. package/ietf/parameters.d.ts +14 -2
  123. package/ietf/parameters.d.ts.map +1 -1
  124. package/ietf/parameters.js +97 -29
  125. package/ietf/parameters.js.map +1 -1
  126. package/ietf/properties.d.ts +1 -0
  127. package/ietf/properties.d.ts.map +1 -1
  128. package/ietf/properties.js +14 -0
  129. package/ietf/properties.js.map +1 -1
  130. package/ietf/publish.d.ts +19 -2
  131. package/ietf/publish.d.ts.map +1 -1
  132. package/ietf/publish.js +40 -6
  133. package/ietf/publish.js.map +1 -1
  134. package/ietf/publish_namespace.d.ts +25 -0
  135. package/ietf/publish_namespace.d.ts.map +1 -1
  136. package/ietf/publish_namespace.js +63 -0
  137. package/ietf/publish_namespace.js.map +1 -1
  138. package/ietf/publisher.d.ts +1 -82
  139. package/ietf/publisher.d.ts.map +1 -1
  140. package/ietf/publisher.js +483 -235
  141. package/ietf/publisher.js.map +1 -1
  142. package/ietf/solicit.d.ts +1 -40
  143. package/ietf/solicit.d.ts.map +1 -1
  144. package/ietf/subscribe.d.ts +8 -6
  145. package/ietf/subscribe.d.ts.map +1 -1
  146. package/ietf/subscribe.js +33 -27
  147. package/ietf/subscribe.js.map +1 -1
  148. package/ietf/subscribe_namespace.d.ts +8 -2
  149. package/ietf/subscribe_namespace.d.ts.map +1 -1
  150. package/ietf/subscribe_namespace.js +18 -8
  151. package/ietf/subscribe_namespace.js.map +1 -1
  152. package/ietf/subscriber.d.ts +1 -65
  153. package/ietf/subscriber.d.ts.map +1 -1
  154. package/ietf/subscriber.js +337 -123
  155. package/ietf/subscriber.js.map +1 -1
  156. package/ietf/token.d.ts +2 -0
  157. package/ietf/token.d.ts.map +1 -0
  158. package/ietf/token.js +99 -0
  159. package/ietf/token.js.map +1 -0
  160. package/ietf/track.d.ts +4 -0
  161. package/ietf/track.d.ts.map +1 -1
  162. package/ietf/track.js +6 -20
  163. package/ietf/track.js.map +1 -1
  164. package/ietf/version.d.ts +12 -1
  165. package/ietf/version.d.ts.map +1 -1
  166. package/ietf/version.js +13 -0
  167. package/ietf/version.js.map +1 -1
  168. package/index.d.ts +12 -7
  169. package/index.d.ts.map +1 -1
  170. package/index.js +10 -5
  171. package/index.js.map +1 -1
  172. package/internal.d.ts +115 -1
  173. package/internal.d.ts.map +1 -1
  174. package/internal.js +108 -0
  175. package/internal.js.map +1 -1
  176. package/lite/announce.d.ts +60 -10
  177. package/lite/announce.d.ts.map +1 -1
  178. package/lite/announce.js +176 -31
  179. package/lite/announce.js.map +1 -1
  180. package/lite/connection.d.ts +9 -59
  181. package/lite/connection.d.ts.map +1 -1
  182. package/lite/connection.js +34 -35
  183. package/lite/connection.js.map +1 -1
  184. package/lite/datagram.d.ts +3 -2
  185. package/lite/datagram.d.ts.map +1 -1
  186. package/lite/datagram.js +7 -8
  187. package/lite/datagram.js.map +1 -1
  188. package/lite/fetch.d.ts +15 -1
  189. package/lite/fetch.d.ts.map +1 -1
  190. package/lite/fetch.js +39 -7
  191. package/lite/fetch.js.map +1 -1
  192. package/lite/goaway.d.ts.map +1 -1
  193. package/lite/goaway.js +7 -1
  194. package/lite/goaway.js.map +1 -1
  195. package/lite/group.d.ts +30 -12
  196. package/lite/group.d.ts.map +1 -1
  197. package/lite/group.js +68 -26
  198. package/lite/group.js.map +1 -1
  199. package/lite/message.d.ts +2 -2
  200. package/lite/message.d.ts.map +1 -1
  201. package/lite/message.js +14 -5
  202. package/lite/message.js.map +1 -1
  203. package/lite/priority.d.ts +1 -61
  204. package/lite/priority.d.ts.map +1 -1
  205. package/lite/priority.js +4 -5
  206. package/lite/priority.js.map +1 -1
  207. package/lite/publisher.d.ts +1 -69
  208. package/lite/publisher.d.ts.map +1 -1
  209. package/lite/publisher.js +630 -262
  210. package/lite/publisher.js.map +1 -1
  211. package/lite/setup.d.ts +8 -8
  212. package/lite/setup.d.ts.map +1 -1
  213. package/lite/setup.js +33 -30
  214. package/lite/setup.js.map +1 -1
  215. package/lite/subscribe.d.ts +71 -17
  216. package/lite/subscribe.d.ts.map +1 -1
  217. package/lite/subscribe.js +205 -53
  218. package/lite/subscribe.js.map +1 -1
  219. package/lite/subscriber.d.ts +15 -56
  220. package/lite/subscriber.d.ts.map +1 -1
  221. package/lite/subscriber.js +451 -247
  222. package/lite/subscriber.js.map +1 -1
  223. package/lite/track.d.ts +4 -10
  224. package/lite/track.d.ts.map +1 -1
  225. package/lite/track.js +34 -29
  226. package/lite/track.js.map +1 -1
  227. package/lite/version.d.ts +42 -6
  228. package/lite/version.d.ts.map +1 -1
  229. package/lite/version.js +126 -10
  230. package/lite/version.js.map +1 -1
  231. package/origin.d.ts +256 -29
  232. package/origin.d.ts.map +1 -1
  233. package/origin.js +1427 -37
  234. package/origin.js.map +1 -1
  235. package/package.json +8 -3
  236. package/path.d.ts +25 -7
  237. package/path.d.ts.map +1 -1
  238. package/path.js +5 -3
  239. package/path.js.map +1 -1
  240. package/stream.d.ts +73 -14
  241. package/stream.d.ts.map +1 -1
  242. package/stream.js +372 -141
  243. package/stream.js.map +1 -1
  244. package/tail.d.ts +18 -0
  245. package/tail.d.ts.map +1 -0
  246. package/tail.js +167 -0
  247. package/tail.js.map +1 -0
  248. package/time.d.ts +15 -2
  249. package/time.d.ts.map +1 -1
  250. package/time.js +28 -9
  251. package/time.js.map +1 -1
  252. package/track.d.ts +211 -83
  253. package/track.d.ts.map +1 -1
  254. package/track.js +816 -205
  255. package/track.js.map +1 -1
  256. package/util/abort.d.ts +2 -0
  257. package/util/abort.d.ts.map +1 -0
  258. package/util/abort.js +20 -0
  259. package/util/abort.js.map +1 -0
  260. package/util/log.d.ts +5 -0
  261. package/util/log.d.ts.map +1 -0
  262. package/util/log.js +17 -0
  263. package/util/log.js.map +1 -0
  264. package/util/u64.d.ts +39 -0
  265. package/util/u64.d.ts.map +1 -0
  266. package/util/u64.js +83 -0
  267. package/util/u64.js.map +1 -0
  268. package/util/varint.d.ts +29 -0
  269. package/util/varint.d.ts.map +1 -0
  270. package/util/varint.js +198 -0
  271. package/util/varint.js.map +1 -0
  272. package/varint.d.ts +10 -6
  273. package/varint.d.ts.map +1 -1
  274. package/varint.js +40 -237
  275. package/varint.js.map +1 -1
  276. package/wire.d.ts +80 -0
  277. package/wire.d.ts.map +1 -0
  278. package/wire.js +32 -0
  279. package/wire.js.map +1 -0
  280. package/zod.d.ts +1 -1
  281. package/zod.d.ts.map +1 -1
  282. package/zod.js.map +1 -1
  283. package/mock.d.ts +0 -66
  284. package/mock.d.ts.map +0 -1
  285. package/mock.js +0 -243
  286. package/mock.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/ietf/subscriber.ts"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/ietf/subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5C,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,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,IAAI,EAAc,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAkB,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,KAAK,EAA8B,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAgB,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAEN,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,GACtB,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;AA0CvC,qEAAqE;AACrE,SAAS,IAAI,CAAC,MAAc,EAAE,IAAgB;IAC7C,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAClG,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACtB,QAAQ,CAAU;IAElB,qFAAqF;IACrF,uDAAuD;IACvD,KAAK,CAAgB;IAErB,yFAAyF;IACzF,yFAAyF;IACzF,kBAAkB;IAClB,QAAQ,CAAgB;IAExB,2DAA2D;IAC3D,QAAQ,GAAG,IAAI,YAAY,EAAgB,CAAC;IAE5C,iFAAiF;IACjF,qFAAqF;IACrF,yEAAyE;IACzE,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE3C,qFAAqF;IACrF,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IAEjC,sFAAsF;IACtF,yEAAyE;IACzE,MAAM,GAAG,SAAS,EAAE,CAAC;IAErB,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,EAA+C,CAAC;IAEpE,8EAA8E;IAC9E,mBAAmB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE3D,kEAAkE;IAClE,OAAO,CAAU;IAEjB;;;;OAIG;IACH,YAAY,EACX,OAAO,EACP,IAAI,EACJ,OAAO,EACP,MAAM,GAAG,KAAK,GAUd;QACA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,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;;;OAGG;IACH,MAAM,CAAC,MAAkC;QACxC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvF,iFAAiF;QACjF,gBAAgB;QAChB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,KAAK,GAAiB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAA0B;QAC7E,+CAA+C;QAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;gBAAE,SAAS;YACpC,SAAS,CAAC,MAAM,CAAC;gBAChB,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;gBACtC,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;aACjB,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEhD,KAAK,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACtF,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,EAAE,KAAY;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;YACpB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,cAAc,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACnG,CAAC;IACF,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,IAAgB,EAAE,KAAY;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;YAAE,OAAO;QACzE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,WAAW,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACjG,CAAC;IACF,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAgB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;YACpB,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,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC;gBACJ,QAAQ,CAAC,MAAM,CAAC;oBACf,MAAM,EAAE,IAAI;oBACZ,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC;oBACpC,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,QAAQ,CAAC,KAAK;iBACrB,CAAC,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACR,8CAA8C;YAC/C,CAAC;QACF,CAAC;IACF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAA4B,EAAE,MAAkB,EAAE,MAAe;QACpF,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,MAAM,EAAE,CAAC,CAAC,MAAM,CAClF,MAAM,CAAC,MAAM,EACb,OAAO,CACP,CAAC;gBACH,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,MAAM,EAAE,CAAC,CAAC,MAAM,CAC5E,MAAM,CAAC,MAAM,EACb,OAAO,CACP,CAAC;gBACH,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,sEAAsE;4BACtE,qEAAqE;4BACrE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;4BACzC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gCACpB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;4BACnC,CAAC;iCAAM,CAAC;gCACP,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gCACf,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;4BACnC,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,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAEzC,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,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnD,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,8EAA8E;IAC9E,+EAA+E;IAC/E,gCAAgC;IAChC,KAAK,CAAC,cAAc;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,IAAI,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC;YAChB,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;SAC3F,CAAC,CAAC;IACJ,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,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5C,OAAO;QACR,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,uBAAuB,SAAS,cAAc,SAAS,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/F,iFAAiF;QACjF,qFAAqF;QACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,YAAY,GAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAEzE,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,YAAY,EAAE,SAAS,CAAC,CAAC;QAEtF,kFAAkF;QAClF,kFAAkF;QAClF,mFAAmF;QACnF,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;YAC/C,iFAAiF;YACjF,4EAA4E;YAC5E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACtE,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnD,CAAC;YACD,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,IAAI,CAAC;gBACzB,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,oFAAoF;YACpF,MAAM,CAAC,GAAG,GAAG,YAAY,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAClG,OAAO,CAAC,MAAM,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,YAAY,CAAC,EAAE,CAAC;oBACtG,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,4EAA4E;YAC5E,kFAAkF;YAClF,MAAM,IAAI,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC;gBACrE,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,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtE,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,gFAAgF;YAChF,kFAAkF;YAClF,8EAA8E;YAC9E,gDAAgD;YAChD,QAAQ,CAAC,KAAK,EAAE,CAAC;YAEjB,kFAAkF;YAClF,kEAAkE;YAClE,IAAI,QAAQ,KAAK,cAAc;gBAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAEhF,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,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,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,YAAY,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzF,CAAC;IACF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,YAA0B;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,iBAAiB,CAAC,6CAA6C,CAAC,CAAC;QAC3G,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACzC,IAAI,MAAM,KAAK,WAAW,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,iBAAiB,CAAC,2CAA2C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;QACrC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;QACnE,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,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,YAA0B,EAC1B,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,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;gBACrF,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;QAClE,IAAI,KAAK,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC9E,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAClF,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,aAAa,CAAC,cAAc,EAAE,mBAAmB,EAAE,OAAO,CAAC;gBACtE,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,+EAA+E;YAC/E,gEAAgE;YAChE,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAC1E,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;oBACT,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;oBACT,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,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAErD,8EAA8E;YAC9E,+EAA+E;YAC/E,6EAA6E;YAC7E,8DAA8D;YAC9D,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACvB,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,uEAAuE;gBACvE,mDAAmD;gBACnD,IAAI,MAAM,KAAK,sBAAsB,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,IAAI,iBAAiB,CAC1B,qDAAqD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAC1E,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE3E,wEAAwE;gBACxE,+CAA+C;gBAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC1E,MAAM,IAAI,iBAAiB,CAAC,sDAAsD,CAAC,CAAC;oBACrF,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,0EAA0E;oBAC1E,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC3C,CAAC;gBAED,2EAA2E;gBAC3E,gEAAgE;gBAChE,sEAAsE;gBACtE,WAAW;gBACX,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,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;gBACF,CAAC;qBAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACtB,uEAAuE;oBACvE,QAAQ,GAAG,IAAI,CAAC;oBAChB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,CAAC;gBAED,0EAA0E;gBAC1E,2EAA2E;gBAC3E,iDAAiD;gBACjD,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACxD,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,iFAAiF;QACjF,gBAAgB;QAChB,EAAE;QACF,qFAAqF;QACrF,6EAA6E;QAC7E,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAErE,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;gBACT,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;gBACT,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,IAAI,YAA0B,CAAC;QAC/B,IAAI,CAAC;YACJ,gFAAgF;YAChF,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1D,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,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,OAAO;QACR,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QACrC,uFAAuF;QACvF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,kFAAkF;QAClF,yCAAyC;QACzC,IAAI,QAAuC,CAAC;QAC5C,MAAM,IAAI,GAAG,GAAG,EAAE;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,2EAA2E;gBAC3E,IAAI,YAAY,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC;oBACzE,MAAM,IAAI,iBAAiB,CAC1B,SAAS,KAAK,CAAC,OAAO,mCAAmC,YAAY,CAAC,GAAG,EAAE,CAC3E,CAAC;gBACH,CAAC;gBACD,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChD,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,QAAQ,CAAC;QACjB,CAAC,CAAC;QAEF,IAAI,CAAC;YACJ,kFAAkF;YAClF,mFAAmF;YACnF,oFAAoF;YACpF,oFAAoF;YACpF,iEAAiE;YACjE,EAAE;YACF,mFAAmF;YACnF,sFAAsF;YACtF,qFAAqF;YACrF,wCAAwC;YACxC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjG,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBACzD,OAAO;YACR,CAAC;YAED,4EAA4E;YAC5E,uDAAuD;YACvD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAE9F,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACnG,SAAS,CAAC;gBACT,iFAAiF;gBACjF,mFAAmF;gBACnF,mFAAmF;gBACnF,SAAS;gBACT,MAAM,KAAK,GACV,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;oBACxB,CAAC,MAAM,CAAC,QAAQ;wBACf,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;wBACrD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,CAAC,KAAK,IAAI,KAAK,YAAY,KAAK;oBAAE,MAAM;gBAE5C,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtB,2EAA2E;oBAC3E,6DAA6D;oBAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;oBACzD,QAAQ,EAAE,KAAK,EAAE,CAAC;oBAClB,IAAI,CAAC;wBACJ,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oBACrB,CAAC;oBAAC,OAAO,GAAY,EAAE,CAAC;wBACvB,MAAM,IAAI,iBAAiB,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC5E,CAAC;oBACD,YAAY,CAAC,GAAG,KAAK,GAAG,CAAC;oBACzB,OAAO;gBACR,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;oBAAE,MAAM;gBAEvC,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9F,CAAC;YAED,wCAAwC;YACxC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,YAAY,iBAAiB,EAAE,CAAC;gBACpC,wEAAwE;gBACxE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACP,6EAA6E;gBAC7E,oDAAoD;gBACpD,IAAI,CAAC;oBACJ,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACR,0DAA0D;gBAC3D,CAAC;YACF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;gBAAS,CAAC;YACV,IAAI,EAAE,CAAC;QACR,CAAC;IACF,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,gBAAiB,SAAQ,SAAS,CAAC,QAAQ;IAChD,YAAY,KAAa;QACxB,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,qBAAqB,CAAC,IAAI,EAAE;YAC3B,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;SAC7F,CAAC,CAAC;IACJ,CAAC;IAED,qFAAqF;IAC5E,KAAK;QACb,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;CACD","sourcesContent":["import { race, Signal } from \"@moq/signals\";\nimport * as announce from \"../announced.ts\";\nimport * as broadcast from \"../broadcast.ts\";\nimport { BroadcastCache } from \"../consume.ts\";\nimport { closeError, controlTimeout, error, ProtocolViolation, reason, sessionCause } from \"../error.ts\";\nimport * as netGroup from \"../group.ts\";\nimport { Cost, type Route, randomHop, routesEqual, stampHops, UNKNOWN_HOP } from \"../hop.ts\";\nimport { hiddenBelow, hooks, scopeCaptures, scopeHead, scopeOverlaps } from \"../internal.ts\";\nimport * as Path from \"../path.ts\";\nimport type { Cursor, Reader, Stream } from \"../stream.ts\";\nimport { Tail } from \"../tail.ts\";\nimport { type Timescale, Timestamp } from \"../time.ts\";\nimport type * as track from \"../track.ts\";\nimport { TimeoutError, withTimeout } from \"../util/timeout.ts\";\nimport { overrideBroadcastWire, wireOf } from \"../wire.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport { DuplicateTrackAlias, RetiredTrackAlias, TrackAliases } from \"./aliases.ts\";\nimport * as Cluster from \"./cluster.ts\";\nimport { requestReason, toRequestCode } from \"./error.ts\";\nimport { Frame, type Group as GroupMessage } from \"./object.ts\";\nimport { fromWire, toWire } from \"./priority.ts\";\nimport { type Publish, PublishDone, PublishError, publishDoneClean } from \"./publish.ts\";\nimport {\n\ttype PublishNamespace,\n\tPublishNamespaceDone,\n\tPublishNamespaceError,\n\tPublishNamespaceOk,\n\tPublishNamespaceUpdate,\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// A live subscription, as the track alias its data streams name resolves to.\ntype Subscription = {\n\t// The write side incoming group streams are routed into.\n\ttrack: track.Producer;\n\t// The group streams received, so the subscription can wait for the ones PUBLISH_DONE\n\t// says are still owed.\n\ttail: Tail;\n\t// The track's exclusive end, once an END_OF_TRACK declares it.\n\tend?: number;\n};\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/** A local announce reader's filter: its scope, the prefix it asked for, and its hidden opt-in. */\ntype Filter = { scope: Path.Pattern; prefix: Path.Valid; hidden: boolean };\n\n/** Whether a reader with `filter` sees an announcement at `path`. */\nfunction sees(filter: Filter, path: Path.Valid): boolean {\n\treturn scopeOverlaps(filter.scope, path) && (filter.hidden || !hiddenBelow(filter.prefix, path));\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 transport, so a request cut off by the session's close ends with the session's\n\t// error. Optional for tests that drive a bare session.\n\t#quic?: WebTransport;\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<Subscription>();\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// A random Hop ID of this connection's own, written as the first hop of any path that\n\t// names no publisher, so a publisher that reconnects reads as a new one.\n\t#stamp = randomHop();\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, { count: number; route: Route }>();\n\n\t// Any consumers that want each new announcement, keyed by their local filter.\n\t#announcedConsumers = new Map<announce.Producer, Filter>();\n\n\t// Whether the peer understands the HIDDEN parameter (MoQ Hidden).\n\t#hidden: boolean;\n\n\t/**\n\t * Creates a new Subscriber instance.\n\t *\n\t * @internal\n\t */\n\tconstructor({\n\t\tsession,\n\t\tquic,\n\t\tcluster,\n\t\thidden = false,\n\t}: {\n\t\t/** The session abstraction for bidi streams and request IDs. */\n\t\tsession: Session;\n\t\t/** The transport the session runs on. */\n\t\tquic?: WebTransport;\n\t\t/** The Hop IDs the SETUP exchange settled (MoQ Cluster). */\n\t\tcluster?: Cluster.Hops;\n\t\t/** Whether the peer understands the HIDDEN parameter (MoQ Hidden). */\n\t\thidden?: boolean;\n\t}) {\n\t\tthis.#session = session;\n\t\tthis.#quic = quic;\n\t\tthis.#cluster = cluster;\n\t\tthis.#hidden = hidden;\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 * The route an advertisement carries; one without a path is free. A path that names no\n\t * publisher, or none at all, gets this connection's stamp in front of a 0.\n\t */\n\t#route(advert: Cluster.Advert | undefined): Route {\n\t\tif (advert === undefined) return { hops: [this.#stamp, UNKNOWN_HOP], cost: Cost.zero };\n\t\t// A full chain, or a stamp colliding with an entry (a 1-in-2^53 draw), keeps the\n\t\t// path as sent.\n\t\tconst hops = stampHops(advert.hops, this.#stamp) ?? [...advert.hops];\n\t\treturn { hops, cost: { warm: advert.cost, cold: advert.cost } };\n\t}\n\n\t/**\n\t * Gets an announced reader matching `scope`. Paths are relative to the session,\n\t * not the scope.\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\t * Hidden routes (a `.`-prefixed segment below the scope's head) are left out unless\n\t * `options.hidden` opts in. The opt-in rides the SUBSCRIBE_NAMESPACE when the peer\n\t * understands it (MoQ Hidden); the rule is also applied here, since an unsolicited\n\t * PUBLISH_NAMESPACE or a peer that never heard of it hides nothing.\n\t */\n\tannounced(scope: Path.Pattern = Path.Pattern.all(), options?: announce.Options): announce.Consumer {\n\t\t// The wire speaks announce interest by prefix.\n\t\tconst prefix = scopeHead(scope);\n\t\tconst filter = { scope, prefix, hidden: options?.hidden ?? false };\n\t\tconst announced = new announce.Producer();\n\t\tfor (const [active, info] of this.#announced) {\n\t\t\tif (!sees(filter, active)) continue;\n\t\t\tannounced.append({\n\t\t\t\tprefix: active,\n\t\t\t\tcaptures: scopeCaptures(scope, active),\n\t\t\t\tkind: \"announced\",\n\t\t\t\troute: info.route,\n\t\t\t});\n\t\t}\n\t\tthis.#announcedConsumers.set(announced, filter);\n\n\t\tvoid this.#runAnnounced(announced, prefix, filter.hidden && this.#hidden).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, route: Route) {\n\t\tconst existing = this.#announced.get(path);\n\t\tif (existing) {\n\t\t\texisting.count += 1;\n\t\t\treturn;\n\t\t}\n\t\tthis.#announced.set(path, { count: 1, route });\n\n\t\tconsole.debug(`announced: broadcast=${path} active=true`);\n\t\tfor (const [consumer, filter] of this.#announcedConsumers) {\n\t\t\tif (!sees(filter, path)) continue;\n\t\t\tconst scope = filter.scope;\n\t\t\tconsumer.append({ prefix: path, captures: scopeCaptures(scope, path), kind: \"announced\", route });\n\t\t}\n\t}\n\n\t/**\n\t * Replace the stored route for a path that is already announced. A no-op when the\n\t * hops and cost did not change; otherwise consumers hear `updated` so a forwarder\n\t * can reprice without retracting.\n\t *\n\t * A new first hop is a new publisher: holders keep their broadcast to drain, but the\n\t * next consume starts fresh rather than reusing the old publisher's cached track info.\n\t */\n\t#updateAnnounce(path: Path.Valid, route: Route) {\n\t\tconst existing = this.#announced.get(path);\n\t\tif (existing === undefined || routesEqual(existing.route, route)) return;\n\t\tif (existing.route.hops[0] !== route.hops[0]) this.#consumes.evict(path);\n\t\texisting.route = route;\n\t\tconsole.debug(`announced: broadcast=${path} rerouted`);\n\t\tfor (const [consumer, filter] of this.#announcedConsumers) {\n\t\t\tif (!sees(filter, path)) continue;\n\t\t\tconst scope = filter.scope;\n\t\t\tconsumer.append({ prefix: path, captures: scopeCaptures(scope, path), kind: \"updated\", route });\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 existing = this.#announced.get(path);\n\t\tif (existing === undefined) return;\n\t\tif (existing.count > 1) {\n\t\t\texisting.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, filter] of this.#announcedConsumers) {\n\t\t\tif (!sees(filter, path)) continue;\n\t\t\tconst scope = filter.scope;\n\t\t\ttry {\n\t\t\t\tconsumer.append({\n\t\t\t\t\tprefix: path,\n\t\t\t\t\tcaptures: scopeCaptures(scope, path),\n\t\t\t\t\tkind: \"retracted\",\n\t\t\t\t\troute: existing.route,\n\t\t\t\t});\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, hidden: boolean) {\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, hidden }).encode(\n\t\t\t\t\t\tstream.writer,\n\t\t\t\t\t\tversion,\n\t\t\t\t\t);\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, hidden }).encode(\n\t\t\t\t\t\tstream.writer,\n\t\t\t\t\t\tversion,\n\t\t\t\t\t);\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 replaces the advertisement in place: HOP_PATH / ROUTE_COST\n\t\t\t\t\t\t\t// can change without a NAMESPACE_DONE. Only the first is a new path.\n\t\t\t\t\t\t\tconst route = this.#route(entry.cluster);\n\t\t\t\t\t\t\tif (live.has(path)) {\n\t\t\t\t\t\t\t\tthis.#updateAnnounce(path, route);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlive.add(path);\n\t\t\t\t\t\t\t\tthis.#attachAnnounce(path, route);\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 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 wireOf(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\t// The adapter is gone. If the transport has already closed, that close is the\n\t// error. A still-open transport, such as a GOAWAY drain, has no peer code yet,\n\t// so this does not wait for it.\n\tasync #closedSession(): Promise<Error> {\n\t\tconst quic = this.#quic;\n\t\tif (!quic) return new Error(\"session closed\");\n\t\treturn Promise.race([\n\t\t\tcloseError(quic),\n\t\t\tnew Promise<Error>((resolve) => queueMicrotask(() => resolve(new Error(\"session closed\")))),\n\t\t]);\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(await this.#closedSession());\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// Keep the request pending until SUBSCRIBE_OK supplies immutable track metadata.\n\t\t// Group streams already wait on the alias, so early data stays behind this response.\n\t\tconst producer = hooks.pendingTrackProducer(request);\n\t\tconst subscription: Subscription = { track: producer, tail: new Tail() };\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, subscription, 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\t// An info-only lookup attaches no subscriber yet still waits on SUBSCRIBE_OK for\n\t\t\t// the track info, so only demand that arrived and then left is abandonment.\n\t\t\twhile (!producer.used.peek() && producer.closed.peek() === undefined) {\n\t\t\t\tawait Signal.race(producer.used, producer.closed);\n\t\t\t}\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 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\t// A control request that timed out is not late content, so it carries its own code.\n\t\t\tconst e = err instanceof TimeoutError ? controlTimeout(err) : await sessionCause(this.#quic, err);\n\t\t\trequest.reject(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, subscription)) {\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 (PublishDone, track close = local\n\t\t\t// unsubscribe); race them once so the demand loop doesn't re-subscribe each pass.\n\t\t\tconst done = race([\n\t\t\t\tthis.#runPublishDone(stream, subscription).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 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// Close before the cancellation is written, not after: awaiting the write first\n\t\t\t// reopens the window the demand re-check above just closed, and a subscriber that\n\t\t\t// returned during it would be closed by this line. The lite subscriber closes\n\t\t\t// straight out of its loop for the same reason.\n\t\t\tproducer.close();\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\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 = await sessionCause(this.#quic, 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, subscription)) this.#timescales.delete(trackAlias);\n\t\t}\n\t}\n\n\t/**\n\t * Read the PUBLISH_DONE that ends a subscription, then wait for the data streams it counts.\n\t *\n\t * An error status aborts the track with it. A clean one leaves streams in flight, since\n\t * QUIC does not order them, so wait until the Stream Count many have been read, or a\n\t * bounded grace for the ones that never arrive (the draft says to use a timeout). The count\n\t * is only a hint: a peer may send 0 regardless, so 0 waits out the grace. A request\n\t * stream that FINs without PUBLISH_DONE is a protocol violation.\n\t */\n\tasync #runPublishDone(stream: Stream, subscription: Subscription): Promise<void> {\n\t\tconst version = this.#session.version;\n\t\tif (await stream.reader.done()) throw new ProtocolViolation(\"subscribe stream ended without PUBLISH_DONE\");\n\t\tconst typeId = await stream.reader.u53();\n\t\tif (typeId !== PublishDone.id) {\n\t\t\tthrow new ProtocolViolation(`unexpected message on a subscription: 0x${typeId.toString(16)}`);\n\t\t}\n\t\tconst done = await PublishDone.decode(stream.reader, version);\n\t\tif (!publishDoneClean(done.statusCode, version)) {\n\t\t\tthrow new Error(`publish done: status=0x${done.statusCode.toString(16)} reason=${done.reasonPhrase}`);\n\t\t}\n\t\tconst count = done.streamCount;\n\n\t\tconst { tail, track } = subscription;\n\t\tconst complete = () => count > 0n && BigInt(tail.streams) >= count;\n\t\tawait tail.settle(complete, track.closed);\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\tsubscription: Subscription,\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 = requestReason(err.errorCode, err.reasonPhrase, \"subscribe\", version);\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\t\tif (state.cancelled) throw new Error(\"subscribe cancelled before acceptance\");\n\t\trequest.accept({ priority: fromWire(ok.properties.priority ?? 128) });\n\n\t\ttry {\n\t\t\tthis.#aliases.set(ok.trackAlias, subscription, { 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: toRequestCode(\"uninterested\", \"publish_namespace\", version),\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\t// No draft registers a code for a duplicate, and this refusal is a draft-14/15\n\t\t\t// implementation limit, which is what INTERNAL_ERROR describes.\n\t\t\tconst errorCode = toRequestCode(\"internal\", \"publish_namespace\", version);\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,\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,\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, this.#route(msg.cluster));\n\n\t\t\t// An advertisement is updated in place with REQUEST_UPDATE on the stream that\n\t\t\t// already carries it, so read until the stream ends rather than waiting on the\n\t\t\t// close. Nothing else would deliver a re-parented route. What the peer holds\n\t\t\t// is kept current, since an update carries only what changed.\n\t\t\tlet held = msg.cluster;\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\t// A repeated PUBLISH_NAMESPACE lands here too: a second request on the\n\t\t\t\t// stream is the base draft's duplicate request ID.\n\t\t\t\tif (typeId !== PublishNamespaceUpdate.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 PublishNamespaceUpdate.decode(stream.reader, version);\n\n\t\t\t\t// The parameters exist only on a session that negotiated the extension;\n\t\t\t\t// anywhere else they are the peer's violation.\n\t\t\t\tif (held === undefined) {\n\t\t\t\t\tif (update.update.hops !== undefined || update.update.cost !== undefined) {\n\t\t\t\t\t\tthrow new ProtocolViolation(\"cluster parameters on a session that negotiated none\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A different original publisher applies in place too, as it does inline.\n\t\t\t\t\theld = Cluster.apply(held, update.update);\n\t\t\t\t}\n\n\t\t\t\t// A path that now runs through us is unusable, so give it back. The update\n\t\t\t\t// itself is accepted, and reading continues: this stream is the\n\t\t\t\t// advertisement's only channel, so a later clean path arrives here or\n\t\t\t\t// nowhere.\n\t\t\t\tif (this.#reflected(held)) {\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} else if (!attached) {\n\t\t\t\t\t// Re-attach: a clean path replaced the reflected one we detached from.\n\t\t\t\t\tattached = true;\n\t\t\t\t\tthis.#attachAnnounce(path, this.#route(held));\n\t\t\t\t} else {\n\t\t\t\t\tthis.#updateAnnounce(path, this.#route(held));\n\t\t\t\t}\n\n\t\t\t\t// Nothing here can fail to apply, so every update is acknowledged. A leaf\n\t\t\t\t// routes nothing, so a repricing changes nothing it holds; consumers still\n\t\t\t\t// hear the new route so a forwarder can reprice.\n\t\t\t\tawait stream.writer.u53(RequestOk.id);\n\t\t\t\tawait new RequestOk({}).encode(stream.writer, version);\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// We decline the method itself rather than this particular track, which would be\n\t\t// UNINTERESTED.\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 errorCode = toRequestCode(\"not_supported\", \"publish\", 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,\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,\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\tlet subscription: Subscription;\n\t\ttry {\n\t\t\t// The control message establishing this alias can arrive after the data stream.\n\t\t\tsubscription = await this.#aliases.get(group.trackAlias);\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\tstream.stop(e);\n\t\t\treturn;\n\t\t}\n\n\t\tconst { track, tail } = subscription;\n\t\t// Every data stream counts toward PUBLISH_DONE's Stream Count, even one dropped below.\n\t\tconst read = tail.open(group.groupId);\n\n\t\t// Created on the first object rather than the header: an END_OF_TRACK at object 0\n\t\t// means the group does not exist at all.\n\t\tlet producer: netGroup.Producer | undefined;\n\t\tconst open = () => {\n\t\t\tif (!producer) {\n\t\t\t\t// The publisher contradicted its own end, which no later group can repair.\n\t\t\t\tif (subscription.end !== undefined && group.groupId >= subscription.end) {\n\t\t\t\t\tthrow new ProtocolViolation(\n\t\t\t\t\t\t`group ${group.groupId} is at or past the declared end ${subscription.end}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tproducer = new netGroup.Producer(group.groupId);\n\t\t\t\ttrack.writeGroup(producer);\n\t\t\t}\n\t\t\treturn producer;\n\t\t};\n\n\t\ttry {\n\t\t\t// FIRST_OBJECT clear says this stream starts partway through the group, which the\n\t\t\t// draft lets a publisher do to answer a filter. Nothing above here can use it: the\n\t\t\t// objects that would arrive are not decodable without the missing head, and a group\n\t\t\t// is the unit an application resyncs on. Drop it and pick up at the next group, the\n\t\t\t// same degradation as a publisher that no longer holds the head.\n\t\t\t//\n\t\t\t// This only saves reading a stream we would throw away. The bit is the publisher's\n\t\t\t// claim, so what is enforced is the object ids themselves: `Frame.decode` holds every\n\t\t\t// object to starting at 0 and incrementing by 1, whatever the header said and on the\n\t\t\t// drafts that have no such bit to read.\n\t\t\tif (!group.flags.firstObject) {\n\t\t\t\tconsole.debug(`dropping a group with no head: alias=${group.trackAlias} group=${group.groupId}`);\n\t\t\t\tstream.stop(new Error(\"a group must start at object 0\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// The alias binds after SUBSCRIBE_OK commits the track property; an omitted\n\t\t\t// header priority inherits it (draft-21 section 10.4).\n\t\t\tif (!group.flags.hasPriority) group.publisherPriority = toWire((await track.info()).priority);\n\n\t\t\tconst decode = (c: Cursor) => Frame.decode(c, group.flags, this.#timescales.get(group.trackAlias));\n\t\t\tfor (;;) {\n\t\t\t\t// Every object already buffered is written without an await, so the reader wakes\n\t\t\t\t// once per batch rather than once per object. Only the group's own stream ends it:\n\t\t\t\t// a track that closes first has already closed (or aborted) this group through its\n\t\t\t\t// cache.\n\t\t\t\tconst frame =\n\t\t\t\t\tstream.tryDecode(decode) ??\n\t\t\t\t\t(await (producer\n\t\t\t\t\t\t? race([stream.decodeMaybe(decode), producer.closed])\n\t\t\t\t\t\t: stream.decodeMaybe(decode)));\n\t\t\t\tif (!frame || frame instanceof Error) break;\n\n\t\t\t\tif (frame.endOfTrack) {\n\t\t\t\t\t// No object at or past this location exists: after the group's last object\n\t\t\t\t\t// the track ends with it, and at object 0 it ends before it.\n\t\t\t\t\tconst end = producer ? group.groupId + 1 : group.groupId;\n\t\t\t\t\tproducer?.close();\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttrack.finishAt(end);\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tthrow new ProtocolViolation(`invalid END_OF_TRACK: ${reason(error(err))}`);\n\t\t\t\t\t}\n\t\t\t\t\tsubscription.end ??= end;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (frame.payload === undefined) break;\n\n\t\t\t\topen().writeFrame({ payload: frame.payload, timestamp: frame.timestamp ?? Timestamp.now() });\n\t\t\t}\n\n\t\t\t// A group with no objects still exists.\n\t\t\topen().close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tif (e instanceof ProtocolViolation) {\n\t\t\t\t// The publisher broke the track's end, which no later group can repair.\n\t\t\t\tproducer?.close(e);\n\t\t\t\ttrack.close(e);\n\t\t\t} else {\n\t\t\t\t// A stream that fails before its first object still names a group, which the\n\t\t\t\t// reader sees fail rather than silently go missing.\n\t\t\t\ttry {\n\t\t\t\t\topen().close(e);\n\t\t\t\t} catch {\n\t\t\t\t\t// The track has already closed or ended below this group.\n\t\t\t\t}\n\t\t\t}\n\t\t\tstream.stop(e);\n\t\t} finally {\n\t\t\tread();\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\tconstructor(state?: never) {\n\t\tsuper(state);\n\t\toverrideBroadcastWire(this, {\n\t\t\tfetchGroup: () => Promise.reject(new Error(\"fetch group is not supported for moq-transport\")),\n\t\t});\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"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/ietf/token.ts"],"names":[],"mappings":""}
package/ietf/token.js ADDED
@@ -0,0 +1,99 @@
1
+ /* @ts-self-types="./token.d.ts" */
2
+ import { SessionCode, SessionError } from "../error.js";
3
+ import * as Varint from "../varint.js";
4
+ import { SetupOption } from "./parameters.js";
5
+ import { Version } from "./version.js";
6
+ /**
7
+ * The `AUTHORIZATION TOKEN` Setup Option (draft-ietf-moq-transport-21 section 9.1.4).
8
+ *
9
+ * The value is the Token structure of section 8.9: an Alias Type, then fields that type
10
+ * selects. We advertise no `MAX_AUTH_TOKEN_CACHE_SIZE`, so its default of 0 means no alias
11
+ * is ever registered and every token arrives by value.
12
+ *
13
+ * Mirrors `rs/moq-net/src/ietf/token.rs`.
14
+ *
15
+ * @module
16
+ * @internal
17
+ */
18
+ /** Retire a registered alias. */
19
+ const DELETE = 0x0n;
20
+ /** Register an alias for this type and value, then use them. */
21
+ const REGISTER = 0x1n;
22
+ /** Use the type and value a registered alias names. */
23
+ const USE_ALIAS = 0x2n;
24
+ /** Use the type and value carried inline. */
25
+ const USE_VALUE = 0x3n;
26
+ /**
27
+ * Token Type 0: a format the endpoints agreed on out of band, such as a JWT.
28
+ *
29
+ * @internal
30
+ */
31
+ export const TOKEN_OUT_OF_BAND = 0x0n;
32
+ /**
33
+ * Token Type 1: a Common Access Token (draft-ietf-moq-c4m).
34
+ *
35
+ * @internal
36
+ */
37
+ export const TOKEN_CAT = 0x1n;
38
+ /** Draft-17 replaced QUIC's two-bit-length varint with a leading-ones one. */
39
+ function leadingOnes(version) {
40
+ return version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16;
41
+ }
42
+ /**
43
+ * The token the peer's SETUP presented, if any.
44
+ *
45
+ * A second token is already refused as a duplicate option by {@link SetupOptions}: one
46
+ * credential per connection.
47
+ *
48
+ * @throws {SessionError} `ProtocolViolation` for an alias reference, which nothing before
49
+ * SETUP could have registered, or `KeyValueFormatting` for a structure that cannot be decoded.
50
+ * @internal
51
+ */
52
+ export function tokenFromSetup(params, version) {
53
+ const raw = params.getBytes(SetupOption.AuthorizationToken);
54
+ if (raw === undefined)
55
+ return undefined;
56
+ // Section 8.9: a structure that cannot be decoded closes with KEY_VALUE_FORMATTING_ERROR.
57
+ const malformed = (cause) => new SessionError(SessionCode.KeyValueFormatting, { cause, reason: "malformed AUTHORIZATION TOKEN" });
58
+ const unvarint = (buf) => {
59
+ try {
60
+ return leadingOnes(version) ? Varint.decodeLeadingOnes(buf) : Varint.decodeBigInt(buf);
61
+ }
62
+ catch (err) {
63
+ throw malformed(err);
64
+ }
65
+ };
66
+ let [aliasType, rest] = unvarint(raw);
67
+ switch (aliasType) {
68
+ case USE_VALUE:
69
+ break;
70
+ // With no cache, section 9.1.4 treats a registration as a value; the alias is unused.
71
+ case REGISTER:
72
+ [, rest] = unvarint(rest);
73
+ break;
74
+ // Section 9.1.4: nothing can have been registered before SETUP.
75
+ case DELETE:
76
+ case USE_ALIAS:
77
+ throw new SessionError(SessionCode.ProtocolViolation, { reason: "AUTHORIZATION TOKEN alias in SETUP" });
78
+ default:
79
+ throw malformed();
80
+ }
81
+ const [kind, value] = unvarint(rest);
82
+ return { kind, value: value.slice() };
83
+ }
84
+ /**
85
+ * Present `token` in our SETUP, by value.
86
+ *
87
+ * @internal
88
+ */
89
+ export function tokenIntoSetup(params, token, version) {
90
+ const varint = (v) => (leadingOnes(version) ? Varint.encodeLeadingOnes(v) : Varint.encode(v));
91
+ const aliasType = varint(USE_VALUE);
92
+ const kind = varint(token.kind);
93
+ const out = new Uint8Array(aliasType.length + kind.length + token.value.length);
94
+ out.set(aliasType, 0);
95
+ out.set(kind, aliasType.length);
96
+ out.set(token.value, aliasType.length + kind.length);
97
+ params.setBytes(SetupOption.AuthorizationToken, out);
98
+ }
99
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/ietf/token.ts"],"names":[],"mappings":"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","sourcesContent":["import { SessionCode, SessionError } from \"../error.ts\";\nimport * as Varint from \"../varint.ts\";\nimport { SetupOption, type SetupOptions } from \"./parameters.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/**\n * The `AUTHORIZATION TOKEN` Setup Option (draft-ietf-moq-transport-21 section 9.1.4).\n *\n * The value is the Token structure of section 8.9: an Alias Type, then fields that type\n * selects. We advertise no `MAX_AUTH_TOKEN_CACHE_SIZE`, so its default of 0 means no alias\n * is ever registered and every token arrives by value.\n *\n * Mirrors `rs/moq-net/src/ietf/token.rs`.\n *\n * @module\n * @internal\n */\n\n/** Retire a registered alias. */\nconst DELETE = 0x0n;\n/** Register an alias for this type and value, then use them. */\nconst REGISTER = 0x1n;\n/** Use the type and value a registered alias names. */\nconst USE_ALIAS = 0x2n;\n/** Use the type and value carried inline. */\nconst USE_VALUE = 0x3n;\n\n/**\n * A credential presented in a SETUP's `AUTHORIZATION TOKEN` option.\n *\n * @internal\n */\nexport interface Token {\n\t/** The wire Token Type, naming how `value` is encoded. */\n\tkind: bigint;\n\t/** The token itself. */\n\tvalue: Uint8Array;\n}\n\n/**\n * Token Type 0: a format the endpoints agreed on out of band, such as a JWT.\n *\n * @internal\n */\nexport const TOKEN_OUT_OF_BAND = 0x0n;\n\n/**\n * Token Type 1: a Common Access Token (draft-ietf-moq-c4m).\n *\n * @internal\n */\nexport const TOKEN_CAT = 0x1n;\n\n/** Draft-17 replaced QUIC's two-bit-length varint with a leading-ones one. */\nfunction leadingOnes(version: IetfVersion): boolean {\n\treturn version !== Version.DRAFT_14 && version !== Version.DRAFT_15 && version !== Version.DRAFT_16;\n}\n\n/**\n * The token the peer's SETUP presented, if any.\n *\n * A second token is already refused as a duplicate option by {@link SetupOptions}: one\n * credential per connection.\n *\n * @throws {SessionError} `ProtocolViolation` for an alias reference, which nothing before\n * SETUP could have registered, or `KeyValueFormatting` for a structure that cannot be decoded.\n * @internal\n */\nexport function tokenFromSetup(params: SetupOptions, version: IetfVersion): Token | undefined {\n\tconst raw = params.getBytes(SetupOption.AuthorizationToken);\n\tif (raw === undefined) return undefined;\n\n\t// Section 8.9: a structure that cannot be decoded closes with KEY_VALUE_FORMATTING_ERROR.\n\tconst malformed = (cause?: unknown) =>\n\t\tnew SessionError(SessionCode.KeyValueFormatting, { cause, reason: \"malformed AUTHORIZATION TOKEN\" });\n\tconst unvarint = (buf: Uint8Array): [bigint, Uint8Array] => {\n\t\ttry {\n\t\t\treturn leadingOnes(version) ? Varint.decodeLeadingOnes(buf) : Varint.decodeBigInt(buf);\n\t\t} catch (err) {\n\t\t\tthrow malformed(err);\n\t\t}\n\t};\n\n\tlet [aliasType, rest] = unvarint(raw);\n\tswitch (aliasType) {\n\t\tcase USE_VALUE:\n\t\t\tbreak;\n\t\t// With no cache, section 9.1.4 treats a registration as a value; the alias is unused.\n\t\tcase REGISTER:\n\t\t\t[, rest] = unvarint(rest);\n\t\t\tbreak;\n\t\t// Section 9.1.4: nothing can have been registered before SETUP.\n\t\tcase DELETE:\n\t\tcase USE_ALIAS:\n\t\t\tthrow new SessionError(SessionCode.ProtocolViolation, { reason: \"AUTHORIZATION TOKEN alias in SETUP\" });\n\t\tdefault:\n\t\t\tthrow malformed();\n\t}\n\n\tconst [kind, value] = unvarint(rest);\n\treturn { kind, value: value.slice() };\n}\n\n/**\n * Present `token` in our SETUP, by value.\n *\n * @internal\n */\nexport function tokenIntoSetup(params: SetupOptions, token: Token, version: IetfVersion) {\n\tconst varint = (v: bigint) => (leadingOnes(version) ? Varint.encodeLeadingOnes(v) : Varint.encode(v));\n\tconst aliasType = varint(USE_VALUE);\n\tconst kind = varint(token.kind);\n\n\tconst out = new Uint8Array(aliasType.length + kind.length + token.value.length);\n\tout.set(aliasType, 0);\n\tout.set(kind, aliasType.length);\n\tout.set(token.value, aliasType.length + kind.length);\n\tparams.setBytes(SetupOption.AuthorizationToken, out);\n}\n"]}
package/ietf/track.d.ts CHANGED
@@ -13,6 +13,10 @@ export declare class TrackStatusRequest {
13
13
  trackName: string;
14
14
  });
15
15
  encode(w: Writer, version: IetfVersion): Promise<void>;
16
+ /**
17
+ * Every draft defines TRACK_STATUS as identical to SUBSCRIBE, so it decodes as one and
18
+ * keeps only what names the track. We refuse the request, so the rest goes unread.
19
+ */
16
20
  static decode(r: Reader, version: IetfVersion): Promise<TrackStatusRequest>;
17
21
  }
18
22
  export declare class TrackStatus {
@@ -1 +1 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/ietf/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAKzD,qBAAa,kBAAkB;;IAC9B,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EACX,SAAS,EACT,cAAc,EACd,SAAS,GACT,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAItE;IAuBK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAEhF;CAuBD;AAID,qBAAa,WAAW;;IACvB,MAAM,CAAC,EAAE,SAAQ;IAEjB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,GACZ,EAAE;QACF,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACrB,EAMA;IAUK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAE1E;IAaD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAQ;IAC1C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,KAAQ;IACxC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,KAAQ;IAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY,KAAQ;CACpC"}
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/ietf/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAKzD,qBAAa,kBAAkB;;IAC9B,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EACX,SAAS,EACT,cAAc,EACd,SAAS,GACT,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAItE;IAuBK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED;;;OAGG;IACH,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAGhF;CACD;AAID,qBAAa,WAAW;;IACvB,MAAM,CAAC,EAAE,SAAQ;IAEjB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,GACZ,EAAE;QACF,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACrB,EAMA;IAUK,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;IAED,OAAa,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAE1E;IAaD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,KAAQ;IAC1C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,KAAQ;IACxC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,KAAQ;IAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY,KAAQ;CACpC"}
package/ietf/track.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import * as Message from "./message.js";
3
3
  import * as Namespace from "./namespace.js";
4
4
  import { Parameters } from "./parameters.js";
5
+ import { Subscribe } from "./subscribe.js";
5
6
  import { Version } from "./version.js";
6
7
  // we only support Group Order descending
7
8
  const GROUP_ORDER = 0x02;
@@ -38,27 +39,12 @@ export class TrackStatusRequest {
38
39
  async encode(w, version) {
39
40
  return Message.encode(w, (mw) => this.#encode(mw, version));
40
41
  }
42
+ /**
43
+ * Every draft defines TRACK_STATUS as identical to SUBSCRIBE, so it decodes as one and
44
+ * keeps only what names the track. We refuse the request, so the rest goes unread.
45
+ */
41
46
  static async decode(r, version) {
42
- return Message.decode(r, (mr) => TrackStatusRequest.#decode(mr, version));
43
- }
44
- static async #decode(r, version) {
45
- const requestId = await r.u62();
46
- if (version === Version.DRAFT_17) {
47
- await r.u62(); // required_request_id_delta
48
- }
49
- const trackNamespace = await Namespace.decode(r);
50
- const trackName = await r.string();
51
- if (version === Version.DRAFT_14) {
52
- await r.u8(); // subscriber_priority
53
- await r.u8(); // group_order
54
- await r.bool(); // forward
55
- await r.u53(); // filter_type
56
- await Parameters.decode(r, version); // parameters
57
- }
58
- else {
59
- // v15+: just parameters
60
- await Parameters.decode(r, version);
61
- }
47
+ const { requestId, trackNamespace, trackName } = await Subscribe.decode(r, version);
62
48
  return new TrackStatusRequest({ requestId, trackNamespace, trackName });
63
49
  }
64
50
  }
package/ietf/track.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/ietf/track.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,yCAAyC;AACzC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,MAAM,OAAO,kBAAkB;IAC9B,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,SAAS,CAAS;IAClB,cAAc,CAAa;IAC3B,SAAS,CAAS;IAElB,YAAY,EACX,SAAS,EACT,cAAc,EACd,SAAS,GAC6D;QACtE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QAC5C,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,sDAAsD;QACxE,CAAC;QACD,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE/B,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;YACrC,MAAM,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YACvC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;YAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B;YAChD,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;QACjC,CAAC;aAAM,CAAC;YACP,wBAAwB;YACxB,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QACnD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,4BAA4B;QAC5C,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QAEnC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,sBAAsB;YACpC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc;YAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU;YAC1B,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,cAAc;YAC7B,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa;QACnD,CAAC;aAAM,CAAC;YACP,wBAAwB;YACxB,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;CACD;AAED,4DAA4D;AAC5D,kEAAkE;AAClE,MAAM,OAAO,WAAW;IACvB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,cAAc,CAAa;IAC3B,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,WAAW,CAAS;IACpB,YAAY,CAAS;IAErB,YAAY,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,GAOZ;QACA,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS;QACtB,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,QAAqB;QAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,QAAqB;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS;QAC7B,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAEnC,OAAO,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,qBAAqB;IACrB,MAAM,CAAU,kBAAkB,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAU,gBAAgB,GAAG,IAAI,CAAC;IACxC,MAAM,CAAU,qBAAqB,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAU,YAAY,GAAG,IAAI,CAAC;CACpC","sourcesContent":["import type * as Path from \"../path.ts\";\nimport type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport * as Namespace from \"./namespace.ts\";\nimport { Parameters } from \"./parameters.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n// we only support Group Order descending\nconst GROUP_ORDER = 0x02;\n\nexport class TrackStatusRequest {\n\tstatic id = 0x0d;\n\n\trequestId: bigint;\n\ttrackNamespace: Path.Valid;\n\ttrackName: string;\n\n\tconstructor({\n\t\trequestId,\n\t\ttrackNamespace,\n\t\ttrackName,\n\t}: { requestId: bigint; trackNamespace: Path.Valid; trackName: string }) {\n\t\tthis.requestId = requestId;\n\t\tthis.trackNamespace = trackNamespace;\n\t\tthis.trackName = trackName;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tawait w.u62(this.requestId);\n\t\tif (version === Version.DRAFT_17) {\n\t\t\tawait w.u62(0n); // required_request_id_delta — always 0, not supported\n\t\t}\n\t\tawait Namespace.encode(w, this.trackNamespace);\n\t\tawait w.string(this.trackName);\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\tawait w.u8(0); // subscriber_priority\n\t\t\tawait w.u8(GROUP_ORDER); // group_order\n\t\t\tawait w.bool(false); // forward\n\t\t\tawait w.u53(0x2); // filter_type = LargestObject\n\t\t\tawait w.u53(0); // no parameters\n\t\t} else {\n\t\t\t// v15+: just parameters\n\t\t\tconst params = new Parameters();\n\t\t\tawait params.encode(w, version);\n\t\t}\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (mw) => this.#encode(mw, version));\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<TrackStatusRequest> {\n\t\treturn Message.decode(r, (mr) => TrackStatusRequest.#decode(mr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<TrackStatusRequest> {\n\t\tconst requestId = await r.u62();\n\t\tif (version === Version.DRAFT_17) {\n\t\t\tawait r.u62(); // required_request_id_delta\n\t\t}\n\t\tconst trackNamespace = await Namespace.decode(r);\n\t\tconst trackName = await r.string();\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\tawait r.u8(); // subscriber_priority\n\t\t\tawait r.u8(); // group_order\n\t\t\tawait r.bool(); // forward\n\t\t\tawait r.u53(); // filter_type\n\t\t\tawait Parameters.decode(r, version); // parameters\n\t\t} else {\n\t\t\t// v15+: just parameters\n\t\t\tawait Parameters.decode(r, version);\n\t\t}\n\n\t\treturn new TrackStatusRequest({ requestId, trackNamespace, trackName });\n\t}\n}\n\n// Track status response (0x0E) — v14 only (TRACK_STATUS_OK)\n// In v15+, the response to TrackStatusRequest is RequestOk (0x07)\nexport class TrackStatus {\n\tstatic id = 0x0e;\n\n\ttrackNamespace: Path.Valid;\n\ttrackName: string;\n\tstatusCode: number;\n\tlastGroupId: bigint;\n\tlastObjectId: bigint;\n\n\tconstructor({\n\t\ttrackNamespace,\n\t\ttrackName,\n\t\tstatusCode,\n\t\tlastGroupId,\n\t\tlastObjectId,\n\t}: {\n\t\ttrackNamespace: Path.Valid;\n\t\ttrackName: string;\n\t\tstatusCode: number;\n\t\tlastGroupId: bigint;\n\t\tlastObjectId: bigint;\n\t}) {\n\t\tthis.trackNamespace = trackNamespace;\n\t\tthis.trackName = trackName;\n\t\tthis.statusCode = statusCode;\n\t\tthis.lastGroupId = lastGroupId;\n\t\tthis.lastObjectId = lastObjectId;\n\t}\n\n\tasync #encode(w: Writer): Promise<void> {\n\t\tawait Namespace.encode(w, this.trackNamespace);\n\t\tawait w.string(this.trackName);\n\t\tawait w.u62(BigInt(this.statusCode));\n\t\tawait w.u62(this.lastGroupId);\n\t\tawait w.u62(this.lastObjectId);\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<TrackStatus> {\n\t\treturn Message.decode(r, TrackStatus.#decode);\n\t}\n\n\tstatic async #decode(r: Reader): Promise<TrackStatus> {\n\t\tconst trackNamespace = await Namespace.decode(r);\n\t\tconst trackName = await r.string();\n\t\tconst statusCode = Number(await r.u62());\n\t\tconst lastGroupId = await r.u62();\n\t\tconst lastObjectId = await r.u62();\n\n\t\treturn new TrackStatus({ trackNamespace, trackName, statusCode, lastGroupId, lastObjectId });\n\t}\n\n\t// Track status codes\n\tstatic readonly STATUS_IN_PROGRESS = 0x00;\n\tstatic readonly STATUS_NOT_FOUND = 0x01;\n\tstatic readonly STATUS_NOT_AUTHORIZED = 0x02;\n\tstatic readonly STATUS_ENDED = 0x03;\n}\n"]}
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/ietf/track.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Path from \"../path.ts\";\nimport type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport * as Namespace from \"./namespace.ts\";\nimport { Parameters } from \"./parameters.ts\";\nimport { Subscribe } from \"./subscribe.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n// we only support Group Order descending\nconst GROUP_ORDER = 0x02;\n\nexport class TrackStatusRequest {\n\tstatic id = 0x0d;\n\n\trequestId: bigint;\n\ttrackNamespace: Path.Valid;\n\ttrackName: string;\n\n\tconstructor({\n\t\trequestId,\n\t\ttrackNamespace,\n\t\ttrackName,\n\t}: { requestId: bigint; trackNamespace: Path.Valid; trackName: string }) {\n\t\tthis.requestId = requestId;\n\t\tthis.trackNamespace = trackNamespace;\n\t\tthis.trackName = trackName;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tawait w.u62(this.requestId);\n\t\tif (version === Version.DRAFT_17) {\n\t\t\tawait w.u62(0n); // required_request_id_delta — always 0, not supported\n\t\t}\n\t\tawait Namespace.encode(w, this.trackNamespace);\n\t\tawait w.string(this.trackName);\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\tawait w.u8(0); // subscriber_priority\n\t\t\tawait w.u8(GROUP_ORDER); // group_order\n\t\t\tawait w.bool(false); // forward\n\t\t\tawait w.u53(0x2); // filter_type = LargestObject\n\t\t\tawait w.u53(0); // no parameters\n\t\t} else {\n\t\t\t// v15+: just parameters\n\t\t\tconst params = new Parameters();\n\t\t\tawait params.encode(w, version);\n\t\t}\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (mw) => this.#encode(mw, version));\n\t}\n\n\t/**\n\t * Every draft defines TRACK_STATUS as identical to SUBSCRIBE, so it decodes as one and\n\t * keeps only what names the track. We refuse the request, so the rest goes unread.\n\t */\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<TrackStatusRequest> {\n\t\tconst { requestId, trackNamespace, trackName } = await Subscribe.decode(r, version);\n\t\treturn new TrackStatusRequest({ requestId, trackNamespace, trackName });\n\t}\n}\n\n// Track status response (0x0E) — v14 only (TRACK_STATUS_OK)\n// In v15+, the response to TrackStatusRequest is RequestOk (0x07)\nexport class TrackStatus {\n\tstatic id = 0x0e;\n\n\ttrackNamespace: Path.Valid;\n\ttrackName: string;\n\tstatusCode: number;\n\tlastGroupId: bigint;\n\tlastObjectId: bigint;\n\n\tconstructor({\n\t\ttrackNamespace,\n\t\ttrackName,\n\t\tstatusCode,\n\t\tlastGroupId,\n\t\tlastObjectId,\n\t}: {\n\t\ttrackNamespace: Path.Valid;\n\t\ttrackName: string;\n\t\tstatusCode: number;\n\t\tlastGroupId: bigint;\n\t\tlastObjectId: bigint;\n\t}) {\n\t\tthis.trackNamespace = trackNamespace;\n\t\tthis.trackName = trackName;\n\t\tthis.statusCode = statusCode;\n\t\tthis.lastGroupId = lastGroupId;\n\t\tthis.lastObjectId = lastObjectId;\n\t}\n\n\tasync #encode(w: Writer): Promise<void> {\n\t\tawait Namespace.encode(w, this.trackNamespace);\n\t\tawait w.string(this.trackName);\n\t\tawait w.u62(BigInt(this.statusCode));\n\t\tawait w.u62(this.lastGroupId);\n\t\tawait w.u62(this.lastObjectId);\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<TrackStatus> {\n\t\treturn Message.decode(r, TrackStatus.#decode);\n\t}\n\n\tstatic async #decode(r: Reader): Promise<TrackStatus> {\n\t\tconst trackNamespace = await Namespace.decode(r);\n\t\tconst trackName = await r.string();\n\t\tconst statusCode = Number(await r.u62());\n\t\tconst lastGroupId = await r.u62();\n\t\tconst lastObjectId = await r.u62();\n\n\t\treturn new TrackStatus({ trackNamespace, trackName, statusCode, lastGroupId, lastObjectId });\n\t}\n\n\t// Track status codes\n\tstatic readonly STATUS_IN_PROGRESS = 0x00;\n\tstatic readonly STATUS_NOT_FOUND = 0x01;\n\tstatic readonly STATUS_NOT_AUTHORIZED = 0x02;\n\tstatic readonly STATUS_ENDED = 0x03;\n}\n"]}
package/ietf/version.d.ts CHANGED
@@ -42,6 +42,15 @@ export declare const Version: {
42
42
  * https://www.ietf.org/archive/id/draft-ietf-moq-transport-20.txt
43
43
  */
44
44
  readonly DRAFT_20: 4278190100;
45
+ /**
46
+ * draft-ietf-moq-transport-21
47
+ * https://www.ietf.org/archive/id/draft-ietf-moq-transport-21.txt
48
+ */
49
+ readonly DRAFT_21: 4278190101;
50
+ /**
51
+ * draft-ietf-moq-transport-22 (unpublished, wire-identical to draft-21)
52
+ */
53
+ readonly DRAFT_22: 4278190102;
45
54
  };
46
55
  export type Version = (typeof Version)[keyof typeof Version];
47
56
  export declare const ALPN: {
@@ -52,11 +61,13 @@ export declare const ALPN: {
52
61
  readonly DRAFT_18: "moqt-18";
53
62
  readonly DRAFT_19: "moqt-19";
54
63
  readonly DRAFT_20: "moqt-20";
64
+ readonly DRAFT_21: "moqt-21";
65
+ readonly DRAFT_22: "moqt-22";
55
66
  };
56
67
  /**
57
68
  * IETF protocol versions used by the ietf/ module.
58
69
  * Use this narrower type for version-branched encode/decode to get exhaustive matching.
59
70
  */
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;
71
+ 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 | typeof Version.DRAFT_21 | typeof Version.DRAFT_22;
61
72
  export declare function versionName(v: Version): string;
62
73
  //# sourceMappingURL=version.d.ts.map