@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,356 @@
1
+ /**
2
+ * @blockcast/transport - Type Definitions
3
+ *
4
+ * Shared interfaces for unified transport (WebTransport, SSM, AMT, DRIAD) and FEC.
5
+ */
6
+ /** window.Multicast API type (from IWA/Chrome Direct Sockets) */
7
+ export interface MulticastAPI {
8
+ subscribeSSM?: (config: {
9
+ group: string;
10
+ source: string;
11
+ port: number;
12
+ protocol?: string;
13
+ fec?: boolean;
14
+ }) => Promise<MulticastSubscription>;
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;
33
+ }
34
+ export interface MulticastSubscription {
35
+ onpacket?: (event: {
36
+ data: ArrayBuffer;
37
+ }) => void;
38
+ onerror?: (error: Error) => void;
39
+ unsubscribe: () => void;
40
+ }
41
+ declare global {
42
+ interface Window {
43
+ Multicast?: MulticastAPI;
44
+ UDPSocket?: unknown;
45
+ }
46
+ }
47
+ /** Transport configuration for multicast subscriptions */
48
+ export interface TransportConfig {
49
+ /** Multicast group address (232.x.x.x for SSM) */
50
+ group: string;
51
+ /** Source address for SSM filtering */
52
+ source: string;
53
+ /** UDP port */
54
+ port: number;
55
+ /** Stream type */
56
+ streamType: "video" | "audio";
57
+ /** Optional AMT relay host for unicast tunneling */
58
+ amtRelay?: string;
59
+ /** DRIAD discovery enabled */
60
+ driadEnabled?: boolean;
61
+ /** Initial bitrate quality level */
62
+ initialQuality?: QualityLevel;
63
+ }
64
+ /** @deprecated Use TransportConfig instead */
65
+ export type SSMConfig = TransportConfig;
66
+ export interface QualityLevel {
67
+ name: string;
68
+ bitrate: number;
69
+ width: number;
70
+ height: number;
71
+ fps: number;
72
+ }
73
+ export interface TransportCapabilities {
74
+ nativeSSM: boolean;
75
+ nativeIGMP: boolean;
76
+ directSockets: boolean;
77
+ amt: boolean;
78
+ driad: boolean;
79
+ fecDecode: boolean;
80
+ }
81
+ export type TransportMode = "ssm" | "igmp" | "amt" | "driad" | "moq" | "disconnected";
82
+ export interface TransportState {
83
+ mode: TransportMode;
84
+ connected: boolean;
85
+ group?: string;
86
+ source?: string;
87
+ amtRelay?: string;
88
+ driadRelay?: string;
89
+ quality?: QualityLevel;
90
+ packetsReceived: number;
91
+ bytesReceived: number;
92
+ lastPacketTime: number;
93
+ }
94
+ /** Transport subscription handle */
95
+ export interface TransportSubscription {
96
+ id: string;
97
+ config: TransportConfig;
98
+ onpacket?: (data: ArrayBuffer) => void;
99
+ onerror?: (error: Error) => void;
100
+ onqualitychange?: (quality: QualityLevel) => void;
101
+ close: () => void;
102
+ }
103
+ /** @deprecated Use TransportSubscription instead */
104
+ export type SSMSubscription = TransportSubscription;
105
+ /** DRIAD Relay information (RFC 8777) */
106
+ export interface DRIADRelay {
107
+ host: string;
108
+ port: number;
109
+ priority: number;
110
+ weight: number;
111
+ asn: number;
112
+ rtt?: number;
113
+ }
114
+ /** AMT Relay information */
115
+ export interface AmtRelayInfo {
116
+ address: string;
117
+ port: number;
118
+ discoveryMethod: "driad" | "manual";
119
+ discoveredAt: number;
120
+ }
121
+ /** Group key for multicast subscriptions */
122
+ export interface GroupKey {
123
+ group: string;
124
+ port: number;
125
+ source?: string;
126
+ }
127
+ /** Packet metadata */
128
+ export interface PacketMetadata {
129
+ sourceAddress: string;
130
+ sourcePort: number;
131
+ transport: "native" | "tunnel" | "websocket";
132
+ timestamp: number;
133
+ }
134
+ /** MFU Fragment for reassembly */
135
+ export interface MfuFragment {
136
+ mpuSequenceNumber: number;
137
+ fragmentationIndicator: number;
138
+ fragmentCounter: number;
139
+ data: Uint8Array;
140
+ timestamp: bigint;
141
+ }
142
+ /** Reassembled MFU */
143
+ export interface ReassembledMfu {
144
+ mpuSequenceNumber: number;
145
+ data: Uint8Array;
146
+ timestamp: bigint;
147
+ fragmentCount: number;
148
+ recoveredViaFec: boolean;
149
+ }
150
+ /** FEC + MFU processing statistics */
151
+ export interface ProcessingStats {
152
+ mfuComplete: number;
153
+ mfuReassembled: number;
154
+ mfuTimedOut: number;
155
+ fecSourcePackets: number;
156
+ fecRepairPackets: number;
157
+ fecBlocksComplete: number;
158
+ fecBlocksRecovered: number;
159
+ fecBlocksFailed: number;
160
+ fecRecoveryRate: number;
161
+ greenFillFrames: number;
162
+ }
163
+ /** Options for MmtFecClient */
164
+ export interface MmtFecClientOptions {
165
+ /** Interleave depth for FEC (default: 30 for ~1s at 30fps) */
166
+ interleaveDepth?: number;
167
+ /** Block timeout in milliseconds (default: 2000) */
168
+ blockTimeoutMs?: number;
169
+ /** MFU timeout in milliseconds (default: 1000) */
170
+ mfuTimeoutMs?: number;
171
+ /** Enable green-fill for failed frames (default: true) */
172
+ greenFillEnabled?: boolean;
173
+ /** Callback when MFU is ready */
174
+ onMfuReady?: (mfu: ReassembledMfu) => void;
175
+ /** Callback for green-fill frame */
176
+ onGreenFill?: (timestamp: bigint) => void;
177
+ /** Callback for stats update */
178
+ onStatsUpdate?: (stats: ProcessingStats) => void;
179
+ }
180
+ /** Time types (microseconds) */
181
+ export type Micro = number & {
182
+ readonly __micro: unique symbol;
183
+ };
184
+ /** Sync decision for A/V synchronization */
185
+ export type SyncDecision = "render" | "hold" | "discard";
186
+ /** Transport mode for multicast subscription (auto-selection) */
187
+ export type MulticastTransportMode = "auto" | "native" | "tunnel";
188
+ /** Multicast subscription configuration */
189
+ export interface MulticastConfig {
190
+ group: string;
191
+ port: number;
192
+ source?: string;
193
+ mode?: MulticastTransportMode;
194
+ onPacket: (data: ArrayBuffer, source: PacketSource) => void;
195
+ onStateChange?: (state: SubscriptionState) => void;
196
+ onError?: (error: Error) => void;
197
+ amtRelay?: string;
198
+ amtRelayPort?: number;
199
+ nativeFallbackTimeout?: number;
200
+ }
201
+ /** Packet source information */
202
+ export interface PacketSource {
203
+ address: string;
204
+ port: number;
205
+ transport: "native" | "tunnel";
206
+ recovered?: boolean;
207
+ }
208
+ /** Subscription state */
209
+ export type SubscriptionState = "initializing" | "joining" | "active" | "suspended" | "closed" | "error";
210
+ /** Subscription statistics */
211
+ export interface SubscriptionStats {
212
+ packetsReceived: number;
213
+ bytesReceived: number;
214
+ packetsLost: number;
215
+ packetsRecovered: number;
216
+ bitrate: number;
217
+ uptime: number;
218
+ }
219
+ /** Multicast subscription handle */
220
+ export interface MulticastSubscriptionHandle {
221
+ readonly state: SubscriptionState;
222
+ readonly group: string;
223
+ readonly source?: string;
224
+ readonly port: number;
225
+ readonly transport: "native" | "tunnel";
226
+ readonly stats: SubscriptionStats;
227
+ close(): Promise<void>;
228
+ }
229
+ /** FEC Configuration for MMT streams */
230
+ export interface FecConfig {
231
+ enabled?: boolean;
232
+ oti?: Uint8Array;
233
+ interleaveDepth?: number;
234
+ blockTimeoutMs?: number;
235
+ greenFillEnabled?: boolean;
236
+ }
237
+ /** FEC Statistics */
238
+ export interface FecStats {
239
+ sourcePackets: number;
240
+ repairPackets: number;
241
+ blocksComplete: number;
242
+ blocksRecovered: number;
243
+ blocksFailed: number;
244
+ recoveryRate: number;
245
+ greenFillFrames: number;
246
+ }
247
+ /** Extended MulticastConfig with FEC support */
248
+ export interface MulticastConfigWithFec extends MulticastConfig {
249
+ fec?: FecConfig;
250
+ onFecStats?: (stats: FecStats) => void;
251
+ }
252
+ /** Main Multicast Bridge API */
253
+ export interface MulticastBridge {
254
+ subscribe(config: MulticastConfig | MulticastConfigWithFec): Promise<MulticastSubscriptionHandle>;
255
+ getSubscriptions(): Promise<MulticastSubscriptionHandle[]>;
256
+ isNativeSupported(): Promise<boolean>;
257
+ getFecStats?(): FecStats | null;
258
+ }
259
+ /**
260
+ * FEC_CONFIG message type per draft-ramadan-moq-fec-00
261
+ * Used to signal FEC configuration to subscribers
262
+ */
263
+ export declare const FEC_CONFIG_MESSAGE_TYPE = 80;
264
+ /**
265
+ * Repair track suffix per draft-ramadan-moq-fec-00 Section 5.1
266
+ * Repair tracks are named by appending this suffix to the source track path
267
+ */
268
+ export declare const REPAIR_TRACK_SUFFIX = "repair";
269
+ /**
270
+ * Get the repair track path for a given source track
271
+ *
272
+ * Per draft-ramadan-moq-fec-00 Section 5.1, the repair track is named
273
+ * by appending "repair" to the source track path.
274
+ *
275
+ * @param sourceTrack - The source track path (e.g., "live/video")
276
+ * @returns The repair track path (e.g., "live/video/repair")
277
+ *
278
+ * @example
279
+ * repairTrackPath("live/video") // returns "live/video/repair"
280
+ * repairTrackPath("broadcast/video/1080p") // returns "broadcast/video/1080p/repair"
281
+ */
282
+ export declare function repairTrackPath(sourceTrack: string): string;
283
+ /**
284
+ * Check if a track path is a repair track
285
+ *
286
+ * @param path - The track path to check
287
+ * @returns True if the path ends with the repair track suffix
288
+ *
289
+ * @example
290
+ * isRepairTrack("live/video/repair") // returns true
291
+ * isRepairTrack("repair") // returns true
292
+ * isRepairTrack("live/video") // returns false
293
+ */
294
+ export declare function isRepairTrack(path: string): boolean;
295
+ /**
296
+ * Get the source track path from a repair track path
297
+ *
298
+ * @param repairTrack - The repair track path
299
+ * @returns The source track path, or null if not a valid repair track
300
+ *
301
+ * @example
302
+ * sourceTrackFromRepair("live/video/repair") // returns "live/video"
303
+ * sourceTrackFromRepair("repair") // returns ""
304
+ * sourceTrackFromRepair("live/video") // returns null
305
+ */
306
+ export declare function sourceTrackFromRepair(repairTrack: string): string | null;
307
+ /**
308
+ * MoQ FEC Configuration per draft-ramadan-moq-fec-00
309
+ *
310
+ * This configuration is sent via FEC_CONFIG message after SUBSCRIBE_OK
311
+ * to inform subscribers about FEC parameters.
312
+ */
313
+ export interface MoqFecConfig {
314
+ /** Subscribe ID this config applies to */
315
+ subscribeId: number;
316
+ /** Whether FEC is enabled */
317
+ enabled: boolean;
318
+ /** FEC algorithm (0=none, 1=XOR, 2=RaptorQ) */
319
+ algorithm: MoqFecAlgorithm;
320
+ /** Number of source symbols per FEC block (K) */
321
+ sourceSymbolsPerBlock: number;
322
+ /** Number of repair symbols per FEC block (P) */
323
+ repairSymbolsPerBlock: number;
324
+ /** Interleave depth for burst loss protection */
325
+ interleaveDepth: number;
326
+ /** Symbol size in bytes */
327
+ symbolSize: number;
328
+ /** RFC 6330 Object Transmission Information (12 bytes) - only for RaptorQ */
329
+ oti?: Uint8Array;
330
+ }
331
+ /**
332
+ * FEC algorithm identifier per draft-ramadan-moq-fec-00
333
+ */
334
+ export declare enum MoqFecAlgorithm {
335
+ /** No FEC (disabled) */
336
+ None = 0,
337
+ /** Simple XOR parity */
338
+ Xor = 1,
339
+ /** RaptorQ (RFC 6330) - recommended for burst loss */
340
+ RaptorQ = 2
341
+ }
342
+ /**
343
+ * Repair object header per draft-ramadan-moq-fec-00 Section 6.1
344
+ *
345
+ * Each object on a repair track contains repair symbols for one source block.
346
+ * The object payload begins with this header, followed by concatenated repair symbols.
347
+ */
348
+ export interface RepairObjectHeader {
349
+ /** Source block number being protected (matches group_id of source objects) */
350
+ sourceBlockNumber: number;
351
+ /** First Repair Symbol ESI (Encoding Symbol ID) - for RaptorQ, repair ESIs >= K */
352
+ firstRepairEsi: number;
353
+ /** Number of repair symbols in this object */
354
+ numRepairSymbols: number;
355
+ }
356
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,85 @@
1
+ /**
2
+ * @blockcast/transport - Type Definitions
3
+ *
4
+ * Shared interfaces for unified transport (WebTransport, SSM, AMT, DRIAD) and FEC.
5
+ */
6
+ // ============================================================
7
+ // FEC Constants and Utilities per draft-ramadan-moq-fec-00
8
+ // ============================================================
9
+ /**
10
+ * FEC_CONFIG message type per draft-ramadan-moq-fec-00
11
+ * Used to signal FEC configuration to subscribers
12
+ */
13
+ export const FEC_CONFIG_MESSAGE_TYPE = 0x50;
14
+ /**
15
+ * Repair track suffix per draft-ramadan-moq-fec-00 Section 5.1
16
+ * Repair tracks are named by appending this suffix to the source track path
17
+ */
18
+ export const REPAIR_TRACK_SUFFIX = "repair";
19
+ /**
20
+ * Get the repair track path for a given source track
21
+ *
22
+ * Per draft-ramadan-moq-fec-00 Section 5.1, the repair track is named
23
+ * by appending "repair" to the source track path.
24
+ *
25
+ * @param sourceTrack - The source track path (e.g., "live/video")
26
+ * @returns The repair track path (e.g., "live/video/repair")
27
+ *
28
+ * @example
29
+ * repairTrackPath("live/video") // returns "live/video/repair"
30
+ * repairTrackPath("broadcast/video/1080p") // returns "broadcast/video/1080p/repair"
31
+ */
32
+ export function repairTrackPath(sourceTrack) {
33
+ if (!sourceTrack || sourceTrack.length === 0) {
34
+ return REPAIR_TRACK_SUFFIX;
35
+ }
36
+ return `${sourceTrack}/${REPAIR_TRACK_SUFFIX}`;
37
+ }
38
+ /**
39
+ * Check if a track path is a repair track
40
+ *
41
+ * @param path - The track path to check
42
+ * @returns True if the path ends with the repair track suffix
43
+ *
44
+ * @example
45
+ * isRepairTrack("live/video/repair") // returns true
46
+ * isRepairTrack("repair") // returns true
47
+ * isRepairTrack("live/video") // returns false
48
+ */
49
+ export function isRepairTrack(path) {
50
+ return path === REPAIR_TRACK_SUFFIX || path.endsWith(`/${REPAIR_TRACK_SUFFIX}`);
51
+ }
52
+ /**
53
+ * Get the source track path from a repair track path
54
+ *
55
+ * @param repairTrack - The repair track path
56
+ * @returns The source track path, or null if not a valid repair track
57
+ *
58
+ * @example
59
+ * sourceTrackFromRepair("live/video/repair") // returns "live/video"
60
+ * sourceTrackFromRepair("repair") // returns ""
61
+ * sourceTrackFromRepair("live/video") // returns null
62
+ */
63
+ export function sourceTrackFromRepair(repairTrack) {
64
+ if (repairTrack === REPAIR_TRACK_SUFFIX) {
65
+ return "";
66
+ }
67
+ const suffix = `/${REPAIR_TRACK_SUFFIX}`;
68
+ if (repairTrack.endsWith(suffix)) {
69
+ return repairTrack.slice(0, -suffix.length);
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * FEC algorithm identifier per draft-ramadan-moq-fec-00
75
+ */
76
+ export var MoqFecAlgorithm;
77
+ (function (MoqFecAlgorithm) {
78
+ /** No FEC (disabled) */
79
+ MoqFecAlgorithm[MoqFecAlgorithm["None"] = 0] = "None";
80
+ /** Simple XOR parity */
81
+ MoqFecAlgorithm[MoqFecAlgorithm["Xor"] = 1] = "Xor";
82
+ /** RaptorQ (RFC 6330) - recommended for burst loss */
83
+ MoqFecAlgorithm[MoqFecAlgorithm["RaptorQ"] = 2] = "RaptorQ";
84
+ })(MoqFecAlgorithm || (MoqFecAlgorithm = {}));
85
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoSH,+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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@blockcast/mmt-transport",
3
+ "version": "0.2.0",
4
+ "description": "Unified transport manager for MoQ with WebTransport, SSM multicast, AMT, DRIAD, and FEC support",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./fec": {
14
+ "import": "./dist/fec-client.js",
15
+ "types": "./dist/fec-client.d.ts"
16
+ },
17
+ "./clock": {
18
+ "import": "./dist/clock.js",
19
+ "types": "./dist/clock.d.ts"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "src"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsc --watch",
29
+ "clean": "rm -rf dist",
30
+ "typecheck": "tsc --noEmit",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest"
33
+ },
34
+ "dependencies": {
35
+ "@blockcast/mmt-fec": "file:../fec",
36
+ "mmt-wasm": "file:../../mmt-wasm/pkg"
37
+ },
38
+ "devDependencies": {
39
+ "typescript": "^5.9.3",
40
+ "vitest": "^1.6.1"
41
+ },
42
+ "keywords": [
43
+ "moq",
44
+ "webtransport",
45
+ "multicast",
46
+ "ssm",
47
+ "amt",
48
+ "driad",
49
+ "fec",
50
+ "raptorq",
51
+ "streaming",
52
+ "quic"
53
+ ],
54
+ "license": "Apache-2.0",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "https://github.com/Blockcast/libmmt.git",
58
+ "directory": "packages/transport"
59
+ }
60
+ }