eb-player 2.0.19 → 2.0.21
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/build/eb-player.css +9 -0
- package/dist/build/ebplayer.bundle.js +604 -132
- package/dist/build/ebplayer.bundle.js.map +1 -1
- package/dist/build/types/integrations/ads-manager.d.ts.map +1 -1
- package/dist/build/types/skin/skin-root.d.ts +8 -0
- package/dist/build/types/skin/skin-root.d.ts.map +1 -1
- package/dist/build/types/src/core/command-handler.d.ts +50 -0
- package/dist/build/types/src/core/command-handler.d.ts.map +1 -0
- package/dist/build/types/src/core/config.d.ts +187 -0
- package/dist/build/types/src/core/config.d.ts.map +1 -0
- package/dist/build/types/src/core/engine-state-sync.d.ts +38 -0
- package/dist/build/types/src/core/engine-state-sync.d.ts.map +1 -0
- package/dist/build/types/src/core/event-bus.d.ts +91 -0
- package/dist/build/types/src/core/event-bus.d.ts.map +1 -0
- package/dist/build/types/src/core/fsm.d.ts +30 -0
- package/dist/build/types/src/core/fsm.d.ts.map +1 -0
- package/dist/build/types/src/core/i18n.d.ts +51 -0
- package/dist/build/types/src/core/i18n.d.ts.map +1 -0
- package/dist/build/types/src/core/index.d.ts +23 -0
- package/dist/build/types/src/core/index.d.ts.map +1 -0
- package/dist/build/types/src/core/lifecycle.d.ts +96 -0
- package/dist/build/types/src/core/lifecycle.d.ts.map +1 -0
- package/dist/build/types/src/core/player-state.d.ts +15 -0
- package/dist/build/types/src/core/player-state.d.ts.map +1 -0
- package/dist/build/types/src/core/types.d.ts +85 -0
- package/dist/build/types/src/core/types.d.ts.map +1 -0
- package/dist/build/types/src/eb-player-standalone.d.ts +23 -0
- package/dist/build/types/src/eb-player-standalone.d.ts.map +1 -0
- package/dist/build/types/src/eb-player.d.ts +56 -0
- package/dist/build/types/src/eb-player.d.ts.map +1 -0
- package/dist/build/types/src/engines/abr/dash.d.ts +56 -0
- package/dist/build/types/src/engines/abr/dash.d.ts.map +1 -0
- package/dist/build/types/src/engines/abr/hls.d.ts +105 -0
- package/dist/build/types/src/engines/abr/hls.d.ts.map +1 -0
- package/dist/build/types/src/engines/base-engine.d.ts +72 -0
- package/dist/build/types/src/engines/base-engine.d.ts.map +1 -0
- package/dist/build/types/src/engines/cdn-loader.d.ts +20 -0
- package/dist/build/types/src/engines/cdn-loader.d.ts.map +1 -0
- package/dist/build/types/src/engines/cdn-token-manager.d.ts +137 -0
- package/dist/build/types/src/engines/cdn-token-manager.d.ts.map +1 -0
- package/dist/build/types/src/engines/dash.d.ts +95 -0
- package/dist/build/types/src/engines/dash.d.ts.map +1 -0
- package/dist/build/types/src/engines/drm.d.ts +54 -0
- package/dist/build/types/src/engines/drm.d.ts.map +1 -0
- package/dist/build/types/src/engines/hls-discontinuity-patch.d.ts +43 -0
- package/dist/build/types/src/engines/hls-discontinuity-patch.d.ts.map +1 -0
- package/dist/build/types/src/engines/hls.d.ts +53 -0
- package/dist/build/types/src/engines/hls.d.ts.map +1 -0
- package/dist/build/types/src/engines/index.d.ts +26 -0
- package/dist/build/types/src/engines/index.d.ts.map +1 -0
- package/dist/build/types/src/engines/ios/hls.d.ts +20 -0
- package/dist/build/types/src/engines/ios/hls.d.ts.map +1 -0
- package/dist/build/types/src/engines/poster/hls.d.ts +35 -0
- package/dist/build/types/src/engines/poster/hls.d.ts.map +1 -0
- package/dist/build/types/src/engines/retry/dash.d.ts +51 -0
- package/dist/build/types/src/engines/retry/dash.d.ts.map +1 -0
- package/dist/build/types/src/engines/retry/hls.d.ts +47 -0
- package/dist/build/types/src/engines/retry/hls.d.ts.map +1 -0
- package/dist/build/types/src/engines/snapshot/dash.d.ts +55 -0
- package/dist/build/types/src/engines/snapshot/dash.d.ts.map +1 -0
- package/dist/build/types/src/engines/snapshot/hls.d.ts +118 -0
- package/dist/build/types/src/engines/snapshot/hls.d.ts.map +1 -0
- package/dist/build/types/src/engines/stall-watchdog.d.ts +41 -0
- package/dist/build/types/src/engines/stall-watchdog.d.ts.map +1 -0
- package/dist/build/types/src/integrations/ads-manager.d.ts +79 -0
- package/dist/build/types/src/integrations/ads-manager.d.ts.map +1 -0
- package/dist/build/types/src/integrations/chromecast-manager.d.ts +50 -0
- package/dist/build/types/src/integrations/chromecast-manager.d.ts.map +1 -0
- package/dist/build/types/src/integrations/epg-manager.d.ts +22 -0
- package/dist/build/types/src/integrations/epg-manager.d.ts.map +1 -0
- package/dist/build/types/src/integrations/index.d.ts +7 -0
- package/dist/build/types/src/integrations/index.d.ts.map +1 -0
- package/dist/build/types/src/integrations/intro-stream-manager.d.ts +62 -0
- package/dist/build/types/src/integrations/intro-stream-manager.d.ts.map +1 -0
- package/dist/build/types/src/integrations/p2p-manager.d.ts +42 -0
- package/dist/build/types/src/integrations/p2p-manager.d.ts.map +1 -0
- package/dist/build/types/src/integrations/playlist-manager.d.ts +21 -0
- package/dist/build/types/src/integrations/playlist-manager.d.ts.map +1 -0
- package/dist/build/types/src/skin/bars/bottom-bar.d.ts +16 -0
- package/dist/build/types/src/skin/bars/bottom-bar.d.ts.map +1 -0
- package/dist/build/types/src/skin/bars/middle-bar.d.ts +16 -0
- package/dist/build/types/src/skin/bars/middle-bar.d.ts.map +1 -0
- package/dist/build/types/src/skin/bars/top-bar.d.ts +15 -0
- package/dist/build/types/src/skin/bars/top-bar.d.ts.map +1 -0
- package/dist/build/types/src/skin/base-component.d.ts +69 -0
- package/dist/build/types/src/skin/base-component.d.ts.map +1 -0
- package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts +15 -0
- package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts.map +1 -0
- package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts +16 -0
- package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts.map +1 -0
- package/dist/build/types/src/skin/component-registry.d.ts +16 -0
- package/dist/build/types/src/skin/component-registry.d.ts.map +1 -0
- package/dist/build/types/src/skin/controllers/auto-hide.d.ts +27 -0
- package/dist/build/types/src/skin/controllers/auto-hide.d.ts.map +1 -0
- package/dist/build/types/src/skin/controllers/keyboard.d.ts +29 -0
- package/dist/build/types/src/skin/controllers/keyboard.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/cast-button.d.ts +15 -0
- package/dist/build/types/src/skin/controls/cast-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/channel-name.d.ts +16 -0
- package/dist/build/types/src/skin/controls/channel-name.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/forward-button.d.ts +15 -0
- package/dist/build/types/src/skin/controls/forward-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/fullscreen-button.d.ts +30 -0
- package/dist/build/types/src/skin/controls/fullscreen-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/info-button.d.ts +10 -0
- package/dist/build/types/src/skin/controls/info-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/live-sync-button.d.ts +20 -0
- package/dist/build/types/src/skin/controls/live-sync-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/pip-button.d.ts +21 -0
- package/dist/build/types/src/skin/controls/pip-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/play-pause-button.d.ts +14 -0
- package/dist/build/types/src/skin/controls/play-pause-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/rewind-button.d.ts +15 -0
- package/dist/build/types/src/skin/controls/rewind-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/seekbar.d.ts +48 -0
- package/dist/build/types/src/skin/controls/seekbar.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/settings-panel.d.ts +53 -0
- package/dist/build/types/src/skin/controls/settings-panel.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/share-button.d.ts +11 -0
- package/dist/build/types/src/skin/controls/share-button.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/time-display.d.ts +19 -0
- package/dist/build/types/src/skin/controls/time-display.d.ts.map +1 -0
- package/dist/build/types/src/skin/controls/volume-control.d.ts +21 -0
- package/dist/build/types/src/skin/controls/volume-control.d.ts.map +1 -0
- package/dist/build/types/src/skin/icons/icons-modern.d.ts +10 -0
- package/dist/build/types/src/skin/icons/icons-modern.d.ts.map +1 -0
- package/dist/build/types/src/skin/icons/icons.d.ts +10 -0
- package/dist/build/types/src/skin/icons/icons.d.ts.map +1 -0
- package/dist/build/types/src/skin/icons/sprite.d.ts +39 -0
- package/dist/build/types/src/skin/icons/sprite.d.ts.map +1 -0
- package/dist/build/types/src/skin/index.d.ts +24 -0
- package/dist/build/types/src/skin/index.d.ts.map +1 -0
- package/dist/build/types/src/skin/overlays/error-message.d.ts +14 -0
- package/dist/build/types/src/skin/overlays/error-message.d.ts.map +1 -0
- package/dist/build/types/src/skin/overlays/info-overlay.d.ts +15 -0
- package/dist/build/types/src/skin/overlays/info-overlay.d.ts.map +1 -0
- package/dist/build/types/src/skin/overlays/loading-spinner.d.ts +17 -0
- package/dist/build/types/src/skin/overlays/loading-spinner.d.ts.map +1 -0
- package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts +39 -0
- package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts.map +1 -0
- package/dist/build/types/src/skin/overlays/socials-overlay.d.ts +17 -0
- package/dist/build/types/src/skin/overlays/socials-overlay.d.ts.map +1 -0
- package/dist/build/types/src/skin/overlays/toast-notification.d.ts +18 -0
- package/dist/build/types/src/skin/overlays/toast-notification.d.ts.map +1 -0
- package/dist/build/types/src/skin/skin-root.d.ts +88 -0
- package/dist/build/types/src/skin/skin-root.d.ts.map +1 -0
- package/dist/build/types/src/utils/chapters.d.ts +16 -0
- package/dist/build/types/src/utils/chapters.d.ts.map +1 -0
- package/dist/build/types/src/utils/format-duration.d.ts +9 -0
- package/dist/build/types/src/utils/format-duration.d.ts.map +1 -0
- package/dist/build/types/src/utils/format-wall-clock.d.ts +6 -0
- package/dist/build/types/src/utils/format-wall-clock.d.ts.map +1 -0
- package/dist/build/types/src/utils/settings-helpers.d.ts +41 -0
- package/dist/build/types/src/utils/settings-helpers.d.ts.map +1 -0
- package/dist/eb-player.css +9 -0
- package/package.json +15 -15
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StateMap, PlayerState } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Proxy-based reactive PlayerState instance.
|
|
4
|
+
*
|
|
5
|
+
* The Proxy set trap enforces three rules:
|
|
6
|
+
* 1. Non-plain objects (class instances) are rejected with a TypeError
|
|
7
|
+
* 2. `playbackState` assignments are validated via the FSM transition guard
|
|
8
|
+
* 3. Assigning the same value is a no-op (no subscriber notification)
|
|
9
|
+
*
|
|
10
|
+
* Subscribers are registered via `state.on('propertyName', callback, { signal })`.
|
|
11
|
+
* Pass an AbortController signal to clean up subscriptions automatically.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createPlayerState(initial?: Partial<StateMap>): PlayerState;
|
|
14
|
+
export type { PlayerState };
|
|
15
|
+
//# sourceMappingURL=player-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-state.d.ts","sourceRoot":"","sources":["../../../../../src/core/player-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAY,WAAW,EAAE,MAAM,SAAS,CAAA;AAqG9D;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,WAAW,CAyD1E;AAED,YAAY,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { PlaybackState } from './fsm';
|
|
2
|
+
/**
|
|
3
|
+
* A single EPG (Electronic Program Guide) entry.
|
|
4
|
+
*/
|
|
5
|
+
export interface EpgProgram {
|
|
6
|
+
title: string;
|
|
7
|
+
start: number;
|
|
8
|
+
end: number;
|
|
9
|
+
lang: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A chapter marker within the video timeline.
|
|
13
|
+
*/
|
|
14
|
+
export interface ChapterMark {
|
|
15
|
+
title: string;
|
|
16
|
+
startTime: number;
|
|
17
|
+
endTime: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A single item in a playlist.
|
|
21
|
+
*/
|
|
22
|
+
export interface PlaylistItem {
|
|
23
|
+
src: string;
|
|
24
|
+
title: string;
|
|
25
|
+
image: string;
|
|
26
|
+
duration: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The complete map of all reactive state properties in the player.
|
|
30
|
+
* Used by PlayerState (Proxy-based reactive store).
|
|
31
|
+
*/
|
|
32
|
+
export interface StateMap {
|
|
33
|
+
playbackState: PlaybackState;
|
|
34
|
+
volume: number;
|
|
35
|
+
currentTime: number;
|
|
36
|
+
duration: number;
|
|
37
|
+
muted: boolean;
|
|
38
|
+
bufferedEnd: number;
|
|
39
|
+
isLive: boolean;
|
|
40
|
+
qualityLevels: unknown[];
|
|
41
|
+
currentQuality: number;
|
|
42
|
+
audioTracks: unknown[];
|
|
43
|
+
currentAudioTrack: number;
|
|
44
|
+
subtitleTracks: unknown[];
|
|
45
|
+
currentSubtitleTrack: number;
|
|
46
|
+
playbackRate: number;
|
|
47
|
+
error: string | null;
|
|
48
|
+
src: string;
|
|
49
|
+
isFullscreen: boolean;
|
|
50
|
+
isPip: boolean;
|
|
51
|
+
isCasting: boolean;
|
|
52
|
+
controlsVisible: boolean;
|
|
53
|
+
settingsOpen: boolean;
|
|
54
|
+
socialsOpen: boolean;
|
|
55
|
+
infoOpen: boolean;
|
|
56
|
+
adPlaying: boolean;
|
|
57
|
+
introStreamPlaying: boolean;
|
|
58
|
+
castAvailable: boolean;
|
|
59
|
+
isRtl: boolean;
|
|
60
|
+
isRadio: boolean;
|
|
61
|
+
isIOS: boolean;
|
|
62
|
+
isSyncWithLive: boolean;
|
|
63
|
+
epgPrograms: EpgProgram[];
|
|
64
|
+
epgFetchedAt: number;
|
|
65
|
+
chapters: ChapterMark[];
|
|
66
|
+
playlist: PlaylistItem[];
|
|
67
|
+
currentEpisode: number;
|
|
68
|
+
reconnecting: boolean;
|
|
69
|
+
toast: string | null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Per-property subscriber callback type.
|
|
73
|
+
* Receives the new value and the previous value.
|
|
74
|
+
*/
|
|
75
|
+
export type Listener<T> = (value: T, prev: T) => void;
|
|
76
|
+
/**
|
|
77
|
+
* The public interface for the player state object.
|
|
78
|
+
* Combines all state properties with the subscription method.
|
|
79
|
+
*/
|
|
80
|
+
export type PlayerState = StateMap & {
|
|
81
|
+
on: <K extends keyof StateMap>(key: K, listener: Listener<StateMap[K]>, options?: {
|
|
82
|
+
signal?: AbortSignal;
|
|
83
|
+
}) => void;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IAEvB,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,EAAE,OAAO,EAAE,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,OAAO,EAAE,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,OAAO,EAAE,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,OAAO,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAGlB,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,kBAAkB,EAAE,OAAO,CAAA;IAC3B,aAAa,EAAE,OAAO,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,OAAO,CAAA;IACvB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IAGtB,YAAY,EAAE,OAAO,CAAA;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAErD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG;IACnC,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC3B,GAAG,EAAE,CAAC,EACN,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAC/B,IAAI,CAAA;CACV,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone entry point — used for the generated player bundle (not the npm UMD build).
|
|
3
|
+
*
|
|
4
|
+
* This file is resolved by Rollup with @rollup/plugin-virtual injecting the brand config
|
|
5
|
+
* from 'virtual:brand-config' at build time.
|
|
6
|
+
*
|
|
7
|
+
* The exported start() wraps eb-player's start() to merge the brand config as a base,
|
|
8
|
+
* so consumers calling window.EBPlayer.start({src: '...'}) inherit brand settings
|
|
9
|
+
* (skin, colors, tokens, etc.) without having to repeat them.
|
|
10
|
+
*
|
|
11
|
+
* Import chain:
|
|
12
|
+
* eb-player-standalone.ts → eb-player.ts (facade) + virtual:brand-config (brand config)
|
|
13
|
+
*/
|
|
14
|
+
export { stop, destroy } from './eb-player';
|
|
15
|
+
import type { PlayerConfig } from './core/config';
|
|
16
|
+
import type { PlayerReference } from './eb-player';
|
|
17
|
+
/**
|
|
18
|
+
* Start the player with brand config as the base layer.
|
|
19
|
+
* Consumer's runtimeConfig overrides brand values, which override DEFAULT_CONFIG.
|
|
20
|
+
* Merge order: DEFAULT_CONFIG → brandConfig → runtimeConfig
|
|
21
|
+
*/
|
|
22
|
+
export declare function start(runtimeConfig?: Partial<PlayerConfig>): PlayerReference;
|
|
23
|
+
//# sourceMappingURL=eb-player-standalone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eb-player-standalone.d.ts","sourceRoot":"","sources":["../../../../src/eb-player-standalone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAQlD;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,eAAe,CAG5E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EBPlayer facade — consumer-facing API layer.
|
|
3
|
+
*
|
|
4
|
+
* Provides the window.EBPlayer interface:
|
|
5
|
+
* - window.EBPlayer.start(config) — synchronously returns a PlayerReference
|
|
6
|
+
* - window.EBPlayer.stop() — detaches all active engines (skins stay mounted)
|
|
7
|
+
* - window.EBPlayer.destroy() — disposes all controllers (tears down everything)
|
|
8
|
+
*
|
|
9
|
+
* Supports multiple simultaneous player instances on the same page.
|
|
10
|
+
* Each instance is keyed by its container element:
|
|
11
|
+
* - Calling start() with the SAME container disposes the old instance first (backward compat).
|
|
12
|
+
* - Calling start() with a DIFFERENT container creates an independent player.
|
|
13
|
+
*
|
|
14
|
+
* Per-instance cleanup is available via PlayerReference.destroy().
|
|
15
|
+
* Global stop()/destroy() operate on all instances at once.
|
|
16
|
+
*/
|
|
17
|
+
import type { PlayerState } from './core/types';
|
|
18
|
+
import type { PlayerConfig } from './core/config';
|
|
19
|
+
/**
|
|
20
|
+
* The PlayerReference returned by start().
|
|
21
|
+
* Gives consumers direct control over the active stream.
|
|
22
|
+
*/
|
|
23
|
+
export interface PlayerReference {
|
|
24
|
+
/** Open a stream URL. Detects protocol from extension (.m3u8 → HLS, .mpd → DASH). */
|
|
25
|
+
open(src: string): void;
|
|
26
|
+
/** Close the active stream (detaches engine; skin remains mounted). */
|
|
27
|
+
close(): void;
|
|
28
|
+
/** Destroy this player instance completely (tears down skin, events, and all resources). */
|
|
29
|
+
destroy(): void;
|
|
30
|
+
/** Current player state (read-only reference to the reactive state store). */
|
|
31
|
+
readonly state: PlayerState;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start the player with the given config.
|
|
35
|
+
*
|
|
36
|
+
* If a player is already mounted on the same container element, it is disposed
|
|
37
|
+
* before the new one is created (backward-compatible single-instance behavior).
|
|
38
|
+
* If the container is different, the new player coexists alongside existing ones
|
|
39
|
+
* (multi-instance support).
|
|
40
|
+
*
|
|
41
|
+
* Returns a PlayerReference synchronously — never returns a Promise.
|
|
42
|
+
*/
|
|
43
|
+
export declare function start(runtimeConfig: Partial<PlayerConfig>): PlayerReference;
|
|
44
|
+
/**
|
|
45
|
+
* Stop all active streams.
|
|
46
|
+
* Detaches engines without disposing controllers (skins stay mounted).
|
|
47
|
+
* For single-instance usage this behaves identically to the old global stop().
|
|
48
|
+
*/
|
|
49
|
+
export declare function stop(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Destroy all player instances completely.
|
|
52
|
+
* Disposes every controller (tears down skin, events, and all resources).
|
|
53
|
+
* For single-instance usage this behaves identically to the old global destroy().
|
|
54
|
+
*/
|
|
55
|
+
export declare function destroy(): void;
|
|
56
|
+
//# sourceMappingURL=eb-player.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eb-player.d.ts","sourceRoot":"","sources":["../../../../src/eb-player.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qFAAqF;IACrF,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,uEAAuE;IACvE,KAAK,IAAI,IAAI,CAAA;IACb,4FAA4F;IAC5F,OAAO,IAAI,IAAI,CAAA;IACf,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAC5B;AAuHD;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,eAAe,CAqf3E;AAED;;;;GAIG;AACH,wBAAgB,IAAI,IAAI,IAAI,CAO3B;AAED;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAK9B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DASH Custom ABR Rule
|
|
3
|
+
*
|
|
4
|
+
* Ported from component/engines/abr/dash.js
|
|
5
|
+
*
|
|
6
|
+
* Implements a buffer-and-throughput aware adaptive bitrate rule for dash.js.
|
|
7
|
+
* Applied via driver.addABRCustomRule('qualitySwitchRules', 'CustomAbrRule', factory).
|
|
8
|
+
*/
|
|
9
|
+
interface SwitchRequestInstance {
|
|
10
|
+
quality: number;
|
|
11
|
+
reason: string;
|
|
12
|
+
priority: number;
|
|
13
|
+
}
|
|
14
|
+
interface SwitchRequestFactory {
|
|
15
|
+
(context: unknown): {
|
|
16
|
+
create: () => SwitchRequestInstance;
|
|
17
|
+
};
|
|
18
|
+
PRIORITY: {
|
|
19
|
+
STRONG: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
interface SingletonFactory<T> {
|
|
23
|
+
(context: unknown): {
|
|
24
|
+
getInstance: () => T;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
interface AbrControllerInstance {
|
|
28
|
+
getQualityFor: (mediaType: string, streamInfo: unknown) => number;
|
|
29
|
+
}
|
|
30
|
+
interface RulesContextInstance {
|
|
31
|
+
getMediaInfo: () => {
|
|
32
|
+
type: string;
|
|
33
|
+
bitrateList: Array<{
|
|
34
|
+
bandwidth: number;
|
|
35
|
+
}>;
|
|
36
|
+
representationCount: number;
|
|
37
|
+
};
|
|
38
|
+
getAbrController: () => AbrControllerInstance;
|
|
39
|
+
}
|
|
40
|
+
interface FactoryMakerLike {
|
|
41
|
+
getClassFactoryByName: (name: string) => SwitchRequestFactory;
|
|
42
|
+
getSingletonFactoryByName: (name: string) => SingletonFactory<unknown>;
|
|
43
|
+
getClassFactory: (fn: AbrRuleFunction) => unknown;
|
|
44
|
+
}
|
|
45
|
+
interface AbrRuleFunction {
|
|
46
|
+
(): {
|
|
47
|
+
getMaxIndex: (rulesContext: RulesContextInstance) => SwitchRequestInstance;
|
|
48
|
+
};
|
|
49
|
+
__dashjs_factory_name: string;
|
|
50
|
+
}
|
|
51
|
+
export interface DashjsForAbr {
|
|
52
|
+
FactoryMaker: FactoryMakerLike;
|
|
53
|
+
}
|
|
54
|
+
export declare function createDashAbrRule(dashjs: DashjsForAbr): unknown;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=dash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dash.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/abr/dash.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,oBAAoB;IAC5B,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;KAAE,CAAA;IAC3D,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7B;AAED,UAAU,gBAAgB,CAAC,CAAC;IAC1B,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;CAC7C;AAwBD,UAAU,qBAAqB;IAC7B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,MAAM,CAAA;CAClE;AAED,UAAU,oBAAoB;IAC5B,YAAY,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5G,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;CAC9C;AAED,UAAU,gBAAgB;IACxB,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,oBAAoB,CAAA;IAC7D,yBAAyB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACtE,eAAe,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,OAAO,CAAA;CAClD;AAED,UAAU,eAAe;IACvB,IAAI;QAAE,WAAW,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,qBAAqB,CAAA;KAAE,CAAA;IAClF,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,gBAAgB,CAAA;CAC/B;AAyCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAwJ/D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom HLS ABR controller.
|
|
3
|
+
*
|
|
4
|
+
* Ported from component/engines/abr/hls.js (509 LOC).
|
|
5
|
+
*
|
|
6
|
+
* Creates a class that extends hls.js's built-in ABR controller and overrides
|
|
7
|
+
* nextAutoLevel with bandwidth-aware and buffer-level-based quality selection.
|
|
8
|
+
*
|
|
9
|
+
* Usage: pass the result as `abrController` in the Hls constructor config.
|
|
10
|
+
*
|
|
11
|
+
* Note: hls.js internals are accessed via type assertions because the library
|
|
12
|
+
* does not export its internal controller types (Open Question 3 in RESEARCH.md).
|
|
13
|
+
*/
|
|
14
|
+
interface AbrHlsLevel {
|
|
15
|
+
bitrate: number;
|
|
16
|
+
loaded?: {
|
|
17
|
+
bytes: number;
|
|
18
|
+
duration: number;
|
|
19
|
+
};
|
|
20
|
+
realBitrate?: number;
|
|
21
|
+
}
|
|
22
|
+
interface AbrHlsMedia {
|
|
23
|
+
currentTime: number;
|
|
24
|
+
playbackRate: number;
|
|
25
|
+
paused: boolean;
|
|
26
|
+
readyState: number;
|
|
27
|
+
}
|
|
28
|
+
interface AbrHlsConfig {
|
|
29
|
+
maxBufferLength: number;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
interface AbrHlsInstance {
|
|
33
|
+
on: (event: string, handler: (event: string, data: unknown) => void, context?: unknown) => void;
|
|
34
|
+
off: (event: string, handler: (event: string, data: unknown) => void, context?: unknown) => void;
|
|
35
|
+
levels: AbrHlsLevel[];
|
|
36
|
+
currentLevel: number;
|
|
37
|
+
media: AbrHlsMedia | null;
|
|
38
|
+
config: AbrHlsConfig;
|
|
39
|
+
autoLevelEnabled?: boolean;
|
|
40
|
+
}
|
|
41
|
+
interface AbrHlsEvents {
|
|
42
|
+
FRAG_LOADING: string;
|
|
43
|
+
FRAG_LOADED: string;
|
|
44
|
+
FRAG_BUFFERED: string;
|
|
45
|
+
LEVEL_LOADED: string;
|
|
46
|
+
ERROR: string;
|
|
47
|
+
}
|
|
48
|
+
interface AbrHlsConstructorLike {
|
|
49
|
+
Events: AbrHlsEvents;
|
|
50
|
+
DefaultConfig: {
|
|
51
|
+
abrController?: AbrControllerConstructor;
|
|
52
|
+
[key: string]: unknown;
|
|
53
|
+
};
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
}
|
|
56
|
+
interface AbrControllerConstructor {
|
|
57
|
+
new (hlsInstance: AbrHlsInstance, ...args: unknown[]): AbrControllerInstance;
|
|
58
|
+
prototype: AbrControllerInstance;
|
|
59
|
+
}
|
|
60
|
+
interface AbrControllerInstance {
|
|
61
|
+
hls: AbrHlsInstance;
|
|
62
|
+
destroy(): void;
|
|
63
|
+
registerListeners?: () => void;
|
|
64
|
+
unregisterListeners?: () => void;
|
|
65
|
+
clearTimer?: () => void;
|
|
66
|
+
fragCurrent?: HlsFragment | null;
|
|
67
|
+
partCurrent?: HlsFragPart | null;
|
|
68
|
+
timer?: ReturnType<typeof setInterval> | undefined;
|
|
69
|
+
onCheck?: () => void;
|
|
70
|
+
[key: string]: unknown;
|
|
71
|
+
}
|
|
72
|
+
interface HlsFragment {
|
|
73
|
+
type: string;
|
|
74
|
+
sn: number | 'initSegment';
|
|
75
|
+
level: number;
|
|
76
|
+
duration: number;
|
|
77
|
+
stats: HlsFragStats;
|
|
78
|
+
[key: string]: unknown;
|
|
79
|
+
}
|
|
80
|
+
interface HlsFragPart {
|
|
81
|
+
duration: number;
|
|
82
|
+
stats: HlsFragStats;
|
|
83
|
+
}
|
|
84
|
+
interface HlsFragStats {
|
|
85
|
+
loading: {
|
|
86
|
+
start: number;
|
|
87
|
+
};
|
|
88
|
+
parsing: {
|
|
89
|
+
end: number;
|
|
90
|
+
};
|
|
91
|
+
loaded: number;
|
|
92
|
+
tload?: number;
|
|
93
|
+
tfirst?: number;
|
|
94
|
+
trequest?: number;
|
|
95
|
+
aborted?: boolean;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Factory that creates a custom ABR controller class extending hls.js's built-in
|
|
99
|
+
* ABR controller. Takes the Hls constructor so it can access Events and DefaultConfig.
|
|
100
|
+
*
|
|
101
|
+
* The returned class can be passed as `abrController` in the Hls constructor config.
|
|
102
|
+
*/
|
|
103
|
+
export declare function createHlsAbrController(HlsConstructor: AbrHlsConstructorLike): AbrControllerConstructor;
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=hls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/abr/hls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqBH,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,UAAU,YAAY;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/F,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAChG,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,YAAY,CAAA;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB,aAAa,EAAE;QACb,aAAa,CAAC,EAAE,wBAAwB,CAAA;QACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,wBAAwB;IAChC,KAAK,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAAA;IAC5E,SAAS,EAAE,qBAAqB,CAAA;CACjC;AAED,UAAU,qBAAqB;IAC7B,GAAG,EAAE,cAAc,CAAA;IACnB,OAAO,IAAI,IAAI,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAChC,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,CAAA;IAClD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,GAAG,aAAa,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;CACpB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1B,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAiDD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,qBAAqB,GAAG,wBAAwB,CAgatG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseEngine — abstract base class for HLS and DASH engine implementations.
|
|
3
|
+
*
|
|
4
|
+
* Extends EngineStateSync with concrete lifecycle management:
|
|
5
|
+
* - stores video, state, signal, bus, config
|
|
6
|
+
* - binds native video element events to PlayerState
|
|
7
|
+
* - delegates engine-specific startup / teardown to onAttach / onDetach
|
|
8
|
+
* - delegates stall recovery to recoverFromStall (engine-specific)
|
|
9
|
+
*/
|
|
10
|
+
import { EngineStateSync } from '../core/engine-state-sync';
|
|
11
|
+
import type { PlayerState } from '../core/types';
|
|
12
|
+
import type { TypedEventBus } from '../core/event-bus';
|
|
13
|
+
import type { PlayerConfig } from '../core/config';
|
|
14
|
+
export declare abstract class BaseEngine extends EngineStateSync {
|
|
15
|
+
protected video: HTMLVideoElement | null;
|
|
16
|
+
protected state: PlayerState | null;
|
|
17
|
+
protected signal: AbortSignal | null;
|
|
18
|
+
protected bus: TypedEventBus | null;
|
|
19
|
+
protected config: PlayerConfig | null;
|
|
20
|
+
/**
|
|
21
|
+
* The URL to load — set by reference.open(src) via setLoadSource().
|
|
22
|
+
* Takes precedence over config.src in engine init so the intro stream URL
|
|
23
|
+
* is loaded rather than the main stream URL (root cause of Phase 7 bug:
|
|
24
|
+
* reference.open(preroll) wired config but engines read config.src, which
|
|
25
|
+
* always points at the main stream).
|
|
26
|
+
*/
|
|
27
|
+
protected loadSourceUrl: string;
|
|
28
|
+
private watchdog;
|
|
29
|
+
/**
|
|
30
|
+
* Promise that resolves when the engine driver (hls.js/dash.js) is created
|
|
31
|
+
* and ready for integration (e.g., P2P SDK). Resolved inside onAttach().
|
|
32
|
+
*/
|
|
33
|
+
readonly driverReady: Promise<void>;
|
|
34
|
+
protected resolveDriverReady: () => void;
|
|
35
|
+
constructor();
|
|
36
|
+
attach(state: PlayerState, signal: AbortSignal): void;
|
|
37
|
+
detach(): void;
|
|
38
|
+
protected startWatchdog(): void;
|
|
39
|
+
protected stopWatchdog(): void;
|
|
40
|
+
setConfig(config: PlayerConfig): void;
|
|
41
|
+
setBus(bus: TypedEventBus): void;
|
|
42
|
+
setVideo(video: HTMLVideoElement): void;
|
|
43
|
+
/**
|
|
44
|
+
* Set the URL that the engine driver should load.
|
|
45
|
+
* Must be called by reference.open(src) BEFORE controller.setEngineSync()
|
|
46
|
+
* so that onAttach() → init() picks up the correct URL.
|
|
47
|
+
* This decouples the stream URL from config.src, which always points at the
|
|
48
|
+
* main stream URL (set once at start() time and never mutated).
|
|
49
|
+
*/
|
|
50
|
+
setLoadSource(src: string): void;
|
|
51
|
+
protected bindVideoEvents(video: HTMLVideoElement, state: PlayerState, signal: AbortSignal): void;
|
|
52
|
+
protected abstract recoverFromStall(attempt: number): void;
|
|
53
|
+
protected abstract onAttach(): Promise<void> | void;
|
|
54
|
+
protected abstract onDetach(): void;
|
|
55
|
+
abstract setQuality(index: number): void;
|
|
56
|
+
abstract setAudioTrack(index: number): void;
|
|
57
|
+
abstract setSubtitle(index: number): void;
|
|
58
|
+
abstract setPlaybackRate(rate: number): void;
|
|
59
|
+
abstract seekToLive(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Seek to a specific time. Default implementation sets video.currentTime.
|
|
62
|
+
* HLS engine overrides this for live streams to reset hls.js stream controller.
|
|
63
|
+
*/
|
|
64
|
+
seek(time: number): void;
|
|
65
|
+
/**
|
|
66
|
+
* Returns the underlying driver instance (hls.js or dash.js player).
|
|
67
|
+
* Used by P2PManager to integrate with the streaming library.
|
|
68
|
+
* Returns null before engine initialization completes.
|
|
69
|
+
*/
|
|
70
|
+
abstract getDriver(): unknown | null;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=base-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-engine.d.ts","sourceRoot":"","sources":["../../../../../src/engines/base-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,8BAAsB,UAAW,SAAQ,eAAe;IACtD,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAO;IAC/C,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAO;IAC1C,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAO;IAC3C,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAO;IAC1C,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAO;IAC5C;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,EAAE,MAAM,CAAK;IAEpC,OAAO,CAAC,QAAQ,CAA6B;IAE7C;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,SAAS,CAAC,kBAAkB,EAAG,MAAM,IAAI,CAAA;;IAazC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAMrD,MAAM,IAAI,IAAI;IAgBd,SAAS,CAAC,aAAa,IAAI,IAAI;IAmB/B,SAAS,CAAC,YAAY,IAAI,IAAI;IAa9B,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIrC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAIhC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAIvC;;;;;;OAMG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQhC,SAAS,CAAC,eAAe,CACvB,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,GAClB,IAAI;IAgJP,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAC1D,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IACnD,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI;IAMnC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IACxC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAC3C,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IACzC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAC5C,QAAQ,CAAC,UAAU,IAAI,IAAI;IAE3B;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,IAAI,OAAO,GAAG,IAAI;CACrC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDN Script Loader
|
|
3
|
+
*
|
|
4
|
+
* Replaces the scriptjs-based component/utils/load.js with direct <script> tag injection.
|
|
5
|
+
* Resolves with window[globalName] when the script loads, or rejects with a clear error.
|
|
6
|
+
*/
|
|
7
|
+
export interface LoadScriptOptions {
|
|
8
|
+
timeout?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Loads a CDN script by injecting a <script> tag into document.head and resolves
|
|
12
|
+
* with window[globalName] once the script has loaded.
|
|
13
|
+
*
|
|
14
|
+
* - If window[globalName] already exists, resolves immediately (no re-injection).
|
|
15
|
+
* - If the script loads but the global is not on window, rejects with a descriptive error.
|
|
16
|
+
* - If script.onerror fires, rejects with a descriptive error.
|
|
17
|
+
* - If neither onload nor onerror fires within `options.timeout` ms (default 10000), rejects.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadScript<T>(url: string, globalName: string, options?: LoadScriptOptions): Promise<T>;
|
|
20
|
+
//# sourceMappingURL=cdn-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdn-loader.d.ts","sourceRoot":"","sources":["../../../../../src/engines/cdn-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,CAAC,CAAC,CAyCZ"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDN Token Manager
|
|
3
|
+
*
|
|
4
|
+
* TypeScript port of component/utils/token.js (CDNTokenManager class, 459 LOC).
|
|
5
|
+
* Supports four token flows: default (Cloudflare query params), easybroadcast/venom
|
|
6
|
+
* (EasyBroadcast format via POST), akamai (path-segment format), and bunny (POST JSON).
|
|
7
|
+
*
|
|
8
|
+
* All sub-types (TokenError, TokenResponse, ResponseParameters) are inlined here
|
|
9
|
+
* since they are only used by CDNTokenManager.
|
|
10
|
+
*/
|
|
11
|
+
export declare const TOKEN_TYPES: Readonly<{
|
|
12
|
+
readonly EASY_B: "easy_b";
|
|
13
|
+
readonly BUNNY: "bunny";
|
|
14
|
+
readonly AKAMAI: "akamai";
|
|
15
|
+
readonly VENOM: "venom";
|
|
16
|
+
}>;
|
|
17
|
+
export type TokenType = typeof TOKEN_TYPES[keyof typeof TOKEN_TYPES];
|
|
18
|
+
export declare const ERROR_TYPES: Readonly<{
|
|
19
|
+
readonly UNKNOWN: "unknown";
|
|
20
|
+
readonly MAX_RETRY: "max_retry";
|
|
21
|
+
readonly FORBIDDEN: "forbidden";
|
|
22
|
+
}>;
|
|
23
|
+
export type ErrorType = typeof ERROR_TYPES[keyof typeof ERROR_TYPES];
|
|
24
|
+
export interface TokenErrorOptions {
|
|
25
|
+
status?: number | string;
|
|
26
|
+
errorCode?: string;
|
|
27
|
+
errorType?: ErrorType | string;
|
|
28
|
+
message?: string | null;
|
|
29
|
+
}
|
|
30
|
+
export declare class TokenError extends Error {
|
|
31
|
+
status: number | string;
|
|
32
|
+
errorCode: string;
|
|
33
|
+
errorType: ErrorType | string;
|
|
34
|
+
constructor({ status, errorCode, errorType, message }: TokenErrorOptions);
|
|
35
|
+
}
|
|
36
|
+
export interface DefaultResponseParameters {
|
|
37
|
+
token: string | null;
|
|
38
|
+
tokenPath: string | null;
|
|
39
|
+
expires: number | string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface AkamaiResponseParameters {
|
|
42
|
+
hdntl: string | null;
|
|
43
|
+
hdnea: string | null;
|
|
44
|
+
expires: number | string | null;
|
|
45
|
+
acl: string | null;
|
|
46
|
+
hmac: string | null;
|
|
47
|
+
}
|
|
48
|
+
export interface CloudflareResponseParameters {
|
|
49
|
+
verify: string | null;
|
|
50
|
+
expires: number | string | null;
|
|
51
|
+
}
|
|
52
|
+
export type ResponseParameters = DefaultResponseParameters | AkamaiResponseParameters | CloudflareResponseParameters;
|
|
53
|
+
export interface TokenResponseExtras {
|
|
54
|
+
drm_custom_data?: string;
|
|
55
|
+
[key: string]: unknown;
|
|
56
|
+
}
|
|
57
|
+
export interface TokenResponseData {
|
|
58
|
+
src: string;
|
|
59
|
+
responseParameters?: ResponseParameters;
|
|
60
|
+
error?: TokenError | null;
|
|
61
|
+
extras?: TokenResponseExtras;
|
|
62
|
+
}
|
|
63
|
+
export declare class TokenResponse {
|
|
64
|
+
src: string;
|
|
65
|
+
responseParameters: ResponseParameters | undefined;
|
|
66
|
+
error: TokenError | null;
|
|
67
|
+
extras: TokenResponseExtras;
|
|
68
|
+
constructor({ src, responseParameters, error, extras }: TokenResponseData);
|
|
69
|
+
static fromJson({ src, json }: {
|
|
70
|
+
src: string;
|
|
71
|
+
json: string;
|
|
72
|
+
}): TokenResponse;
|
|
73
|
+
static fromAkamai({ src, text }: {
|
|
74
|
+
src: string;
|
|
75
|
+
text: string;
|
|
76
|
+
}): TokenResponse;
|
|
77
|
+
static fromText({ src, text }: {
|
|
78
|
+
src: string;
|
|
79
|
+
text: string;
|
|
80
|
+
}): TokenResponse;
|
|
81
|
+
static fromDefault({ src, text }: {
|
|
82
|
+
src: string;
|
|
83
|
+
text: string;
|
|
84
|
+
}): TokenResponse;
|
|
85
|
+
static fromError({ src, error }: {
|
|
86
|
+
src: string;
|
|
87
|
+
error: TokenError | TokenErrorOptions | Error;
|
|
88
|
+
}): TokenResponse;
|
|
89
|
+
}
|
|
90
|
+
export interface CDNTokenManagerOptions {
|
|
91
|
+
token: string;
|
|
92
|
+
tokenType?: TokenType;
|
|
93
|
+
srcInTokenRequest?: boolean;
|
|
94
|
+
extraParamsCallback?: ((status?: number | string) => Promise<Record<string, unknown>> | Record<string, unknown>) | null;
|
|
95
|
+
onCDNTokenError?: ((error: {
|
|
96
|
+
status: number | string;
|
|
97
|
+
errorCode: string;
|
|
98
|
+
errorType: ErrorType | string;
|
|
99
|
+
}) => void) | null;
|
|
100
|
+
maxRetries?: number;
|
|
101
|
+
retryInterval?: number;
|
|
102
|
+
expirationMarginInSeconds?: number;
|
|
103
|
+
}
|
|
104
|
+
export declare class CDNTokenManager {
|
|
105
|
+
private tokenGeneratorUrl;
|
|
106
|
+
private tokenType;
|
|
107
|
+
private srcInTokenRequest;
|
|
108
|
+
private extraParamsCallback;
|
|
109
|
+
private callbackError;
|
|
110
|
+
private attempt;
|
|
111
|
+
maxRetries: number;
|
|
112
|
+
retryInterval: number;
|
|
113
|
+
private expirationMarginInSeconds;
|
|
114
|
+
lastTokenResponse: TokenResponse | null;
|
|
115
|
+
private resetAttemptCounterTimeout;
|
|
116
|
+
private inFlightFetch;
|
|
117
|
+
constructor({ token, tokenType, srcInTokenRequest, extraParamsCallback, onCDNTokenError, maxRetries, retryInterval, expirationMarginInSeconds }: CDNTokenManagerOptions);
|
|
118
|
+
private resetAttemptCounter;
|
|
119
|
+
private _fetchDefaultToken;
|
|
120
|
+
private _fetchEasyBToken;
|
|
121
|
+
private _fetchAkamaiToken;
|
|
122
|
+
private _fetchBunnyToken;
|
|
123
|
+
fetchToken({ src }: {
|
|
124
|
+
src: string;
|
|
125
|
+
}): Promise<TokenResponse | null>;
|
|
126
|
+
updateUrlWithTokenParams({ url }: {
|
|
127
|
+
url: string;
|
|
128
|
+
}): Promise<string>;
|
|
129
|
+
isTokenExpired(expirationTime: number | string | null | undefined): boolean;
|
|
130
|
+
destroy(): void;
|
|
131
|
+
static appendTokenParams(urlString: string, token: string | null, expires: number | string | null, tokenPath: string | null): string;
|
|
132
|
+
static appendAkamaiTokenParams(urlString: string, hdnea: string): string;
|
|
133
|
+
static appendDefaultTokenParams(urlString: string, tokenResponse: {
|
|
134
|
+
responseParameters?: CloudflareResponseParameters | ResponseParameters;
|
|
135
|
+
}): string;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=cdn-token-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdn-token-manager.d.ts","sourceRoot":"","sources":["../../../../../src/engines/cdn-token-manager.ts"],"names":[],"mappings":"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"}
|