@blockcast/mmt-transport 0.2.0
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/dist/abr-controller.d.ts +94 -0
- package/dist/abr-controller.d.ts.map +1 -0
- package/dist/abr-controller.js +174 -0
- package/dist/abr-controller.js.map +1 -0
- package/dist/amt-gateway.d.ts +160 -0
- package/dist/amt-gateway.d.ts.map +1 -0
- package/dist/amt-gateway.js +390 -0
- package/dist/amt-gateway.js.map +1 -0
- package/dist/clock.d.ts +104 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +183 -0
- package/dist/clock.js.map +1 -0
- package/dist/driad-discovery.d.ts +50 -0
- package/dist/driad-discovery.d.ts.map +1 -0
- package/dist/driad-discovery.js +170 -0
- package/dist/driad-discovery.js.map +1 -0
- package/dist/fec-client.d.ts +442 -0
- package/dist/fec-client.d.ts.map +1 -0
- package/dist/fec-client.js +784 -0
- package/dist/fec-client.js.map +1 -0
- package/dist/fec-client.test.d.ts +8 -0
- package/dist/fec-client.test.d.ts.map +1 -0
- package/dist/fec-client.test.js +112 -0
- package/dist/fec-client.test.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/transport-manager.d.ts +114 -0
- package/dist/transport-manager.d.ts.map +1 -0
- package/dist/transport-manager.js +396 -0
- package/dist/transport-manager.js.map +1 -0
- package/dist/types.d.ts +356 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +85 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
- package/src/abr-controller.ts +227 -0
- package/src/amt-gateway.ts +511 -0
- package/src/clock.ts +212 -0
- package/src/driad-discovery.ts +193 -0
- package/src/fec-client.test.ts +140 -0
- package/src/fec-client.ts +1097 -0
- package/src/index.ts +122 -0
- package/src/transport-manager.ts +460 -0
- package/src/types.ts +420 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @blockcast/transport - Transport Manager
|
|
3
|
+
*
|
|
4
|
+
* Unified transport abstraction for MoQ players supporting:
|
|
5
|
+
* - Native multicast (ASM/SSM via IGMPv3/MLD + PIM-SSM)
|
|
6
|
+
* - AMT tunneling (RFC 7450) with optional DRIAD relay discovery
|
|
7
|
+
* - WebTransport/QUIC (MoQ-lite protocol)
|
|
8
|
+
* - WebSocket fallback
|
|
9
|
+
*
|
|
10
|
+
* Transport promotion hierarchy (WebTransport-first for fast startup):
|
|
11
|
+
* 1. WebTransport - immediate connection for fast channel select
|
|
12
|
+
* 2. Background discovery - check if multicast available
|
|
13
|
+
* 3. Promote to multicast (Native SSM > IGMP > AMT) if available
|
|
14
|
+
* 4. WebSocket fallback if WebTransport unavailable
|
|
15
|
+
*
|
|
16
|
+
* Features:
|
|
17
|
+
* - Progressive adaptive bitrate based on network conditions
|
|
18
|
+
* - FEC (Forward Error Correction) for burst loss recovery
|
|
19
|
+
* - Seamless transport switching with session continuity
|
|
20
|
+
* - Unified FEC/ABR pipeline across all transport modes
|
|
21
|
+
*/
|
|
22
|
+
import { DRIADDiscovery } from "./driad-discovery.js";
|
|
23
|
+
import { AdaptiveBitrateController } from "./abr-controller.js";
|
|
24
|
+
/**
|
|
25
|
+
* Transport Manager
|
|
26
|
+
*
|
|
27
|
+
* Manages transport connections with automatic mode selection:
|
|
28
|
+
* WebTransport -> Native SSM -> IGMP -> AMT -> WebSocket
|
|
29
|
+
*
|
|
30
|
+
* Renamed from SSMTransportManager - the old name is preserved
|
|
31
|
+
* as a deprecated alias for backwards compatibility.
|
|
32
|
+
*/
|
|
33
|
+
export class TransportManager {
|
|
34
|
+
state = {
|
|
35
|
+
mode: "disconnected",
|
|
36
|
+
connected: false,
|
|
37
|
+
packetsReceived: 0,
|
|
38
|
+
bytesReceived: 0,
|
|
39
|
+
lastPacketTime: 0,
|
|
40
|
+
};
|
|
41
|
+
capabilities = null;
|
|
42
|
+
subscription = null;
|
|
43
|
+
driad = new DRIADDiscovery();
|
|
44
|
+
abr;
|
|
45
|
+
onPacket;
|
|
46
|
+
onError;
|
|
47
|
+
onStateChange;
|
|
48
|
+
constructor() {
|
|
49
|
+
this.abr = new AdaptiveBitrateController();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Detect available transport capabilities
|
|
53
|
+
*/
|
|
54
|
+
async detectCapabilities() {
|
|
55
|
+
if (this.capabilities)
|
|
56
|
+
return this.capabilities;
|
|
57
|
+
const hasMulticast = typeof window !== "undefined" && window.Multicast !== undefined;
|
|
58
|
+
const multicastApi = hasMulticast ? window.Multicast : null;
|
|
59
|
+
this.capabilities = {
|
|
60
|
+
nativeSSM: !!multicastApi?.subscribeSSM,
|
|
61
|
+
nativeIGMP: !!multicastApi?.subscribe,
|
|
62
|
+
directSockets: typeof window !== "undefined" && typeof window.UDPSocket !== "undefined",
|
|
63
|
+
amt: !!multicastApi?.connectAMT,
|
|
64
|
+
driad: true, // DRIAD uses HTTP proxy, always available
|
|
65
|
+
fecDecode: !!multicastApi?.fecDecode,
|
|
66
|
+
};
|
|
67
|
+
console.log("[Transport] Capabilities:", this.capabilities);
|
|
68
|
+
return this.capabilities;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Connect using best available transport
|
|
72
|
+
*
|
|
73
|
+
* Promotion hierarchy:
|
|
74
|
+
* 1. Native SSM (IWA with Direct Sockets)
|
|
75
|
+
* 2. Native IGMP (IWA fallback)
|
|
76
|
+
* 3. AMT Gateway (specified or discovered via DRIAD)
|
|
77
|
+
* 4. MOQ WebTransport (final fallback)
|
|
78
|
+
*/
|
|
79
|
+
async connect(config) {
|
|
80
|
+
const caps = await this.detectCapabilities();
|
|
81
|
+
// Initialize ABR with requested quality
|
|
82
|
+
if (config.initialQuality) {
|
|
83
|
+
this.abr = new AdaptiveBitrateController(config.initialQuality);
|
|
84
|
+
}
|
|
85
|
+
this.abr.setCallback((quality) => {
|
|
86
|
+
this.state.quality = quality;
|
|
87
|
+
this.subscription?.onqualitychange?.(quality);
|
|
88
|
+
this.onStateChange?.(this.state);
|
|
89
|
+
});
|
|
90
|
+
// Try transport hierarchy
|
|
91
|
+
let connected = false;
|
|
92
|
+
// 1. Try native SSM (best option)
|
|
93
|
+
if (caps.nativeSSM && config.source) {
|
|
94
|
+
console.log("[Transport] Attempting native SSM...");
|
|
95
|
+
connected = await this.connectNativeSSM(config);
|
|
96
|
+
if (connected) {
|
|
97
|
+
this.state.mode = "ssm";
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 2. Try native IGMP (if SSM not available)
|
|
102
|
+
if (caps.nativeIGMP && !connected) {
|
|
103
|
+
console.log("[Transport] Attempting native IGMP...");
|
|
104
|
+
connected = await this.connectNativeIGMP(config);
|
|
105
|
+
if (connected) {
|
|
106
|
+
this.state.mode = "igmp";
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 3. Try AMT (with optional DRIAD discovery)
|
|
111
|
+
if (!connected) {
|
|
112
|
+
console.log("[Transport] Attempting AMT tunnel...");
|
|
113
|
+
connected = await this.connectAMT(config);
|
|
114
|
+
if (connected) {
|
|
115
|
+
this.state.mode = config.driadEnabled ? "driad" : "amt";
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 4. Fallback to MOQ
|
|
120
|
+
console.log("[Transport] All multicast transports failed, falling back to MOQ");
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Connect via native SSM (Source-Specific Multicast)
|
|
125
|
+
*/
|
|
126
|
+
async connectNativeSSM(config) {
|
|
127
|
+
try {
|
|
128
|
+
const multicastApi = window.Multicast;
|
|
129
|
+
if (!multicastApi?.subscribeSSM)
|
|
130
|
+
return false;
|
|
131
|
+
const subscription = await multicastApi.subscribeSSM({
|
|
132
|
+
group: config.group,
|
|
133
|
+
source: config.source,
|
|
134
|
+
port: config.port,
|
|
135
|
+
protocol: "mmtp",
|
|
136
|
+
fec: true,
|
|
137
|
+
});
|
|
138
|
+
subscription.onpacket = (event) => {
|
|
139
|
+
this.handlePacket(event.data);
|
|
140
|
+
};
|
|
141
|
+
subscription.onerror = (error) => {
|
|
142
|
+
console.error("[Transport] Native SSM error:", error);
|
|
143
|
+
this.onError?.(error);
|
|
144
|
+
};
|
|
145
|
+
this.subscription = {
|
|
146
|
+
id: `ssm-${Date.now()}`,
|
|
147
|
+
config,
|
|
148
|
+
close: () => subscription.unsubscribe(),
|
|
149
|
+
};
|
|
150
|
+
this.state = {
|
|
151
|
+
mode: "ssm",
|
|
152
|
+
connected: true,
|
|
153
|
+
group: config.group,
|
|
154
|
+
source: config.source,
|
|
155
|
+
quality: this.abr.getCurrentQuality(),
|
|
156
|
+
packetsReceived: 0,
|
|
157
|
+
bytesReceived: 0,
|
|
158
|
+
lastPacketTime: 0,
|
|
159
|
+
};
|
|
160
|
+
console.log(`[Transport] Connected via native SSM: (${config.source}, ${config.group})`);
|
|
161
|
+
this.onStateChange?.(this.state);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.warn("[Transport] Native SSM failed:", error);
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Connect via native IGMP (Any-Source Multicast)
|
|
171
|
+
*/
|
|
172
|
+
async connectNativeIGMP(config) {
|
|
173
|
+
try {
|
|
174
|
+
const multicastApi = window.Multicast;
|
|
175
|
+
if (!multicastApi?.subscribe)
|
|
176
|
+
return false;
|
|
177
|
+
const subscription = await multicastApi.subscribe({
|
|
178
|
+
group: config.group,
|
|
179
|
+
port: config.port,
|
|
180
|
+
protocol: "mmtp",
|
|
181
|
+
fec: true,
|
|
182
|
+
});
|
|
183
|
+
subscription.onpacket = (event) => {
|
|
184
|
+
this.handlePacket(event.data);
|
|
185
|
+
};
|
|
186
|
+
this.subscription = {
|
|
187
|
+
id: `igmp-${Date.now()}`,
|
|
188
|
+
config,
|
|
189
|
+
close: () => subscription.unsubscribe(),
|
|
190
|
+
};
|
|
191
|
+
this.state = {
|
|
192
|
+
mode: "igmp",
|
|
193
|
+
connected: true,
|
|
194
|
+
group: config.group,
|
|
195
|
+
quality: this.abr.getCurrentQuality(),
|
|
196
|
+
packetsReceived: 0,
|
|
197
|
+
bytesReceived: 0,
|
|
198
|
+
lastPacketTime: 0,
|
|
199
|
+
};
|
|
200
|
+
console.log(`[Transport] Connected via IGMP: ${config.group}`);
|
|
201
|
+
this.onStateChange?.(this.state);
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
console.warn("[Transport] Native IGMP failed:", error);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Connect via AMT Gateway (with optional DRIAD discovery)
|
|
211
|
+
*/
|
|
212
|
+
async connectAMT(config) {
|
|
213
|
+
try {
|
|
214
|
+
let amtRelay = config.amtRelay;
|
|
215
|
+
// Use DRIAD to discover relay if not specified (RFC 8777)
|
|
216
|
+
// DRIAD discovers relays based on SOURCE address, not group
|
|
217
|
+
if (!amtRelay && config.driadEnabled !== false && config.source) {
|
|
218
|
+
console.log(`[Transport] Discovering AMT relay via DRIAD for source ${config.source}...`);
|
|
219
|
+
const relays = await this.driad.discoverRelays(config.source);
|
|
220
|
+
const bestRelay = await this.driad.selectBestRelay(relays);
|
|
221
|
+
if (bestRelay) {
|
|
222
|
+
amtRelay = bestRelay.host;
|
|
223
|
+
this.state.driadRelay = amtRelay;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!amtRelay) {
|
|
227
|
+
console.warn("[Transport] No AMT relay available (DRIAD requires source address for SSM)");
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
// Connect via AMT proxy/gateway
|
|
231
|
+
const multicastApi = window.Multicast;
|
|
232
|
+
if (multicastApi?.connectAMT) {
|
|
233
|
+
const gateway = await multicastApi.connectAMT({
|
|
234
|
+
relay: amtRelay,
|
|
235
|
+
group: config.group,
|
|
236
|
+
source: config.source,
|
|
237
|
+
port: config.port,
|
|
238
|
+
});
|
|
239
|
+
gateway.onpacket = (event) => {
|
|
240
|
+
this.handlePacket(event.data);
|
|
241
|
+
};
|
|
242
|
+
this.subscription = {
|
|
243
|
+
id: `amt-${Date.now()}`,
|
|
244
|
+
config,
|
|
245
|
+
close: () => gateway.close(),
|
|
246
|
+
};
|
|
247
|
+
this.state = {
|
|
248
|
+
mode: config.driadEnabled ? "driad" : "amt",
|
|
249
|
+
connected: true,
|
|
250
|
+
group: config.group,
|
|
251
|
+
source: config.source,
|
|
252
|
+
amtRelay,
|
|
253
|
+
quality: this.abr.getCurrentQuality(),
|
|
254
|
+
packetsReceived: 0,
|
|
255
|
+
bytesReceived: 0,
|
|
256
|
+
lastPacketTime: 0,
|
|
257
|
+
};
|
|
258
|
+
console.log(`[Transport] Connected via AMT: ${amtRelay}`);
|
|
259
|
+
this.onStateChange?.(this.state);
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
// Fallback: Use WebSocket-based AMT proxy
|
|
263
|
+
return await this.connectAMTProxy(config, amtRelay);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
console.warn("[Transport] AMT connection failed:", error);
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Connect via WebSocket-based AMT proxy (browser fallback)
|
|
272
|
+
*/
|
|
273
|
+
async connectAMTProxy(config, amtRelay) {
|
|
274
|
+
try {
|
|
275
|
+
const wsUrl = `wss://${amtRelay}/amt-proxy?group=${config.group}&source=${config.source || ""}&port=${config.port}`;
|
|
276
|
+
const ws = new WebSocket(wsUrl);
|
|
277
|
+
return new Promise((resolve, reject) => {
|
|
278
|
+
ws.binaryType = "arraybuffer";
|
|
279
|
+
ws.onopen = () => {
|
|
280
|
+
console.log(`[Transport] Connected to AMT proxy: ${amtRelay}`);
|
|
281
|
+
this.subscription = {
|
|
282
|
+
id: `amt-proxy-${Date.now()}`,
|
|
283
|
+
config,
|
|
284
|
+
close: () => ws.close(),
|
|
285
|
+
};
|
|
286
|
+
this.state = {
|
|
287
|
+
mode: "amt",
|
|
288
|
+
connected: true,
|
|
289
|
+
group: config.group,
|
|
290
|
+
source: config.source,
|
|
291
|
+
amtRelay,
|
|
292
|
+
quality: this.abr.getCurrentQuality(),
|
|
293
|
+
packetsReceived: 0,
|
|
294
|
+
bytesReceived: 0,
|
|
295
|
+
lastPacketTime: 0,
|
|
296
|
+
};
|
|
297
|
+
this.onStateChange?.(this.state);
|
|
298
|
+
resolve(true);
|
|
299
|
+
};
|
|
300
|
+
ws.onmessage = (event) => {
|
|
301
|
+
if (event.data instanceof ArrayBuffer) {
|
|
302
|
+
this.handlePacket(event.data);
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
ws.onerror = (error) => {
|
|
306
|
+
console.error("[Transport] AMT proxy error:", error);
|
|
307
|
+
reject(error);
|
|
308
|
+
};
|
|
309
|
+
ws.onclose = () => {
|
|
310
|
+
this.state.connected = false;
|
|
311
|
+
this.onStateChange?.(this.state);
|
|
312
|
+
};
|
|
313
|
+
// Timeout
|
|
314
|
+
setTimeout(() => reject(new Error("AMT proxy connection timeout")), 10000);
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
console.warn("[Transport] AMT proxy failed:", error);
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Handle received packet
|
|
324
|
+
*/
|
|
325
|
+
handlePacket(data) {
|
|
326
|
+
this.state.packetsReceived++;
|
|
327
|
+
this.state.bytesReceived += data.byteLength;
|
|
328
|
+
this.state.lastPacketTime = Date.now();
|
|
329
|
+
// Update ABR with sample
|
|
330
|
+
this.abr.recordSample(data.byteLength, 0);
|
|
331
|
+
// Forward to callback
|
|
332
|
+
this.onPacket?.(data);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get current transport state
|
|
336
|
+
*/
|
|
337
|
+
getState() {
|
|
338
|
+
return { ...this.state };
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Get current quality level
|
|
342
|
+
*/
|
|
343
|
+
getQuality() {
|
|
344
|
+
return this.abr.getCurrentQuality();
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Force quality level
|
|
348
|
+
*/
|
|
349
|
+
setQuality(name) {
|
|
350
|
+
this.abr.setQuality(name);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Set packet callback
|
|
354
|
+
*/
|
|
355
|
+
setPacketCallback(callback) {
|
|
356
|
+
this.onPacket = callback;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Set error callback
|
|
360
|
+
*/
|
|
361
|
+
setErrorCallback(callback) {
|
|
362
|
+
this.onError = callback;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Set state change callback
|
|
366
|
+
*/
|
|
367
|
+
setStateCallback(callback) {
|
|
368
|
+
this.onStateChange = callback;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Disconnect
|
|
372
|
+
*/
|
|
373
|
+
disconnect() {
|
|
374
|
+
this.subscription?.close();
|
|
375
|
+
this.subscription = null;
|
|
376
|
+
this.state = {
|
|
377
|
+
mode: "disconnected",
|
|
378
|
+
connected: false,
|
|
379
|
+
packetsReceived: 0,
|
|
380
|
+
bytesReceived: 0,
|
|
381
|
+
lastPacketTime: 0,
|
|
382
|
+
};
|
|
383
|
+
this.onStateChange?.(this.state);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// Export singleton instance
|
|
387
|
+
export const transportManager = new TransportManager();
|
|
388
|
+
/**
|
|
389
|
+
* @deprecated Use `TransportManager` instead. This alias is preserved for backwards compatibility.
|
|
390
|
+
*/
|
|
391
|
+
export const SSMTransportManager = TransportManager;
|
|
392
|
+
/**
|
|
393
|
+
* @deprecated Use `transportManager` instead. This alias is preserved for backwards compatibility.
|
|
394
|
+
*/
|
|
395
|
+
export const ssmTransport = transportManager;
|
|
396
|
+
//# sourceMappingURL=transport-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-manager.js","sourceRoot":"","sources":["../src/transport-manager.ts"],"names":[],"mappings":"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"}
|