@livepeer-frameworks/player-core 0.0.4 → 0.1.1
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/README.md +21 -6
- package/dist/cjs/index.js +792 -146
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +792 -146
- package/dist/esm/index.js.map +1 -1
- package/dist/player.css +185 -373
- package/dist/types/core/GatewayClient.d.ts +3 -4
- package/dist/types/core/InteractionController.d.ts +12 -0
- package/dist/types/core/MetaTrackManager.d.ts +1 -1
- package/dist/types/core/PlayerController.d.ts +18 -2
- package/dist/types/core/PlayerInterface.d.ts +10 -0
- package/dist/types/core/SeekingUtils.d.ts +3 -1
- package/dist/types/core/StreamStateClient.d.ts +1 -1
- package/dist/types/players/HlsJsPlayer.d.ts +8 -0
- package/dist/types/players/MewsWsPlayer/index.d.ts +1 -1
- package/dist/types/players/VideoJsPlayer.d.ts +12 -4
- package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +1 -1
- package/dist/types/players/WebCodecsPlayer/index.d.ts +11 -0
- package/dist/types/players/WebCodecsPlayer/types.d.ts +25 -3
- package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +20 -2
- package/dist/types/types.d.ts +32 -1
- package/dist/types/vanilla/FrameWorksPlayer.d.ts +5 -5
- package/dist/types/vanilla/index.d.ts +3 -3
- package/dist/workers/decoder.worker.js +183 -6
- package/dist/workers/decoder.worker.js.map +1 -1
- package/package.json +1 -1
- package/src/core/ABRController.ts +38 -36
- package/src/core/CodecUtils.ts +50 -47
- package/src/core/Disposable.ts +4 -4
- package/src/core/EventEmitter.ts +1 -1
- package/src/core/GatewayClient.ts +48 -48
- package/src/core/InteractionController.ts +89 -82
- package/src/core/LiveDurationProxy.ts +14 -16
- package/src/core/MetaTrackManager.ts +74 -66
- package/src/core/MistReporter.ts +72 -45
- package/src/core/MistSignaling.ts +59 -56
- package/src/core/PlayerController.ts +724 -375
- package/src/core/PlayerInterface.ts +89 -59
- package/src/core/PlayerManager.ts +118 -123
- package/src/core/PlayerRegistry.ts +59 -42
- package/src/core/QualityMonitor.ts +38 -31
- package/src/core/ScreenWakeLockManager.ts +8 -9
- package/src/core/SeekingUtils.ts +31 -22
- package/src/core/StreamStateClient.ts +75 -69
- package/src/core/SubtitleManager.ts +25 -23
- package/src/core/TelemetryReporter.ts +34 -31
- package/src/core/TimeFormat.ts +13 -17
- package/src/core/TimerManager.ts +25 -9
- package/src/core/UrlUtils.ts +20 -17
- package/src/core/detector.ts +44 -44
- package/src/core/index.ts +57 -48
- package/src/core/scorer.ts +137 -138
- package/src/core/selector.ts +2 -6
- package/src/global.d.ts +1 -1
- package/src/index.ts +46 -35
- package/src/players/DashJsPlayer.ts +175 -114
- package/src/players/HlsJsPlayer.ts +154 -76
- package/src/players/MewsWsPlayer/SourceBufferManager.ts +44 -39
- package/src/players/MewsWsPlayer/WebSocketManager.ts +9 -10
- package/src/players/MewsWsPlayer/index.ts +196 -154
- package/src/players/MewsWsPlayer/types.ts +21 -21
- package/src/players/MistPlayer.ts +46 -27
- package/src/players/MistWebRTCPlayer/index.ts +175 -129
- package/src/players/NativePlayer.ts +203 -143
- package/src/players/VideoJsPlayer.ts +200 -146
- package/src/players/WebCodecsPlayer/JitterBuffer.ts +6 -7
- package/src/players/WebCodecsPlayer/LatencyProfiles.ts +43 -43
- package/src/players/WebCodecsPlayer/RawChunkParser.ts +10 -10
- package/src/players/WebCodecsPlayer/SyncController.ts +46 -55
- package/src/players/WebCodecsPlayer/WebSocketController.ts +67 -69
- package/src/players/WebCodecsPlayer/index.ts +280 -220
- package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +12 -17
- package/src/players/WebCodecsPlayer/types.ts +81 -53
- package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +255 -192
- package/src/players/WebCodecsPlayer/worker/types.ts +33 -29
- package/src/players/index.ts +8 -8
- package/src/styles/animations.css +2 -1
- package/src/styles/player.css +182 -356
- package/src/styles/tailwind.css +473 -159
- package/src/types.ts +75 -33
- package/src/vanilla/FrameWorksPlayer.ts +34 -19
- package/src/vanilla/index.ts +7 -7
|
@@ -8,73 +8,73 @@ export interface MewsMessage {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export interface CodecDataMessage extends MewsMessage {
|
|
11
|
-
type:
|
|
11
|
+
type: "codec_data";
|
|
12
12
|
data: {
|
|
13
13
|
codecs: string[];
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export interface OnTimeMessage extends MewsMessage {
|
|
18
|
-
type:
|
|
18
|
+
type: "on_time";
|
|
19
19
|
data: {
|
|
20
|
-
current: number;
|
|
21
|
-
end?: number;
|
|
22
|
-
begin?: number;
|
|
23
|
-
play_rate_curr?:
|
|
24
|
-
jitter?: number;
|
|
25
|
-
tracks?: string[];
|
|
20
|
+
current: number; // Current playback position (ms)
|
|
21
|
+
end?: number; // End of buffered range (ms)
|
|
22
|
+
begin?: number; // Beginning of buffered range (ms)
|
|
23
|
+
play_rate_curr?: "auto" | number; // Current server playback rate
|
|
24
|
+
jitter?: number; // Server-estimated jitter (ms)
|
|
25
|
+
tracks?: string[]; // Currently active track IDs
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export interface TracksMessage extends MewsMessage {
|
|
30
|
-
type:
|
|
30
|
+
type: "tracks";
|
|
31
31
|
data: {
|
|
32
32
|
codecs: string[];
|
|
33
|
-
current?: number;
|
|
33
|
+
current?: number; // Switch point timestamp (ms)
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export interface OnStopMessage extends MewsMessage {
|
|
38
|
-
type:
|
|
38
|
+
type: "on_stop";
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
export interface SeekAckMessage extends MewsMessage {
|
|
42
|
-
type:
|
|
42
|
+
type: "seek";
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export interface SetSpeedAckMessage extends MewsMessage {
|
|
46
|
-
type:
|
|
46
|
+
type: "set_speed";
|
|
47
47
|
data?: {
|
|
48
|
-
play_rate_curr?:
|
|
48
|
+
play_rate_curr?: "auto" | number;
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export interface PauseMessage extends MewsMessage {
|
|
53
|
-
type:
|
|
53
|
+
type: "pause";
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
export interface MewsCommand {
|
|
57
|
-
type:
|
|
57
|
+
type: "request_codec_data" | "play" | "hold" | "seek" | "set_speed" | "tracks";
|
|
58
58
|
[key: string]: any;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
export interface RequestCodecDataCommand extends MewsCommand {
|
|
62
|
-
type:
|
|
62
|
+
type: "request_codec_data";
|
|
63
63
|
supported_codecs: string[];
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
export interface SeekCommand extends MewsCommand {
|
|
67
|
-
type:
|
|
67
|
+
type: "seek";
|
|
68
68
|
seek_time: number;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
export interface SetSpeedCommand extends MewsCommand {
|
|
72
|
-
type:
|
|
73
|
-
play_rate: number |
|
|
72
|
+
type: "set_speed";
|
|
73
|
+
play_rate: number | "auto";
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
export interface TracksCommand extends MewsCommand {
|
|
77
|
-
type:
|
|
77
|
+
type: "tracks";
|
|
78
78
|
video?: string;
|
|
79
79
|
subtitle?: string; // Track index or 'none'
|
|
80
80
|
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import { BasePlayer } from
|
|
2
|
-
import type {
|
|
1
|
+
import { BasePlayer } from "../core/PlayerInterface";
|
|
2
|
+
import type {
|
|
3
|
+
StreamSource,
|
|
4
|
+
StreamInfo,
|
|
5
|
+
PlayerOptions,
|
|
6
|
+
PlayerCapability,
|
|
7
|
+
} from "../core/PlayerInterface";
|
|
3
8
|
|
|
4
9
|
/**
|
|
5
10
|
* MistPlayerImpl - Legacy fallback player
|
|
@@ -14,7 +19,7 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
14
19
|
shortname: "mist-legacy",
|
|
15
20
|
priority: 99, // Final fallback - lowest priority
|
|
16
21
|
// Single special type - PlayerManager adds this as ONE option
|
|
17
|
-
mimes: ["mist/legacy"]
|
|
22
|
+
mimes: ["mist/legacy"],
|
|
18
23
|
};
|
|
19
24
|
|
|
20
25
|
private container: HTMLElement | null = null;
|
|
@@ -28,31 +33,39 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
28
33
|
return mimetype === "mist/legacy";
|
|
29
34
|
}
|
|
30
35
|
|
|
31
|
-
isBrowserSupported(
|
|
36
|
+
isBrowserSupported(
|
|
37
|
+
mimetype: string,
|
|
38
|
+
_source: StreamSource,
|
|
39
|
+
_streamInfo: StreamInfo
|
|
40
|
+
): boolean | string[] {
|
|
32
41
|
// Only compatible with our special type
|
|
33
42
|
if (mimetype !== "mist/legacy") return false;
|
|
34
|
-
return [
|
|
43
|
+
return ["video", "audio"];
|
|
35
44
|
}
|
|
36
45
|
|
|
37
|
-
async initialize(
|
|
46
|
+
async initialize(
|
|
47
|
+
container: HTMLElement,
|
|
48
|
+
source: StreamSource,
|
|
49
|
+
options: PlayerOptions
|
|
50
|
+
): Promise<HTMLVideoElement> {
|
|
38
51
|
this.destroyed = false;
|
|
39
52
|
this.container = container;
|
|
40
|
-
container.classList.add(
|
|
53
|
+
container.classList.add("fw-player-container");
|
|
41
54
|
|
|
42
55
|
// Generate unique ID for this embed
|
|
43
|
-
const streamName = source.streamName ||
|
|
44
|
-
const uniqueId = `${streamName.replace(/[^a-zA-Z0-9]/g,
|
|
56
|
+
const streamName = source.streamName || "stream";
|
|
57
|
+
const uniqueId = `${streamName.replace(/[^a-zA-Z0-9]/g, "_")}_${Math.random().toString(36).slice(2, 10)}`;
|
|
45
58
|
|
|
46
59
|
// Create the mistvideo div
|
|
47
|
-
this.mistDiv = document.createElement(
|
|
48
|
-
this.mistDiv.className =
|
|
60
|
+
this.mistDiv = document.createElement("div");
|
|
61
|
+
this.mistDiv.className = "mistvideo fw-player-container";
|
|
49
62
|
this.mistDiv.id = uniqueId;
|
|
50
|
-
this.mistDiv.style.width =
|
|
51
|
-
this.mistDiv.style.height =
|
|
52
|
-
this.mistDiv.style.overflow =
|
|
63
|
+
this.mistDiv.style.width = "100%";
|
|
64
|
+
this.mistDiv.style.height = "100%";
|
|
65
|
+
this.mistDiv.style.overflow = "hidden"; // Prevent legacy player overflow
|
|
53
66
|
// Also on container, but restore on destroy (don't clobber consumer styles permanently)
|
|
54
|
-
this.previousContainerOverflow = container.style.overflow ??
|
|
55
|
-
container.style.overflow =
|
|
67
|
+
this.previousContainerOverflow = container.style.overflow ?? "";
|
|
68
|
+
container.style.overflow = "hidden";
|
|
56
69
|
container.appendChild(this.mistDiv);
|
|
57
70
|
|
|
58
71
|
// Derive player.js URL from source URL
|
|
@@ -79,11 +92,16 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
79
92
|
return `${url.protocol}//${url.host}/player.js`;
|
|
80
93
|
} catch {
|
|
81
94
|
// Fallback: relative path
|
|
82
|
-
return
|
|
95
|
+
return "/player.js";
|
|
83
96
|
}
|
|
84
97
|
}
|
|
85
98
|
|
|
86
|
-
private async loadAndPlay(
|
|
99
|
+
private async loadAndPlay(
|
|
100
|
+
streamName: string,
|
|
101
|
+
targetId: string,
|
|
102
|
+
playerJsUrl: string,
|
|
103
|
+
options: PlayerOptions
|
|
104
|
+
): Promise<void> {
|
|
87
105
|
const play = () => {
|
|
88
106
|
if (this.destroyed) return;
|
|
89
107
|
if ((window as any).mistPlay) {
|
|
@@ -94,14 +112,14 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
94
112
|
// MistServer's player.js has its own UI - always enable controls
|
|
95
113
|
controls: true,
|
|
96
114
|
// Use dev skin when devMode is enabled - shows MistServer's source selection UI
|
|
97
|
-
skin: options.devMode ?
|
|
115
|
+
skin: options.devMode ? "dev" : "default",
|
|
98
116
|
// Only pass basic playback options
|
|
99
117
|
...(options.autoplay !== undefined && { autoplay: options.autoplay }),
|
|
100
118
|
...(options.muted !== undefined && { muted: options.muted }),
|
|
101
119
|
...(options.poster && { poster: options.poster }),
|
|
102
120
|
};
|
|
103
121
|
|
|
104
|
-
console.debug(
|
|
122
|
+
console.debug("[Legacy] mistPlay options:", mistOptions);
|
|
105
123
|
(window as any).mistPlay(streamName, mistOptions);
|
|
106
124
|
}
|
|
107
125
|
};
|
|
@@ -109,13 +127,14 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
109
127
|
if (!(window as any).mistplayers) {
|
|
110
128
|
// Load player.js
|
|
111
129
|
await new Promise<void>((resolve, reject) => {
|
|
112
|
-
const script = document.createElement(
|
|
130
|
+
const script = document.createElement("script");
|
|
113
131
|
script.src = playerJsUrl;
|
|
114
132
|
script.onload = () => {
|
|
115
133
|
play();
|
|
116
134
|
resolve();
|
|
117
135
|
};
|
|
118
|
-
script.onerror = () =>
|
|
136
|
+
script.onerror = () =>
|
|
137
|
+
reject(new Error(`Failed to load MistServer player from ${playerJsUrl}`));
|
|
119
138
|
document.head.appendChild(script);
|
|
120
139
|
});
|
|
121
140
|
} else {
|
|
@@ -125,12 +144,12 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
125
144
|
|
|
126
145
|
private findVideoElement(): HTMLVideoElement | null {
|
|
127
146
|
if (!this.mistDiv) return null;
|
|
128
|
-
return this.mistDiv.querySelector(
|
|
147
|
+
return this.mistDiv.querySelector("video");
|
|
129
148
|
}
|
|
130
149
|
|
|
131
150
|
private createProxyVideo(container: HTMLElement): HTMLVideoElement {
|
|
132
|
-
const video = document.createElement(
|
|
133
|
-
video.style.display =
|
|
151
|
+
const video = document.createElement("video");
|
|
152
|
+
video.style.display = "none";
|
|
134
153
|
container.appendChild(video);
|
|
135
154
|
this.proxyVideo = video;
|
|
136
155
|
return video;
|
|
@@ -143,10 +162,10 @@ export class MistPlayerImpl extends BasePlayer {
|
|
|
143
162
|
if (this.mistDiv) {
|
|
144
163
|
try {
|
|
145
164
|
const ref = (this.mistDiv as any).MistVideoObject?.reference;
|
|
146
|
-
if (ref && typeof ref.unload ===
|
|
165
|
+
if (ref && typeof ref.unload === "function") {
|
|
147
166
|
ref.unload();
|
|
148
167
|
}
|
|
149
|
-
} catch
|
|
168
|
+
} catch {
|
|
150
169
|
// Ignore cleanup errors
|
|
151
170
|
}
|
|
152
171
|
try {
|