@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.
- package/dist/cjs/index.js +19493 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.js +19398 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/player.css +2140 -0
- package/dist/types/core/ABRController.d.ts +164 -0
- package/dist/types/core/CodecUtils.d.ts +54 -0
- package/dist/types/core/Disposable.d.ts +61 -0
- package/dist/types/core/EventEmitter.d.ts +73 -0
- package/dist/types/core/GatewayClient.d.ts +144 -0
- package/dist/types/core/InteractionController.d.ts +121 -0
- package/dist/types/core/LiveDurationProxy.d.ts +102 -0
- package/dist/types/core/MetaTrackManager.d.ts +220 -0
- package/dist/types/core/MistReporter.d.ts +163 -0
- package/dist/types/core/MistSignaling.d.ts +148 -0
- package/dist/types/core/PlayerController.d.ts +665 -0
- package/dist/types/core/PlayerInterface.d.ts +230 -0
- package/dist/types/core/PlayerManager.d.ts +182 -0
- package/dist/types/core/PlayerRegistry.d.ts +27 -0
- package/dist/types/core/QualityMonitor.d.ts +184 -0
- package/dist/types/core/ScreenWakeLockManager.d.ts +70 -0
- package/dist/types/core/SeekingUtils.d.ts +142 -0
- package/dist/types/core/StreamStateClient.d.ts +108 -0
- package/dist/types/core/SubtitleManager.d.ts +111 -0
- package/dist/types/core/TelemetryReporter.d.ts +79 -0
- package/dist/types/core/TimeFormat.d.ts +97 -0
- package/dist/types/core/TimerManager.d.ts +83 -0
- package/dist/types/core/UrlUtils.d.ts +81 -0
- package/dist/types/core/detector.d.ts +149 -0
- package/dist/types/core/index.d.ts +49 -0
- package/dist/types/core/scorer.d.ts +167 -0
- package/dist/types/core/selector.d.ts +9 -0
- package/dist/types/index.d.ts +45 -0
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/types/players/DashJsPlayer.d.ts +102 -0
- package/dist/types/players/HlsJsPlayer.d.ts +70 -0
- package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +119 -0
- package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +60 -0
- package/dist/types/players/MewsWsPlayer/index.d.ts +220 -0
- package/dist/types/players/MewsWsPlayer/types.d.ts +89 -0
- package/dist/types/players/MistPlayer.d.ts +25 -0
- package/dist/types/players/MistWebRTCPlayer/index.d.ts +133 -0
- package/dist/types/players/NativePlayer.d.ts +143 -0
- package/dist/types/players/VideoJsPlayer.d.ts +59 -0
- package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +118 -0
- package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +64 -0
- package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +63 -0
- package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +174 -0
- package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +164 -0
- package/dist/types/players/WebCodecsPlayer/index.d.ts +149 -0
- package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +105 -0
- package/dist/types/players/WebCodecsPlayer/types.d.ts +395 -0
- package/dist/types/players/WebCodecsPlayer/worker/decoder.worker.d.ts +13 -0
- package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +197 -0
- package/dist/types/players/index.d.ts +14 -0
- package/dist/types/styles/index.d.ts +11 -0
- package/dist/types/types.d.ts +363 -0
- package/dist/types/vanilla/FrameWorksPlayer.d.ts +143 -0
- package/dist/types/vanilla/index.d.ts +19 -0
- package/dist/workers/decoder.worker.js +989 -0
- package/dist/workers/decoder.worker.js.map +1 -0
- package/package.json +80 -0
- package/src/core/ABRController.ts +550 -0
- package/src/core/CodecUtils.ts +257 -0
- package/src/core/Disposable.ts +120 -0
- package/src/core/EventEmitter.ts +113 -0
- package/src/core/GatewayClient.ts +439 -0
- package/src/core/InteractionController.ts +712 -0
- package/src/core/LiveDurationProxy.ts +270 -0
- package/src/core/MetaTrackManager.ts +753 -0
- package/src/core/MistReporter.ts +543 -0
- package/src/core/MistSignaling.ts +346 -0
- package/src/core/PlayerController.ts +2829 -0
- package/src/core/PlayerInterface.ts +432 -0
- package/src/core/PlayerManager.ts +900 -0
- package/src/core/PlayerRegistry.ts +149 -0
- package/src/core/QualityMonitor.ts +597 -0
- package/src/core/ScreenWakeLockManager.ts +163 -0
- package/src/core/SeekingUtils.ts +364 -0
- package/src/core/StreamStateClient.ts +457 -0
- package/src/core/SubtitleManager.ts +297 -0
- package/src/core/TelemetryReporter.ts +308 -0
- package/src/core/TimeFormat.ts +205 -0
- package/src/core/TimerManager.ts +209 -0
- package/src/core/UrlUtils.ts +179 -0
- package/src/core/detector.ts +382 -0
- package/src/core/index.ts +140 -0
- package/src/core/scorer.ts +553 -0
- package/src/core/selector.ts +16 -0
- package/src/global.d.ts +11 -0
- package/src/index.ts +75 -0
- package/src/lib/utils.ts +6 -0
- package/src/players/DashJsPlayer.ts +642 -0
- package/src/players/HlsJsPlayer.ts +483 -0
- package/src/players/MewsWsPlayer/SourceBufferManager.ts +572 -0
- package/src/players/MewsWsPlayer/WebSocketManager.ts +241 -0
- package/src/players/MewsWsPlayer/index.ts +1065 -0
- package/src/players/MewsWsPlayer/types.ts +106 -0
- package/src/players/MistPlayer.ts +188 -0
- package/src/players/MistWebRTCPlayer/index.ts +703 -0
- package/src/players/NativePlayer.ts +820 -0
- package/src/players/VideoJsPlayer.ts +643 -0
- package/src/players/WebCodecsPlayer/JitterBuffer.ts +299 -0
- package/src/players/WebCodecsPlayer/LatencyProfiles.ts +151 -0
- package/src/players/WebCodecsPlayer/RawChunkParser.ts +151 -0
- package/src/players/WebCodecsPlayer/SyncController.ts +456 -0
- package/src/players/WebCodecsPlayer/WebSocketController.ts +564 -0
- package/src/players/WebCodecsPlayer/index.ts +1650 -0
- package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +379 -0
- package/src/players/WebCodecsPlayer/types.ts +542 -0
- package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +1360 -0
- package/src/players/WebCodecsPlayer/worker/types.ts +276 -0
- package/src/players/index.ts +22 -0
- package/src/styles/animations.css +21 -0
- package/src/styles/index.ts +52 -0
- package/src/styles/player.css +2126 -0
- package/src/styles/tailwind.css +1015 -0
- package/src/types.ts +421 -0
- package/src/vanilla/FrameWorksPlayer.ts +367 -0
- package/src/vanilla/index.ts +22 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for FrameWorks player - framework agnostic
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** High-level player state machine for UI */
|
|
6
|
+
export type PlayerState =
|
|
7
|
+
| 'booting'
|
|
8
|
+
| 'gateway_loading'
|
|
9
|
+
| 'gateway_ready'
|
|
10
|
+
| 'gateway_error'
|
|
11
|
+
| 'no_endpoint'
|
|
12
|
+
| 'selecting_player'
|
|
13
|
+
| 'connecting'
|
|
14
|
+
| 'buffering'
|
|
15
|
+
| 'playing'
|
|
16
|
+
| 'paused'
|
|
17
|
+
| 'ended'
|
|
18
|
+
| 'error'
|
|
19
|
+
| 'destroyed';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Content type (used for Gateway resolution + UI presets).
|
|
23
|
+
*
|
|
24
|
+
* Notes:
|
|
25
|
+
* - `dvr` can be effectively-live when `metadata.dvrStatus === 'recording'`
|
|
26
|
+
* - `vod`/`clip`/completed `dvr` should use VOD-like presets and controls
|
|
27
|
+
*/
|
|
28
|
+
export type ContentType = 'live' | 'dvr' | 'clip' | 'vod';
|
|
29
|
+
|
|
30
|
+
export interface PlayerStateContext {
|
|
31
|
+
reason?: string;
|
|
32
|
+
gatewayStatus?: 'idle' | 'loading' | 'ready' | 'error';
|
|
33
|
+
selectedPlayer?: string;
|
|
34
|
+
selectedProtocol?: string;
|
|
35
|
+
nodeId?: string;
|
|
36
|
+
endpointUrl?: string;
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// FrameWorks Player options
|
|
41
|
+
export interface PlayerOptions {
|
|
42
|
+
gatewayUrl?: string;
|
|
43
|
+
/** Direct MistServer base URL (e.g. "http://localhost:8080") - bypasses Gateway resolution */
|
|
44
|
+
mistUrl?: string;
|
|
45
|
+
authToken?: string;
|
|
46
|
+
autoplay?: boolean;
|
|
47
|
+
muted?: boolean;
|
|
48
|
+
controls?: boolean;
|
|
49
|
+
stockControls?: boolean;
|
|
50
|
+
debug?: boolean;
|
|
51
|
+
/** Show dev mode overlay panel (player/source selection, stats) */
|
|
52
|
+
devMode?: boolean;
|
|
53
|
+
/** Force a specific player (e.g., 'videojs', 'hlsjs', 'dashjs', 'direct', 'mist') */
|
|
54
|
+
forcePlayer?: string;
|
|
55
|
+
/** Force a specific MIME type (e.g., 'html5/application/vnd.apple.mpegurl') */
|
|
56
|
+
forceType?: string;
|
|
57
|
+
/** Force a specific source index */
|
|
58
|
+
forceSource?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Playback mode affects protocol selection:
|
|
61
|
+
* - 'low-latency': Prefer WebRTC/WHEP for minimal delay
|
|
62
|
+
* - 'quality': Prefer HLS/DASH for ABR and quality
|
|
63
|
+
* - 'dvr': Prefer protocols that support seeking in live buffer
|
|
64
|
+
* - 'auto': Score-based selection (default)
|
|
65
|
+
*/
|
|
66
|
+
playbackMode?: PlaybackMode;
|
|
67
|
+
|
|
68
|
+
/** HLS.js configuration override (merged with defaults) */
|
|
69
|
+
hlsConfig?: HlsJsConfig;
|
|
70
|
+
/** DASH.js configuration override (merged with defaults) */
|
|
71
|
+
dashConfig?: DashJsConfig;
|
|
72
|
+
/** WebRTC configuration (ICE servers, etc.) */
|
|
73
|
+
rtcConfig?: RTCConfiguration;
|
|
74
|
+
/** String to append to all request URLs (auth tokens, tracking params) */
|
|
75
|
+
urlAppend?: string;
|
|
76
|
+
/** Low latency mode for HLS (enables LL-HLS features) */
|
|
77
|
+
lowLatencyMode?: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** HLS.js configuration subset */
|
|
81
|
+
export interface HlsJsConfig {
|
|
82
|
+
debug?: boolean;
|
|
83
|
+
autoStartLoad?: boolean;
|
|
84
|
+
startPosition?: number;
|
|
85
|
+
maxBufferLength?: number;
|
|
86
|
+
maxBufferSize?: number;
|
|
87
|
+
maxMaxBufferLength?: number;
|
|
88
|
+
lowLatencyMode?: boolean;
|
|
89
|
+
abrEwmaDefaultEstimate?: number;
|
|
90
|
+
abrEwmaFastLive?: number;
|
|
91
|
+
abrEwmaSlowLive?: number;
|
|
92
|
+
fragLoadingMaxRetry?: number;
|
|
93
|
+
fragLoadingTimeOut?: number;
|
|
94
|
+
levelLoadingTimeOut?: number;
|
|
95
|
+
manifestLoadingTimeOut?: number;
|
|
96
|
+
[key: string]: unknown;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** DASH.js configuration subset */
|
|
100
|
+
export interface DashJsConfig {
|
|
101
|
+
debug?: boolean;
|
|
102
|
+
autoPlay?: boolean;
|
|
103
|
+
streaming?: {
|
|
104
|
+
lowLatencyEnabled?: boolean;
|
|
105
|
+
liveDelay?: number;
|
|
106
|
+
liveDelayFragmentCount?: number;
|
|
107
|
+
buffer?: {
|
|
108
|
+
stableBufferTime?: number;
|
|
109
|
+
fastSwitchEnabled?: boolean;
|
|
110
|
+
};
|
|
111
|
+
abr?: {
|
|
112
|
+
autoSwitchBitrate?: { video: boolean; audio: boolean };
|
|
113
|
+
ABRStrategy?: 'abrDynamic' | 'abrBola' | 'abrL2A' | 'abrLoLP' | 'abrThroughput';
|
|
114
|
+
useDefaultABRRules?: boolean;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
[key: string]: unknown;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Gateway/Foghorn viewer resolution types
|
|
121
|
+
export type StreamProtocol = 'WHEP' | 'HLS' | 'DASH' | 'MP4' | 'WEBM' | 'RTMP' | 'MIST_HTML';
|
|
122
|
+
|
|
123
|
+
export interface OutputCapabilities {
|
|
124
|
+
supportsSeek: boolean;
|
|
125
|
+
supportsQualitySwitch: boolean;
|
|
126
|
+
maxBitrate?: number;
|
|
127
|
+
hasAudio: boolean;
|
|
128
|
+
hasVideo: boolean;
|
|
129
|
+
codecs?: string[];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface QualityLevel {
|
|
133
|
+
id: string;
|
|
134
|
+
label: string;
|
|
135
|
+
width?: number;
|
|
136
|
+
height?: number;
|
|
137
|
+
bitrate?: number;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface OutputEndpoint {
|
|
141
|
+
protocol: StreamProtocol | string;
|
|
142
|
+
url: string;
|
|
143
|
+
capabilities?: OutputCapabilities;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface EndpointInfo {
|
|
147
|
+
nodeId: string;
|
|
148
|
+
baseUrl?: string;
|
|
149
|
+
protocol: StreamProtocol | string;
|
|
150
|
+
url: string;
|
|
151
|
+
quality?: QualityLevel;
|
|
152
|
+
capabilities?: OutputCapabilities;
|
|
153
|
+
outputs?: Record<string, OutputEndpoint>;
|
|
154
|
+
geoDistance?: number;
|
|
155
|
+
loadScore?: number;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export interface ContentMetadata {
|
|
159
|
+
title?: string;
|
|
160
|
+
description?: string;
|
|
161
|
+
contentId?: string;
|
|
162
|
+
contentType?: ContentType;
|
|
163
|
+
durationSeconds?: number;
|
|
164
|
+
thumbnailUrl?: string;
|
|
165
|
+
createdAt?: string;
|
|
166
|
+
status?: 'AVAILABLE' | 'PROCESSING' | 'ERROR' | 'OFFLINE';
|
|
167
|
+
viewers?: number;
|
|
168
|
+
isLive?: boolean;
|
|
169
|
+
recordingSizeBytes?: number;
|
|
170
|
+
clipSource?: string;
|
|
171
|
+
/** DVR recording status: 'recording' = in progress (treat as live), 'completed' = finished (treat as VOD) */
|
|
172
|
+
dvrStatus?: 'recording' | 'completed';
|
|
173
|
+
/** Native container format: mp4, m3u8, webm, etc. */
|
|
174
|
+
format?: string;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface ContentEndpoints {
|
|
178
|
+
primary: EndpointInfo;
|
|
179
|
+
fallbacks: EndpointInfo[];
|
|
180
|
+
metadata?: ContentMetadata;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Stream State Types (MistServer native polling)
|
|
184
|
+
export type StreamStatus =
|
|
185
|
+
| 'ONLINE'
|
|
186
|
+
| 'OFFLINE'
|
|
187
|
+
| 'INITIALIZING'
|
|
188
|
+
| 'BOOTING'
|
|
189
|
+
| 'WAITING_FOR_DATA'
|
|
190
|
+
| 'SHUTTING_DOWN'
|
|
191
|
+
| 'INVALID'
|
|
192
|
+
| 'ERROR';
|
|
193
|
+
|
|
194
|
+
export interface MistStreamInfo {
|
|
195
|
+
error?: string;
|
|
196
|
+
on_error?: string;
|
|
197
|
+
perc?: number;
|
|
198
|
+
type?: 'live' | 'vod';
|
|
199
|
+
hasVideo?: boolean;
|
|
200
|
+
hasAudio?: boolean;
|
|
201
|
+
unixoffset?: number;
|
|
202
|
+
lastms?: number;
|
|
203
|
+
source?: MistStreamSource[];
|
|
204
|
+
meta?: MistStreamMeta;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface MistStreamMeta {
|
|
208
|
+
tracks?: Record<string, MistTrackInfo>;
|
|
209
|
+
buffer_window?: number;
|
|
210
|
+
duration?: number;
|
|
211
|
+
/** Optional MistServer base URL hint (present in some gateway-merged payloads) */
|
|
212
|
+
mistUrl?: string;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export interface MistStreamSource {
|
|
216
|
+
url: string;
|
|
217
|
+
type: string;
|
|
218
|
+
priority?: number;
|
|
219
|
+
simul_tracks?: number;
|
|
220
|
+
relurl?: string;
|
|
221
|
+
RTCIceServers?: RTCIceServer[];
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface MistTrackInfo {
|
|
225
|
+
type: 'video' | 'audio' | 'meta';
|
|
226
|
+
codec: string;
|
|
227
|
+
width?: number;
|
|
228
|
+
height?: number;
|
|
229
|
+
bps?: number;
|
|
230
|
+
fpks?: number;
|
|
231
|
+
init?: string;
|
|
232
|
+
codecstring?: string;
|
|
233
|
+
firstms?: number;
|
|
234
|
+
lastms?: number;
|
|
235
|
+
lang?: string;
|
|
236
|
+
idx?: number;
|
|
237
|
+
channels?: number;
|
|
238
|
+
rate?: number;
|
|
239
|
+
/** Track payload size in bytes (present on some MistServer builds) */
|
|
240
|
+
size?: number;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export interface StreamStateOptions {
|
|
244
|
+
mistBaseUrl: string;
|
|
245
|
+
streamName: string;
|
|
246
|
+
pollInterval?: number;
|
|
247
|
+
enabled?: boolean;
|
|
248
|
+
useWebSocket?: boolean;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface StreamState {
|
|
252
|
+
status: StreamStatus;
|
|
253
|
+
isOnline: boolean;
|
|
254
|
+
message: string;
|
|
255
|
+
percentage?: number;
|
|
256
|
+
lastUpdate: number;
|
|
257
|
+
streamInfo?: MistStreamInfo;
|
|
258
|
+
error?: string;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Playback Quality Types
|
|
262
|
+
export interface PlaybackQuality {
|
|
263
|
+
score: number;
|
|
264
|
+
bitrate: number;
|
|
265
|
+
bufferedAhead: number;
|
|
266
|
+
stallCount: number;
|
|
267
|
+
frameDropRate: number;
|
|
268
|
+
latency: number;
|
|
269
|
+
timestamp: number;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export interface QualityThresholds {
|
|
273
|
+
minScore: number;
|
|
274
|
+
maxStalls: number;
|
|
275
|
+
minBuffer: number;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Backwards-compat alias (older wrappers used this name)
|
|
279
|
+
export type PlaybackThresholds = QualityThresholds;
|
|
280
|
+
|
|
281
|
+
export interface PlaybackQualityOptions {
|
|
282
|
+
videoElement: HTMLVideoElement | null;
|
|
283
|
+
enabled?: boolean;
|
|
284
|
+
sampleInterval?: number;
|
|
285
|
+
thresholds?: Partial<QualityThresholds>;
|
|
286
|
+
onQualityDegraded?: (quality: PlaybackQuality) => void;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Meta Track Types
|
|
290
|
+
export type MetaTrackEventType = 'subtitle' | 'score' | 'event' | 'chapter' | 'unknown';
|
|
291
|
+
|
|
292
|
+
export interface MetaTrackEvent {
|
|
293
|
+
type: MetaTrackEventType;
|
|
294
|
+
timestamp: number;
|
|
295
|
+
trackId: string;
|
|
296
|
+
data: unknown;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export interface SubtitleCue {
|
|
300
|
+
id: string;
|
|
301
|
+
startTime: number;
|
|
302
|
+
endTime: number;
|
|
303
|
+
text: string;
|
|
304
|
+
lang?: string;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export interface ScoreUpdate {
|
|
308
|
+
key: string;
|
|
309
|
+
value: number | string;
|
|
310
|
+
team?: string;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export interface TimedEvent {
|
|
314
|
+
id: string;
|
|
315
|
+
name: string;
|
|
316
|
+
description?: string;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export interface ChapterMarker {
|
|
320
|
+
id: string;
|
|
321
|
+
title: string;
|
|
322
|
+
startTime: number;
|
|
323
|
+
endTime?: number;
|
|
324
|
+
thumbnailUrl?: string;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export interface MetaTrackOptions {
|
|
328
|
+
mistBaseUrl: string;
|
|
329
|
+
streamName: string;
|
|
330
|
+
subscriptions?: Array<{
|
|
331
|
+
trackId: string;
|
|
332
|
+
callback: (event: MetaTrackEvent) => void;
|
|
333
|
+
}>;
|
|
334
|
+
enabled?: boolean;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Telemetry Types
|
|
338
|
+
export interface TelemetryPayload {
|
|
339
|
+
timestamp: number;
|
|
340
|
+
sessionId: string;
|
|
341
|
+
contentId: string;
|
|
342
|
+
contentType: ContentType;
|
|
343
|
+
metrics: {
|
|
344
|
+
currentTime: number;
|
|
345
|
+
duration: number;
|
|
346
|
+
bufferedSeconds: number;
|
|
347
|
+
stallCount: number;
|
|
348
|
+
totalStallMs: number;
|
|
349
|
+
bitrate: number;
|
|
350
|
+
qualityScore: number;
|
|
351
|
+
framesDecoded: number;
|
|
352
|
+
framesDropped: number;
|
|
353
|
+
playerType: string;
|
|
354
|
+
protocol: string;
|
|
355
|
+
resolution?: { width: number; height: number };
|
|
356
|
+
};
|
|
357
|
+
errors?: Array<{ code: string; message: string; timestamp: number }>;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export interface TelemetryOptions {
|
|
361
|
+
enabled: boolean;
|
|
362
|
+
endpoint: string;
|
|
363
|
+
interval?: number;
|
|
364
|
+
authToken?: string;
|
|
365
|
+
batchSize?: number;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Playback mode affects protocol selection:
|
|
370
|
+
* - 'low-latency': Prefer WebRTC/WHEP for minimal delay (sub-second)
|
|
371
|
+
* - 'quality': Prefer MP4/WS for stable playback, HLS/DASH as fallback
|
|
372
|
+
* - 'vod': VOD/clip content - prefer seekable protocols (HLS/MP4), exclude WHEP
|
|
373
|
+
* - 'auto': Balanced selection (MP4/WS → WHEP → HLS)
|
|
374
|
+
*/
|
|
375
|
+
export type PlaybackMode = 'low-latency' | 'quality' | 'vod' | 'auto';
|
|
376
|
+
|
|
377
|
+
/** ABR mode configuration */
|
|
378
|
+
export type ABRMode = 'auto' | 'resize' | 'bitrate' | 'manual';
|
|
379
|
+
|
|
380
|
+
/** ABR controller options */
|
|
381
|
+
export interface ABROptions {
|
|
382
|
+
mode: ABRMode;
|
|
383
|
+
maxResolution?: { width: number; height: number };
|
|
384
|
+
maxBitrate?: number;
|
|
385
|
+
minBufferForUpgrade?: number;
|
|
386
|
+
downgradeThreshold?: number;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Combined metadata from Gateway and MistServer
|
|
391
|
+
* Emitted via onMetadata callback when player resolves content
|
|
392
|
+
*/
|
|
393
|
+
export interface PlayerMetadata {
|
|
394
|
+
// From Gateway (resolveViewerEndpoint)
|
|
395
|
+
title?: string;
|
|
396
|
+
description?: string;
|
|
397
|
+
contentId?: string;
|
|
398
|
+
contentType?: ContentType;
|
|
399
|
+
isLive?: boolean;
|
|
400
|
+
viewers?: number;
|
|
401
|
+
durationSeconds?: number;
|
|
402
|
+
status?: string;
|
|
403
|
+
createdAt?: string;
|
|
404
|
+
|
|
405
|
+
// From endpoint resolution
|
|
406
|
+
nodeId?: string;
|
|
407
|
+
protocol?: string;
|
|
408
|
+
geoDistance?: number;
|
|
409
|
+
|
|
410
|
+
// From MistServer (real-time)
|
|
411
|
+
tracks?: Array<{
|
|
412
|
+
type: 'video' | 'audio' | 'meta';
|
|
413
|
+
codec?: string;
|
|
414
|
+
width?: number;
|
|
415
|
+
height?: number;
|
|
416
|
+
bitrate?: number;
|
|
417
|
+
fps?: number;
|
|
418
|
+
channels?: number;
|
|
419
|
+
sampleRate?: number;
|
|
420
|
+
}>;
|
|
421
|
+
}
|