@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,119 @@
1
+ /**
2
+ * SourceBuffer Manager for MEWS Player
3
+ *
4
+ * Handles MediaSource Extension (MSE) buffer operations.
5
+ * Ported from reference: mews.js:206-384
6
+ *
7
+ * Key features:
8
+ * - Buffer creation and codec configuration
9
+ * - Append queue management with _append/_do/_doNext pattern
10
+ * - QuotaExceededError handling
11
+ * - Buffer cleanup (_clean)
12
+ * - Track switch msgqueue handling
13
+ */
14
+ import type { SourceBufferManagerOptions } from './types';
15
+ export declare class SourceBufferManager {
16
+ private mediaSource;
17
+ private videoElement;
18
+ private sourceBuffer;
19
+ private onError;
20
+ private queue;
21
+ private _busy;
22
+ private do_on_updateend;
23
+ private msgqueue;
24
+ private _codecs;
25
+ private fragmentCount;
26
+ paused: boolean;
27
+ private debugging;
28
+ constructor(options: SourceBufferManagerOptions);
29
+ /**
30
+ * Initialize the SourceBuffer with the given codecs.
31
+ * Ported from mews.js:206-384 (sbinit function)
32
+ */
33
+ initWithCodecs(codecs: string[]): boolean;
34
+ /**
35
+ * Get current codecs
36
+ */
37
+ getCodecs(): string[];
38
+ /**
39
+ * Queue data for appending to the buffer.
40
+ * If a track switch is in progress (msgqueue active), data goes to the latest queue.
41
+ * Ported from mews.js:809-824
42
+ */
43
+ append(data: Uint8Array): void;
44
+ /**
45
+ * Internal append with error handling.
46
+ * Ported from mews.js:292-339
47
+ */
48
+ private _append;
49
+ /**
50
+ * Schedule an operation to run on next updateend.
51
+ * Ported from mews.js:281-283
52
+ */
53
+ _doNext(func: () => void): void;
54
+ /**
55
+ * Run operation now if not busy, otherwise schedule for updateend.
56
+ * Ported from mews.js:284-291
57
+ */
58
+ _do(func: (remaining?: Array<() => void>) => void): void;
59
+ /**
60
+ * Schedule an operation to run after the current SourceBuffer update completes.
61
+ * Public API for external callers.
62
+ */
63
+ scheduleAfterUpdate(fn: () => void): void;
64
+ /**
65
+ * Change codecs mid-stream (track switch).
66
+ * Uses message queue to prevent data loss during rapid switches.
67
+ * Ported from mews.js:623-788
68
+ */
69
+ changeCodecs(codecs: string[], switchPointMs?: number): void;
70
+ /**
71
+ * Check if two codec arrays are equivalent (order-independent)
72
+ */
73
+ private codecsEqual;
74
+ /**
75
+ * Find which buffer range contains the given position.
76
+ * Ported from mews.js:947-956
77
+ */
78
+ findBufferIndex(position: number): number | false;
79
+ /**
80
+ * Remove buffer content before keepaway seconds from current position.
81
+ * Ported from mews.js:370-379
82
+ */
83
+ _clean(keepaway?: number): void;
84
+ /**
85
+ * Clear buffer and reinitialize with new codecs.
86
+ * Ported from mews.js:696-730
87
+ */
88
+ private clearAndReinit;
89
+ /**
90
+ * Reinitialize buffer with new codecs.
91
+ * Ported from mews.js:703-724
92
+ */
93
+ private reinitBuffer;
94
+ /**
95
+ * Wait for playback to reach switch point, then clear and reinit.
96
+ * Ported from mews.js:751-785
97
+ */
98
+ private awaitSwitchingPoint;
99
+ /**
100
+ * Drain the oldest message queue and append its data.
101
+ * Called after source buffer reinit to flush queued track switch data.
102
+ * Ported from mews.js:341-367
103
+ */
104
+ private drainMessageQueue;
105
+ /**
106
+ * Install event handlers on the sourceBuffer.
107
+ * Ported from mews.js:224-279
108
+ */
109
+ private installEventHandlers;
110
+ /**
111
+ * Flush any pending queue data.
112
+ */
113
+ private flushQueue;
114
+ /**
115
+ * Check if there's an active message queue (track switch in progress)
116
+ */
117
+ hasActiveMessageQueue(): boolean;
118
+ destroy(): void;
119
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * WebSocket Manager for MEWS Player
3
+ *
4
+ * Handles WebSocket connection, reconnection with exponential backoff,
5
+ * message sending, and typed message listeners.
6
+ *
7
+ * Ported from reference: mews.js:387-883
8
+ */
9
+ import type { WebSocketManagerOptions, MewsMessage, MewsMessageListener } from './types';
10
+ export declare class WebSocketManager {
11
+ private ws;
12
+ private url;
13
+ private maxReconnectAttempts;
14
+ private reconnectAttempts;
15
+ private reconnectTimer;
16
+ private wasConnected;
17
+ private isDestroyed;
18
+ private pendingRetryTimers;
19
+ private listeners;
20
+ private onMessage;
21
+ private onOpen;
22
+ private onClose;
23
+ private onError;
24
+ constructor(options: WebSocketManagerOptions);
25
+ connect(): void;
26
+ /**
27
+ * Send a command with retry logic (3.3.6).
28
+ * If not connected, will retry up to 5 times with 500ms delay.
29
+ * If connection is closing/closed, will attempt reconnect then retry.
30
+ */
31
+ send(cmd: object, retry?: number): boolean;
32
+ private clearReconnectTimer;
33
+ destroy(): void;
34
+ isConnected(): boolean;
35
+ /**
36
+ * Add a listener for a specific message type.
37
+ * Ported from mews.js:441-444
38
+ *
39
+ * @param type - Message type to listen for (e.g., 'on_time', 'codec_data', 'seek')
40
+ * @param callback - Function to call when message is received
41
+ */
42
+ addListener(type: string, callback: MewsMessageListener): void;
43
+ /**
44
+ * Remove a listener for a specific message type.
45
+ * Ported from mews.js:445-450
46
+ *
47
+ * @param type - Message type
48
+ * @param callback - The exact callback function to remove
49
+ * @returns true if listener was found and removed
50
+ */
51
+ removeListener(type: string, callback: MewsMessageListener): boolean;
52
+ /**
53
+ * Notify all listeners for a given message type.
54
+ * Called internally when a JSON message is received.
55
+ * Ported from mews.js:795-799
56
+ *
57
+ * @param msg - Parsed message object
58
+ */
59
+ notifyListeners(msg: MewsMessage): void;
60
+ }
@@ -0,0 +1,220 @@
1
+ /**
2
+ * MEWS WebSocket Player Implementation
3
+ *
4
+ * Low-latency WebSocket MP4 streaming using MediaSource Extensions.
5
+ * Protocol: Custom MEWS (MistServer Extended WebSocket)
6
+ *
7
+ * Ported from reference: mews.js (MistMetaPlayer)
8
+ */
9
+ import { BasePlayer } from '../../core/PlayerInterface';
10
+ import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';
11
+ export declare class MewsWsPlayerImpl extends BasePlayer {
12
+ readonly capability: PlayerCapability;
13
+ private wsManager;
14
+ private sbManager;
15
+ private mediaSource;
16
+ private objectUrl;
17
+ private container;
18
+ private isDestroyed;
19
+ private debugging;
20
+ private serverDelays;
21
+ private pendingDelayTypes;
22
+ private supportedCodecs;
23
+ private isReady;
24
+ private readyResolvers;
25
+ private lastDuration;
26
+ private streamType;
27
+ private currentTracks;
28
+ private lastCodecs;
29
+ private requestedRate;
30
+ private bitCounter;
31
+ private bitsSince;
32
+ private currentBps;
33
+ private nWaiting;
34
+ private nWaitingThreshold;
35
+ private seeking;
36
+ private analyticsConfig;
37
+ private analyticsTimer;
38
+ isMimeSupported(mimetype: string): boolean;
39
+ isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];
40
+ initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement>;
41
+ /**
42
+ * Handle MediaSource sourceopen event.
43
+ * Ported from mews.js:143-148, 198-204, 885-902
44
+ */
45
+ private handleSourceOpen;
46
+ /**
47
+ * Handle MediaSource sourceclose event.
48
+ * Ported from mews.js:150-153
49
+ */
50
+ private handleSourceClose;
51
+ /**
52
+ * Handle MediaSource sourceended event.
53
+ * Ported from mews.js:154-194
54
+ */
55
+ private handleSourceEnded;
56
+ /**
57
+ * Handle WebSocket open event.
58
+ * Ported from mews.js:401-403, 885-902
59
+ */
60
+ private handleWsOpen;
61
+ /**
62
+ * Handle WebSocket close event with reconnection logic.
63
+ * Ported from mews.js:408-431
64
+ */
65
+ private handleWsClose;
66
+ /**
67
+ * Handle incoming WebSocket message.
68
+ * Routes to binary append or JSON control message handler.
69
+ * Ported from mews.js:456-830
70
+ */
71
+ private handleMessage;
72
+ /**
73
+ * Handle JSON control messages.
74
+ * Ported from mews.js:461-799
75
+ */
76
+ private handleControlMessage;
77
+ /**
78
+ * Handle on_stop message - stream ended (VoD).
79
+ * Ported from mews.js:462-471
80
+ */
81
+ private handleOnStop;
82
+ /**
83
+ * Handle on_time message - playback time sync.
84
+ * Ported from mews.js:473-621
85
+ */
86
+ private handleOnTime;
87
+ /**
88
+ * Tune playback rate for live streams.
89
+ * Ported from mews.js:508-545
90
+ *
91
+ * Fixed: Use direct assignment instead of multiplication to prevent
92
+ * compounding rate adjustments on each on_time message.
93
+ */
94
+ private tuneLivePlaybackRate;
95
+ /**
96
+ * Tune server delivery speed for VoD.
97
+ * Ported from mews.js:547-586
98
+ */
99
+ private tuneVodDeliverySpeed;
100
+ /**
101
+ * Handle tracks message - codec switch.
102
+ * Ported from mews.js:623-788
103
+ */
104
+ private handleTracks;
105
+ /**
106
+ * Handle pause message.
107
+ * Ported from mews.js:790-792
108
+ */
109
+ private handlePause;
110
+ /**
111
+ * Set video currentTime with retry logic.
112
+ * Ported from mews.js:635-672
113
+ */
114
+ private setSeekingPosition;
115
+ /**
116
+ * Check if two codec arrays are equivalent (order-independent)
117
+ */
118
+ private codecsEqual;
119
+ /**
120
+ * Play with optional skip to live edge.
121
+ * Ported from mews.js:959-1023
122
+ */
123
+ play(): Promise<void>;
124
+ /**
125
+ * Pause playback and server delivery.
126
+ * Ported from mews.js:1025-1029
127
+ */
128
+ pause(): void;
129
+ /**
130
+ * Seek to position with server sync.
131
+ * Ported from mews.js:1071-1111
132
+ */
133
+ seek(time: number): void;
134
+ /**
135
+ * Try to set currentTime with retry logic.
136
+ * Ported from mews.js:1092-1103
137
+ */
138
+ private trySetCurrentTime;
139
+ getCurrentTime(): number;
140
+ getDuration(): number;
141
+ /**
142
+ * Set playback rate.
143
+ * Ported from mews.js:1119-1129
144
+ */
145
+ setPlaybackRate(rate: number): void;
146
+ getQualities(): Array<{
147
+ id: string;
148
+ label: string;
149
+ isAuto?: boolean;
150
+ active?: boolean;
151
+ }>;
152
+ selectQuality(id: string): void;
153
+ /**
154
+ * Set tracks for ABR or quality selection.
155
+ * Ported from mews.js:1030-1037
156
+ */
157
+ setTracks(obj: {
158
+ video?: string;
159
+ audio?: string;
160
+ subtitle?: string;
161
+ }): void;
162
+ /**
163
+ * Select a subtitle track.
164
+ */
165
+ selectTextTrack(id: string | null): void;
166
+ isLive(): boolean;
167
+ /**
168
+ * Jump to live edge.
169
+ */
170
+ jumpToLive(): void;
171
+ getStats(): Promise<any>;
172
+ /**
173
+ * Install waiting event handler.
174
+ * Handles buffer gaps and ABR.
175
+ * Ported from mews.js:1177-1186, 1272-1278
176
+ */
177
+ private installWaitingHandler;
178
+ /**
179
+ * Install seeking event handlers.
180
+ * Ported from mews.js:1169-1175
181
+ */
182
+ private installSeekingHandler;
183
+ /**
184
+ * Install pause event handler for browser pause detection.
185
+ * Ported from mews.js:1188-1200
186
+ */
187
+ private installPauseHandler;
188
+ /**
189
+ * Install loop handler for VoD content.
190
+ * Ported from mews.js:1157-1167
191
+ */
192
+ private installLoopHandler;
193
+ /**
194
+ * Send command to server with retry.
195
+ * Ported from mews.js:904-944
196
+ */
197
+ private send;
198
+ /**
199
+ * Log delay for server RTT estimation.
200
+ * Ported from mews.js:835-862
201
+ */
202
+ private logDelay;
203
+ /**
204
+ * Resolve delay measurement.
205
+ * Ported from mews.js:855-861, 863-867
206
+ */
207
+ private resolveDelay;
208
+ /**
209
+ * Get average server delay.
210
+ * Ported from mews.js:869-881
211
+ */
212
+ private getServerDelay;
213
+ /**
214
+ * Track bandwidth for ABR.
215
+ * Ported from mews.js:1280-1303
216
+ */
217
+ private trackBits;
218
+ private startTelemetry;
219
+ destroy(): Promise<void>;
220
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * MEWS WebSocket Player Types
3
+ */
4
+ export interface MewsMessage {
5
+ type: string;
6
+ data?: any;
7
+ }
8
+ export interface CodecDataMessage extends MewsMessage {
9
+ type: 'codec_data';
10
+ data: {
11
+ codecs: string[];
12
+ };
13
+ }
14
+ export interface OnTimeMessage extends MewsMessage {
15
+ type: 'on_time';
16
+ data: {
17
+ current: number;
18
+ end?: number;
19
+ begin?: number;
20
+ play_rate_curr?: 'auto' | number;
21
+ jitter?: number;
22
+ tracks?: string[];
23
+ };
24
+ }
25
+ export interface TracksMessage extends MewsMessage {
26
+ type: 'tracks';
27
+ data: {
28
+ codecs: string[];
29
+ current?: number;
30
+ };
31
+ }
32
+ export interface OnStopMessage extends MewsMessage {
33
+ type: 'on_stop';
34
+ }
35
+ export interface SeekAckMessage extends MewsMessage {
36
+ type: 'seek';
37
+ }
38
+ export interface SetSpeedAckMessage extends MewsMessage {
39
+ type: 'set_speed';
40
+ data?: {
41
+ play_rate_curr?: 'auto' | number;
42
+ };
43
+ }
44
+ export interface PauseMessage extends MewsMessage {
45
+ type: 'pause';
46
+ }
47
+ export interface MewsCommand {
48
+ type: 'request_codec_data' | 'play' | 'hold' | 'seek' | 'set_speed' | 'tracks';
49
+ [key: string]: any;
50
+ }
51
+ export interface RequestCodecDataCommand extends MewsCommand {
52
+ type: 'request_codec_data';
53
+ supported_codecs: string[];
54
+ }
55
+ export interface SeekCommand extends MewsCommand {
56
+ type: 'seek';
57
+ seek_time: number;
58
+ }
59
+ export interface SetSpeedCommand extends MewsCommand {
60
+ type: 'set_speed';
61
+ play_rate: number | 'auto';
62
+ }
63
+ export interface TracksCommand extends MewsCommand {
64
+ type: 'tracks';
65
+ video?: string;
66
+ subtitle?: string;
67
+ }
68
+ /**
69
+ * Callback for WebSocket message listeners.
70
+ * Listeners are registered per message type and receive parsed MewsMessage objects.
71
+ */
72
+ export type MewsMessageListener = (msg: MewsMessage) => void;
73
+ export interface WebSocketManagerOptions {
74
+ url: string;
75
+ maxReconnectAttempts?: number;
76
+ onMessage: (data: ArrayBuffer | string) => void;
77
+ onOpen: () => void;
78
+ onClose: () => void;
79
+ onError: (message: string) => void;
80
+ }
81
+ export interface SourceBufferManagerOptions {
82
+ mediaSource: MediaSource;
83
+ videoElement: HTMLVideoElement;
84
+ onError: (message: string) => void;
85
+ }
86
+ export interface AnalyticsConfig {
87
+ enabled: boolean;
88
+ endpoint: string | null;
89
+ }
@@ -0,0 +1,25 @@
1
+ import { BasePlayer } from '../core/PlayerInterface';
2
+ import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';
3
+ /**
4
+ * MistPlayerImpl - Legacy fallback player
5
+ *
6
+ * Simple passthrough to MistServer's native player.js embed.
7
+ * No codec preferences or fancy params - just let MistServer handle everything.
8
+ * This is the final fallback when other players fail.
9
+ */
10
+ export declare class MistPlayerImpl extends BasePlayer {
11
+ readonly capability: PlayerCapability;
12
+ private container;
13
+ private mistDiv;
14
+ private proxyVideo;
15
+ private previousContainerOverflow;
16
+ private destroyed;
17
+ isMimeSupported(mimetype: string): boolean;
18
+ isBrowserSupported(mimetype: string, _source: StreamSource, _streamInfo: StreamInfo): boolean | string[];
19
+ initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement>;
20
+ private getPlayerJsUrl;
21
+ private loadAndPlay;
22
+ private findVideoElement;
23
+ private createProxyVideo;
24
+ destroy(): Promise<void>;
25
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * MistWebRTCPlayerImpl - IPlayer implementation for MistServer native WebRTC
3
+ *
4
+ * Uses MistServer's WebSocket signaling protocol instead of WHEP.
5
+ * Key advantages over WHEP:
6
+ * - Server-side track selection via signaling
7
+ * - Playback speed control (including "auto" for live catch-up)
8
+ * - Seeking via signaling (DVR support)
9
+ * - Real-time buffer_window updates
10
+ * - DataChannel for timed metadata
11
+ */
12
+ import { BasePlayer } from '../../core/PlayerInterface';
13
+ import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../../core/PlayerInterface';
14
+ export declare class MistWebRTCPlayerImpl extends BasePlayer {
15
+ readonly capability: PlayerCapability;
16
+ private signaling;
17
+ private peerConnection;
18
+ private dataChannel;
19
+ private container;
20
+ private destroyed;
21
+ private seekOffset;
22
+ private durationMs;
23
+ private isLiveStream;
24
+ private playRate;
25
+ private bufferWindow;
26
+ private currentTracks;
27
+ private currentSource;
28
+ private currentOptions;
29
+ private lastInboundStats;
30
+ /**
31
+ * Chrome on Android has a bug where H264 is not available immediately
32
+ * after the tab is opened. Retry up to 5 times with 100ms intervals.
33
+ * https://bugs.chromium.org/p/webrtc/issues/detail?id=11620
34
+ */
35
+ private checkH264Available;
36
+ /**
37
+ * Load MistServer's WebRTC browser equalizer script for browser-specific fixes.
38
+ * This is non-fatal if it fails to load.
39
+ */
40
+ private loadBrowserEqualizer;
41
+ /**
42
+ * Compare two arrays for equality (order-independent)
43
+ */
44
+ private arraysEqual;
45
+ isMimeSupported(mimetype: string): boolean;
46
+ isBrowserSupported(mimetype: string, source: StreamSource, streamInfo: StreamInfo): boolean | string[];
47
+ initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement>;
48
+ destroy(): Promise<void>;
49
+ seek(time: number): void;
50
+ setPlaybackRate(rate: number): void;
51
+ jumpToLive(): void;
52
+ isLive(): boolean;
53
+ getDuration(): number;
54
+ getCurrentTime(): number;
55
+ /**
56
+ * Get available quality levels from signaling
57
+ */
58
+ getQualities(): Array<{
59
+ id: string;
60
+ label: string;
61
+ isAuto?: boolean;
62
+ active?: boolean;
63
+ }>;
64
+ selectQuality(id: string): void;
65
+ selectTextTrack(id: string | null): void;
66
+ getStats(): Promise<{
67
+ type: 'webrtc';
68
+ video?: {
69
+ bytesReceived: number;
70
+ packetsReceived: number;
71
+ packetsLost: number;
72
+ packetLossRate: number;
73
+ jitter: number;
74
+ framesDecoded: number;
75
+ framesDropped: number;
76
+ frameDropRate: number;
77
+ frameWidth: number;
78
+ frameHeight: number;
79
+ framesPerSecond: number;
80
+ bitrate: number;
81
+ jitterBufferDelay: number;
82
+ };
83
+ audio?: {
84
+ bytesReceived: number;
85
+ packetsReceived: number;
86
+ packetsLost: number;
87
+ packetLossRate: number;
88
+ jitter: number;
89
+ bitrate: number;
90
+ };
91
+ network?: {
92
+ rtt: number;
93
+ availableOutgoingBitrate: number;
94
+ availableIncomingBitrate: number;
95
+ bytesSent: number;
96
+ bytesReceived: number;
97
+ };
98
+ timestamp: number;
99
+ } | undefined>;
100
+ getLatency(): Promise<{
101
+ estimatedMs: number;
102
+ jitterBufferMs: number;
103
+ rttMs: number;
104
+ } | undefined>;
105
+ /**
106
+ * Get the current buffer window in milliseconds (P2)
107
+ * This is the difference between buffer end and begin from on_time messages.
108
+ */
109
+ getBufferWindow(): number;
110
+ /**
111
+ * Request video track matching the given player size (P2 - ABR_resize)
112
+ * Uses MistServer's ~widthxheight track selection syntax.
113
+ */
114
+ setQualityForSize(size: {
115
+ width: number;
116
+ height: number;
117
+ }): void;
118
+ /**
119
+ * Get the metadata DataChannel for timed metadata (P2)
120
+ * Returns the RTCDataChannel or null if not available.
121
+ */
122
+ getMetaDataChannel(): RTCDataChannel | null;
123
+ /**
124
+ * Override to add WebRTC-specific event handling:
125
+ * - Loop reconnect for VoD (P1)
126
+ * - Proper autoplay disable (P2)
127
+ */
128
+ protected setupVideoEventListeners(video: HTMLVideoElement, options: PlayerOptions): void;
129
+ private setupWebRTC;
130
+ private setupSignalingHandlers;
131
+ private handleTimeUpdate;
132
+ private createAndSendOffer;
133
+ }