@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.
- package/README.md +2 -2
- package/dist/endpoint-config.d.ts +30 -0
- package/dist/endpoint-config.d.ts.map +1 -1
- package/dist/endpoint-config.js +70 -3
- package/dist/endpoint-config.js.map +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/mmt-transport.no-modules.js +118 -20
- package/dist/mmt-transport.no-modules.js.map +4 -4
- package/dist/moqt-priority.d.ts +11 -0
- package/dist/moqt-priority.d.ts.map +1 -1
- package/dist/moqt-priority.js +11 -0
- package/dist/moqt-priority.js.map +1 -1
- package/dist/multicast-catalog-policy.d.ts +43 -3
- package/dist/multicast-catalog-policy.d.ts.map +1 -1
- package/dist/multicast-catalog-policy.js +129 -9
- package/dist/multicast-catalog-policy.js.map +1 -1
- package/dist/multicast-orchestrator.d.ts.map +1 -1
- package/dist/multicast-orchestrator.js +7 -2
- package/dist/multicast-orchestrator.js.map +1 -1
- package/dist/multicast-signaling-reconciler.js +5 -2
- package/dist/multicast-signaling-reconciler.js.map +1 -1
- package/dist/multicast-subscription-pool.d.ts.map +1 -1
- package/dist/multicast-subscription-pool.js +34 -6
- package/dist/multicast-subscription-pool.js.map +1 -1
- package/dist/multicast-tier.d.ts +19 -0
- package/dist/multicast-tier.d.ts.map +1 -1
- package/dist/multicast-tier.js +21 -4
- package/dist/multicast-tier.js.map +1 -1
- package/dist/packet-batch.d.ts +13 -0
- package/dist/packet-batch.d.ts.map +1 -0
- package/dist/packet-batch.js +14 -0
- package/dist/packet-batch.js.map +1 -0
- package/dist/types.d.ts +51 -34
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -47
- package/dist/types.js.map +1 -1
- package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-base/README.md +121 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +328 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +750 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +1020 -0
- package/package.json +7 -1
- package/src/endpoint-config.ts +78 -3
- package/src/index.ts +7 -3
- package/src/moqt-priority.ts +11 -0
- package/src/multicast-catalog-policy.ts +137 -10
- package/src/multicast-orchestrator.ts +9 -2
- package/src/multicast-signaling-reconciler.ts +5 -2
- package/src/multicast-subscription-pool.ts +39 -7
- package/src/multicast-tier.ts +30 -3
- package/src/packet-batch.ts +17 -0
- 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`.
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/endpoint-config.js
CHANGED
|
@@ -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") ||
|
|
102
|
-
const amtRelayPort = positivePort(params.get("mc_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
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"endpoint-config.js","sourceRoot":"","sources":["../src/endpoint-config.ts"],"names":[],"mappings":"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"}
|
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 {
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,YAAY,EACX,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,KAAK,EACL,YAAY,EACZ,8BAA8B,EAC9B,mCAAmC,EACnC,iCAAiC,EACjC,gCAAgC,EAChC,mCAAmC,EACnC,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EAEtB,sBAAsB,EACtB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,EAEf,YAAY,EACZ,kBAAkB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,
|
|
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 {
|
|
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;
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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") ||
|
|
249
|
-
const amtRelayPort = positivePort(params.get("mc_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
|
-
|
|
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(
|
|
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 &&
|
|
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") ||
|
|
664
|
-
const amtRelayPort = positivePort2(params.get("mc_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
|
-
|
|
743
|
-
|
|
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
|
|
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
|
|
886
|
-
|
|
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,
|
|
900
|
-
|
|
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
|
-
|
|
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({
|