@livepeer-frameworks/player-core 0.0.3

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 (120) hide show
  1. package/dist/cjs/index.js +19493 -0
  2. package/dist/cjs/index.js.map +1 -0
  3. package/dist/esm/index.js +19398 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/player.css +2140 -0
  6. package/dist/types/core/ABRController.d.ts +164 -0
  7. package/dist/types/core/CodecUtils.d.ts +54 -0
  8. package/dist/types/core/Disposable.d.ts +61 -0
  9. package/dist/types/core/EventEmitter.d.ts +73 -0
  10. package/dist/types/core/GatewayClient.d.ts +144 -0
  11. package/dist/types/core/InteractionController.d.ts +121 -0
  12. package/dist/types/core/LiveDurationProxy.d.ts +102 -0
  13. package/dist/types/core/MetaTrackManager.d.ts +220 -0
  14. package/dist/types/core/MistReporter.d.ts +163 -0
  15. package/dist/types/core/MistSignaling.d.ts +148 -0
  16. package/dist/types/core/PlayerController.d.ts +665 -0
  17. package/dist/types/core/PlayerInterface.d.ts +230 -0
  18. package/dist/types/core/PlayerManager.d.ts +182 -0
  19. package/dist/types/core/PlayerRegistry.d.ts +27 -0
  20. package/dist/types/core/QualityMonitor.d.ts +184 -0
  21. package/dist/types/core/ScreenWakeLockManager.d.ts +70 -0
  22. package/dist/types/core/SeekingUtils.d.ts +142 -0
  23. package/dist/types/core/StreamStateClient.d.ts +108 -0
  24. package/dist/types/core/SubtitleManager.d.ts +111 -0
  25. package/dist/types/core/TelemetryReporter.d.ts +79 -0
  26. package/dist/types/core/TimeFormat.d.ts +97 -0
  27. package/dist/types/core/TimerManager.d.ts +83 -0
  28. package/dist/types/core/UrlUtils.d.ts +81 -0
  29. package/dist/types/core/detector.d.ts +149 -0
  30. package/dist/types/core/index.d.ts +49 -0
  31. package/dist/types/core/scorer.d.ts +167 -0
  32. package/dist/types/core/selector.d.ts +9 -0
  33. package/dist/types/index.d.ts +45 -0
  34. package/dist/types/lib/utils.d.ts +2 -0
  35. package/dist/types/players/DashJsPlayer.d.ts +102 -0
  36. package/dist/types/players/HlsJsPlayer.d.ts +70 -0
  37. package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +119 -0
  38. package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +60 -0
  39. package/dist/types/players/MewsWsPlayer/index.d.ts +220 -0
  40. package/dist/types/players/MewsWsPlayer/types.d.ts +89 -0
  41. package/dist/types/players/MistPlayer.d.ts +25 -0
  42. package/dist/types/players/MistWebRTCPlayer/index.d.ts +133 -0
  43. package/dist/types/players/NativePlayer.d.ts +143 -0
  44. package/dist/types/players/VideoJsPlayer.d.ts +59 -0
  45. package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +118 -0
  46. package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +64 -0
  47. package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +63 -0
  48. package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +174 -0
  49. package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +164 -0
  50. package/dist/types/players/WebCodecsPlayer/index.d.ts +149 -0
  51. package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +105 -0
  52. package/dist/types/players/WebCodecsPlayer/types.d.ts +395 -0
  53. package/dist/types/players/WebCodecsPlayer/worker/decoder.worker.d.ts +13 -0
  54. package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +197 -0
  55. package/dist/types/players/index.d.ts +14 -0
  56. package/dist/types/styles/index.d.ts +11 -0
  57. package/dist/types/types.d.ts +363 -0
  58. package/dist/types/vanilla/FrameWorksPlayer.d.ts +143 -0
  59. package/dist/types/vanilla/index.d.ts +19 -0
  60. package/dist/workers/decoder.worker.js +989 -0
  61. package/dist/workers/decoder.worker.js.map +1 -0
  62. package/package.json +80 -0
  63. package/src/core/ABRController.ts +550 -0
  64. package/src/core/CodecUtils.ts +257 -0
  65. package/src/core/Disposable.ts +120 -0
  66. package/src/core/EventEmitter.ts +113 -0
  67. package/src/core/GatewayClient.ts +439 -0
  68. package/src/core/InteractionController.ts +712 -0
  69. package/src/core/LiveDurationProxy.ts +270 -0
  70. package/src/core/MetaTrackManager.ts +753 -0
  71. package/src/core/MistReporter.ts +543 -0
  72. package/src/core/MistSignaling.ts +346 -0
  73. package/src/core/PlayerController.ts +2829 -0
  74. package/src/core/PlayerInterface.ts +432 -0
  75. package/src/core/PlayerManager.ts +900 -0
  76. package/src/core/PlayerRegistry.ts +149 -0
  77. package/src/core/QualityMonitor.ts +597 -0
  78. package/src/core/ScreenWakeLockManager.ts +163 -0
  79. package/src/core/SeekingUtils.ts +364 -0
  80. package/src/core/StreamStateClient.ts +457 -0
  81. package/src/core/SubtitleManager.ts +297 -0
  82. package/src/core/TelemetryReporter.ts +308 -0
  83. package/src/core/TimeFormat.ts +205 -0
  84. package/src/core/TimerManager.ts +209 -0
  85. package/src/core/UrlUtils.ts +179 -0
  86. package/src/core/detector.ts +382 -0
  87. package/src/core/index.ts +140 -0
  88. package/src/core/scorer.ts +553 -0
  89. package/src/core/selector.ts +16 -0
  90. package/src/global.d.ts +11 -0
  91. package/src/index.ts +75 -0
  92. package/src/lib/utils.ts +6 -0
  93. package/src/players/DashJsPlayer.ts +642 -0
  94. package/src/players/HlsJsPlayer.ts +483 -0
  95. package/src/players/MewsWsPlayer/SourceBufferManager.ts +572 -0
  96. package/src/players/MewsWsPlayer/WebSocketManager.ts +241 -0
  97. package/src/players/MewsWsPlayer/index.ts +1065 -0
  98. package/src/players/MewsWsPlayer/types.ts +106 -0
  99. package/src/players/MistPlayer.ts +188 -0
  100. package/src/players/MistWebRTCPlayer/index.ts +703 -0
  101. package/src/players/NativePlayer.ts +820 -0
  102. package/src/players/VideoJsPlayer.ts +643 -0
  103. package/src/players/WebCodecsPlayer/JitterBuffer.ts +299 -0
  104. package/src/players/WebCodecsPlayer/LatencyProfiles.ts +151 -0
  105. package/src/players/WebCodecsPlayer/RawChunkParser.ts +151 -0
  106. package/src/players/WebCodecsPlayer/SyncController.ts +456 -0
  107. package/src/players/WebCodecsPlayer/WebSocketController.ts +564 -0
  108. package/src/players/WebCodecsPlayer/index.ts +1650 -0
  109. package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +379 -0
  110. package/src/players/WebCodecsPlayer/types.ts +542 -0
  111. package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +1360 -0
  112. package/src/players/WebCodecsPlayer/worker/types.ts +276 -0
  113. package/src/players/index.ts +22 -0
  114. package/src/styles/animations.css +21 -0
  115. package/src/styles/index.ts +52 -0
  116. package/src/styles/player.css +2126 -0
  117. package/src/styles/tailwind.css +1015 -0
  118. package/src/types.ts +421 -0
  119. package/src/vanilla/FrameWorksPlayer.ts +367 -0
  120. package/src/vanilla/index.ts +22 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * WebSocketController - Control Channel & Binary Frame Routing
3
+ *
4
+ * Manages WebSocket connection to MistServer for raw frame streaming.
5
+ * Handles:
6
+ * - JSON control messages (play, hold, seek, etc.)
7
+ * - Binary frame routing to chunk parser
8
+ * - Reconnection with exponential backoff
9
+ * - Server delay estimation
10
+ *
11
+ * Based on MewsWsPlayer WebSocketManager with raw frame protocol support.
12
+ */
13
+ import type { ControlCommand, CodecDataMessage, InfoMessage, OnTimeMessage, RawChunk, TrackInfo } from './types';
14
+ /** Connection states */
15
+ export type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
16
+ /** Event types emitted by WebSocketController */
17
+ export interface WebSocketControllerEvents {
18
+ statechange: ConnectionState;
19
+ codecdata: CodecDataMessage;
20
+ info: InfoMessage;
21
+ ontime: OnTimeMessage;
22
+ tracks: TrackInfo[];
23
+ chunk: RawChunk;
24
+ stop: void;
25
+ error: Error;
26
+ }
27
+ type EventListener<K extends keyof WebSocketControllerEvents> = (data: WebSocketControllerEvents[K]) => void;
28
+ /** Options for WebSocketController */
29
+ export interface WebSocketControllerOptions {
30
+ /** Enable debug logging */
31
+ debug?: boolean;
32
+ /** Maximum reconnection attempts (0 = unlimited) */
33
+ maxReconnectAttempts?: number;
34
+ /** Initial reconnection delay (ms) */
35
+ reconnectDelayMs?: number;
36
+ /** Maximum reconnection delay (ms) */
37
+ maxReconnectDelayMs?: number;
38
+ /** Connection timeout (ms) */
39
+ connectionTimeoutMs?: number;
40
+ }
41
+ /**
42
+ * WebSocketController - Manages raw frame WebSocket connection
43
+ */
44
+ export declare class WebSocketController {
45
+ private ws;
46
+ private url;
47
+ private options;
48
+ private state;
49
+ private reconnectAttempts;
50
+ private reconnectTimer;
51
+ private connectionTimer;
52
+ private listeners;
53
+ private serverDelay;
54
+ private intentionalClose;
55
+ constructor(url: string, options?: WebSocketControllerOptions);
56
+ /**
57
+ * Connect to WebSocket server
58
+ */
59
+ connect(): Promise<void>;
60
+ /**
61
+ * Disconnect from WebSocket server
62
+ */
63
+ disconnect(): void;
64
+ /**
65
+ * Send a control command
66
+ */
67
+ send(command: ControlCommand): boolean;
68
+ /**
69
+ * Request playback start
70
+ */
71
+ play(): boolean;
72
+ /**
73
+ * Request playback pause
74
+ */
75
+ hold(): boolean;
76
+ /**
77
+ * Seek to position
78
+ * @param timeMs - Target time in milliseconds
79
+ * @param fastForwardMs - Additional buffer to request (ms)
80
+ */
81
+ seek(timeMs: number, fastForwardMs?: number): boolean;
82
+ /**
83
+ * Set playback speed
84
+ */
85
+ setSpeed(rate: number | 'auto'): boolean;
86
+ /**
87
+ * Request codec initialization data
88
+ * @param supportedCombinations - Array of codec combinations we can play
89
+ * Format: [[ ["H264"], ["AAC"] ]] means "H264 video AND AAC audio"
90
+ * Per MistServer rawws.js line 1544
91
+ */
92
+ requestCodecData(supportedCombinations?: string[][][]): boolean;
93
+ /**
94
+ * Request additional data (fast-forward for buffer recovery)
95
+ */
96
+ fastForward(ms: number): boolean;
97
+ /**
98
+ * Get current connection state
99
+ */
100
+ getState(): ConnectionState;
101
+ /**
102
+ * Get estimated server delay
103
+ */
104
+ getServerDelay(): number;
105
+ /**
106
+ * Check if connected
107
+ */
108
+ isConnected(): boolean;
109
+ /**
110
+ * Add event listener
111
+ */
112
+ on<K extends keyof WebSocketControllerEvents>(event: K, listener: EventListener<K>): void;
113
+ /**
114
+ * Remove event listener
115
+ */
116
+ off<K extends keyof WebSocketControllerEvents>(event: K, listener: EventListener<K>): void;
117
+ /**
118
+ * Emit event to listeners
119
+ */
120
+ private emit;
121
+ /**
122
+ * Handle incoming WebSocket message
123
+ */
124
+ private handleMessage;
125
+ private lastDeltaLogTime;
126
+ private deltaLogInterval;
127
+ /**
128
+ * Handle binary frame data
129
+ */
130
+ private handleBinaryMessage;
131
+ /**
132
+ * Handle JSON control message
133
+ *
134
+ * Per MistServer util.js line 1301, we need to unwrap the `data` field:
135
+ * MistServer sends: { type: "codec_data", data: { codecs: [...], tracks: [...] } }
136
+ * We need to emit: { type: "codec_data", codecs: [...], tracks: [...] }
137
+ */
138
+ private handleControlMessage;
139
+ /**
140
+ * Set connection state and emit event
141
+ */
142
+ private setState;
143
+ /**
144
+ * Check if should attempt reconnection
145
+ */
146
+ private shouldReconnect;
147
+ /**
148
+ * Schedule reconnection with exponential backoff
149
+ */
150
+ private scheduleReconnect;
151
+ /**
152
+ * Clear reconnect timer
153
+ */
154
+ private clearReconnectTimer;
155
+ /**
156
+ * Clear connection timer
157
+ */
158
+ private clearConnectionTimer;
159
+ /**
160
+ * Log message (if debug enabled)
161
+ */
162
+ private log;
163
+ }
164
+ export {};
@@ -0,0 +1,149 @@
1
+ /**
2
+ * WebCodecs Player Implementation
3
+ *
4
+ * Low-latency WebSocket streaming using WebCodecs API for video/audio decoding.
5
+ * Decoding runs in a Web Worker for optimal performance.
6
+ *
7
+ * Features:
8
+ * - Ultra-low latency streaming (configurable via profiles)
9
+ * - Worker-based VideoDecoder/AudioDecoder
10
+ * - Adaptive playback speed for live catchup/slowdown
11
+ * - Jitter compensation
12
+ * - Firefox polyfill for MediaStreamTrackGenerator
13
+ *
14
+ * Protocol: MistServer raw WebSocket frames (12-byte header + data)
15
+ */
16
+ import { BasePlayer } from '../../core/PlayerInterface';
17
+ import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';
18
+ import type { TrackInfo, WebCodecsStats } from './types';
19
+ /**
20
+ * WebCodecsPlayerImpl - WebCodecs-based low-latency player
21
+ */
22
+ export declare class WebCodecsPlayerImpl extends BasePlayer {
23
+ readonly capability: PlayerCapability;
24
+ private wsController;
25
+ private syncController;
26
+ private worker;
27
+ private mediaStream;
28
+ private container;
29
+ private pipelines;
30
+ private tracks;
31
+ private tracksByIndex;
32
+ private queuedInitData;
33
+ private queuedChunks;
34
+ private isDestroyed;
35
+ private debugging;
36
+ private verboseDebugging;
37
+ private streamType;
38
+ private workerUidCounter;
39
+ private workerListeners;
40
+ private _duration;
41
+ private _currentTime;
42
+ private _bufferMs;
43
+ private _avDrift;
44
+ private _frameCallbackId;
45
+ private _statsInterval;
46
+ private _framesDropped;
47
+ private _framesDecoded;
48
+ private _bytesReceived;
49
+ private _messagesReceived;
50
+ private static codecCache;
51
+ /**
52
+ * Get cache key for a track's codec configuration
53
+ */
54
+ private static getCodecCacheKey;
55
+ /**
56
+ * Test if a track's codec is supported by WebCodecs
57
+ * Reference: rawws.js:75-137 - isTrackSupported()
58
+ */
59
+ static isTrackSupported(track: TrackInfo): Promise<{
60
+ supported: boolean;
61
+ config: any;
62
+ }>;
63
+ /**
64
+ * Validate all tracks and return which are supported
65
+ * Returns array of supported track types ('video', 'audio')
66
+ */
67
+ static validateTracks(tracks: TrackInfo[]): Promise<string[]>;
68
+ isMimeSupported(mimetype: string): boolean;
69
+ isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];
70
+ initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions, streamInfo?: StreamInfo): Promise<HTMLVideoElement>;
71
+ destroy(): Promise<void>;
72
+ /**
73
+ * Try to load a worker from a URL with proper async error detection.
74
+ * new Worker() doesn't throw on invalid URLs - it fires error events async.
75
+ */
76
+ private tryLoadWorker;
77
+ private initializeWorker;
78
+ private sendToWorker;
79
+ private handleWorkerMessage;
80
+ private setupWebSocketHandlers;
81
+ private handleCodecData;
82
+ /**
83
+ * Handle stream info message containing track metadata
84
+ * This is sent by MistServer with full track information
85
+ */
86
+ private handleInfo;
87
+ private handleOnTime;
88
+ private handleTracksChange;
89
+ private handleChunk;
90
+ private sendChunkToWorker;
91
+ private handleStop;
92
+ private handleError;
93
+ private createPipeline;
94
+ private configurePipeline;
95
+ private closePipeline;
96
+ play(): Promise<void>;
97
+ pause(): void;
98
+ seek(time: number): void;
99
+ setPlaybackRate(rate: number): void;
100
+ isLive(): boolean;
101
+ jumpToLive(): void;
102
+ /**
103
+ * Check if seeking is supported.
104
+ * WebCodecs can seek via server commands when connected.
105
+ * Reference: rawws.js line 1294-1304 implements seeking via control channel
106
+ */
107
+ canSeek(): boolean;
108
+ /**
109
+ * Get stream duration (Infinity for live streams)
110
+ */
111
+ get duration(): number;
112
+ getDuration(): number;
113
+ /**
114
+ * Get current playback time (seconds)
115
+ * Uses requestVideoFrameCallback for accurate timing when available
116
+ */
117
+ get currentTime(): number;
118
+ getCurrentTime(): number;
119
+ /**
120
+ * Get buffered time ranges
121
+ * Returns single range from current time to current + buffer
122
+ */
123
+ get buffered(): TimeRanges;
124
+ /**
125
+ * Get comprehensive player statistics
126
+ */
127
+ getStats(): Promise<WebCodecsStats>;
128
+ /**
129
+ * Set up requestVideoFrameCallback for accurate frame timing
130
+ * This provides vsync-aligned frame metadata for A/V sync
131
+ */
132
+ private setupFrameCallback;
133
+ /**
134
+ * Handle video frame presentation callback
135
+ * Updates current time
136
+ */
137
+ private onVideoFrame;
138
+ /**
139
+ * Cancel frame callback on cleanup
140
+ */
141
+ private cancelFrameCallback;
142
+ private log;
143
+ }
144
+ export { WebSocketController } from './WebSocketController';
145
+ export { SyncController } from './SyncController';
146
+ export { JitterTracker, MultiTrackJitterTracker } from './JitterBuffer';
147
+ export { getLatencyProfile, mergeLatencyProfile, LATENCY_PROFILES } from './LatencyProfiles';
148
+ export { parseRawChunk, RawChunkParser } from './RawChunkParser';
149
+ export * from './types';
@@ -0,0 +1,105 @@
1
+ /**
2
+ * MediaStreamTrackGenerator Polyfill
3
+ *
4
+ * Provides fallback for browsers without native MediaStreamTrackGenerator (Firefox).
5
+ *
6
+ * Video: Uses Canvas2D + captureStream()
7
+ * Audio: Uses AudioWorklet + createMediaStreamDestination()
8
+ *
9
+ * Based on legacy rawws.js polyfill with improvements:
10
+ * - TypeScript types
11
+ * - Pull-based audio to prevent tin-can distortion
12
+ * - Better resource cleanup
13
+ */
14
+ /**
15
+ * Check if native MediaStreamTrackGenerator is available
16
+ */
17
+ export declare function hasNativeMediaStreamTrackGenerator(): boolean;
18
+ /**
19
+ * Polyfill for MediaStreamTrackGenerator (video)
20
+ *
21
+ * Uses an offscreen canvas and captureStream() to create a MediaStreamTrack
22
+ * that can be fed VideoFrames via a WritableStream.
23
+ */
24
+ export declare class VideoTrackGeneratorPolyfill {
25
+ private canvas;
26
+ private ctx;
27
+ private track;
28
+ private _writable;
29
+ private closed;
30
+ constructor();
31
+ /**
32
+ * Get the writable stream for writing VideoFrames
33
+ */
34
+ get writable(): WritableStream<VideoFrame>;
35
+ /**
36
+ * Get the MediaStreamTrack for adding to MediaStream
37
+ */
38
+ getTrack(): MediaStreamTrack;
39
+ /**
40
+ * Close and cleanup resources
41
+ */
42
+ close(): void;
43
+ }
44
+ /**
45
+ * Polyfill for MediaStreamTrackGenerator (audio)
46
+ *
47
+ * Uses AudioWorklet to create a pull-based audio output that prevents
48
+ * the "tin-can" distortion issue from the legacy implementation.
49
+ *
50
+ * Key improvement: Audio samples are pulled by the worklet at a fixed rate,
51
+ * and we feed samples proactively rather than pushing them as they arrive.
52
+ */
53
+ export declare class AudioTrackGeneratorPolyfill {
54
+ private audioContext;
55
+ private destination;
56
+ private workletNode;
57
+ private track;
58
+ private _writable;
59
+ private closed;
60
+ private initialized;
61
+ private initPromise;
62
+ private sampleBuffer;
63
+ private maxBufferChunks;
64
+ constructor();
65
+ /**
66
+ * Initialize the AudioWorklet
67
+ */
68
+ private initializeWorklet;
69
+ /**
70
+ * Convert AudioData to mono Float32Array
71
+ */
72
+ private audioDataToSamples;
73
+ /**
74
+ * Feed samples to the worklet
75
+ */
76
+ private feedSamples;
77
+ /**
78
+ * Get the writable stream for writing AudioData
79
+ */
80
+ get writable(): WritableStream<AudioData>;
81
+ /**
82
+ * Get the MediaStreamTrack for adding to MediaStream
83
+ */
84
+ getTrack(): MediaStreamTrack;
85
+ /**
86
+ * Wait for initialization to complete
87
+ */
88
+ waitForInit(): Promise<void>;
89
+ /**
90
+ * Close and cleanup resources
91
+ */
92
+ close(): void;
93
+ }
94
+ /**
95
+ * Create appropriate track generator based on browser support
96
+ *
97
+ * @param kind - 'video' or 'audio'
98
+ * @returns Native generator or polyfill
99
+ */
100
+ export declare function createTrackGenerator(kind: 'video' | 'audio'): {
101
+ writable: WritableStream<VideoFrame | AudioData>;
102
+ getTrack: () => MediaStreamTrack;
103
+ close: () => void;
104
+ waitForInit?: () => Promise<void>;
105
+ };