@norskvideo/moq-net 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/announced.d.ts +111 -21
- package/announced.d.ts.map +1 -1
- package/announced.js +213 -40
- package/announced.js.map +1 -1
- package/broadcast.d.ts +80 -25
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +270 -49
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +6 -0
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +42 -13
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts +5 -0
- package/connection/browser.d.ts.map +1 -0
- package/connection/browser.js +31 -0
- package/connection/browser.js.map +1 -0
- package/connection/connect.d.ts +43 -1
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +118 -123
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +43 -16
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/handshake.d.ts +12 -1
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +30 -14
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +8 -0
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +6 -0
- package/connection/index.js.map +1 -1
- package/connection/reload.d.ts +66 -9
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +192 -66
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +92 -0
- package/connection/stats.d.ts.map +1 -0
- package/connection/stats.js +35 -0
- package/connection/stats.js.map +1 -0
- package/connection/transport.d.ts +10 -0
- package/connection/transport.d.ts.map +1 -0
- package/connection/transport.js +12 -0
- package/connection/transport.js.map +1 -0
- package/consume.d.ts +44 -0
- package/consume.d.ts.map +1 -0
- package/consume.js +60 -0
- package/consume.js.map +1 -0
- package/datagram.d.ts +23 -0
- package/datagram.d.ts.map +1 -0
- package/datagram.js +3 -0
- package/datagram.js.map +1 -0
- package/error.d.ts +76 -0
- package/error.d.ts.map +1 -0
- package/error.js +107 -0
- package/error.js.map +1 -0
- package/group.d.ts +143 -38
- package/group.d.ts.map +1 -1
- package/group.js +270 -68
- package/group.js.map +1 -1
- package/ietf/adapter.d.ts +2 -2
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +20 -10
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +73 -5
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/aliases.js +121 -14
- package/ietf/aliases.js.map +1 -1
- package/ietf/cluster.d.ts +141 -0
- package/ietf/cluster.d.ts.map +1 -0
- package/ietf/cluster.js +204 -0
- package/ietf/cluster.js.map +1 -0
- package/ietf/connection.d.ts +39 -6
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +73 -12
- package/ietf/connection.js.map +1 -1
- package/ietf/fetch.d.ts +17 -0
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +21 -0
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +87 -0
- package/ietf/filter.d.ts.map +1 -0
- package/ietf/filter.js +292 -0
- package/ietf/filter.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +3 -0
- package/ietf/index.js.map +1 -1
- package/ietf/namespace.d.ts +6 -0
- package/ietf/namespace.d.ts.map +1 -1
- package/ietf/namespace.js +27 -2
- package/ietf/namespace.js.map +1 -1
- package/ietf/object.d.ts +54 -6
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +178 -25
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +35 -10
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +236 -45
- package/ietf/parameters.js.map +1 -1
- package/ietf/priority.d.ts +5 -0
- package/ietf/priority.d.ts.map +1 -0
- package/ietf/priority.js +10 -0
- package/ietf/priority.js.map +1 -0
- package/ietf/properties.d.ts +13 -2
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +65 -8
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +13 -3
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +16 -2
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +25 -6
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +40 -7
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +751 -134
- package/ietf/publisher.js.map +1 -1
- package/ietf/request.js +1 -1
- package/ietf/request.js.map +1 -1
- package/ietf/solicit.d.ts +41 -0
- package/ietf/solicit.d.ts.map +1 -0
- package/ietf/solicit.js +47 -0
- package/ietf/solicit.js.map +1 -0
- package/ietf/subscribe.d.ts +41 -2
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +103 -22
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +21 -7
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +31 -14
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +20 -7
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +512 -142
- package/ietf/subscriber.js.map +1 -1
- package/ietf/version.d.ts +7 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +7 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +10 -5
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +29 -0
- package/internal.d.ts.map +1 -0
- package/internal.js +8 -0
- package/internal.js.map +1 -0
- package/lite/announce.d.ts +62 -15
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +230 -94
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +69 -20
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +128 -81
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +23 -0
- package/lite/datagram.d.ts.map +1 -0
- package/lite/datagram.js +57 -0
- package/lite/datagram.js.map +1 -0
- package/lite/datagram_stream.d.ts +8 -0
- package/lite/datagram_stream.d.ts.map +1 -0
- package/lite/datagram_stream.js +44 -0
- package/lite/datagram_stream.js.map +1 -0
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +2 -2
- package/lite/fetch.js.map +1 -1
- package/lite/index.d.ts +3 -0
- package/lite/index.d.ts.map +1 -1
- package/lite/index.js +3 -0
- package/lite/index.js.map +1 -1
- package/lite/priority.d.ts +67 -0
- package/lite/priority.d.ts.map +1 -0
- package/lite/priority.js +114 -0
- package/lite/priority.js.map +1 -0
- package/lite/probe.d.ts +18 -2
- package/lite/probe.d.ts.map +1 -1
- package/lite/probe.js +24 -22
- package/lite/probe.js.map +1 -1
- package/lite/publisher.d.ts +14 -7
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +406 -84
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +83 -6
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +203 -31
- package/lite/setup.js.map +1 -1
- package/lite/stream.d.ts +12 -3
- package/lite/stream.d.ts.map +1 -1
- package/lite/stream.js +7 -4
- package/lite/stream.js.map +1 -1
- package/lite/subscribe.d.ts +37 -23
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +70 -55
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +29 -23
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +689 -112
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +25 -13
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +60 -35
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +39 -4
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +139 -17
- package/lite/version.js.map +1 -1
- package/mock.d.ts +53 -3
- package/mock.d.ts.map +1 -1
- package/mock.js +110 -21
- package/mock.js.map +1 -1
- package/{lite/origin.d.ts → origin.d.ts} +25 -1
- package/origin.d.ts.map +1 -0
- package/{lite/origin.js → origin.js} +25 -1
- package/origin.js.map +1 -0
- package/package.json +6 -4
- package/path.d.ts +67 -0
- package/path.d.ts.map +1 -1
- package/path.js +128 -0
- package/path.js.map +1 -1
- package/stream.d.ts +94 -4
- package/stream.d.ts.map +1 -1
- package/stream.js +128 -17
- package/stream.js.map +1 -1
- package/time.d.ts +109 -86
- package/time.d.ts.map +1 -1
- package/time.js +80 -30
- package/time.js.map +1 -1
- package/track.d.ts +298 -47
- package/track.d.ts.map +1 -1
- package/track.js +721 -109
- package/track.js.map +1 -1
- package/util/timeout.d.ts +5 -0
- package/util/timeout.d.ts.map +1 -0
- package/util/timeout.js +18 -0
- package/util/timeout.js.map +1 -0
- package/util/utf8.d.ts +3 -0
- package/util/utf8.d.ts.map +1 -0
- package/util/utf8.js +7 -0
- package/util/utf8.js.map +1 -0
- package/varint.d.ts +14 -3
- package/varint.d.ts.map +1 -1
- package/varint.js +23 -12
- package/varint.js.map +1 -1
- package/zod.d.ts +5 -5
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/bandwidth.d.ts +0 -11
- package/bandwidth.d.ts.map +0 -1
- package/bandwidth.js +0 -7
- package/bandwidth.js.map +0 -1
- package/connection/cert.test.d.ts +0 -2
- package/connection/cert.test.d.ts.map +0 -1
- package/connection/cert.test.js +0 -26
- package/connection/cert.test.js.map +0 -1
- package/connection/reload.test.d.ts +0 -2
- package/connection/reload.test.d.ts.map +0 -1
- package/connection/reload.test.js +0 -39
- package/connection/reload.test.js.map +0 -1
- package/group.test.d.ts +0 -2
- package/group.test.d.ts.map +0 -1
- package/group.test.js +0 -66
- package/group.test.js.map +0 -1
- package/ietf/aliases.test.d.ts +0 -2
- package/ietf/aliases.test.d.ts.map +0 -1
- package/ietf/aliases.test.js +0 -30
- package/ietf/aliases.test.js.map +0 -1
- package/ietf/ietf.test.d.ts +0 -2
- package/ietf/ietf.test.d.ts.map +0 -1
- package/ietf/ietf.test.js +0 -873
- package/ietf/ietf.test.js.map +0 -1
- package/integration.test.d.ts +0 -2
- package/integration.test.d.ts.map +0 -1
- package/integration.test.js +0 -90
- package/integration.test.js.map +0 -1
- package/lite/origin.d.ts.map +0 -1
- package/lite/origin.js.map +0 -1
- package/lite/subscriber.test.d.ts +0 -2
- package/lite/subscriber.test.d.ts.map +0 -1
- package/lite/subscriber.test.js +0 -30
- package/lite/subscriber.test.js.map +0 -1
- package/lite/track.test.d.ts +0 -2
- package/lite/track.test.d.ts.map +0 -1
- package/lite/track.test.js +0 -53
- package/lite/track.test.js.map +0 -1
- package/path.test.d.ts +0 -2
- package/path.test.d.ts.map +0 -1
- package/path.test.js +0 -169
- package/path.test.js.map +0 -1
- package/stream.test.d.ts +0 -2
- package/stream.test.d.ts.map +0 -1
- package/stream.test.js +0 -210
- package/stream.test.js.map +0 -1
- package/track.test.d.ts +0 -2
- package/track.test.d.ts.map +0 -1
- package/track.test.js +0 -56
- package/track.test.js.map +0 -1
- package/util/error.d.ts +0 -3
- package/util/error.d.ts.map +0 -1
- package/util/error.js +0 -9
- package/util/error.js.map +0 -1
- package/util/index.d.ts +0 -2
- package/util/index.d.ts.map +0 -1
- package/util/index.js +0 -3
- package/util/index.js.map +0 -1
- package/varint.test.d.ts +0 -2
- package/varint.test.d.ts.map +0 -1
- package/varint.test.js +0 -106
- package/varint.test.js.map +0 -1
package/ietf/publisher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/ietf/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AACnC,OAAO,EAAe,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,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,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACrB,KAAK,CAAe;IACpB,QAAQ,CAAU;IAElB,4BAA4B;IAC5B,WAAW,GAA+B,IAAI,GAAG,EAAE,CAAC;IAEpD,iDAAiD;IACjD,mBAAmB,GAAG,IAAI,GAAG,EAAa,CAAC;IAE3C;;;;;;OAMG;IACH,YAAY,IAAkB,EAAE,OAAgB;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAgB,EAAE,SAAoB;QAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAgB,EAAE,SAAoB;QACvD,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YACtD,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO;YAEpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAE5C,IAAI,CAAC;gBACJ,yBAAyB;gBACzB,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,CAAC,CAAC;gBACtE,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,SAAS,CAAC,EAAE,EAAE,CAAC;oBACjC,oEAAoE;oBACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;wBAChD,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACvE,CAAC;yBAAM,CAAC;wBACP,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC9D,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;gBAED,kEAAkE;gBAClE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAE7D,oEAAoE;gBACpE,IACC,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAC1C,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ;oBAC1C,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EACzC,CAAC;oBACF,IAAI,CAAC;wBACJ,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;wBACjD,MAAM,IAAI,GAAG,IAAI,oBAAoB,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;wBAC3E,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACzD,CAAC;oBAAC,MAAM,CAAC;wBACR,iCAAiC;oBAClC,CAAC;gBACF,CAAC;gBAED,MAAM,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,8BAA8B,IAAI,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;gBAAS,CAAC;YACV,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;IACF,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,GAAG,CAAC,IAAI,CAAC,CAAC;QAE7C,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,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAEzE,IAAI,CAAC;YACJ,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;aACzB,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,+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;oBACnB,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC,CAAC,EAAE,CAAC;YAEL,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAEpD,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAErE,2CAA2C;YAC3C,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClG,IAAI,CAAC;oBACJ,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;oBACxC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC;wBAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,UAAU,EAAE,GAAG;wBACf,YAAY,EAAE,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC3C,CAAC;gBAAC,MAAM,CAAC;oBACR,yCAAyC;gBAC1C,CAAC;YACF,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,IAAI,CAAC,4BAA4B,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,KAAY;QAC9C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEpE,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,aAAa,EAAE,KAAK;oBACpB,WAAW,EAAE,KAAK;oBAClB,iBAAiB,EAAE,KAAK;oBACxB,MAAM,EAAE,IAAI;oBACZ,WAAW,EAAE,IAAI;iBACjB;aACD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,CAAC;gBACJ,SAAS,CAAC;oBACT,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBACrE,IAAI,CAAC,KAAK;wBAAE,MAAM;oBAElB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1C,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxC,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;;;;;OAKG;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;QAE7B,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,mEAAmE;YACnE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC9C,IAAI,MAAM,KAAK,IAAI;oBAAE,SAAS;gBAC9B,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAExC,4CAA4C;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACxB,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EACvB,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CACvB,CAAC;YAEF,IAAI,CAAC;gBACJ,SAAS,CAAC;oBACT,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrC,IAAI,CAAC,KAAK;wBAAE,MAAM;oBAElB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;wBAClB,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;wBACpD,MAAM,CAAC,GAAG,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC9D,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACP,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;wBACxD,MAAM,CAAC,GAAG,IAAI,2BAA2B,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;wBAClE,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACxC,CAAC;gBACF,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5C,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,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,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,gBAAgB,CAAC,IAAgB,EAAE,MAAe;QACjD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;YAC9B,IAAI,CAAC;gBACJ,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACR,8CAA8C;YAC/C,CAAC;QACF,CAAC;IACF,CAAC;CACD","sourcesContent":["import { Announced } from \"../announced.ts\";\nimport type { Broadcast } from \"../broadcast.ts\";\nimport type { Group } from \"../group.ts\";\nimport * as Path from \"../path.ts\";\nimport { type Stream, Writer } from \"../stream.ts\";\nimport { error } from \"../util/error.ts\";\nimport type { Session } from \"./adapter.ts\";\nimport { Frame, Group as GroupMessage } from \"./object.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 { Version } from \"./version.ts\";\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\n\t// Our published broadcasts.\n\t#broadcasts: Map<Path.Valid, Broadcast> = new Map();\n\n\t// Any consumers that want each new announcement.\n\t#announcedConsumers = new Set<Announced>();\n\n\t/**\n\t * Creates a new Publisher instance.\n\t * @param quic - The WebTransport session (for uni streams)\n\t * @param session - The session abstraction for bidi streams and request IDs\n\t *\n\t * @internal\n\t */\n\tconstructor(quic: WebTransport, session: Session) {\n\t\tthis.#quic = quic;\n\t\tthis.#session = session;\n\t}\n\n\t/**\n\t * Publishes a broadcast with any associated tracks.\n\t * Opens a bidi stream to send PublishNamespace and waits for response.\n\t */\n\tpublish(path: Path.Valid, broadcast: Broadcast) {\n\t\tthis.#broadcasts.set(path, broadcast);\n\t\tthis.#notifyConsumers(path, true);\n\t\tvoid this.#runPublish(path, broadcast);\n\t}\n\n\tasync #runPublish(path: Path.Valid, broadcast: Broadcast) {\n\t\ttry {\n\t\t\tconst requestId = await this.#session.nextRequestId();\n\t\t\tif (requestId === undefined) return;\n\n\t\t\tconst stream = await this.#session.openBi();\n\n\t\t\ttry {\n\t\t\t\t// Write PublishNamespace\n\t\t\t\tawait stream.writer.u53(PublishNamespace.id);\n\t\t\t\tconst msg = new PublishNamespace({ requestId, trackNamespace: path });\n\t\t\t\tawait msg.encode(stream.writer, this.#session.version);\n\n\t\t\t\t// Read response (RequestOk and PublishNamespaceOk share 0x07)\n\t\t\t\tconst respTypeId = await stream.reader.u53();\n\t\t\t\tif (respTypeId === RequestOk.id) {\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} else {\n\t\t\t\t\tthrow new Error(`PublishNamespace rejected: typeId=0x${respTypeId.toString(16)}`);\n\t\t\t\t}\n\n\t\t\t\t// Wait for broadcast to close or stream to close (peer cancelled)\n\t\t\t\tawait Promise.race([broadcast.closed, stream.reader.closed]);\n\n\t\t\t\t// For v14-v16: send explicit PublishNamespaceDone (removed in v17+)\n\t\t\t\tif (\n\t\t\t\t\tthis.#session.version === Version.DRAFT_14 ||\n\t\t\t\t\tthis.#session.version === Version.DRAFT_15 ||\n\t\t\t\t\tthis.#session.version === Version.DRAFT_16\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait stream.writer.u53(PublishNamespaceDone.id);\n\t\t\t\t\t\tconst done = new PublishNamespaceDone({ trackNamespace: path, requestId });\n\t\t\t\t\t\tawait done.encode(stream.writer, this.#session.version);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Stream might already be closed\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.close();\n\t\t\t} catch (err) {\n\t\t\t\tstream.abort(error(err));\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tconst e = error(err);\n\t\t\tconsole.warn(`announce failed: broadcast=${path} error=${e.message}`);\n\t\t} finally {\n\t\t\tbroadcast.close();\n\t\t\tthis.#broadcasts.delete(path);\n\t\t\tthis.#notifyConsumers(path, false);\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.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 track = broadcast.subscribe(msg.trackName, msg.subscriberPriority);\n\n\t\ttry {\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});\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// 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\t\t\t\t\tvoid this.#runGroup(msg.requestId, group);\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\tawait Promise.race([serving, stream.reader.closed]);\n\n\t\t\tconsole.debug(`publish done: broadcast=${name} track=${track.name}`);\n\n\t\t\t// v14-v16: send PublishDone before closing\n\t\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\t\ttry {\n\t\t\t\t\tawait stream.writer.u53(PublishDone.id);\n\t\t\t\t\tconst done = new PublishDone({\n\t\t\t\t\t\trequestId: msg.requestId,\n\t\t\t\t\t\tstatusCode: 200,\n\t\t\t\t\t\treasonPhrase: \"OK\",\n\t\t\t\t\t});\n\t\t\t\t\tawait done.encode(stream.writer, version);\n\t\t\t\t} catch {\n\t\t\t\t\t// Stream might already be closed by peer\n\t\t\t\t}\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.warn(`publish error: broadcast=${name} track=${track.name} error=${e.message}`);\n\t\t\tstream.abort(e);\n\t\t} finally {\n\t\t\ttrack.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(requestId: bigint, group: Group) {\n\t\ttry {\n\t\t\tconst stream = await Writer.open(this.#quic, this.#session.version);\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\thasExtensions: false,\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},\n\t\t\t});\n\n\t\t\tawait header.encode(stream, this.#session.version);\n\n\t\t\ttry {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst frame = await Promise.race([group.readFrame(), stream.closed]);\n\t\t\t\t\tif (!frame) break;\n\n\t\t\t\t\tconst obj = new Frame({ payload: frame });\n\t\t\t\t\tawait obj.encode(stream, header.flags);\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 * Handles an incoming SUBSCRIBE_NAMESPACE on a bidi stream.\n\t * Sends RequestOk, then streams Namespace/NamespaceDone entries.\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\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// Create an Announced consumer and seed it with current broadcasts\n\t\t\tconst announced = new Announced(prefix);\n\t\t\tfor (const name of this.#broadcasts.keys()) {\n\t\t\t\tconst suffix = Path.stripPrefix(prefix, name);\n\t\t\t\tif (suffix === null) continue;\n\t\t\t\tannounced.append({ path: suffix, active: true });\n\t\t\t}\n\t\t\tthis.#announcedConsumers.add(announced);\n\n\t\t\t// Close the consumer when the stream closes\n\t\t\tstream.reader.closed.then(\n\t\t\t\t() => announced.close(),\n\t\t\t\t() => announced.close(),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst entry = await announced.next();\n\t\t\t\t\tif (!entry) break;\n\n\t\t\t\t\tif (entry.active) {\n\t\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntry.id);\n\t\t\t\t\t\tconst e = new SubscribeNamespaceEntry({ suffix: entry.path });\n\t\t\t\t\t\tawait e.encode(stream.writer, version);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait stream.writer.u53(SubscribeNamespaceEntryDone.id);\n\t\t\t\t\t\tconst e = new SubscribeNamespaceEntryDone({ suffix: entry.path });\n\t\t\t\t\t\tawait e.encode(stream.writer, version);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tannounced.close();\n\t\t\t\tthis.#announcedConsumers.delete(announced);\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: ${e.message}`);\n\t\t\tstream.abort(e);\n\t\t}\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#notifyConsumers(path: Path.Valid, active: boolean) {\n\t\tfor (const consumer of this.#announcedConsumers) {\n\t\t\tconst suffix = Path.stripPrefix(consumer.prefix, path);\n\t\t\tif (suffix === null) continue;\n\t\t\ttry {\n\t\t\t\tconsumer.append({ path: suffix, active });\n\t\t\t} catch {\n\t\t\t\t// Consumer already closed, will be cleaned up\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/ietf/publisher.ts"],"names":[],"mappings":"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","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"]}
|
package/ietf/request.js
CHANGED
|
@@ -67,7 +67,7 @@ export class RequestOk {
|
|
|
67
67
|
? await r.u62()
|
|
68
68
|
: undefined;
|
|
69
69
|
const parameters = await Parameters.decode(r, version);
|
|
70
|
-
await Properties.
|
|
70
|
+
await Properties.decode(r, version);
|
|
71
71
|
return new RequestOk({ requestId, parameters });
|
|
72
72
|
}
|
|
73
73
|
static async decode(r, version) {
|
package/ietf/request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/ietf/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { Parameters } from \"./parameters.ts\";\nimport * as Properties from \"./properties.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nexport class MaxRequestId {\n\tstatic id = 0x15;\n\n\trequestId: bigint;\n\n\tconstructor({ requestId }: { requestId: bigint }) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tasync #encode(w: Writer): Promise<void> {\n\t\tawait w.u62(this.requestId);\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async #decode(r: Reader): Promise<MaxRequestId> {\n\t\treturn new MaxRequestId({ requestId: await r.u62() });\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<MaxRequestId> {\n\t\treturn Message.decode(r, MaxRequestId.#decode);\n\t}\n}\n\nexport class RequestsBlocked {\n\tstatic id = 0x1a;\n\n\trequestId: bigint;\n\n\tconstructor({ requestId }: { requestId: bigint }) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tasync #encode(w: Writer): Promise<void> {\n\t\tawait w.u62(this.requestId);\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async #decode(r: Reader): Promise<RequestsBlocked> {\n\t\treturn new RequestsBlocked({ requestId: await r.u62() });\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<RequestsBlocked> {\n\t\treturn Message.decode(r, RequestsBlocked.#decode);\n\t}\n}\n\n/// REQUEST_OK (0x07 in v15) - Generic success response for any request.\n/// Replaces PublishNamespaceOk, SubscribeNamespaceOk in v15.\nexport class RequestOk {\n\tstatic id = 0x07;\n\n\trequestId: bigint | undefined;\n\tparameters: Parameters;\n\n\tconstructor({ requestId, parameters = new Parameters() }: { requestId?: bigint; parameters?: Parameters }) {\n\t\tthis.requestId = requestId;\n\t\tthis.parameters = parameters;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\tif (this.requestId === undefined) throw new Error(\"requestId required for draft14-16\");\n\t\t\tawait w.u62(this.requestId);\n\t\t}\n\t\tawait this.parameters.encode(w, version);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (wr) => this.#encode(wr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<RequestOk> {\n\t\tconst requestId =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? await r.u62()\n\t\t\t\t: undefined;\n\t\tconst parameters = await Parameters.decode(r, version);\n\t\tawait Properties.skip(r, version);\n\t\treturn new RequestOk({ requestId, parameters });\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<RequestOk> {\n\t\treturn Message.decode(r, (rd) => RequestOk.#decode(rd, version));\n\t}\n}\n\n/// REQUEST_ERROR (0x05 in v15) - Generic error response for any request.\n/// Replaces SubscribeError, PublishError, PublishNamespaceError, etc. in v15.\nexport class RequestError {\n\tstatic id = 0x05;\n\n\trequestId: bigint | undefined;\n\terrorCode: number;\n\treasonPhrase: string;\n\tretryInterval: bigint;\n\n\tconstructor({\n\t\trequestId,\n\t\terrorCode,\n\t\treasonPhrase,\n\t\tretryInterval = 0n,\n\t}: {\n\t\trequestId?: bigint;\n\t\terrorCode: number;\n\t\treasonPhrase: string;\n\t\tretryInterval?: bigint;\n\t}) {\n\t\tthis.requestId = requestId;\n\t\tthis.errorCode = errorCode;\n\t\tthis.reasonPhrase = reasonPhrase;\n\t\tthis.retryInterval = retryInterval;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\tif (this.requestId === undefined) throw new Error(\"requestId required for draft14-16\");\n\t\t\tawait w.u62(this.requestId);\n\t\t}\n\t\tawait w.u62(BigInt(this.errorCode));\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15) {\n\t\t\tawait w.u62(this.retryInterval);\n\t\t}\n\t\tawait w.string(this.reasonPhrase);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (wr) => this.#encode(wr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<RequestError> {\n\t\tconst requestId =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? await r.u62()\n\t\t\t\t: undefined;\n\t\tconst errorCode = Number(await r.u62());\n\t\tconst retryInterval = version === Version.DRAFT_14 || version === Version.DRAFT_15 ? 0n : await r.u62();\n\t\tconst reasonPhrase = await r.string();\n\t\treturn new RequestError({ requestId, errorCode, reasonPhrase, retryInterval });\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<RequestError> {\n\t\treturn Message.decode(r, (rd) => RequestError.#decode(rd, version));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/ietf/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAoB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,OAAO,YAAY;IACxB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,SAAS,CAAS;IAElB,YAAY,EAAE,SAAS,EAAyB;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS;QACtB,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,QAAqB;QAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS;QAC7B,OAAO,IAAI,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,QAAqB;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;CACD;AAED,MAAM,OAAO,eAAe;IAC3B,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,SAAS,CAAS;IAElB,YAAY,EAAE,SAAS,EAAyB;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS;QACtB,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,QAAqB;QAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS;QAC7B,OAAO,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,QAAqB;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;CACD;AAED,wEAAwE;AACxE,6DAA6D;AAC7D,MAAM,OAAO,SAAS;IACrB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,SAAS,CAAqB;IAC9B,UAAU,CAAa;IAEvB,YAAY,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI,UAAU,EAAE,EAAmD;QACxG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QAC5C,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClG,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvF,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QACnD,MAAM,SAAS,GACd,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;YAC3F,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;YACf,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;CACD;AAED,yEAAyE;AACzE,8EAA8E;AAC9E,MAAM,OAAO,YAAY;IACxB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjB,SAAS,CAAqB;IAC9B,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,aAAa,CAAS;IAEtB,YAAY,EACX,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,GAAG,EAAE,GAMlB;QACA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QAC5C,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClG,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvF,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClE,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAC3C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAS,EAAE,OAAoB;QACnD,MAAM,SAAS,GACd,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ;YAC3F,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;YACf,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACxG,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,IAAI,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAS,EAAE,OAAoB;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;CACD","sourcesContent":["import type { Reader, Writer } from \"../stream.ts\";\nimport * as Message from \"./message.ts\";\nimport { Parameters } from \"./parameters.ts\";\nimport * as Properties from \"./properties.ts\";\nimport { type IetfVersion, Version } from \"./version.ts\";\n\nexport class MaxRequestId {\n\tstatic id = 0x15;\n\n\trequestId: bigint;\n\n\tconstructor({ requestId }: { requestId: bigint }) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tasync #encode(w: Writer): Promise<void> {\n\t\tawait w.u62(this.requestId);\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async #decode(r: Reader): Promise<MaxRequestId> {\n\t\treturn new MaxRequestId({ requestId: await r.u62() });\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<MaxRequestId> {\n\t\treturn Message.decode(r, MaxRequestId.#decode);\n\t}\n}\n\nexport class RequestsBlocked {\n\tstatic id = 0x1a;\n\n\trequestId: bigint;\n\n\tconstructor({ requestId }: { requestId: bigint }) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tasync #encode(w: Writer): Promise<void> {\n\t\tawait w.u62(this.requestId);\n\t}\n\n\tasync encode(w: Writer, _version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, this.#encode.bind(this));\n\t}\n\n\tstatic async #decode(r: Reader): Promise<RequestsBlocked> {\n\t\treturn new RequestsBlocked({ requestId: await r.u62() });\n\t}\n\n\tstatic async decode(r: Reader, _version: IetfVersion): Promise<RequestsBlocked> {\n\t\treturn Message.decode(r, RequestsBlocked.#decode);\n\t}\n}\n\n/// REQUEST_OK (0x07 in v15) - Generic success response for any request.\n/// Replaces PublishNamespaceOk, SubscribeNamespaceOk in v15.\nexport class RequestOk {\n\tstatic id = 0x07;\n\n\trequestId: bigint | undefined;\n\tparameters: Parameters;\n\n\tconstructor({ requestId, parameters = new Parameters() }: { requestId?: bigint; parameters?: Parameters }) {\n\t\tthis.requestId = requestId;\n\t\tthis.parameters = parameters;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\tif (this.requestId === undefined) throw new Error(\"requestId required for draft14-16\");\n\t\t\tawait w.u62(this.requestId);\n\t\t}\n\t\tawait this.parameters.encode(w, version);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (wr) => this.#encode(wr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<RequestOk> {\n\t\tconst requestId =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? await r.u62()\n\t\t\t\t: undefined;\n\t\tconst parameters = await Parameters.decode(r, version);\n\t\tawait Properties.decode(r, version);\n\t\treturn new RequestOk({ requestId, parameters });\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<RequestOk> {\n\t\treturn Message.decode(r, (rd) => RequestOk.#decode(rd, version));\n\t}\n}\n\n/// REQUEST_ERROR (0x05 in v15) - Generic error response for any request.\n/// Replaces SubscribeError, PublishError, PublishNamespaceError, etc. in v15.\nexport class RequestError {\n\tstatic id = 0x05;\n\n\trequestId: bigint | undefined;\n\terrorCode: number;\n\treasonPhrase: string;\n\tretryInterval: bigint;\n\n\tconstructor({\n\t\trequestId,\n\t\terrorCode,\n\t\treasonPhrase,\n\t\tretryInterval = 0n,\n\t}: {\n\t\trequestId?: bigint;\n\t\terrorCode: number;\n\t\treasonPhrase: string;\n\t\tretryInterval?: bigint;\n\t}) {\n\t\tthis.requestId = requestId;\n\t\tthis.errorCode = errorCode;\n\t\tthis.reasonPhrase = reasonPhrase;\n\t\tthis.retryInterval = retryInterval;\n\t}\n\n\tasync #encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\tif (version === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16) {\n\t\t\tif (this.requestId === undefined) throw new Error(\"requestId required for draft14-16\");\n\t\t\tawait w.u62(this.requestId);\n\t\t}\n\t\tawait w.u62(BigInt(this.errorCode));\n\t\tif (version !== Version.DRAFT_14 && version !== Version.DRAFT_15) {\n\t\t\tawait w.u62(this.retryInterval);\n\t\t}\n\t\tawait w.string(this.reasonPhrase);\n\t}\n\n\tasync encode(w: Writer, version: IetfVersion): Promise<void> {\n\t\treturn Message.encode(w, (wr) => this.#encode(wr, version));\n\t}\n\n\tstatic async #decode(r: Reader, version: IetfVersion): Promise<RequestError> {\n\t\tconst requestId =\n\t\t\tversion === Version.DRAFT_14 || version === Version.DRAFT_15 || version === Version.DRAFT_16\n\t\t\t\t? await r.u62()\n\t\t\t\t: undefined;\n\t\tconst errorCode = Number(await r.u62());\n\t\tconst retryInterval = version === Version.DRAFT_14 || version === Version.DRAFT_15 ? 0n : await r.u62();\n\t\tconst reasonPhrase = await r.string();\n\t\treturn new RequestError({ requestId, errorCode, reasonPhrase, retryInterval });\n\t}\n\n\tstatic async decode(r: Reader, version: IetfVersion): Promise<RequestError> {\n\t\treturn Message.decode(r, (rd) => RequestError.#decode(rd, version));\n\t}\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type SetupOptions } from "./parameters";
|
|
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;
|
|
41
|
+
//# sourceMappingURL=solicit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solicit.d.ts","sourceRoot":"","sources":["../../src/ietf/solicit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAG1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,QAEpD"}
|
package/ietf/solicit.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* @ts-self-types="./solicit.d.ts" */
|
|
2
|
+
import { SetupOption } from "./parameters.js";
|
|
3
|
+
/**
|
|
4
|
+
* The MoQ Solicit extension (draft-lcurley-moq-solicit-00).
|
|
5
|
+
*
|
|
6
|
+
* moq-transport says nothing about whether an endpoint expects to be told what we have or
|
|
7
|
+
* to ask for it, so a publisher that waits to be asked is silent against a relay that
|
|
8
|
+
* never asks. This extension lets an endpoint declare, in its SETUP, that advertisements
|
|
9
|
+
* to it must be solicited first.
|
|
10
|
+
*
|
|
11
|
+
* Declaring nothing means "no requirement, tell me unasked", which is what a peer that has
|
|
12
|
+
* never heard of the extension implicitly says.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* What the peer declared, if anything.
|
|
19
|
+
*
|
|
20
|
+
* The three states are distinct, and the difference between the last two is what makes the
|
|
21
|
+
* requirement enforceable:
|
|
22
|
+
*
|
|
23
|
+
* - `undefined`: no option at all. The peer has never heard of the extension, so it cannot
|
|
24
|
+
* have honored ours and an unsolicited advertisement from it is expected.
|
|
25
|
+
* - `false`: an explicit 0. No requirement of its own, but writing the option at all proves
|
|
26
|
+
* it implements this, so it is held to ours.
|
|
27
|
+
* - `true`: advertisements to it must be solicited, and likewise held to ours.
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export function solicitFromSetup(params) {
|
|
32
|
+
const value = params.getVarint(SetupOption.Solicit);
|
|
33
|
+
return value === undefined ? undefined : value !== 0n;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Declare that advertisements to us must be solicited.
|
|
37
|
+
*
|
|
38
|
+
* Unconditional, and true of every session: we send SUBSCRIBE_NAMESPACE for each prefix
|
|
39
|
+
* we want, so there is nothing an unsolicited PUBLISH_NAMESPACE could tell us that we
|
|
40
|
+
* will not have asked for.
|
|
41
|
+
*
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
export function solicitIntoSetup(params) {
|
|
45
|
+
params.setVarint(SetupOption.Solicit, 1n);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=solicit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solicit.js","sourceRoot":"","sources":["../../src/ietf/solicit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,iBAAiB,CAAC;AAEjE;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACpD,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import { SetupOption, type SetupOptions } from \"./parameters.ts\";\n\n/**\n * The MoQ Solicit extension (draft-lcurley-moq-solicit-00).\n *\n * moq-transport says nothing about whether an endpoint expects to be told what we have or\n * to ask for it, so a publisher that waits to be asked is silent against a relay that\n * never asks. This extension lets an endpoint declare, in its SETUP, that advertisements\n * to it must be solicited first.\n *\n * Declaring nothing means \"no requirement, tell me unasked\", which is what a peer that has\n * never heard of the extension implicitly says.\n *\n * @module\n * @internal\n */\n\n/**\n * What the peer declared, if anything.\n *\n * The three states are distinct, and the difference between the last two is what makes the\n * requirement enforceable:\n *\n * - `undefined`: no option at all. The peer has never heard of the extension, so it cannot\n * have honored ours and an unsolicited advertisement from it is expected.\n * - `false`: an explicit 0. No requirement of its own, but writing the option at all proves\n * it implements this, so it is held to ours.\n * - `true`: advertisements to it must be solicited, and likewise held to ours.\n *\n * @internal\n */\nexport function solicitFromSetup(params: SetupOptions): boolean | undefined {\n\tconst value = params.getVarint(SetupOption.Solicit);\n\treturn value === undefined ? undefined : value !== 0n;\n}\n\n/**\n * Declare that advertisements to us must be solicited.\n *\n * Unconditional, and true of every session: we send SUBSCRIBE_NAMESPACE for each prefix\n * we want, so there is nothing an unsolicited PUBLISH_NAMESPACE could tell us that we\n * will not have asked for.\n *\n * @internal\n */\nexport function solicitIntoSetup(params: SetupOptions) {\n\tparams.setVarint(SetupOption.Solicit, 1n);\n}\n"]}
|
package/ietf/subscribe.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import type * as Path from "../path";
|
|
2
2
|
import type { Reader, Writer } from "../stream";
|
|
3
|
+
import * as Filter from "./filter";
|
|
4
|
+
import { type MessageLocation } from "./parameters";
|
|
5
|
+
import * as Properties from "./properties";
|
|
3
6
|
import { type IetfVersion } from "./version";
|
|
7
|
+
/**
|
|
8
|
+
* The filter this implementation joins a live track with.
|
|
9
|
+
*
|
|
10
|
+
* moq-lite joins at the start of the current group, which is a decodable point, and
|
|
11
|
+
* draft-20's relative form is the first that can name it without knowing Largest Object.
|
|
12
|
+
* Earlier drafts only get the next Object after the live edge, which begins mid-group.
|
|
13
|
+
*/
|
|
14
|
+
export declare function joinFilter(version: IetfVersion): Filter.Filter;
|
|
4
15
|
export declare class Subscribe {
|
|
5
16
|
#private;
|
|
6
17
|
static id: number;
|
|
@@ -8,11 +19,20 @@ export declare class Subscribe {
|
|
|
8
19
|
trackNamespace: Path.Valid;
|
|
9
20
|
trackName: string;
|
|
10
21
|
subscriberPriority: number;
|
|
11
|
-
|
|
22
|
+
/** Which Objects the subscription delivers, resolved by the publisher against the live edge. */
|
|
23
|
+
filter: Filter.Filter;
|
|
24
|
+
/** The draft-20 backfill requested alongside it, or `undefined` for none. */
|
|
25
|
+
fill?: Filter.Fill;
|
|
26
|
+
/** Whether the subscriber wants Track Properties on the response (INCLUDE_PROPERTIES). */
|
|
27
|
+
propertiesWanted: boolean;
|
|
28
|
+
constructor({ requestId, trackNamespace, trackName, subscriberPriority, filter, fill, propertiesWanted, }: {
|
|
12
29
|
requestId: bigint;
|
|
13
30
|
trackNamespace: Path.Valid;
|
|
14
31
|
trackName: string;
|
|
15
32
|
subscriberPriority: number;
|
|
33
|
+
filter?: Filter.Filter;
|
|
34
|
+
fill?: Filter.Fill;
|
|
35
|
+
propertiesWanted?: boolean;
|
|
16
36
|
});
|
|
17
37
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
18
38
|
static decode(r: Reader, version: IetfVersion): Promise<Subscribe>;
|
|
@@ -22,9 +42,28 @@ export declare class SubscribeOk {
|
|
|
22
42
|
static id: number;
|
|
23
43
|
requestId: bigint | undefined;
|
|
24
44
|
trackAlias: bigint;
|
|
25
|
-
|
|
45
|
+
/**
|
|
46
|
+
* The largest Location in the track (LARGEST_OBJECT), which the draft requires once the
|
|
47
|
+
* 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
|
+
*/
|
|
53
|
+
largest: MessageLocation | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* The Track Properties to send (draft-17+): the track's Timescale and our group order.
|
|
56
|
+
*
|
|
57
|
+
* Empty opts the response out of properties entirely, which is what a peer that sent
|
|
58
|
+
* INCLUDE_PROPERTIES=0 asked for; declaring no Timescale also opts the track out of
|
|
59
|
+
* timestamps, so the subscriber times objects by arrival.
|
|
60
|
+
*/
|
|
61
|
+
properties: Properties.Properties;
|
|
62
|
+
constructor({ requestId, trackAlias, largest, properties, }: {
|
|
26
63
|
requestId?: bigint;
|
|
27
64
|
trackAlias: bigint;
|
|
65
|
+
largest?: MessageLocation;
|
|
66
|
+
properties?: Properties.Properties;
|
|
28
67
|
});
|
|
29
68
|
encode(w: Writer, version: IetfVersion): Promise<void>;
|
|
30
69
|
static decode(r: Reader, version: IetfVersion): Promise<SubscribeOk>;
|
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;
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/ietf/subscribe.ts"],"names":[],"mappings":"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"}
|