@blockcast/mmt-transport 0.2.0 → 0.2.2
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 +264 -0
- package/dist/.build-stamp +0 -0
- package/dist/abr-controller.d.ts +3 -0
- package/dist/abr-controller.d.ts.map +1 -1
- package/dist/abr-controller.js +5 -0
- package/dist/abr-controller.js.map +1 -1
- package/dist/amt-gateway.d.ts.map +1 -1
- package/dist/amt-gateway.js +2 -1
- package/dist/amt-gateway.js.map +1 -1
- package/dist/endpoint-config.d.ts +20 -0
- package/dist/endpoint-config.d.ts.map +1 -0
- package/dist/endpoint-config.js +103 -0
- package/dist/endpoint-config.js.map +1 -0
- package/dist/endpoint-config.test.d.ts +2 -0
- package/dist/endpoint-config.test.d.ts.map +1 -0
- package/dist/endpoint-config.test.js +39 -0
- package/dist/endpoint-config.test.js.map +1 -0
- package/dist/fec-client.d.ts +2 -2
- package/dist/fec-client.d.ts.map +1 -1
- package/dist/fec-client.js +10 -5
- package/dist/fec-client.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/mmt-transport.no-modules.js +1154 -0
- package/dist/mmt-transport.no-modules.js.map +7 -0
- package/dist/multicast-orchestrator.d.ts +56 -0
- package/dist/multicast-orchestrator.d.ts.map +1 -0
- package/dist/multicast-orchestrator.js +123 -0
- package/dist/multicast-orchestrator.js.map +1 -0
- package/dist/multicast-subscription-pool.d.ts +18 -0
- package/dist/multicast-subscription-pool.d.ts.map +1 -0
- package/dist/multicast-subscription-pool.js +130 -0
- package/dist/multicast-subscription-pool.js.map +1 -0
- package/dist/multicast-subscription-pool.test.d.ts +2 -0
- package/dist/multicast-subscription-pool.test.d.ts.map +1 -0
- package/dist/multicast-subscription-pool.test.js +108 -0
- package/dist/multicast-subscription-pool.test.js.map +1 -0
- package/dist/multicast-tier.d.ts +14 -0
- package/dist/multicast-tier.d.ts.map +1 -0
- package/dist/multicast-tier.js +22 -0
- package/dist/multicast-tier.js.map +1 -0
- package/dist/multicast-tier.test.d.ts +2 -0
- package/dist/multicast-tier.test.d.ts.map +1 -0
- package/dist/multicast-tier.test.js +75 -0
- package/dist/multicast-tier.test.js.map +1 -0
- package/dist/no-modules.d.ts +29 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +35 -0
- package/dist/no-modules.js.map +1 -0
- package/dist/stall-detector.d.ts +22 -0
- package/dist/stall-detector.d.ts.map +1 -0
- package/dist/stall-detector.js +46 -0
- package/dist/stall-detector.js.map +1 -0
- package/dist/stall-detector.test.d.ts +2 -0
- package/dist/stall-detector.test.d.ts.map +1 -0
- package/dist/stall-detector.test.js +33 -0
- package/dist/stall-detector.test.js.map +1 -0
- package/dist/takeover.d.ts +49 -0
- package/dist/takeover.d.ts.map +1 -0
- package/dist/takeover.js +43 -0
- package/dist/takeover.js.map +1 -0
- package/dist/transport-manager.d.ts +28 -18
- package/dist/transport-manager.d.ts.map +1 -1
- package/dist/transport-manager.js +192 -138
- package/dist/transport-manager.js.map +1 -1
- package/dist/transport-manager.test.d.ts +2 -0
- package/dist/transport-manager.test.d.ts.map +1 -0
- package/dist/transport-manager.test.js +155 -0
- package/dist/transport-manager.test.js.map +1 -0
- package/dist/types.d.ts +36 -36
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/unicast-fallback.d.ts +36 -0
- package/dist/unicast-fallback.d.ts.map +1 -0
- package/dist/unicast-fallback.js +53 -0
- package/dist/unicast-fallback.js.map +1 -0
- package/package.json +6 -6
- package/src/abr-controller.ts +9 -0
- package/src/amt-gateway.ts +2 -1
- package/src/endpoint-config.test.ts +54 -0
- package/src/endpoint-config.ts +121 -0
- package/src/fec-client.ts +11 -5
- package/src/index.ts +72 -2
- package/src/multicast-orchestrator.ts +150 -0
- package/src/multicast-subscription-pool.test.ts +115 -0
- package/src/multicast-subscription-pool.ts +164 -0
- package/src/multicast-tier.test.ts +80 -0
- package/src/multicast-tier.ts +32 -0
- package/src/no-modules.ts +44 -0
- package/src/stall-detector.test.ts +34 -0
- package/src/stall-detector.ts +63 -0
- package/src/takeover.ts +71 -0
- package/src/transport-manager.test.ts +192 -0
- package/src/transport-manager.ts +203 -153
- package/src/types.ts +50 -31
- package/src/unicast-fallback.ts +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-manager.test.d.ts","sourceRoot":"","sources":["../src/transport-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { TransportManager } from "./transport-manager.js";
|
|
3
|
+
const CONFIG = {
|
|
4
|
+
group: "232.1.1.50",
|
|
5
|
+
source: "192.168.1.181",
|
|
6
|
+
port: 8000,
|
|
7
|
+
streamType: "video",
|
|
8
|
+
driadEnabled: false,
|
|
9
|
+
};
|
|
10
|
+
describe("TransportManager window.multicast integration", () => {
|
|
11
|
+
let hadWindow = false;
|
|
12
|
+
let previousWindow;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
hadWindow = Object.hasOwn(globalThis, "window");
|
|
15
|
+
previousWindow = globalThis
|
|
16
|
+
.window;
|
|
17
|
+
vi.spyOn(console, "log").mockImplementation(() => { });
|
|
18
|
+
vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
19
|
+
vi.spyOn(console, "error").mockImplementation(() => { });
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
if (hadWindow) {
|
|
23
|
+
globalThis.window =
|
|
24
|
+
previousWindow;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
delete globalThis.window;
|
|
28
|
+
}
|
|
29
|
+
vi.restoreAllMocks();
|
|
30
|
+
});
|
|
31
|
+
it("does not treat legacy window.Multicast as a usable transport", async () => {
|
|
32
|
+
const subscribeSSM = vi.fn();
|
|
33
|
+
globalThis.window = {
|
|
34
|
+
Multicast: { subscribeSSM },
|
|
35
|
+
};
|
|
36
|
+
const manager = new TransportManager();
|
|
37
|
+
const connected = await manager.connect(CONFIG);
|
|
38
|
+
expect(connected).toBe(false);
|
|
39
|
+
expect(subscribeSSM).not.toHaveBeenCalled();
|
|
40
|
+
});
|
|
41
|
+
it("subscribes through lowercase window.multicast and forwards bytes", async () => {
|
|
42
|
+
const listeners = new Map();
|
|
43
|
+
const subscription = {
|
|
44
|
+
id: "sub-1",
|
|
45
|
+
addEventListener: vi.fn((type, listener) => {
|
|
46
|
+
listeners.set(type, listener);
|
|
47
|
+
}),
|
|
48
|
+
removeEventListener: vi.fn(),
|
|
49
|
+
unsubscribe: vi.fn().mockResolvedValue(undefined),
|
|
50
|
+
};
|
|
51
|
+
const subscribe = vi.fn().mockResolvedValue(subscription);
|
|
52
|
+
globalThis.window = {
|
|
53
|
+
multicast: {
|
|
54
|
+
capabilities: { consumeModes: ["bytes"] },
|
|
55
|
+
subscribe,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const manager = new TransportManager();
|
|
59
|
+
const onPacket = vi.fn();
|
|
60
|
+
manager.setPacketCallback(onPacket);
|
|
61
|
+
const connected = await manager.connect(CONFIG);
|
|
62
|
+
expect(connected).toBe(true);
|
|
63
|
+
expect(subscribe).toHaveBeenCalledWith({
|
|
64
|
+
group: CONFIG.group,
|
|
65
|
+
source: CONFIG.source,
|
|
66
|
+
port: CONFIG.port,
|
|
67
|
+
consume: "bytes",
|
|
68
|
+
});
|
|
69
|
+
const payload = new Uint8Array([1, 2, 3]).buffer;
|
|
70
|
+
listeners.get("bytes")?.({ detail: payload });
|
|
71
|
+
expect(onPacket).toHaveBeenCalledWith(payload);
|
|
72
|
+
expect(manager.getState().packetsReceived).toBe(1);
|
|
73
|
+
expect(manager.getState().bytesReceived).toBe(3);
|
|
74
|
+
manager.disconnect();
|
|
75
|
+
});
|
|
76
|
+
it("releases the previous lease before reconnecting", async () => {
|
|
77
|
+
const unsubscribe = vi.fn();
|
|
78
|
+
const subscription = {
|
|
79
|
+
addEventListener: vi.fn(), removeEventListener: vi.fn(), unsubscribe,
|
|
80
|
+
};
|
|
81
|
+
const subscribe = vi.fn().mockResolvedValue(subscription);
|
|
82
|
+
globalThis.window = {
|
|
83
|
+
multicast: { capabilities: { consumeModes: ["bytes"] }, subscribe },
|
|
84
|
+
};
|
|
85
|
+
const manager = new TransportManager();
|
|
86
|
+
expect(await manager.connect(CONFIG)).toBe(true);
|
|
87
|
+
expect(await manager.connect(CONFIG)).toBe(true);
|
|
88
|
+
expect(unsubscribe).toHaveBeenCalledOnce();
|
|
89
|
+
manager.disconnect();
|
|
90
|
+
expect(unsubscribe).toHaveBeenCalledTimes(2);
|
|
91
|
+
});
|
|
92
|
+
it("releases a stale lease when connect calls overlap", async () => {
|
|
93
|
+
let resolveSubscription;
|
|
94
|
+
const unsubscribe = vi.fn();
|
|
95
|
+
const subscribe = vi.fn().mockReturnValue(new Promise((resolve) => {
|
|
96
|
+
resolveSubscription = resolve;
|
|
97
|
+
}));
|
|
98
|
+
globalThis.window = {
|
|
99
|
+
multicast: { capabilities: { consumeModes: ["bytes"] }, subscribe },
|
|
100
|
+
};
|
|
101
|
+
const manager = new TransportManager();
|
|
102
|
+
const first = manager.connect(CONFIG);
|
|
103
|
+
await vi.waitFor(() => expect(subscribe).toHaveBeenCalledOnce());
|
|
104
|
+
const second = manager.connect(CONFIG);
|
|
105
|
+
resolveSubscription({ addEventListener: vi.fn(), removeEventListener: vi.fn(), unsubscribe });
|
|
106
|
+
expect(await Promise.all([first, second])).toEqual([false, true]);
|
|
107
|
+
expect(subscribe).toHaveBeenCalledOnce();
|
|
108
|
+
manager.disconnect();
|
|
109
|
+
expect(unsubscribe).toHaveBeenCalledOnce();
|
|
110
|
+
});
|
|
111
|
+
it("does not publish a connection completed after disconnect", async () => {
|
|
112
|
+
let resolveSubscription;
|
|
113
|
+
const unsubscribe = vi.fn();
|
|
114
|
+
const subscribe = vi.fn().mockReturnValue(new Promise((resolve) => {
|
|
115
|
+
resolveSubscription = resolve;
|
|
116
|
+
}));
|
|
117
|
+
globalThis.window = {
|
|
118
|
+
multicast: { capabilities: { consumeModes: ["bytes"] }, subscribe },
|
|
119
|
+
};
|
|
120
|
+
const manager = new TransportManager();
|
|
121
|
+
const connecting = manager.connect(CONFIG);
|
|
122
|
+
await vi.waitFor(() => expect(subscribe).toHaveBeenCalledOnce());
|
|
123
|
+
manager.disconnect();
|
|
124
|
+
resolveSubscription({ addEventListener: vi.fn(), removeEventListener: vi.fn(), unsubscribe });
|
|
125
|
+
expect(await connecting).toBe(false);
|
|
126
|
+
expect(manager.getState().connected).toBe(false);
|
|
127
|
+
expect(unsubscribe).toHaveBeenCalledOnce();
|
|
128
|
+
});
|
|
129
|
+
it("rejects invalid endpoints before AMT fallback", async () => {
|
|
130
|
+
globalThis.window = {};
|
|
131
|
+
const manager = new TransportManager();
|
|
132
|
+
const onError = vi.fn();
|
|
133
|
+
manager.setErrorCallback(onError);
|
|
134
|
+
expect(await manager.connect({ ...CONFIG, group: "127.0.0.1", amtRelay: "relay.example" })).toBe(false);
|
|
135
|
+
expect(onError).toHaveBeenCalledOnce();
|
|
136
|
+
});
|
|
137
|
+
it("reports disconnected after an invalid reconnect", async () => {
|
|
138
|
+
const unsubscribe = vi.fn();
|
|
139
|
+
const subscribe = vi.fn().mockResolvedValue({
|
|
140
|
+
addEventListener: vi.fn(), removeEventListener: vi.fn(), unsubscribe,
|
|
141
|
+
});
|
|
142
|
+
globalThis.window = {
|
|
143
|
+
multicast: { capabilities: { consumeModes: ["bytes"] }, subscribe },
|
|
144
|
+
};
|
|
145
|
+
const manager = new TransportManager();
|
|
146
|
+
expect(await manager.connect(CONFIG)).toBe(true);
|
|
147
|
+
expect(await manager.connect({ ...CONFIG, group: "127.0.0.1" })).toBe(false);
|
|
148
|
+
expect(unsubscribe).toHaveBeenCalledOnce();
|
|
149
|
+
expect(manager.getState()).toMatchObject({
|
|
150
|
+
mode: "disconnected",
|
|
151
|
+
connected: false,
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=transport-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-manager.test.js","sourceRoot":"","sources":["../src/transport-manager.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -3,44 +3,41 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Shared interfaces for unified transport (WebTransport, SSM, AMT, DRIAD) and FEC.
|
|
5
5
|
*/
|
|
6
|
-
/** window.
|
|
7
|
-
export interface
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
subscribe?: (config: {
|
|
16
|
-
group: string;
|
|
17
|
-
port: number;
|
|
18
|
-
protocol?: string;
|
|
19
|
-
fec?: boolean;
|
|
20
|
-
}) => Promise<MulticastSubscription>;
|
|
21
|
-
connectAMT?: (config: {
|
|
22
|
-
relay: string;
|
|
23
|
-
group: string;
|
|
24
|
-
source?: string;
|
|
25
|
-
port: number;
|
|
26
|
-
}) => Promise<{
|
|
27
|
-
onpacket?: (event: {
|
|
28
|
-
data: ArrayBuffer;
|
|
29
|
-
}) => void;
|
|
30
|
-
close: () => void;
|
|
31
|
-
}>;
|
|
32
|
-
fecDecode?: boolean;
|
|
6
|
+
/** window.multicast gateway config for byte subscriptions. */
|
|
7
|
+
export interface WindowMulticastSubscribeConfig {
|
|
8
|
+
group: string;
|
|
9
|
+
port: number;
|
|
10
|
+
source?: string;
|
|
11
|
+
consume: "bytes";
|
|
12
|
+
mode?: "auto" | "native" | "tunnel";
|
|
13
|
+
amtRelay?: string;
|
|
14
|
+
amtRelayPort?: number;
|
|
33
15
|
}
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
16
|
+
export type WindowMulticastSubscriptionState = "connecting" | "connected" | "reconnecting" | "closed";
|
|
17
|
+
export interface WindowMulticastSubscriptionEventMap {
|
|
18
|
+
bytes: CustomEvent<ArrayBuffer>;
|
|
19
|
+
state: CustomEvent<WindowMulticastSubscriptionState>;
|
|
20
|
+
error: CustomEvent<unknown>;
|
|
21
|
+
}
|
|
22
|
+
/** window.multicast subscription returned by the IWA gateway surface. */
|
|
23
|
+
export interface WindowMulticastSubscription {
|
|
24
|
+
readonly id?: string;
|
|
25
|
+
readonly state?: WindowMulticastSubscriptionState;
|
|
26
|
+
addEventListener<K extends keyof WindowMulticastSubscriptionEventMap>(type: K, listener: (ev: WindowMulticastSubscriptionEventMap[K]) => void, options?: AddEventListenerOptions | boolean): void;
|
|
27
|
+
removeEventListener<K extends keyof WindowMulticastSubscriptionEventMap>(type: K, listener: (ev: WindowMulticastSubscriptionEventMap[K]) => void, options?: EventListenerOptions | boolean): void;
|
|
28
|
+
unsubscribe: () => Promise<void> | void;
|
|
29
|
+
}
|
|
30
|
+
export interface WindowMulticastCapabilities {
|
|
31
|
+
readonly consumeModes?: ReadonlyArray<"bytes" | string>;
|
|
32
|
+
}
|
|
33
|
+
/** Lowercase window.multicast gateway surface. */
|
|
34
|
+
export interface WindowMulticastGateway {
|
|
35
|
+
subscribe?: (config: WindowMulticastSubscribeConfig) => Promise<WindowMulticastSubscription>;
|
|
36
|
+
capabilities?: WindowMulticastCapabilities | (() => Promise<WindowMulticastCapabilities>);
|
|
40
37
|
}
|
|
41
38
|
declare global {
|
|
42
39
|
interface Window {
|
|
43
|
-
|
|
40
|
+
multicast?: WindowMulticastGateway;
|
|
44
41
|
UDPSocket?: unknown;
|
|
45
42
|
}
|
|
46
43
|
}
|
|
@@ -56,6 +53,10 @@ export interface TransportConfig {
|
|
|
56
53
|
streamType: "video" | "audio";
|
|
57
54
|
/** Optional AMT relay host for unicast tunneling */
|
|
58
55
|
amtRelay?: string;
|
|
56
|
+
/** Optional AMT relay port. */
|
|
57
|
+
amtRelayPort?: number;
|
|
58
|
+
/** Browser gateway transport preference. */
|
|
59
|
+
mode?: "auto" | "native" | "tunnel";
|
|
59
60
|
/** DRIAD discovery enabled */
|
|
60
61
|
driadEnabled?: boolean;
|
|
61
62
|
/** Initial bitrate quality level */
|
|
@@ -78,14 +79,13 @@ export interface TransportCapabilities {
|
|
|
78
79
|
driad: boolean;
|
|
79
80
|
fecDecode: boolean;
|
|
80
81
|
}
|
|
81
|
-
export type TransportMode = "
|
|
82
|
+
export type TransportMode = "multicast" | "amt" | "moq" | "disconnected";
|
|
82
83
|
export interface TransportState {
|
|
83
84
|
mode: TransportMode;
|
|
84
85
|
connected: boolean;
|
|
85
86
|
group?: string;
|
|
86
87
|
source?: string;
|
|
87
88
|
amtRelay?: string;
|
|
88
|
-
driadRelay?: string;
|
|
89
89
|
quality?: QualityLevel;
|
|
90
90
|
packetsReceived: number;
|
|
91
91
|
bytesReceived: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuTH,+DAA+D;AAC/D,2DAA2D;AAC3D,+DAA+D;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IAClD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,mBAAmB,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,WAAW,IAAI,mBAAmB,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;AACjF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACxD,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACzC,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AA2BD;;GAEG;AACH,MAAM,CAAN,IAAY,eAOX;AAPD,WAAY,eAAe;IAC1B,wBAAwB;IACxB,qDAAQ,CAAA;IACR,wBAAwB;IACxB,mDAAO,CAAA;IACP,sDAAsD;IACtD,2DAAW,CAAA;AACZ,CAAC,EAPW,eAAe,KAAf,eAAe,QAO1B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface FallbackTrack {
|
|
2
|
+
name: string;
|
|
3
|
+
type: "video" | "audio";
|
|
4
|
+
}
|
|
5
|
+
export interface FallbackGroup {
|
|
6
|
+
readFrame(): Promise<Uint8Array | undefined>;
|
|
7
|
+
close(): void;
|
|
8
|
+
}
|
|
9
|
+
export interface FallbackSubscription {
|
|
10
|
+
nextGroup(): Promise<FallbackGroup | undefined>;
|
|
11
|
+
close(): void;
|
|
12
|
+
}
|
|
13
|
+
export interface FallbackBroadcast {
|
|
14
|
+
subscribe(name: string, priority: number): FallbackSubscription;
|
|
15
|
+
}
|
|
16
|
+
export interface FallbackSessions {
|
|
17
|
+
enterUnicastFallback(): void;
|
|
18
|
+
}
|
|
19
|
+
export type FallbackGroupLike = FallbackGroup;
|
|
20
|
+
export type FallbackSubLike = FallbackSubscription;
|
|
21
|
+
export type FallbackBroadcastLike = FallbackBroadcast;
|
|
22
|
+
export interface FallbackSessionManagerLike extends FallbackSessions {
|
|
23
|
+
hasActiveFallback(): boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function runUnicastFallback(input: {
|
|
26
|
+
tracks: FallbackTrack[];
|
|
27
|
+
broadcast: FallbackBroadcast;
|
|
28
|
+
sessions: FallbackSessions;
|
|
29
|
+
onPacket(packet: Uint8Array): void;
|
|
30
|
+
priority: number;
|
|
31
|
+
signal: AbortSignal;
|
|
32
|
+
onError?(trackName: string, error: unknown): void;
|
|
33
|
+
}): {
|
|
34
|
+
done: Promise<void>;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=unicast-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicast-fallback.d.ts","sourceRoot":"","sources":["../src/unicast-fallback.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CAAE;AACzE,MAAM,WAAW,aAAa;IAAG,SAAS,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAAC,KAAK,IAAI,IAAI,CAAC;CAAE;AAC/F,MAAM,WAAW,oBAAoB;IAAG,SAAS,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAAC,KAAK,IAAI,IAAI,CAAC;CAAE;AACzG,MAAM,WAAW,iBAAiB;IAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CAAC;CAAE;AACvG,MAAM,WAAW,gBAAgB;IAAG,oBAAoB,IAAI,IAAI,CAAC;CAAE;AACnE,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACnD,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AACtD,MAAM,WAAW,0BAA2B,SAAQ,gBAAgB;IAAG,iBAAiB,IAAI,OAAO,CAAC;CAAE;AAEtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACzC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAClD,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAsC1B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function runUnicastFallback(input) {
|
|
2
|
+
input.sessions.enterUnicastFallback();
|
|
3
|
+
const tracks = Array.from(new Map(input.tracks.map((track) => [track.name, track])).values());
|
|
4
|
+
let resolveAbort;
|
|
5
|
+
const aborted = new Promise((resolve) => {
|
|
6
|
+
resolveAbort = resolve;
|
|
7
|
+
if (input.signal.aborted)
|
|
8
|
+
resolve(undefined);
|
|
9
|
+
});
|
|
10
|
+
const onAbort = () => resolveAbort(undefined);
|
|
11
|
+
if (!input.signal.aborted)
|
|
12
|
+
input.signal.addEventListener("abort", onAbort, { once: true });
|
|
13
|
+
const drainers = tracks.map(async (track) => {
|
|
14
|
+
const subscription = input.broadcast.subscribe(track.name, input.priority);
|
|
15
|
+
try {
|
|
16
|
+
while (!input.signal.aborted) {
|
|
17
|
+
const nextGroup = subscription.nextGroup();
|
|
18
|
+
const group = await Promise.race([nextGroup, aborted]);
|
|
19
|
+
if (!group && input.signal.aborted)
|
|
20
|
+
void nextGroup.then((lateGroup) => lateGroup?.close());
|
|
21
|
+
if (!group)
|
|
22
|
+
break;
|
|
23
|
+
try {
|
|
24
|
+
while (!input.signal.aborted) {
|
|
25
|
+
const frame = await Promise.race([group.readFrame(), aborted]);
|
|
26
|
+
if (!frame)
|
|
27
|
+
break;
|
|
28
|
+
input.onPacket(frame);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
group.close();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (!input.signal.aborted) {
|
|
38
|
+
if (input.onError)
|
|
39
|
+
input.onError(track.name, error);
|
|
40
|
+
else
|
|
41
|
+
console.warn(`[unicast-fallback] drainer error on ${track.name}:`, error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
subscription.close();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const done = Promise.all(drainers).then(() => undefined).finally(() => {
|
|
49
|
+
input.signal.removeEventListener("abort", onAbort);
|
|
50
|
+
});
|
|
51
|
+
return { done };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=unicast-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unicast-fallback.js","sourceRoot":"","sources":["../src/unicast-fallback.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blockcast/mmt-transport",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Unified transport manager for MoQ with WebTransport, SSM multicast, AMT, DRIAD, and FEC support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
"./clock": {
|
|
18
18
|
"import": "./dist/clock.js",
|
|
19
19
|
"types": "./dist/clock.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./no-modules": {
|
|
22
|
+
"default": "./dist/mmt-transport.no-modules.js"
|
|
20
23
|
}
|
|
21
24
|
},
|
|
22
25
|
"files": [
|
|
@@ -24,18 +27,15 @@
|
|
|
24
27
|
"src"
|
|
25
28
|
],
|
|
26
29
|
"scripts": {
|
|
27
|
-
"build": "tsc",
|
|
30
|
+
"build": "tsc && node build.mjs",
|
|
28
31
|
"dev": "tsc --watch",
|
|
29
32
|
"clean": "rm -rf dist",
|
|
30
33
|
"typecheck": "tsc --noEmit",
|
|
31
34
|
"test": "vitest run",
|
|
32
35
|
"test:watch": "vitest"
|
|
33
36
|
},
|
|
34
|
-
"dependencies": {
|
|
35
|
-
"@blockcast/mmt-fec": "file:../fec",
|
|
36
|
-
"mmt-wasm": "file:../../mmt-wasm/pkg"
|
|
37
|
-
},
|
|
38
37
|
"devDependencies": {
|
|
38
|
+
"esbuild": "^0.21.5",
|
|
39
39
|
"typescript": "^5.9.3",
|
|
40
40
|
"vitest": "^1.6.1"
|
|
41
41
|
},
|
package/src/abr-controller.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import type { QualityLevel } from "./types.js";
|
|
13
|
+
import { selectMulticastTier, type MulticastTierEndpoint } from "./multicast-tier.js";
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* FEC statistics for ABR decisions
|
|
@@ -81,6 +82,14 @@ export class AdaptiveBitrateController {
|
|
|
81
82
|
return QUALITY_LEVELS[this.currentQualityIndex];
|
|
82
83
|
}
|
|
83
84
|
|
|
85
|
+
/** Selects the multicast (S,G) tier without replacing a player's unicast ABR manager. */
|
|
86
|
+
selectMulticastTier(
|
|
87
|
+
endpoints: readonly MulticastTierEndpoint[],
|
|
88
|
+
estimate: number | undefined = this.getMetrics().measuredBitrate || undefined,
|
|
89
|
+
): MulticastTierEndpoint | undefined {
|
|
90
|
+
return selectMulticastTier(endpoints, estimate);
|
|
91
|
+
}
|
|
92
|
+
|
|
84
93
|
/**
|
|
85
94
|
* Record network sample for bitrate adaptation
|
|
86
95
|
*
|
package/src/amt-gateway.ts
CHANGED
|
@@ -126,7 +126,8 @@ export class AMTGatewayManager {
|
|
|
126
126
|
const keyStr = this.getKeyString(key);
|
|
127
127
|
|
|
128
128
|
if (this.subscriptions.has(keyStr)) {
|
|
129
|
-
|
|
129
|
+
console.log(`[AMT] Reusing existing subscription to ${keyStr}`);
|
|
130
|
+
return keyStr;
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
try {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
isMulticastExplicitlyDisabled,
|
|
4
|
+
multicastEndpointKey,
|
|
5
|
+
normalizeMulticastEndpoint,
|
|
6
|
+
readUrlMulticastConfig,
|
|
7
|
+
} from "./endpoint-config.js";
|
|
8
|
+
|
|
9
|
+
describe("multicast endpoint config", () => {
|
|
10
|
+
it("normalizes endpoint identity", () => {
|
|
11
|
+
const endpoint = normalizeMulticastEndpoint({
|
|
12
|
+
groupAddress: " 232.99.0.10 ",
|
|
13
|
+
sourceAddress: " 69.25.95.101 ",
|
|
14
|
+
port: 5050,
|
|
15
|
+
});
|
|
16
|
+
expect(endpoint).toEqual({
|
|
17
|
+
groupAddress: "232.99.0.10",
|
|
18
|
+
sourceAddress: "69.25.95.101",
|
|
19
|
+
port: 5050,
|
|
20
|
+
});
|
|
21
|
+
expect(multicastEndpointKey(endpoint!)).toBe(
|
|
22
|
+
'["69.25.95.101","232.99.0.10",5050,"auto","",""]',
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("does not alias endpoint fields containing key delimiters", () => {
|
|
27
|
+
const base = { groupAddress: "232.99.0.10", port: 5050, mode: "tunnel" as const };
|
|
28
|
+
expect(multicastEndpointKey({ ...base, amtRelay: "relay|2268" })).not.toBe(
|
|
29
|
+
multicastEndpointKey({ ...base, amtRelay: "relay", amtRelayPort: 2268 }),
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("rejects invalid groups and ports", () => {
|
|
34
|
+
expect(normalizeMulticastEndpoint({ groupAddress: "127.0.0.1", port: 5050 })).toBeUndefined();
|
|
35
|
+
expect(normalizeMulticastEndpoint({ groupAddress: "232.1.1.1", port: 0 })).toBeUndefined();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("preserves explicit AMT URL configuration", () => {
|
|
39
|
+
expect(readUrlMulticastConfig(
|
|
40
|
+
"?mc_group=232.99.0.10&mc_source=69.25.95.101&mc_port=5050&mc_amt_relay=relay.example&mc_amt_relay_port=2268",
|
|
41
|
+
)).toEqual({
|
|
42
|
+
groupAddress: "232.99.0.10",
|
|
43
|
+
sourceAddress: "69.25.95.101",
|
|
44
|
+
port: 5050,
|
|
45
|
+
mode: "tunnel",
|
|
46
|
+
amtRelay: "relay.example",
|
|
47
|
+
amtRelayPort: 2268,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("recognizes explicit MoQ-only selection", () => {
|
|
52
|
+
expect(isMulticastExplicitlyDisabled("?transport=moq-only")).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
});
|