@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
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for FrameWorks player - framework agnostic
|
|
3
|
+
*/
|
|
4
|
+
/** High-level player state machine for UI */
|
|
5
|
+
export type PlayerState = 'booting' | 'gateway_loading' | 'gateway_ready' | 'gateway_error' | 'no_endpoint' | 'selecting_player' | 'connecting' | 'buffering' | 'playing' | 'paused' | 'ended' | 'error' | 'destroyed';
|
|
6
|
+
/**
|
|
7
|
+
* Content type (used for Gateway resolution + UI presets).
|
|
8
|
+
*
|
|
9
|
+
* Notes:
|
|
10
|
+
* - `dvr` can be effectively-live when `metadata.dvrStatus === 'recording'`
|
|
11
|
+
* - `vod`/`clip`/completed `dvr` should use VOD-like presets and controls
|
|
12
|
+
*/
|
|
13
|
+
export type ContentType = 'live' | 'dvr' | 'clip' | 'vod';
|
|
14
|
+
export interface PlayerStateContext {
|
|
15
|
+
reason?: string;
|
|
16
|
+
gatewayStatus?: 'idle' | 'loading' | 'ready' | 'error';
|
|
17
|
+
selectedPlayer?: string;
|
|
18
|
+
selectedProtocol?: string;
|
|
19
|
+
nodeId?: string;
|
|
20
|
+
endpointUrl?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PlayerOptions {
|
|
24
|
+
gatewayUrl?: string;
|
|
25
|
+
/** Direct MistServer base URL (e.g. "http://localhost:8080") - bypasses Gateway resolution */
|
|
26
|
+
mistUrl?: string;
|
|
27
|
+
authToken?: string;
|
|
28
|
+
autoplay?: boolean;
|
|
29
|
+
muted?: boolean;
|
|
30
|
+
controls?: boolean;
|
|
31
|
+
stockControls?: boolean;
|
|
32
|
+
debug?: boolean;
|
|
33
|
+
/** Show dev mode overlay panel (player/source selection, stats) */
|
|
34
|
+
devMode?: boolean;
|
|
35
|
+
/** Force a specific player (e.g., 'videojs', 'hlsjs', 'dashjs', 'direct', 'mist') */
|
|
36
|
+
forcePlayer?: string;
|
|
37
|
+
/** Force a specific MIME type (e.g., 'html5/application/vnd.apple.mpegurl') */
|
|
38
|
+
forceType?: string;
|
|
39
|
+
/** Force a specific source index */
|
|
40
|
+
forceSource?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Playback mode affects protocol selection:
|
|
43
|
+
* - 'low-latency': Prefer WebRTC/WHEP for minimal delay
|
|
44
|
+
* - 'quality': Prefer HLS/DASH for ABR and quality
|
|
45
|
+
* - 'dvr': Prefer protocols that support seeking in live buffer
|
|
46
|
+
* - 'auto': Score-based selection (default)
|
|
47
|
+
*/
|
|
48
|
+
playbackMode?: PlaybackMode;
|
|
49
|
+
/** HLS.js configuration override (merged with defaults) */
|
|
50
|
+
hlsConfig?: HlsJsConfig;
|
|
51
|
+
/** DASH.js configuration override (merged with defaults) */
|
|
52
|
+
dashConfig?: DashJsConfig;
|
|
53
|
+
/** WebRTC configuration (ICE servers, etc.) */
|
|
54
|
+
rtcConfig?: RTCConfiguration;
|
|
55
|
+
/** String to append to all request URLs (auth tokens, tracking params) */
|
|
56
|
+
urlAppend?: string;
|
|
57
|
+
/** Low latency mode for HLS (enables LL-HLS features) */
|
|
58
|
+
lowLatencyMode?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/** HLS.js configuration subset */
|
|
61
|
+
export interface HlsJsConfig {
|
|
62
|
+
debug?: boolean;
|
|
63
|
+
autoStartLoad?: boolean;
|
|
64
|
+
startPosition?: number;
|
|
65
|
+
maxBufferLength?: number;
|
|
66
|
+
maxBufferSize?: number;
|
|
67
|
+
maxMaxBufferLength?: number;
|
|
68
|
+
lowLatencyMode?: boolean;
|
|
69
|
+
abrEwmaDefaultEstimate?: number;
|
|
70
|
+
abrEwmaFastLive?: number;
|
|
71
|
+
abrEwmaSlowLive?: number;
|
|
72
|
+
fragLoadingMaxRetry?: number;
|
|
73
|
+
fragLoadingTimeOut?: number;
|
|
74
|
+
levelLoadingTimeOut?: number;
|
|
75
|
+
manifestLoadingTimeOut?: number;
|
|
76
|
+
[key: string]: unknown;
|
|
77
|
+
}
|
|
78
|
+
/** DASH.js configuration subset */
|
|
79
|
+
export interface DashJsConfig {
|
|
80
|
+
debug?: boolean;
|
|
81
|
+
autoPlay?: boolean;
|
|
82
|
+
streaming?: {
|
|
83
|
+
lowLatencyEnabled?: boolean;
|
|
84
|
+
liveDelay?: number;
|
|
85
|
+
liveDelayFragmentCount?: number;
|
|
86
|
+
buffer?: {
|
|
87
|
+
stableBufferTime?: number;
|
|
88
|
+
fastSwitchEnabled?: boolean;
|
|
89
|
+
};
|
|
90
|
+
abr?: {
|
|
91
|
+
autoSwitchBitrate?: {
|
|
92
|
+
video: boolean;
|
|
93
|
+
audio: boolean;
|
|
94
|
+
};
|
|
95
|
+
ABRStrategy?: 'abrDynamic' | 'abrBola' | 'abrL2A' | 'abrLoLP' | 'abrThroughput';
|
|
96
|
+
useDefaultABRRules?: boolean;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
[key: string]: unknown;
|
|
100
|
+
}
|
|
101
|
+
export type StreamProtocol = 'WHEP' | 'HLS' | 'DASH' | 'MP4' | 'WEBM' | 'RTMP' | 'MIST_HTML';
|
|
102
|
+
export interface OutputCapabilities {
|
|
103
|
+
supportsSeek: boolean;
|
|
104
|
+
supportsQualitySwitch: boolean;
|
|
105
|
+
maxBitrate?: number;
|
|
106
|
+
hasAudio: boolean;
|
|
107
|
+
hasVideo: boolean;
|
|
108
|
+
codecs?: string[];
|
|
109
|
+
}
|
|
110
|
+
export interface QualityLevel {
|
|
111
|
+
id: string;
|
|
112
|
+
label: string;
|
|
113
|
+
width?: number;
|
|
114
|
+
height?: number;
|
|
115
|
+
bitrate?: number;
|
|
116
|
+
}
|
|
117
|
+
export interface OutputEndpoint {
|
|
118
|
+
protocol: StreamProtocol | string;
|
|
119
|
+
url: string;
|
|
120
|
+
capabilities?: OutputCapabilities;
|
|
121
|
+
}
|
|
122
|
+
export interface EndpointInfo {
|
|
123
|
+
nodeId: string;
|
|
124
|
+
baseUrl?: string;
|
|
125
|
+
protocol: StreamProtocol | string;
|
|
126
|
+
url: string;
|
|
127
|
+
quality?: QualityLevel;
|
|
128
|
+
capabilities?: OutputCapabilities;
|
|
129
|
+
outputs?: Record<string, OutputEndpoint>;
|
|
130
|
+
geoDistance?: number;
|
|
131
|
+
loadScore?: number;
|
|
132
|
+
}
|
|
133
|
+
export interface ContentMetadata {
|
|
134
|
+
title?: string;
|
|
135
|
+
description?: string;
|
|
136
|
+
contentId?: string;
|
|
137
|
+
contentType?: ContentType;
|
|
138
|
+
durationSeconds?: number;
|
|
139
|
+
thumbnailUrl?: string;
|
|
140
|
+
createdAt?: string;
|
|
141
|
+
status?: 'AVAILABLE' | 'PROCESSING' | 'ERROR' | 'OFFLINE';
|
|
142
|
+
viewers?: number;
|
|
143
|
+
isLive?: boolean;
|
|
144
|
+
recordingSizeBytes?: number;
|
|
145
|
+
clipSource?: string;
|
|
146
|
+
/** DVR recording status: 'recording' = in progress (treat as live), 'completed' = finished (treat as VOD) */
|
|
147
|
+
dvrStatus?: 'recording' | 'completed';
|
|
148
|
+
/** Native container format: mp4, m3u8, webm, etc. */
|
|
149
|
+
format?: string;
|
|
150
|
+
}
|
|
151
|
+
export interface ContentEndpoints {
|
|
152
|
+
primary: EndpointInfo;
|
|
153
|
+
fallbacks: EndpointInfo[];
|
|
154
|
+
metadata?: ContentMetadata;
|
|
155
|
+
}
|
|
156
|
+
export type StreamStatus = 'ONLINE' | 'OFFLINE' | 'INITIALIZING' | 'BOOTING' | 'WAITING_FOR_DATA' | 'SHUTTING_DOWN' | 'INVALID' | 'ERROR';
|
|
157
|
+
export interface MistStreamInfo {
|
|
158
|
+
error?: string;
|
|
159
|
+
on_error?: string;
|
|
160
|
+
perc?: number;
|
|
161
|
+
type?: 'live' | 'vod';
|
|
162
|
+
hasVideo?: boolean;
|
|
163
|
+
hasAudio?: boolean;
|
|
164
|
+
unixoffset?: number;
|
|
165
|
+
lastms?: number;
|
|
166
|
+
source?: MistStreamSource[];
|
|
167
|
+
meta?: MistStreamMeta;
|
|
168
|
+
}
|
|
169
|
+
export interface MistStreamMeta {
|
|
170
|
+
tracks?: Record<string, MistTrackInfo>;
|
|
171
|
+
buffer_window?: number;
|
|
172
|
+
duration?: number;
|
|
173
|
+
/** Optional MistServer base URL hint (present in some gateway-merged payloads) */
|
|
174
|
+
mistUrl?: string;
|
|
175
|
+
}
|
|
176
|
+
export interface MistStreamSource {
|
|
177
|
+
url: string;
|
|
178
|
+
type: string;
|
|
179
|
+
priority?: number;
|
|
180
|
+
simul_tracks?: number;
|
|
181
|
+
relurl?: string;
|
|
182
|
+
RTCIceServers?: RTCIceServer[];
|
|
183
|
+
}
|
|
184
|
+
export interface MistTrackInfo {
|
|
185
|
+
type: 'video' | 'audio' | 'meta';
|
|
186
|
+
codec: string;
|
|
187
|
+
width?: number;
|
|
188
|
+
height?: number;
|
|
189
|
+
bps?: number;
|
|
190
|
+
fpks?: number;
|
|
191
|
+
init?: string;
|
|
192
|
+
codecstring?: string;
|
|
193
|
+
firstms?: number;
|
|
194
|
+
lastms?: number;
|
|
195
|
+
lang?: string;
|
|
196
|
+
idx?: number;
|
|
197
|
+
channels?: number;
|
|
198
|
+
rate?: number;
|
|
199
|
+
/** Track payload size in bytes (present on some MistServer builds) */
|
|
200
|
+
size?: number;
|
|
201
|
+
}
|
|
202
|
+
export interface StreamStateOptions {
|
|
203
|
+
mistBaseUrl: string;
|
|
204
|
+
streamName: string;
|
|
205
|
+
pollInterval?: number;
|
|
206
|
+
enabled?: boolean;
|
|
207
|
+
useWebSocket?: boolean;
|
|
208
|
+
}
|
|
209
|
+
export interface StreamState {
|
|
210
|
+
status: StreamStatus;
|
|
211
|
+
isOnline: boolean;
|
|
212
|
+
message: string;
|
|
213
|
+
percentage?: number;
|
|
214
|
+
lastUpdate: number;
|
|
215
|
+
streamInfo?: MistStreamInfo;
|
|
216
|
+
error?: string;
|
|
217
|
+
}
|
|
218
|
+
export interface PlaybackQuality {
|
|
219
|
+
score: number;
|
|
220
|
+
bitrate: number;
|
|
221
|
+
bufferedAhead: number;
|
|
222
|
+
stallCount: number;
|
|
223
|
+
frameDropRate: number;
|
|
224
|
+
latency: number;
|
|
225
|
+
timestamp: number;
|
|
226
|
+
}
|
|
227
|
+
export interface QualityThresholds {
|
|
228
|
+
minScore: number;
|
|
229
|
+
maxStalls: number;
|
|
230
|
+
minBuffer: number;
|
|
231
|
+
}
|
|
232
|
+
export type PlaybackThresholds = QualityThresholds;
|
|
233
|
+
export interface PlaybackQualityOptions {
|
|
234
|
+
videoElement: HTMLVideoElement | null;
|
|
235
|
+
enabled?: boolean;
|
|
236
|
+
sampleInterval?: number;
|
|
237
|
+
thresholds?: Partial<QualityThresholds>;
|
|
238
|
+
onQualityDegraded?: (quality: PlaybackQuality) => void;
|
|
239
|
+
}
|
|
240
|
+
export type MetaTrackEventType = 'subtitle' | 'score' | 'event' | 'chapter' | 'unknown';
|
|
241
|
+
export interface MetaTrackEvent {
|
|
242
|
+
type: MetaTrackEventType;
|
|
243
|
+
timestamp: number;
|
|
244
|
+
trackId: string;
|
|
245
|
+
data: unknown;
|
|
246
|
+
}
|
|
247
|
+
export interface SubtitleCue {
|
|
248
|
+
id: string;
|
|
249
|
+
startTime: number;
|
|
250
|
+
endTime: number;
|
|
251
|
+
text: string;
|
|
252
|
+
lang?: string;
|
|
253
|
+
}
|
|
254
|
+
export interface ScoreUpdate {
|
|
255
|
+
key: string;
|
|
256
|
+
value: number | string;
|
|
257
|
+
team?: string;
|
|
258
|
+
}
|
|
259
|
+
export interface TimedEvent {
|
|
260
|
+
id: string;
|
|
261
|
+
name: string;
|
|
262
|
+
description?: string;
|
|
263
|
+
}
|
|
264
|
+
export interface ChapterMarker {
|
|
265
|
+
id: string;
|
|
266
|
+
title: string;
|
|
267
|
+
startTime: number;
|
|
268
|
+
endTime?: number;
|
|
269
|
+
thumbnailUrl?: string;
|
|
270
|
+
}
|
|
271
|
+
export interface MetaTrackOptions {
|
|
272
|
+
mistBaseUrl: string;
|
|
273
|
+
streamName: string;
|
|
274
|
+
subscriptions?: Array<{
|
|
275
|
+
trackId: string;
|
|
276
|
+
callback: (event: MetaTrackEvent) => void;
|
|
277
|
+
}>;
|
|
278
|
+
enabled?: boolean;
|
|
279
|
+
}
|
|
280
|
+
export interface TelemetryPayload {
|
|
281
|
+
timestamp: number;
|
|
282
|
+
sessionId: string;
|
|
283
|
+
contentId: string;
|
|
284
|
+
contentType: ContentType;
|
|
285
|
+
metrics: {
|
|
286
|
+
currentTime: number;
|
|
287
|
+
duration: number;
|
|
288
|
+
bufferedSeconds: number;
|
|
289
|
+
stallCount: number;
|
|
290
|
+
totalStallMs: number;
|
|
291
|
+
bitrate: number;
|
|
292
|
+
qualityScore: number;
|
|
293
|
+
framesDecoded: number;
|
|
294
|
+
framesDropped: number;
|
|
295
|
+
playerType: string;
|
|
296
|
+
protocol: string;
|
|
297
|
+
resolution?: {
|
|
298
|
+
width: number;
|
|
299
|
+
height: number;
|
|
300
|
+
};
|
|
301
|
+
};
|
|
302
|
+
errors?: Array<{
|
|
303
|
+
code: string;
|
|
304
|
+
message: string;
|
|
305
|
+
timestamp: number;
|
|
306
|
+
}>;
|
|
307
|
+
}
|
|
308
|
+
export interface TelemetryOptions {
|
|
309
|
+
enabled: boolean;
|
|
310
|
+
endpoint: string;
|
|
311
|
+
interval?: number;
|
|
312
|
+
authToken?: string;
|
|
313
|
+
batchSize?: number;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Playback mode affects protocol selection:
|
|
317
|
+
* - 'low-latency': Prefer WebRTC/WHEP for minimal delay (sub-second)
|
|
318
|
+
* - 'quality': Prefer MP4/WS for stable playback, HLS/DASH as fallback
|
|
319
|
+
* - 'vod': VOD/clip content - prefer seekable protocols (HLS/MP4), exclude WHEP
|
|
320
|
+
* - 'auto': Balanced selection (MP4/WS → WHEP → HLS)
|
|
321
|
+
*/
|
|
322
|
+
export type PlaybackMode = 'low-latency' | 'quality' | 'vod' | 'auto';
|
|
323
|
+
/** ABR mode configuration */
|
|
324
|
+
export type ABRMode = 'auto' | 'resize' | 'bitrate' | 'manual';
|
|
325
|
+
/** ABR controller options */
|
|
326
|
+
export interface ABROptions {
|
|
327
|
+
mode: ABRMode;
|
|
328
|
+
maxResolution?: {
|
|
329
|
+
width: number;
|
|
330
|
+
height: number;
|
|
331
|
+
};
|
|
332
|
+
maxBitrate?: number;
|
|
333
|
+
minBufferForUpgrade?: number;
|
|
334
|
+
downgradeThreshold?: number;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Combined metadata from Gateway and MistServer
|
|
338
|
+
* Emitted via onMetadata callback when player resolves content
|
|
339
|
+
*/
|
|
340
|
+
export interface PlayerMetadata {
|
|
341
|
+
title?: string;
|
|
342
|
+
description?: string;
|
|
343
|
+
contentId?: string;
|
|
344
|
+
contentType?: ContentType;
|
|
345
|
+
isLive?: boolean;
|
|
346
|
+
viewers?: number;
|
|
347
|
+
durationSeconds?: number;
|
|
348
|
+
status?: string;
|
|
349
|
+
createdAt?: string;
|
|
350
|
+
nodeId?: string;
|
|
351
|
+
protocol?: string;
|
|
352
|
+
geoDistance?: number;
|
|
353
|
+
tracks?: Array<{
|
|
354
|
+
type: 'video' | 'audio' | 'meta';
|
|
355
|
+
codec?: string;
|
|
356
|
+
width?: number;
|
|
357
|
+
height?: number;
|
|
358
|
+
bitrate?: number;
|
|
359
|
+
fps?: number;
|
|
360
|
+
channels?: number;
|
|
361
|
+
sampleRate?: number;
|
|
362
|
+
}>;
|
|
363
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FrameWorksPlayer.ts
|
|
3
|
+
*
|
|
4
|
+
* Vanilla JavaScript wrapper for PlayerController.
|
|
5
|
+
* Use this class in non-React environments (Svelte, Vue, plain HTML, etc.)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { FrameWorksPlayer } from '@livepeer-frameworks/player/vanilla';
|
|
10
|
+
* import '@livepeer-frameworks/player/player.css';
|
|
11
|
+
*
|
|
12
|
+
* const player = new FrameWorksPlayer('#player', {
|
|
13
|
+
* contentId: 'my-stream',
|
|
14
|
+
* contentType: 'live',
|
|
15
|
+
* gatewayUrl: 'https://gateway.example.com/graphql',
|
|
16
|
+
* onStateChange: (state) => console.log('State:', state),
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Control playback
|
|
20
|
+
* player.play();
|
|
21
|
+
* player.setVolume(0.5);
|
|
22
|
+
*
|
|
23
|
+
* // Clean up
|
|
24
|
+
* player.destroy();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { PlayerControllerEvents } from '../core/PlayerController';
|
|
28
|
+
import type { PlayerState, PlayerStateContext, StreamState, ContentEndpoints, ContentType } from '../types';
|
|
29
|
+
export interface FrameWorksPlayerOptions {
|
|
30
|
+
/** Content identifier (stream name) */
|
|
31
|
+
contentId: string;
|
|
32
|
+
/** Content type */
|
|
33
|
+
contentType: ContentType;
|
|
34
|
+
/** Pre-resolved endpoints (skip gateway) */
|
|
35
|
+
endpoints?: ContentEndpoints;
|
|
36
|
+
/** Gateway URL (required if endpoints not provided) */
|
|
37
|
+
gatewayUrl?: string;
|
|
38
|
+
/** Auth token for private streams */
|
|
39
|
+
authToken?: string;
|
|
40
|
+
/** Playback options */
|
|
41
|
+
autoplay?: boolean;
|
|
42
|
+
muted?: boolean;
|
|
43
|
+
controls?: boolean;
|
|
44
|
+
poster?: string;
|
|
45
|
+
/** Debug logging */
|
|
46
|
+
debug?: boolean;
|
|
47
|
+
/** Called when player state changes */
|
|
48
|
+
onStateChange?: (state: PlayerState, context?: PlayerStateContext) => void;
|
|
49
|
+
/** Called when stream state changes (for live streams) */
|
|
50
|
+
onStreamStateChange?: (state: StreamState) => void;
|
|
51
|
+
/** Called on time update during playback */
|
|
52
|
+
onTimeUpdate?: (currentTime: number, duration: number) => void;
|
|
53
|
+
/** Called on error */
|
|
54
|
+
onError?: (error: string) => void;
|
|
55
|
+
/** Called when player is ready */
|
|
56
|
+
onReady?: (videoElement: HTMLVideoElement) => void;
|
|
57
|
+
}
|
|
58
|
+
interface LegacyConfig {
|
|
59
|
+
contentId: string;
|
|
60
|
+
contentType: ContentType;
|
|
61
|
+
thumbnailUrl?: string | null;
|
|
62
|
+
options?: {
|
|
63
|
+
gatewayUrl?: string;
|
|
64
|
+
autoplay?: boolean;
|
|
65
|
+
muted?: boolean;
|
|
66
|
+
controls?: boolean;
|
|
67
|
+
debug?: boolean;
|
|
68
|
+
authToken?: string;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Vanilla JavaScript player class.
|
|
73
|
+
*
|
|
74
|
+
* This is a thin wrapper around PlayerController that provides a
|
|
75
|
+
* constructor-based API suitable for non-React frameworks.
|
|
76
|
+
*/
|
|
77
|
+
export declare class FrameWorksPlayer {
|
|
78
|
+
private controller;
|
|
79
|
+
private container;
|
|
80
|
+
private cleanupFns;
|
|
81
|
+
private isDestroyed;
|
|
82
|
+
/**
|
|
83
|
+
* Create a new player instance.
|
|
84
|
+
*
|
|
85
|
+
* @param container - DOM element or CSS selector to mount the player
|
|
86
|
+
* @param options - Player options and callbacks
|
|
87
|
+
*/
|
|
88
|
+
constructor(container: HTMLElement | string | null, options: FrameWorksPlayerOptions | LegacyConfig);
|
|
89
|
+
/** Start playback */
|
|
90
|
+
play(): Promise<void>;
|
|
91
|
+
/** Pause playback */
|
|
92
|
+
pause(): void;
|
|
93
|
+
/** Seek to time in seconds */
|
|
94
|
+
seek(time: number): void;
|
|
95
|
+
/** Set volume (0-1) */
|
|
96
|
+
setVolume(volume: number): void;
|
|
97
|
+
/** Set muted state */
|
|
98
|
+
setMuted(muted: boolean): void;
|
|
99
|
+
/** Set playback rate */
|
|
100
|
+
setPlaybackRate(rate: number): void;
|
|
101
|
+
/** Jump to live edge (for live streams) */
|
|
102
|
+
jumpToLive(): void;
|
|
103
|
+
/** Request fullscreen */
|
|
104
|
+
requestFullscreen(): Promise<void>;
|
|
105
|
+
/** Request Picture-in-Picture */
|
|
106
|
+
requestPiP(): Promise<void>;
|
|
107
|
+
/** Get current player state */
|
|
108
|
+
getState(): PlayerState;
|
|
109
|
+
/** Get current stream state (for live streams) */
|
|
110
|
+
getStreamState(): StreamState | null;
|
|
111
|
+
/** Get video element (null if not ready) */
|
|
112
|
+
getVideoElement(): HTMLVideoElement | null;
|
|
113
|
+
/** Check if player is ready */
|
|
114
|
+
isReady(): boolean;
|
|
115
|
+
/** Get current time in seconds */
|
|
116
|
+
getCurrentTime(): number;
|
|
117
|
+
/** Get duration in seconds */
|
|
118
|
+
getDuration(): number;
|
|
119
|
+
/** Check if paused */
|
|
120
|
+
isPaused(): boolean;
|
|
121
|
+
/** Check if muted */
|
|
122
|
+
isMuted(): boolean;
|
|
123
|
+
/** Retry playback after error */
|
|
124
|
+
retry(): Promise<void>;
|
|
125
|
+
/** Get content metadata (title, description, duration, viewers, etc.) */
|
|
126
|
+
getMetadata(): import("..").ContentMetadata | null;
|
|
127
|
+
/** Get playback statistics */
|
|
128
|
+
getStats(): Promise<unknown>;
|
|
129
|
+
/** Get current latency (for live streams) */
|
|
130
|
+
getLatency(): Promise<unknown>;
|
|
131
|
+
/**
|
|
132
|
+
* Subscribe to a player event.
|
|
133
|
+
* @param event - Event name
|
|
134
|
+
* @param listener - Callback function
|
|
135
|
+
* @returns Unsubscribe function
|
|
136
|
+
*/
|
|
137
|
+
on<K extends keyof PlayerControllerEvents>(event: K, listener: (data: PlayerControllerEvents[K]) => void): () => void;
|
|
138
|
+
/** Destroy the player and clean up resources */
|
|
139
|
+
destroy(): void;
|
|
140
|
+
private normalizeOptions;
|
|
141
|
+
private setupCallbacks;
|
|
142
|
+
}
|
|
143
|
+
export default FrameWorksPlayer;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vanilla JS exports for non-React environments.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { FrameWorksPlayer } from '@livepeer-frameworks/player/vanilla';
|
|
7
|
+
* import '@livepeer-frameworks/player/player.css';
|
|
8
|
+
*
|
|
9
|
+
* const player = new FrameWorksPlayer('#player', {
|
|
10
|
+
* contentId: 'my-stream',
|
|
11
|
+
* contentType: 'live',
|
|
12
|
+
* gatewayUrl: 'https://gateway.example.com/graphql',
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export { FrameWorksPlayer, default } from './FrameWorksPlayer';
|
|
17
|
+
export type { FrameWorksPlayerOptions } from './FrameWorksPlayer';
|
|
18
|
+
export type { PlayerControllerEvents } from '../core/PlayerController';
|
|
19
|
+
export type { PlayerState, PlayerStateContext, StreamState, ContentEndpoints } from '../types';
|