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.
Files changed (156) hide show
  1. package/dist/build/eb-player.css +9 -0
  2. package/dist/build/ebplayer.bundle.js +604 -132
  3. package/dist/build/ebplayer.bundle.js.map +1 -1
  4. package/dist/build/types/integrations/ads-manager.d.ts.map +1 -1
  5. package/dist/build/types/skin/skin-root.d.ts +8 -0
  6. package/dist/build/types/skin/skin-root.d.ts.map +1 -1
  7. package/dist/build/types/src/core/command-handler.d.ts +50 -0
  8. package/dist/build/types/src/core/command-handler.d.ts.map +1 -0
  9. package/dist/build/types/src/core/config.d.ts +187 -0
  10. package/dist/build/types/src/core/config.d.ts.map +1 -0
  11. package/dist/build/types/src/core/engine-state-sync.d.ts +38 -0
  12. package/dist/build/types/src/core/engine-state-sync.d.ts.map +1 -0
  13. package/dist/build/types/src/core/event-bus.d.ts +91 -0
  14. package/dist/build/types/src/core/event-bus.d.ts.map +1 -0
  15. package/dist/build/types/src/core/fsm.d.ts +30 -0
  16. package/dist/build/types/src/core/fsm.d.ts.map +1 -0
  17. package/dist/build/types/src/core/i18n.d.ts +51 -0
  18. package/dist/build/types/src/core/i18n.d.ts.map +1 -0
  19. package/dist/build/types/src/core/index.d.ts +23 -0
  20. package/dist/build/types/src/core/index.d.ts.map +1 -0
  21. package/dist/build/types/src/core/lifecycle.d.ts +96 -0
  22. package/dist/build/types/src/core/lifecycle.d.ts.map +1 -0
  23. package/dist/build/types/src/core/player-state.d.ts +15 -0
  24. package/dist/build/types/src/core/player-state.d.ts.map +1 -0
  25. package/dist/build/types/src/core/types.d.ts +85 -0
  26. package/dist/build/types/src/core/types.d.ts.map +1 -0
  27. package/dist/build/types/src/eb-player-standalone.d.ts +23 -0
  28. package/dist/build/types/src/eb-player-standalone.d.ts.map +1 -0
  29. package/dist/build/types/src/eb-player.d.ts +56 -0
  30. package/dist/build/types/src/eb-player.d.ts.map +1 -0
  31. package/dist/build/types/src/engines/abr/dash.d.ts +56 -0
  32. package/dist/build/types/src/engines/abr/dash.d.ts.map +1 -0
  33. package/dist/build/types/src/engines/abr/hls.d.ts +105 -0
  34. package/dist/build/types/src/engines/abr/hls.d.ts.map +1 -0
  35. package/dist/build/types/src/engines/base-engine.d.ts +72 -0
  36. package/dist/build/types/src/engines/base-engine.d.ts.map +1 -0
  37. package/dist/build/types/src/engines/cdn-loader.d.ts +20 -0
  38. package/dist/build/types/src/engines/cdn-loader.d.ts.map +1 -0
  39. package/dist/build/types/src/engines/cdn-token-manager.d.ts +137 -0
  40. package/dist/build/types/src/engines/cdn-token-manager.d.ts.map +1 -0
  41. package/dist/build/types/src/engines/dash.d.ts +95 -0
  42. package/dist/build/types/src/engines/dash.d.ts.map +1 -0
  43. package/dist/build/types/src/engines/drm.d.ts +54 -0
  44. package/dist/build/types/src/engines/drm.d.ts.map +1 -0
  45. package/dist/build/types/src/engines/hls-discontinuity-patch.d.ts +43 -0
  46. package/dist/build/types/src/engines/hls-discontinuity-patch.d.ts.map +1 -0
  47. package/dist/build/types/src/engines/hls.d.ts +53 -0
  48. package/dist/build/types/src/engines/hls.d.ts.map +1 -0
  49. package/dist/build/types/src/engines/index.d.ts +26 -0
  50. package/dist/build/types/src/engines/index.d.ts.map +1 -0
  51. package/dist/build/types/src/engines/ios/hls.d.ts +20 -0
  52. package/dist/build/types/src/engines/ios/hls.d.ts.map +1 -0
  53. package/dist/build/types/src/engines/poster/hls.d.ts +35 -0
  54. package/dist/build/types/src/engines/poster/hls.d.ts.map +1 -0
  55. package/dist/build/types/src/engines/retry/dash.d.ts +51 -0
  56. package/dist/build/types/src/engines/retry/dash.d.ts.map +1 -0
  57. package/dist/build/types/src/engines/retry/hls.d.ts +47 -0
  58. package/dist/build/types/src/engines/retry/hls.d.ts.map +1 -0
  59. package/dist/build/types/src/engines/snapshot/dash.d.ts +55 -0
  60. package/dist/build/types/src/engines/snapshot/dash.d.ts.map +1 -0
  61. package/dist/build/types/src/engines/snapshot/hls.d.ts +118 -0
  62. package/dist/build/types/src/engines/snapshot/hls.d.ts.map +1 -0
  63. package/dist/build/types/src/engines/stall-watchdog.d.ts +41 -0
  64. package/dist/build/types/src/engines/stall-watchdog.d.ts.map +1 -0
  65. package/dist/build/types/src/integrations/ads-manager.d.ts +79 -0
  66. package/dist/build/types/src/integrations/ads-manager.d.ts.map +1 -0
  67. package/dist/build/types/src/integrations/chromecast-manager.d.ts +50 -0
  68. package/dist/build/types/src/integrations/chromecast-manager.d.ts.map +1 -0
  69. package/dist/build/types/src/integrations/epg-manager.d.ts +22 -0
  70. package/dist/build/types/src/integrations/epg-manager.d.ts.map +1 -0
  71. package/dist/build/types/src/integrations/index.d.ts +7 -0
  72. package/dist/build/types/src/integrations/index.d.ts.map +1 -0
  73. package/dist/build/types/src/integrations/intro-stream-manager.d.ts +62 -0
  74. package/dist/build/types/src/integrations/intro-stream-manager.d.ts.map +1 -0
  75. package/dist/build/types/src/integrations/p2p-manager.d.ts +42 -0
  76. package/dist/build/types/src/integrations/p2p-manager.d.ts.map +1 -0
  77. package/dist/build/types/src/integrations/playlist-manager.d.ts +21 -0
  78. package/dist/build/types/src/integrations/playlist-manager.d.ts.map +1 -0
  79. package/dist/build/types/src/skin/bars/bottom-bar.d.ts +16 -0
  80. package/dist/build/types/src/skin/bars/bottom-bar.d.ts.map +1 -0
  81. package/dist/build/types/src/skin/bars/middle-bar.d.ts +16 -0
  82. package/dist/build/types/src/skin/bars/middle-bar.d.ts.map +1 -0
  83. package/dist/build/types/src/skin/bars/top-bar.d.ts +15 -0
  84. package/dist/build/types/src/skin/bars/top-bar.d.ts.map +1 -0
  85. package/dist/build/types/src/skin/base-component.d.ts +69 -0
  86. package/dist/build/types/src/skin/base-component.d.ts.map +1 -0
  87. package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts +15 -0
  88. package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts.map +1 -0
  89. package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts +16 -0
  90. package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts.map +1 -0
  91. package/dist/build/types/src/skin/component-registry.d.ts +16 -0
  92. package/dist/build/types/src/skin/component-registry.d.ts.map +1 -0
  93. package/dist/build/types/src/skin/controllers/auto-hide.d.ts +27 -0
  94. package/dist/build/types/src/skin/controllers/auto-hide.d.ts.map +1 -0
  95. package/dist/build/types/src/skin/controllers/keyboard.d.ts +29 -0
  96. package/dist/build/types/src/skin/controllers/keyboard.d.ts.map +1 -0
  97. package/dist/build/types/src/skin/controls/cast-button.d.ts +15 -0
  98. package/dist/build/types/src/skin/controls/cast-button.d.ts.map +1 -0
  99. package/dist/build/types/src/skin/controls/channel-name.d.ts +16 -0
  100. package/dist/build/types/src/skin/controls/channel-name.d.ts.map +1 -0
  101. package/dist/build/types/src/skin/controls/forward-button.d.ts +15 -0
  102. package/dist/build/types/src/skin/controls/forward-button.d.ts.map +1 -0
  103. package/dist/build/types/src/skin/controls/fullscreen-button.d.ts +30 -0
  104. package/dist/build/types/src/skin/controls/fullscreen-button.d.ts.map +1 -0
  105. package/dist/build/types/src/skin/controls/info-button.d.ts +10 -0
  106. package/dist/build/types/src/skin/controls/info-button.d.ts.map +1 -0
  107. package/dist/build/types/src/skin/controls/live-sync-button.d.ts +20 -0
  108. package/dist/build/types/src/skin/controls/live-sync-button.d.ts.map +1 -0
  109. package/dist/build/types/src/skin/controls/pip-button.d.ts +21 -0
  110. package/dist/build/types/src/skin/controls/pip-button.d.ts.map +1 -0
  111. package/dist/build/types/src/skin/controls/play-pause-button.d.ts +14 -0
  112. package/dist/build/types/src/skin/controls/play-pause-button.d.ts.map +1 -0
  113. package/dist/build/types/src/skin/controls/rewind-button.d.ts +15 -0
  114. package/dist/build/types/src/skin/controls/rewind-button.d.ts.map +1 -0
  115. package/dist/build/types/src/skin/controls/seekbar.d.ts +48 -0
  116. package/dist/build/types/src/skin/controls/seekbar.d.ts.map +1 -0
  117. package/dist/build/types/src/skin/controls/settings-panel.d.ts +53 -0
  118. package/dist/build/types/src/skin/controls/settings-panel.d.ts.map +1 -0
  119. package/dist/build/types/src/skin/controls/share-button.d.ts +11 -0
  120. package/dist/build/types/src/skin/controls/share-button.d.ts.map +1 -0
  121. package/dist/build/types/src/skin/controls/time-display.d.ts +19 -0
  122. package/dist/build/types/src/skin/controls/time-display.d.ts.map +1 -0
  123. package/dist/build/types/src/skin/controls/volume-control.d.ts +21 -0
  124. package/dist/build/types/src/skin/controls/volume-control.d.ts.map +1 -0
  125. package/dist/build/types/src/skin/icons/icons-modern.d.ts +10 -0
  126. package/dist/build/types/src/skin/icons/icons-modern.d.ts.map +1 -0
  127. package/dist/build/types/src/skin/icons/icons.d.ts +10 -0
  128. package/dist/build/types/src/skin/icons/icons.d.ts.map +1 -0
  129. package/dist/build/types/src/skin/icons/sprite.d.ts +39 -0
  130. package/dist/build/types/src/skin/icons/sprite.d.ts.map +1 -0
  131. package/dist/build/types/src/skin/index.d.ts +24 -0
  132. package/dist/build/types/src/skin/index.d.ts.map +1 -0
  133. package/dist/build/types/src/skin/overlays/error-message.d.ts +14 -0
  134. package/dist/build/types/src/skin/overlays/error-message.d.ts.map +1 -0
  135. package/dist/build/types/src/skin/overlays/info-overlay.d.ts +15 -0
  136. package/dist/build/types/src/skin/overlays/info-overlay.d.ts.map +1 -0
  137. package/dist/build/types/src/skin/overlays/loading-spinner.d.ts +17 -0
  138. package/dist/build/types/src/skin/overlays/loading-spinner.d.ts.map +1 -0
  139. package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts +39 -0
  140. package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts.map +1 -0
  141. package/dist/build/types/src/skin/overlays/socials-overlay.d.ts +17 -0
  142. package/dist/build/types/src/skin/overlays/socials-overlay.d.ts.map +1 -0
  143. package/dist/build/types/src/skin/overlays/toast-notification.d.ts +18 -0
  144. package/dist/build/types/src/skin/overlays/toast-notification.d.ts.map +1 -0
  145. package/dist/build/types/src/skin/skin-root.d.ts +88 -0
  146. package/dist/build/types/src/skin/skin-root.d.ts.map +1 -0
  147. package/dist/build/types/src/utils/chapters.d.ts +16 -0
  148. package/dist/build/types/src/utils/chapters.d.ts.map +1 -0
  149. package/dist/build/types/src/utils/format-duration.d.ts +9 -0
  150. package/dist/build/types/src/utils/format-duration.d.ts.map +1 -0
  151. package/dist/build/types/src/utils/format-wall-clock.d.ts +6 -0
  152. package/dist/build/types/src/utils/format-wall-clock.d.ts.map +1 -0
  153. package/dist/build/types/src/utils/settings-helpers.d.ts +41 -0
  154. package/dist/build/types/src/utils/settings-helpers.d.ts.map +1 -0
  155. package/dist/eb-player.css +9 -0
  156. package/package.json +15 -15
@@ -0,0 +1,95 @@
1
+ /**
2
+ * DashEngine — DASH playback engine.
3
+ *
4
+ * Ported from component/engines/dash.js
5
+ *
6
+ * Extends BaseEngine to bridge dash.js MediaPlayer events to PlayerState.
7
+ * Uses CDN loader, CDNTokenManager, StallWatchdog, and DASH retry settings.
8
+ *
9
+ * CRITICAL: driver instance is a private class field — NEVER stored in PlayerState.
10
+ */
11
+ import { BaseEngine } from './base-engine';
12
+ import type { PlayerConfig } from '../core/config';
13
+ import type { TypedEventBus } from '../core/event-bus';
14
+ interface BitrateInfo {
15
+ height: number;
16
+ width: number;
17
+ bitrate: number;
18
+ qualityIndex: number;
19
+ }
20
+ interface MediaTrack {
21
+ id?: string | number;
22
+ index?: number;
23
+ lang?: string;
24
+ [key: string]: unknown;
25
+ }
26
+ interface DashPlayerInstance {
27
+ initialize: (element: HTMLVideoElement, src: string, autoplay?: boolean) => void;
28
+ on: (event: string, handler: (data?: unknown) => void) => void;
29
+ off: (event: string, handler: (data?: unknown) => void) => void;
30
+ getTracksFor: (type: string) => MediaTrack[];
31
+ getBitrateInfoListFor: (type: string) => BitrateInfo[];
32
+ getQualityFor: (type: string) => number;
33
+ setQualityFor: (type: string, index: number) => void;
34
+ setCurrentTrack: (track: MediaTrack) => void;
35
+ getCurrentLiveLatency: () => number;
36
+ time: () => number;
37
+ duration: () => number;
38
+ updateSettings: (settings: Record<string, unknown>) => void;
39
+ addABRCustomRule: (ruleType: string, ruleName: string, rule: unknown) => void;
40
+ refreshManifest: () => void;
41
+ reset: () => void;
42
+ destroy: () => void;
43
+ seek: (time: number) => void;
44
+ [key: string]: unknown;
45
+ }
46
+ interface DashPlayerConstructor {
47
+ (): {
48
+ create: () => DashPlayerInstance;
49
+ };
50
+ events: Record<string, string>;
51
+ }
52
+ export interface DashjsType {
53
+ MediaPlayer: DashPlayerConstructor;
54
+ FactoryMaker: {
55
+ getClassFactoryByName: (name: string) => unknown;
56
+ getSingletonFactoryByName: (name: string) => unknown;
57
+ getClassFactory: (fn: unknown) => unknown;
58
+ };
59
+ }
60
+ export declare class DashEngine extends BaseEngine {
61
+ private driver;
62
+ private dvrErrorHandler;
63
+ private isIntroPass;
64
+ private introFallThroughReported;
65
+ getDriver(): unknown | null;
66
+ setConfig(config: PlayerConfig): void;
67
+ setBus(bus: TypedEventBus): void;
68
+ setVideo(video: HTMLVideoElement): void;
69
+ protected onAttach(): Promise<void>;
70
+ protected onDetach(): void;
71
+ protected recoverFromStall(attempt: number): void;
72
+ setQuality(index: number): void;
73
+ setAudioTrack(index: number): void;
74
+ setSubtitle(index: number): void;
75
+ setPlaybackRate(rate: number): void;
76
+ seekToLive(): void;
77
+ private init;
78
+ private registerDriverEvents;
79
+ /**
80
+ * Handles a dash.js ERROR event.
81
+ *
82
+ * D-04 / G-07-10: always logs, exactly as before (test/engines/dash.test.ts:619
83
+ * and :1156 assert this unchanged). On the intro pass only — gated by
84
+ * this.isIntroPass, computed once in init() from
85
+ * `Boolean(config.preroll) && this.loadSourceUrl === config.preroll` — a fatal
86
+ * manifest/segment error stops the stall watchdog and emits `error-fatal`
87
+ * exactly once (guarded by introFallThroughReported) so
88
+ * IntroStreamManager.complete() can fire and openMainStream() run instead of
89
+ * the watchdog reopening the (still intro) lastSrc in a loop. On the main
90
+ * pass this method only warns — main-stream resilience must stay untouched.
91
+ */
92
+ private handleDriverError;
93
+ }
94
+ export {};
95
+ //# sourceMappingURL=dash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash.d.ts","sourceRoot":"","sources":["../../../../../src/engines/dash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * DrmConfigurator - Builds HLS DRM configuration objects.
3
+ *
4
+ * Isolates DRM complexity from engine initialization code.
5
+ * Ported from component/engines/hls.js init method (lines ~237-268).
6
+ *
7
+ * The licenseXhrSetup hook:
8
+ * 1. Calls tokenManager.extraParamsCallback() for auth token (if configured)
9
+ * 2. Sets Authorization: Bearer <accessToken> on the XHR request
10
+ * 3. Appends drm_custom_data from tokenManager.lastTokenResponse.extras to URL
11
+ *
12
+ * CRITICAL (from MEMORY.md): The licenseXhrSetup hook captures tokenManager
13
+ * via closure reference. The tokenManager is NEVER stored in PlayerState.
14
+ * DrmConfigurator holds a direct class-property reference.
15
+ */
16
+ import type { EngineSettings } from '../core/config';
17
+ /**
18
+ * Interface for the CDN token manager used in DRM license requests.
19
+ * This mirrors the subset of CDNTokenManager methods used by DrmConfigurator.
20
+ * The full CDNTokenManager class will be ported in a later plan.
21
+ */
22
+ export interface CDNTokenManagerInterface {
23
+ extraParamsCallback: ((status?: number) => Promise<Record<string, unknown>>) | null;
24
+ lastTokenResponse: {
25
+ extras?: {
26
+ drm_custom_data?: string;
27
+ };
28
+ [key: string]: unknown;
29
+ } | null;
30
+ fetchToken: (options: {
31
+ src: string;
32
+ }) => Promise<unknown>;
33
+ isTokenExpired: (expirationTime?: unknown) => boolean;
34
+ }
35
+ export interface DrmConfig {
36
+ emeEnabled?: boolean;
37
+ drmSystems?: Record<string, {
38
+ serverURL?: string;
39
+ [key: string]: unknown;
40
+ }>;
41
+ licenseXhrSetup?: (xhr: XMLHttpRequest, url: string) => Promise<void>;
42
+ }
43
+ export declare class DrmConfigurator {
44
+ private readonly tokenManager;
45
+ constructor(tokenManager: CDNTokenManagerInterface | null);
46
+ /**
47
+ * Build the DRM-related fields for the HLS.js constructor config.
48
+ *
49
+ * Returns an empty object when emeEnabled is not set (no DRM).
50
+ * Returns emeEnabled, drmSystems, and licenseXhrSetup when DRM is configured.
51
+ */
52
+ buildHlsConfig(engineSettings: EngineSettings): DrmConfig;
53
+ }
54
+ //# sourceMappingURL=drm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drm.d.ts","sourceRoot":"","sources":["../../../../../src/engines/drm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACnF,iBAAiB,EAAE;QAAE,MAAM,CAAC,EAAE;YAAE,eAAe,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAA;IAC3F,UAAU,EAAE,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,cAAc,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;CACtD;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAA;IAC3E,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAoBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;gBAElD,YAAY,EAAE,wBAAwB,GAAG,IAAI;IAIzD;;;;;OAKG;IACH,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,SAAS;CAqC1D"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Workaround for hls.js bug: audio-stream-controller deadlocks when
3
+ * the audio playlist has more #EXT-X-DISCONTINUITY tags than video.
4
+ * Two symptoms:
5
+ * 1. WAITING_TRACK deadlock: onAudioTrackLoaded bails when
6
+ * audio endCC > video endCC, caching data forever.
7
+ * 2. WAITING_INIT_PTS loop: audio fragments have CC values that
8
+ * the video never produces initPTS for (e.g., audio CC=4,
9
+ * video only has CC up to 2).
10
+ * Fix: remap audio fragment CC values and endCC to the video's
11
+ * CC range so both checks pass. The actual time alignment uses
12
+ * PDT (EXT-X-PROGRAM-DATE-TIME) as fallback.
13
+ * See https://github.com/video-dev/hls.js/issues/1484
14
+ *
15
+ * IMPORTANT: Must be called BEFORE driver.attachMedia() / driver.loadSource()
16
+ * (Pitfall 4: trigger is set up during construction, so patching after
17
+ * media attach may miss early events).
18
+ */
19
+ interface HlsFragment {
20
+ cc: number;
21
+ }
22
+ interface HlsFragmentHint {
23
+ cc: number;
24
+ }
25
+ interface HlsLevelDetails {
26
+ endCC: number;
27
+ fragments?: HlsFragment[];
28
+ fragmentHint?: HlsFragmentHint;
29
+ }
30
+ interface HlsLevel {
31
+ details: HlsLevelDetails;
32
+ }
33
+ interface HlsLike {
34
+ trigger: (event: string, eventObject?: unknown) => unknown;
35
+ currentLevel: number;
36
+ levels?: HlsLevel[];
37
+ }
38
+ interface HlsEvents {
39
+ AUDIO_TRACK_LOADED: string;
40
+ }
41
+ export declare function applyDiscontinuityWorkaround(driver: HlsLike, hlsEvents: HlsEvents): void;
42
+ export {};
43
+ //# sourceMappingURL=hls-discontinuity-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls-discontinuity-patch.d.ts","sourceRoot":"","sources":["../../../../../src/engines/hls-discontinuity-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAA;CACX;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;CACX;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,WAAW,EAAE,CAAA;IACzB,YAAY,CAAC,EAAE,eAAe,CAAA;CAC/B;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,eAAe,CAAA;CACzB;AAED,UAAU,OAAO;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;IAC1D,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;CACpB;AAED,UAAU,SAAS;IACjB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA2BxF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * HlsEngine — HLS playback engine.
3
+ *
4
+ * Ported from component/engines/hls.js
5
+ *
6
+ * Extends BaseEngine to bridge hls.js driver events to PlayerState.
7
+ * Uses CDN loader, CDNTokenManager, DrmConfigurator, StallWatchdog,
8
+ * retry handler, and discontinuity workaround.
9
+ *
10
+ * CRITICAL: driver instance is a private class field — NEVER stored in PlayerState.
11
+ * CRITICAL: Call applyDiscontinuityWorkaround BEFORE driver.attachMedia/loadSource (Pitfall 4).
12
+ * CRITICAL: Never call driver.startLoad() from video 'play' event handler (Pitfall 3).
13
+ */
14
+ import { BaseEngine } from './base-engine';
15
+ import { CDNTokenManager } from './cdn-token-manager';
16
+ export declare class HlsEngine extends BaseEngine {
17
+ private driver;
18
+ private tokenManager;
19
+ private autoQuality;
20
+ private eventState;
21
+ getDriver(): unknown | null;
22
+ /**
23
+ * Returns the CDN token manager used by this engine.
24
+ * Allows the snapshot handler to share the same manager (avoids duplicate token requests).
25
+ * Returns null when no token URL is configured or before init().
26
+ */
27
+ getTokenManager(): CDNTokenManager | null;
28
+ protected onAttach(): Promise<void>;
29
+ protected onDetach(): void;
30
+ protected recoverFromStall(attempt: number): void;
31
+ setQuality(index: number): void;
32
+ setAudioTrack(index: number): void;
33
+ setSubtitle(index: number): void;
34
+ setPlaybackRate(rate: number): void;
35
+ private liveSyncDisabled;
36
+ seek(time: number): void;
37
+ seekToLive(): void;
38
+ /**
39
+ * Check whether this engine was detached during an async gap.
40
+ * Used after every await in init() to prevent zombie drivers.
41
+ */
42
+ private get detached();
43
+ private init;
44
+ private registerDriverEvents;
45
+ private _onManifestLoaded;
46
+ private _onLevelLoaded;
47
+ private _onLevelSwitched;
48
+ private _onAudioTracksUpdated;
49
+ private _onAudioTrackSwitched;
50
+ private _onSubtitleTracksUpdated;
51
+ private _onSubtitleTrackSwitch;
52
+ }
53
+ //# sourceMappingURL=hls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../../../../src/engines/hls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAwJrD,qBAAa,SAAU,SAAQ,UAAU;IAEvC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,WAAW,CAAO;IAE1B,OAAO,CAAC,UAAU,CAA2B;IAE7C,SAAS,IAAI,OAAO,GAAG,IAAI;IAI3B;;;;OAIG;IACH,eAAe,IAAI,eAAe,GAAG,IAAI;cAQzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAezC,SAAS,CAAC,QAAQ,IAAI,IAAI;IAkB1B,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgBjD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKnC,OAAO,CAAC,gBAAgB,CAAQ;IAEvB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAajC,UAAU,IAAI,IAAI;IAWlB;;;OAGG;IACH,OAAO,KAAK,QAAQ,GAEnB;YAEa,IAAI;IA8QlB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,sBAAsB;CAM/B"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Engine Layer Barrel Export
3
+ *
4
+ * Public API for all engine modules.
5
+ * Import from 'eb-player/engines' or from src/engines/index.ts.
6
+ *
7
+ * Tree-shaking note: engines are separate from src/core/index.ts to keep
8
+ * streaming library integrations (hls.js, dash.js) out of the core bundle.
9
+ */
10
+ export { BaseEngine } from './base-engine';
11
+ export { HlsEngine } from './hls';
12
+ export { DashEngine } from './dash';
13
+ export { loadScript } from './cdn-loader';
14
+ export { CDNTokenManager } from './cdn-token-manager';
15
+ export { StallWatchdog } from './stall-watchdog';
16
+ export { DrmConfigurator } from './drm';
17
+ export { handleHlsRetry } from './retry/hls';
18
+ export { applyDashRetrySettings } from './retry/dash';
19
+ export { applyDiscontinuityWorkaround } from './hls-discontinuity-patch';
20
+ export { createPosterHandler } from './poster/hls';
21
+ export { createIosHandler } from './ios/hls';
22
+ export { createHlsAbrController } from './abr/hls';
23
+ export { createDashAbrRule } from './abr/dash';
24
+ export { HlsSnapshotHandler } from './snapshot/hls';
25
+ export { DashSnapshotHandler } from './snapshot/dash';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/engines/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * iOS HLS handler.
3
+ *
4
+ * Used when Hls.isSupported() returns false (native HLS on iOS Safari).
5
+ * Native video elements may not report correct duration for live streams,
6
+ * so this handler parses the HLS manifest directly to sum EXTINF durations.
7
+ *
8
+ * Fetches the master manifest, extracts the first child manifest URL,
9
+ * then polls every 5 seconds to keep duration up-to-date.
10
+ */
11
+ interface IosHandlerData {
12
+ duration?: number;
13
+ }
14
+ interface IosHandler {
15
+ data: IosHandlerData;
16
+ destroy: () => void;
17
+ }
18
+ export declare function createIosHandler(src: string): IosHandler;
19
+ export {};
20
+ //# sourceMappingURL=hls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/ios/hls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,cAAc,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CA2CxD"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Poster HLS handler.
3
+ *
4
+ * Used to play a looping HLS stream as a video poster/background.
5
+ * The Hls constructor is passed at attach-time (not imported) because
6
+ * hls.js is loaded from CDN at runtime.
7
+ */
8
+ interface HlsMediaElement {
9
+ play: () => void;
10
+ pause: () => void;
11
+ }
12
+ interface HlsInstance {
13
+ loadSource: (src: string) => void;
14
+ attachMedia: (element: HTMLElement) => void;
15
+ detachMedia?: () => void;
16
+ destroy?: () => void;
17
+ media: HlsMediaElement;
18
+ }
19
+ interface HlsConstructor {
20
+ new (): HlsInstance;
21
+ }
22
+ interface AttachOptions {
23
+ src: string;
24
+ container: HTMLElement;
25
+ Hls: HlsConstructor;
26
+ }
27
+ interface PosterHandler {
28
+ attach: (options: AttachOptions) => void;
29
+ close: () => void;
30
+ play: () => void;
31
+ pause: () => void;
32
+ }
33
+ export declare function createPosterHandler(): PosterHandler;
34
+ export {};
35
+ //# sourceMappingURL=hls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/poster/hls.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;IAC3C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,UAAU,cAAc;IACtB,QAAO,WAAW,CAAA;CACnB;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,WAAW,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;CACpB;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IACxC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CA6BnD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * DASH retry settings.
3
+ *
4
+ * Applies infinite retry configuration to the dash.js driver so that
5
+ * transient network failures (segment fetch, manifest re-fetch, etc.)
6
+ * never permanently stop playback.
7
+ */
8
+ interface DashDriverLike {
9
+ updateSettings: (settings: DashSettings) => void;
10
+ }
11
+ interface DashRetryIntervals {
12
+ MPD: number;
13
+ XLinkExpansion: number;
14
+ InitializationSegment: number;
15
+ IndexSegment: number;
16
+ MediaSegment: number;
17
+ BitstreamSwitchingSegment: number;
18
+ other: number;
19
+ lowLatencyReductionFactor: number;
20
+ }
21
+ interface DashRetryAttempts {
22
+ MPD: number;
23
+ XLinkExpansion: number;
24
+ InitializationSegment: number;
25
+ IndexSegment: number;
26
+ MediaSegment: number;
27
+ BitstreamSwitchingSegment: number;
28
+ other: number;
29
+ lowLatencyMultiplyFactor: number;
30
+ }
31
+ interface DashSettings {
32
+ streaming: {
33
+ retryIntervals?: DashRetryIntervals;
34
+ retryAttempts?: DashRetryAttempts;
35
+ };
36
+ }
37
+ export interface DashRetryOptions {
38
+ /**
39
+ * True when these settings are being applied for the intro (preroll)
40
+ * pass rather than the main stream. The intro is discarded on failure,
41
+ * so there is no value in retrying it for long — HLS gives up on the
42
+ * FIRST fatal intro error (src/engines/retry/hls.ts:88-94), so bounding
43
+ * the DASH intro to a couple of attempts is already the more forgiving
44
+ * of the two engines. Main-stream resilience (retryAttempts: Infinity)
45
+ * is untouched because the bound only applies when this flag is set.
46
+ */
47
+ introPass?: boolean;
48
+ }
49
+ export declare function applyDashRetrySettings(driver: DashDriverLike, options?: DashRetryOptions): void;
50
+ export {};
51
+ //# sourceMappingURL=dash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/retry/dash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,UAAU,cAAc;IACtB,cAAc,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CACjD;AAED,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,yBAAyB,EAAE,MAAM,CAAA;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB,EAAE,MAAM,CAAA;CAClC;AAED,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,yBAAyB,EAAE,MAAM,CAAA;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB,EAAE,MAAM,CAAA;CACjC;AAED,UAAU,YAAY;IACpB,SAAS,EAAE;QACT,cAAc,CAAC,EAAE,kBAAkB,CAAA;QACnC,aAAa,CAAC,EAAE,iBAAiB,CAAA;KAClC,CAAA;CACF;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAUD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CA8BnG"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * HLS retry handler.
3
+ *
4
+ * Registers an hlsError listener on the hls.js driver and attempts
5
+ * automatic recovery:
6
+ * - Fatal mediaError: calls recoverMediaError() after 1s
7
+ * - Fatal keySystemError: unrecoverable (e.g. no HTTPS for DRM) — no retry
8
+ * - Fatal other error (intro pass): calls onFatalNetworkError() to fall through to main
9
+ * - Fatal other error (main pass): calls startLoad() after 1s (keeps retrying)
10
+ * - Non-fatal error: re-checks after 3s; if currentTime has not advanced
11
+ * (and Chromecast is not casting), applies the same recovery
12
+ *
13
+ * Non-fatal retries are capped to prevent infinite loops (e.g. keyLoadError
14
+ * where startLoad() triggers the same failing key request repeatedly).
15
+ * After the cap is reached, further events for that error are silently ignored.
16
+ */
17
+ interface HlsDriverLike {
18
+ on: (event: string, handler: (event: string, data: HlsErrorData) => void) => void;
19
+ media: {
20
+ currentTime: number;
21
+ } | null;
22
+ recoverMediaError: () => void;
23
+ startLoad: (startPosition?: number) => void;
24
+ }
25
+ interface HlsErrorData {
26
+ fatal: boolean;
27
+ type: string;
28
+ details?: string;
29
+ }
30
+ interface EngineContext {
31
+ chromecast_casting?: boolean;
32
+ onUnrecoverableError?: (message: string) => void;
33
+ /**
34
+ * Called once when a fatal non-unrecoverable error occurs and the caller
35
+ * wants to give up rather than loop startLoad(). Intended for the intro
36
+ * pass so the player falls through to the main stream instead of retrying
37
+ * a permanently-unreachable intro manifest forever.
38
+ *
39
+ * When this callback is set, the fatal non-media/non-unrecoverable branch
40
+ * calls it and returns immediately (no startLoad loop). When absent the
41
+ * original retry-forever behavior is preserved (main stream resilience).
42
+ */
43
+ onFatalNetworkError?: (errorKey: string) => void;
44
+ }
45
+ export declare function handleHlsRetry(driver: HlsDriverLike, engine?: EngineContext): void;
46
+ export {};
47
+ //# sourceMappingURL=hls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/retry/hls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,UAAU,aAAa;IACrB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,KAAK,IAAI,CAAA;IACjF,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACrC,iBAAiB,EAAE,MAAM,IAAI,CAAA;IAC7B,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,aAAa;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACjD;AAQD,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAmFlF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * DASH Snapshot Handler
3
+ *
4
+ * Ported from component/engines/snapshot/dash.js
5
+ *
6
+ * Creates a separate dash.js MediaPlayer instance for seekbar preview thumbnails.
7
+ * The snapshot player runs in an off-screen video element and is independent
8
+ * from the main playback player.
9
+ */
10
+ interface DashPlayerInstance {
11
+ initialize: (element: HTMLVideoElement, src: string, autoplay: boolean) => void;
12
+ updateSettings: (settings: Record<string, unknown>) => void;
13
+ on: (event: string, handler: (data?: unknown) => void) => void;
14
+ off: (event: string, handler: (data?: unknown) => void) => void;
15
+ setMute: (muted: boolean) => void;
16
+ seek: (time: number) => void;
17
+ isPaused: () => boolean;
18
+ play: () => void;
19
+ pause: () => void;
20
+ reset: () => void;
21
+ }
22
+ interface DashPlayerFactory {
23
+ (): {
24
+ create: () => DashPlayerInstance;
25
+ };
26
+ events: Record<string, string>;
27
+ }
28
+ export interface DashjsForSnapshot {
29
+ MediaPlayer: DashPlayerFactory;
30
+ }
31
+ export interface SnapshotHandle {
32
+ take: (time: number) => void;
33
+ destroy: () => void;
34
+ video: HTMLVideoElement;
35
+ }
36
+ export declare class DashSnapshotHandler {
37
+ private readonly src;
38
+ private player;
39
+ private offscreenVideo;
40
+ private ready;
41
+ constructor(src: string);
42
+ /**
43
+ * Initialise the snapshot player using the provided dashjs constructor.
44
+ * Resolves with a SnapshotHandle once STREAM_INITIALIZED fires.
45
+ * If initialisation fails, resolves with a no-op handle.
46
+ */
47
+ init(dashjs: DashjsForSnapshot): Promise<SnapshotHandle>;
48
+ /**
49
+ * Reset and destroy the snapshot player and remove the off-screen video element.
50
+ */
51
+ destroy(): void;
52
+ private cleanup;
53
+ }
54
+ export {};
55
+ //# sourceMappingURL=dash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/snapshot/dash.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,UAAU,kBAAkB;IAC1B,UAAU,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/E,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC3D,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAA;IAC9D,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAA;IAC/D,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACjC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,QAAQ,EAAE,MAAM,OAAO,CAAA;IACvB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,UAAU,iBAAiB;IACzB,IAAI;QAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;KAAE,CAAA;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,EAAE,gBAAgB,CAAA;CACxB;AAMD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,KAAK,CAAiB;gBAElB,GAAG,EAAE,MAAM;IAIvB;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAiFxD;;OAEG;IACH,OAAO,IAAI,IAAI;IAcf,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * HLS Snapshot Handler.
3
+ *
4
+ * Ported from component/engines/snapshot/hls.js (102 LOC).
5
+ *
6
+ * Creates a separate Hls instance for seekbar thumbnail preview rendering.
7
+ * The snapshot instance runs independently from the main playback engine with
8
+ * its own off-screen video element and low-buffer settings.
9
+ *
10
+ * Token injection (Pitfall 6): tokenManager is captured via closure,
11
+ * not stored on `this`, to avoid binding issues inside pLoader.
12
+ */
13
+ import type { CDNTokenManager } from '../cdn-token-manager';
14
+ interface SnapshotLoaderContext {
15
+ url: string;
16
+ }
17
+ interface SnapshotLoaderCallbacks {
18
+ onSuccess: (response: unknown, stats: unknown, context: unknown) => void;
19
+ onError: (error: unknown, context: unknown, response: unknown) => void;
20
+ onTimeout: (stats: unknown, context: unknown, response: unknown) => void;
21
+ }
22
+ interface SnapshotLoaderConfig {
23
+ [key: string]: unknown;
24
+ }
25
+ interface SnapshotHlsLoaderClass {
26
+ new (config: SnapshotLoaderConfig): {
27
+ load: (context: SnapshotLoaderContext, config: SnapshotLoaderConfig, callbacks: SnapshotLoaderCallbacks) => void;
28
+ };
29
+ }
30
+ interface SnapshotHlsDriverConfig {
31
+ startLevel?: number;
32
+ enableWebVTT?: boolean;
33
+ maxBufferLength?: number;
34
+ pLoader?: SnapshotHlsLoaderClass;
35
+ [key: string]: unknown;
36
+ }
37
+ interface SnapshotHlsEvents {
38
+ MANIFEST_LOADED: string;
39
+ [key: string]: string;
40
+ }
41
+ interface SnapshotHlsInstance {
42
+ on: (event: string, handler: (...args: unknown[]) => void) => void;
43
+ once: (event: string, handler: (...args: unknown[]) => void) => void;
44
+ trigger: (event: string, data?: unknown) => unknown;
45
+ loadSource: (src: string) => void;
46
+ attachMedia: (element: HTMLVideoElement) => void;
47
+ detachMedia: () => void;
48
+ destroy: () => void;
49
+ [key: string]: unknown;
50
+ }
51
+ interface SnapshotHlsConstructor {
52
+ new (config?: SnapshotHlsDriverConfig): SnapshotHlsInstance;
53
+ isSupported: () => boolean;
54
+ Events: SnapshotHlsEvents;
55
+ DefaultConfig: {
56
+ loader: SnapshotHlsLoaderClass;
57
+ [key: string]: unknown;
58
+ };
59
+ [key: string]: unknown;
60
+ }
61
+ export interface SnapshotConfig {
62
+ src?: string;
63
+ engineSettings?: {
64
+ extraParamsCallback?: ((status?: number | string) => Promise<Record<string, unknown>> | Record<string, unknown>) | null;
65
+ onCDNTokenError?: ((error: {
66
+ status: number | string;
67
+ errorCode: string;
68
+ errorType: string;
69
+ }) => void) | null;
70
+ [key: string]: unknown;
71
+ };
72
+ [key: string]: unknown;
73
+ }
74
+ export declare class HlsSnapshotHandler {
75
+ private readonly config;
76
+ private readonly tokenManager;
77
+ private driver;
78
+ private offscreenVideo;
79
+ private throttleTimeout;
80
+ private pendingSeekTime;
81
+ constructor(config: SnapshotConfig, tokenManager: CDNTokenManager | null);
82
+ /**
83
+ * Initialize the snapshot Hls instance using the CDN-loaded Hls constructor.
84
+ * Creates a separate Hls instance with minimal buffering for thumbnail generation.
85
+ *
86
+ * Returns a promise that resolves once the manifest is loaded and the snapshot
87
+ * handler is ready to serve seek thumbnails — matching the legacy Vue 2 behaviour
88
+ * where the handler only resolved after MANIFEST_LOADED.
89
+ */
90
+ init(HlsConstructor: SnapshotHlsConstructor): Promise<void>;
91
+ /**
92
+ * Seek the snapshot player to the specified time.
93
+ * Throttled to avoid excessive seeks (250ms minimum interval).
94
+ */
95
+ take(time: number): void;
96
+ private applyPendingSeek;
97
+ /**
98
+ * Returns the off-screen video element used for thumbnail rendering.
99
+ * The seekbar displays this element in the tooltip to show preview frames.
100
+ */
101
+ getVideo(): HTMLVideoElement | null;
102
+ /**
103
+ * Stop manifest refreshes (and thus CDN token requests) while the main player is paused.
104
+ * For live streams, the snapshot hls.js instance continuously refreshes the manifest
105
+ * on the playlist interval — this prevents unnecessary generate calls during pause.
106
+ */
107
+ stopLoad(): void;
108
+ /**
109
+ * Resume manifest refreshes when the main player resumes playback.
110
+ */
111
+ startLoad(): void;
112
+ /**
113
+ * Destroy the snapshot Hls instance and clean up resources.
114
+ */
115
+ destroy(): void;
116
+ }
117
+ export {};
118
+ //# sourceMappingURL=hls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../../../../../src/engines/snapshot/hls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAO3D,UAAU,qBAAqB;IAC7B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,UAAU,uBAAuB;IAC/B,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACxE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACtE,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;CACzE;AAED,UAAU,oBAAoB;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,sBAAsB;IAC9B,KAAK,MAAM,EAAE,oBAAoB,GAAG;QAClC,IAAI,EAAE,CACJ,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,uBAAuB,KAC/B,IAAI,CAAA;KACV,CAAA;CACF;AAED,UAAU,uBAAuB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,iBAAiB;IACzB,eAAe,EAAE,MAAM,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB;AAED,UAAU,mBAAmB;IAC3B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IAClE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAA;IACpE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;IACnD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,WAAW,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAChD,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,sBAAsB;IAC9B,KAAK,MAAM,CAAC,EAAE,uBAAuB,GAAG,mBAAmB,CAAA;IAC3D,WAAW,EAAE,MAAM,OAAO,CAAA;IAC1B,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE;QACb,MAAM,EAAE,sBAAsB,CAAA;QAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE;QACf,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,CAAA;QACvH,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;QAC7G,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAMD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,eAAe,CAAY;gBAEvB,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,GAAG,IAAI;IAKxE;;;;;;;OAOG;IACH,IAAI,CAAC,cAAc,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsF3D;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxB,OAAO,CAAC,gBAAgB;IAOxB;;;OAGG;IACH,QAAQ,IAAI,gBAAgB,GAAG,IAAI;IAInC;;;;OAIG;IACH,QAAQ,IAAI,IAAI;IAMhB;;OAEG;IACH,SAAS,IAAI,IAAI;IAMjB;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBhB"}