@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.
Files changed (46) hide show
  1. package/dist/abr-controller.d.ts +94 -0
  2. package/dist/abr-controller.d.ts.map +1 -0
  3. package/dist/abr-controller.js +174 -0
  4. package/dist/abr-controller.js.map +1 -0
  5. package/dist/amt-gateway.d.ts +160 -0
  6. package/dist/amt-gateway.d.ts.map +1 -0
  7. package/dist/amt-gateway.js +390 -0
  8. package/dist/amt-gateway.js.map +1 -0
  9. package/dist/clock.d.ts +104 -0
  10. package/dist/clock.d.ts.map +1 -0
  11. package/dist/clock.js +183 -0
  12. package/dist/clock.js.map +1 -0
  13. package/dist/driad-discovery.d.ts +50 -0
  14. package/dist/driad-discovery.d.ts.map +1 -0
  15. package/dist/driad-discovery.js +170 -0
  16. package/dist/driad-discovery.js.map +1 -0
  17. package/dist/fec-client.d.ts +442 -0
  18. package/dist/fec-client.d.ts.map +1 -0
  19. package/dist/fec-client.js +784 -0
  20. package/dist/fec-client.js.map +1 -0
  21. package/dist/fec-client.test.d.ts +8 -0
  22. package/dist/fec-client.test.d.ts.map +1 -0
  23. package/dist/fec-client.test.js +112 -0
  24. package/dist/fec-client.test.js.map +1 -0
  25. package/dist/index.d.ts +34 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +43 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/transport-manager.d.ts +114 -0
  30. package/dist/transport-manager.d.ts.map +1 -0
  31. package/dist/transport-manager.js +396 -0
  32. package/dist/transport-manager.js.map +1 -0
  33. package/dist/types.d.ts +356 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +85 -0
  36. package/dist/types.js.map +1 -0
  37. package/package.json +60 -0
  38. package/src/abr-controller.ts +227 -0
  39. package/src/amt-gateway.ts +511 -0
  40. package/src/clock.ts +212 -0
  41. package/src/driad-discovery.ts +193 -0
  42. package/src/fec-client.test.ts +140 -0
  43. package/src/fec-client.ts +1097 -0
  44. package/src/index.ts +122 -0
  45. package/src/transport-manager.ts +460 -0
  46. package/src/types.ts +420 -0
@@ -0,0 +1,442 @@
1
+ /**
2
+ * @blockcast/transport - MMT FEC Client
3
+ *
4
+ * MMT FEC Client for Browser Players
5
+ *
6
+ * Integrates libmmt WASM FEC decoder with:
7
+ * - MFU fragment reassembly
8
+ * - window.Multicast API from pim-multicast-gateway
9
+ * - Green-fill fallback for unrecoverable frames
10
+ *
11
+ * Designed for hang and moqtail players.
12
+ */
13
+ import type { ProcessingStats, MmtFecClientOptions } from "./types.js";
14
+ /**
15
+ * FEC decoder configuration parameters (RFC 6330 OTI)
16
+ * This is distinct from the high-level FecConfig in types.ts which is for enabling/configuring FEC.
17
+ */
18
+ export interface FecDecoderConfig {
19
+ /** Symbol size in bytes (T) */
20
+ symbolSize: number;
21
+ /** Number of source blocks (Z) */
22
+ sourceBlocks: number;
23
+ /** Number of sub-blocks (N) - used for large blocks */
24
+ subBlocks: number;
25
+ /** Symbol alignment (Al) - typically 8 for byte-aligned */
26
+ alignment: number;
27
+ /** Interleave depth - number of blocks that can be "in flight" */
28
+ interleaveDepth: number;
29
+ }
30
+ /**
31
+ * FEC Decoder interface (WASM module)
32
+ */
33
+ interface FecDecoder {
34
+ configure(oti: Uint8Array): void;
35
+ add_repair(sbn: number, esi: number, data: Uint8Array, timestamp: number): Uint8Array | null;
36
+ cleanup(timestamp: number): number[];
37
+ cleanup_by_interleave(current_sbn: number): number[];
38
+ get_stats(): {
39
+ source_packets: bigint;
40
+ repair_packets: bigint;
41
+ blocks_complete: bigint;
42
+ blocks_recovered: bigint;
43
+ blocks_failed: bigint;
44
+ recovery_rate(): number;
45
+ };
46
+ reset_stats(): void;
47
+ flush(): void;
48
+ set_timeout(ms: number): void;
49
+ set_green_fill(enabled: boolean): void;
50
+ set_interleave_depth(depth: number): void;
51
+ get_interleave_depth(): number;
52
+ get_symbol_size(): number;
53
+ get_source_blocks(): number;
54
+ get_sub_blocks(): number;
55
+ get_alignment(): number;
56
+ }
57
+ /**
58
+ * FEC Payload ID parser interface
59
+ */
60
+ interface FecPayloadId {
61
+ sbn: number;
62
+ esi: number;
63
+ }
64
+ /**
65
+ * MMT FEC Client
66
+ *
67
+ * Combines WASM FEC decoder with MFU reassembler for complete
68
+ * MMT packet processing in browser players.
69
+ */
70
+ export declare class MmtFecClient {
71
+ private fecDecoder;
72
+ private mfuReassembler;
73
+ private options;
74
+ private initialized;
75
+ private greenFillCount;
76
+ private cleanupInterval;
77
+ private wasmInit?;
78
+ private wasmFecDecoder?;
79
+ private wasmParseFecPayloadId?;
80
+ private wasmIsSimdEnabled?;
81
+ constructor(options?: MmtFecClientOptions);
82
+ /**
83
+ * Set WASM module functions (called before init)
84
+ */
85
+ setWasmModule(module: {
86
+ init: () => Promise<void>;
87
+ MmtFecDecoder: new (interleaveDepth: number) => FecDecoder;
88
+ parse_fec_payload_id: (data: Uint8Array) => FecPayloadId;
89
+ is_simd_enabled: () => boolean;
90
+ }): void;
91
+ /**
92
+ * Initialize the WASM module
93
+ */
94
+ init(): Promise<void>;
95
+ /**
96
+ * Configure FEC from OTI
97
+ */
98
+ configureFec(oti: Uint8Array): void;
99
+ /**
100
+ * Process an MMTP packet
101
+ *
102
+ * Handles FEC and MFU reassembly automatically.
103
+ * Calls onMfuReady when a complete MFU is available.
104
+ */
105
+ processPacket(packet: Uint8Array): void;
106
+ /**
107
+ * Process FEC repair packet
108
+ */
109
+ private processFecPacket;
110
+ /**
111
+ * Cleanup expired blocks and MFUs
112
+ */
113
+ cleanup(): void;
114
+ /**
115
+ * Get current statistics
116
+ */
117
+ getStats(): ProcessingStats;
118
+ /**
119
+ * Reset statistics
120
+ */
121
+ resetStats(): void;
122
+ /**
123
+ * Get current FEC configuration
124
+ * Returns the OTI parameters and interleave depth
125
+ */
126
+ getConfig(): FecDecoderConfig;
127
+ /**
128
+ * Set interleave depth
129
+ *
130
+ * The interleave depth determines how many blocks can be "in flight" at once.
131
+ * Higher values provide better burst loss protection but increase latency.
132
+ *
133
+ * @param depth - Number of interleaved blocks (min: 1, typical: 30 for ~1s at 30fps)
134
+ */
135
+ setInterleaveDepth(depth: number): void;
136
+ /**
137
+ * Cleanup blocks that are too old based on interleave depth
138
+ *
139
+ * This method expires blocks that are more than `interleaveDepth` behind
140
+ * the current block number. Call this when processing a new source block
141
+ * to maintain memory bounds.
142
+ *
143
+ * @param currentSbn - Current source block number being processed
144
+ * @returns Array of expired block numbers
145
+ */
146
+ cleanupByInterleave(currentSbn: number): number[];
147
+ /**
148
+ * Check if initialized
149
+ */
150
+ isInitialized(): boolean;
151
+ /**
152
+ * Dispose of resources
153
+ */
154
+ dispose(): void;
155
+ }
156
+ /**
157
+ * Integration with window.Multicast API (pim-multicast-gateway)
158
+ */
159
+ export declare function createMulticastFecHandler(client: MmtFecClient, options?: {
160
+ onPacket?: (data: ArrayBuffer) => void;
161
+ }): (data: ArrayBuffer) => void;
162
+ /**
163
+ * Quick setup for hang/moqtail integration
164
+ */
165
+ export declare function setupMmtFec(options?: MmtFecClientOptions): Promise<MmtFecClient>;
166
+ /**
167
+ * MoQ FEC configuration
168
+ */
169
+ export interface MoqFecClientConfig {
170
+ /** Symbol size in bytes (typically 1280 for MTU) */
171
+ symbolSize: number;
172
+ /** Source symbols per block (K) */
173
+ k: number;
174
+ /** Repair symbols per block (P) */
175
+ p: number;
176
+ /** Interleave depth for burst loss protection */
177
+ interleaveDepth: number;
178
+ }
179
+ /**
180
+ * MoQ FEC statistics for ABR
181
+ */
182
+ export interface MoqFecClientStats {
183
+ /** Blocks successfully decoded */
184
+ blocksComplete: number;
185
+ /** Blocks with some symbols but not yet complete */
186
+ blocksIncomplete: number;
187
+ /** Total symbols received */
188
+ totalSymbolsReceived: number;
189
+ /** Source symbols per block (K) */
190
+ k: number;
191
+ /** Repair symbols per block (P) */
192
+ p: number;
193
+ /** Interleave depth */
194
+ interleaveDepth: number;
195
+ /** Effective loss rate after FEC recovery (0.0-1.0) */
196
+ effectiveLossRate: number;
197
+ /** Recovery rate (0.0-1.0) */
198
+ recoveryRate: number;
199
+ }
200
+ /**
201
+ * MoQ FEC Encoder interface (WASM module)
202
+ */
203
+ interface WasmMoqFecEncoder {
204
+ encodeBlock(data: Uint8Array): {
205
+ block_id: number;
206
+ original_len: number;
207
+ k: number;
208
+ p: number;
209
+ getOti(): Uint8Array;
210
+ sourceSymbolCount(): number;
211
+ getSourceSymbol(index: number): Uint8Array | null;
212
+ repairSymbolCount(): number;
213
+ getRepairSymbol(index: number): Uint8Array | null;
214
+ };
215
+ blockCount(): number;
216
+ getOti(): Uint8Array;
217
+ }
218
+ /**
219
+ * MoQ FEC Decoder interface (WASM module)
220
+ */
221
+ interface WasmMoqFecDecoder {
222
+ addSourceSymbol(blockId: number, esi: number, symbol: Uint8Array, originalLen?: number): Uint8Array | null;
223
+ addRepairSymbol(blockId: number, esi: number, symbol: Uint8Array): Uint8Array | null;
224
+ isBlockComplete(blockId: number): boolean;
225
+ getBlockData(blockId: number): Uint8Array;
226
+ resetBlock(blockId: number): void;
227
+ getStats(): {
228
+ blocksComplete: number;
229
+ blocksIncomplete: number;
230
+ totalSymbolsReceived: number;
231
+ k: number;
232
+ p: number;
233
+ interleaveDepth: number;
234
+ effectiveLossRate(): number;
235
+ recoveryRate(): number;
236
+ };
237
+ }
238
+ /**
239
+ * MoQ FEC Config interface (WASM module)
240
+ */
241
+ interface WasmMoqFecConfig {
242
+ maxBlockSize(): number;
243
+ overheadRatio(): number;
244
+ symbol_size: number;
245
+ k: number;
246
+ p: number;
247
+ interleaveDepth: number;
248
+ }
249
+ /**
250
+ * MoQ FEC Client
251
+ *
252
+ * Wraps mmt-wasm MoQ FEC bindings for use in TypeScript applications.
253
+ * Designed for WebTransport-based MoQ streaming with FEC protection.
254
+ *
255
+ * ## Usage
256
+ *
257
+ * ```typescript
258
+ * import { MoqFecClient } from '@blockcast/ssm-transport';
259
+ *
260
+ * const client = new MoqFecClient({
261
+ * symbolSize: 1280,
262
+ * k: 10,
263
+ * p: 3,
264
+ * interleaveDepth: 30,
265
+ * });
266
+ *
267
+ * await client.init();
268
+ *
269
+ * // Encoder (publisher side)
270
+ * const encoded = client.encodeBlock(groupData);
271
+ * encoded.sourceSymbols.forEach((symbol, esi) => {
272
+ * sendSourceSymbol(encoded.blockId, esi, symbol);
273
+ * });
274
+ * encoded.repairSymbols.forEach((symbol, i) => {
275
+ * sendRepairSymbol(encoded.blockId, encoded.k + i, symbol);
276
+ * });
277
+ *
278
+ * // Decoder (subscriber side)
279
+ * client.setOti(encoded.oti);
280
+ * onSourceSymbol((blockId, esi, symbol) => {
281
+ * const decoded = client.addSourceSymbol(blockId, esi, symbol);
282
+ * if (decoded) processGroup(decoded);
283
+ * });
284
+ * ```
285
+ */
286
+ declare let wasmModuleCache: {
287
+ init: () => Promise<void>;
288
+ MoqFecConfig: new (symbolSize: number, k: number, p: number, interleaveDepth: number) => WasmMoqFecConfig;
289
+ MoqFecEncoder: new (config: WasmMoqFecConfig) => WasmMoqFecEncoder;
290
+ MoqFecDecoder: new (config: WasmMoqFecConfig, oti: Uint8Array) => WasmMoqFecDecoder;
291
+ } | null;
292
+ /**
293
+ * Load the mmt-wasm module dynamically
294
+ *
295
+ * @param wasmPath - Path to the mmt-wasm module (default: tries common locations)
296
+ * @returns The loaded WASM module
297
+ */
298
+ export declare function loadMmtWasm(wasmPath?: string): Promise<typeof wasmModuleCache>;
299
+ /**
300
+ * Create a MoqFecClient with auto-loaded WASM module
301
+ *
302
+ * @param config - FEC configuration
303
+ * @param wasmPath - Optional path to mmt-wasm module
304
+ * @returns Initialized MoqFecClient
305
+ */
306
+ export declare function createMoqFecClient(config?: Partial<MoqFecClientConfig>, wasmPath?: string): Promise<MoqFecClient>;
307
+ export declare class MoqFecClient {
308
+ private config;
309
+ private encoder;
310
+ private decoder;
311
+ private wasmConfig;
312
+ private oti;
313
+ private initialized;
314
+ private onBlockDecoded?;
315
+ private wasmInit?;
316
+ private wasmMoqFecConfig?;
317
+ private wasmMoqFecEncoder?;
318
+ private wasmMoqFecDecoder?;
319
+ constructor(config?: Partial<MoqFecClientConfig>);
320
+ /**
321
+ * Create and initialize a MoqFecClient with auto-loaded WASM
322
+ *
323
+ * This is a convenience static method that handles WASM loading automatically.
324
+ *
325
+ * @param config - FEC configuration
326
+ * @param wasmPath - Optional path to mmt-wasm module
327
+ * @returns Initialized MoqFecClient
328
+ */
329
+ static create(config?: Partial<MoqFecClientConfig>, wasmPath?: string): Promise<MoqFecClient>;
330
+ /**
331
+ * Set WASM module functions (called before init)
332
+ */
333
+ setWasmModule(module: {
334
+ init: () => Promise<void>;
335
+ MoqFecConfig: new (symbolSize: number, k: number, p: number, interleaveDepth: number) => WasmMoqFecConfig;
336
+ MoqFecEncoder: new (config: WasmMoqFecConfig) => WasmMoqFecEncoder;
337
+ MoqFecDecoder: new (config: WasmMoqFecConfig, oti: Uint8Array) => WasmMoqFecDecoder;
338
+ }): void;
339
+ /**
340
+ * Initialize the WASM module and create encoder
341
+ */
342
+ init(): Promise<void>;
343
+ /**
344
+ * Set OTI from encoder (required for decoder)
345
+ * Call this when receiving FEC config from publisher
346
+ */
347
+ setOti(oti: Uint8Array): void;
348
+ /**
349
+ * Get the current OTI
350
+ */
351
+ getOti(): Uint8Array | null;
352
+ /**
353
+ * Set callback for decoded blocks
354
+ */
355
+ setBlockDecodedCallback(callback: (blockId: number, data: Uint8Array) => void): void;
356
+ /**
357
+ * Encode a data block (publisher side)
358
+ *
359
+ * @param data - The data block to encode (e.g., MoQ Group)
360
+ * @returns Encoded block with source and repair symbols
361
+ */
362
+ encodeBlock(data: Uint8Array): {
363
+ blockId: number;
364
+ originalLen: number;
365
+ k: number;
366
+ p: number;
367
+ oti: Uint8Array;
368
+ sourceSymbols: Uint8Array[];
369
+ repairSymbols: Uint8Array[];
370
+ };
371
+ /**
372
+ * Add a source symbol (subscriber side)
373
+ *
374
+ * @param blockId - Block this symbol belongs to
375
+ * @param esi - Encoding Symbol ID (0 to K-1)
376
+ * @param symbol - Symbol data
377
+ * @param originalLen - Original data length (optional)
378
+ * @returns Decoded data if block is complete, null otherwise
379
+ */
380
+ addSourceSymbol(blockId: number, esi: number, symbol: Uint8Array, originalLen?: number): Uint8Array | null;
381
+ /**
382
+ * Add a repair symbol (subscriber side)
383
+ *
384
+ * @param blockId - Block this symbol belongs to
385
+ * @param esi - Encoding Symbol ID (K to K+P-1)
386
+ * @param symbol - Symbol data
387
+ * @returns Decoded data if block is recovered, null otherwise
388
+ */
389
+ addRepairSymbol(blockId: number, esi: number, symbol: Uint8Array): Uint8Array | null;
390
+ /**
391
+ * Check if a block is complete
392
+ */
393
+ isBlockComplete(blockId: number): boolean;
394
+ /**
395
+ * Get decoded data for a complete block
396
+ */
397
+ getBlockData(blockId: number): Uint8Array | null;
398
+ /**
399
+ * Reset a block slot for reuse
400
+ */
401
+ resetBlock(blockId: number): void;
402
+ /**
403
+ * Get FEC statistics for ABR decisions
404
+ */
405
+ getStats(): MoqFecClientStats;
406
+ /**
407
+ * Get ABR-compatible statistics
408
+ * Returns stats in format suitable for ABR controller
409
+ */
410
+ getAbrStats(): {
411
+ effectiveLossRate: number;
412
+ rawLossRate: number;
413
+ recoveryRate: number;
414
+ fecEnabled: boolean;
415
+ };
416
+ /**
417
+ * Get the FEC configuration
418
+ */
419
+ getConfig(): MoqFecClientConfig;
420
+ /**
421
+ * Get max block size
422
+ */
423
+ getMaxBlockSize(): number;
424
+ /**
425
+ * Get overhead ratio (P/K)
426
+ */
427
+ getOverheadRatio(): number;
428
+ /**
429
+ * Check if initialized
430
+ */
431
+ isInitialized(): boolean;
432
+ /**
433
+ * Check if decoder is ready
434
+ */
435
+ isDecoderReady(): boolean;
436
+ /**
437
+ * Dispose of resources
438
+ */
439
+ dispose(): void;
440
+ }
441
+ export {};
442
+ //# sourceMappingURL=fec-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fec-client.d.ts","sourceRoot":"","sources":["../src/fec-client.ts"],"names":[],"mappings":"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"}