eb-player 2.0.20 → 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.
Files changed (151) hide show
  1. package/dist/build/ebplayer.bundle.js +586 -138
  2. package/dist/build/ebplayer.bundle.js.map +1 -1
  3. package/dist/build/types/src/core/command-handler.d.ts +50 -0
  4. package/dist/build/types/src/core/command-handler.d.ts.map +1 -0
  5. package/dist/build/types/src/core/config.d.ts +187 -0
  6. package/dist/build/types/src/core/config.d.ts.map +1 -0
  7. package/dist/build/types/src/core/engine-state-sync.d.ts +38 -0
  8. package/dist/build/types/src/core/engine-state-sync.d.ts.map +1 -0
  9. package/dist/build/types/src/core/event-bus.d.ts +91 -0
  10. package/dist/build/types/src/core/event-bus.d.ts.map +1 -0
  11. package/dist/build/types/src/core/fsm.d.ts +30 -0
  12. package/dist/build/types/src/core/fsm.d.ts.map +1 -0
  13. package/dist/build/types/src/core/i18n.d.ts +51 -0
  14. package/dist/build/types/src/core/i18n.d.ts.map +1 -0
  15. package/dist/build/types/src/core/index.d.ts +23 -0
  16. package/dist/build/types/src/core/index.d.ts.map +1 -0
  17. package/dist/build/types/src/core/lifecycle.d.ts +96 -0
  18. package/dist/build/types/src/core/lifecycle.d.ts.map +1 -0
  19. package/dist/build/types/src/core/player-state.d.ts +15 -0
  20. package/dist/build/types/src/core/player-state.d.ts.map +1 -0
  21. package/dist/build/types/src/core/types.d.ts +85 -0
  22. package/dist/build/types/src/core/types.d.ts.map +1 -0
  23. package/dist/build/types/src/eb-player-standalone.d.ts +23 -0
  24. package/dist/build/types/src/eb-player-standalone.d.ts.map +1 -0
  25. package/dist/build/types/src/eb-player.d.ts +56 -0
  26. package/dist/build/types/src/eb-player.d.ts.map +1 -0
  27. package/dist/build/types/src/engines/abr/dash.d.ts +56 -0
  28. package/dist/build/types/src/engines/abr/dash.d.ts.map +1 -0
  29. package/dist/build/types/src/engines/abr/hls.d.ts +105 -0
  30. package/dist/build/types/src/engines/abr/hls.d.ts.map +1 -0
  31. package/dist/build/types/src/engines/base-engine.d.ts +72 -0
  32. package/dist/build/types/src/engines/base-engine.d.ts.map +1 -0
  33. package/dist/build/types/src/engines/cdn-loader.d.ts +20 -0
  34. package/dist/build/types/src/engines/cdn-loader.d.ts.map +1 -0
  35. package/dist/build/types/src/engines/cdn-token-manager.d.ts +137 -0
  36. package/dist/build/types/src/engines/cdn-token-manager.d.ts.map +1 -0
  37. package/dist/build/types/src/engines/dash.d.ts +95 -0
  38. package/dist/build/types/src/engines/dash.d.ts.map +1 -0
  39. package/dist/build/types/src/engines/drm.d.ts +54 -0
  40. package/dist/build/types/src/engines/drm.d.ts.map +1 -0
  41. package/dist/build/types/src/engines/hls-discontinuity-patch.d.ts +43 -0
  42. package/dist/build/types/src/engines/hls-discontinuity-patch.d.ts.map +1 -0
  43. package/dist/build/types/src/engines/hls.d.ts +53 -0
  44. package/dist/build/types/src/engines/hls.d.ts.map +1 -0
  45. package/dist/build/types/src/engines/index.d.ts +26 -0
  46. package/dist/build/types/src/engines/index.d.ts.map +1 -0
  47. package/dist/build/types/src/engines/ios/hls.d.ts +20 -0
  48. package/dist/build/types/src/engines/ios/hls.d.ts.map +1 -0
  49. package/dist/build/types/src/engines/poster/hls.d.ts +35 -0
  50. package/dist/build/types/src/engines/poster/hls.d.ts.map +1 -0
  51. package/dist/build/types/src/engines/retry/dash.d.ts +51 -0
  52. package/dist/build/types/src/engines/retry/dash.d.ts.map +1 -0
  53. package/dist/build/types/src/engines/retry/hls.d.ts +47 -0
  54. package/dist/build/types/src/engines/retry/hls.d.ts.map +1 -0
  55. package/dist/build/types/src/engines/snapshot/dash.d.ts +55 -0
  56. package/dist/build/types/src/engines/snapshot/dash.d.ts.map +1 -0
  57. package/dist/build/types/src/engines/snapshot/hls.d.ts +118 -0
  58. package/dist/build/types/src/engines/snapshot/hls.d.ts.map +1 -0
  59. package/dist/build/types/src/engines/stall-watchdog.d.ts +41 -0
  60. package/dist/build/types/src/engines/stall-watchdog.d.ts.map +1 -0
  61. package/dist/build/types/src/integrations/ads-manager.d.ts +79 -0
  62. package/dist/build/types/src/integrations/ads-manager.d.ts.map +1 -0
  63. package/dist/build/types/src/integrations/chromecast-manager.d.ts +50 -0
  64. package/dist/build/types/src/integrations/chromecast-manager.d.ts.map +1 -0
  65. package/dist/build/types/src/integrations/epg-manager.d.ts +22 -0
  66. package/dist/build/types/src/integrations/epg-manager.d.ts.map +1 -0
  67. package/dist/build/types/src/integrations/index.d.ts +7 -0
  68. package/dist/build/types/src/integrations/index.d.ts.map +1 -0
  69. package/dist/build/types/src/integrations/intro-stream-manager.d.ts +62 -0
  70. package/dist/build/types/src/integrations/intro-stream-manager.d.ts.map +1 -0
  71. package/dist/build/types/src/integrations/p2p-manager.d.ts +42 -0
  72. package/dist/build/types/src/integrations/p2p-manager.d.ts.map +1 -0
  73. package/dist/build/types/src/integrations/playlist-manager.d.ts +21 -0
  74. package/dist/build/types/src/integrations/playlist-manager.d.ts.map +1 -0
  75. package/dist/build/types/src/skin/bars/bottom-bar.d.ts +16 -0
  76. package/dist/build/types/src/skin/bars/bottom-bar.d.ts.map +1 -0
  77. package/dist/build/types/src/skin/bars/middle-bar.d.ts +16 -0
  78. package/dist/build/types/src/skin/bars/middle-bar.d.ts.map +1 -0
  79. package/dist/build/types/src/skin/bars/top-bar.d.ts +15 -0
  80. package/dist/build/types/src/skin/bars/top-bar.d.ts.map +1 -0
  81. package/dist/build/types/src/skin/base-component.d.ts +69 -0
  82. package/dist/build/types/src/skin/base-component.d.ts.map +1 -0
  83. package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts +15 -0
  84. package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts.map +1 -0
  85. package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts +16 -0
  86. package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts.map +1 -0
  87. package/dist/build/types/src/skin/component-registry.d.ts +16 -0
  88. package/dist/build/types/src/skin/component-registry.d.ts.map +1 -0
  89. package/dist/build/types/src/skin/controllers/auto-hide.d.ts +27 -0
  90. package/dist/build/types/src/skin/controllers/auto-hide.d.ts.map +1 -0
  91. package/dist/build/types/src/skin/controllers/keyboard.d.ts +29 -0
  92. package/dist/build/types/src/skin/controllers/keyboard.d.ts.map +1 -0
  93. package/dist/build/types/src/skin/controls/cast-button.d.ts +15 -0
  94. package/dist/build/types/src/skin/controls/cast-button.d.ts.map +1 -0
  95. package/dist/build/types/src/skin/controls/channel-name.d.ts +16 -0
  96. package/dist/build/types/src/skin/controls/channel-name.d.ts.map +1 -0
  97. package/dist/build/types/src/skin/controls/forward-button.d.ts +15 -0
  98. package/dist/build/types/src/skin/controls/forward-button.d.ts.map +1 -0
  99. package/dist/build/types/src/skin/controls/fullscreen-button.d.ts +30 -0
  100. package/dist/build/types/src/skin/controls/fullscreen-button.d.ts.map +1 -0
  101. package/dist/build/types/src/skin/controls/info-button.d.ts +10 -0
  102. package/dist/build/types/src/skin/controls/info-button.d.ts.map +1 -0
  103. package/dist/build/types/src/skin/controls/live-sync-button.d.ts +20 -0
  104. package/dist/build/types/src/skin/controls/live-sync-button.d.ts.map +1 -0
  105. package/dist/build/types/src/skin/controls/pip-button.d.ts +21 -0
  106. package/dist/build/types/src/skin/controls/pip-button.d.ts.map +1 -0
  107. package/dist/build/types/src/skin/controls/play-pause-button.d.ts +14 -0
  108. package/dist/build/types/src/skin/controls/play-pause-button.d.ts.map +1 -0
  109. package/dist/build/types/src/skin/controls/rewind-button.d.ts +15 -0
  110. package/dist/build/types/src/skin/controls/rewind-button.d.ts.map +1 -0
  111. package/dist/build/types/src/skin/controls/seekbar.d.ts +48 -0
  112. package/dist/build/types/src/skin/controls/seekbar.d.ts.map +1 -0
  113. package/dist/build/types/src/skin/controls/settings-panel.d.ts +53 -0
  114. package/dist/build/types/src/skin/controls/settings-panel.d.ts.map +1 -0
  115. package/dist/build/types/src/skin/controls/share-button.d.ts +11 -0
  116. package/dist/build/types/src/skin/controls/share-button.d.ts.map +1 -0
  117. package/dist/build/types/src/skin/controls/time-display.d.ts +19 -0
  118. package/dist/build/types/src/skin/controls/time-display.d.ts.map +1 -0
  119. package/dist/build/types/src/skin/controls/volume-control.d.ts +21 -0
  120. package/dist/build/types/src/skin/controls/volume-control.d.ts.map +1 -0
  121. package/dist/build/types/src/skin/icons/icons-modern.d.ts +10 -0
  122. package/dist/build/types/src/skin/icons/icons-modern.d.ts.map +1 -0
  123. package/dist/build/types/src/skin/icons/icons.d.ts +10 -0
  124. package/dist/build/types/src/skin/icons/icons.d.ts.map +1 -0
  125. package/dist/build/types/src/skin/icons/sprite.d.ts +39 -0
  126. package/dist/build/types/src/skin/icons/sprite.d.ts.map +1 -0
  127. package/dist/build/types/src/skin/index.d.ts +24 -0
  128. package/dist/build/types/src/skin/index.d.ts.map +1 -0
  129. package/dist/build/types/src/skin/overlays/error-message.d.ts +14 -0
  130. package/dist/build/types/src/skin/overlays/error-message.d.ts.map +1 -0
  131. package/dist/build/types/src/skin/overlays/info-overlay.d.ts +15 -0
  132. package/dist/build/types/src/skin/overlays/info-overlay.d.ts.map +1 -0
  133. package/dist/build/types/src/skin/overlays/loading-spinner.d.ts +17 -0
  134. package/dist/build/types/src/skin/overlays/loading-spinner.d.ts.map +1 -0
  135. package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts +39 -0
  136. package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts.map +1 -0
  137. package/dist/build/types/src/skin/overlays/socials-overlay.d.ts +17 -0
  138. package/dist/build/types/src/skin/overlays/socials-overlay.d.ts.map +1 -0
  139. package/dist/build/types/src/skin/overlays/toast-notification.d.ts +18 -0
  140. package/dist/build/types/src/skin/overlays/toast-notification.d.ts.map +1 -0
  141. package/dist/build/types/src/skin/skin-root.d.ts +88 -0
  142. package/dist/build/types/src/skin/skin-root.d.ts.map +1 -0
  143. package/dist/build/types/src/utils/chapters.d.ts +16 -0
  144. package/dist/build/types/src/utils/chapters.d.ts.map +1 -0
  145. package/dist/build/types/src/utils/format-duration.d.ts +9 -0
  146. package/dist/build/types/src/utils/format-duration.d.ts.map +1 -0
  147. package/dist/build/types/src/utils/format-wall-clock.d.ts +6 -0
  148. package/dist/build/types/src/utils/format-wall-clock.d.ts.map +1 -0
  149. package/dist/build/types/src/utils/settings-helpers.d.ts +41 -0
  150. package/dist/build/types/src/utils/settings-helpers.d.ts.map +1 -0
  151. package/package.json +34 -33
@@ -0,0 +1,50 @@
1
+ import type { TypedEventBus } from './event-bus';
2
+ import type { PlayerState } from './types';
3
+ import type { I18n } from './i18n';
4
+ import type { BaseEngine } from '../engines/base-engine';
5
+ import type { ChromecastManager } from '../integrations/chromecast-manager';
6
+ /**
7
+ * Saved stream selection state before a reload.
8
+ * PlayerController reads these after re-creating the engine to restore user selections.
9
+ */
10
+ export interface SavedSelections {
11
+ quality: number;
12
+ audioTrack: number;
13
+ subtitleTrack: number;
14
+ }
15
+ /**
16
+ * CommandHandler — central event router from skin commands to video/engine/integration.
17
+ *
18
+ * Subscribes to all command events on the TypedEventBus and routes each to:
19
+ * - HTMLVideoElement for basic playback (play, pause, seek, mute-toggle)
20
+ * - BaseEngine for stream settings (quality, audio, subtitle, speed, sync-live)
21
+ * - ChromecastManager for cast handoff (cast-start, cast-stop, cast-failed)
22
+ *
23
+ * During an active cast session (state.isCasting === true), play/pause/seek/volume
24
+ * commands are routed to the Chromecast driver instead of the local video element.
25
+ *
26
+ * All commands are silent no-ops when engine/video/chromecastManager is null/unavailable.
27
+ */
28
+ export declare class CommandHandler {
29
+ private reloadCount;
30
+ private successTimer;
31
+ private toastTimer;
32
+ private savedQuality;
33
+ private savedAudioTrack;
34
+ private savedSubtitleTrack;
35
+ constructor(bus: TypedEventBus, video: HTMLVideoElement, state: PlayerState, getEngine: () => BaseEngine | null, chromecastManager: ChromecastManager | null, i18n: I18n, onReload: () => void, signal: AbortSignal);
36
+ /**
37
+ * Returns the saved stream selections from before the last reload.
38
+ * PlayerController calls this after re-attaching the engine to restore user selections.
39
+ */
40
+ getSavedSelections(): SavedSelections;
41
+ private wireVideoCommands;
42
+ private wireEngineCommands;
43
+ private wireReloadOrchestration;
44
+ private wireCastHandoff;
45
+ private wireVolumeRouting;
46
+ private wireGeoblock;
47
+ private showToast;
48
+ private wireAbortCleanup;
49
+ }
50
+ //# sourceMappingURL=command-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-handler.d.ts","sourceRoot":"","sources":["../../../../../src/core/command-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAE3E;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,YAAY,CAAoE;IACxF,OAAO,CAAC,UAAU,CAAoE;IACtF,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,kBAAkB,CAAK;gBAG7B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,UAAU,GAAG,IAAI,EAClC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,EAC3C,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,IAAI,EACpB,MAAM,EAAE,WAAW;IAerB;;;OAGG;IACH,kBAAkB,IAAI,eAAe;IAYrC,OAAO,CAAC,iBAAiB;IAiDzB,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,uBAAuB;IAwC/B,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,gBAAgB;CAMzB"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * PlayerConfig interface and mergeConfig function.
3
+ *
4
+ * This module:
5
+ * 1. Defines all 100+ player configuration options as a typed interface
6
+ * 2. Provides DEFAULT_CONFIG with all default values matching configs/default.js
7
+ * 3. Fixes the JSON.parse/stringify bug in generator/mergeConfig.js by
8
+ * passing function values by reference instead of serializing them
9
+ */
10
+ export interface SkinColors {
11
+ general: string;
12
+ progressBar: string;
13
+ volumeBar: string;
14
+ }
15
+ export interface EngineSettings {
16
+ liveSyncDurationCount?: number;
17
+ emeEnabled?: boolean;
18
+ drmSystems?: Record<string, {
19
+ serverURL?: string;
20
+ licenseUrl?: string;
21
+ [key: string]: unknown;
22
+ }>;
23
+ extraParamsCallback?: ((status?: number | string) => Promise<Record<string, unknown>> | Record<string, unknown>) | null | undefined;
24
+ onCDNTokenError?: ((error: {
25
+ status: number | string;
26
+ errorCode: string;
27
+ errorType: string;
28
+ }) => void) | null;
29
+ [key: string]: unknown;
30
+ }
31
+ export interface ChromecastMetadata {
32
+ title?: string;
33
+ description?: string;
34
+ poster?: string;
35
+ }
36
+ export interface LibSettingsResourceManager {
37
+ timeoutV2V?: number;
38
+ storageSize?: number;
39
+ randomWaitForPeers?: number[];
40
+ partialRequest?: boolean;
41
+ setEnableV2V?: boolean;
42
+ }
43
+ export interface LibSettings {
44
+ resourceManager?: LibSettingsResourceManager;
45
+ [key: string]: unknown;
46
+ }
47
+ /** Identifies a mountable skin component for layout configuration. */
48
+ export type ComponentId = 'play-pause' | 'volume' | 'seekbar' | 'time' | 'live-sync' | 'settings' | 'pip' | 'cast' | 'fullscreen' | 'rewind' | 'forward' | 'share' | 'info' | 'channel-name';
49
+ /** Ordered component lists for each alignment zone within a bar. */
50
+ export interface BarLayout {
51
+ left?: ComponentId[];
52
+ center?: ComponentId[];
53
+ right?: ComponentId[];
54
+ }
55
+ /** Layout configuration controlling component placement in each bar. */
56
+ export interface LayoutConfig {
57
+ topBar?: BarLayout;
58
+ bottomBar?: BarLayout;
59
+ middleBar?: BarLayout;
60
+ }
61
+ /**
62
+ * Default layout matching the hardcoded component placement.
63
+ * Used as fallback when config.layout is not provided.
64
+ */
65
+ export declare const DEFAULT_LAYOUT: LayoutConfig;
66
+ /**
67
+ * Available themes — single source of truth for all theme names and labels.
68
+ * The test player reads this to populate the skin selector dynamically.
69
+ * Add new entries here when creating a new theme-*.css file.
70
+ */
71
+ export declare const AVAILABLE_THEMES: {
72
+ value: string;
73
+ label: string;
74
+ primaryColor?: string;
75
+ }[];
76
+ export declare const THEME_LAYOUTS: Record<string, LayoutConfig>;
77
+ /**
78
+ * Returns the effective layout for a given config.
79
+ * Priority: explicit config.layout > theme default > DEFAULT_LAYOUT
80
+ */
81
+ export declare function resolveLayout(config: {
82
+ skin?: string;
83
+ layout?: LayoutConfig;
84
+ }): LayoutConfig;
85
+ export interface SkippableChapter {
86
+ message: string;
87
+ chapter: string;
88
+ }
89
+ /**
90
+ * PlayerConfig interface mirrors all options from configs/default.js.
91
+ * Consumer configs remain as JS objects (accepted via Partial<PlayerConfig>).
92
+ */
93
+ export interface PlayerConfig {
94
+ template: string;
95
+ el: string;
96
+ skin: string;
97
+ start: boolean;
98
+ forceAutoplayAudio: boolean;
99
+ style: string | string[] | undefined;
100
+ css: string;
101
+ dashjs: string | false;
102
+ hlsjs: string | false;
103
+ engineSettings: EngineSettings;
104
+ chromecast: string | false;
105
+ chromecastApp: string | undefined;
106
+ chromecastMetadata: ChromecastMetadata | undefined;
107
+ src: string | undefined;
108
+ autoplay: boolean;
109
+ muted: boolean;
110
+ image: string | false;
111
+ loop: boolean;
112
+ startAt: number | undefined;
113
+ loading: boolean;
114
+ logo: string | undefined;
115
+ logoLink: string | undefined;
116
+ logoPositions: Array<'top-left' | 'bottom-right' | 'center'>;
117
+ about: string;
118
+ primaryColor: string;
119
+ skinColor: string;
120
+ skinColors: SkinColors;
121
+ socials: Record<string, string> | false;
122
+ customSocialsShare: boolean;
123
+ seekbar: boolean;
124
+ middlebar: boolean;
125
+ pip: boolean;
126
+ retry: boolean;
127
+ lowLatency: boolean;
128
+ ad: string | undefined;
129
+ radio: boolean;
130
+ token: string | undefined;
131
+ tokenType: string | undefined;
132
+ srcInTokenRequest: boolean;
133
+ defaultAudio: string | string[] | undefined;
134
+ defaultSubtitle: string | string[] | undefined;
135
+ forceAutoplay: boolean;
136
+ forceQuality: false | 'lowest' | 'highest' | number;
137
+ liveButton: boolean;
138
+ syncLiveMargin: number;
139
+ isLive: boolean | undefined;
140
+ noUi: boolean;
141
+ preroll: string | false;
142
+ prerollSkip: number;
143
+ prerollLink: string | false;
144
+ posterStream: string | false;
145
+ speed: boolean;
146
+ chapters: string | null;
147
+ skippableChapters: SkippableChapter[];
148
+ seekOffset: number;
149
+ supportHotKeys: boolean;
150
+ useGeoblockingErrorHandle: boolean;
151
+ extraParamsCallback: ((src: string) => Record<string, unknown>) | undefined;
152
+ licenseXhrSetup: ((xhr: XMLHttpRequest, url: string) => void) | undefined;
153
+ volume: number;
154
+ lib: string | undefined;
155
+ manager: string | false;
156
+ stats: string;
157
+ origin: string;
158
+ content: string | undefined;
159
+ libSettings: LibSettings;
160
+ hasPlaylistPicker: boolean;
161
+ disableCustomAbr: boolean;
162
+ lang: string | undefined;
163
+ epgContentId: string | undefined;
164
+ epgPolling: number | null;
165
+ epgDefaultLang: string;
166
+ showEpgTitlePreview: boolean;
167
+ showProgressThumb: boolean;
168
+ channelName: string | undefined;
169
+ layout: LayoutConfig | undefined;
170
+ [key: string]: unknown;
171
+ }
172
+ /**
173
+ * DEFAULT_CONFIG contains all default values matching configs/default.js.
174
+ */
175
+ export declare const DEFAULT_CONFIG: PlayerConfig;
176
+ /**
177
+ * Merges multiple configs in order (later configs win).
178
+ * Fixes the function-stripping bug from generator/mergeConfig.js.
179
+ *
180
+ * Rules:
181
+ * - Functions: passed by reference (not cloned)
182
+ * - Arrays: replaced entirely (not concatenated)
183
+ * - Plain objects: deep-merged recursively
184
+ * - null/undefined entries: silently ignored
185
+ */
186
+ export declare function mergeConfig(...configs: Array<Partial<PlayerConfig> | null | undefined>): PlayerConfig;
187
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAA;IAChG,mBAAmB,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAA;IACnI,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7G,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,eAAe,CAAC,EAAE,0BAA0B,CAAA;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,sEAAsE;AACtE,MAAM,MAAM,WAAW,GACnB,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,MAAM,GACN,WAAW,GACX,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,OAAO,GACP,MAAM,GACN,cAAc,CAAA;AAElB,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,WAAW,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CACtB;AAED,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,YAe5B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EAQrF,CAAA;AA2DD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAKtD,CAAA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAE,GAAG,YAAY,CAI5F;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAE3B,QAAQ,EAAE,MAAM,CAAA;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,kBAAkB,EAAE,OAAO,CAAA;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;IACpC,GAAG,EAAE,MAAM,CAAA;IAGX,MAAM,EAAE,MAAM,GAAG,KAAK,CAAA;IACtB,KAAK,EAAE,MAAM,GAAG,KAAK,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,GAAG,KAAK,CAAA;IAC1B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAA;IAGlD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,KAAK,CAAA;IACrB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,aAAa,EAAE,KAAK,CAAC,UAAU,GAAG,cAAc,GAAG,QAAQ,CAAC,CAAA;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAA;IACvC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;IAC3C,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;IAC9C,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;IACnD,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,KAAK,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,YAAY,EAAE,MAAM,GAAG,KAAK,CAAA;IAC5B,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,yBAAyB,EAAE,OAAO,CAAA;IAGlC,mBAAmB,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IAC3E,eAAe,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAGzE,MAAM,EAAE,MAAM,CAAA;IAGd,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,KAAK,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,WAAW,EAAE,WAAW,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,OAAO,CAAA;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAGxB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iBAAiB,EAAE,OAAO,CAAA;IAG1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAG/B,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;IAGhC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YA4G5B,CAAA;AA4DD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,GAAG,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,GAC1D,YAAY,CASd"}
@@ -0,0 +1,38 @@
1
+ import type { PlayerState } from './types';
2
+ /**
3
+ * EngineStateSync is the abstract base class defining the contract for Phase 2
4
+ * engine bridge implementations (HLS, DASH).
5
+ *
6
+ * Phase 2 HLS and DASH engines extend this class to bridge DOM video events
7
+ * to the PlayerState store. The attach() method receives the PlayerState and
8
+ * an AbortSignal for automatic cleanup — engines register video element
9
+ * event listeners using the signal to ensure zero-leak cleanup on dispose().
10
+ *
11
+ * Usage pattern in Phase 2:
12
+ * class HlsEngineSync extends EngineStateSync {
13
+ * attach(state: PlayerState, signal: AbortSignal): void {
14
+ * video.addEventListener('timeupdate', () => { state.currentTime = video.currentTime }, { signal })
15
+ * }
16
+ * detach(): void {
17
+ * this.driver?.destroy()
18
+ * }
19
+ * }
20
+ */
21
+ export declare abstract class EngineStateSync {
22
+ /**
23
+ * Called by PlayerController.setEngineSync() to bridge engine events to state.
24
+ * Implementations should register all event listeners using { signal } so they
25
+ * are automatically removed when the AbortController is aborted on dispose().
26
+ *
27
+ * @param state - The reactive PlayerState to write engine events into
28
+ * @param signal - AbortSignal tied to the PlayerController's lifecycle
29
+ */
30
+ abstract attach(state: PlayerState, signal: AbortSignal): void;
31
+ /**
32
+ * Called by PlayerController.dispose() or when a new engine replaces this one.
33
+ * Implementations should clean up engine-specific resources (e.g., driver.destroy()).
34
+ * Signal-based event listeners are automatically removed by the AbortController.
35
+ */
36
+ abstract detach(): void;
37
+ }
38
+ //# sourceMappingURL=engine-state-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-state-sync.d.ts","sourceRoot":"","sources":["../../../../../src/core/engine-state-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAAsB,eAAe;IACnC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAE9D;;;;OAIG;IACH,QAAQ,CAAC,MAAM,IAAI,IAAI;CACxB"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * EventMap defines the typed event names and their payload types.
3
+ * - void events: listener receives no arguments
4
+ * - payload events: listener receives the typed payload
5
+ *
6
+ * This type will be extended as more events are identified in Phase 2/3.
7
+ */
8
+ export interface EventMap {
9
+ 'request-reload': void;
10
+ 'ad-complete': void;
11
+ 'intro-stream-complete': void;
12
+ 'force-intro-complete': void;
13
+ 'preroll-skip': void;
14
+ 'cast-stop': void;
15
+ 'error-fatal': {
16
+ code: string;
17
+ message: string;
18
+ };
19
+ 'cast-start': {
20
+ src: string;
21
+ };
22
+ 'cast-failed': void;
23
+ 'cast-stop-with-position': {
24
+ time: number;
25
+ };
26
+ 'geoblock-detected': void;
27
+ 'play': void;
28
+ 'pause': void;
29
+ 'seek': {
30
+ time: number;
31
+ };
32
+ 'sync-live': void;
33
+ 'mute-toggle': void;
34
+ 'playlist-next': void;
35
+ 'playlist-prev': void;
36
+ 'settings-select-quality': {
37
+ index: number;
38
+ };
39
+ 'settings-select-audio': {
40
+ index: number;
41
+ };
42
+ 'settings-select-subtitle': {
43
+ index: number;
44
+ };
45
+ 'settings-select-speed': {
46
+ rate: number;
47
+ };
48
+ 'extension-event': {
49
+ zone: string;
50
+ data: unknown;
51
+ };
52
+ 'snapshot-handler-ready': {
53
+ take: (time: number) => void;
54
+ video: HTMLVideoElement;
55
+ };
56
+ }
57
+ type EventListener<T> = T extends void ? () => void : (payload: T) => void;
58
+ type EmitArgs<K extends keyof EventMap> = EventMap[K] extends void ? [event: K] : [event: K, payload: EventMap[K]];
59
+ /**
60
+ * TypedEventBus provides signal-based inter-component communication.
61
+ * It is distinct from PlayerState (reactive values) — the EventBus handles
62
+ * one-shot signals and commands between components.
63
+ *
64
+ * Usage:
65
+ * bus.on('request-reload', () => reload())
66
+ * bus.emit('request-reload')
67
+ * bus.on('error-fatal', (payload) => handleError(payload), { signal: ac.signal })
68
+ */
69
+ export declare class TypedEventBus {
70
+ private readonly listeners;
71
+ constructor();
72
+ /**
73
+ * Register a listener for the given event.
74
+ * Pass an AbortSignal via options to auto-remove the listener when the signal aborts.
75
+ */
76
+ on<K extends keyof EventMap>(event: K, listener: EventListener<EventMap[K]>, options?: {
77
+ signal?: AbortSignal;
78
+ }): void;
79
+ /**
80
+ * Emit an event, calling all registered listeners.
81
+ * Void events require no payload argument; payload events require the payload.
82
+ */
83
+ emit<K extends keyof EventMap>(...args: EmitArgs<K>): void;
84
+ /**
85
+ * Remove all listeners from all events.
86
+ * After calling dispose(), all subsequent emit calls are no-ops.
87
+ */
88
+ dispose(): void;
89
+ }
90
+ export {};
91
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../../../src/core/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IAEvB,gBAAgB,EAAE,IAAI,CAAA;IACtB,aAAa,EAAE,IAAI,CAAA;IACnB,uBAAuB,EAAE,IAAI,CAAA;IAI7B,sBAAsB,EAAE,IAAI,CAAA;IAC5B,cAAc,EAAE,IAAI,CAAA;IACpB,WAAW,EAAE,IAAI,CAAA;IACjB,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD,YAAY,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7B,aAAa,EAAE,IAAI,CAAA;IACnB,yBAAyB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3C,mBAAmB,EAAE,IAAI,CAAA;IAGzB,MAAM,EAAE,IAAI,CAAA;IACZ,OAAO,EAAE,IAAI,CAAA;IACb,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACxB,WAAW,EAAE,IAAI,CAAA;IACjB,aAAa,EAAE,IAAI,CAAA;IACnB,eAAe,EAAE,IAAI,CAAA;IACrB,eAAe,EAAE,IAAI,CAAA;IACrB,yBAAyB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,uBAAuB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,0BAA0B,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,uBAAuB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;IAGlD,wBAAwB,EAAE;QAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,gBAAgB,CAAA;KAAE,CAAA;CACpF;AAED,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;AAE1E,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAC9D,CAAC,KAAK,EAAE,CAAC,CAAC,GACV,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpC;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;;IAM5E;;;OAGG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EACzB,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EACpC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjC,IAAI;IA2BP;;;OAGG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAiB1D;;;OAGG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Finite State Machine for player playback state transitions.
3
+ *
4
+ * The TRANSITIONS map defines all valid state transitions. The Proxy set trap
5
+ * in player-state.ts calls isValidTransition to enforce these rules.
6
+ */
7
+ export type PlaybackState = 'idle' | 'loading' | 'playing' | 'paused' | 'buffering' | 'error' | 'ended';
8
+ /**
9
+ * Maps each state to the set of states it may transition into.
10
+ *
11
+ * Design notes:
12
+ * - idle -> loading: initial load or post-stall reload
13
+ * - loading -> playing | error: stream starts or fails
14
+ * - playing -> paused | buffering | ended | error: normal playback events
15
+ * - paused -> playing | loading | idle | buffering: resume or stop
16
+ * - paused -> buffering is needed when resuming a paused (live) stream where
17
+ * the browser fires 'waiting' before 'playing' (Safari live segment edge);
18
+ * without it the FSM strands at 'paused' while the video actually plays
19
+ * - buffering -> playing | paused | idle | error: buffer recovered, user pause, or stall
20
+ * - buffering -> idle is needed for the stall-watchdog recovery path (kick off reload)
21
+ * - buffering -> paused is needed for live stream support (user pauses during buffer)
22
+ * - error -> loading: retry after error
23
+ * - ended -> loading | idle: restart playback or reset
24
+ */
25
+ export declare const TRANSITIONS: Readonly<Record<PlaybackState, ReadonlyArray<PlaybackState>>>;
26
+ /**
27
+ * Returns true if transitioning from `from` to `to` is valid per the FSM.
28
+ */
29
+ export declare function isValidTransition(from: PlaybackState, to: PlaybackState): boolean;
30
+ //# sourceMappingURL=fsm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsm.d.ts","sourceRoot":"","sources":["../../../../../src/core/fsm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,SAAS,GACT,SAAS,GACT,QAAQ,GACR,WAAW,GACX,OAAO,GACP,OAAO,CAAA;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAQrF,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAEjF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Lightweight i18n module replacing Vue i18n.
3
+ *
4
+ * Translations are keyed using dot-notation (e.g., 'error.start').
5
+ * A KEY_MAP provides backward compatibility with the old full-sentence keys
6
+ * used in component/translations/ for Phase 2/3 compatibility.
7
+ */
8
+ type LocaleMap = Record<string, string>;
9
+ type TranslationMap = Record<string, LocaleMap>;
10
+ /**
11
+ * KEY_MAP maps old full-sentence keys to new dot-notation keys.
12
+ * Provides Phase 2/3 backward compatibility with existing translation lookups.
13
+ */
14
+ export declare const KEY_MAP: Record<string, string>;
15
+ /**
16
+ * I18n class provides translation and interpolation for the player UI.
17
+ * Designed to grow as skin components are ported in Phase 3.
18
+ */
19
+ export declare class I18n {
20
+ private currentLocale;
21
+ private readonly translations;
22
+ constructor(locale?: string);
23
+ /**
24
+ * Add or extend translations at runtime.
25
+ * Useful for skin components adding their own translation keys in Phase 3.
26
+ */
27
+ addTranslations(entries: TranslationMap): void;
28
+ /**
29
+ * Look up a translation key in the current locale.
30
+ * Falls back to English if not found in current locale.
31
+ * Falls back to the key string itself if not found in English either.
32
+ * Interpolates {variable} placeholders with provided values.
33
+ */
34
+ t(key: string, vars?: Record<string, string | number>): string;
35
+ /**
36
+ * Replace {varName} placeholders in a template string with provided values.
37
+ * Unmatched placeholders are left unchanged.
38
+ */
39
+ interpolate(template: string, vars: Record<string, string | number>): string;
40
+ /**
41
+ * Change the active locale for subsequent t() calls.
42
+ * Falls back to 'en' for unsupported locales.
43
+ */
44
+ setLocale(locale: string): void;
45
+ /**
46
+ * Return the current active locale code.
47
+ */
48
+ getLocale(): string;
49
+ }
50
+ export {};
51
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/core/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACvC,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAwE/C;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE1C,CAAA;AAoBD;;;GAGG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAEjC,MAAM,CAAC,EAAE,MAAM;IAK3B;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAM9C;;;;;OAKG;IACH,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM;IAqB9D;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM;IAO5E;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * eb-player core public API barrel export.
3
+ *
4
+ * This file is the entry point for the Rollup build (rollup.config.ts).
5
+ * Import from this file to access all public core module exports.
6
+ *
7
+ * CSS imports: base.css, theme files (auto-discovered via virtual:theme-css),
8
+ * and skin.css are imported here so Rollup's postcss plugin extracts them.
9
+ */
10
+ import './css/base.css';
11
+ import 'virtual:theme-css';
12
+ import '../skin/css/skin.css';
13
+ export { PlaybackState, TRANSITIONS, isValidTransition } from './fsm';
14
+ export type { StateMap, Listener, PlayerState } from './types';
15
+ export { createPlayerState } from './player-state';
16
+ export { TypedEventBus } from './event-bus';
17
+ export type { EventMap } from './event-bus';
18
+ export { mergeConfig, DEFAULT_CONFIG, AVAILABLE_THEMES, THEME_LAYOUTS } from './config';
19
+ export type { PlayerConfig, SkinColors, EngineSettings } from './config';
20
+ export { I18n } from './i18n';
21
+ export { PlayerController } from './lifecycle';
22
+ export { EngineStateSync } from './engine-state-sync';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,gBAAgB,CAAA;AACvB,OAAO,mBAAmB,CAAA;AAC1B,OAAO,sBAAsB,CAAA;AAG7B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAGrE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACvF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAGxE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,96 @@
1
+ import { TypedEventBus } from './event-bus';
2
+ import { I18n } from './i18n';
3
+ import type { PlayerState } from './types';
4
+ import type { PlayerConfig } from './config';
5
+ import type { EngineStateSync } from './engine-state-sync';
6
+ import type { SavedSelections } from './command-handler';
7
+ /**
8
+ * PlayerController manages the complete lifecycle of a player instance.
9
+ *
10
+ * Lifecycle:
11
+ * 1. Construct with config
12
+ * 2. mount(container) — apply CSS vars, set data-theme, create SkinRoot, initialize integrations
13
+ * 3. setEngineSync(sync) — attach engine bridge to state
14
+ * 4. dispose() — disconnect SkinRoot, abort all signals, detach engine, clear references
15
+ * 5. Optionally re-mount with a fresh container (dispose() creates a new AbortController)
16
+ *
17
+ * Mount order:
18
+ * 1. CSS vars / data-theme applied to container
19
+ * 2. Config-derived state (isRtl, isRadio) set
20
+ * 3. SkinRoot connected (needs DOM) — creates video element and ads container
21
+ * 4. AutoHideController + KeyboardController wired
22
+ * 5. Integrations initialized (need skin DOM for ads)
23
+ *
24
+ * Dispose order (reverse of mount):
25
+ * 1. Engine detached
26
+ * 2. Bus disposed
27
+ * 3. AbortController aborted (cleans up all signal-based listeners)
28
+ * 4. SkinRoot disconnected
29
+ * 5. References nulled
30
+ */
31
+ export declare class PlayerController {
32
+ readonly state: PlayerState;
33
+ readonly bus: TypedEventBus;
34
+ readonly config: PlayerConfig;
35
+ readonly i18n: I18n;
36
+ private abortController;
37
+ private _container;
38
+ private engineSync;
39
+ private skinRoot;
40
+ private commandHandler;
41
+ private chromecastManager;
42
+ private reloadCallback;
43
+ get signal(): AbortSignal;
44
+ /**
45
+ * The currently mounted container element, or null if not mounted / after dispose().
46
+ * Available for Phase 2 engine implementations that need access to the DOM context.
47
+ */
48
+ get container(): HTMLElement | null;
49
+ constructor(config: Partial<PlayerConfig>);
50
+ /**
51
+ * Attach the player to a DOM container element.
52
+ *
53
+ * Applies CSS vars and data-theme, creates the SkinRoot DOM scaffold,
54
+ * registers AutoHide/Keyboard controllers, and initializes integration
55
+ * managers based on config flags.
56
+ *
57
+ * CSS application order (later wins):
58
+ * 1. primaryColor → --eb-color-primary
59
+ * 2. skinColors.general → --eb-color-primary (overrides primaryColor)
60
+ * 3. skinColors.progressBar → --eb-color-progress
61
+ * 4. skinColors.volumeBar → --eb-color-volume
62
+ */
63
+ mount(container: HTMLElement): void;
64
+ /**
65
+ * Store a callback to invoke when request-reload fires.
66
+ * Called by eb-player.ts after mount() to wire the reload orchestration path.
67
+ */
68
+ setReloadCallback(callback: () => void): void;
69
+ /**
70
+ * Returns saved stream selections from the CommandHandler (quality, audioTrack, subtitleTrack).
71
+ * Returns defaults when no CommandHandler exists (e.g., noUi mode, no video element).
72
+ */
73
+ getSavedSelections(): SavedSelections;
74
+ /**
75
+ * Attach an engine bridge implementation to the state store.
76
+ * If an existing engine is attached, detach() is called first.
77
+ * The engine receives the PlayerState and the current AbortSignal.
78
+ */
79
+ setEngineSync(sync: EngineStateSync): void;
80
+ /**
81
+ * Dispose the player instance.
82
+ * - Calls engineSync.detach() if an engine is attached
83
+ * - Calls bus.dispose() to clear all event listeners
84
+ * - Aborts the AbortController (removes all signal-based listeners atomically)
85
+ * - Disconnects SkinRoot
86
+ * - Clears all references
87
+ * - Creates a fresh AbortController for potential re-mount
88
+ */
89
+ dispose(): void;
90
+ /**
91
+ * Initialize integration managers based on config flags.
92
+ * All integrations are async and non-critical — errors are caught and logged.
93
+ */
94
+ private initIntegrations;
95
+ }
96
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../../src/core/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAW7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGxD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IAEnB,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,cAAc,CAAqB;IAE3C,IAAI,MAAM,IAAI,WAAW,CAExB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,WAAW,GAAG,IAAI,CAElC;gBAEW,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;IAczC;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAwFnC;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAI7C;;;OAGG;IACH,kBAAkB,IAAI,eAAe;IAOrC;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAQ1C;;;;;;;;OAQG;IACH,OAAO,IAAI,IAAI;IAwBf;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAqFzB"}
@@ -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"}