eb-player 2.0.6 → 2.0.8

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.
@@ -4,7 +4,7 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.EBPlayer = {}));
5
5
  })(this, (function (exports) { 'use strict';
6
6
 
7
- var __EB_PLAYER_VERSION__ = "2.0.6";
7
+ var __EB_PLAYER_VERSION__ = "2.0.7";
8
8
 
9
9
  /**
10
10
  * Finite State Machine for player playback state transitions.
@@ -4284,6 +4284,15 @@
4284
4284
  video.addEventListener('ended', () => {
4285
4285
  state.playbackState = 'ended';
4286
4286
  }, { signal });
4287
+ // Safety net: clear stale 'buffering' state when playback is clearly advancing.
4288
+ // In some edge cases (live stream segment boundaries), the browser fires 'waiting'
4289
+ // but never fires 'playing' even though video resumes from buffer. The timeupdate
4290
+ // event fires reliably while time advances, so we use it to recover.
4291
+ video.addEventListener('timeupdate', () => {
4292
+ if (state.playbackState === 'buffering' && !video.paused && video.readyState >= 3) {
4293
+ state.playbackState = 'playing';
4294
+ }
4295
+ }, { signal });
4287
4296
  }
4288
4297
  /**
4289
4298
  * Seek to a specific time. Default implementation sets video.currentTime.
@@ -5112,6 +5121,14 @@
5112
5121
  getDriver() {
5113
5122
  return this.driver;
5114
5123
  }
5124
+ /**
5125
+ * Returns the CDN token manager used by this engine.
5126
+ * Allows the snapshot handler to share the same manager (avoids duplicate token requests).
5127
+ * Returns null when no token URL is configured or before init().
5128
+ */
5129
+ getTokenManager() {
5130
+ return this.tokenManager;
5131
+ }
5115
5132
  // -------------------------------------------------------------------------
5116
5133
  // BaseEngine hooks
5117
5134
  // -------------------------------------------------------------------------
@@ -6366,30 +6383,14 @@
6366
6383
  else {
6367
6384
  const win = window;
6368
6385
  if (win.Hls) {
6369
- // Create a dedicated token manager for the snapshot handler (DRM license + manifest tokens)
6370
- let snapshotTokenManager = null;
6371
- if (mergedConfig.token) {
6372
- snapshotTokenManager = new CDNTokenManager({
6373
- token: mergedConfig.token,
6374
- tokenType: mergedConfig.tokenType,
6375
- srcInTokenRequest: mergedConfig.srcInTokenRequest,
6376
- extraParamsCallback: (mergedConfig.engineSettings.extraParamsCallback ?? mergedConfig.extraParamsCallback),
6377
- onCDNTokenError: mergedConfig.engineSettings.onCDNTokenError
6378
- });
6379
- }
6386
+ // Share the main engine's token manager with the snapshot handler
6387
+ // to avoid duplicate token requests (one CDNTokenManager per player instance)
6388
+ const sharedTokenManager = engine.getTokenManager();
6380
6389
  // Build DRM config (emeEnabled, drmSystems, licenseXhrSetup) for the snapshot hls.js instance
6381
- const snapshotDrmConfigurator = new DrmConfigurator(snapshotTokenManager);
6390
+ const snapshotDrmConfigurator = new DrmConfigurator(sharedTokenManager);
6382
6391
  const snapshotDrmConfig = snapshotDrmConfigurator.buildHlsConfig(mergedConfig.engineSettings);
6383
- const handler = new HlsSnapshotHandler({ src, engineSettings: { ...mergedConfig.engineSettings, ...snapshotDrmConfig } }, snapshotTokenManager);
6384
- // Fetch initial token before init (needed for manifest request)
6385
- const tokenReady = snapshotTokenManager && src
6386
- ? snapshotTokenManager.fetchToken({ src }).catch((error) => {
6387
- console.warn('EBPlayer: Snapshot token fetch failed:', error);
6388
- })
6389
- : Promise.resolve();
6390
- tokenReady.then(() => {
6391
- return handler.init(win.Hls);
6392
- })
6392
+ const handler = new HlsSnapshotHandler({ src, engineSettings: { ...mergedConfig.engineSettings, ...snapshotDrmConfig } }, sharedTokenManager);
6393
+ handler.init(win.Hls)
6393
6394
  .then(() => {
6394
6395
  activeSnapshotDestroy = () => handler.destroy();
6395
6396
  const snapshotVideo = handler.getVideo();
@@ -6446,9 +6447,22 @@
6446
6447
  }, 100);
6447
6448
  });
6448
6449
  // Auto-open the stream if src is provided in config (matches legacy player behaviour
6449
- // where consumers call start({ src: '...' }) and expect playback to begin immediately)
6450
+ // where consumers call start({ src: '...' }) and expect playback to begin immediately).
6451
+ // When autoplay is false, defer open() until the user requests play — this avoids
6452
+ // fetching CDN tokens and loading manifests before playback is actually needed.
6450
6453
  if (mergedConfig.src) {
6451
- reference.open(mergedConfig.src);
6454
+ if (mergedConfig.autoplay) {
6455
+ reference.open(mergedConfig.src);
6456
+ }
6457
+ else {
6458
+ let deferredOpen = true;
6459
+ controller.bus.on('play', () => {
6460
+ if (deferredOpen) {
6461
+ deferredOpen = false;
6462
+ reference.open(mergedConfig.src);
6463
+ }
6464
+ }, { signal: controller.signal });
6465
+ }
6452
6466
  }
6453
6467
  return reference;
6454
6468
  }