eb-player 2.0.20 → 2.1.0

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 (153) hide show
  1. package/dist/build/ebplayer.bundle.js +767 -140
  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 +195 -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 +100 -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/segment-token-loader.d.ts +117 -0
  56. package/dist/build/types/src/engines/segment-token-loader.d.ts.map +1 -0
  57. package/dist/build/types/src/engines/snapshot/dash.d.ts +55 -0
  58. package/dist/build/types/src/engines/snapshot/dash.d.ts.map +1 -0
  59. package/dist/build/types/src/engines/snapshot/hls.d.ts +106 -0
  60. package/dist/build/types/src/engines/snapshot/hls.d.ts.map +1 -0
  61. package/dist/build/types/src/engines/stall-watchdog.d.ts +41 -0
  62. package/dist/build/types/src/engines/stall-watchdog.d.ts.map +1 -0
  63. package/dist/build/types/src/integrations/ads-manager.d.ts +79 -0
  64. package/dist/build/types/src/integrations/ads-manager.d.ts.map +1 -0
  65. package/dist/build/types/src/integrations/chromecast-manager.d.ts +50 -0
  66. package/dist/build/types/src/integrations/chromecast-manager.d.ts.map +1 -0
  67. package/dist/build/types/src/integrations/epg-manager.d.ts +22 -0
  68. package/dist/build/types/src/integrations/epg-manager.d.ts.map +1 -0
  69. package/dist/build/types/src/integrations/index.d.ts +7 -0
  70. package/dist/build/types/src/integrations/index.d.ts.map +1 -0
  71. package/dist/build/types/src/integrations/intro-stream-manager.d.ts +62 -0
  72. package/dist/build/types/src/integrations/intro-stream-manager.d.ts.map +1 -0
  73. package/dist/build/types/src/integrations/p2p-manager.d.ts +42 -0
  74. package/dist/build/types/src/integrations/p2p-manager.d.ts.map +1 -0
  75. package/dist/build/types/src/integrations/playlist-manager.d.ts +21 -0
  76. package/dist/build/types/src/integrations/playlist-manager.d.ts.map +1 -0
  77. package/dist/build/types/src/skin/bars/bottom-bar.d.ts +16 -0
  78. package/dist/build/types/src/skin/bars/bottom-bar.d.ts.map +1 -0
  79. package/dist/build/types/src/skin/bars/middle-bar.d.ts +16 -0
  80. package/dist/build/types/src/skin/bars/middle-bar.d.ts.map +1 -0
  81. package/dist/build/types/src/skin/bars/top-bar.d.ts +15 -0
  82. package/dist/build/types/src/skin/bars/top-bar.d.ts.map +1 -0
  83. package/dist/build/types/src/skin/base-component.d.ts +69 -0
  84. package/dist/build/types/src/skin/base-component.d.ts.map +1 -0
  85. package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts +15 -0
  86. package/dist/build/types/src/skin/brand/forja-playlist-bar.d.ts.map +1 -0
  87. package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts +16 -0
  88. package/dist/build/types/src/skin/brand/snrt-radio-carousel.d.ts.map +1 -0
  89. package/dist/build/types/src/skin/component-registry.d.ts +16 -0
  90. package/dist/build/types/src/skin/component-registry.d.ts.map +1 -0
  91. package/dist/build/types/src/skin/controllers/auto-hide.d.ts +27 -0
  92. package/dist/build/types/src/skin/controllers/auto-hide.d.ts.map +1 -0
  93. package/dist/build/types/src/skin/controllers/keyboard.d.ts +29 -0
  94. package/dist/build/types/src/skin/controllers/keyboard.d.ts.map +1 -0
  95. package/dist/build/types/src/skin/controls/cast-button.d.ts +15 -0
  96. package/dist/build/types/src/skin/controls/cast-button.d.ts.map +1 -0
  97. package/dist/build/types/src/skin/controls/channel-name.d.ts +16 -0
  98. package/dist/build/types/src/skin/controls/channel-name.d.ts.map +1 -0
  99. package/dist/build/types/src/skin/controls/forward-button.d.ts +15 -0
  100. package/dist/build/types/src/skin/controls/forward-button.d.ts.map +1 -0
  101. package/dist/build/types/src/skin/controls/fullscreen-button.d.ts +30 -0
  102. package/dist/build/types/src/skin/controls/fullscreen-button.d.ts.map +1 -0
  103. package/dist/build/types/src/skin/controls/info-button.d.ts +10 -0
  104. package/dist/build/types/src/skin/controls/info-button.d.ts.map +1 -0
  105. package/dist/build/types/src/skin/controls/live-sync-button.d.ts +20 -0
  106. package/dist/build/types/src/skin/controls/live-sync-button.d.ts.map +1 -0
  107. package/dist/build/types/src/skin/controls/pip-button.d.ts +21 -0
  108. package/dist/build/types/src/skin/controls/pip-button.d.ts.map +1 -0
  109. package/dist/build/types/src/skin/controls/play-pause-button.d.ts +14 -0
  110. package/dist/build/types/src/skin/controls/play-pause-button.d.ts.map +1 -0
  111. package/dist/build/types/src/skin/controls/rewind-button.d.ts +15 -0
  112. package/dist/build/types/src/skin/controls/rewind-button.d.ts.map +1 -0
  113. package/dist/build/types/src/skin/controls/seekbar.d.ts +48 -0
  114. package/dist/build/types/src/skin/controls/seekbar.d.ts.map +1 -0
  115. package/dist/build/types/src/skin/controls/settings-panel.d.ts +53 -0
  116. package/dist/build/types/src/skin/controls/settings-panel.d.ts.map +1 -0
  117. package/dist/build/types/src/skin/controls/share-button.d.ts +11 -0
  118. package/dist/build/types/src/skin/controls/share-button.d.ts.map +1 -0
  119. package/dist/build/types/src/skin/controls/time-display.d.ts +19 -0
  120. package/dist/build/types/src/skin/controls/time-display.d.ts.map +1 -0
  121. package/dist/build/types/src/skin/controls/volume-control.d.ts +21 -0
  122. package/dist/build/types/src/skin/controls/volume-control.d.ts.map +1 -0
  123. package/dist/build/types/src/skin/icons/icons-modern.d.ts +10 -0
  124. package/dist/build/types/src/skin/icons/icons-modern.d.ts.map +1 -0
  125. package/dist/build/types/src/skin/icons/icons.d.ts +10 -0
  126. package/dist/build/types/src/skin/icons/icons.d.ts.map +1 -0
  127. package/dist/build/types/src/skin/icons/sprite.d.ts +39 -0
  128. package/dist/build/types/src/skin/icons/sprite.d.ts.map +1 -0
  129. package/dist/build/types/src/skin/index.d.ts +24 -0
  130. package/dist/build/types/src/skin/index.d.ts.map +1 -0
  131. package/dist/build/types/src/skin/overlays/error-message.d.ts +14 -0
  132. package/dist/build/types/src/skin/overlays/error-message.d.ts.map +1 -0
  133. package/dist/build/types/src/skin/overlays/info-overlay.d.ts +15 -0
  134. package/dist/build/types/src/skin/overlays/info-overlay.d.ts.map +1 -0
  135. package/dist/build/types/src/skin/overlays/loading-spinner.d.ts +17 -0
  136. package/dist/build/types/src/skin/overlays/loading-spinner.d.ts.map +1 -0
  137. package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts +39 -0
  138. package/dist/build/types/src/skin/overlays/preroll-overlay.d.ts.map +1 -0
  139. package/dist/build/types/src/skin/overlays/socials-overlay.d.ts +17 -0
  140. package/dist/build/types/src/skin/overlays/socials-overlay.d.ts.map +1 -0
  141. package/dist/build/types/src/skin/overlays/toast-notification.d.ts +18 -0
  142. package/dist/build/types/src/skin/overlays/toast-notification.d.ts.map +1 -0
  143. package/dist/build/types/src/skin/skin-root.d.ts +88 -0
  144. package/dist/build/types/src/skin/skin-root.d.ts.map +1 -0
  145. package/dist/build/types/src/utils/chapters.d.ts +16 -0
  146. package/dist/build/types/src/utils/chapters.d.ts.map +1 -0
  147. package/dist/build/types/src/utils/format-duration.d.ts +9 -0
  148. package/dist/build/types/src/utils/format-duration.d.ts.map +1 -0
  149. package/dist/build/types/src/utils/format-wall-clock.d.ts +6 -0
  150. package/dist/build/types/src/utils/format-wall-clock.d.ts.map +1 -0
  151. package/dist/build/types/src/utils/settings-helpers.d.ts +41 -0
  152. package/dist/build/types/src/utils/settings-helpers.d.ts.map +1 -0
  153. package/package.json +34 -33
@@ -0,0 +1,100 @@
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 the CDN loader and StallWatchdog, plus DASH retry settings and ABR rules.
8
+ *
9
+ * CDN token signing (manifests and segments alike) is HLS-only by design —
10
+ * this engine has no `CDNTokenManager` integration at all (Phase 08.1 / D-05).
11
+ * DASH segments are `.m4s`, so nothing written for HLS's fragment-loader
12
+ * token signing should be assumed to generalise here.
13
+ *
14
+ * CRITICAL: driver instance is a private class field — NEVER stored in PlayerState.
15
+ */
16
+ import { BaseEngine } from './base-engine';
17
+ import type { PlayerConfig } from '../core/config';
18
+ import type { TypedEventBus } from '../core/event-bus';
19
+ interface BitrateInfo {
20
+ height: number;
21
+ width: number;
22
+ bitrate: number;
23
+ qualityIndex: number;
24
+ }
25
+ interface MediaTrack {
26
+ id?: string | number;
27
+ index?: number;
28
+ lang?: string;
29
+ [key: string]: unknown;
30
+ }
31
+ interface DashPlayerInstance {
32
+ initialize: (element: HTMLVideoElement, src: string, autoplay?: boolean) => void;
33
+ on: (event: string, handler: (data?: unknown) => void) => void;
34
+ off: (event: string, handler: (data?: unknown) => void) => void;
35
+ getTracksFor: (type: string) => MediaTrack[];
36
+ getBitrateInfoListFor: (type: string) => BitrateInfo[];
37
+ getQualityFor: (type: string) => number;
38
+ setQualityFor: (type: string, index: number) => void;
39
+ setCurrentTrack: (track: MediaTrack) => void;
40
+ getCurrentLiveLatency: () => number;
41
+ time: () => number;
42
+ duration: () => number;
43
+ updateSettings: (settings: Record<string, unknown>) => void;
44
+ addABRCustomRule: (ruleType: string, ruleName: string, rule: unknown) => void;
45
+ refreshManifest: () => void;
46
+ reset: () => void;
47
+ destroy: () => void;
48
+ seek: (time: number) => void;
49
+ [key: string]: unknown;
50
+ }
51
+ interface DashPlayerConstructor {
52
+ (): {
53
+ create: () => DashPlayerInstance;
54
+ };
55
+ events: Record<string, string>;
56
+ }
57
+ export interface DashjsType {
58
+ MediaPlayer: DashPlayerConstructor;
59
+ FactoryMaker: {
60
+ getClassFactoryByName: (name: string) => unknown;
61
+ getSingletonFactoryByName: (name: string) => unknown;
62
+ getClassFactory: (fn: unknown) => unknown;
63
+ };
64
+ }
65
+ export declare class DashEngine extends BaseEngine {
66
+ private driver;
67
+ private dvrErrorHandler;
68
+ private isIntroPass;
69
+ private introFallThroughReported;
70
+ getDriver(): unknown | null;
71
+ setConfig(config: PlayerConfig): void;
72
+ setBus(bus: TypedEventBus): void;
73
+ setVideo(video: HTMLVideoElement): void;
74
+ protected onAttach(): Promise<void>;
75
+ protected onDetach(): void;
76
+ protected recoverFromStall(attempt: number): void;
77
+ setQuality(index: number): void;
78
+ setAudioTrack(index: number): void;
79
+ setSubtitle(index: number): void;
80
+ setPlaybackRate(rate: number): void;
81
+ seekToLive(): void;
82
+ private init;
83
+ private registerDriverEvents;
84
+ /**
85
+ * Handles a dash.js ERROR event.
86
+ *
87
+ * D-04 / G-07-10: always logs, exactly as before (test/engines/dash.test.ts:619
88
+ * and :1156 assert this unchanged). On the intro pass only — gated by
89
+ * this.isIntroPass, computed once in init() from
90
+ * `Boolean(config.preroll) && this.loadSourceUrl === config.preroll` — a fatal
91
+ * manifest/segment error stops the stall watchdog and emits `error-fatal`
92
+ * exactly once (guarded by introFallThroughReported) so
93
+ * IntroStreamManager.complete() can fire and openMainStream() run instead of
94
+ * the watchdog reopening the (still intro) lastSrc in a loop. On the main
95
+ * pass this method only warns — main-stream resilience must stay untouched.
96
+ */
97
+ private handleDriverError;
98
+ }
99
+ export {};
100
+ //# 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;AA2JrD,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;IAyRlB,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,117 @@
1
+ /**
2
+ * Segment (fragment) CDN token signing — shared primitive.
3
+ *
4
+ * Extends CDN token signing from manifests to segments, behind an opt-in flag
5
+ * (`EngineSettings.signSegmentsWithCdnToken`). Each segment is signed with the
6
+ * grant carried by its OWN parent playlist — read from `context.frag.baseurl`,
7
+ * the object hls.js itself parsed that fragment from — never from any store,
8
+ * cache, or shared manager state. This makes cross-rendition mis-signing
9
+ * structurally impossible rather than merely unlikely.
10
+ *
11
+ * CRITICAL: this module must never acquire or refresh a token. It only reads
12
+ * data already present on the fragment context handed to it by hls.js. Any
13
+ * acquisition call here would reintroduce the single-slot cache reuse in
14
+ * `CDNTokenManager.lastTokenResponse`, which hands one rendition's grant to
15
+ * another — the exact failure this design forbids.
16
+ *
17
+ * Token expiry model (CDN-04, D-07): a segment carries whatever grant its
18
+ * parent playlist carried when hls.js parsed it. Live playlists reload on
19
+ * their own cadence, so their fragments pick up refreshed grants with no
20
+ * refresh machinery here — reload IS the refresh path. VOD playlists are
21
+ * parsed exactly once by hls.js 1.6.10 (its level controller only
22
+ * (re)requests a playlist it has none of, or one that is live), so a VOD
23
+ * asset's segment grants are frozen at first parse for the asset's entire
24
+ * duration. If a token's lifetime is shorter than the asset's duration, later
25
+ * segments will be rejected by the edge and surface through the existing
26
+ * error/retry path. This is an accepted operational constraint — the token
27
+ * service's lifetime must exceed the longest VOD asset — not an oversight;
28
+ * D-07 chose reload-cadence refresh and CONTEXT.md defers a proactive
29
+ * near-expiry refresh path with a named revisit condition (a real asset shown
30
+ * to outlive its grant). No timer, interval, or scheduled re-fetch belongs in
31
+ * this module.
32
+ */
33
+ import type { TokenType } from './cdn-token-manager';
34
+ export interface SegmentLoaderFrag {
35
+ baseurl?: string;
36
+ }
37
+ export interface SegmentLoaderContext {
38
+ url: string;
39
+ frag?: SegmentLoaderFrag;
40
+ }
41
+ /**
42
+ * Structural shape of hls.js's `LoaderStats`, the 4th argument its own
43
+ * `FragmentLoader`-wired `onError` closure reads. Only the fields this
44
+ * module needs to construct a well-formed (all-zero) stats object for the
45
+ * fail-loud path below — narrowed the same way the rest of this module's
46
+ * types are narrowed from the real hls.js 1.6.10 interfaces.
47
+ */
48
+ export interface SegmentLoaderStats {
49
+ aborted: boolean;
50
+ loaded: number;
51
+ total: number;
52
+ retry: number;
53
+ chunkCount: number;
54
+ bwEstimate: number;
55
+ loading: {
56
+ start: number;
57
+ first: number;
58
+ end: number;
59
+ };
60
+ parsing: {
61
+ start: number;
62
+ end: number;
63
+ };
64
+ buffering: {
65
+ start: number;
66
+ first: number;
67
+ end: number;
68
+ };
69
+ }
70
+ export interface SegmentLoaderCallbacks {
71
+ onSuccess: (response: unknown, stats: unknown, context: unknown) => void;
72
+ onError: (error: unknown, context: unknown, response: unknown, stats: SegmentLoaderStats) => void;
73
+ onTimeout: (stats: unknown, context: unknown, response: unknown) => void;
74
+ }
75
+ export interface SegmentLoaderConfig {
76
+ [key: string]: unknown;
77
+ }
78
+ export interface SegmentLoaderClass {
79
+ new (config: SegmentLoaderConfig): {
80
+ load: (context: SegmentLoaderContext, config: SegmentLoaderConfig, callbacks: SegmentLoaderCallbacks) => void;
81
+ };
82
+ }
83
+ /**
84
+ * The only thing the loader reads from the token manager: its readonly token
85
+ * type. Kept structural (not an import of the class) so both engines and both
86
+ * test suites can satisfy it without constructing a real manager.
87
+ */
88
+ export interface SegmentSigningTokenSource {
89
+ readonly tokenType: TokenType | undefined;
90
+ }
91
+ export declare const SEGMENT_SIGNING_TOKEN_TYPES: readonly TokenType[];
92
+ /**
93
+ * Builds the single diagnostic string used for every unsupported-token-type
94
+ * case. Names the flag and the offending token type (or says none is
95
+ * configured) and lists the supported ones. Never includes a token value.
96
+ */
97
+ export declare function segmentSigningUnsupportedMessage(tokenType: TokenType | undefined): string;
98
+ /**
99
+ * Pure transfer: reads `token`, `expires` and `token_path` off the parent
100
+ * playlist URL's query string and reapplies them to the segment URL via the
101
+ * same static primitive that signs manifests, so a signed segment URL is
102
+ * shaped exactly like a signed manifest URL. Returns the segment URL
103
+ * unchanged when the playlist carries no token, or when either URL cannot be
104
+ * parsed (a thrown exception inside a loader is a dead player, not a signing
105
+ * failure).
106
+ */
107
+ export declare function signSegmentUrlFromPlaylist(segmentUrl: string, parentPlaylistUrl: string): string;
108
+ /**
109
+ * Returns a loader class extending `BaseLoader`, built exactly like the
110
+ * existing playlist loader: call `super()`, bind the inherited `load`, then
111
+ * assign an own `load` property that reads `context.frag?.baseurl`.
112
+ *
113
+ * `tokenSource` is captured by closure — never stored on `this` and never
114
+ * used to acquire or refresh a token.
115
+ */
116
+ export declare function createSegmentTokenLoaderClass(BaseLoader: SegmentLoaderClass, tokenSource: SegmentSigningTokenSource): SegmentLoaderClass;
117
+ //# sourceMappingURL=segment-token-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-token-loader.d.ts","sourceRoot":"","sources":["../../../../../src/engines/segment-token-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAOpD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,iBAAiB,CAAA;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CACzD;AAED,MAAM,WAAW,sBAAsB;IACrC,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,EAAE,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACjG,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;CACzE;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,MAAM,EAAE,mBAAmB,GAAG;QACjC,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,sBAAsB,KAAK,IAAI,CAAA;KAC9G,CAAA;CACF;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAA;CAC1C;AAQD,eAAO,MAAM,2BAA2B,EAAE,SAAS,SAAS,EAI1D,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAIzF;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAahG;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,yBAAyB,GACrC,kBAAkB,CAgDpB"}
@@ -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