@norskvideo/moq-net 0.1.8 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/announce.d.ts +7 -0
- package/announce.d.ts.map +1 -0
- package/announce.js +8 -0
- package/announce.js.map +1 -0
- package/announced.d.ts +49 -91
- package/announced.d.ts.map +1 -1
- package/announced.js +21 -156
- package/announced.js.map +1 -1
- package/bandwidth.d.ts +163 -0
- package/bandwidth.d.ts.map +1 -0
- package/bandwidth.js +304 -0
- package/bandwidth.js.map +1 -0
- package/bandwidth_api.d.ts +7 -0
- package/bandwidth_api.d.ts.map +1 -0
- package/bandwidth_api.js +8 -0
- package/bandwidth_api.js.map +1 -0
- package/broadcast.d.ts +44 -35
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +104 -60
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +16 -1
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +52 -28
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts.map +1 -1
- package/connection/browser.js +9 -7
- package/connection/browser.js.map +1 -1
- package/connection/connect.d.ts +30 -6
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +110 -54
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +17 -21
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/forward.d.ts +2 -0
- package/connection/forward.d.ts.map +1 -0
- package/connection/forward.js +173 -0
- package/connection/forward.js.map +1 -0
- package/connection/handshake.d.ts +1 -0
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +5 -2
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +5 -5
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +4 -5
- package/connection/index.js.map +1 -1
- package/connection/pool.d.ts +186 -0
- package/connection/pool.d.ts.map +1 -0
- package/connection/pool.js +361 -0
- package/connection/pool.js.map +1 -0
- package/connection/reload.d.ts +14 -93
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +217 -81
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +3 -26
- package/connection/stats.d.ts.map +1 -1
- package/connection/stats.js.map +1 -1
- package/connection/transport.d.ts +0 -7
- package/connection/transport.d.ts.map +1 -1
- package/consume.d.ts +1 -43
- package/consume.d.ts.map +1 -1
- package/consume.js +1 -1
- package/consume.js.map +1 -1
- package/error.d.ts +180 -29
- package/error.d.ts.map +1 -1
- package/error.js +331 -16
- package/error.js.map +1 -1
- package/errors.d.ts +7 -0
- package/errors.d.ts.map +1 -0
- package/errors.js +8 -0
- package/errors.js.map +1 -0
- package/group.d.ts +9 -43
- package/group.d.ts.map +1 -1
- package/group.js +284 -69
- package/group.js.map +1 -1
- package/hop.d.ts +115 -0
- package/hop.d.ts.map +1 -0
- package/hop.js +119 -0
- package/hop.js.map +1 -0
- package/ietf/adapter.d.ts +5 -1
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +105 -60
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +1 -78
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/cluster.d.ts +9 -123
- package/ietf/cluster.d.ts.map +1 -1
- package/ietf/cluster.js +84 -44
- package/ietf/cluster.js.map +1 -1
- package/ietf/connection.d.ts +6 -72
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +62 -56
- package/ietf/connection.js.map +1 -1
- package/ietf/error.d.ts +11 -0
- package/ietf/error.d.ts.map +1 -0
- package/ietf/error.js +193 -0
- package/ietf/error.js.map +1 -0
- package/ietf/fetch.d.ts +7 -20
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +52 -22
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +2 -0
- package/ietf/filter.d.ts.map +1 -1
- package/ietf/filter.js +10 -1
- package/ietf/filter.js.map +1 -1
- package/ietf/goaway.d.ts.map +1 -1
- package/ietf/goaway.js +22 -5
- package/ietf/goaway.js.map +1 -1
- package/ietf/hidden.d.ts +2 -0
- package/ietf/hidden.d.ts.map +1 -0
- package/ietf/hidden.js +30 -0
- package/ietf/hidden.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +2 -0
- package/ietf/index.js.map +1 -1
- package/ietf/object.d.ts +15 -8
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +51 -36
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +14 -2
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +97 -29
- package/ietf/parameters.js.map +1 -1
- package/ietf/properties.d.ts +1 -0
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +14 -0
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts +19 -2
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +40 -6
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +25 -0
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +63 -0
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +1 -82
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +483 -235
- package/ietf/publisher.js.map +1 -1
- package/ietf/solicit.d.ts +1 -40
- package/ietf/solicit.d.ts.map +1 -1
- package/ietf/subscribe.d.ts +8 -6
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +33 -27
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +8 -2
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +18 -8
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +1 -65
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +337 -123
- package/ietf/subscriber.js.map +1 -1
- package/ietf/token.d.ts +2 -0
- package/ietf/token.d.ts.map +1 -0
- package/ietf/token.js +99 -0
- package/ietf/token.js.map +1 -0
- package/ietf/track.d.ts +4 -0
- package/ietf/track.d.ts.map +1 -1
- package/ietf/track.js +6 -20
- package/ietf/track.js.map +1 -1
- package/ietf/version.d.ts +12 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +13 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +12 -7
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +115 -1
- package/internal.d.ts.map +1 -1
- package/internal.js +108 -0
- package/internal.js.map +1 -1
- package/lite/announce.d.ts +60 -10
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +176 -31
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +9 -59
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +34 -35
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +3 -2
- package/lite/datagram.d.ts.map +1 -1
- package/lite/datagram.js +7 -8
- package/lite/datagram.js.map +1 -1
- package/lite/fetch.d.ts +15 -1
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +39 -7
- package/lite/fetch.js.map +1 -1
- package/lite/goaway.d.ts.map +1 -1
- package/lite/goaway.js +7 -1
- package/lite/goaway.js.map +1 -1
- package/lite/group.d.ts +30 -12
- package/lite/group.d.ts.map +1 -1
- package/lite/group.js +68 -26
- package/lite/group.js.map +1 -1
- package/lite/message.d.ts +2 -2
- package/lite/message.d.ts.map +1 -1
- package/lite/message.js +14 -5
- package/lite/message.js.map +1 -1
- package/lite/priority.d.ts +1 -61
- package/lite/priority.d.ts.map +1 -1
- package/lite/priority.js +4 -5
- package/lite/priority.js.map +1 -1
- package/lite/publisher.d.ts +1 -69
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +630 -262
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +8 -8
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +33 -30
- package/lite/setup.js.map +1 -1
- package/lite/subscribe.d.ts +71 -17
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +205 -53
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +15 -56
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +451 -247
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +4 -10
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +34 -29
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +42 -6
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +126 -10
- package/lite/version.js.map +1 -1
- package/origin.d.ts +256 -29
- package/origin.d.ts.map +1 -1
- package/origin.js +1427 -37
- package/origin.js.map +1 -1
- package/package.json +8 -3
- package/path.d.ts +25 -7
- package/path.d.ts.map +1 -1
- package/path.js +5 -3
- package/path.js.map +1 -1
- package/stream.d.ts +73 -14
- package/stream.d.ts.map +1 -1
- package/stream.js +372 -141
- package/stream.js.map +1 -1
- package/tail.d.ts +18 -0
- package/tail.d.ts.map +1 -0
- package/tail.js +167 -0
- package/tail.js.map +1 -0
- package/time.d.ts +15 -2
- package/time.d.ts.map +1 -1
- package/time.js +28 -9
- package/time.js.map +1 -1
- package/track.d.ts +211 -83
- package/track.d.ts.map +1 -1
- package/track.js +816 -205
- package/track.js.map +1 -1
- package/util/abort.d.ts +2 -0
- package/util/abort.d.ts.map +1 -0
- package/util/abort.js +20 -0
- package/util/abort.js.map +1 -0
- package/util/log.d.ts +5 -0
- package/util/log.d.ts.map +1 -0
- package/util/log.js +17 -0
- package/util/log.js.map +1 -0
- package/util/u64.d.ts +39 -0
- package/util/u64.d.ts.map +1 -0
- package/util/u64.js +83 -0
- package/util/u64.js.map +1 -0
- package/util/varint.d.ts +29 -0
- package/util/varint.d.ts.map +1 -0
- package/util/varint.js +198 -0
- package/util/varint.js.map +1 -0
- package/varint.d.ts +10 -6
- package/varint.d.ts.map +1 -1
- package/varint.js +40 -237
- package/varint.js.map +1 -1
- package/wire.d.ts +80 -0
- package/wire.d.ts.map +1 -0
- package/wire.js +32 -0
- package/wire.js.map +1 -0
- package/zod.d.ts +1 -1
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/mock.d.ts +0 -66
- package/mock.d.ts.map +0 -1
- package/mock.js +0 -243
- package/mock.js.map +0 -1
package/ietf/publisher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/ietf/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAe,MAAM,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAkB,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAEN,uBAAuB,EACvB,2BAA2B,EAC3B,oBAAoB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC;AAClE,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,0FAA0F;AAC1F,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,+FAA+F;AAC/F,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,2FAA2F;AAC3F,MAAM,mBAAmB,GAAG;IAC3B,cAAc,EAAE,GAAG;IACnB,WAAW,EAAE,GAAG;CACP,CAAC;AAEX;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC,yFAAyF;AACzF,SAAS,UAAU,CAAC,KAAa;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAwED;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACrB,KAAK,CAAe;IACpB,QAAQ,CAAU;IAClB,qBAAqB,CAAU;IAE/B,gFAAgF;IAChF,oFAAoF;IACpF,6DAA6D;IAC7D,OAAO,CAAkB;IAEzB,4BAA4B;IAC5B,uEAAuE;IACvE,WAAW,GAAG,IAAI,MAAM,CAAkD,IAAI,GAAG,EAAE,CAAC,CAAC;IAErF;;;;OAIG;IACH,YAAY,EACX,IAAI,EACJ,OAAO,EACP,oBAAoB,EACpB,OAAO,GAUP;QACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAgB,EAAE,SAA6B;QACtD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;YACtC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC3C,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,0FAA0F;QAC1F,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;gBACtC,IAAI,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACzC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,GAAc,EAAE,MAAc;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAErD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,uBAAuB;YACvB,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBAC3C,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC;oBAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,SAAS,EAAE,GAAG;oBACd,YAAY,EAAE,qBAAqB;iBACnC,CAAC,CAAC;gBACH,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC;oBAC5B,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACnG,SAAS,EAAE,GAAG;oBACd,YAAY,EAAE,qBAAqB;iBACnC,CAAC,CAAC;gBACH,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/D,mFAAmF;QACnF,yEAAyE;QACzE,IAAI,KAAkC,CAAC;QAEvC,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC;YAEjD,kFAAkF;YAClF,gFAAgF;YAChF,kFAAkF;YAClF,oCAAoC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAEjD,+EAA+E;YAC/E,iFAAiF;YACjF,4EAA4E;YAC5E,0CAA0C;YAC1C,KAAK,CAAC,MAAM,CAAC;gBACZ,QAAQ;gBACR,UAAU,EAAE,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;gBACpD,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;aAC9C,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5E,IAAI,UAAU,KAAK,SAAS;gBAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAExD,4EAA4E;YAC5E,kFAAkF;YAClF,gFAAgF;YAChF,yEAAyE;YACzE,MAAM,IAAI,GACT,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnG,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE7E,oBAAoB;YACpB,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC;gBAC1B,SAAS,EACR,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAC3F,CAAC,CAAC,GAAG,CAAC,SAAS;oBACf,CAAC,CAAC,SAAS;gBACb,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,8EAA8E;gBAC9E,yBAAyB;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACvF,UAAU,EAAE,GAAG,CAAC,gBAAgB;oBAC/B,CAAC,CAAC,wEAAwE;wBACzE,sEAAsE;wBACtE,4BAA4B;wBAC5B,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE;oBACjD,CAAC,CAAC,4EAA4E;wBAC7E,wDAAwD;wBACxD,EAAE;aACJ,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAEnE,qFAAqF;YACrF,oFAAoF;YACpF,8CAA8C;YAC9C,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,WAAwB,CAAC;YAC7B,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClD,WAAW,GAAG,OAAO,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAC7B,GAAG,EAAE;gBACJ,IAAI,CAAC,QAAQ;oBAAE,WAAW,EAAE,CAAC;YAC9B,CAAC;YACD,8BAA8B;YAC9B,GAAG,EAAE,CAAC,WAAW,EAAE,CACnB,CAAC;YAEF,+DAA+D;YAC/D,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC3B,SAAS,CAAC;oBACT,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;oBACtC,IAAI,CAAC,KAAK;wBAAE,OAAO;oBAEnB,yEAAyE;oBACzE,wEAAwE;oBACxE,yEAAyE;oBACzE,wEAAwE;oBACxE,+DAA+D;oBAC/D,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;wBACzE,KAAK,CAAC,KAAK,EAAE,CAAC;wBACd,SAAS;oBACV,CAAC;oBAED,KAAK,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,KAAK;wBACL,SAAS;wBACT,OAAO,EAAE,GAAG,CAAC,gBAAgB;wBAC7B,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;wBACxC,YAAY;qBACZ,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC,CAAC,EAAE,CAAC;YAEL,gFAAgF;YAChF,+DAA+D;YAC/D,MAAM,OAAO,GACZ,IAAI,IAAI,KAAK;gBACZ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACd,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,QAAQ;oBACR,IAAI;oBACJ,KAAK;oBACL,SAAS;oBACT,OAAO,EAAE,GAAG,CAAC,gBAAgB;oBAC7B,YAAY;iBACZ,CAAC;gBACH,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAEtB,IAAI,YAA+B,CAAC;YACpC,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,IAAI,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACpG,CAAC;YAED,gFAAgF;YAChF,6EAA6E;YAC7E,IAAI,CAAC;gBACJ,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC;oBAC5B,SAAS,EACR,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;wBAC3F,CAAC,CAAC,GAAG,CAAC,SAAS;wBACf,CAAC,CAAC,SAAS;oBACb,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW;oBAC/F,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa;iBAC7D,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACR,0CAA0C;YAC3C,CAAC;YAED,kFAAkF;YAClF,iFAAiF;YACjF,gEAAgE;YAChE,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,mFAAmF;YACnF,sDAAsD;YACtD,KAAK,EAAE,KAAK,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAiB;QAChC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAC9E,IAAI,CAAC;YACJ,mFAAmF;YACnF,oFAAoF;YACpF,kFAAkF;YAClF,gFAAgF;YAChF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC/C,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAC9B,kBAAkB,EAAE,KAAK;aACzB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACzC,OAAO;YACR,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;gBAC/B,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,KAAK,CAAC,QAAQ;gBACvB,UAAU,EAAE,CAAC;gBACb,iBAAiB,EAAE,CAAC;gBACpB,KAAK,EAAE;oBACN,0EAA0E;oBAC1E,mDAAmD;oBACnD,aAAa,EAAE,OAAO;oBACtB,WAAW,EAAE,KAAK;oBAClB,iBAAiB,EAAE,KAAK;oBACxB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,IAAI;oBACjB,yEAAyE;oBACzE,yCAAyC;oBACzC,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC;iBAC7B;aACD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,CAAC;gBACJ,6EAA6E;gBAC7E,yEAAyE;gBACzE,IAAI,KAAK,GAAG,IAAI,CAAC;gBACjB,8EAA8E;gBAC9E,+EAA+E;gBAC/E,2EAA2E;gBAC3E,iEAAiE;gBACjE,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBAEtB,SAAS,CAAC;oBACT,yEAAyE;oBACzE,4EAA4E;oBAC5E,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK;wBAAE,MAAM;oBAE5D,gFAAgF;oBAChF,iFAAiF;oBACjF,iFAAiF;oBACjF,2EAA2E;oBAC3E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBACjG,IAAI,CAAC,KAAK;wBAAE,MAAM;oBAClB,IAAI,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;oBAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK;wBAAE,MAAM;oBAEtE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,KAAK,GAAG,KAAK,CAAC;oBACd,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACjF,CAAC;gBAED,MAAM,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAgB;QAC9B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEtC,gFAAgF;QAChF,0DAA0D;QAC1D,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACJ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO;YAElC,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;gBAC/D,OAAO;YACR,CAAC;YAED,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,IAAI,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAE7D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YACnF,CAAC;oBAAS,CAAC;gBACV,KAAK,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YAED,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,2EAA2E;YAC3E,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,2CAA2C,SAAS,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzF,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CACpB,MAAc,EACd,KAAqB,EACrB,IAAe,EACf,SAAoB,EACpB,OAAgB,EAChB,YAA2B;QAE3B,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,sFAAsF;QACtF,sFAAsF;QACtF,mFAAmF;QACnF,qFAAqF;QACrF,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE;YACxC,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC;YACT,kFAAkF;YAClF,6DAA6D;YAC7D,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM;YAE1D,qFAAqF;YACrF,kCAAkC;YAClC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChC,KAAK,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,MAAM;gBACb,SAAS;aACT,CAAC,CAAC;YACH,IAAI,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACnE,IAAI,CAAC,KAAK;gBAAE,MAAM;YAClB,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM;YAE5E,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACzG,MAAM,GAAG,CAAC,MAAM,CACf,MAAM,EACN,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,EAC/D,SAAS,EACT,IAAI,CAAC,QAAQ,CAAC,OAAO,CACrB,CAAC;YACF,KAAK,GAAG,KAAK,CAAC;QACf,CAAC;IACF,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,qBAAqB,CAAC,GAAuB,EAAE,MAAc;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC;QAE5E,yEAAyE;QACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuE,CAAC;QAEhG,IAAI,CAAC;YACJ,mBAAmB;YACnB,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBACjD,MAAM,EAAE,GAAG,IAAI,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBAClE,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,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACjC,2EAA2E;gBAC3E,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC3B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YAED,2EAA2E;YAC3E,0DAA0D;YAC1D,MAAM,SAAS,GAAG,KAAK,EAAE,MAAkB,EAAoB,EAAE;gBAChE,IAAI,MAAM,EAAE,CAAC;oBACZ,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5E,CAAC;gBAED,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACpD,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACpG,OAAO,IAAI,CAAC;YACb,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAkB,EAAE,EAAE;gBAC7C,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;oBACxD,MAAM,IAAI,2BAA2B,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAClF,CAAC;YACF,CAAC,CAAC;YAEF,IAAI,MAAM,GAAG,IAAI,GAAG,EAAc,CAAC;YACnC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,oEAAoE;YACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;YAE/C,SAAS,CAAC;gBACT,uDAAuD;gBACvD,yEAAyE;gBACzE,kEAAkE;gBAClE,4CAA4C;gBAC5C,IAAI,OAAiB,CAAC;gBACtB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAkD,CAAC,OAAO,EAAE,EAAE;oBACxF,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjB,OAAO,EAAE,CAAC;oBACV,MAAM;gBACP,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;gBACtC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAC9C,IAAI,MAAM,KAAK,IAAI;wBAAE,SAAS;oBAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;gBAED,2EAA2E;gBAC3E,wBAAwB;gBACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAa,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1F,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;wBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3C,CAAC;gBAED,sEAAsE;gBACtE,4EAA4E;gBAC5E,yCAAyC;gBACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAa,MAAM,CAAC,CAAC;gBACzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;wBACxD,IAAI,MAAM,SAAS,CAAC,KAAK,CAAC;4BAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC7C,CAAC;gBACF,CAAC;gBACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;gBAED,MAAM,GAAG,IAAI,CAAC;gBAEd,8EAA8E;gBAC9E,0EAA0E;gBAC1E,4DAA4D;gBAC5D,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACnE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CACjD,CAAC;gBACF,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9E,4DAA4D;gBAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;oBACxB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;oBACzF,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClD,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI;oBAAE,MAAM;YAClB,CAAC;YAED,MAAM,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,qCAAqC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;gBAAS,CAAC;YACV,kDAAkD;YAClD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,oBAAoB;QACzB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChC,0EAA0E;YAC1E,OAAO;QACR,CAAC;QAED,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuE,CAAC;QAEhG,IAAI,CAAC;YACJ,IAAI,MAAM,GAAG,IAAI,GAAG,EAAc,CAAC;YACnC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,oEAAoE;YACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;YAE/C,SAAS,CAAC;gBACT,4EAA4E;gBAC5E,yEAAyE;gBACzE,4EAA4E;gBAC5E,4EAA4E;gBAC5E,WAAW;gBACX,4CAA4C;gBAC5C,IAAI,OAAiB,CAAC;gBACtB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAkD,CAAC,OAAO,EAAE,EAAE;oBACxF,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjB,OAAO,EAAE,CAAC;oBACV,MAAM;gBACP,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAa,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBAEvD,2EAA2E;gBAC3E,wEAAwE;gBACxE,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;wBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC;gBAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;wBACrC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACjD,CAAC;gBACF,CAAC;gBACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACzC,CAAC;gBAED,2EAA2E;gBAC3E,2DAA2D;gBAC3D,MAAM,GAAG,IAAI,GAAG,CAAa,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAE9C,uEAAuE;gBACvE,uEAAuE;gBACvE,sEAAsE;gBACtE,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjG,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9E,yEAAyE;gBACzE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;oBACxB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;oBACnE,CAAC,CAAC,OAAO,CAAC,CAAC;gBACZ,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI;oBAAE,MAAM;YAClB,CAAC;QACF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,2EAA2E;YAC3E,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACV,kDAAkD;YAClD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,IAAgB,EAAE,OAAiC;QAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;IACjD,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAgB,EAAE,OAAiC;QAC3D,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CACf,IAAgB,EAChB,QAAkF,EAClF,OAAiC;QAEjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtD,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAE1C,gFAAgF;QAChF,iFAAiF;QACjF,+EAA+E;QAC/E,qCAAqC;QACrC,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACJ,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,OAAO,CAAC;YAEvB,+EAA+E;YAC/E,8EAA8E;YAC9E,4EAA4E;YAC5E,mEAAmE;YACnE,MAAM,WAAW,CAChB,CAAC,KAAK,IAAI,EAAE;gBACX,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7C,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7F,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAEvD,8DAA8D;gBAC9D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC7C,IAAI,UAAU,KAAK,YAAY,CAAC,EAAE,EAAE,CAAC;oBACpC,qEAAqE;oBACrE,qEAAqE;oBACrE,+DAA+D;oBAC/D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC5E,MAAM,MAAM,GACX,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC;oBAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;wBACb,OAAO,CAAC,GAAG,CACV,IAAI,EACJ,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAC3E,CAAC;oBACH,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;gBACpF,CAAC;gBACD,IAAI,UAAU,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;gBACD,oEAAoE;gBACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAChD,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvE,CAAC;qBAAM,CAAC;oBACP,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC9D,CAAC;YACF,CAAC,CAAC,EAAE,EACJ,oBAAoB,EACpB,iCAAiC,oBAAoB,kCAAkC,CACvF,CAAC;YAEF,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,8BAA8B,IAAI,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACd,IAAgB,EAChB,QAAkF;QAElF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEtB,yEAAyE;QACzE,kFAAkF;QAClF,gFAAgF;QAChF,aAAa;QACb,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,EAAE,CAAC;YAClG,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBACzD,MAAM,IAAI,GAAG,IAAI,oBAAoB,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;gBACtG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACR,iCAAiC;YAClC,CAAC;QACF,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB,CAAC,GAAuB,EAAE,MAAc;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAEtC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClC,yDAAyD;YACzD,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;gBAC9B,cAAc,EAAE,GAAG,CAAC,cAAc;gBAClC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,UAAU,EAAE,WAAW,CAAC,gBAAgB;gBACxC,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,EAAE;aAChB,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,sCAAsC;YACtC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC;gBACxB,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;aACnG,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK;QACJ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;YACtC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;gBACpD,SAAS,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAoFD;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,KAAsB,EAAE,QAAgB;IAC1D,SAAS,CAAC;QACT,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE9C,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,QAAQ,GAAG,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;AACF,CAAC;AAED,gFAAgF;AAChF,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3B,CAAC;AAED,yCAAyC;AACzC,SAAS,QAAQ,CAAC,KAAsB;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;IAE7F,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC;AACrG,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,GAAc,EAAE,IAAc,EAAE,OAAoB;IAC3E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,mDAAmD,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAAC,MAAqB,EAAE,IAAc;IACzD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,qFAAqF;QACrF,sFAAsF;QACtF,0DAA0D;QAC1D,KAAK,YAAY;YAChB,OAAO,EAAE,CAAC;QACX,oFAAoF;QACpF,sFAAsF;QACtF,kFAAkF;QAClF,iDAAiD;QACjD,KAAK,YAAY;YAChB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,mFAAmF;QACnF,uFAAuF;QACvF,qFAAqF;QACrF,KAAK,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;YAChD,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;YAClC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAClF,CAAC;QACD,KAAK,UAAU;YACd,OAAO;gBACN,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;gBAC/D,GAAG,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;aACrG,CAAC;IACJ,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,KAAiB,EAAE,QAAgB;IACtD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KAC3G,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAiB,EAAE,YAA2B,EAAE,OAAkB;IACpF,oFAAoF;IACpF,kFAAkF;IAClF,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAE3C,uFAAuF;IACvF,yBAAyB;IACzB,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEvC,IAAI,KAAe,CAAC;IACpB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,oEAAoE;QACpE,KAAK,YAAY;YAChB,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAClC,MAAM;QACP,wDAAwD;QACxD,KAAK,YAAY;YAChB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1B,KAAK,UAAU;YACd,KAAK,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAChF,MAAM;QACP,KAAK,UAAU;YACd,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YACjE,MAAM;IACR,CAAC;IAED,2CAA2C;IAC3C,IAAI,GAAG,GAAgB,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACxE,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjE,MAAM,KAAK,GACV,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK;YAC/B,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5G,IAAI,KAAK;YAAE,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACvE,CAAC;IAED,IACC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;QACvB,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EACnF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAE9D,OAAO;QACN,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,KAAK,CAAC,KAAK;QACrB,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE;KAC7D,CAAC;AACH,CAAC","sourcesContent":["import { type Dispose, Signal } from \"@moq/signals\";\nimport type * as broadcast from \"../broadcast.ts\";\nimport { error, reason } from \"../error.ts\";\nimport type * as group from \"../group.ts\";\nimport * as Path from \"../path.ts\";\nimport { type Stream, Writer } from \"../stream.ts\";\nimport type { Timescale } from \"../time.ts\";\nimport type { Subscriber as TrackSubscriber } from \"../track.ts\";\nimport { withTimeout } from \"../util/timeout.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport * as Cluster from \"./cluster.ts\";\nimport { FetchHeader } from \"./fetch.ts\";\nimport * as Filter from \"./filter.ts\";\nimport { FetchFrame, Frame, Group as GroupMessage } from \"./object.ts\";\nimport { fromWire } from \"./priority.ts\";\nimport * as Properties from \"./properties.ts\";\nimport { PublishDone } from \"./publish.ts\";\nimport { PublishNamespace, PublishNamespaceDone, PublishNamespaceOk } from \"./publish_namespace.ts\";\nimport { RequestError, RequestOk } from \"./request.ts\";\nimport { type Subscribe, SubscribeError, SubscribeOk } from \"./subscribe.ts\";\nimport {\n\ttype SubscribeNamespace,\n\tSubscribeNamespaceEntry,\n\tSubscribeNamespaceEntryDone,\n\tSubscribeNamespaceOk,\n} from \"./subscribe_namespace.ts\";\nimport { TrackStatus, type TrackStatusRequest } from \"./track.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/** First wait before re-offering a namespace the peer refused or we couldn't open for. */\nconst RETRY_BASE = 100;\n\n/** Ceiling on that wait. The loop retries for the life of the session, so it must not spin. */\nconst RETRY_MAX = 5000;\n\n/** PUBLISH_DONE statuses this implementation emits. Stable across drafts 14 through 19. */\nconst PUBLISH_DONE_STATUS = {\n\tINTERNAL_ERROR: 0x0,\n\tTRACK_ENDED: 0x2,\n} as const;\n\n/**\n * How long one advertisement may take to be answered. Matches the Rust publisher, and the\n * peer accepting the stream is only half the exchange: one it never answers on holds the\n * loop just as effectively as one it never grants.\n */\nconst ADVERTISE_TIMEOUT_MS = 5000;\n\n/** Sleep `delay`, jittered, so a relay's namespaces don't all retry on the same tick. */\nfunction retryAfter(delay: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, delay * (0.5 + Math.random() / 2)));\n}\n\n/**\n * What a refusal said about re-offering the namespace.\n *\n * A peer answers a request it declines with a retry interval, and ignoring it is how a\n * permanent refusal (unauthorized, uninterested) turns into a request every few seconds\n * for the life of the session. `\"never\"` is an interval of 0; a number is the epoch\n * milliseconds before which we must not come back.\n */\ntype Refused = \"never\" | number;\n\n/** What {@link Publisher.runGroup} needs to serve one group. */\ninterface RunGroup {\n\t/** The subscription's request ID, doubling as the track alias. */\n\trequestId: bigint;\n\n\t/** The group to serve. */\n\tgroup: group.Consumer;\n\n\t/** The track's advertised timescale, applied to every frame timestamp. */\n\ttimescale: Timescale;\n\n\t/**\n\t * Whether objects carry their presentation timestamp.\n\t *\n\t * False once the subscriber sends INCLUDE_PROPERTIES=0: that drops TIMESCALE from\n\t * SUBSCRIBE_OK, and a timestamp whose units were never declared is worse than none. Our\n\t * own reader discards it; another may read it as some default and time the media wrong.\n\t */\n\tstamped: boolean;\n\n\t/** The objects of this group the subscription's filter selects. */\n\tslice: GroupSlice;\n\n\t/** Settles when the subscriber leaves, dropping a group still queued for a stream slot. */\n\tunsubscribed: Promise<void>;\n}\n\n/** What {@link Publisher.runFill} needs to serve one subscription's backfill. */\ninterface RunFill {\n\t/** The subscription's request ID, which the fetch stream names. */\n\trequestId: bigint;\n\n\t/**\n\t * The subscriber's delivery priority, applied to the cache subscription the fill reads.\n\t *\n\t * Deliberately not the fetch stream's send order: this publisher leaves its group\n\t * streams at the transport's default, so ranking the fill alone would put backfill\n\t * ahead of the live groups it is catching up to.\n\t */\n\tpriority: number;\n\n\t/** The range the fill resolved to. */\n\tfill: FillServe;\n\n\t/**\n\t * An independent view of the same track, used to read the cached group without consuming\n\t * anything the subscription will deliver.\n\t */\n\tcache: TrackSubscriber;\n\n\t/** The track's advertised timescale, applied to every frame timestamp. */\n\ttimescale: Timescale;\n\n\t/** Whether objects carry their presentation timestamp; see {@link RunGroup.stamped}. */\n\tstamped: boolean;\n\n\t/** Settles when the subscriber leaves, releasing a fill still waiting on its group. */\n\tunsubscribed: Promise<void>;\n}\n\n/**\n * Handles publishing 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 Publisher {\n\t#quic: WebTransport;\n\t#session: Session;\n\t#requiresSolicitation: boolean;\n\n\t// What every advertisement carries on a session that negotiated the MoQ Cluster\n\t// extension: a hop path holding our own id, so the peer can tell that what it hears\n\t// back came from us. `undefined` when nothing negotiated it.\n\t#advert?: Cluster.Advert;\n\n\t// Our published broadcasts.\n\t// It's a signal so we can live update any subscribe_namespace streams.\n\t#broadcasts = new Signal<Map<Path.Valid, broadcast.Producer> | undefined>(new Map());\n\n\t/**\n\t * Creates a new Publisher instance.\n\t *\n\t * @internal\n\t */\n\tconstructor({\n\t\tquic,\n\t\tsession,\n\t\trequiresSolicitation,\n\t\tcluster,\n\t}: {\n\t\t/** The WebTransport session, for uni streams. */\n\t\tquic: WebTransport;\n\t\t/** The session abstraction for bidi streams and request IDs. */\n\t\tsession: Session;\n\t\t/** Whether the peer's SETUP asked to be told on request (MoQ Solicit). */\n\t\trequiresSolicitation: boolean;\n\t\t/** The Hop IDs the SETUP exchange settled (MoQ Cluster). */\n\t\tcluster?: Cluster.Hops;\n\t}) {\n\t\tthis.#quic = quic;\n\t\tthis.#session = session;\n\t\tthis.#requiresSolicitation = requiresSolicitation;\n\t\tthis.#advert = Cluster.advertise(cluster);\n\t}\n\n\t/**\n\t * Publishes a broadcast with any associated tracks.\n\t * The namespace is advertised with an unsolicited PUBLISH_NAMESPACE, or on request\n\t * if the peer asked for that (see {@link runPublishNamespaces}).\n\t */\n\tpublish(path: Path.Valid, broadcast: broadcast.Producer) {\n\t\tthis.#broadcasts.mutate((broadcasts) => {\n\t\t\tif (!broadcasts) throw new Error(\"closed\");\n\t\t\tbroadcasts.set(path, broadcast);\n\t\t});\n\n\t\t// Remove the broadcast from the lookup when it's closed, unless the path was republished.\n\t\tvoid broadcast.closed.then(() => {\n\t\t\tthis.#broadcasts.mutate((broadcasts) => {\n\t\t\t\tif (broadcasts?.get(path) === broadcast) {\n\t\t\t\t\tbroadcasts.delete(path);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Handles an incoming SUBSCRIBE request on a bidi stream.\n\t * Owns the full lifecycle: sends response, serves track data, waits for close.\n\t *\n\t * @internal\n\t */\n\tasync runSubscribe(msg: Subscribe, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst name = msg.trackNamespace;\n\t\tconst broadcast = this.#broadcasts.peek()?.get(name);\n\n\t\tif (!broadcast) {\n\t\t\t// Write error response\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(SubscribeError.id);\n\t\t\t\tconst err = new SubscribeError({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\terrorCode: 404,\n\t\t\t\t\treasonPhrase: \"Broadcast not found\",\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\t\tconst err = new RequestError({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t\terrorCode: 404,\n\t\t\t\t\treasonPhrase: \"Broadcast not found\",\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t}\n\t\t\tstream.close();\n\t\t\treturn;\n\t\t}\n\n\t\tconst priority = fromWire(msg.subscriberPriority);\n\t\tconst track = broadcast.subscribe(msg.trackName, { priority });\n\n\t\t// Hoisted so the cleanup below reaches it: the fork happens before SUBSCRIBE_OK is\n\t\t// written, and a write that throws must not strand the sink it attached.\n\t\tlet cache: TrackSubscriber | undefined;\n\n\t\ttry {\n\t\t\tconst timescale = (await track.info()).timescale;\n\n\t\t\t// The filter and any fill are relative to the live edge, so snapshot it once: the\n\t\t\t// fill ends exactly where a Next Object subscription begins, which is what lets\n\t\t\t// the draft's current-group join (Next Object plus a StartGroup=1 fill) cover the\n\t\t\t// group with no gap and no overlap.\n\t\t\tconst edge = liveEdge(track);\n\t\t\tconst range = subscribeRange(msg, edge, version);\n\n\t\t\t// The wire request tells an upstream what we need; the cursor is what actually\n\t\t\t// trims this subscriber, since the producer fans every cached group out to every\n\t\t\t// sink regardless. An absent start joins at the latest group, which is what\n\t\t\t// moq-lite means by joining a live track.\n\t\t\ttrack.update({\n\t\t\t\tpriority,\n\t\t\t\tstartGroup: range.start && Number(range.start.group),\n\t\t\t\tendGroup: range.end && Number(range.end.group),\n\t\t\t});\n\t\t\tconst startGroup = range.start ? Number(range.start.group) : track.latest();\n\t\t\tif (startGroup !== undefined) track.startAt(startGroup);\n\n\t\t\t// A fill reads the group cache through its own consumer, independent of the\n\t\t\t// subscription's cursor. Forked from this subscriber rather than resolved through\n\t\t\t// the broadcast again: a dynamic serve is one request per peer subscription, so\n\t\t\t// asking the broadcast would mint a second producer nobody has accepted.\n\t\t\tconst fill =\n\t\t\t\tmsg.fill && Filter.isDraft20(version) ? fillRange(msg.fill, msg.filter, edge.largest) : undefined;\n\t\t\tcache = fill && fill.kind !== \"empty\" ? track.fork({ priority }) : undefined;\n\n\t\t\t// Send SUBSCRIBE_OK\n\t\t\tawait stream.writer.u53(SubscribeOk.id);\n\t\t\tconst ok = new SubscribeOk({\n\t\t\t\trequestId:\n\t\t\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t\t\t? msg.requestId\n\t\t\t\t\t\t: undefined,\n\t\t\t\ttrackAlias: msg.requestId,\n\t\t\t\t// Required once the track has content; a fill-requesting subscriber sizes its\n\t\t\t\t// backfill against this.\n\t\t\t\tlargest: edge.largest && { groupId: edge.largest.group, objectId: edge.largest.object },\n\t\t\t\tproperties: msg.propertiesWanted\n\t\t\t\t\t? // Declaring the timescale is what opts the track into timestamps; every\n\t\t\t\t\t\t// object Timestamp below is in these units. We serve the newest group\n\t\t\t\t\t\t// first, matching moq-lite.\n\t\t\t\t\t\t{ timescale, groupOrder: Properties.DESCENDING }\n\t\t\t\t\t: // INCLUDE_PROPERTIES=0. The block stays present but empty, which also means\n\t\t\t\t\t\t// the track opts out of timestamps for this subscriber.\n\t\t\t\t\t\t{},\n\t\t\t});\n\t\t\tawait ok.encode(stream.writer, version);\n\t\t\tconsole.debug(`publish ok: broadcast=${name} track=${track.name}`);\n\n\t\t\t// Cancels groups still queued for a stream slot. Only the subscriber leaving counts:\n\t\t\t// a track that ran out of groups still has to flush the ones already queued, and we\n\t\t\t// close the stream ourselves below to say so.\n\t\t\tlet finished = false;\n\t\t\tlet unsubscribe!: () => void;\n\t\t\tconst unsubscribed = new Promise<void>((resolve) => {\n\t\t\t\tunsubscribe = resolve;\n\t\t\t});\n\t\t\tvoid stream.reader.closed.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (!finished) unsubscribe();\n\t\t\t\t},\n\t\t\t\t// A reset is always the peer.\n\t\t\t\t() => unsubscribe(),\n\t\t\t);\n\n\t\t\t// Serve track groups, racing with stream close (= Unsubscribe)\n\t\t\tconst serving = (async () => {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst group = await track.recvGroup();\n\t\t\t\t\tif (!group) return;\n\n\t\t\t\t\t// Past the filter's end. Dropped here rather than through `endAt`, which\n\t\t\t\t\t// parks a capped group instead: this range is fixed for the life of the\n\t\t\t\t\t// subscription, so a group above it is never coming back in, and holding\n\t\t\t\t\t// one keeps the loop from ever ending. A producer that publishes beyond\n\t\t\t\t\t// the end and then closes would otherwise strand PUBLISH_DONE.\n\t\t\t\t\tif (range.end !== undefined && BigInt(group.sequence) > range.end.group) {\n\t\t\t\t\t\tgroup.close();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid this.#runGroup({\n\t\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\ttimescale,\n\t\t\t\t\t\tstamped: msg.propertiesWanted,\n\t\t\t\t\t\tslice: groupSlice(range, group.sequence),\n\t\t\t\t\t\tunsubscribed,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\t// The fill (when one was requested) runs alongside on its own fetch stream; its\n\t\t\t// failures reset that stream and never touch the subscription.\n\t\t\tconst filling =\n\t\t\t\tfill && cache\n\t\t\t\t\t? this.#runFill({\n\t\t\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\t\t\tpriority,\n\t\t\t\t\t\t\tfill,\n\t\t\t\t\t\t\tcache,\n\t\t\t\t\t\t\ttimescale,\n\t\t\t\t\t\t\tstamped: msg.propertiesWanted,\n\t\t\t\t\t\t\tunsubscribed,\n\t\t\t\t\t\t})\n\t\t\t\t\t: Promise.resolve();\n\n\t\t\tlet publishError: Error | undefined;\n\t\t\ttry {\n\t\t\t\tawait Promise.race([Promise.all([serving, filling]), stream.reader.closed]);\n\t\t\t} catch (err: unknown) {\n\t\t\t\tpublishError = error(err);\n\t\t\t}\n\n\t\t\tconsole.debug(`publish done: broadcast=${name} track=${track.name}`);\n\t\t\tif (publishError) {\n\t\t\t\tconsole.warn(`publish error: broadcast=${name} track=${track.name} error=${reason(publishError)}`);\n\t\t\t}\n\n\t\t\t// PUBLISH_DONE is required for every supported draft. The peer may have already\n\t\t\t// closed its side to unsubscribe, in which case there is nowhere to send it.\n\t\t\ttry {\n\t\t\t\tawait stream.writer.u53(PublishDone.id);\n\t\t\t\tconst done = new PublishDone({\n\t\t\t\t\trequestId:\n\t\t\t\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t\t\t\t? msg.requestId\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tstatusCode: publishError ? PUBLISH_DONE_STATUS.INTERNAL_ERROR : PUBLISH_DONE_STATUS.TRACK_ENDED,\n\t\t\t\t\treasonPhrase: publishError ? \"internal error\" : \"track ended\",\n\t\t\t\t});\n\t\t\t\tawait done.encode(stream.writer, version);\n\t\t\t} catch {\n\t\t\t\t// Stream might already be closed by peer.\n\t\t\t}\n\n\t\t\t// Only now is the close below ours. Claiming it any earlier would read a peer FIN\n\t\t\t// that lands while PublishDone is still going out as our own completion, leaving\n\t\t\t// queued groups to open for a subscriber that has already left.\n\t\t\tfinished = true;\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`publish error: broadcast=${name} track=${track.name} error=${reason(e)}`);\n\t\t\tstream.abort(e);\n\t\t} finally {\n\t\t\ttrack.close();\n\t\t\t// Idempotent, and the backstop for a throw between the fork and the fill starting:\n\t\t\t// #runFill closes it itself on every path it reaches.\n\t\t\tcache?.close();\n\t\t}\n\t}\n\n\t/**\n\t * Runs a group and sends its frames using ObjectStream (Subgroup delivery mode).\n\t */\n\tasync #runGroup(options: RunGroup) {\n\t\tconst { requestId, group, timescale, stamped, slice, unsubscribed } = options;\n\t\ttry {\n\t\t\t// One stream per group is faster than a peer at its limit can retire them, so this\n\t\t\t// is the one path that doesn't wait for a slot: the transport would serve the opens\n\t\t\t// in the order we asked, which is oldest-first, exactly backwards for live media.\n\t\t\t// Failing here drops the group and lets the next one compete for the next slot.\n\t\t\tconst stream = await Writer.tryOpen(this.#quic, {\n\t\t\t\tcancel: unsubscribed,\n\t\t\t\tversion: this.#session.version,\n\t\t\t\twaitUntilAvailable: false,\n\t\t\t});\n\t\t\tif (!stream) {\n\t\t\t\tgroup.close(new Error(\"no stream slot\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst header = new GroupMessage({\n\t\t\t\ttrackAlias: requestId,\n\t\t\t\tgroupId: group.sequence,\n\t\t\t\tsubGroupId: 0,\n\t\t\t\tpublisherPriority: 0,\n\t\t\t\tflags: {\n\t\t\t\t\t// The object properties carry the timestamp, so there is nothing to write\n\t\t\t\t\t// when the track declared no units to read one in.\n\t\t\t\t\thasExtensions: stamped,\n\t\t\t\t\thasSubgroup: false,\n\t\t\t\t\thasSubgroupObject: false,\n\t\t\t\t\thasEnd: true,\n\t\t\t\t\thasPriority: true,\n\t\t\t\t\t// Only honest when the stream really starts at the group's first object;\n\t\t\t\t\t// a trimmed head starts partway through.\n\t\t\t\t\tfirstObject: slice.skip === 0,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tawait header.encode(stream, this.#session.version);\n\n\t\t\ttry {\n\t\t\t\t// The first written object goes on the wire as its absolute id, so a trimmed\n\t\t\t\t// head shows the true numbering rather than a silently renumbered group.\n\t\t\t\tlet first = true;\n\t\t\t\t// The next object id that could be written, which starts at the filter rather\n\t\t\t\t// than at zero. A backwards range (`startObject` above `endObject` in the same\n\t\t\t\t// group) is empty, and starting here is what lets the check below see that\n\t\t\t\t// before the read parks on an object the range already excludes.\n\t\t\t\tlet next = slice.skip;\n\n\t\t\t\tfor (;;) {\n\t\t\t\t\t// The filter ends inside this group: everything at `until` and beyond is\n\t\t\t\t\t// outside the requested range, so stop without waiting for the group's end.\n\t\t\t\t\tif (slice.until !== undefined && next >= slice.until) break;\n\n\t\t\t\t\t// Reading from the filter's start drops the objects below it, including any the\n\t\t\t\t\t// group's cache evicted: they are outside the requested range, so losing them is\n\t\t\t\t\t// not the gap that would otherwise reset this stream and forfeit the rest of the\n\t\t\t\t\t// group. An eviction at or above the start is a real gap and still throws.\n\t\t\t\t\tconst frame = await Promise.race([group.readFrameSequence({ from: slice.skip }), stream.closed]);\n\t\t\t\t\tif (!frame) break;\n\t\t\t\t\tnext = frame.sequence + 1;\n\t\t\t\t\tif (slice.until !== undefined && frame.sequence >= slice.until) break;\n\n\t\t\t\t\tconst obj = new Frame({ payload: frame.payload, timestamp: frame.timestamp });\n\t\t\t\t\tconst delta = first ? frame.sequence : 0;\n\t\t\t\t\tfirst = false;\n\t\t\t\t\tawait obj.encode(stream, header.flags, timescale, this.#session.version, delta);\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err: unknown) {\n\t\t\t\tstream.reset(error(err));\n\t\t\t}\n\t\t} finally {\n\t\t\tgroup.close();\n\t\t}\n\t}\n\n\t/**\n\t * Serve a draft-20 fill on its own fetch stream: the requested range, read from the\n\t * group cache, capped at the Largest Object snapshot.\n\t *\n\t * A fill is a promise once requested. An empty range opens no stream, but a range we\n\t * cannot serve still opens one and resets it right after the FETCH_HEADER, the draft's\n\t * fill-failure signal. Nothing here touches the subscription either way.\n\t */\n\tasync #runFill(options: RunFill) {\n\t\tconst { requestId, fill, cache, timescale, stamped, unsubscribed } = options;\n\t\tconst version = this.#session.version;\n\n\t\t// Everything is inside the try so the cache fork is released on every path out,\n\t\t// including a transport failure while opening the stream.\n\t\tlet stream: Writer | undefined;\n\t\ttry {\n\t\t\tif (fill.kind === \"empty\") return;\n\n\t\t\tstream = await Writer.tryOpen(this.#quic, { cancel: unsubscribed, version });\n\t\t\tif (!stream) {\n\t\t\t\tconsole.debug(`fill stream failed to open: fill=${requestId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait stream.u53(FetchHeader.type);\n\t\t\tawait new FetchHeader({ requestId }).encode(stream, version);\n\n\t\t\tif (fill.kind !== \"group\") {\n\t\t\t\tthrow new Error(\"a fill spanning several groups is not supported\");\n\t\t\t}\n\n\t\t\tconst group = takeGroup(cache, Number(fill.sequence));\n\t\t\ttry {\n\t\t\t\tawait this.#writeFillGroup(stream, group, fill, timescale, stamped, unsubscribed);\n\t\t\t} finally {\n\t\t\t\tgroup.close();\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t\tconsole.debug(`fill complete: fill=${requestId}`);\n\t\t} catch (err: unknown) {\n\t\t\t// A fill never fails the subscription; its own stream carries the failure.\n\t\t\tconst e = error(err);\n\t\t\tconsole.debug(`fill failed, resetting its stream: fill=${requestId} error=${reason(e)}`);\n\t\t\tstream?.reset(e);\n\t\t} finally {\n\t\t\tcache.close();\n\t\t}\n\t}\n\n\t/**\n\t * Write one cached group's frames as draft-20 fetch objects.\n\t *\n\t * The cap is the Largest Object snapshot: the group may keep growing, but everything\n\t * past the snapshot belongs to the subscription, not the fill.\n\t */\n\tasync #writeFillGroup(\n\t\tstream: Writer,\n\t\tgroup: group.Consumer,\n\t\tfill: FillGroup,\n\t\ttimescale: Timescale,\n\t\tstamped: boolean,\n\t\tunsubscribed: Promise<void>,\n\t) {\n\t\tlet first = true;\n\t\tlet next = 0n;\n\n\t\t// The subscriber leaving has to end the fill too. An absolute filter ending below the\n\t\t// edge with no end object leaves `until` unset, so this reads until the group closes,\n\t\t// which a still-open past group may never do. Watching only the fetch stream would\n\t\t// then pin the group and the cache subscription behind it for the life of the track.\n\t\tlet left = false;\n\t\tconst cancelled = unsubscribed.then(() => {\n\t\t\tleft = true;\n\t\t\treturn undefined;\n\t\t});\n\n\t\tfor (;;) {\n\t\t\t// The group may keep growing, but everything at `until` and beyond belongs to the\n\t\t\t// subscription, so stop without waiting for the group's end.\n\t\t\tif (fill.until !== undefined && next >= fill.until) break;\n\n\t\t\t// Reading from the fill's start drops everything below it, evicted objects included;\n\t\t\t// see the same read in #runGroup.\n\t\t\tconst frame = await Promise.race([\n\t\t\t\tgroup.readFrameSequence({ from: Number(fill.skip) }),\n\t\t\t\tstream.closed,\n\t\t\t\tcancelled,\n\t\t\t]);\n\t\t\tif (left) throw new Error(\"unsubscribed before the fill finished\");\n\t\t\tif (!frame) break;\n\t\t\tnext = BigInt(frame.sequence) + 1n;\n\t\t\tif (fill.until !== undefined && BigInt(frame.sequence) >= fill.until) break;\n\n\t\t\tconst obj = new FetchFrame({ payload: frame.payload, timestamp: stamped ? frame.timestamp : undefined });\n\t\t\tawait obj.encode(\n\t\t\t\tstream,\n\t\t\t\t{ group: Number(fill.sequence), object: frame.sequence, first },\n\t\t\t\ttimescale,\n\t\t\t\tthis.#session.version,\n\t\t\t);\n\t\t\tfirst = false;\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming SUBSCRIBE_NAMESPACE on a bidi stream.\n\t *\n\t * This carries the advertisements only when the peer asked to be told on request\n\t * (MoQ Solicit); otherwise {@link runPublishNamespaces} has already announced\n\t * everything and repeating it here would leave the peer holding two sources for one\n\t * broadcast. Draft-16+ streams Namespace entries inline; draft-14/15 predate those\n\t * messages, so each advertisement is a PUBLISH_NAMESPACE request of its own.\n\t *\n\t * @internal\n\t */\n\tasync runSubscribeNamespace(msg: SubscribeNamespace, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst prefix = msg.namespace;\n\t\tconst legacy = version === Version.DRAFT_14 || version === Version.DRAFT_15;\n\n\t\t// Draft-14/15: the open PUBLISH_NAMESPACE request per advertised suffix.\n\t\tconst requests = new Map<Path.Valid, { path: Path.Valid; requestId: bigint; stream: Stream }>();\n\n\t\ttry {\n\t\t\t// Send OK response\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(SubscribeNamespaceOk.id);\n\t\t\t\tconst ok = new SubscribeNamespaceOk({ 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\tif (!this.#requiresSolicitation) {\n\t\t\t\t// Already announced, unasked. Hold the stream open until the peer is done.\n\t\t\t\tawait stream.reader.closed;\n\t\t\t\tstream.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reports whether the peer now holds the namespace: an inline entry always\n\t\t\t// lands, but a PUBLISH_NAMESPACE request can be declined.\n\t\t\tconst advertise = async (suffix: Path.Valid): Promise<boolean> => {\n\t\t\t\tif (legacy) {\n\t\t\t\t\treturn await this.#advertise(Path.join(prefix, suffix), requests, refused);\n\t\t\t\t}\n\n\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntry.id);\n\t\t\t\tawait new SubscribeNamespaceEntry({ suffix, cluster: this.#advert }).encode(stream.writer, version);\n\t\t\t\treturn true;\n\t\t\t};\n\t\t\tconst withdraw = async (suffix: Path.Valid) => {\n\t\t\t\tif (legacy) {\n\t\t\t\t\tawait this.#withdraw(Path.join(prefix, suffix), requests);\n\t\t\t\t} else {\n\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntryDone.id);\n\t\t\t\t\tawait new SubscribeNamespaceEntryDone({ suffix }).encode(stream.writer, version);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlet active = new Set<Path.Valid>();\n\t\t\tlet retry = 0;\n\t\t\t// What the peer refused, and whether coming back is worth anything.\n\t\t\tconst refused = new Map<Path.Valid, Refused>();\n\n\t\t\tfor (;;) {\n\t\t\t\t// Subscribe BEFORE reconciling, for the same reason as\n\t\t\t\t// {@link runPublishNamespaces}: a publish landing while an advertisement\n\t\t\t\t// waits for its reply only notifies listeners already registered.\n\t\t\t\t// TODO Make a better helper within Signals.\n\t\t\t\tlet dispose!: Dispose;\n\t\t\t\tconst changed = new Promise<Map<Path.Valid, broadcast.Producer> | undefined>((resolve) => {\n\t\t\t\t\tdispose = this.#broadcasts.changed(resolve);\n\t\t\t\t});\n\n\t\t\t\tconst broadcasts = this.#broadcasts.peek();\n\t\t\t\tif (!broadcasts) {\n\t\t\t\t\tdispose();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst updated = new Set<Path.Valid>();\n\t\t\t\tfor (const name of broadcasts.keys()) {\n\t\t\t\t\tconst suffix = Path.stripPrefix(prefix, name);\n\t\t\t\t\tif (suffix === null) continue;\n\t\t\t\t\tupdated.add(suffix);\n\t\t\t\t}\n\n\t\t\t\t// A namespace that is gone takes its refusal with it, so re-announcing the\n\t\t\t\t// path offers it again.\n\t\t\t\tconst live = new Set<Path.Valid>([...updated].map((suffix) => Path.join(prefix, suffix)));\n\t\t\t\tfor (const path of [...refused.keys()]) {\n\t\t\t\t\tif (!live.has(path)) refused.delete(path);\n\t\t\t\t}\n\n\t\t\t\t// Track what the peer holds rather than what we attempted: a declined\n\t\t\t\t// advertisement stays out of `held`, so the next turn retries it instead of\n\t\t\t\t// believing the namespace is already up.\n\t\t\t\tconst held = new Set<Path.Valid>(active);\n\t\t\t\tfor (const added of updated.difference(active)) {\n\t\t\t\t\tif (this.#offerable(Path.join(prefix, added), refused)) {\n\t\t\t\t\t\tif (await advertise(added)) held.add(added);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const removed of active.difference(updated)) {\n\t\t\t\t\tawait withdraw(removed);\n\t\t\t\t\theld.delete(removed);\n\t\t\t\t}\n\n\t\t\t\tactive = held;\n\n\t\t\t\t// Whatever we wanted up and could not get up, as {@link runPublishNamespaces}\n\t\t\t\t// does: only a legacy request can be declined, and nothing about the peer\n\t\t\t\t// starting to answer raises a signal this loop is watching.\n\t\t\t\tconst outstanding = [...updated.difference(active)].some((suffix) =>\n\t\t\t\t\tthis.#pending(Path.join(prefix, suffix), refused),\n\t\t\t\t);\n\t\t\t\tretry = outstanding ? Math.min(retry ? retry * 2 : RETRY_BASE, RETRY_MAX) : 0;\n\n\t\t\t\t// Wait for the next change, or for the peer to unsubscribe.\n\t\t\t\tconst next = await (retry\n\t\t\t\t\t? Promise.race([changed, stream.reader.closed, retryAfter(retry).then(() => broadcasts)])\n\t\t\t\t\t: Promise.race([changed, stream.reader.closed]));\n\t\t\t\tdispose();\n\t\t\t\tif (!next) break;\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.debug(`subscribe_namespace stream error: ${reason(e)}`);\n\t\t\tstream.abort(e);\n\t\t} finally {\n\t\t\t// This subscription's advertisements die with it.\n\t\t\tfor (const path of [...requests.keys()]) {\n\t\t\t\tawait this.#withdraw(path, requests);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advertise every published broadcast with an unsolicited PUBLISH_NAMESPACE, until\n\t * the publisher is closed.\n\t *\n\t * The peers that never send SUBSCRIBE_NAMESPACE are exactly the ones expecting a\n\t * publisher to announce itself, so announcing is the default. A peer that would\n\t * rather ask says so in its SETUP (MoQ Solicit) and this does nothing, leaving\n\t * {@link runSubscribeNamespace} to carry the advertisements instead. Exactly one of\n\t * the two is live, so the peer never hears a namespace twice.\n\t *\n\t * @internal\n\t */\n\tasync runPublishNamespaces() {\n\t\tif (this.#requiresSolicitation) {\n\t\t\t// The peer asked to be told on request; runSubscribeNamespace answers it.\n\t\t\treturn;\n\t\t}\n\n\t\t// The open PUBLISH_NAMESPACE request per advertised path.\n\t\tconst requests = new Map<Path.Valid, { path: Path.Valid; requestId: bigint; stream: Stream }>();\n\n\t\ttry {\n\t\t\tlet active = new Set<Path.Valid>();\n\t\t\tlet retry = 0;\n\t\t\t// What the peer refused, and whether coming back is worth anything.\n\t\t\tconst refused = new Map<Path.Valid, Refused>();\n\n\t\t\tfor (;;) {\n\t\t\t\t// Subscribe BEFORE reconciling. Each advertisement below waits a round trip\n\t\t\t\t// for the peer's reply, and a publish that lands in that window notifies\n\t\t\t\t// only the listeners already registered; one created afterwards would sleep\n\t\t\t\t// through it and leave the namespace unadvertised until something unrelated\n\t\t\t\t// changed.\n\t\t\t\t// TODO Make a better helper within Signals.\n\t\t\t\tlet dispose!: Dispose;\n\t\t\t\tconst changed = new Promise<Map<Path.Valid, broadcast.Producer> | undefined>((resolve) => {\n\t\t\t\t\tdispose = this.#broadcasts.changed(resolve);\n\t\t\t\t});\n\n\t\t\t\tconst broadcasts = this.#broadcasts.peek();\n\t\t\t\tif (!broadcasts) {\n\t\t\t\t\tdispose();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst updated = new Set<Path.Valid>(broadcasts.keys());\n\n\t\t\t\t// A namespace that is gone takes its refusal with it, so re-announcing the\n\t\t\t\t// path offers it again. Rust gets this by rebuilding the watched entry.\n\t\t\t\tfor (const path of [...refused.keys()]) {\n\t\t\t\t\tif (!updated.has(path)) refused.delete(path);\n\t\t\t\t}\n\n\t\t\t\tfor (const added of updated.difference(active)) {\n\t\t\t\t\tif (this.#offerable(added, refused)) {\n\t\t\t\t\t\tawait this.#advertise(added, requests, refused);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const removed of active.difference(updated)) {\n\t\t\t\t\tawait this.#withdraw(removed, requests);\n\t\t\t\t}\n\n\t\t\t\t// What the peer holds, not what we attempted: a declined PUBLISH_NAMESPACE\n\t\t\t\t// leaves no request behind, so it stays outstanding below.\n\t\t\t\tactive = new Set<Path.Valid>(requests.keys());\n\n\t\t\t\t// Whatever we wanted up and could not get up. Stream credit freeing, a\n\t\t\t\t// transient failure clearing, or the peer starting to answer raises no\n\t\t\t\t// signal of its own, so the only way back is to ask again on a timer.\n\t\t\t\tconst outstanding = [...updated.difference(active)].some((path) => this.#pending(path, refused));\n\t\t\t\tretry = outstanding ? Math.min(retry ? retry * 2 : RETRY_BASE, RETRY_MAX) : 0;\n\n\t\t\t\t// Wait for the next change, which has already fired if one landed above.\n\t\t\t\tconst next = await (retry\n\t\t\t\t\t? Promise.race([changed, retryAfter(retry).then(() => broadcasts)])\n\t\t\t\t\t: changed);\n\t\t\t\tdispose();\n\t\t\t\tif (!next) break;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\t// Nothing restarts this loop, so whatever got us here cost the session its\n\t\t\t// discovery. Not a debug-level event.\n\t\t\tconsole.warn(`publish_namespace loop failed: ${reason(error(err))}`);\n\t\t} finally {\n\t\t\t// Close out every open PUBLISH_NAMESPACE request.\n\t\t\tfor (const path of [...requests.keys()]) {\n\t\t\t\tawait this.#withdraw(path, requests);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Whether a namespace may be offered to the peer right now.\n\t *\n\t * A peer that asked never to be offered it again means it, whatever brought us back;\n\t * one that named a minimum wait gets it, even when our own backoff comes round sooner.\n\t */\n\t#offerable(path: Path.Valid, refused: Map<Path.Valid, Refused>): boolean {\n\t\tconst entry = refused.get(path);\n\t\tif (entry === undefined) return true;\n\t\treturn entry !== \"never\" && Date.now() >= entry;\n\t}\n\n\t/**\n\t * Whether the loop should keep coming back to a namespace the peer does not hold.\n\t *\n\t * Distinct from {@link offerable}, and the difference is what arms the retry: a\n\t * namespace waiting out a minimum is not offerable yet but is still pending, and\n\t * gating the timer on offerable instead would disarm it for exactly the wait it is\n\t * supposed to be counting. Only a refusal that forbids retrying ends it.\n\t */\n\t#pending(path: Path.Valid, refused: Map<Path.Valid, Refused>): boolean {\n\t\treturn refused.get(path) !== \"never\";\n\t}\n\n\t/**\n\t * Advertise one namespace on its own PUBLISH_NAMESPACE request. A declined request\n\t * is logged and skipped: a peer that wants none of this rejects each one and stays\n\t * connected.\n\t *\n\t * `refused` records what a refusal said about coming back, so a peer that asked not to\n\t * be offered a namespace again is not re-offered it by the retry above.\n\t */\n\tasync #advertise(\n\t\tpath: Path.Valid,\n\t\trequests: Map<Path.Valid, { path: Path.Valid; requestId: bigint; stream: Stream }>,\n\t\trefused: Map<Path.Valid, Refused>,\n\t): Promise<boolean> {\n\t\tconst requestId = await this.#session.nextRequestId();\n\t\tif (requestId === undefined) return false;\n\n\t\t// Opening is inside the try because it fails like any other advertisement does:\n\t\t// a peer out of stream credit rejects here, and letting that escape would unwind\n\t\t// the announce loop and take discovery down for the whole session, rather than\n\t\t// costing this one namespace a turn.\n\t\tlet request: Stream | undefined;\n\t\ttry {\n\t\t\trequest = await this.#session.openBi();\n\t\t\tconst stream = request;\n\n\t\t\t// Bounded, like the subscriber's own request: the loop is single-threaded over\n\t\t\t// advertisements, so a peer that takes the stream and answers nothing strands\n\t\t\t// every publish and withdrawal behind it. Timing out costs this namespace a\n\t\t\t// turn and leaves it outstanding, which the retry above re-offers.\n\t\t\tawait withTimeout(\n\t\t\t\t(async () => {\n\t\t\t\t\tawait stream.writer.u53(PublishNamespace.id);\n\t\t\t\t\tconst msg = new PublishNamespace({ requestId, trackNamespace: path, cluster: this.#advert });\n\t\t\t\t\tawait msg.encode(stream.writer, this.#session.version);\n\n\t\t\t\t\t// Read response (RequestOk and PublishNamespaceOk share 0x07)\n\t\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\t\tif (respTypeId === RequestError.id) {\n\t\t\t\t\t\t// The peer named how long to stay away, in milliseconds. Draft-14/15\n\t\t\t\t\t\t// carry no such field, so a 0 there says nothing and our own backoff\n\t\t\t\t\t\t// stands; everywhere else 0 means it does not want this again.\n\t\t\t\t\t\tconst err = await RequestError.decode(stream.reader, this.#session.version);\n\t\t\t\t\t\tconst legacy =\n\t\t\t\t\t\t\tthis.#session.version === Version.DRAFT_14 || this.#session.version === Version.DRAFT_15;\n\t\t\t\t\t\tif (!legacy) {\n\t\t\t\t\t\t\trefused.set(\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\terr.retryInterval === 0n ? \"never\" : Date.now() + Number(err.retryInterval),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new Error(`PublishNamespace rejected: ${err.errorCode} ${err.reasonPhrase}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (respTypeId !== RequestOk.id) {\n\t\t\t\t\t\tthrow new Error(`PublishNamespace rejected: typeId=0x${respTypeId.toString(16)}`);\n\t\t\t\t\t}\n\t\t\t\t\t// Draft-14 sends PublishNamespaceOk (requestId only, no parameters)\n\t\t\t\t\tif (this.#session.version === Version.DRAFT_14) {\n\t\t\t\t\t\tawait PublishNamespaceOk.decode(stream.reader, this.#session.version);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait RequestOk.decode(stream.reader, this.#session.version);\n\t\t\t\t\t}\n\t\t\t\t})(),\n\t\t\t\tADVERTISE_TIMEOUT_MS,\n\t\t\t\t`advertisement timed out after ${ADVERTISE_TIMEOUT_MS}ms waiting for the peer's answer`,\n\t\t\t);\n\n\t\t\trequests.set(path, { path, requestId, stream: request });\n\t\t\treturn true;\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`announce failed: broadcast=${path} error=${reason(e)}`);\n\t\t\trequest?.abort(e);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Close out a namespace's PUBLISH_NAMESPACE request with PUBLISH_NAMESPACE_DONE.\n\t */\n\tasync #withdraw(\n\t\tpath: Path.Valid,\n\t\trequests: Map<Path.Valid, { path: Path.Valid; requestId: bigint; stream: Stream }>,\n\t) {\n\t\tconst request = requests.get(path);\n\t\tif (!request) return;\n\t\trequests.delete(path);\n\n\t\t// Draft-17+ removed PUBLISH_NAMESPACE_DONE: the close below is the whole\n\t\t// withdrawal. Sending it anyway puts the type on the wire before the body throws,\n\t\t// and a receiver reading 0x09 there has no choice but to treat it as a protocol\n\t\t// violation.\n\t\tconst version = this.#session.version;\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\ttry {\n\t\t\t\tawait request.stream.writer.u53(PublishNamespaceDone.id);\n\t\t\t\tconst done = new PublishNamespaceDone({ trackNamespace: request.path, requestId: request.requestId });\n\t\t\t\tawait done.encode(request.stream.writer, version);\n\t\t\t} catch {\n\t\t\t\t// Stream might already be closed\n\t\t\t}\n\t\t}\n\t\trequest.stream.close();\n\t}\n\n\t/**\n\t * Handles an incoming TRACK_STATUS_REQUEST on a bidi stream.\n\t *\n\t * @internal\n\t */\n\tasync runTrackStatusRequest(msg: TrackStatusRequest, stream: Stream) {\n\t\tconst version = this.#session.version;\n\n\t\tif (version === Version.DRAFT_14) {\n\t\t\t// v14: respond with TrackStatus (0x0E = TRACK_STATUS_OK)\n\t\t\tawait stream.writer.u53(TrackStatus.id);\n\t\t\tconst status = new TrackStatus({\n\t\t\t\ttrackNamespace: msg.trackNamespace,\n\t\t\t\ttrackName: msg.trackName,\n\t\t\t\tstatusCode: TrackStatus.STATUS_NOT_FOUND,\n\t\t\t\tlastGroupId: 0n,\n\t\t\t\tlastObjectId: 0n,\n\t\t\t});\n\t\t\tawait status.encode(stream.writer, version);\n\t\t} else {\n\t\t\t// v15+: respond with RequestOk (0x07)\n\t\t\tawait stream.writer.u53(RequestOk.id);\n\t\t\tconst ok = new RequestOk({\n\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t});\n\t\t\tawait ok.encode(stream.writer, version);\n\t\t}\n\t\tstream.close();\n\t}\n\n\t/**\n\t * Closes every published broadcast and stops accepting new ones.\n\t *\n\t * @internal\n\t */\n\tclose() {\n\t\tthis.#broadcasts.update((broadcasts) => {\n\t\t\tfor (const broadcast of broadcasts?.values() ?? []) {\n\t\t\t\tbroadcast.close();\n\t\t\t}\n\t\t\treturn undefined;\n\t\t});\n\t}\n}\n\n/** A `{group, object}` position, in the Location Filter's own units. */\ninterface Location {\n\t/** The group's sequence number. */\n\tgroup: bigint;\n\t/** The object's id within that group. */\n\tobject: bigint;\n}\n\n/** Where a range ends, inclusive. An absent `object` includes the whole end group. */\ninterface EndLocation {\n\t/** The last group to serve. */\n\tgroup: bigint;\n\t/** The last object within it, or the whole group when absent. */\n\tobject?: bigint;\n}\n\n/**\n * The live edge a SUBSCRIBE resolves against, snapshotted once so the subscription floor,\n * the fill cap, and the advertised LARGEST_OBJECT all agree on where it is.\n */\ninterface LiveEdge {\n\t/** The newest group sequence, absent before any group exists. */\n\tlatest?: bigint;\n\n\t/**\n\t * The precise Largest Object. Absent when the track has no readable frame, in which case\n\t * nothing is advertised and no fill is servable.\n\t */\n\tlargest?: Location;\n\n\t/**\n\t * One past the Largest Object, which is where a Next Object subscription begins. With no\n\t * readable object anywhere this falls back to the newest group's start, which excludes\n\t * nothing the cache can still name.\n\t */\n\tnext?: Location;\n}\n\n/** The Locations a SUBSCRIBE's Location Filter selects, resolved against the live edge. */\ninterface ServeRange {\n\t/** The first Location to serve, or the start of the latest group when absent. */\n\tstart?: Location;\n\n\t/**\n\t * Where the range ends, inclusive, or open ended when absent. The subscription stays open\n\t * once the range is exhausted; draft-20 removed the notion of a filter ending one.\n\t */\n\tend?: EndLocation;\n}\n\n/** The slice of one group a subscription's {@link ServeRange} selects. */\ninterface GroupSlice {\n\t/** Objects dropped from the front; also the first written object's absolute id. */\n\tskip: number;\n\n\t/** One past the last object to write, when the filter ends inside this group. */\n\tuntil?: number;\n}\n\n/** A fill resolved to a single group of the cache. */\ninterface FillGroup {\n\tkind: \"group\";\n\t/** The group to serve. */\n\tsequence: bigint;\n\t/** Objects dropped from the front. */\n\tskip: bigint;\n\t/** One past the last object to write, capping the fill at the Largest Object snapshot. */\n\tuntil?: bigint;\n}\n\n/** What a draft-20 fill request resolves to. */\ntype FillServe =\n\t/** The range is empty, so no fetch stream is opened at all. */\n\t| { kind: \"empty\" }\n\t| FillGroup\n\t/**\n\t * A range spanning several groups, which we do not serve: multi-group fetch\n\t * serialization depends on a negotiated group order we do not implement, so the stream is\n\t * reset instead, the draft's fill-failure signal.\n\t */\n\t| { kind: \"unsupported\" };\n\n/**\n * Take one group out of a cache view, without waiting.\n *\n * A fill's group is at or below the Largest Object snapshot, so it is either still in the\n * retained window or gone for good: nothing republishes an old sequence, and waiting for one\n * would park for the life of the track. Scanning past it, or running dry, is a cache miss,\n * which the caller turns into the draft's fill-failure reset.\n */\nfunction takeGroup(cache: TrackSubscriber, sequence: number): group.Consumer {\n\tfor (;;) {\n\t\tconst group = cache.tryRecvGroup();\n\t\tif (!group) throw new Error(`group not found: ${sequence}`);\n\t\tif (group.sequence === sequence) return group;\n\n\t\tgroup.close();\n\t\tif (group.sequence > sequence) throw new Error(`group not found: ${sequence}`);\n\t}\n}\n\n/** `a - b`, saturating at zero the way the draft's unsigned arithmetic does. */\nfunction saturatingSub(a: bigint, b: bigint): bigint {\n\treturn a > b ? a - b : 0n;\n}\n\n/** Snapshot the live edge of a track. */\nfunction liveEdge(track: TrackSubscriber): LiveEdge {\n\tconst latest = track.latest();\n\tif (latest === undefined) return {};\n\n\tconst largest = track.largest();\n\tif (!largest) return { latest: BigInt(latest), next: { group: BigInt(latest), object: 0n } };\n\n\tconst group = BigInt(largest.group);\n\tconst object = BigInt(largest.frame);\n\treturn { latest: BigInt(latest), largest: { group, object }, next: { group, object: object + 1n } };\n}\n\n/**\n * Resolve a SUBSCRIBE's Location Filter into the range to serve.\n *\n * Only draft-20 is honored. Earlier drafts have a Filter Type tag whose absolute forms we\n * never served, and starting to interpret them now would change what an existing peer\n * receives; draft-20 is also the first version whose relative forms can name a past group\n * without the subscriber knowing Largest Object.\n */\nfunction subscribeRange(msg: Subscribe, edge: LiveEdge, version: IetfVersion): ServeRange {\n\tif (!Filter.isDraft20(version)) {\n\t\tif (msg.filter.kind !== \"nextObject\" && msg.filter.kind !== \"unfiltered\") {\n\t\t\tconsole.warn(`filter not supported before draft-20, ignoring: ${msg.filter.kind}`);\n\t\t}\n\t\treturn {};\n\t}\n\n\treturn filterRange(msg.filter, edge);\n}\n\n/** The Locations a single Location Filter selects, resolved against the live edge. */\nfunction filterRange(filter: Filter.Filter, edge: LiveEdge): ServeRange {\n\tswitch (filter.kind) {\n\t\t// No restriction. moq-lite starts at the beginning of the latest group, which is the\n\t\t// join point it is built around; a subscription passes objects as they are published,\n\t\t// so an absent filter is not a request to replay history.\n\t\tcase \"unfiltered\":\n\t\t\treturn {};\n\t\t// `{Largest.Group, Largest.Object + 1}`. Everything below it, including the already\n\t\t// published head of the current group, is outside the requested range, so the join is\n\t\t// mid-group by construction. The draft pairs this with a fill when the subscriber\n\t\t// wants the head; see {@link Publisher.runFill}.\n\t\tcase \"nextObject\":\n\t\t\treturn { start: edge.next };\n\t\t// `{Largest.Group + 1 - groups, 0}`: 0 is the next group and 1 is the current one.\n\t\t// Counted from `Largest.Group`, which sits below the newest group while that group has\n\t\t// no objects yet; only with no largest at all does the newest group stand in for it.\n\t\tcase \"relative\": {\n\t\t\tconst base = edge.largest?.group ?? edge.latest;\n\t\t\tif (base === undefined) return {};\n\t\t\treturn { start: { group: saturatingSub(base + 1n, filter.groups), object: 0n } };\n\t\t}\n\t\tcase \"absolute\":\n\t\t\treturn {\n\t\t\t\tstart: { group: filter.startGroup, object: filter.startObject },\n\t\t\t\tend: filter.endGroup === undefined ? undefined : { group: filter.endGroup, object: filter.endObject },\n\t\t\t};\n\t}\n}\n\n/**\n * Trim a group to the filter's object bounds, so nothing outside the requested range is\n * sent. Interior groups are served whole.\n */\nfunction groupSlice(range: ServeRange, sequence: number): GroupSlice {\n\tconst at = BigInt(sequence);\n\treturn {\n\t\tskip: range.start?.group === at ? Number(range.start.object) : 0,\n\t\tuntil: range.end?.group === at && range.end.object !== undefined ? Number(range.end.object) + 1 : undefined,\n\t};\n}\n\n/**\n * Resolve a fill request using the Fetch rules: relative to Largest Object and never\n * extending beyond it. An omitted Location Filter inherits the subscription's.\n */\nfunction fillRange(fill: Filter.Fill, subscription: Filter.Filter, largest?: Location): FillServe {\n\t// A Range Filter narrows which objects pass, which we do not implement; serving the\n\t// unfiltered range instead would deliver objects the peer excluded, so refuse it.\n\tif (fill.rangeFilters) return { kind: \"unsupported\" };\n\tconst filter = fill.filter ?? subscription;\n\n\t// Nothing published (or no precise edge to cap at) means no fill is servable; an empty\n\t// range opens no stream.\n\tif (!largest) return { kind: \"empty\" };\n\n\tlet start: Location;\n\tswitch (filter.kind) {\n\t\t// A Fetch without a filter is the whole track up to Largest Object.\n\t\tcase \"unfiltered\":\n\t\t\tstart = { group: 0n, object: 0n };\n\t\t\tbreak;\n\t\t// One past the edge, which for a Fetch is always empty.\n\t\tcase \"nextObject\":\n\t\t\treturn { kind: \"empty\" };\n\t\tcase \"relative\":\n\t\t\tstart = { group: saturatingSub(largest.group + 1n, filter.groups), object: 0n };\n\t\t\tbreak;\n\t\tcase \"absolute\":\n\t\t\tstart = { group: filter.startGroup, object: filter.startObject };\n\t\t\tbreak;\n\t}\n\n\t// Cap the requested end at Largest Object.\n\tlet end: EndLocation = { group: largest.group, object: largest.object };\n\tif (filter.kind === \"absolute\" && filter.endGroup !== undefined) {\n\t\tconst below =\n\t\t\tfilter.endGroup < largest.group ||\n\t\t\t(filter.endGroup === largest.group && filter.endObject !== undefined && filter.endObject < largest.object);\n\t\tif (below) end = { group: filter.endGroup, object: filter.endObject };\n\t}\n\n\tif (\n\t\tstart.group > end.group ||\n\t\t(start.group === end.group && end.object !== undefined && end.object < start.object)\n\t) {\n\t\treturn { kind: \"empty\" };\n\t}\n\tif (start.group !== end.group) return { kind: \"unsupported\" };\n\n\treturn {\n\t\tkind: \"group\",\n\t\tsequence: start.group,\n\t\tskip: start.object,\n\t\tuntil: end.object === undefined ? undefined : end.object + 1n,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/ietf/publisher.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Dispose, type Getter, race, Signal } from \"@moq/signals\";\nimport type * as broadcast from \"../broadcast.ts\";\nimport { controlTimeout, error, reason, StreamCode, StreamError } from \"../error.ts\";\nimport type * as group from \"../group.ts\";\nimport type { Hop, Route } from \"../hop.ts\";\nimport { hiddenBelow, hooks, presented } from \"../internal.ts\";\nimport type { Consumer as OriginConsumer } from \"../origin.ts\";\nimport * as Path from \"../path.ts\";\nimport { type Stream, Writer } from \"../stream.ts\";\nimport { Milli, Timescale } from \"../time.ts\";\nimport type { Subscriber as TrackSubscriber } from \"../track.ts\";\nimport { TimeoutError, withTimeout } from \"../util/timeout.ts\";\nimport * as Varint from \"../varint.ts\";\nimport { type Advertised, type Advertisements, wireOf } from \"../wire.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport * as Cluster from \"./cluster.ts\";\nimport { type RequestKind, requestReason, toRequestCode } from \"./error.ts\";\nimport { type Fetch, FetchError, FetchHeader } from \"./fetch.ts\";\nimport * as Filter from \"./filter.ts\";\nimport { FetchFrame, Frame, Group as GroupMessage } from \"./object.ts\";\nimport { fromWire, toWire } from \"./priority.ts\";\nimport * as Properties from \"./properties.ts\";\nimport { PublishDone, PublishDoneStatus } from \"./publish.ts\";\nimport {\n\tPublishNamespace,\n\tPublishNamespaceDone,\n\tPublishNamespaceOk,\n\tPublishNamespaceUpdate,\n} from \"./publish_namespace.ts\";\nimport { RequestError, RequestOk } from \"./request.ts\";\nimport { type Subscribe, SubscribeError, SubscribeOk } from \"./subscribe.ts\";\nimport {\n\ttype SubscribeNamespace,\n\tSubscribeNamespaceEntry,\n\tSubscribeNamespaceEntryDone,\n\tSubscribeNamespaceOk,\n} from \"./subscribe_namespace.ts\";\nimport type { TrackStatusRequest } from \"./track.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\n/** First wait before re-offering a namespace the peer refused or we couldn't open for. */\nconst RETRY_BASE = 100;\n\n/** Ceiling on that wait. The loop retries for the life of the session, so it must not spin. */\nconst RETRY_MAX = 5000;\n\n/** Cluster parameters for one snapshot: the advertised hops, then our own id last. */\nfunction clusterFor(base: Cluster.Advert | undefined, route: Route): Cluster.Advert | undefined {\n\tif (!base) return undefined;\n\tconst self = base.hops.at(-1);\n\tif (self === undefined) return undefined;\n\tconst hops = route.hops.at(-1) === self ? [...route.hops] : [...route.hops, self];\n\treturn { hops, cost: route.cost.warm };\n}\n\n/**\n * What it takes to move the peer from `held` to `next`.\n *\n * - `\"same\"`: the peer would decode the same advertisement. The cold cost, and the whole\n * route without Cluster, never reach the wire, so a change there sends nothing.\n * - `\"restart\"`: nothing is held, nothing is wanted, or a different broadcast, which is\n * withdrawn and advertised again.\n * - Otherwise the same broadcast at a new hop chain or warm cost: the cluster parameters\n * the peer holds and the ones it should, for the target to update.\n */\nfunction change(\n\tbase: Cluster.Advert | undefined,\n\theld: Advertised | undefined,\n\tnext: Advertised | undefined,\n): \"same\" | \"restart\" | Reprice {\n\tif (held === undefined || next === undefined || held.identity !== next.identity) return \"restart\";\n\tconst from = clusterFor(base, held.route);\n\tconst to = clusterFor(base, next.route);\n\tif (from === undefined || to === undefined) return from === to ? \"same\" : \"restart\";\n\tif (from.cost === to.cost && sameHops(from.hops, to.hops)) return \"same\";\n\treturn { from, to };\n}\n\n/** A held advertisement's cluster parameters, and the ones the peer should hold instead. */\ninterface Reprice {\n\tfrom: Cluster.Advert;\n\tto: Cluster.Advert;\n}\n\n/** Whether two hop paths list the same hops in the same order. */\nfunction sameHops(a: Hop[], b: Hop[]): boolean {\n\treturn a.length === b.length && a.every((hop, i) => hop === b[i]);\n}\n\n/**\n * How long one advertisement may take to be answered. Matches the Rust publisher, and the\n * peer accepting the stream is only half the exchange: one it never answers on holds the\n * loop just as effectively as one it never grants.\n */\nconst ADVERTISE_TIMEOUT_MS = 5000;\n\n/** Sleep `delay`, jittered, so a relay's namespaces don't all retry on the same tick. */\nfunction retryAfter(delay: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, delay * (0.5 + Math.random() / 2)));\n}\n\n/**\n * What a refusal said about re-offering the namespace.\n *\n * A peer answers a request it declines with a retry interval, and ignoring it is how a\n * permanent refusal (unauthorized, uninterested) turns into a request every few seconds\n * for the life of the session. `\"never\"` is an interval of 0; a number is the epoch\n * milliseconds before which we must not come back.\n */\ntype Refused = \"never\" | number;\n\n/**\n * How the peer answered an advertisement or an update: it holds the namespace, it does\n * not and said nothing about coming back (`\"dropped\"`), or it refused.\n */\ntype Answer = \"held\" | \"dropped\" | Refused;\n\n/** The open PUBLISH_NAMESPACE request per advertised path. */\ntype Requests = Map<Path.Valid, { path: Path.Valid; requestId: bigint; stream: Stream }>;\n\n/** What one announce loop knows about the peer, keyed the way that loop names namespaces. */\ninterface Namespaces {\n\t/** What the peer holds, by identity plus route. */\n\tactive: Map<Path.Valid, Advertised>;\n\n\t/** What the peer refused, and whether coming back is worth anything. */\n\trefused: Map<Path.Valid, Refused>;\n\n\t/** The identity each refusal was about, so a republish at the same path clears it. */\n\toffered: Map<Path.Valid, object>;\n}\n\n/** Where one announce loop sends its advertisements. */\ninterface Target {\n\t/** Advertise a namespace the peer does not hold. */\n\tadvertise(key: Path.Valid, next: Advertised): Promise<Answer>;\n\n\t/** Reprice a namespace the peer holds: the same broadcast at a new hop chain or cost. */\n\tupdate(key: Path.Valid, next: Advertised, reprice: Reprice): Promise<Answer>;\n\n\t/** Withdraw a namespace the peer holds. */\n\twithdraw(key: Path.Valid): Promise<void>;\n}\n\n/** What {@link Publisher.runGroup} needs to serve one group. */\ninterface RunGroup {\n\t/** The subscription's request ID, doubling as the track alias. */\n\trequestId: bigint;\n\n\t/** The group to serve. */\n\tgroup: group.Consumer;\n\n\t/** The track's advertised timescale, applied to every frame timestamp. */\n\ttimescale: Timescale;\n\n\t/** The publisher's tie-break priority, already converted to the IETF wire convention. */\n\tpublisherPriority: number;\n\n\t/**\n\t * Whether objects carry their presentation timestamp.\n\t *\n\t * False once the subscriber sends INCLUDE_PROPERTIES=0: that drops TIMESCALE from\n\t * SUBSCRIBE_OK, and a timestamp whose units were never declared is worse than none. Our\n\t * own reader discards it; another may read it as some default and time the media wrong.\n\t */\n\tstamped: boolean;\n\n\t/** The objects of this group the subscription's filter selects. */\n\tslice: GroupSlice;\n\n\t/** Settles when the subscriber leaves, dropping a group still queued for a stream slot. */\n\tunsubscribed: Promise<void>;\n\n\t/** The subscription's data stream count, which PUBLISH_DONE reports. */\n\tstreams: StreamCount;\n}\n\n/** How many data streams a subscription opened, fill streams included. */\ntype StreamCount = { opened: number };\n\n/** What {@link Publisher.runFill} needs to serve one subscription's backfill. */\ninterface RunFill {\n\t/** The subscription's request ID, which the fetch stream names. */\n\trequestId: bigint;\n\n\t/**\n\t * The subscriber's delivery priority, applied to the cache subscription the fill reads.\n\t *\n\t * Deliberately not the fetch stream's send order: this publisher leaves its group\n\t * streams at the transport's default, so ranking the fill alone would put backfill\n\t * ahead of the live groups it is catching up to.\n\t */\n\tpriority: number;\n\n\t/** The range the fill resolved to. */\n\tfill: FillServe;\n\n\t/**\n\t * An independent view of the same track, used to read the cached group without consuming\n\t * anything the subscription will deliver.\n\t */\n\tcache: TrackSubscriber;\n\n\t/** The track's advertised timescale, applied to every frame timestamp. */\n\ttimescale: Timescale;\n\n\t/** Whether objects carry their presentation timestamp; see {@link RunGroup.stamped}. */\n\tstamped: boolean;\n\n\t/** Settles when the subscriber leaves, releasing a fill still waiting on its group. */\n\tunsubscribed: Promise<void>;\n\n\t/** The subscription's data stream count, which PUBLISH_DONE reports. */\n\tstreams: StreamCount;\n}\n\n/**\n * Handles publishing 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 Publisher {\n\t#quic: WebTransport;\n\t#session: Session;\n\t#requiresSolicitation: boolean;\n\t#hidden: boolean;\n\n\t// The origin this session serves, borrowed: it outlives the session, and closing the\n\t// session leaves its broadcasts alone. The namespaces are advertised with an unsolicited\n\t// PUBLISH_NAMESPACE (see {@link runPublishNamespaces}), or on request if the peer asked\n\t// for that (see {@link runSubscribeNamespace}).\n\t#advertised: Getter<Advertisements | undefined>;\n\t#publish?: OriginConsumer;\n\n\t// What every advertisement carries on a session that negotiated the MoQ Cluster\n\t// extension: a hop path holding our own id, so the peer can tell that what it hears\n\t// back came from us. `undefined` when nothing negotiated it.\n\t#advert?: Cluster.Advert;\n\n\t/**\n\t * Creates a new Publisher instance.\n\t *\n\t * @internal\n\t */\n\tconstructor({\n\t\tquic,\n\t\tsession,\n\t\tpublish,\n\t\trequiresSolicitation,\n\t\thidden = false,\n\t\tcluster,\n\t}: {\n\t\t/** The WebTransport session, for uni streams. */\n\t\tquic: WebTransport;\n\t\t/** The session abstraction for bidi streams and request IDs. */\n\t\tsession: Session;\n\t\t/** The origin whose broadcasts this session serves; omit to publish nothing. */\n\t\tpublish?: OriginConsumer;\n\t\t/** Whether the peer's SETUP asked to be told on request (MoQ Solicit). */\n\t\trequiresSolicitation: boolean;\n\t\t/** Whether the peer declared MoQ Hidden. */\n\t\thidden?: boolean;\n\t\t/** The Hop IDs the SETUP exchange settled (MoQ Cluster). */\n\t\tcluster?: Cluster.Hops;\n\t}) {\n\t\tthis.#quic = quic;\n\t\tthis.#session = session;\n\t\tconst origin = publish && wireOf(publish);\n\t\tthis.#advertised = origin?.advertised ?? new Signal(new Map());\n\t\tthis.#publish = publish;\n\t\tthis.#requiresSolicitation = requiresSolicitation;\n\t\tthis.#hidden = hidden;\n\t\tthis.#advert = Cluster.advertise(cluster);\n\t}\n\n\t/**\n\t * Handles an incoming SUBSCRIBE request on a bidi stream.\n\t * Owns the full lifecycle: sends response, serves track data, waits for close.\n\t *\n\t * @internal\n\t */\n\tasync runSubscribe(msg: Subscribe, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst name = msg.trackNamespace;\n\t\tlet broadcast: broadcast.Consumer | undefined;\n\t\tlet refusal: { errorCode: number; reasonPhrase: string } | undefined;\n\n\t\t// Legal requests we can't honor are refused one at a time. A subscription that\n\t\t// forwards nothing is only useful to a subscriber that later turns forwarding on,\n\t\t// and serving a Range Filter unfiltered would deliver objects it excluded.\n\t\tconst unsupported = !msg.forward\n\t\t\t? \"FORWARD=0 not supported\"\n\t\t\t: msg.rangeFilters\n\t\t\t\t? \"range filters not supported\"\n\t\t\t\t: undefined;\n\n\t\tif (unsupported) {\n\t\t\trefusal = { errorCode: toRequestCode(\"not_supported\", \"subscribe\", version), reasonPhrase: unsupported };\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tbroadcast =\n\t\t\t\t\tthis.#publish && (wireOf(this.#publish).local(name) ?? (await wireOf(this.#publish).demand(name)));\n\t\t\t\tif (!broadcast) {\n\t\t\t\t\trefusal = {\n\t\t\t\t\t\terrorCode: toRequestCode(\"does_not_exist\", \"subscribe\", version),\n\t\t\t\t\t\treasonPhrase: \"broadcast not found\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (err: unknown) {\n\t\t\t\tconst e = error(err);\n\t\t\t\tconst condition =\n\t\t\t\t\te instanceof StreamError && e.code === StreamCode.NotFound ? \"does_not_exist\" : \"internal\";\n\t\t\t\trefusal = { errorCode: toRequestCode(condition, \"subscribe\", version), reasonPhrase: reason(e) };\n\t\t\t}\n\t\t}\n\n\t\tif (refusal) {\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(SubscribeError.id);\n\t\t\t\tconst err = new SubscribeError({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\terrorCode: refusal.errorCode,\n\t\t\t\t\treasonPhrase: refusal.reasonPhrase,\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t} else {\n\t\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\t\tconst err = new RequestError({\n\t\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? msg.requestId : undefined,\n\t\t\t\t\terrorCode: refusal.errorCode,\n\t\t\t\t\treasonPhrase: refusal.reasonPhrase,\n\t\t\t\t});\n\t\t\t\tawait err.encode(stream.writer, version);\n\t\t\t}\n\t\t\tstream.close();\n\t\t\treturn;\n\t\t}\n\t\tif (!broadcast) return;\n\n\t\tconst priority = fromWire(msg.subscriberPriority);\n\t\tconst track = wireOf(broadcast).subscribe(msg.trackName, {\n\t\t\tpriority,\n\t\t\t// moq-transport has no subscriber latency parameter. Keep everything the\n\t\t\t// producer retained and let the receiving subscriber enforce its own budget.\n\t\t\t// Keep the sentinel encodable if this demand crosses a Lite hop before the\n\t\t\t// producer's retention bound is known.\n\t\t\tmaxAge: Milli(Varint.MAX_U53),\n\t\t});\n\n\t\tlet cache: TrackSubscriber | undefined;\n\n\t\ttry {\n\t\t\t// Declaring the timescale is what opts the track into timestamps; every object\n\t\t\t// Timestamp below is in these units.\n\t\t\tconst info = await track.info();\n\t\t\tconst timescale = info.timescale;\n\t\t\t// The model ranks higher-first, the IETF wire lower-first. Every group this\n\t\t\t// subscription serves carries the same publisher priority, which is what lets a\n\t\t\t// relay prefer catalog and audio over video when it has no subscriber preference\n\t\t\t// to go on.\n\t\t\tconst publisherPriority = toWire(info.priority);\n\n\t\t\t// The filter and any fill are relative to the live edge, so snapshot it once: the\n\t\t\t// fill ends exactly where a Next Object subscription begins, which is what lets\n\t\t\t// the draft's current-group join (Next Object plus a StartGroup=1 fill) cover the\n\t\t\t// group with no gap and no overlap.\n\t\t\tconst edge = liveEdge(track);\n\t\t\tconst range = subscribeRange(msg, edge, version);\n\n\t\t\t// The wire request tells an upstream what we need; the cursor is what actually\n\t\t\t// trims this subscriber, since the producer fans every cached group out to every\n\t\t\t// sink regardless. An absent start joins at the latest group, which is what\n\t\t\t// moq-lite means by joining a live track. The range's end is the inclusive last\n\t\t\t// group; the model's `endGroup` is exclusive.\n\t\t\ttrack.update({\n\t\t\t\tpriority,\n\t\t\t\tmaxAge: Milli(Varint.MAX_U53),\n\t\t\t\tgroups: {\n\t\t\t\t\tstart: range.start ? { included: Number(range.start.group) } : undefined,\n\t\t\t\t\tend: range.end ? { included: Number(range.end.group) } : undefined,\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst startGroup = range.start ? Number(range.start.group) : track.latest();\n\t\t\tif (startGroup !== undefined) track.setGroups({ start: { included: startGroup } });\n\n\t\t\t// A fill reads the group cache through its own consumer, independent of the\n\t\t\t// subscription's cursor. Forked from this subscriber rather than resolved through\n\t\t\t// the broadcast again: a dynamic serve is one request per peer subscription, so\n\t\t\t// asking the broadcast would mint a second producer nobody has accepted.\n\t\t\tconst fill =\n\t\t\t\tmsg.fill && Filter.isDraft20(version) ? fillRange(msg.fill, msg.filter, edge.largest) : undefined;\n\t\t\tcache = fill && fill.kind !== \"empty\" ? track.fork({ priority, maxAge: Milli(Varint.MAX_U53) }) : undefined;\n\n\t\t\t// Send SUBSCRIBE_OK\n\t\t\tawait stream.writer.u53(SubscribeOk.id);\n\t\t\tconst ok = new SubscribeOk({\n\t\t\t\trequestId:\n\t\t\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t\t\t? msg.requestId\n\t\t\t\t\t\t: undefined,\n\t\t\t\ttrackAlias: msg.requestId,\n\t\t\t\t// Required once the track has content; a fill-requesting subscriber sizes its\n\t\t\t\t// backfill against this. Below draft-20 round it down to the start of its\n\t\t\t\t// group, matching what the subscription serves there: a draft-20 subscriber\n\t\t\t\t// recovers a group's head with a FILL, which we serve, while older drafts\n\t\t\t\t// recover it with a joining FETCH, which we do not, so naming a mid-group\n\t\t\t\t// start would strand them.\n\t\t\t\tlargest:\n\t\t\t\t\tedge.largest &&\n\t\t\t\t\t(Filter.isDraft20(version)\n\t\t\t\t\t\t? { groupId: edge.largest.group, objectId: edge.largest.object }\n\t\t\t\t\t\t: { groupId: edge.largest.group, objectId: 0n }),\n\t\t\t\tproperties: msg.propertiesWanted\n\t\t\t\t\t? // Declaring the timescale is what opts the track into timestamps; every\n\t\t\t\t\t\t// object Timestamp below is in these units. We serve the newest group\n\t\t\t\t\t\t// first, matching moq-lite.\n\t\t\t\t\t\t{ timescale, priority: publisherPriority, groupOrder: Properties.DESCENDING }\n\t\t\t\t\t: // INCLUDE_PROPERTIES=0. The block stays present but empty, which also means\n\t\t\t\t\t\t// the track opts out of timestamps for this subscriber.\n\t\t\t\t\t\t{},\n\t\t\t});\n\t\t\tawait ok.encode(stream.writer, version);\n\t\t\tconsole.debug(`publish ok: broadcast=${name} track=${track.name}`);\n\n\t\t\t// Cancels groups still queued for a stream slot. Only the subscriber leaving counts:\n\t\t\t// a track that ran out of groups still has to flush the ones already queued, and we\n\t\t\t// close the stream ourselves below to say so.\n\t\t\tlet finished = false;\n\t\t\tlet unsubscribe!: () => void;\n\t\t\tconst unsubscribed = new Promise<void>((resolve) => {\n\t\t\t\tunsubscribe = resolve;\n\t\t\t});\n\t\t\tvoid stream.reader.closed.then(\n\t\t\t\t() => {\n\t\t\t\t\tif (!finished) unsubscribe();\n\t\t\t\t},\n\t\t\t\t// A reset is always the peer.\n\t\t\t\t() => unsubscribe(),\n\t\t\t);\n\n\t\t\t// Every group started, until its stream finishes or resets, and the data streams\n\t\t\t// opened for PUBLISH_DONE to report.\n\t\t\tconst groups = new Set<Promise<void>>();\n\t\t\tconst streams: StreamCount = { opened: 0 };\n\n\t\t\t// Serve track groups, racing with stream close (= Unsubscribe)\n\t\t\tconst serving = (async () => {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst group = await track.recvGroup();\n\t\t\t\t\tif (!group) return;\n\n\t\t\t\t\t// Past the filter's end. Dropped here rather than through `setGroups`, which\n\t\t\t\t\t// parks a capped group instead: this range is fixed for the life of the\n\t\t\t\t\t// subscription, so a group above it is never coming back in, and holding\n\t\t\t\t\t// one keeps the loop from ever ending. A producer that publishes beyond\n\t\t\t\t\t// the end and then closes would otherwise strand PUBLISH_DONE.\n\t\t\t\t\tif (range.end !== undefined && BigInt(group.sequence) > range.end.group) {\n\t\t\t\t\t\tgroup.close();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst task = this.#runGroup({\n\t\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\t\tgroup,\n\t\t\t\t\t\ttimescale,\n\t\t\t\t\t\tpublisherPriority,\n\t\t\t\t\t\tstamped: msg.propertiesWanted,\n\t\t\t\t\t\tslice: groupSlice(range, group.sequence),\n\t\t\t\t\t\tunsubscribed,\n\t\t\t\t\t\tstreams,\n\t\t\t\t\t});\n\t\t\t\t\tgroups.add(task);\n\t\t\t\t\tvoid task.finally(() => groups.delete(task));\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\t// The fill (when one was requested) runs alongside on its own fetch stream; its\n\t\t\t// failures reset that stream and never touch the subscription.\n\t\t\tconst filling =\n\t\t\t\tfill && cache\n\t\t\t\t\t? this.#runFill({\n\t\t\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\t\t\tpriority,\n\t\t\t\t\t\t\tfill,\n\t\t\t\t\t\t\tcache,\n\t\t\t\t\t\t\ttimescale,\n\t\t\t\t\t\t\tstamped: msg.propertiesWanted,\n\t\t\t\t\t\t\tunsubscribed,\n\t\t\t\t\t\t\tstreams,\n\t\t\t\t\t\t})\n\t\t\t\t\t: Promise.resolve();\n\n\t\t\tlet publishError: Error | undefined;\n\t\t\tlet ended = false;\n\t\t\ttry {\n\t\t\t\tconst served = Symbol(\"served\");\n\t\t\t\tended =\n\t\t\t\t\t(await race([Promise.all([serving, filling]).then(() => served), stream.reader.closed])) === served;\n\t\t\t} catch (err: unknown) {\n\t\t\t\tpublishError = error(err);\n\t\t\t}\n\n\t\t\t// PUBLISH_DONE waits until every stream this subscription will open is closed, as\n\t\t\t// the draft requires, so its count is final. The subscriber leaving cancels the\n\t\t\t// ones still queued instead.\n\t\t\tawait race([Promise.all(groups), unsubscribed]);\n\n\t\t\t// Draft 14 on has no end location in PUBLISH_DONE: an END_OF_TRACK object is what\n\t\t\t// tells the subscriber where the track ended.\n\t\t\tconst final = track.final();\n\t\t\tif (ended && !publishError && final !== undefined) {\n\t\t\t\tawait this.#runEndOfTrack({\n\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\tfinal,\n\t\t\t\t\tpublisherPriority,\n\t\t\t\t\tunsubscribed,\n\t\t\t\t\tstreams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconsole.debug(`publish done: broadcast=${name} track=${track.name}`);\n\t\t\tif (publishError) {\n\t\t\t\tconsole.warn(`publish error: broadcast=${name} track=${track.name} error=${reason(publishError)}`);\n\t\t\t}\n\n\t\t\t// PUBLISH_DONE is required for every supported draft. The peer may have already\n\t\t\t// closed its side to unsubscribe, in which case there is nowhere to send it.\n\t\t\ttry {\n\t\t\t\tawait stream.writer.u53(PublishDone.id);\n\t\t\t\tconst done = new PublishDone({\n\t\t\t\t\trequestId:\n\t\t\t\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t\t\t\t? msg.requestId\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tstatusCode: publishError ? PublishDoneStatus.INTERNAL_ERROR : PublishDoneStatus.TRACK_ENDED,\n\t\t\t\t\tstreamCount: BigInt(streams.opened),\n\t\t\t\t\treasonPhrase: publishError ? \"internal error\" : \"track ended\",\n\t\t\t\t});\n\t\t\t\tawait done.encode(stream.writer, version);\n\t\t\t} catch {\n\t\t\t\t// Stream might already be closed by peer.\n\t\t\t}\n\n\t\t\t// Only now is the close below ours. Claiming it any earlier would read a peer FIN\n\t\t\t// that lands while PublishDone is still going out as our own completion, leaving\n\t\t\t// queued groups to open for a subscriber that has already left.\n\t\t\tfinished = true;\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`publish error: broadcast=${name} track=${track.name} error=${reason(e)}`);\n\t\t\tstream.abort(e);\n\t\t} finally {\n\t\t\ttrack.close();\n\t\t\t// Idempotent, and the backstop for a throw between the fork and the fill starting:\n\t\t\t// #runFill closes it itself on every path it reaches.\n\t\t\tcache?.close();\n\t\t}\n\t}\n\n\t/**\n\t * Runs a group and sends its frames using ObjectStream (Subgroup delivery mode).\n\t */\n\tasync #runGroup(options: RunGroup) {\n\t\tconst { requestId, group, timescale, publisherPriority, stamped, slice, unsubscribed, streams } = options;\n\t\ttry {\n\t\t\t// One stream per group is faster than a peer at its limit can retire them, so this\n\t\t\t// is the one path that doesn't wait for a slot: the transport would serve the opens\n\t\t\t// in the order we asked, which is oldest-first, exactly backwards for live media.\n\t\t\t// Failing here drops the group and lets the next one compete for the next slot.\n\t\t\tconst stream = await Writer.tryOpen(this.#quic, {\n\t\t\t\tcancel: unsubscribed,\n\t\t\t\tversion: this.#session.version,\n\t\t\t\twaitUntilAvailable: false,\n\t\t\t});\n\t\t\tif (!stream) {\n\t\t\t\tgroup.close(new Error(\"no stream slot\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstreams.opened += 1;\n\n\t\t\tconst header = new GroupMessage({\n\t\t\t\ttrackAlias: requestId,\n\t\t\t\tgroupId: group.sequence,\n\t\t\t\tsubGroupId: 0,\n\t\t\t\tpublisherPriority,\n\t\t\t\tflags: {\n\t\t\t\t\t// The object properties carry the timestamp, so there is nothing to write\n\t\t\t\t\t// when the track declared no units to read one in.\n\t\t\t\t\thasExtensions: stamped,\n\t\t\t\t\thasSubgroup: false,\n\t\t\t\t\thasSubgroupObject: false,\n\t\t\t\t\thasEnd: true,\n\t\t\t\t\thasPriority: true,\n\t\t\t\t\t// Only honest when the stream really starts at the group's first object;\n\t\t\t\t\t// a trimmed head starts partway through.\n\t\t\t\t\tfirstObject: slice.skip === 0,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tawait hooks.guardGroup(group, () => header.encode(stream, this.#session.version));\n\t\t\t\t// The first written object goes on the wire as its absolute id, so a trimmed\n\t\t\t\t// head shows the true numbering rather than a silently renumbered group.\n\t\t\t\tlet first = true;\n\t\t\t\t// The next object id that could be written, which starts at the filter rather\n\t\t\t\t// than at zero. A backwards range (`startObject` above `endObject` in the same\n\t\t\t\t// group) is empty, and starting here is what lets the check below see that\n\t\t\t\t// before the read parks on an object the range already excludes.\n\t\t\t\tlet next = slice.skip;\n\n\t\t\t\tfor (;;) {\n\t\t\t\t\t// The filter ends inside this group: everything at `until` and beyond is\n\t\t\t\t\t// outside the requested range, so stop without waiting for the group's end.\n\t\t\t\t\tif (slice.until !== undefined && next >= slice.until) break;\n\n\t\t\t\t\t// Reading from the filter's start drops the objects below it: they are outside\n\t\t\t\t\t// the requested range, so skipping them is not a gap.\n\t\t\t\t\tconst read = await race([hooks.readGroupFrame(group, slice.skip), stream.closed]);\n\t\t\t\t\tif (!read) break;\n\t\t\t\t\tnext = read.sequence + 1;\n\t\t\t\t\tif (slice.until !== undefined && read.sequence >= slice.until) {\n\t\t\t\t\t\tread.complete();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst obj = new Frame({ payload: read.frame.payload, timestamp: read.frame.timestamp });\n\t\t\t\t\t\tconst delta = first ? read.sequence : 0;\n\t\t\t\t\t\tfirst = false;\n\t\t\t\t\t\tawait hooks.guardGroup(group, () =>\n\t\t\t\t\t\t\tobj.encode(stream, header.flags, timescale, this.#session.version, delta),\n\t\t\t\t\t\t);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tread.complete();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err: unknown) {\n\t\t\t\tstream.reset(error(err));\n\t\t\t}\n\t\t} finally {\n\t\t\tgroup.close();\n\t\t}\n\t}\n\n\t/**\n\t * Mark the track's end with an END_OF_TRACK object on its own stream, at object 0 of the\n\t * group that will never exist.\n\t *\n\t * The last group's stream has usually finished before the track ends, so the marker cannot\n\t * ride on it. A failure only costs the subscriber the early boundary.\n\t */\n\tasync #runEndOfTrack(options: {\n\t\trequestId: bigint;\n\t\tfinal: number;\n\t\tpublisherPriority: number;\n\t\tunsubscribed: Promise<void>;\n\t\tstreams: StreamCount;\n\t}) {\n\t\tconst { requestId, final, publisherPriority, unsubscribed, streams } = options;\n\t\tconst version = this.#session.version;\n\t\tconst stream = await Writer.tryOpen(this.#quic, { cancel: unsubscribed, version }).catch(() => undefined);\n\t\tif (!stream) return;\n\t\tstreams.opened += 1;\n\n\t\ttry {\n\t\t\tconst header = new GroupMessage({\n\t\t\t\ttrackAlias: requestId,\n\t\t\t\tgroupId: final,\n\t\t\t\tsubGroupId: 0,\n\t\t\t\tpublisherPriority,\n\t\t\t\tflags: {\n\t\t\t\t\thasExtensions: false,\n\t\t\t\t\thasSubgroup: false,\n\t\t\t\t\thasSubgroupObject: false,\n\t\t\t\t\thasEnd: false,\n\t\t\t\t\thasPriority: true,\n\t\t\t\t\tfirstObject: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait header.encode(stream, version);\n\t\t\tawait new Frame({ endOfTrack: true }).encode(stream, header.flags, Timescale.MILLI, version);\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tstream.reset(error(err));\n\t\t}\n\t}\n\n\t/**\n\t * Serve a draft-20 fill on its own fetch stream: the requested range, read from the\n\t * group cache, capped at the Largest Object snapshot.\n\t *\n\t * A fill is a promise once requested. An empty range opens no stream, but a range we\n\t * cannot serve still opens one and resets it right after the FETCH_HEADER, the draft's\n\t * fill-failure signal. Nothing here touches the subscription either way.\n\t */\n\tasync #runFill(options: RunFill) {\n\t\tconst { requestId, fill, cache, timescale, stamped, unsubscribed, streams } = options;\n\t\tconst version = this.#session.version;\n\n\t\t// Everything is inside the try so the cache fork is released on every path out,\n\t\t// including a transport failure while opening the stream.\n\t\tlet stream: Writer | undefined;\n\t\ttry {\n\t\t\tif (fill.kind === \"empty\") return;\n\n\t\t\tstream = await Writer.tryOpen(this.#quic, { cancel: unsubscribed, version });\n\t\t\tif (!stream) {\n\t\t\t\tconsole.debug(`fill stream failed to open: fill=${requestId}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstreams.opened += 1;\n\n\t\t\tawait stream.u53(FetchHeader.type);\n\t\t\tawait new FetchHeader({ requestId }).encode(stream, version);\n\n\t\t\tif (fill.kind !== \"group\") {\n\t\t\t\tthrow new Error(\"a fill spanning several groups is not supported\");\n\t\t\t}\n\n\t\t\tconst group = takeGroup(cache, Number(fill.sequence));\n\t\t\ttry {\n\t\t\t\tawait this.#writeFillGroup(stream, group, fill, timescale, stamped, unsubscribed);\n\t\t\t} finally {\n\t\t\t\tgroup.close();\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t\tconsole.debug(`fill complete: fill=${requestId}`);\n\t\t} catch (err: unknown) {\n\t\t\t// A fill never fails the subscription; its own stream carries the failure.\n\t\t\tconst e = error(err);\n\t\t\tconsole.debug(`fill failed, resetting its stream: fill=${requestId} error=${reason(e)}`);\n\t\t\tstream?.reset(e);\n\t\t} finally {\n\t\t\tcache.close();\n\t\t}\n\t}\n\n\t/**\n\t * Write one cached group's frames as draft-20 fetch objects.\n\t *\n\t * The cap is the Largest Object snapshot: the group may keep growing, but everything\n\t * past the snapshot belongs to the subscription, not the fill.\n\t */\n\tasync #writeFillGroup(\n\t\tstream: Writer,\n\t\tgroup: group.Consumer,\n\t\tfill: FillGroup,\n\t\ttimescale: Timescale,\n\t\tstamped: boolean,\n\t\tunsubscribed: Promise<void>,\n\t) {\n\t\tlet first = true;\n\t\tlet next = 0n;\n\n\t\t// The subscriber leaving has to end the fill too. An absolute filter ending below the\n\t\t// edge with no end object leaves `until` unset, so this reads until the group closes,\n\t\t// which a still-open past group may never do. Watching only the fetch stream would\n\t\t// then pin the group and the cache subscription behind it for the life of the track.\n\t\tlet left = false;\n\t\tconst cancelled = unsubscribed.then(() => {\n\t\t\tleft = true;\n\t\t\treturn undefined;\n\t\t});\n\n\t\tfor (;;) {\n\t\t\t// The group may keep growing, but everything at `until` and beyond belongs to the\n\t\t\t// subscription, so stop without waiting for the group's end.\n\t\t\tif (fill.until !== undefined && next >= fill.until) break;\n\n\t\t\t// Reading from the fill's start drops everything below it; see the same read in #runGroup.\n\t\t\tconst frame = await race([group.readFrameSequence({ from: Number(fill.skip) }), stream.closed, cancelled]);\n\t\t\tif (left) throw new Error(\"unsubscribed before the fill finished\");\n\t\t\tif (!frame) break;\n\t\t\tnext = BigInt(frame.sequence) + 1n;\n\t\t\tif (fill.until !== undefined && BigInt(frame.sequence) >= fill.until) break;\n\n\t\t\tconst obj = new FetchFrame({ payload: frame.payload, timestamp: stamped ? frame.timestamp : undefined });\n\t\t\tawait obj.encode(\n\t\t\t\tstream,\n\t\t\t\t{ group: Number(fill.sequence), object: frame.sequence, first },\n\t\t\t\ttimescale,\n\t\t\t\tthis.#session.version,\n\t\t\t);\n\t\t\tfirst = false;\n\t\t}\n\t}\n\n\t/**\n\t * Handles an incoming SUBSCRIBE_NAMESPACE on a bidi stream.\n\t *\n\t * This carries the advertisements when the peer asked to be told on request (MoQ\n\t * Solicit); otherwise {@link runPublishNamespaces} has already announced everything\n\t * visible and repeating it here would leave the peer holding two sources for one\n\t * broadcast, so only the hidden namespaces it may see ride here (MoQ Hidden).\n\t * Draft-16+ streams Namespace entries inline; draft-14/15 predate those messages, so\n\t * each advertisement is a PUBLISH_NAMESPACE request of its own.\n\t *\n\t * @internal\n\t */\n\tasync runSubscribeNamespace(msg: SubscribeNamespace, stream: Stream) {\n\t\tconst version = this.#session.version;\n\t\tconst prefix = msg.namespace;\n\t\tconst legacy = version === Version.DRAFT_14 || version === Version.DRAFT_15;\n\n\t\t// Draft-14/15: the open PUBLISH_NAMESPACE request per advertised suffix.\n\t\tconst requests: Requests = new Map();\n\n\t\ttry {\n\t\t\t// Send OK response\n\t\t\tif (version === Version.DRAFT_14) {\n\t\t\t\tawait stream.writer.u53(SubscribeNamespaceOk.id);\n\t\t\t\tconst ok = new SubscribeNamespaceOk({ 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// Hidden namespaces are left out unless the peer opted in (MoQ Hidden). Unless the\n\t\t\t// peer asked to be told only on request, it has already heard everything visible\n\t\t\t// from the empty prefix unasked, so this stream carries only what that hid.\n\t\t\tconst carries = (covered: Path.Valid) =>\n\t\t\t\t(!this.#hidden || msg.hidden || !hiddenBelow(prefix, covered)) &&\n\t\t\t\t(this.#requiresSolicitation || (this.#hidden && hiddenBelow(Path.empty(), covered)));\n\n\t\t\t// Inline entries always land, and the receiver treats a repeated NAMESPACE as a\n\t\t\t// replacement, so repricing one is just sending it again, a new original\n\t\t\t// publisher included, as Rust does. Only a legacy PUBLISH_NAMESPACE request can\n\t\t\t// be declined.\n\t\t\tconst namespace = async (suffix: Path.Valid, snap: Advertised): Promise<Answer> => {\n\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntry.id);\n\t\t\t\tconst cluster = clusterFor(this.#advert, snap.route);\n\t\t\t\tawait new SubscribeNamespaceEntry({ suffix, cluster }).encode(stream.writer, version);\n\t\t\t\treturn \"held\";\n\t\t\t};\n\t\t\tconst target: Target = legacy\n\t\t\t\t? {\n\t\t\t\t\t\tadvertise: (suffix, snap) =>\n\t\t\t\t\t\t\tthis.#advertise(Path.join(prefix, suffix), requests, clusterFor(this.#advert, snap.route)),\n\t\t\t\t\t\tupdate: (suffix, _snap, reprice) => this.#update(Path.join(prefix, suffix), requests, reprice),\n\t\t\t\t\t\twithdraw: (suffix) => this.#withdraw(Path.join(prefix, suffix), requests),\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tadvertise: namespace,\n\t\t\t\t\t\tupdate: namespace,\n\t\t\t\t\t\twithdraw: async (suffix) => {\n\t\t\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntryDone.id);\n\t\t\t\t\t\t\tawait new SubscribeNamespaceEntryDone({ suffix }).encode(stream.writer, version);\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t// Keyed by suffix, as the entries name them.\n\t\t\tconst ns: Namespaces = { active: new Map(), refused: new Map(), offered: new Map() };\n\t\t\tlet retry = 0;\n\n\t\t\tfor (;;) {\n\t\t\t\t// Subscribe BEFORE reconciling, for the same reason as\n\t\t\t\t// {@link runPublishNamespaces}: a publish landing while an advertisement\n\t\t\t\t// waits for its reply only notifies listeners already registered.\n\t\t\t\t// TODO Make a better helper within Signals.\n\t\t\t\tlet dispose!: Dispose;\n\t\t\t\tconst changed = new Promise<Advertisements | undefined>((resolve) => {\n\t\t\t\t\tdispose = this.#advertised.changed(resolve);\n\t\t\t\t});\n\n\t\t\t\tconst advertised = this.#advertised.peek();\n\t\t\t\tif (!advertised) {\n\t\t\t\t\tdispose();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst outstanding = await this.#reconcile(ns, presented(prefix, advertised, carries), target);\n\t\t\t\tretry = outstanding ? Math.min(retry ? retry * 2 : RETRY_BASE, RETRY_MAX) : 0;\n\n\t\t\t\t// Wait for the next change, or for the peer to unsubscribe.\n\t\t\t\tconst next = await (retry\n\t\t\t\t\t? race([changed, stream.reader.closed, retryAfter(retry).then(() => advertised)])\n\t\t\t\t\t: race([changed, stream.reader.closed]));\n\t\t\t\tdispose();\n\t\t\t\tif (!next) break;\n\t\t\t}\n\n\t\t\tstream.close();\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.debug(`subscribe_namespace stream error: ${reason(e)}`);\n\t\t\tstream.abort(e);\n\t\t} finally {\n\t\t\t// This subscription's advertisements die with it.\n\t\t\tfor (const path of [...requests.keys()]) {\n\t\t\t\tawait this.#withdraw(path, requests);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Advertise every published broadcast with an unsolicited PUBLISH_NAMESPACE, until\n\t * the publisher is closed.\n\t *\n\t * The peers that never send SUBSCRIBE_NAMESPACE are exactly the ones expecting a\n\t * publisher to announce itself, so announcing is the default. A peer that would\n\t * rather ask says so in its SETUP (MoQ Solicit) and this does nothing, leaving\n\t * {@link runSubscribeNamespace} to carry the advertisements instead. Exactly one of\n\t * the two is live, so the peer never hears a namespace twice.\n\t *\n\t * @internal\n\t */\n\tasync runPublishNamespaces() {\n\t\tif (this.#requiresSolicitation) {\n\t\t\t// The peer asked to be told on request; runSubscribeNamespace answers it.\n\t\t\treturn;\n\t\t}\n\n\t\t// The open PUBLISH_NAMESPACE request per advertised path.\n\t\tconst requests: Requests = new Map();\n\t\tconst target: Target = {\n\t\t\tadvertise: (path, snap) => this.#advertise(path, requests, clusterFor(this.#advert, snap.route)),\n\t\t\tupdate: (path, _snap, reprice) => this.#update(path, requests, reprice),\n\t\t\twithdraw: (path) => this.#withdraw(path, requests),\n\t\t};\n\n\t\t// The origin outlives the session and its signal never ends, so this loop needs the\n\t\t// session's own ending to stop: without it a closed connection leaves the loop parked\n\t\t// on a shared origin forever, waking on someone else's publish to fail on a dead\n\t\t// transport. `runSubscribeNamespace` gets this from the stream the peer asked on; an\n\t\t// unsolicited loop has no stream of its own, so the session is what it watches.\n\t\tconst closed = this.#quic.closed.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\n\t\tlet dispose: Dispose | undefined;\n\t\ttry {\n\t\t\t// Keyed by path.\n\t\t\tconst ns: Namespaces = { active: new Map(), refused: new Map(), offered: new Map() };\n\t\t\tlet retry = 0;\n\n\t\t\tfor (;;) {\n\t\t\t\t// Subscribe BEFORE reconciling. Each advertisement below waits a round trip\n\t\t\t\t// for the peer's reply, and a publish that lands in that window notifies\n\t\t\t\t// only the listeners already registered; one created afterwards would sleep\n\t\t\t\t// through it and leave the namespace unadvertised until something unrelated\n\t\t\t\t// changed.\n\t\t\t\t// TODO Make a better helper within Signals.\n\t\t\t\tconst changed = new Promise<Advertisements | undefined>((resolve) => {\n\t\t\t\t\tdispose = this.#advertised.changed(resolve);\n\t\t\t\t});\n\n\t\t\t\tconst advertised = this.#advertised.peek();\n\t\t\t\tif (!advertised) {\n\t\t\t\t\tdispose?.();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst updated = new Map<Path.Valid, Advertised>();\n\t\t\t\tfor (const [covered, candidates] of advertised) {\n\t\t\t\t\t// Only peers that declared MoQ Hidden filter unsolicited discovery.\n\t\t\t\t\tif ((this.#hidden && hiddenBelow(Path.empty(), covered)) || candidates.length === 0) continue;\n\t\t\t\t\tupdated.set(covered, candidates[0]);\n\t\t\t\t}\n\n\t\t\t\tconst outstanding = await this.#reconcile(ns, updated, target);\n\t\t\t\tretry = outstanding ? Math.min(retry ? retry * 2 : RETRY_BASE, RETRY_MAX) : 0;\n\n\t\t\t\t// Wait for the next change, which has already fired if one landed above.\n\t\t\t\tconst next = await (retry\n\t\t\t\t\t? race([changed, closed, retryAfter(retry).then(() => advertised)])\n\t\t\t\t\t: race([changed, closed]));\n\t\t\t\tdispose?.();\n\t\t\t\tif (!next) break;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\t// Nothing restarts this loop, so whatever got us here cost the session its\n\t\t\t// discovery. Not a debug-level event.\n\t\t\tconsole.warn(`publish_namespace loop failed: ${reason(error(err))}`);\n\t\t} finally {\n\t\t\tdispose?.();\n\t\t\t// Close out every open PUBLISH_NAMESPACE request.\n\t\t\tfor (const path of [...requests.keys()]) {\n\t\t\t\tawait this.#withdraw(path, requests);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Bring the peer's view in line with `updated`, one namespace at a time, and report\n\t * whether anything it should hold is still missing and worth coming back for.\n\t *\n\t * Nothing the peer cannot see is sent, a reprice updates the namespace in place, and\n\t * anything else is withdrawn first so a republish reads as withdraw-then-advertise.\n\t * `ns` records what the peer holds rather than what we attempted: a declined\n\t * advertisement or update stays out of it, so the next turn offers it fresh instead\n\t * of believing it is already up.\n\t */\n\tasync #reconcile(ns: Namespaces, updated: Map<Path.Valid, Advertised>, target: Target): Promise<boolean> {\n\t\t// A namespace that is gone, or that a republish replaced, takes its refusal with\n\t\t// it: the peer refused a broadcast, not a path forever, so a different one at the\n\t\t// same path is offered again. The origin swaps the front in one mutation, so the\n\t\t// path never leaves `updated` and only the front says they differ. Rust gets this\n\t\t// by rebuilding the watched entry.\n\t\tfor (const key of [...ns.refused.keys()]) {\n\t\t\tconst snap = updated.get(key);\n\t\t\tif (snap === undefined || ns.offered.get(key) !== snap.identity) {\n\t\t\t\tns.refused.delete(key);\n\t\t\t\tns.offered.delete(key);\n\t\t\t}\n\t\t}\n\n\t\tconst held = new Map(ns.active);\n\t\tfor (const [key, snap] of ns.active) {\n\t\t\tif (change(this.#advert, snap, updated.get(key)) !== \"restart\") continue;\n\t\t\tawait target.withdraw(key);\n\t\t\theld.delete(key);\n\t\t}\n\n\t\tfor (const [key, snap] of updated) {\n\t\t\tconst prev = held.get(key);\n\t\t\tconst diff = change(this.#advert, prev, snap);\n\t\t\tif (diff === \"same\") continue;\n\n\t\t\tlet answer: Answer;\n\t\t\tif (prev !== undefined && diff !== \"restart\") {\n\t\t\t\tanswer = await target.update(key, snap, diff);\n\t\t\t} else {\n\t\t\t\t// A fresh offer waits for what a refusal asked for, whatever brought us back.\n\t\t\t\tif (!this.#offerable(key, ns.refused)) continue;\n\t\t\t\tanswer = await target.advertise(key, snap);\n\t\t\t}\n\t\t\t// `offered` pairs with `refused`, so a held or withdrawn path leaves nothing behind.\n\t\t\tif (answer === \"held\") {\n\t\t\t\theld.set(key, snap);\n\t\t\t\tns.refused.delete(key);\n\t\t\t\tns.offered.delete(key);\n\t\t\t} else {\n\t\t\t\theld.delete(key);\n\t\t\t\tif (answer !== \"dropped\") {\n\t\t\t\t\tns.refused.set(key, answer);\n\t\t\t\t\tns.offered.set(key, snap.identity);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tns.active = held;\n\n\t\t// Whatever we wanted up and could not get up. Stream credit freeing, a transient\n\t\t// failure clearing, or the peer starting to answer raises no signal of its own, so\n\t\t// the only way back is to ask again on a timer.\n\t\treturn [...updated].some(\n\t\t\t([key, snap]) => change(this.#advert, held.get(key), snap) !== \"same\" && this.#pending(key, ns.refused),\n\t\t);\n\t}\n\n\t/**\n\t * Whether a namespace may be offered to the peer right now.\n\t *\n\t * A peer that asked never to be offered it again means it, whatever brought us back;\n\t * one that named a minimum wait gets it, even when our own backoff comes round sooner.\n\t */\n\t#offerable(key: Path.Valid, refused: Map<Path.Valid, Refused>): boolean {\n\t\tconst entry = refused.get(key);\n\t\tif (entry === undefined) return true;\n\t\treturn entry !== \"never\" && Date.now() >= entry;\n\t}\n\n\t/**\n\t * Whether the loop should keep coming back to a namespace the peer does not hold.\n\t *\n\t * Distinct from {@link offerable}, and the difference is what arms the retry: a\n\t * namespace waiting out a minimum is not offerable yet but is still pending, and\n\t * gating the timer on offerable instead would disarm it for exactly the wait it is\n\t * supposed to be counting. Only a refusal that forbids retrying ends it.\n\t */\n\t#pending(key: Path.Valid, refused: Map<Path.Valid, Refused>): boolean {\n\t\treturn refused.get(key) !== \"never\";\n\t}\n\n\t/**\n\t * What a REQUEST_ERROR's retry interval, in milliseconds, says about re-offering the\n\t * namespace.\n\t *\n\t * Draft-14/15 carry no such field, so a 0 there says nothing and our own backoff\n\t * stands; everywhere else 0 means the peer does not want this again.\n\t */\n\t#refusal(err: RequestError): Answer {\n\t\tconst version = this.#session.version;\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15) return \"dropped\";\n\t\treturn err.retryInterval === 0n ? \"never\" : Date.now() + Number(err.retryInterval);\n\t}\n\n\t/**\n\t * Advertise one namespace on its own PUBLISH_NAMESPACE request. A declined request\n\t * is logged and skipped: a peer that wants none of this rejects each one and stays\n\t * connected.\n\t */\n\tasync #advertise(\n\t\tpath: Path.Valid,\n\t\trequests: Requests,\n\t\tcluster: Cluster.Advert | undefined = this.#advert,\n\t): Promise<Answer> {\n\t\tconst requestId = await this.#session.nextRequestId();\n\t\tif (requestId === undefined) return \"dropped\";\n\n\t\t// Opening is inside the try because it fails like any other advertisement does:\n\t\t// a peer out of stream credit rejects here, and letting that escape would unwind\n\t\t// the announce loop and take discovery down for the whole session, rather than\n\t\t// costing this one namespace a turn.\n\t\tlet request: Stream | undefined;\n\t\ttry {\n\t\t\trequest = await this.#session.openBi();\n\t\t\tconst stream = request;\n\n\t\t\t// Bounded, like the subscriber's own request: the loop is single-threaded over\n\t\t\t// advertisements, so a peer that takes the stream and answers nothing strands\n\t\t\t// every publish and withdrawal behind it. Timing out costs this namespace a\n\t\t\t// turn and leaves it outstanding, which the retry above re-offers.\n\t\t\tconst answer = await withTimeout(\n\t\t\t\t(async (): Promise<Answer> => {\n\t\t\t\t\tawait stream.writer.u53(PublishNamespace.id);\n\t\t\t\t\tconst msg = new PublishNamespace({ requestId, trackNamespace: path, cluster });\n\t\t\t\t\tawait msg.encode(stream.writer, this.#session.version);\n\n\t\t\t\t\t// Read response (RequestOk and PublishNamespaceOk share 0x07)\n\t\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\t\tif (respTypeId === RequestError.id) {\n\t\t\t\t\t\tconst err = await RequestError.decode(stream.reader, this.#session.version);\n\t\t\t\t\t\tconst why = requestReason(\n\t\t\t\t\t\t\terr.errorCode,\n\t\t\t\t\t\t\terr.reasonPhrase,\n\t\t\t\t\t\t\t\"publish_namespace\",\n\t\t\t\t\t\t\tthis.#session.version,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.warn(`announce refused: broadcast=${path} error=${why}`);\n\t\t\t\t\t\tstream.abort(new Error(`PublishNamespace rejected: ${why}`));\n\t\t\t\t\t\treturn this.#refusal(err);\n\t\t\t\t\t}\n\t\t\t\t\tif (respTypeId !== RequestOk.id) {\n\t\t\t\t\t\tthrow new Error(`PublishNamespace rejected: typeId=0x${respTypeId.toString(16)}`);\n\t\t\t\t\t}\n\t\t\t\t\t// Draft-14 sends PublishNamespaceOk (requestId only, no parameters)\n\t\t\t\t\tif (this.#session.version === Version.DRAFT_14) {\n\t\t\t\t\t\tawait PublishNamespaceOk.decode(stream.reader, this.#session.version);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait RequestOk.decode(stream.reader, this.#session.version);\n\t\t\t\t\t}\n\t\t\t\t\treturn \"held\";\n\t\t\t\t})(),\n\t\t\t\tADVERTISE_TIMEOUT_MS,\n\t\t\t\t`advertisement timed out after ${ADVERTISE_TIMEOUT_MS}ms waiting for the peer's answer`,\n\t\t\t);\n\n\t\t\tif (answer === \"held\") requests.set(path, { path, requestId, stream });\n\t\t\treturn answer;\n\t\t} catch (err: unknown) {\n\t\t\t// The peer never answered the advertisement: a control timeout, not late content.\n\t\t\tconst e = err instanceof TimeoutError ? controlTimeout(err) : error(err);\n\t\t\tconsole.warn(`announce failed: broadcast=${path} error=${reason(e)}`);\n\t\t\trequest?.abort(e);\n\t\t\treturn \"dropped\";\n\t\t}\n\t}\n\n\t/**\n\t * Update a namespace the peer holds: REQUEST_UPDATE on the request that carries it,\n\t * with only the parameters that changed, then its answer.\n\t *\n\t * Waiting for the answer keeps one update outstanding per stream, which satisfies any\n\t * MAX_REQUEST_UPDATES the peer set without reading it; a change landing meanwhile waits\n\t * for the next turn. The answer decides whether the peer still holds the namespace: a\n\t * REQUEST_ERROR closes the peer's side and withdraws the advertisement, so ours is\n\t * finished too, and an unanswered update is dropped abruptly, since a peer that ignored\n\t * it cannot be assumed to hold either price. Either way the retry re-offers it fresh.\n\t *\n\t * A different original publisher is an update like any other: the receiver drains what\n\t * it already serves from the old one and never splices the two.\n\t */\n\tasync #update(path: Path.Valid, requests: Requests, { from, to }: Reprice): Promise<Answer> {\n\t\tconst request = requests.get(path);\n\t\tif (!request) return \"dropped\";\n\n\t\tconst update: Cluster.Update = {\n\t\t\thops: sameHops(from.hops, to.hops) ? undefined : to.hops,\n\t\t\tcost: from.cost === to.cost ? undefined : to.cost,\n\t\t};\n\t\tconst version = this.#session.version;\n\t\tlet answer: Answer;\n\t\ttry {\n\t\t\tconst requestId = await this.#session.nextRequestId();\n\t\t\tif (requestId === undefined) throw new Error(\"no request ID for the update\");\n\n\t\t\tanswer = await withTimeout(\n\t\t\t\t(async (): Promise<Answer> => {\n\t\t\t\t\tconst { writer, reader } = request.stream;\n\t\t\t\t\tawait writer.u53(PublishNamespaceUpdate.id);\n\t\t\t\t\tawait new PublishNamespaceUpdate({ requestId, update }).encode(writer, version);\n\n\t\t\t\t\tconst typeId = await reader.u53();\n\t\t\t\t\tif (typeId === RequestError.id) {\n\t\t\t\t\t\tconst err = await RequestError.decode(reader, version);\n\t\t\t\t\t\tconst why = requestReason(err.errorCode, err.reasonPhrase, \"publish_namespace\", version);\n\t\t\t\t\t\tconsole.warn(`publish_namespace update refused: broadcast=${path} error=${why}`);\n\t\t\t\t\t\treturn this.#refusal(err);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeId !== RequestOk.id) {\n\t\t\t\t\t\tthrow new Error(`unexpected answer to the update: typeId=0x${typeId.toString(16)}`);\n\t\t\t\t\t}\n\t\t\t\t\tawait RequestOk.decode(reader, version);\n\t\t\t\t\treturn \"held\";\n\t\t\t\t})(),\n\t\t\t\tADVERTISE_TIMEOUT_MS,\n\t\t\t\t`update timed out after ${ADVERTISE_TIMEOUT_MS}ms waiting for the peer's answer`,\n\t\t\t);\n\t\t} catch (err: unknown) {\n\t\t\tconst e = err instanceof TimeoutError ? controlTimeout(err) : error(err);\n\t\t\tconsole.warn(`publish_namespace update failed: broadcast=${path} error=${reason(e)}`);\n\t\t\trequests.delete(path);\n\t\t\trequest.stream.abort(e);\n\t\t\treturn \"dropped\";\n\t\t}\n\n\t\t// The peer already closed out a refused request, and its STOP_SENDING can reject the\n\t\t// wait on our FIN. That is the withdrawal finishing, not a reason to end the loop.\n\t\tif (answer !== \"held\") await this.#withdraw(path, requests).catch(() => undefined);\n\t\treturn answer;\n\t}\n\n\t/**\n\t * Close out a namespace's PUBLISH_NAMESPACE request with PUBLISH_NAMESPACE_DONE.\n\t */\n\tasync #withdraw(path: Path.Valid, requests: Requests) {\n\t\tconst request = requests.get(path);\n\t\tif (!request) return;\n\t\trequests.delete(path);\n\n\t\t// Draft-17+ removed PUBLISH_NAMESPACE_DONE: the close below is the whole\n\t\t// withdrawal. Sending it anyway puts the type on the wire before the body throws,\n\t\t// and a receiver reading 0x09 there has no choice but to treat it as a protocol\n\t\t// violation.\n\t\tconst version = this.#session.version;\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\ttry {\n\t\t\t\tawait request.stream.writer.u53(PublishNamespaceDone.id);\n\t\t\t\tconst done = new PublishNamespaceDone({ trackNamespace: request.path, requestId: request.requestId });\n\t\t\t\tawait done.encode(request.stream.writer, version);\n\t\t\t} catch {\n\t\t\t\t// Stream might already be closed\n\t\t\t}\n\t\t\trequest.stream.close();\n\t\t\treturn;\n\t\t}\n\t\trequest.stream.close();\n\t\t// Wait for transport acknowledgment before opening a replacement request.\n\t\t// This assumes the peer processes the withdrawal by then; FIN acknowledgment\n\t\t// does not itself acknowledge application processing across streams.\n\t\tawait request.stream.writer.closed;\n\t}\n\n\t/**\n\t * Handles an incoming TRACK_STATUS_REQUEST on a bidi stream.\n\t *\n\t * @internal\n\t */\n\tasync runTrackStatusRequest(msg: TrackStatusRequest, stream: Stream) {\n\t\t// TRACK_STATUS_ERROR is 0x0f on draft-14.\n\t\tawait this.#refuseUnsupported(stream, msg.requestId, \"track_status\", 0x0f, \"TRACK_STATUS is not supported\");\n\t}\n\n\t/**\n\t * Handles an incoming FETCH on a bidi stream. We serve none.\n\t *\n\t * @internal\n\t */\n\tasync runFetch(msg: Fetch, stream: Stream) {\n\t\tawait this.#refuseUnsupported(stream, msg.requestId, \"fetch\", FetchError.id, \"FETCH is not supported\");\n\t}\n\n\t/**\n\t * Refuse a request NOT_SUPPORTED. Draft-14 gives each request its own error message,\n\t * `errorId14`, with the SUBSCRIBE_ERROR body; later drafts use REQUEST_ERROR.\n\t */\n\tasync #refuseUnsupported(\n\t\tstream: Stream,\n\t\trequestId: bigint,\n\t\tkind: RequestKind,\n\t\terrorId14: number,\n\t\treasonPhrase: string,\n\t) {\n\t\tconst version = this.#session.version;\n\t\tconst errorCode = toRequestCode(\"not_supported\", kind, version);\n\t\tif (version === Version.DRAFT_14) {\n\t\t\tawait stream.writer.u53(errorId14);\n\t\t\tawait new SubscribeError({ requestId, errorCode, reasonPhrase }).encode(stream.writer, version);\n\t\t} else {\n\t\t\tawait stream.writer.u53(RequestError.id);\n\t\t\tawait new RequestError({\n\t\t\t\trequestId: version === Version.DRAFT_15 || version === Version.DRAFT_16 ? requestId : undefined,\n\t\t\t\terrorCode,\n\t\t\t\treasonPhrase,\n\t\t\t}).encode(stream.writer, version);\n\t\t}\n\t\tstream.close();\n\t}\n}\n\n/** A `{group, object}` position, in the Location Filter's own units. */\ninterface Location {\n\t/** The group's sequence number. */\n\tgroup: bigint;\n\t/** The object's id within that group. */\n\tobject: bigint;\n}\n\n/** Where a range ends, inclusive. An absent `object` includes the whole end group. */\ninterface EndLocation {\n\t/** The last group to serve. */\n\tgroup: bigint;\n\t/** The last object within it, or the whole group when absent. */\n\tobject?: bigint;\n}\n\n/**\n * The live edge a SUBSCRIBE resolves against, snapshotted once so the subscription floor,\n * the fill cap, and the advertised LARGEST_OBJECT all agree on where it is.\n */\ninterface LiveEdge {\n\t/** The newest group sequence, absent before any group exists. */\n\tlatest?: bigint;\n\n\t/**\n\t * The precise Largest Object. Absent when the track has no readable frame, in which case\n\t * nothing is advertised and no fill is servable.\n\t */\n\tlargest?: Location;\n\n\t/**\n\t * One past the Largest Object, which is where a Next Object subscription begins. With no\n\t * readable object anywhere this falls back to the newest group's start, which excludes\n\t * nothing the cache can still name.\n\t */\n\tnext?: Location;\n}\n\n/** The Locations a SUBSCRIBE's Location Filter selects, resolved against the live edge. */\ninterface ServeRange {\n\t/** The first Location to serve, or the start of the latest group when absent. */\n\tstart?: Location;\n\n\t/**\n\t * Where the range ends, inclusive, or open ended when absent. The subscription stays open\n\t * once the range is exhausted; draft-20 removed the notion of a filter ending one.\n\t */\n\tend?: EndLocation;\n}\n\n/** The slice of one group a subscription's {@link ServeRange} selects. */\ninterface GroupSlice {\n\t/** Objects dropped from the front; also the first written object's absolute id. */\n\tskip: number;\n\n\t/** One past the last object to write, when the filter ends inside this group. */\n\tuntil?: number;\n}\n\n/** A fill resolved to a single group of the cache. */\ninterface FillGroup {\n\tkind: \"group\";\n\t/** The group to serve. */\n\tsequence: bigint;\n\t/** Objects dropped from the front. */\n\tskip: bigint;\n\t/** One past the last object to write, capping the fill at the Largest Object snapshot. */\n\tuntil?: bigint;\n}\n\n/** What a draft-20 fill request resolves to. */\ntype FillServe =\n\t/** The range is empty, so no fetch stream is opened at all. */\n\t| { kind: \"empty\" }\n\t| FillGroup\n\t/**\n\t * A range spanning several groups, which we do not serve: multi-group fetch\n\t * serialization depends on a negotiated group order we do not implement, so the stream is\n\t * reset instead, the draft's fill-failure signal.\n\t */\n\t| { kind: \"unsupported\" };\n\n/**\n * Take one group out of a cache view, without waiting.\n *\n * A fill's group is at or below the Largest Object snapshot, so it is either still in the\n * retained window or gone for good: nothing republishes an old sequence, and waiting for one\n * would park for the life of the track. Scanning past it, or running dry, is a cache miss,\n * which the caller turns into the draft's fill-failure reset.\n */\nfunction takeGroup(cache: TrackSubscriber, sequence: number): group.Consumer {\n\tfor (;;) {\n\t\tconst group = cache.tryRecvGroup();\n\t\tif (!group) throw new Error(`group not found: ${sequence}`);\n\t\tif (group.sequence === sequence) return group;\n\n\t\tgroup.close();\n\t\tif (group.sequence > sequence) throw new Error(`group not found: ${sequence}`);\n\t}\n}\n\n/** `a - b`, saturating at zero the way the draft's unsigned arithmetic does. */\nfunction saturatingSub(a: bigint, b: bigint): bigint {\n\treturn a > b ? a - b : 0n;\n}\n\n/** Snapshot the live edge of a track. */\nfunction liveEdge(track: TrackSubscriber): LiveEdge {\n\tconst latest = track.latest();\n\tif (latest === undefined) return {};\n\n\tconst largest = track.largest();\n\tif (!largest) return { latest: BigInt(latest), next: { group: BigInt(latest), object: 0n } };\n\n\tconst group = BigInt(largest.group);\n\tconst object = BigInt(largest.frame);\n\treturn { latest: BigInt(latest), largest: { group, object }, next: { group, object: object + 1n } };\n}\n\n/**\n * Resolve a SUBSCRIBE's Location Filter into the range to serve.\n *\n * Only draft-20 is honored. Earlier drafts have a Filter Type tag whose absolute forms we\n * never served, and starting to interpret them now would change what an existing peer\n * receives; draft-20 is also the first version whose relative forms can name a past group\n * without the subscriber knowing Largest Object.\n */\nfunction subscribeRange(msg: Subscribe, edge: LiveEdge, version: IetfVersion): ServeRange {\n\tif (!Filter.isDraft20(version)) {\n\t\tif (msg.filter.kind !== \"nextObject\" && msg.filter.kind !== \"unfiltered\") {\n\t\t\tconsole.warn(`filter not supported before draft-20, ignoring: ${msg.filter.kind}`);\n\t\t}\n\t\treturn {};\n\t}\n\n\treturn filterRange(msg.filter, edge);\n}\n\n/** The Locations a single Location Filter selects, resolved against the live edge. */\nfunction filterRange(filter: Filter.Filter, edge: LiveEdge): ServeRange {\n\tswitch (filter.kind) {\n\t\t// No restriction. moq-lite starts at the beginning of the latest group, which is the\n\t\t// join point it is built around; a subscription passes objects as they are published,\n\t\t// so an absent filter is not a request to replay history.\n\t\tcase \"unfiltered\":\n\t\t\treturn {};\n\t\t// `{Largest.Group, Largest.Object + 1}`. Everything below it, including the already\n\t\t// published head of the current group, is outside the requested range, so the join is\n\t\t// mid-group by construction. The draft pairs this with a fill when the subscriber\n\t\t// wants the head; see {@link Publisher.runFill}.\n\t\tcase \"nextObject\":\n\t\t\treturn { start: edge.next };\n\t\t// `{Largest.Group + 1 - groups, 0}`: 0 is the next group and 1 is the current one.\n\t\t// Counted from `Largest.Group`, which sits below the newest group while that group has\n\t\t// no objects yet; only with no largest at all does the newest group stand in for it.\n\t\tcase \"relative\": {\n\t\t\tconst base = edge.largest?.group ?? edge.latest;\n\t\t\tif (base === undefined) return {};\n\t\t\treturn { start: { group: saturatingSub(base + 1n, filter.groups), object: 0n } };\n\t\t}\n\t\tcase \"absolute\":\n\t\t\treturn {\n\t\t\t\tstart: { group: filter.startGroup, object: filter.startObject },\n\t\t\t\tend: filter.endGroup === undefined ? undefined : { group: filter.endGroup, object: filter.endObject },\n\t\t\t};\n\t}\n}\n\n/**\n * Trim a group to the filter's object bounds, so nothing outside the requested range is\n * sent. Interior groups are served whole.\n */\nfunction groupSlice(range: ServeRange, sequence: number): GroupSlice {\n\tconst at = BigInt(sequence);\n\treturn {\n\t\tskip: range.start?.group === at ? Number(range.start.object) : 0,\n\t\tuntil: range.end?.group === at && range.end.object !== undefined ? Number(range.end.object) + 1 : undefined,\n\t};\n}\n\n/**\n * Resolve a fill request using the Fetch rules: relative to Largest Object and never\n * extending beyond it. An omitted Location Filter inherits the subscription's.\n */\nfunction fillRange(fill: Filter.Fill, subscription: Filter.Filter, largest?: Location): FillServe {\n\t// A Range Filter narrows which objects pass, which we do not implement; serving the\n\t// unfiltered range instead would deliver objects the peer excluded, so refuse it.\n\tif (fill.rangeFilters) return { kind: \"unsupported\" };\n\tconst filter = fill.filter ?? subscription;\n\n\t// Nothing published (or no precise edge to cap at) means no fill is servable; an empty\n\t// range opens no stream.\n\tif (!largest) return { kind: \"empty\" };\n\n\tlet start: Location;\n\tswitch (filter.kind) {\n\t\t// A Fetch without a filter is the whole track up to Largest Object.\n\t\tcase \"unfiltered\":\n\t\t\tstart = { group: 0n, object: 0n };\n\t\t\tbreak;\n\t\t// One past the edge, which for a Fetch is always empty.\n\t\tcase \"nextObject\":\n\t\t\treturn { kind: \"empty\" };\n\t\tcase \"relative\":\n\t\t\tstart = { group: saturatingSub(largest.group + 1n, filter.groups), object: 0n };\n\t\t\tbreak;\n\t\tcase \"absolute\":\n\t\t\tstart = { group: filter.startGroup, object: filter.startObject };\n\t\t\tbreak;\n\t}\n\n\t// Cap the requested end at Largest Object.\n\tlet end: EndLocation = { group: largest.group, object: largest.object };\n\tif (filter.kind === \"absolute\" && filter.endGroup !== undefined) {\n\t\tconst below =\n\t\t\tfilter.endGroup < largest.group ||\n\t\t\t(filter.endGroup === largest.group && filter.endObject !== undefined && filter.endObject < largest.object);\n\t\tif (below) end = { group: filter.endGroup, object: filter.endObject };\n\t}\n\n\tif (\n\t\tstart.group > end.group ||\n\t\t(start.group === end.group && end.object !== undefined && end.object < start.object)\n\t) {\n\t\treturn { kind: \"empty\" };\n\t}\n\tif (start.group !== end.group) return { kind: \"unsupported\" };\n\n\treturn {\n\t\tkind: \"group\",\n\t\tsequence: start.group,\n\t\tskip: start.object,\n\t\tuntil: end.object === undefined ? undefined : end.object + 1n,\n\t};\n}\n"]}
|
package/ietf/solicit.d.ts
CHANGED
|
@@ -1,41 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* The MoQ Solicit extension (draft-lcurley-moq-solicit-00).
|
|
4
|
-
*
|
|
5
|
-
* moq-transport says nothing about whether an endpoint expects to be told what we have or
|
|
6
|
-
* to ask for it, so a publisher that waits to be asked is silent against a relay that
|
|
7
|
-
* never asks. This extension lets an endpoint declare, in its SETUP, that advertisements
|
|
8
|
-
* to it must be solicited first.
|
|
9
|
-
*
|
|
10
|
-
* Declaring nothing means "no requirement, tell me unasked", which is what a peer that has
|
|
11
|
-
* never heard of the extension implicitly says.
|
|
12
|
-
*
|
|
13
|
-
* @module
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* What the peer declared, if anything.
|
|
18
|
-
*
|
|
19
|
-
* The three states are distinct, and the difference between the last two is what makes the
|
|
20
|
-
* requirement enforceable:
|
|
21
|
-
*
|
|
22
|
-
* - `undefined`: no option at all. The peer has never heard of the extension, so it cannot
|
|
23
|
-
* have honored ours and an unsolicited advertisement from it is expected.
|
|
24
|
-
* - `false`: an explicit 0. No requirement of its own, but writing the option at all proves
|
|
25
|
-
* it implements this, so it is held to ours.
|
|
26
|
-
* - `true`: advertisements to it must be solicited, and likewise held to ours.
|
|
27
|
-
*
|
|
28
|
-
* @internal
|
|
29
|
-
*/
|
|
30
|
-
export declare function solicitFromSetup(params: SetupOptions): boolean | undefined;
|
|
31
|
-
/**
|
|
32
|
-
* Declare that advertisements to us must be solicited.
|
|
33
|
-
*
|
|
34
|
-
* Unconditional, and true of every session: we send SUBSCRIBE_NAMESPACE for each prefix
|
|
35
|
-
* we want, so there is nothing an unsolicited PUBLISH_NAMESPACE could tell us that we
|
|
36
|
-
* will not have asked for.
|
|
37
|
-
*
|
|
38
|
-
* @internal
|
|
39
|
-
*/
|
|
40
|
-
export declare function solicitIntoSetup(params: SetupOptions): void;
|
|
1
|
+
export {};
|
|
41
2
|
//# sourceMappingURL=solicit.d.ts.map
|
package/ietf/solicit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solicit.d.ts","sourceRoot":"","sources":["../../src/ietf/solicit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"solicit.d.ts","sourceRoot":"","sources":["../../src/ietf/solicit.ts"],"names":[],"mappings":""}
|
package/ietf/subscribe.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { type IetfVersion } from "./version";
|
|
|
9
9
|
*
|
|
10
10
|
* moq-lite joins at the start of the current group, which is a decodable point, and
|
|
11
11
|
* draft-20's relative form is the first that can name it without knowing Largest Object.
|
|
12
|
-
* Earlier drafts
|
|
12
|
+
* Earlier drafts request unfiltered delivery because this client does not send joining FETCH.
|
|
13
13
|
*/
|
|
14
14
|
export declare function joinFilter(version: IetfVersion): Filter.Filter;
|
|
15
15
|
export declare class Subscribe {
|
|
@@ -25,7 +25,11 @@ export declare class Subscribe {
|
|
|
25
25
|
fill?: Filter.Fill;
|
|
26
26
|
/** Whether the subscriber wants Track Properties on the response (INCLUDE_PROPERTIES). */
|
|
27
27
|
propertiesWanted: boolean;
|
|
28
|
-
|
|
28
|
+
/** Whether Objects are forwarded (FORWARD). We only serve forwarding subscriptions. */
|
|
29
|
+
forward: boolean;
|
|
30
|
+
/** Whether the request carried a Range Filter, which we refuse. Never encoded. */
|
|
31
|
+
rangeFilters: boolean;
|
|
32
|
+
constructor({ requestId, trackNamespace, trackName, subscriberPriority, filter, fill, propertiesWanted, forward, rangeFilters, }: {
|
|
29
33
|
requestId: bigint;
|
|
30
34
|
trackNamespace: Path.Valid;
|
|
31
35
|
trackName: string;
|
|
@@ -33,6 +37,8 @@ export declare class Subscribe {
|
|
|
33
37
|
filter?: Filter.Filter;
|
|
34
38
|
fill?: Filter.Fill;
|
|
35
39
|
propertiesWanted?: boolean;
|
|
40
|
+
forward?: boolean;
|
|
41
|
+
rangeFilters?: boolean;
|
|
36
42
|
});
|
|
37
43
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
38
44
|
static decode(r: Reader, version: IetfVersion): Promise<Subscribe>;
|
|
@@ -45,10 +51,6 @@ export declare class SubscribeOk {
|
|
|
45
51
|
/**
|
|
46
52
|
* The largest Location in the track (LARGEST_OBJECT), which the draft requires once the
|
|
47
53
|
* track has content. It is what a subscriber sizes a fill against.
|
|
48
|
-
*
|
|
49
|
-
* Encoded on draft-20 only: the parameter is legal on earlier drafts too, but peers built
|
|
50
|
-
* before we sent it reject an unexpected SUBSCRIBE_OK parameter by closing the session,
|
|
51
|
-
* so emitting it there would break existing deployments over a hint.
|
|
52
54
|
*/
|
|
53
55
|
largest: MessageLocation | undefined;
|
|
54
56
|
/**
|
package/ietf/subscribe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/ietf/subscribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAGtC,OAAO,EAAE,KAAK,eAAe,EAAc,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,cAAc,CAAC;AAKzD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,CAE9D;AAED,qBAAa,SAAS;;IACrB,MAAM,CAAC,EAAE,SAAQ;IAEjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAE3B,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;IAEtB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;IAEnB,0FAA0F;IAC1F,gBAAgB,EAAE,OAAO,CAAC;IAE1B,YAAY,EACX,SAAS,EACT,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,IAAI,EACJ,gBAAgB,
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/ietf/subscribe.ts"],"names":[],"mappings":"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"}
|