@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.
Files changed (82) hide show
  1. package/README.md +21 -6
  2. package/dist/cjs/index.js +792 -146
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/esm/index.js +792 -146
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/player.css +185 -373
  7. package/dist/types/core/GatewayClient.d.ts +3 -4
  8. package/dist/types/core/InteractionController.d.ts +12 -0
  9. package/dist/types/core/MetaTrackManager.d.ts +1 -1
  10. package/dist/types/core/PlayerController.d.ts +18 -2
  11. package/dist/types/core/PlayerInterface.d.ts +10 -0
  12. package/dist/types/core/SeekingUtils.d.ts +3 -1
  13. package/dist/types/core/StreamStateClient.d.ts +1 -1
  14. package/dist/types/players/HlsJsPlayer.d.ts +8 -0
  15. package/dist/types/players/MewsWsPlayer/index.d.ts +1 -1
  16. package/dist/types/players/VideoJsPlayer.d.ts +12 -4
  17. package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +1 -1
  18. package/dist/types/players/WebCodecsPlayer/index.d.ts +11 -0
  19. package/dist/types/players/WebCodecsPlayer/types.d.ts +25 -3
  20. package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +20 -2
  21. package/dist/types/types.d.ts +32 -1
  22. package/dist/types/vanilla/FrameWorksPlayer.d.ts +5 -5
  23. package/dist/types/vanilla/index.d.ts +3 -3
  24. package/dist/workers/decoder.worker.js +183 -6
  25. package/dist/workers/decoder.worker.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/core/ABRController.ts +38 -36
  28. package/src/core/CodecUtils.ts +50 -47
  29. package/src/core/Disposable.ts +4 -4
  30. package/src/core/EventEmitter.ts +1 -1
  31. package/src/core/GatewayClient.ts +48 -48
  32. package/src/core/InteractionController.ts +89 -82
  33. package/src/core/LiveDurationProxy.ts +14 -16
  34. package/src/core/MetaTrackManager.ts +74 -66
  35. package/src/core/MistReporter.ts +72 -45
  36. package/src/core/MistSignaling.ts +59 -56
  37. package/src/core/PlayerController.ts +724 -375
  38. package/src/core/PlayerInterface.ts +89 -59
  39. package/src/core/PlayerManager.ts +118 -123
  40. package/src/core/PlayerRegistry.ts +59 -42
  41. package/src/core/QualityMonitor.ts +38 -31
  42. package/src/core/ScreenWakeLockManager.ts +8 -9
  43. package/src/core/SeekingUtils.ts +31 -22
  44. package/src/core/StreamStateClient.ts +75 -69
  45. package/src/core/SubtitleManager.ts +25 -23
  46. package/src/core/TelemetryReporter.ts +34 -31
  47. package/src/core/TimeFormat.ts +13 -17
  48. package/src/core/TimerManager.ts +25 -9
  49. package/src/core/UrlUtils.ts +20 -17
  50. package/src/core/detector.ts +44 -44
  51. package/src/core/index.ts +57 -48
  52. package/src/core/scorer.ts +137 -138
  53. package/src/core/selector.ts +2 -6
  54. package/src/global.d.ts +1 -1
  55. package/src/index.ts +46 -35
  56. package/src/players/DashJsPlayer.ts +175 -114
  57. package/src/players/HlsJsPlayer.ts +154 -76
  58. package/src/players/MewsWsPlayer/SourceBufferManager.ts +44 -39
  59. package/src/players/MewsWsPlayer/WebSocketManager.ts +9 -10
  60. package/src/players/MewsWsPlayer/index.ts +196 -154
  61. package/src/players/MewsWsPlayer/types.ts +21 -21
  62. package/src/players/MistPlayer.ts +46 -27
  63. package/src/players/MistWebRTCPlayer/index.ts +175 -129
  64. package/src/players/NativePlayer.ts +203 -143
  65. package/src/players/VideoJsPlayer.ts +200 -146
  66. package/src/players/WebCodecsPlayer/JitterBuffer.ts +6 -7
  67. package/src/players/WebCodecsPlayer/LatencyProfiles.ts +43 -43
  68. package/src/players/WebCodecsPlayer/RawChunkParser.ts +10 -10
  69. package/src/players/WebCodecsPlayer/SyncController.ts +46 -55
  70. package/src/players/WebCodecsPlayer/WebSocketController.ts +67 -69
  71. package/src/players/WebCodecsPlayer/index.ts +280 -220
  72. package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +12 -17
  73. package/src/players/WebCodecsPlayer/types.ts +81 -53
  74. package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +255 -192
  75. package/src/players/WebCodecsPlayer/worker/types.ts +33 -29
  76. package/src/players/index.ts +8 -8
  77. package/src/styles/animations.css +2 -1
  78. package/src/styles/player.css +182 -356
  79. package/src/styles/tailwind.css +473 -159
  80. package/src/types.ts +75 -33
  81. package/src/vanilla/FrameWorksPlayer.ts +34 -19
  82. 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: 'codec_data';
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: 'on_time';
18
+ type: "on_time";
19
19
  data: {
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
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: 'tracks';
30
+ type: "tracks";
31
31
  data: {
32
32
  codecs: string[];
33
- current?: number; // Switch point timestamp (ms)
33
+ current?: number; // Switch point timestamp (ms)
34
34
  };
35
35
  }
36
36
 
37
37
  export interface OnStopMessage extends MewsMessage {
38
- type: 'on_stop';
38
+ type: "on_stop";
39
39
  }
40
40
 
41
41
  export interface SeekAckMessage extends MewsMessage {
42
- type: 'seek';
42
+ type: "seek";
43
43
  }
44
44
 
45
45
  export interface SetSpeedAckMessage extends MewsMessage {
46
- type: 'set_speed';
46
+ type: "set_speed";
47
47
  data?: {
48
- play_rate_curr?: 'auto' | number;
48
+ play_rate_curr?: "auto" | number;
49
49
  };
50
50
  }
51
51
 
52
52
  export interface PauseMessage extends MewsMessage {
53
- type: 'pause';
53
+ type: "pause";
54
54
  }
55
55
 
56
56
  export interface MewsCommand {
57
- type: 'request_codec_data' | 'play' | 'hold' | 'seek' | 'set_speed' | 'tracks';
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: 'request_codec_data';
62
+ type: "request_codec_data";
63
63
  supported_codecs: string[];
64
64
  }
65
65
 
66
66
  export interface SeekCommand extends MewsCommand {
67
- type: 'seek';
67
+ type: "seek";
68
68
  seek_time: number;
69
69
  }
70
70
 
71
71
  export interface SetSpeedCommand extends MewsCommand {
72
- type: 'set_speed';
73
- play_rate: number | 'auto';
72
+ type: "set_speed";
73
+ play_rate: number | "auto";
74
74
  }
75
75
 
76
76
  export interface TracksCommand extends MewsCommand {
77
- type: 'tracks';
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 '../core/PlayerInterface';
2
- import type { StreamSource, StreamInfo, PlayerOptions, PlayerCapability } from '../core/PlayerInterface';
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(mimetype: string, _source: StreamSource, _streamInfo: StreamInfo): boolean | string[] {
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 ['video', 'audio'];
43
+ return ["video", "audio"];
35
44
  }
36
45
 
37
- async initialize(container: HTMLElement, source: StreamSource, options: PlayerOptions): Promise<HTMLVideoElement> {
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('fw-player-container');
53
+ container.classList.add("fw-player-container");
41
54
 
42
55
  // Generate unique ID for this embed
43
- const streamName = source.streamName || 'stream';
44
- const uniqueId = `${streamName.replace(/[^a-zA-Z0-9]/g, '_')}_${Math.random().toString(36).slice(2, 10)}`;
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('div');
48
- this.mistDiv.className = 'mistvideo fw-player-container';
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 = '100%';
51
- this.mistDiv.style.height = '100%';
52
- this.mistDiv.style.overflow = 'hidden'; // Prevent legacy player 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 = 'hidden';
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 '/player.js';
95
+ return "/player.js";
83
96
  }
84
97
  }
85
98
 
86
- private async loadAndPlay(streamName: string, targetId: string, playerJsUrl: string, options: PlayerOptions): Promise<void> {
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 ? 'dev' : 'default',
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('[Legacy] mistPlay options:', mistOptions);
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('script');
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 = () => reject(new Error(`Failed to load MistServer player from ${playerJsUrl}`));
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('video');
147
+ return this.mistDiv.querySelector("video");
129
148
  }
130
149
 
131
150
  private createProxyVideo(container: HTMLElement): HTMLVideoElement {
132
- const video = document.createElement('video');
133
- video.style.display = 'none';
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 === 'function') {
165
+ if (ref && typeof ref.unload === "function") {
147
166
  ref.unload();
148
167
  }
149
- } catch (e) {
168
+ } catch {
150
169
  // Ignore cleanup errors
151
170
  }
152
171
  try {