@rivmux/runtime-worker 0.1.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.
@@ -0,0 +1,327 @@
1
+ import { NormalizedNetworkOptions, NormalizedRivmuxPlayerOptions, PlayerError, WorkerCommand, WorkerMessage } from "@rivmux/protocol";
2
+
3
+ //#region src/fixtures/m1-static-fmp4.d.ts
4
+ type M1StaticFmp4Fixture = {
5
+ mimeType: string;
6
+ codec: string;
7
+ width: number;
8
+ height: number;
9
+ duration: number;
10
+ initSegment: ArrayBuffer;
11
+ mediaSegment: ArrayBuffer;
12
+ };
13
+ declare const M1_VIDEO_MIME = "video/mp4; codecs=\"avc1.42C01E\"";
14
+ declare function createM1StaticFmp4Fixture(): M1StaticFmp4Fixture;
15
+ //#endregion
16
+ //#region src/latency/buffer-ranges.d.ts
17
+ type BufferedRange = {
18
+ start: number;
19
+ end: number;
20
+ };
21
+ //#endregion
22
+ //#region src/loader/loader.d.ts
23
+ type StreamChunk = {
24
+ bytes: Uint8Array;
25
+ receivedAtMs: number;
26
+ };
27
+ type StreamLoaderStats = {
28
+ bytesReceived: number;
29
+ currentNetworkSpeed: number;
30
+ contentLength?: number;
31
+ startedAtMs?: number;
32
+ lastChunkAtMs?: number;
33
+ };
34
+ type StreamLoaderConfig = {
35
+ url: string;
36
+ network: NormalizedNetworkOptions;
37
+ fetch?: typeof fetch;
38
+ now?: () => number;
39
+ sleep?: (ms: number, signal: AbortSignal) => Promise<void>;
40
+ };
41
+ type StreamLoader = {
42
+ readonly closed: boolean;
43
+ readonly paused: boolean;
44
+ readonly stats: StreamLoaderStats;
45
+ open(): Promise<void>;
46
+ read(): Promise<StreamChunk | null>;
47
+ pause(): void;
48
+ resume(): void;
49
+ close(): Promise<void>;
50
+ };
51
+ //#endregion
52
+ //#region src/wasm/rivmux-transmux-wasm.d.ts
53
+ type CoreErrorCode = 'unsupportedContainer' | 'unsupportedVideoCodec' | 'unsupportedAudioCodec' | 'invalidContainerData' | 'invalidCodecConfig' | 'invalidTimestamp' | 'muxerError' | 'internalError';
54
+ type CoreError = {
55
+ code: CoreErrorCode;
56
+ message: string;
57
+ };
58
+ type CoreProbeResult = {
59
+ container: 'flv' | 'mpegTs';
60
+ video?: 'avc' | 'hevc' | 'av1';
61
+ audio?: 'aac' | 'mp3' | 'ac3' | 'eac3' | 'opus';
62
+ };
63
+ type CoreMediaInfo = {
64
+ container: CoreProbeResult['container'];
65
+ video?: CoreProbeResult['video'];
66
+ audio?: CoreProbeResult['audio'];
67
+ videoCodec?: string;
68
+ audioCodec?: string;
69
+ width?: number;
70
+ height?: number;
71
+ audioSampleRate?: number;
72
+ audioChannelCount?: number;
73
+ };
74
+ type CoreWarning = {
75
+ code: string;
76
+ message: string;
77
+ };
78
+ type CoreTrackKind = 'video' | 'audio' | 'muxed';
79
+ type CoreInitSegment = {
80
+ track: CoreTrackKind;
81
+ codec: string;
82
+ timescale: number;
83
+ bytes: Uint8Array;
84
+ };
85
+ type CoreMediaSegment = {
86
+ track: CoreTrackKind;
87
+ dtsStartMs: number;
88
+ dtsEndMs: number;
89
+ keyframe: boolean;
90
+ bytes: Uint8Array;
91
+ };
92
+ type CoreEvent = {
93
+ type: 'probeResult';
94
+ data: CoreProbeResult;
95
+ } | {
96
+ type: 'mediaInfo';
97
+ data: CoreMediaInfo;
98
+ } | {
99
+ type: 'initSegment';
100
+ data: CoreInitSegment;
101
+ } | {
102
+ type: 'mediaSegment';
103
+ data: CoreMediaSegment;
104
+ } | {
105
+ type: 'videoConfig';
106
+ data: unknown;
107
+ } | {
108
+ type: 'audioConfig';
109
+ data: unknown;
110
+ } | {
111
+ type: 'videoSample';
112
+ data: unknown;
113
+ } | {
114
+ type: 'audioSample';
115
+ data: unknown;
116
+ } | {
117
+ type: 'metadata';
118
+ data: unknown;
119
+ } | {
120
+ type: 'warning';
121
+ data: CoreWarning;
122
+ } | {
123
+ type: 'fatalError';
124
+ data: CoreError;
125
+ } | {
126
+ type: 'discontinuity';
127
+ data: unknown;
128
+ };
129
+ type TransmuxCoreHost = {
130
+ pushChunk(chunk: Uint8Array): CoreEvent[];
131
+ flush(): CoreEvent[];
132
+ reset(): void;
133
+ destroy(): void;
134
+ };
135
+ type TransmuxCoreWasmConstructor = new () => {
136
+ pushChunk(chunk: Uint8Array): unknown;
137
+ flush(): unknown;
138
+ reset(): void;
139
+ destroy(): void;
140
+ };
141
+ declare class WasmTransmuxCoreHost implements TransmuxCoreHost {
142
+ private readonly core;
143
+ constructor(Core: TransmuxCoreWasmConstructor);
144
+ pushChunk(chunk: Uint8Array): CoreEvent[];
145
+ flush(): CoreEvent[];
146
+ reset(): void;
147
+ destroy(): void;
148
+ }
149
+ declare function normalizeCoreEvents(value: unknown): CoreEvent[];
150
+ //#endregion
151
+ //#region src/runtime.d.ts
152
+ type RuntimeWorkerPort = {
153
+ postMessage(message: WorkerMessage, transfer?: Transferable[]): void;
154
+ close(): void;
155
+ };
156
+ type RuntimeMseController = {
157
+ readonly appendQueueLength: number;
158
+ readonly appendQueueBytes: number;
159
+ readonly sourceBufferUpdating: boolean;
160
+ readonly sourceBufferCount: number;
161
+ readonly bufferedStart: number | undefined;
162
+ readonly bufferedEnd: number | undefined;
163
+ readonly bufferedDuration: number | undefined;
164
+ readonly bufferedRanges: BufferedRange[];
165
+ readonly bufferedRangeCount: number;
166
+ createMediaSourceHandle(): Promise<MediaSourceHandle>;
167
+ appendFixture(fixture: ReturnType<typeof createM1StaticFmp4Fixture>): Promise<void>;
168
+ appendInitSegment(segment: Extract<CoreEvent, {
169
+ type: 'initSegment';
170
+ }>['data']): Promise<void>;
171
+ appendMediaSegment(segment: Extract<CoreEvent, {
172
+ type: 'mediaSegment';
173
+ }>['data']): Promise<void>;
174
+ cleanupBefore(cutoff: number): Promise<void>;
175
+ destroy(): void;
176
+ };
177
+ type RuntimeWorkerDependencies = {
178
+ createMseController?: () => RuntimeMseController;
179
+ createLoader?: (config: StreamLoaderConfig) => StreamLoader;
180
+ createTransmuxCore?: (options: NormalizedRivmuxPlayerOptions) => TransmuxCoreHost | undefined | Promise<TransmuxCoreHost | undefined>;
181
+ now?: () => number;
182
+ };
183
+ declare class RuntimeWorker {
184
+ private readonly port;
185
+ private readonly createMseController;
186
+ private readonly createLoader;
187
+ private readonly createTransmuxCore;
188
+ private readonly now;
189
+ private state;
190
+ private url?;
191
+ private options?;
192
+ private mse?;
193
+ private loader?;
194
+ private transmuxCore?;
195
+ private latencyController?;
196
+ private videoState?;
197
+ private lastLatencyMetrics;
198
+ private statsTimer?;
199
+ private statsTickInFlight;
200
+ private loaderRunId;
201
+ private outputBytes;
202
+ private appendQueueMaxLength;
203
+ private appendQueueMaxBytes;
204
+ constructor(port: RuntimeWorkerPort, dependencies?: RuntimeWorkerDependencies);
205
+ handleCommand(command: WorkerCommand): Promise<void>;
206
+ private attachMediaSource;
207
+ private start;
208
+ private stop;
209
+ private destroy;
210
+ private startLoader;
211
+ private runLoader;
212
+ private closeLoader;
213
+ private closeCurrentLoader;
214
+ private isCurrentLoader;
215
+ private postStats;
216
+ private processTransmuxEvents;
217
+ private collectMseStats;
218
+ private appendToMse;
219
+ private applyLatencyPolicy;
220
+ private startStatsTimer;
221
+ private stopStatsTimer;
222
+ private emitStatsTick;
223
+ private fail;
224
+ private post;
225
+ }
226
+ //#endregion
227
+ //#region src/loader/http-flv-loader.d.ts
228
+ declare class HttpFlvLoaderError extends Error {
229
+ readonly code: string;
230
+ readonly status?: number;
231
+ constructor(code: string, message: string, status?: number);
232
+ }
233
+ declare class HttpFlvLoader implements StreamLoader {
234
+ private readonly url;
235
+ private readonly headers;
236
+ private readonly credentials;
237
+ private readonly retry;
238
+ private readonly fetchImpl;
239
+ private readonly now;
240
+ private readonly sleep;
241
+ private abortController?;
242
+ private reader?;
243
+ private state;
244
+ private pausedState;
245
+ private resumeWaiters;
246
+ private readonly mutableStats;
247
+ constructor(config: StreamLoaderConfig);
248
+ get closed(): boolean;
249
+ get paused(): boolean;
250
+ get stats(): StreamLoaderStats;
251
+ open(): Promise<void>;
252
+ read(): Promise<StreamChunk | null>;
253
+ pause(): void;
254
+ resume(): void;
255
+ close(): Promise<void>;
256
+ private openAttempt;
257
+ private waitUntilResumed;
258
+ private resolveResumeWaiters;
259
+ }
260
+ //#endregion
261
+ //#region src/mse/mse-controller.d.ts
262
+ declare class MseController {
263
+ private mediaSource?;
264
+ private readonly sourceBuffers;
265
+ private readonly queues;
266
+ private lastCleanupBefore;
267
+ get appendQueueLength(): number;
268
+ get appendQueueBytes(): number;
269
+ get sourceBufferUpdating(): boolean;
270
+ get sourceBufferCount(): number;
271
+ get bufferedStart(): number | undefined;
272
+ get bufferedEnd(): number | undefined;
273
+ get bufferedDuration(): number | undefined;
274
+ get bufferedRanges(): BufferedRange[];
275
+ get bufferedRangeCount(): number;
276
+ createMediaSourceHandle(): Promise<MediaSourceHandle>;
277
+ appendFixture(fixture: M1StaticFmp4Fixture): Promise<void>;
278
+ appendInitSegment(segment: CoreInitSegment): Promise<void>;
279
+ appendMediaSegment(segment: CoreMediaSegment): Promise<void>;
280
+ cleanupBefore(cutoff: number): Promise<void>;
281
+ reset(): void;
282
+ destroy(): void;
283
+ private get primaryQueue();
284
+ private requireMediaSource;
285
+ private ensureQueue;
286
+ }
287
+ //#endregion
288
+ //#region src/mse/source-buffer-queue.d.ts
289
+ declare class SourceBufferQueue {
290
+ private readonly sourceBuffer;
291
+ private readonly queue;
292
+ private pendingDrain?;
293
+ private activeAppendBytes;
294
+ private destroyed;
295
+ constructor(sourceBuffer: SourceBuffer);
296
+ get length(): number;
297
+ get queuedBytes(): number;
298
+ get updating(): boolean;
299
+ get bufferedRanges(): BufferedRange[];
300
+ get bufferedStart(): number | undefined;
301
+ get bufferedEnd(): number | undefined;
302
+ get bufferedDuration(): number | undefined;
303
+ append(data: ArrayBuffer): Promise<void>;
304
+ cleanupBefore(cutoff: number): Promise<void>;
305
+ reset(): void;
306
+ destroy(): void;
307
+ private drain;
308
+ private createCleanupOperations;
309
+ private waitForIdle;
310
+ }
311
+ //#endregion
312
+ //#region src/mse/mime.d.ts
313
+ declare function isMseSupported(mimeType: string): boolean;
314
+ //#endregion
315
+ //#region src/wasm/wasm-loader.d.ts
316
+ declare function createWasmTransmuxCoreHost(Core: TransmuxCoreWasmConstructor | undefined): TransmuxCoreHost | undefined;
317
+ //#endregion
318
+ //#region src/worker-entry.d.ts
319
+ type DedicatedWorkerScopeLike = {
320
+ addEventListener(type: 'message', listener: (event: MessageEvent<WorkerCommand>) => void): void;
321
+ postMessage(message: WorkerMessage, transfer?: Transferable[]): void;
322
+ close(): void;
323
+ };
324
+ declare function startRuntimeWorker(scope: DedicatedWorkerScopeLike): RuntimeWorker;
325
+ //#endregion
326
+ export { type CoreEvent, HttpFlvLoader, HttpFlvLoaderError, M1_VIDEO_MIME, MseController, RuntimeWorker, SourceBufferQueue, type StreamChunk, type StreamLoader, type StreamLoaderConfig, type StreamLoaderStats, type TransmuxCoreHost, type TransmuxCoreWasmConstructor, WasmTransmuxCoreHost, createM1StaticFmp4Fixture, createWasmTransmuxCoreHost, isMseSupported, normalizeCoreEvents, startRuntimeWorker };
327
+ //# sourceMappingURL=rivmux-runtime-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rivmux-runtime-worker.d.ts","names":[],"sources":["../src/fixtures/m1-static-fmp4.ts","../src/latency/buffer-ranges.ts","../src/loader/loader.ts","../src/wasm/rivmux-transmux-wasm.ts","../src/runtime.ts","../src/loader/http-flv-loader.ts","../src/mse/mse-controller.ts","../src/mse/source-buffer-queue.ts","../src/mse/mime.ts","../src/wasm/wasm-loader.ts","../src/worker-entry.ts"],"mappings":"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"}