@blockcast/mmt-transport 0.2.2-main.64a6b356bf43 → 0.2.2-main.6598eedfb039

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +2 -2
  2. package/dist/endpoint-config.d.ts +30 -0
  3. package/dist/endpoint-config.d.ts.map +1 -1
  4. package/dist/endpoint-config.js +70 -3
  5. package/dist/endpoint-config.js.map +1 -1
  6. package/dist/index.d.ts +7 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +6 -3
  9. package/dist/index.js.map +1 -1
  10. package/dist/mmt-transport.no-modules.js +118 -20
  11. package/dist/mmt-transport.no-modules.js.map +4 -4
  12. package/dist/moqt-priority.d.ts +11 -0
  13. package/dist/moqt-priority.d.ts.map +1 -1
  14. package/dist/moqt-priority.js +11 -0
  15. package/dist/moqt-priority.js.map +1 -1
  16. package/dist/multicast-catalog-policy.d.ts +43 -3
  17. package/dist/multicast-catalog-policy.d.ts.map +1 -1
  18. package/dist/multicast-catalog-policy.js +129 -9
  19. package/dist/multicast-catalog-policy.js.map +1 -1
  20. package/dist/multicast-orchestrator.d.ts.map +1 -1
  21. package/dist/multicast-orchestrator.js +7 -2
  22. package/dist/multicast-orchestrator.js.map +1 -1
  23. package/dist/multicast-signaling-reconciler.js +5 -2
  24. package/dist/multicast-signaling-reconciler.js.map +1 -1
  25. package/dist/multicast-subscription-pool.d.ts.map +1 -1
  26. package/dist/multicast-subscription-pool.js +34 -6
  27. package/dist/multicast-subscription-pool.js.map +1 -1
  28. package/dist/multicast-tier.d.ts +19 -0
  29. package/dist/multicast-tier.d.ts.map +1 -1
  30. package/dist/multicast-tier.js +21 -4
  31. package/dist/multicast-tier.js.map +1 -1
  32. package/dist/packet-batch.d.ts +13 -0
  33. package/dist/packet-batch.d.ts.map +1 -0
  34. package/dist/packet-batch.js +14 -0
  35. package/dist/packet-batch.js.map +1 -0
  36. package/dist/types.d.ts +51 -34
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/types.js +18 -47
  39. package/dist/types.js.map +1 -1
  40. package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
  41. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  42. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
  43. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
  44. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
  45. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
  46. package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
  47. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
  48. package/node_modules/@blockcast/mmt-base/README.md +121 -0
  49. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  50. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
  51. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
  52. package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
  53. package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
  54. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +328 -0
  55. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
  56. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +750 -0
  57. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
  58. package/node_modules/@blockcast/mmt-base/package.json +49 -0
  59. package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
  60. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +1020 -0
  61. package/package.json +7 -1
  62. package/src/endpoint-config.ts +78 -3
  63. package/src/index.ts +7 -3
  64. package/src/moqt-priority.ts +11 -0
  65. package/src/multicast-catalog-policy.ts +137 -10
  66. package/src/multicast-orchestrator.ts +9 -2
  67. package/src/multicast-signaling-reconciler.ts +5 -2
  68. package/src/multicast-subscription-pool.ts +39 -7
  69. package/src/multicast-tier.ts +30 -3
  70. package/src/packet-batch.ts +17 -0
  71. package/src/types.ts +54 -50
package/README.md CHANGED
@@ -65,10 +65,10 @@ Promotion is always best-effort: WebTransport connects first for fast channel se
65
65
 
66
66
  Two MoQ wire protocols are supported behind a single WebTransport session, dispatched via QUIC ALPN:
67
67
 
68
- - **moqtail** — current IETF MOQT draft. Uses fetch-style subscriptions, group/object addressing, and the `FEC_CONFIG` control message (`0x50`) defined in `draft-ramadan-moq-fec-00`. Repair tracks are addressed by appending `/repair` to the source track path; helpers `repairTrackPath`, `isRepairTrack`, and `sourceTrackFromRepair` are exported from the root.
68
+ - **moqtail** — current IETF MOQT draft. Uses fetch-style subscriptions, group/object addressing, and the `FEC_CONFIG` control message (`0x50`) defined in `draft-ramadan-moq-fec-00`. A repair track's source, layer and symbol budget come from the catalog via `resolveRepairLayers` in `@blockcast/mmt-container`, never from its name; `repairTrackPath` is a producer-side naming convenience only.
69
69
  - **moqlite / moq-lib** — older moq.dev draft. Used by the `@moq/hang` web component and the moq-lib publisher. Same WebTransport carrier, simpler control plane.
70
70
 
71
- The transport manager itself does not implement either protocol stack — those live in the player libraries (`@moq/hang`, `moqtail-ts`). This package provides repair-track naming helpers and the `MoqFecConfig` / `RepairObjectHeader` signaling types. Decode and recovery state belongs to `@blockcast/mmt-container` or `@blockcast/fec-worker`.
71
+ The transport manager itself does not implement either protocol stack — those live in the player libraries (`@moq/hang`, `moqtail-ts`). This package provides the `repairTrackPath` naming helper and the `MoqFecConfig` / `RepairObjectHeader` signaling types. Decode and recovery state belongs to `@blockcast/mmt-container` or `@blockcast/fec-worker`.
72
72
 
73
73
  ## SSM multicast
74
74
 
@@ -41,10 +41,40 @@ export declare function isValidMulticastGroupAddress(address: string | undefined
41
41
  export declare function normalizeMulticastEndpoint(endpoint: MulticastEndpointConfig): MulticastEndpointConfig | undefined;
42
42
  /** Stable ownership key for one IWA multicast/AMT subscription. */
43
43
  export declare function multicastEndpointKey(endpoint: MulticastEndpointConfig): string;
44
+ /**
45
+ * True when `value` may be advertised as a multicast track's MMTP `packet_id`:
46
+ * an integer in 1..MMTP_PACKET_ID_MAX. packet_id 0 (MMTP_SIGNALING_PACKET_ID)
47
+ * is the MMTP signaling flow -- the FFmpeg `moq_mmt` muxer sends the AL-FEC
48
+ * message (0x0203) on it into the same group as the media -- so it is never a
49
+ * track's. Only a number qualifies: a string, boolean or null is not coerced.
50
+ */
51
+ export declare function isMulticastTrackPacketId(value: unknown): value is number;
44
52
  export declare function isUsableMulticastEndpoint(endpoint: {
45
53
  groupAddress?: string;
46
54
  port?: unknown;
47
55
  } | undefined): boolean;
56
+ /**
57
+ * Reject a URL multicast override that still carries a retired unprefixed alias.
58
+ *
59
+ * Both URL readers call this only once a valid override is established (a valid
60
+ * multicast `mc_group` and a valid `mc_port`; `readUrlMulticastConfig` also
61
+ * requires the whole endpoint to normalize), which is where they used to read
62
+ * the aliases: a link that
63
+ * relied on one fails here with its replacement named, instead of silently
64
+ * losing its AMT relay (and, in `readUrlMulticastConfig`, its tunnel mode).
65
+ * Presence is the error, whatever the value and whether or not the `mc_` form
66
+ * is also present: quietly preferring one of two keys is the tolerant read being
67
+ * retired. Outside an override the readers read no override key at all, the
68
+ * `mc_` forms included, so the bare names are left to the page; they are live
69
+ * page parameters elsewhere, and keeping clear of those is what the `mc_`
70
+ * namespace is for.
71
+ */
72
+ export declare function assertNoRetiredMulticastUrlParams(params: URLSearchParams): void;
73
+ /**
74
+ * Read an explicit multicast endpoint override from `mc_*` URL parameters.
75
+ * Throws when an override carries a retired unprefixed alias
76
+ * (`assertNoRetiredMulticastUrlParams`).
77
+ */
48
78
  export declare function readUrlMulticastConfig(search?: string | URLSearchParams): MulticastEndpointConfig | undefined;
49
79
  export declare function isMulticastExplicitlyDisabled(search?: string | URLSearchParams): boolean;
50
80
  //# sourceMappingURL=endpoint-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint-config.d.ts","sourceRoot":"","sources":["../src/endpoint-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,8BAA8B,EAE9B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,4BAA4B,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,4BAA4B,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC/C,KAAK,EAAE,4BAA4B,GACjC,8BAA8B,CAmChC;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAajF;AAED,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,uBAAuB,GAC/B,uBAAuB,GAAG,SAAS,CAgBrC;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM,CAW9E;AAED,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAC7D,OAAO,CAGT;AAED,wBAAgB,sBAAsB,CACrC,MAAM,GAAE,MAAM,GAAG,eAAwE,GACvF,uBAAuB,GAAG,SAAS,CAmBrC;AAED,wBAAgB,6BAA6B,CAC5C,MAAM,GAAE,MAAM,GAAG,eAAwE,GACvF,OAAO,CAKT"}
1
+ {"version":3,"file":"endpoint-config.d.ts","sourceRoot":"","sources":["../src/endpoint-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,8BAA8B,EAE9B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,4BAA4B,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,4BAA4B,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC/C,KAAK,EAAE,4BAA4B,GACjC,8BAA8B,CAmDhC;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAajF;AAED,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,uBAAuB,GAC/B,uBAAuB,GAAG,SAAS,CAgBrC;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM,CAW9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAIxE;AAED,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAC7D,OAAO,CAGT;AAWD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAQ/E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACrC,MAAM,GAAE,MAAM,GAAG,eAAwE,GACvF,uBAAuB,GAAG,SAAS,CAwBrC;AAED,wBAAgB,6BAA6B,CAC5C,MAAM,GAAE,MAAM,GAAG,eAAwE,GACvF,OAAO,CAKT"}
@@ -1,3 +1,4 @@
1
+ import { MMTP_PACKET_ID_MAX, MMTP_SIGNALING_PACKET_ID } from "@blockcast/mmt-base";
1
2
  /**
2
3
  * Convert internal endpoint-selection state to the canonical page contract.
3
4
  *
@@ -9,6 +10,18 @@ export function toWindowMulticastSubscribeConfig(input) {
9
10
  if (input.mode !== undefined && !["auto", "native", "tunnel"].includes(input.mode)) {
10
11
  throw new TypeError(`Unsupported multicast mode: ${String(input.mode)}`);
11
12
  }
13
+ // An explicit non-array (the null "endpoint unusable" sentinel from
14
+ // selectEndpointPacketIdsForTracks) must not degrade into "no filter".
15
+ if (input.packetIds !== undefined && !Array.isArray(input.packetIds)) {
16
+ throw new TypeError(`multicast packetIds must be an array, got ${input.packetIds === null ? "null" : typeof input.packetIds}`);
17
+ }
18
+ // Every join request passes through here, so the track packet_id range is
19
+ // enforced here rather than trusted from each caller.
20
+ if (input.packetIds?.some(id => !isMulticastTrackPacketId(id)) ||
21
+ input.tracks?.some(track => !isMulticastTrackPacketId(track.packetId))) {
22
+ throw new RangeError(`multicast packetId must be an integer from 1 to ${MMTP_PACKET_ID_MAX}; ` +
23
+ "packetId 0 is the MMTP signaling flow and is never a track's");
24
+ }
12
25
  const base = {
13
26
  group: input.group,
14
27
  port: input.port,
@@ -88,21 +101,69 @@ export function multicastEndpointKey(endpoint) {
88
101
  normalized.amtRelayPort ?? "",
89
102
  ]);
90
103
  }
104
+ /**
105
+ * True when `value` may be advertised as a multicast track's MMTP `packet_id`:
106
+ * an integer in 1..MMTP_PACKET_ID_MAX. packet_id 0 (MMTP_SIGNALING_PACKET_ID)
107
+ * is the MMTP signaling flow -- the FFmpeg `moq_mmt` muxer sends the AL-FEC
108
+ * message (0x0203) on it into the same group as the media -- so it is never a
109
+ * track's. Only a number qualifies: a string, boolean or null is not coerced.
110
+ */
111
+ export function isMulticastTrackPacketId(value) {
112
+ return Number.isInteger(value) &&
113
+ value > MMTP_SIGNALING_PACKET_ID &&
114
+ value <= MMTP_PACKET_ID_MAX;
115
+ }
91
116
  export function isUsableMulticastEndpoint(endpoint) {
92
117
  const port = Number(endpoint?.port);
93
118
  return isValidMulticastGroupAddress(endpoint?.groupAddress) && isPositivePort(port);
94
119
  }
120
+ /**
121
+ * Unprefixed aliases of the `mc_` URL override keys, retired in BLO-37507, each
122
+ * paired with the key that replaces it.
123
+ */
124
+ const RETIRED_MULTICAST_URL_PARAMS = [
125
+ ["amt_relay", "mc_amt_relay"],
126
+ ["amt_relay_port", "mc_amt_relay_port"],
127
+ ];
128
+ /**
129
+ * Reject a URL multicast override that still carries a retired unprefixed alias.
130
+ *
131
+ * Both URL readers call this only once a valid override is established (a valid
132
+ * multicast `mc_group` and a valid `mc_port`; `readUrlMulticastConfig` also
133
+ * requires the whole endpoint to normalize), which is where they used to read
134
+ * the aliases: a link that
135
+ * relied on one fails here with its replacement named, instead of silently
136
+ * losing its AMT relay (and, in `readUrlMulticastConfig`, its tunnel mode).
137
+ * Presence is the error, whatever the value and whether or not the `mc_` form
138
+ * is also present: quietly preferring one of two keys is the tolerant read being
139
+ * retired. Outside an override the readers read no override key at all, the
140
+ * `mc_` forms included, so the bare names are left to the page; they are live
141
+ * page parameters elsewhere, and keeping clear of those is what the `mc_`
142
+ * namespace is for.
143
+ */
144
+ export function assertNoRetiredMulticastUrlParams(params) {
145
+ for (const [retired, replacement] of RETIRED_MULTICAST_URL_PARAMS) {
146
+ if (params.has(retired)) {
147
+ throw new Error(`multicast URL override: query parameter "${retired}" is retired; use "${replacement}"`);
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Read an explicit multicast endpoint override from `mc_*` URL parameters.
153
+ * Throws when an override carries a retired unprefixed alias
154
+ * (`assertNoRetiredMulticastUrlParams`).
155
+ */
95
156
  export function readUrlMulticastConfig(search = typeof location === "undefined" ? "" : location.search) {
96
157
  const params = typeof search === "string" ? new URLSearchParams(search) : search;
97
158
  const groupAddress = params.get("mc_group") || "";
98
159
  const port = positivePort(params.get("mc_port"));
99
160
  if (!groupAddress || !port)
100
161
  return undefined;
101
- const amtRelay = params.get("mc_amt_relay") || params.get("amt_relay") || undefined;
102
- const amtRelayPort = positivePort(params.get("mc_amt_relay_port") || params.get("amt_relay_port"));
162
+ const amtRelay = params.get("mc_amt_relay") || undefined;
163
+ const amtRelayPort = positivePort(params.get("mc_amt_relay_port"));
103
164
  const requestedMode = params.get("mc_mode");
104
165
  const mode = amtRelay ? "tunnel" : multicastMode(requestedMode);
105
- return normalizeMulticastEndpoint({
166
+ const endpoint = normalizeMulticastEndpoint({
106
167
  groupAddress,
107
168
  sourceAddress: params.get("mc_source") || undefined,
108
169
  port,
@@ -110,6 +171,12 @@ export function readUrlMulticastConfig(search = typeof location === "undefined"
110
171
  ...(amtRelay ? { amtRelay } : {}),
111
172
  ...(amtRelayPort ? { amtRelayPort } : {}),
112
173
  });
174
+ // An endpoint that does not normalize (e.g. a non-multicast mc_group) is no
175
+ // override, so the page keeps its own bare names; the same scope
176
+ // readPlayerMulticastConfig applies by validating the group first.
177
+ if (endpoint)
178
+ assertNoRetiredMulticastUrlParams(params);
179
+ return endpoint;
113
180
  }
114
181
  export function isMulticastExplicitlyDisabled(search = typeof location === "undefined" ? "" : location.search) {
115
182
  const params = typeof search === "string" ? new URLSearchParams(search) : search;
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint-config.js","sourceRoot":"","sources":["../src/endpoint-config.ts"],"names":[],"mappings":"AAmCA;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC/C,KAAmC;IAEnC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,SAAS,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,OAAgB;QACzB,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,MAAM,GAAwC;YACnD,GAAG,IAAI;YACP,MAAM,EAAE,cAAc;YACtB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3G,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO;QACN,GAAG,IAAI;QACP,MAAM,EAAE,KAAK;QACb,KAAK;QACL,SAAS;KACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAA2B;IACvE,MAAM,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,QAAiC;IAEjC,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC;IAChF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC;IACtE,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACpG,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7F,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpG,OAAO;QACN,YAAY;QACZ,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,oBAAoB,CAAC,QAAiC;IACrE,MAAM,UAAU,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC;QACrB,UAAU,CAAC,aAAa,IAAI,EAAE;QAC9B,UAAU,CAAC,YAAY;QACvB,UAAU,CAAC,IAAI;QACf,UAAU,CAAC,IAAI,IAAI,MAAM;QACzB,UAAU,CAAC,QAAQ,IAAI,EAAE;QACzB,UAAU,CAAC,YAAY,IAAI,EAAE;KAC7B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACxC,QAA+D;IAE/D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,4BAA4B,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,SAAmC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;IAEzF,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;IACpF,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnG,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAEhE,OAAO,0BAA0B,CAAC;QACjC,YAAY;QACZ,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS;QACnD,IAAI;QACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC5C,SAAmC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;IAEzF,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,OAAO,SAAS,KAAK,UAAU,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IAC1C,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IACnC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"endpoint-config.js","sourceRoot":"","sources":["../src/endpoint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAoCnF;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC/C,KAAmC;IAEnC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,SAAS,CAAC,+BAA+B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,oEAAoE;IACpE,uEAAuE;IACvE,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,SAAS,CAClB,6CAA6C,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,EAAE,CACzG,CAAC;IACH,CAAC;IACD,0EAA0E;IAC1E,sDAAsD;IACtD,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,UAAU,CACnB,mDAAmD,kBAAkB,IAAI;YACzE,8DAA8D,CAC9D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,OAAgB;QACzB,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,MAAM,GAAwC;YACnD,GAAG,IAAI;YACP,MAAM,EAAE,cAAc;YACtB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3G,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO;QACN,GAAG,IAAI;QACP,MAAM,EAAE,KAAK;QACb,KAAK;QACL,SAAS;KACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAA2B;IACvE,MAAM,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,QAAiC;IAEjC,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC;IAChF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC;IACtE,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACpG,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7F,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpG,OAAO;QACN,YAAY;QACZ,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,oBAAoB,CAAC,QAAiC;IACrE,MAAM,UAAU,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC;QACrB,UAAU,CAAC,aAAa,IAAI,EAAE;QAC9B,UAAU,CAAC,YAAY;QACvB,UAAU,CAAC,IAAI;QACf,UAAU,CAAC,IAAI,IAAI,MAAM;QACzB,UAAU,CAAC,QAAQ,IAAI,EAAE;QACzB,UAAU,CAAC,YAAY,IAAI,EAAE;KAC7B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACtD,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QAC5B,KAAgB,GAAG,wBAAwB;QAC3C,KAAgB,IAAI,kBAAkB,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,yBAAyB,CACxC,QAA+D;IAE/D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,4BAA4B,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AACrF,CAAC;AAED;;;GAGG;AACH,MAAM,4BAA4B,GAAG;IACpC,CAAC,WAAW,EAAE,cAAc,CAAC;IAC7B,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEX;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iCAAiC,CAAC,MAAuB;IACxE,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,4BAA4B,EAAE,CAAC;QACnE,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACd,4CAA4C,OAAO,sBAAsB,WAAW,GAAG,CACvF,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACrC,SAAmC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;IAEzF,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE7C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IACzD,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAG,0BAA0B,CAAC;QAC3C,YAAY;QACZ,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS;QACnD,IAAI;QACJ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC;IACH,4EAA4E;IAC5E,iEAAiE;IACjE,mEAAmE;IACnE,IAAI,QAAQ;QAAE,iCAAiC,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC5C,SAAmC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;IAEzF,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,OAAO,SAAS,KAAK,UAAU,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IAC1C,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IACnC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC;AAC5D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -22,16 +22,19 @@
22
22
  * - Unified FEC/ABR pipeline across all transport modes
23
23
  * - A/V synchronization via SharedClock
24
24
  */
25
- export type { TransportConfig, TransportSubscription, QualityLevel, TransportCapabilities, TransportMode, TransportState, DRIADRelay, AmtRelayInfo, GroupKey, PacketMetadata, Micro, SyncDecision, WindowMulticastSubscribeConfig, WindowMulticastSubscribeConfigBytes, WindowMulticastSubscribeConfigAmt, WindowMulticastSubscriptionState, WindowMulticastSubscriptionEventMap, WindowMulticastSubscription, WindowMulticastCapabilities, WindowMulticastGateway, MulticastTransportMode, MulticastConfig, PacketSource, SubscriptionState, SubscriptionStats, MulticastSubscriptionHandle, MulticastBridge, MoqFecConfig, RepairObjectHeader, } from "./types.js";
26
- export { FEC_CONFIG_MESSAGE_TYPE, REPAIR_TRACK_SUFFIX, repairTrackPath, isRepairTrack, sourceTrackFromRepair, MoqFecAlgorithm, } from "./types.js";
25
+ export type { TransportConfig, TransportSubscription, QualityLevel, TransportCapabilities, TransportMode, TransportState, DRIADRelay, AmtRelayInfo, GroupKey, PacketMetadata, Micro, SyncDecision, WindowMulticastSubscribeConfig, WindowMulticastSubscribeConfigBytes, WindowMulticastSubscribeConfigAmt, WindowMulticastSubscriptionState, WindowMulticastSubscriptionEventMap, WindowMulticastSubscription, WindowMulticastDelivery, WindowMulticastCapabilities, WindowMulticastGateway, MulticastTransportMode, MulticastConfig, PacketSource, SubscriptionState, SubscriptionStats, MulticastSubscriptionHandle, MulticastBridge, MoqFecConfig, RepairObjectHeader, } from "./types.js";
26
+ export {
27
+ /** @deprecated FEC configuration is signalled in the catalog `fec` block. */
28
+ FEC_CONFIG_MESSAGE_TYPE, repairTrackPath, MoqFecAlgorithm, } from "./types.js";
27
29
  export { TransportManager, transportManager } from "./transport-manager.js";
28
30
  export { DRIADDiscovery, driadDiscovery } from "./driad-discovery.js";
29
31
  export { AdaptiveBitrateController, QUALITY_LEVELS, type FecStatsForAbr, } from "./abr-controller.js";
30
32
  export { endpointKey, selectMulticastTier, type MulticastTierEndpoint, } from "./multicast-tier.js";
31
33
  export { MulticastOrchestrator, DEFAULT_DWELL_MS, DEFAULT_JOIN_DEADLINE_MS, goodputFromStats, type GoodputSample, type HeadroomSample, type MulticastTierPacket, type OrchestratorCommand, type OrchestratorOptions, type OrchestratorState, } from "./multicast-orchestrator.js";
32
34
  export { createMulticastSignalingReconciler, normalizeCatalogEndpoints, type MulticastSignalingEndpoint, } from "./multicast-signaling-reconciler.js";
33
- export { endpointToMulticastConfig, hasMulticastCatalogBaseline, hasUnicastMediaRenditions, isMulticastOnlyCatalog, isRecoverableMulticastSignalReadError, mergeUrlMulticastPolicy, normalizeMulticastConfig, readPlayerMulticastConfig, requiresMulticastCapability, sameMulticastConfig, selectEndpointPacketIds, selectEndpointPacketIdsForTracks, selectMulticastCandidate, selectMulticastCandidateForTracks, urlOverrideBlocksMulticastCandidate, withMulticastEndpoints, type PlayerMulticastConfig, type MulticastTrackSelection, } from "./multicast-catalog-policy.js";
34
- export { isMulticastExplicitlyDisabled, isUsableMulticastEndpoint, isValidMulticastGroupAddress, multicastEndpointKey, normalizeMulticastEndpoint, readUrlMulticastConfig, toWindowMulticastSubscribeConfig, type MulticastEndpointConfig, type MulticastTransportPreference, type WindowMulticastEndpointInput, } from "./endpoint-config.js";
35
+ export { catalogTierEndpoints, endpointCarriesMedia, endpointToMulticastConfig, hasMulticastCatalogBaseline, hasUnicastMediaRenditions, isMulticastOnlyCatalog, isRecoverableMulticastSignalReadError, mergeUrlMulticastPolicy, normalizeMulticastConfig, readPlayerMulticastConfig, requiresMulticastCapability, sameMulticastConfig, selectEndpointPacketIds, selectEndpointPacketIdsForTracks, selectMulticastCandidate, selectMulticastCandidateForTracks, urlOverrideBlocksMulticastCandidate, withMulticastEndpoints, type PlayerMulticastConfig, type MulticastTrackSelection, } from "./multicast-catalog-policy.js";
36
+ export { isMulticastExplicitlyDisabled, isMulticastTrackPacketId, isUsableMulticastEndpoint, isValidMulticastGroupAddress, multicastEndpointKey, normalizeMulticastEndpoint, readUrlMulticastConfig, toWindowMulticastSubscribeConfig, type MulticastEndpointConfig, type MulticastTransportPreference, type WindowMulticastEndpointInput, } from "./endpoint-config.js";
37
+ export { subscriptionDeliversPacketBatches } from "./packet-batch.js";
35
38
  export { MulticastSubscriptionPool, multicastSubscriptionPool, type MulticastSubscriptionConsumer, type MulticastSubscriptionLease, } from "./multicast-subscription-pool.js";
36
39
  export { classifyStall, TransportStallDetector, type FecProgressSnapshot, type PlayerStallClassification, type PlayerStallSnapshot, type StallDetectorConfig, } from "./stall-detector.js";
37
40
  export { makeSourceSwitchHandler, wireStallDetector, wireStarvationDetector, type ActivatableSessions, type FecStarvationSnapshot, type LossArcSession, type StallDetectorLike, type StarvationDetectorLike, } from "./takeover.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -23,7 +23,9 @@
23
23
  * - A/V synchronization via SharedClock
24
24
  */
25
25
  // FEC constants and utilities per draft-ramadan-moq-fec-00
26
- export { FEC_CONFIG_MESSAGE_TYPE, REPAIR_TRACK_SUFFIX, repairTrackPath, isRepairTrack, sourceTrackFromRepair, MoqFecAlgorithm, } from "./types.js";
26
+ export {
27
+ /** @deprecated FEC configuration is signalled in the catalog `fec` block. */
28
+ FEC_CONFIG_MESSAGE_TYPE, repairTrackPath, MoqFecAlgorithm, } from "./types.js";
27
29
  export { TransportManager, transportManager } from "./transport-manager.js";
28
30
  // DRIAD Discovery
29
31
  export { DRIADDiscovery, driadDiscovery } from "./driad-discovery.js";
@@ -32,8 +34,9 @@ export { AdaptiveBitrateController, QUALITY_LEVELS, } from "./abr-controller.js"
32
34
  export { endpointKey, selectMulticastTier, } from "./multicast-tier.js";
33
35
  export { MulticastOrchestrator, DEFAULT_DWELL_MS, DEFAULT_JOIN_DEADLINE_MS, goodputFromStats, } from "./multicast-orchestrator.js";
34
36
  export { createMulticastSignalingReconciler, normalizeCatalogEndpoints, } from "./multicast-signaling-reconciler.js";
35
- export { endpointToMulticastConfig, hasMulticastCatalogBaseline, hasUnicastMediaRenditions, isMulticastOnlyCatalog, isRecoverableMulticastSignalReadError, mergeUrlMulticastPolicy, normalizeMulticastConfig, readPlayerMulticastConfig, requiresMulticastCapability, sameMulticastConfig, selectEndpointPacketIds, selectEndpointPacketIdsForTracks, selectMulticastCandidate, selectMulticastCandidateForTracks, urlOverrideBlocksMulticastCandidate, withMulticastEndpoints, } from "./multicast-catalog-policy.js";
36
- export { isMulticastExplicitlyDisabled, isUsableMulticastEndpoint, isValidMulticastGroupAddress, multicastEndpointKey, normalizeMulticastEndpoint, readUrlMulticastConfig, toWindowMulticastSubscribeConfig, } from "./endpoint-config.js";
37
+ export { catalogTierEndpoints, endpointCarriesMedia, endpointToMulticastConfig, hasMulticastCatalogBaseline, hasUnicastMediaRenditions, isMulticastOnlyCatalog, isRecoverableMulticastSignalReadError, mergeUrlMulticastPolicy, normalizeMulticastConfig, readPlayerMulticastConfig, requiresMulticastCapability, sameMulticastConfig, selectEndpointPacketIds, selectEndpointPacketIdsForTracks, selectMulticastCandidate, selectMulticastCandidateForTracks, urlOverrideBlocksMulticastCandidate, withMulticastEndpoints, } from "./multicast-catalog-policy.js";
38
+ export { isMulticastExplicitlyDisabled, isMulticastTrackPacketId, isUsableMulticastEndpoint, isValidMulticastGroupAddress, multicastEndpointKey, normalizeMulticastEndpoint, readUrlMulticastConfig, toWindowMulticastSubscribeConfig, } from "./endpoint-config.js";
39
+ export { subscriptionDeliversPacketBatches } from "./packet-batch.js";
37
40
  export { MulticastSubscriptionPool, multicastSubscriptionPool, } from "./multicast-subscription-pool.js";
38
41
  export { classifyStall, TransportStallDetector, } from "./stall-detector.js";
39
42
  export { makeSourceSwitchHandler, wireStallDetector, wireStarvationDetector, } from "./takeover.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAqCH,2DAA2D;AAC3D,OAAO,EACN,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE5E,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE,8BAA8B;AAC9B,OAAO,EACN,yBAAyB,EACzB,cAAc,GAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,WAAW,EACX,mBAAmB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,GAOhB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,kCAAkC,EAClC,yBAAyB,GAEzB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACN,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACtB,qCAAqC,EACrC,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,gCAAgC,EAChC,wBAAwB,EACxB,iCAAiC,EACjC,mCAAmC,EACnC,sBAAsB,GAGtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACN,6BAA6B,EAC7B,yBAAyB,EACzB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,gCAAgC,GAIhC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACN,yBAAyB,EACzB,yBAAyB,GAGzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACN,aAAa,EACb,sBAAsB,GAKtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,GAMtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACN,kBAAkB,GAUlB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EAErB,sBAAsB,GAEtB,MAAM,oBAAoB,CAAC;AAE5B,cAAc;AACd,OAAO,EACN,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAGjB,MAAM,kBAAkB,CAAC;AAE1B,iBAAiB;AACjB,OAAO,EACN,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAsCH,2DAA2D;AAC3D,OAAO;AACN,6EAA6E;AAC7E,uBAAuB,EACvB,eAAe,EACf,eAAe,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE5E,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE,8BAA8B;AAC9B,OAAO,EACN,yBAAyB,EACzB,cAAc,GAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,WAAW,EACX,mBAAmB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,GAOhB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,kCAAkC,EAClC,yBAAyB,GAEzB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACtB,qCAAqC,EACrC,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,gCAAgC,EAChC,wBAAwB,EACxB,iCAAiC,EACjC,mCAAmC,EACnC,sBAAsB,GAGtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACN,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,gCAAgC,GAIhC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EACN,yBAAyB,EACzB,yBAAyB,GAGzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACN,aAAa,EACb,sBAAsB,GAKtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,GAMtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACN,kBAAkB,GAUlB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EAErB,sBAAsB,GAEtB,MAAM,oBAAoB,CAAC;AAE5B,cAAc;AACd,OAAO,EACN,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAGjB,MAAM,kBAAkB,CAAC;AAE1B,iBAAiB;AACjB,OAAO,EACN,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACb,MAAM,YAAY,CAAC"}
@@ -4,10 +4,14 @@
4
4
  function endpointKey(endpoint) {
5
5
  return `${endpoint.sourceAddress ?? ""}|${endpoint.groupAddress}|${endpoint.port}`;
6
6
  }
7
+ function carriesMedia(endpoint) {
8
+ return endpoint.carriesMedia !== false;
9
+ }
7
10
  function selectMulticastTier(endpoints, estimate) {
8
- if (endpoints.length <= 1) return endpoints[0];
9
- const ranked = endpoints.filter((endpoint) => typeof endpoint.bandwidth === "number" && endpoint.bandwidth > 0).sort((a, b) => a.bandwidth - b.bandwidth);
10
- if (ranked.length < 2) return endpoints[0];
11
+ const media = endpoints.filter(carriesMedia);
12
+ if (media.length <= 1) return media[0];
13
+ const ranked = media.filter((endpoint) => typeof endpoint.bandwidth === "number" && endpoint.bandwidth > 0).sort((a, b) => a.bandwidth - b.bandwidth);
14
+ if (ranked.length < 2) return media[0];
11
15
  if (estimate === void 0) return ranked[0];
12
16
  const budget = estimate * 0.8;
13
17
  let selected;
@@ -162,11 +166,33 @@
162
166
  }
163
167
  };
164
168
 
169
+ // node_modules/@blockcast/mmt-alta-parse/dist/index.js
170
+ var MPU_HEADER_SIZE = 8;
171
+ var MPU_LENGTH_FIELD_SIZE = 2;
172
+ var MPU_HEADER_REMAINDER_SIZE = MPU_HEADER_SIZE - MPU_LENGTH_FIELD_SIZE;
173
+
174
+ // node_modules/@blockcast/mmt-base/dist/mmtp.js
175
+ var MPU_HEADER_SIZE2 = 8;
176
+ var MPU_LENGTH_FIELD_SIZE2 = 2;
177
+ var MPU_HEADER_REMAINDER_SIZE2 = MPU_HEADER_SIZE2 - MPU_LENGTH_FIELD_SIZE2;
178
+ var MMTP_SIGNALING_PACKET_ID = 0;
179
+ var MMTP_PACKET_ID_MAX = 65535;
180
+
165
181
  // src/endpoint-config.ts
166
182
  function toWindowMulticastSubscribeConfig(input) {
167
183
  if (input.mode !== void 0 && !["auto", "native", "tunnel"].includes(input.mode)) {
168
184
  throw new TypeError(`Unsupported multicast mode: ${String(input.mode)}`);
169
185
  }
186
+ if (input.packetIds !== void 0 && !Array.isArray(input.packetIds)) {
187
+ throw new TypeError(
188
+ `multicast packetIds must be an array, got ${input.packetIds === null ? "null" : typeof input.packetIds}`
189
+ );
190
+ }
191
+ if (input.packetIds?.some((id) => !isMulticastTrackPacketId(id)) || input.tracks?.some((track) => !isMulticastTrackPacketId(track.packetId))) {
192
+ throw new RangeError(
193
+ `multicast packetId must be an integer from 1 to ${MMTP_PACKET_ID_MAX}; packetId 0 is the MMTP signaling flow and is never a track's`
194
+ );
195
+ }
170
196
  const base = {
171
197
  group: input.group,
172
198
  port: input.port,
@@ -236,20 +262,36 @@
236
262
  normalized.amtRelayPort ?? ""
237
263
  ]);
238
264
  }
265
+ function isMulticastTrackPacketId(value) {
266
+ return Number.isInteger(value) && value > MMTP_SIGNALING_PACKET_ID && value <= MMTP_PACKET_ID_MAX;
267
+ }
239
268
  function isUsableMulticastEndpoint(endpoint) {
240
269
  const port = Number(endpoint?.port);
241
270
  return isValidMulticastGroupAddress(endpoint?.groupAddress) && isPositivePort(port);
242
271
  }
272
+ var RETIRED_MULTICAST_URL_PARAMS = [
273
+ ["amt_relay", "mc_amt_relay"],
274
+ ["amt_relay_port", "mc_amt_relay_port"]
275
+ ];
276
+ function assertNoRetiredMulticastUrlParams(params) {
277
+ for (const [retired, replacement] of RETIRED_MULTICAST_URL_PARAMS) {
278
+ if (params.has(retired)) {
279
+ throw new Error(
280
+ `multicast URL override: query parameter "${retired}" is retired; use "${replacement}"`
281
+ );
282
+ }
283
+ }
284
+ }
243
285
  function readUrlMulticastConfig(search = typeof location === "undefined" ? "" : location.search) {
244
286
  const params = typeof search === "string" ? new URLSearchParams(search) : search;
245
287
  const groupAddress = params.get("mc_group") || "";
246
288
  const port = positivePort(params.get("mc_port"));
247
289
  if (!groupAddress || !port) return void 0;
248
- const amtRelay = params.get("mc_amt_relay") || params.get("amt_relay") || void 0;
249
- const amtRelayPort = positivePort(params.get("mc_amt_relay_port") || params.get("amt_relay_port"));
290
+ const amtRelay = params.get("mc_amt_relay") || void 0;
291
+ const amtRelayPort = positivePort(params.get("mc_amt_relay_port"));
250
292
  const requestedMode = params.get("mc_mode");
251
293
  const mode = amtRelay ? "tunnel" : multicastMode(requestedMode);
252
- return normalizeMulticastEndpoint({
294
+ const endpoint = normalizeMulticastEndpoint({
253
295
  groupAddress,
254
296
  sourceAddress: params.get("mc_source") || void 0,
255
297
  port,
@@ -257,6 +299,8 @@
257
299
  ...amtRelay ? { amtRelay } : {},
258
300
  ...amtRelayPort ? { amtRelayPort } : {}
259
301
  });
302
+ if (endpoint) assertNoRetiredMulticastUrlParams(params);
303
+ return endpoint;
260
304
  }
261
305
  function isMulticastExplicitlyDisabled(search = typeof location === "undefined" ? "" : location.search) {
262
306
  const params = typeof search === "string" ? new URLSearchParams(search) : search;
@@ -359,7 +403,9 @@
359
403
  if (this.#favored?.source === "goodput") return void 0;
360
404
  const currentBandwidth = this.#current.bandwidth;
361
405
  if (typeof currentBandwidth !== "number") return void 0;
362
- const desired = this.options.endpoints.filter((endpoint) => typeof endpoint.bandwidth === "number" && endpoint.bandwidth > currentBandwidth).sort((a, b) => a.bandwidth - b.bandwidth)[0];
406
+ const desired = this.options.endpoints.filter(
407
+ (endpoint) => carriesMedia(endpoint) && typeof endpoint.bandwidth === "number" && endpoint.bandwidth > currentBandwidth
408
+ ).sort((a, b) => a.bandwidth - b.bandwidth)[0];
363
409
  if (!desired) {
364
410
  this.#favored = void 0;
365
411
  return void 0;
@@ -543,7 +589,7 @@
543
589
  if (endpoint.protocol === "ssm" && (typeof endpoint.sourceAddress !== "string" || endpoint.sourceAddress.trim().length === 0)) return false;
544
590
  if (!isValidMulticastGroupAddress(endpoint.groupAddress) || !Number.isInteger(Number(endpoint.port)) || endpoint.port <= 0 || endpoint.port > 65535 || !endpoint.tracks.length) return false;
545
591
  const catalogTracks = /* @__PURE__ */ new Set([...Object.keys(catalog?.video?.renditions ?? {}), ...Object.keys(catalog?.audio?.renditions ?? {})]);
546
- return endpoint.tracks.every((track) => !!track.name && Number.isInteger(Number(track.packetId)) && (catalogTracks.size === 0 || catalogTracks.has(track.name) || catalogTracks.has(track.name.replace(/\/repair$/, ""))));
592
+ return endpoint.tracks.every((track) => !!track.name && isMulticastTrackPacketId(track.packetId) && (catalogTracks.size === 0 || catalogTracks.has(track.name) || catalogTracks.has(track.name.replace(/\/repair$/, ""))));
547
593
  }
548
594
  function copyEndpoint(endpoint) {
549
595
  return { ...endpoint, tracks: endpoint.tracks.map((track) => ({ ...track })) };
@@ -602,7 +648,7 @@
602
648
  return renditionTrack && usableEndpoints.find((endpoint) => endpoint.tracks?.some((track) => matchesPreferredTrack(track.name, renditionTrack))) || defaultRenditionTrack && usableEndpoints.find((endpoint) => endpoint.tracks?.some((track) => matchesPreferredTrack(track.name, defaultRenditionTrack))) || usableEndpoints.find((endpoint) => endpoint.tracks?.some((track) => matchesPreferredTrack(track.name, preferredTrack))) || usableEndpoints[0] || null;
603
649
  }
604
650
  function endpointToMulticastConfig(endpoint, catalog, selection) {
605
- if (!endpoint || !isUsableMulticastEndpoint(endpoint)) return null;
651
+ if (!endpoint || !isUsableMulticastEndpoint(endpoint) || advertisesInvalidPacketId(endpoint)) return null;
606
652
  const config = {
607
653
  group: endpoint.groupAddress,
608
654
  source: endpoint.sourceAddress || "",
@@ -618,6 +664,7 @@
618
664
  }
619
665
  }
620
666
  const packetIds = selection === void 0 ? selectEndpointPacketIds(endpoint, catalog) : selectEndpointPacketIdsForTracks(endpoint, catalog, selection);
667
+ if (packetIds === null) return null;
621
668
  if (packetIds.length > 0) config.packetIds = packetIds;
622
669
  return config;
623
670
  }
@@ -630,6 +677,7 @@
630
677
  }
631
678
  function selectEndpointPacketIdsForTracks(endpoint, catalog, selection = {}) {
632
679
  if (!endpoint || !Array.isArray(endpoint.tracks)) return [];
680
+ if (advertisesInvalidPacketId(endpoint)) return null;
633
681
  const tracks = endpoint.tracks.map((track) => ({
634
682
  name: typeof track?.name === "string" ? track.name : "",
635
683
  packetId: validPacketId(track?.packetId)
@@ -659,9 +707,10 @@
659
707
  if (!isValidMulticastGroupAddress(group)) return null;
660
708
  const port = positivePort2(params.get("mc_port"));
661
709
  if (!port) return null;
710
+ assertNoRetiredMulticastUrlParams(params);
662
711
  const mode = params.get("mc_mode") || "";
663
- const amtRelay = params.get("mc_amt_relay") || params.get("amt_relay") || "";
664
- const amtRelayPort = positivePort2(params.get("mc_amt_relay_port") || params.get("amt_relay_port"));
712
+ const amtRelay = params.get("mc_amt_relay") || "";
713
+ const amtRelayPort = positivePort2(params.get("mc_amt_relay_port"));
665
714
  const config = {
666
715
  group,
667
716
  source: params.get("mc_source") || "",
@@ -677,6 +726,7 @@
677
726
  }
678
727
  function normalizeMulticastConfig(config) {
679
728
  if (!config?.group) return null;
729
+ if (Array.isArray(config.packetIds) && !config.packetIds.every(isMulticastTrackPacketId)) return null;
680
730
  const amt = findAmtRelay(config.amtNetworkSource);
681
731
  const amtRelay = config.amtRelay || amt?.relay || "";
682
732
  const amtRelayPort = config.amtRelayPort ?? amt?.port;
@@ -739,8 +789,10 @@
739
789
  return port ? { relay, port } : { relay };
740
790
  }
741
791
  function validPacketId(value) {
742
- const packetId = typeof value === "number" ? value : Number(value);
743
- return Number.isInteger(packetId) && packetId >= 0 && packetId <= 65535 ? packetId : void 0;
792
+ return isMulticastTrackPacketId(value) ? value : void 0;
793
+ }
794
+ function advertisesInvalidPacketId(endpoint) {
795
+ return Array.isArray(endpoint.tracks) && endpoint.tracks.some((track) => track?.packetId !== void 0 && !isMulticastTrackPacketId(track.packetId));
744
796
  }
745
797
  function normalizePacketIds(packetIds) {
746
798
  if (!Array.isArray(packetIds)) return [];
@@ -760,7 +812,19 @@
760
812
  }
761
813
  return renditions;
762
814
  }
815
+ function assertNoRetiredTrackFields(catalog) {
816
+ if (catalog && typeof catalog === "object" && "commonTrackFields" in catalog) {
817
+ throw new Error("multicast catalog policy: $.commonTrackFields is retired; every track must declare its own packaging");
818
+ }
819
+ const tracks = Array.isArray(catalog?.tracks) ? catalog.tracks : [];
820
+ tracks.forEach((track, index) => {
821
+ if (track && typeof track === "object" && "selectionParams" in track) {
822
+ throw new Error(`multicast catalog policy: $.tracks[${index}].selectionParams is retired; selection fields are flat on the track`);
823
+ }
824
+ });
825
+ }
763
826
  function catalogRepairTracks(catalog, name) {
827
+ assertNoRetiredTrackFields(catalog);
764
828
  const tracks = Array.isArray(catalog?.tracks) ? catalog.tracks : [];
765
829
  const track = tracks.find((candidate) => candidate?.name === name);
766
830
  const rendition = catalog?.video?.renditions?.[name] ?? catalog?.audio?.renditions?.[name];
@@ -769,9 +833,8 @@
769
833
  const names = /* @__PURE__ */ new Set();
770
834
  if (typeof fec.repairTrack === "string" && fec.repairTrack.length > 0) names.add(fec.repairTrack);
771
835
  const dependsOn = (entry) => Array.isArray(entry?.depends) && entry.depends.length === 1 && entry.depends[0] === name;
772
- const common = catalog?.commonTrackFields ?? {};
773
836
  for (const candidate of tracks) {
774
- const packaging = candidate?.packaging ?? common?.packaging;
837
+ const packaging = candidate?.packaging;
775
838
  if (packaging === "fec-repair" && typeof candidate?.name === "string" && candidate.name.length > 0 && dependsOn(candidate)) {
776
839
  names.add(candidate.name);
777
840
  }
@@ -808,6 +871,11 @@
808
871
  return selected;
809
872
  }
810
873
 
874
+ // src/packet-batch.ts
875
+ function subscriptionDeliversPacketBatches(subscription) {
876
+ return subscription.eventTypes?.includes("packets") === true;
877
+ }
878
+
811
879
  // src/multicast-subscription-pool.ts
812
880
  var MulticastSubscriptionPool = class {
813
881
  #entries = /* @__PURE__ */ new Map();
@@ -882,8 +950,18 @@
882
950
  }));
883
951
  const consumers = /* @__PURE__ */ new Map();
884
952
  let entry;
885
- const bytesListener = (event) => {
886
- this.#dispatch(consumers, (consumer) => consumer.onBytes(event.detail));
953
+ const packetListener = subscriptionDeliversPacketBatches(subscription) ? {
954
+ type: "packets",
955
+ listener: (event) => {
956
+ for (const data of event.detail) {
957
+ this.#dispatch(consumers, (consumer) => consumer.onBytes(data));
958
+ }
959
+ }
960
+ } : {
961
+ type: "bytes",
962
+ listener: (event) => {
963
+ this.#dispatch(consumers, (consumer) => consumer.onBytes(event.detail));
964
+ }
887
965
  };
888
966
  const stateListener = (event) => {
889
967
  this.#dispatch(consumers, (consumer) => consumer.onState?.(event.detail));
@@ -896,8 +974,12 @@
896
974
  const error = event.detail instanceof Error ? event.detail : new Error(String(event.detail));
897
975
  this.#dispatch(consumers, (consumer) => consumer.onError?.(error));
898
976
  };
899
- entry = { subscription, consumers, bytesListener, stateListener, errorListener, closed: false };
900
- subscription.addEventListener("bytes", bytesListener);
977
+ entry = { subscription, consumers, packetListener, stateListener, errorListener, closed: false };
978
+ if (packetListener.type === "packets") {
979
+ subscription.addEventListener("packets", packetListener.listener);
980
+ } else {
981
+ subscription.addEventListener("bytes", packetListener.listener);
982
+ }
901
983
  subscription.addEventListener("state", stateListener);
902
984
  subscription.addEventListener("error", errorListener);
903
985
  return entry;
@@ -912,7 +994,12 @@
912
994
  return id;
913
995
  }
914
996
  #detach(entry) {
915
- entry.subscription.removeEventListener("bytes", entry.bytesListener);
997
+ const { packetListener } = entry;
998
+ if (packetListener.type === "packets") {
999
+ entry.subscription.removeEventListener("packets", packetListener.listener);
1000
+ } else {
1001
+ entry.subscription.removeEventListener("bytes", packetListener.listener);
1002
+ }
916
1003
  entry.subscription.removeEventListener("state", entry.stateListener);
917
1004
  entry.subscription.removeEventListener("error", entry.errorListener);
918
1005
  }
@@ -944,9 +1031,20 @@
944
1031
  }
945
1032
  var MOQT_SUBSCRIBER_PRIORITY = Object.freeze({
946
1033
  catalog: moqtSubscriberPriority(0),
1034
+ /**
1035
+ * @deprecated A repair FETCH's SUBSCRIBER_PRIORITY is derived per request
1036
+ * from the catalog source and repair priorities (draft-ramadan-moq-fec
1037
+ * §11.4.5), not a player constant. Use the `subscriberPriority` that
1038
+ * `@blockcast/mmt-container`'s `wireRepairFetch` puts on each
1039
+ * `RepairFetchRequest` (`repairFetchSubscriberPriority`).
1040
+ */
947
1041
  deadlineRepair: moqtSubscriberPriority(0),
948
1042
  audio: moqtSubscriberPriority(1),
949
1043
  video: moqtSubscriberPriority(2),
1044
+ /**
1045
+ * @deprecated See `deadlineRepair`: use the request's catalog-derived
1046
+ * `RepairFetchRequest.subscriberPriority` (draft-ramadan-moq-fec §11.4.5).
1047
+ */
950
1048
  backgroundRepair: moqtSubscriberPriority(3)
951
1049
  });
952
1050
  var MOQT_PUBLISHER_PRIORITY = Object.freeze({