@blockcast/mmt-transport 0.2.2-main.c42cf9249e06 → 0.2.2-main.c71423b8a4e4
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 +40 -0
- package/dist/endpoint-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/mmt-transport.no-modules.js +68 -20
- package/dist/mmt-transport.no-modules.js.map +2 -2
- package/dist/multicast-catalog-policy.d.ts +27 -0
- package/dist/multicast-catalog-policy.d.ts.map +1 -1
- package/dist/multicast-catalog-policy.js +106 -14
- 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-subscription-pool.d.ts.map +1 -1
- package/dist/multicast-subscription-pool.js +3 -8
- 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/no-modules.d.ts +2 -1
- package/dist/no-modules.d.ts.map +1 -1
- package/dist/no-modules.js +2 -1
- package/dist/no-modules.js.map +1 -1
- package/dist/types.d.ts +29 -45
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -45
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/endpoint-config.ts +70 -0
- package/src/index.ts +6 -4
- package/src/multicast-catalog-policy.ts +109 -16
- package/src/multicast-orchestrator.ts +9 -2
- package/src/multicast-subscription-pool.ts +7 -8
- package/src/multicast-tier.ts +30 -3
- package/src/no-modules.ts +2 -0
- package/src/types.ts +35 -61
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
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { WindowMulticastSubscribeConfig } from "./types.js";
|
|
1
2
|
export type MulticastTransportPreference = "auto" | "native" | "tunnel";
|
|
2
3
|
export interface MulticastEndpointConfig {
|
|
3
4
|
groupAddress: string;
|
|
@@ -7,6 +8,35 @@ export interface MulticastEndpointConfig {
|
|
|
7
8
|
amtRelay?: string;
|
|
8
9
|
amtRelayPort?: number;
|
|
9
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Input accepted by the canonical window.multicast request converter.
|
|
13
|
+
*
|
|
14
|
+
* `mode` and the `amtRelay*` fields are internal endpoint-selection state;
|
|
15
|
+
* they are deliberately not emitted on the page-facing request. The
|
|
16
|
+
* resulting `origin` is the only acquisition selector understood by the
|
|
17
|
+
* gateway.
|
|
18
|
+
*/
|
|
19
|
+
export interface WindowMulticastEndpointInput {
|
|
20
|
+
group: string;
|
|
21
|
+
port: number;
|
|
22
|
+
source?: string;
|
|
23
|
+
mode?: MulticastTransportPreference;
|
|
24
|
+
amtRelay?: string;
|
|
25
|
+
amtRelayPort?: number;
|
|
26
|
+
packetIds?: readonly number[];
|
|
27
|
+
tracks?: ReadonlyArray<{
|
|
28
|
+
name: string;
|
|
29
|
+
packetId: number;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert internal endpoint-selection state to the canonical page contract.
|
|
34
|
+
*
|
|
35
|
+
* Native is the default and an explicit `native` selection always wins over
|
|
36
|
+
* stale relay metadata. Tunnel/AMT requests must carry the resolved relay
|
|
37
|
+
* and port; there is no implicit relay-port default at this boundary.
|
|
38
|
+
*/
|
|
39
|
+
export declare function toWindowMulticastSubscribeConfig(input: WindowMulticastEndpointInput): WindowMulticastSubscribeConfig;
|
|
10
40
|
export declare function isValidMulticastGroupAddress(address: string | undefined): boolean;
|
|
11
41
|
export declare function normalizeMulticastEndpoint(endpoint: MulticastEndpointConfig): MulticastEndpointConfig | undefined;
|
|
12
42
|
/** Stable ownership key for one IWA multicast/AMT subscription. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint-config.d.ts","sourceRoot":"","sources":["../src/endpoint-config.ts"],"names":[],"mappings":"AAAA,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,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":"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"}
|
package/dist/endpoint-config.js
CHANGED
|
@@ -1,3 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert internal endpoint-selection state to the canonical page contract.
|
|
3
|
+
*
|
|
4
|
+
* Native is the default and an explicit `native` selection always wins over
|
|
5
|
+
* stale relay metadata. Tunnel/AMT requests must carry the resolved relay
|
|
6
|
+
* and port; there is no implicit relay-port default at this boundary.
|
|
7
|
+
*/
|
|
8
|
+
export function toWindowMulticastSubscribeConfig(input) {
|
|
9
|
+
if (input.mode !== undefined && !["auto", "native", "tunnel"].includes(input.mode)) {
|
|
10
|
+
throw new TypeError(`Unsupported multicast mode: ${String(input.mode)}`);
|
|
11
|
+
}
|
|
12
|
+
const base = {
|
|
13
|
+
group: input.group,
|
|
14
|
+
port: input.port,
|
|
15
|
+
...(input.source?.trim() ? { source: input.source.trim() } : {}),
|
|
16
|
+
consume: "bytes",
|
|
17
|
+
...(input.packetIds?.length ? { packetIds: [...input.packetIds] } : {}),
|
|
18
|
+
};
|
|
19
|
+
const relay = input.amtRelay?.trim();
|
|
20
|
+
const wantsAmt = input.mode === "tunnel" ||
|
|
21
|
+
(input.mode !== "native" && relay !== undefined && relay !== "");
|
|
22
|
+
if (!wantsAmt) {
|
|
23
|
+
const native = {
|
|
24
|
+
...base,
|
|
25
|
+
origin: "ip-multicast",
|
|
26
|
+
...(input.tracks?.length ? { tracks: input.tracks.map(({ name, packetId }) => ({ name, packetId })) } : {}),
|
|
27
|
+
};
|
|
28
|
+
return native;
|
|
29
|
+
}
|
|
30
|
+
const relayPort = input.amtRelayPort;
|
|
31
|
+
if (!relay || relayPort === undefined || !isPositivePort(relayPort)) {
|
|
32
|
+
throw new TypeError("AMT requires a resolved relay and a valid relay port");
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
...base,
|
|
36
|
+
origin: "amt",
|
|
37
|
+
relay,
|
|
38
|
+
relayPort,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
1
41
|
export function isValidMulticastGroupAddress(address) {
|
|
2
42
|
const value = address?.trim().toLowerCase();
|
|
3
43
|
if (!value)
|
|
@@ -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,16 @@
|
|
|
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,
|
|
26
|
-
export { FEC_CONFIG_MESSAGE_TYPE,
|
|
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, repairTrackPath, MoqFecAlgorithm, } from "./types.js";
|
|
27
27
|
export { TransportManager, transportManager } from "./transport-manager.js";
|
|
28
28
|
export { DRIADDiscovery, driadDiscovery } from "./driad-discovery.js";
|
|
29
29
|
export { AdaptiveBitrateController, QUALITY_LEVELS, type FecStatsForAbr, } from "./abr-controller.js";
|
|
30
30
|
export { endpointKey, selectMulticastTier, type MulticastTierEndpoint, } from "./multicast-tier.js";
|
|
31
31
|
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
32
|
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, type MulticastEndpointConfig, type MulticastTransportPreference, } from "./endpoint-config.js";
|
|
33
|
+
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";
|
|
34
|
+
export { isMulticastExplicitlyDisabled, isUsableMulticastEndpoint, isValidMulticastGroupAddress, multicastEndpointKey, normalizeMulticastEndpoint, readUrlMulticastConfig, toWindowMulticastSubscribeConfig, type MulticastEndpointConfig, type MulticastTransportPreference, type WindowMulticastEndpointInput, } from "./endpoint-config.js";
|
|
35
35
|
export { MulticastSubscriptionPool, multicastSubscriptionPool, type MulticastSubscriptionConsumer, type MulticastSubscriptionLease, } from "./multicast-subscription-pool.js";
|
|
36
36
|
export { classifyStall, TransportStallDetector, type FecProgressSnapshot, type PlayerStallClassification, type PlayerStallSnapshot, type StallDetectorConfig, } from "./stall-detector.js";
|
|
37
37
|
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,
|
|
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,7 @@
|
|
|
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,
|
|
26
|
+
export { FEC_CONFIG_MESSAGE_TYPE, repairTrackPath, MoqFecAlgorithm, } from "./types.js";
|
|
27
27
|
export { TransportManager, transportManager } from "./transport-manager.js";
|
|
28
28
|
// DRIAD Discovery
|
|
29
29
|
export { DRIADDiscovery, driadDiscovery } from "./driad-discovery.js";
|
|
@@ -32,8 +32,8 @@ export { AdaptiveBitrateController, QUALITY_LEVELS, } from "./abr-controller.js"
|
|
|
32
32
|
export { endpointKey, selectMulticastTier, } from "./multicast-tier.js";
|
|
33
33
|
export { MulticastOrchestrator, DEFAULT_DWELL_MS, DEFAULT_JOIN_DEADLINE_MS, goodputFromStats, } from "./multicast-orchestrator.js";
|
|
34
34
|
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, } from "./endpoint-config.js";
|
|
35
|
+
export { catalogTierEndpoints, endpointCarriesMedia, 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
37
|
export { MulticastSubscriptionPool, multicastSubscriptionPool, } from "./multicast-subscription-pool.js";
|
|
38
38
|
export { classifyStall, TransportStallDetector, } from "./stall-detector.js";
|
|
39
39
|
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;AAqCH,2DAA2D;AAC3D,OAAO,EACN,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,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"}
|
|
@@ -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;
|
|
@@ -163,6 +167,38 @@
|
|
|
163
167
|
};
|
|
164
168
|
|
|
165
169
|
// src/endpoint-config.ts
|
|
170
|
+
function toWindowMulticastSubscribeConfig(input) {
|
|
171
|
+
if (input.mode !== void 0 && !["auto", "native", "tunnel"].includes(input.mode)) {
|
|
172
|
+
throw new TypeError(`Unsupported multicast mode: ${String(input.mode)}`);
|
|
173
|
+
}
|
|
174
|
+
const base = {
|
|
175
|
+
group: input.group,
|
|
176
|
+
port: input.port,
|
|
177
|
+
...input.source?.trim() ? { source: input.source.trim() } : {},
|
|
178
|
+
consume: "bytes",
|
|
179
|
+
...input.packetIds?.length ? { packetIds: [...input.packetIds] } : {}
|
|
180
|
+
};
|
|
181
|
+
const relay = input.amtRelay?.trim();
|
|
182
|
+
const wantsAmt = input.mode === "tunnel" || input.mode !== "native" && relay !== void 0 && relay !== "";
|
|
183
|
+
if (!wantsAmt) {
|
|
184
|
+
const native = {
|
|
185
|
+
...base,
|
|
186
|
+
origin: "ip-multicast",
|
|
187
|
+
...input.tracks?.length ? { tracks: input.tracks.map(({ name, packetId }) => ({ name, packetId })) } : {}
|
|
188
|
+
};
|
|
189
|
+
return native;
|
|
190
|
+
}
|
|
191
|
+
const relayPort = input.amtRelayPort;
|
|
192
|
+
if (!relay || relayPort === void 0 || !isPositivePort(relayPort)) {
|
|
193
|
+
throw new TypeError("AMT requires a resolved relay and a valid relay port");
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
...base,
|
|
197
|
+
origin: "amt",
|
|
198
|
+
relay,
|
|
199
|
+
relayPort
|
|
200
|
+
};
|
|
201
|
+
}
|
|
166
202
|
function isValidMulticastGroupAddress(address) {
|
|
167
203
|
const value = address?.trim().toLowerCase();
|
|
168
204
|
if (!value) return false;
|
|
@@ -327,7 +363,9 @@
|
|
|
327
363
|
if (this.#favored?.source === "goodput") return void 0;
|
|
328
364
|
const currentBandwidth = this.#current.bandwidth;
|
|
329
365
|
if (typeof currentBandwidth !== "number") return void 0;
|
|
330
|
-
const desired = this.options.endpoints.filter(
|
|
366
|
+
const desired = this.options.endpoints.filter(
|
|
367
|
+
(endpoint) => carriesMedia(endpoint) && typeof endpoint.bandwidth === "number" && endpoint.bandwidth > currentBandwidth
|
|
368
|
+
).sort((a, b) => a.bandwidth - b.bandwidth)[0];
|
|
331
369
|
if (!desired) {
|
|
332
370
|
this.#favored = void 0;
|
|
333
371
|
return void 0;
|
|
@@ -617,9 +655,7 @@
|
|
|
617
655
|
(track) => track !== void 0
|
|
618
656
|
);
|
|
619
657
|
if (selected.length === 0) return normalizePacketIds(tracks.map((track) => track.packetId));
|
|
620
|
-
const selectedRepairNames = new Set(
|
|
621
|
-
selected.map((track) => catalogRepairTrack(catalog, track.name)).filter((name) => typeof name === "string" && name.length > 0)
|
|
622
|
-
);
|
|
658
|
+
const selectedRepairNames = new Set(selected.flatMap((track) => catalogRepairTracks(catalog, track.name)));
|
|
623
659
|
const selectedRepairTracks = tracks.filter((track) => selectedRepairNames.has(track.name));
|
|
624
660
|
return normalizePacketIds([...selected, ...selectedRepairTracks].map((track) => track.packetId));
|
|
625
661
|
}
|
|
@@ -730,13 +766,29 @@
|
|
|
730
766
|
}
|
|
731
767
|
return renditions;
|
|
732
768
|
}
|
|
733
|
-
function
|
|
734
|
-
const
|
|
735
|
-
const
|
|
736
|
-
if (typeof trackRepair === "string" && trackRepair.length > 0) return trackRepair;
|
|
769
|
+
function catalogRepairTracks(catalog, name) {
|
|
770
|
+
const tracks = Array.isArray(catalog?.tracks) ? catalog.tracks : [];
|
|
771
|
+
const track = tracks.find((candidate) => candidate?.name === name);
|
|
737
772
|
const rendition = catalog?.video?.renditions?.[name] ?? catalog?.audio?.renditions?.[name];
|
|
738
|
-
const
|
|
739
|
-
|
|
773
|
+
const fec = track?.fec ?? rendition?.fec;
|
|
774
|
+
if (!fec || fec.algorithm === "none") return [];
|
|
775
|
+
const names = /* @__PURE__ */ new Set();
|
|
776
|
+
if (typeof fec.repairTrack === "string" && fec.repairTrack.length > 0) names.add(fec.repairTrack);
|
|
777
|
+
const dependsOn = (entry) => Array.isArray(entry?.depends) && entry.depends.length === 1 && entry.depends[0] === name;
|
|
778
|
+
const common = catalog?.commonTrackFields ?? {};
|
|
779
|
+
for (const candidate of tracks) {
|
|
780
|
+
const packaging = candidate?.packaging ?? common?.packaging;
|
|
781
|
+
if (packaging === "fec-repair" && typeof candidate?.name === "string" && candidate.name.length > 0 && dependsOn(candidate)) {
|
|
782
|
+
names.add(candidate.name);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
const repairRenditions = catalog?.repair?.renditions;
|
|
786
|
+
if (repairRenditions && typeof repairRenditions === "object") {
|
|
787
|
+
for (const [repairName, entry] of Object.entries(repairRenditions)) {
|
|
788
|
+
if (repairName.length > 0 && dependsOn(entry)) names.add(repairName);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
return [...names];
|
|
740
792
|
}
|
|
741
793
|
function videoRenditionRank(config, name) {
|
|
742
794
|
if (typeof config?.bitrate === "number" && config.bitrate > 0) return config.bitrate;
|
|
@@ -826,19 +878,14 @@
|
|
|
826
878
|
return this.#entries.size;
|
|
827
879
|
}
|
|
828
880
|
async #createEntry(gateway, endpoint, onClosed) {
|
|
829
|
-
const subscription = await gateway.subscribe({
|
|
881
|
+
const subscription = await gateway.subscribe(toWindowMulticastSubscribeConfig({
|
|
830
882
|
group: endpoint.groupAddress,
|
|
831
883
|
...endpoint.sourceAddress ? { source: endpoint.sourceAddress } : {},
|
|
832
884
|
port: endpoint.port,
|
|
833
|
-
consume: "bytes",
|
|
834
|
-
// MMTP FEC symbols are individually load-bearing. Quinn's "latest"
|
|
835
|
-
// policy may replace accepted frames while a shard is flow-controlled,
|
|
836
|
-
// which can discard more source symbols than the repair budget covers.
|
|
837
|
-
reliableBacklog: "ordered",
|
|
838
885
|
...endpoint.mode ? { mode: endpoint.mode } : {},
|
|
839
886
|
...endpoint.amtRelay ? { amtRelay: endpoint.amtRelay } : {},
|
|
840
887
|
...endpoint.amtRelayPort ? { amtRelayPort: endpoint.amtRelayPort } : {}
|
|
841
|
-
});
|
|
888
|
+
}));
|
|
842
889
|
const consumers = /* @__PURE__ */ new Map();
|
|
843
890
|
let entry;
|
|
844
891
|
const bytesListener = (event) => {
|
|
@@ -1642,6 +1689,7 @@
|
|
|
1642
1689
|
normalizeMulticastEndpoint,
|
|
1643
1690
|
readPlayerMulticastConfig,
|
|
1644
1691
|
readUrlMulticastConfig,
|
|
1692
|
+
toWindowMulticastSubscribeConfig,
|
|
1645
1693
|
requiresMulticastCapability,
|
|
1646
1694
|
runUnicastFallback,
|
|
1647
1695
|
sameMulticastConfig,
|