rx-player 3.28.1-dev.2022083000 → 3.29.0-dev.2022090500

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 (139) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/VERSION +1 -1
  3. package/dist/_esm5.processed/compat/event_listeners.d.ts +18 -2
  4. package/dist/_esm5.processed/compat/event_listeners.js +64 -2
  5. package/dist/_esm5.processed/compat/on_height_width_change.d.ts +5 -4
  6. package/dist/_esm5.processed/compat/on_height_width_change.js +43 -34
  7. package/dist/_esm5.processed/core/api/playback_observer.d.ts +12 -2
  8. package/dist/_esm5.processed/core/api/playback_observer.js +27 -12
  9. package/dist/_esm5.processed/core/api/public_api.js +14 -14
  10. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +7 -0
  11. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +10 -2
  12. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  13. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +10 -4
  14. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +7 -0
  15. package/dist/_esm5.processed/core/init/initialize_directfile.js +1 -1
  16. package/dist/_esm5.processed/core/init/load_on_media_source.js +1 -1
  17. package/dist/_esm5.processed/core/init/stall_avoider.d.ts +4 -2
  18. package/dist/_esm5.processed/core/init/stall_avoider.js +32 -26
  19. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +12 -6
  20. package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +142 -78
  21. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -16
  22. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +53 -41
  23. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +6 -5
  24. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +37 -39
  25. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +23 -22
  26. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +84 -72
  27. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +6 -12
  28. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +33 -43
  29. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +12 -9
  30. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +7 -6
  31. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +17 -10
  32. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +20 -9
  33. package/dist/_esm5.processed/core/stream/period/period_stream.js +25 -14
  34. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.d.ts +4 -7
  35. package/dist/_esm5.processed/core/stream/representation/append_segment_to_buffer.js +80 -23
  36. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.d.ts +5 -4
  37. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +78 -26
  38. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +7 -3
  39. package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +7 -1
  40. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +7 -1
  41. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -8
  42. package/dist/_esm5.processed/default_config.js +1 -1
  43. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +3 -2
  44. package/dist/_esm5.processed/errors/custom_loader_error.js +3 -2
  45. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.js +5 -2
  46. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.js +5 -2
  47. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +9 -2
  48. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +3 -1
  49. package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +4 -3
  50. package/dist/_esm5.processed/public_types.d.ts +22 -3
  51. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -2
  52. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +3 -2
  53. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -1
  54. package/dist/_esm5.processed/transports/dash/init_segment_loader.d.ts +3 -2
  55. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +12 -6
  56. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.d.ts +3 -2
  57. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +3 -2
  58. package/dist/_esm5.processed/transports/dash/manifest_parser.js +6 -2
  59. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +3 -2
  60. package/dist/_esm5.processed/transports/dash/segment_loader.js +12 -9
  61. package/dist/_esm5.processed/transports/dash/text_loader.js +6 -3
  62. package/dist/_esm5.processed/transports/local/pipelines.d.ts +2 -2
  63. package/dist/_esm5.processed/transports/local/pipelines.js +6 -6
  64. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +3 -2
  65. package/dist/_esm5.processed/transports/local/segment_loader.js +4 -3
  66. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +2 -2
  67. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +5 -2
  68. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +15 -10
  69. package/dist/_esm5.processed/transports/smooth/pipelines.d.ts +1 -1
  70. package/dist/_esm5.processed/transports/smooth/pipelines.js +18 -14
  71. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +2 -2
  72. package/dist/_esm5.processed/transports/smooth/segment_loader.js +8 -6
  73. package/dist/_esm5.processed/transports/types.d.ts +25 -2
  74. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.d.ts +2 -2
  75. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  76. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +2 -2
  77. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +9 -6
  78. package/dist/_esm5.processed/utils/request/fetch.js +7 -8
  79. package/dist/_esm5.processed/utils/request/xhr.d.ts +1 -1
  80. package/dist/_esm5.processed/utils/request/xhr.js +28 -14
  81. package/dist/_esm5.processed/utils/task_canceller.d.ts +1 -2
  82. package/dist/_esm5.processed/utils/task_canceller.js +1 -2
  83. package/dist/mpd-parser.wasm +0 -0
  84. package/dist/rx-player.js +1116 -695
  85. package/dist/rx-player.min.js +1 -1
  86. package/package.json +7 -7
  87. package/sonar-project.properties +1 -1
  88. package/src/compat/event_listeners.ts +86 -1
  89. package/src/compat/on_height_width_change.ts +48 -49
  90. package/src/core/api/playback_observer.ts +34 -14
  91. package/src/core/api/public_api.ts +23 -18
  92. package/src/core/fetchers/manifest/manifest_fetcher.ts +20 -2
  93. package/src/core/fetchers/segment/segment_fetcher.ts +23 -3
  94. package/src/core/fetchers/segment/segment_fetcher_creator.ts +7 -0
  95. package/src/core/init/initialize_directfile.ts +1 -1
  96. package/src/core/init/load_on_media_source.ts +1 -0
  97. package/src/core/init/stall_avoider.ts +40 -26
  98. package/src/core/segment_buffers/garbage_collector.ts +55 -47
  99. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +92 -70
  100. package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +37 -42
  101. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +103 -105
  102. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +35 -46
  103. package/src/core/segment_buffers/implementations/types.ts +22 -9
  104. package/src/core/segment_buffers/segment_buffers_store.ts +23 -14
  105. package/src/core/stream/orchestrator/stream_orchestrator.ts +31 -12
  106. package/src/core/stream/period/period_stream.ts +31 -18
  107. package/src/core/stream/representation/append_segment_to_buffer.ts +27 -42
  108. package/src/core/stream/representation/force_garbage_collection.ts +28 -32
  109. package/src/core/stream/representation/get_buffer_status.ts +7 -3
  110. package/src/core/stream/representation/push_init_segment.ts +12 -6
  111. package/src/core/stream/representation/push_media_segment.ts +12 -6
  112. package/src/core/stream/representation/representation_stream.ts +11 -5
  113. package/src/default_config.ts +17 -17
  114. package/src/errors/custom_loader_error.ts +3 -2
  115. package/src/experimental/tools/VideoThumbnailLoader/get_initialized_source_buffer.ts +7 -2
  116. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +6 -2
  117. package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +10 -2
  118. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +3 -1
  119. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +4 -3
  120. package/src/public_types.ts +28 -4
  121. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  122. package/src/transports/dash/image_pipelines.ts +4 -0
  123. package/src/transports/dash/init_segment_loader.ts +8 -0
  124. package/src/transports/dash/low_latency_segment_loader.ts +4 -0
  125. package/src/transports/dash/manifest_parser.ts +4 -0
  126. package/src/transports/dash/segment_loader.ts +21 -5
  127. package/src/transports/dash/text_loader.ts +7 -2
  128. package/src/transports/local/pipelines.ts +7 -5
  129. package/src/transports/local/segment_loader.ts +4 -2
  130. package/src/transports/metaplaylist/manifest_loader.ts +9 -2
  131. package/src/transports/metaplaylist/pipelines.ts +16 -6
  132. package/src/transports/smooth/pipelines.ts +17 -9
  133. package/src/transports/smooth/segment_loader.ts +8 -0
  134. package/src/transports/types.ts +27 -0
  135. package/src/transports/utils/call_custom_manifest_loader.ts +8 -2
  136. package/src/transports/utils/generate_manifest_loader.ts +18 -5
  137. package/src/utils/request/fetch.ts +7 -8
  138. package/src/utils/request/xhr.ts +31 -15
  139. package/src/utils/task_canceller.ts +1 -2
package/dist/rx-player.js CHANGED
@@ -1395,7 +1395,7 @@ __webpack_require__.d(__webpack_exports__, {
1395
1395
  "it": function() { return /* binding */ getVideoVisibilityRef; },
1396
1396
  "O0": function() { return /* binding */ getVideoWidthRef; },
1397
1397
  "Oh": function() { return /* binding */ onEncrypted$; },
1398
- "C1": function() { return /* binding */ onEnded$; },
1398
+ "M4": function() { return /* binding */ onEnded; },
1399
1399
  "Q1": function() { return /* binding */ onFullscreenChange$; },
1400
1400
  "GV": function() { return /* binding */ onKeyAdded$; },
1401
1401
  "Xe": function() { return /* binding */ onKeyError$; },
@@ -1403,8 +1403,8 @@ __webpack_require__.d(__webpack_exports__, {
1403
1403
  "eX": function() { return /* binding */ onKeyStatusesChange$; },
1404
1404
  "K4": function() { return /* binding */ onLoadedMetadata$; },
1405
1405
  "gg": function() { return /* binding */ onRemoveSourceBuffers$; },
1406
- "ik": function() { return /* binding */ onSeeked$; },
1407
- "d5": function() { return /* binding */ onSeeking$; },
1406
+ "bQ": function() { return /* binding */ onSeeked; },
1407
+ "Q$": function() { return /* binding */ onSeeking; },
1408
1408
  "UG": function() { return /* binding */ onSourceClose$; },
1409
1409
  "ep": function() { return /* binding */ onSourceEnded$; },
1410
1410
  "ym": function() { return /* binding */ onSourceOpen$; },
@@ -1412,7 +1412,7 @@ __webpack_require__.d(__webpack_exports__, {
1412
1412
  "_E": function() { return /* binding */ onUpdate$; }
1413
1413
  });
1414
1414
 
1415
- // UNUSED EXPORTS: addEventListener, onTimeUpdate$
1415
+ // UNUSED EXPORTS: addEventListener, onEnded$, onSeeked$, onSeeking$, onTimeUpdate$
1416
1416
 
1417
1417
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/fromEvent.js
1418
1418
  var fromEvent = __webpack_require__(2401);
@@ -1521,6 +1521,53 @@ function eventPrefixed(eventNames, prefixes) {
1521
1521
  }));
1522
1522
  }, []);
1523
1523
  }
1524
+ /**
1525
+ * Returns a function allowing to add event listeners for particular event(s)
1526
+ * optionally automatically adding browser prefixes if needed.
1527
+ * @param {Array.<string>} eventNames - The event(s) to listen to. If multiple
1528
+ * events are set, the event listener will be triggered when any of them emits.
1529
+ * @returns {Function} - Returns function allowing to easily add a callback to
1530
+ * be triggered when that event is emitted on a given event target.
1531
+ */
1532
+
1533
+
1534
+ function createCompatibleEventListener(eventNames) {
1535
+ var mem;
1536
+ var prefixedEvents = eventPrefixed(eventNames);
1537
+ return function (element, listener, cancelSignal) {
1538
+ if (cancelSignal.isCancelled) {
1539
+ return;
1540
+ } // if the element is a HTMLElement we can detect
1541
+ // the supported event, and memoize it in `mem`
1542
+
1543
+
1544
+ if (element instanceof HTMLElement) {
1545
+ if (typeof mem === "undefined") {
1546
+ mem = findSupportedEvent(element, prefixedEvents);
1547
+ }
1548
+
1549
+ if ((0,is_non_empty_string/* default */.Z)(mem)) {
1550
+ element.addEventListener(mem, listener);
1551
+ cancelSignal.register(function () {
1552
+ if (mem !== undefined) {
1553
+ element.removeEventListener(mem, listener);
1554
+ }
1555
+ });
1556
+ } else {
1557
+ if (false) {}
1558
+
1559
+ return;
1560
+ }
1561
+ }
1562
+
1563
+ prefixedEvents.forEach(function (eventName) {
1564
+ element.addEventListener(eventName, listener);
1565
+ cancelSignal.register(function () {
1566
+ element.removeEventListener(eventName, listener);
1567
+ });
1568
+ });
1569
+ };
1570
+ }
1524
1571
  /**
1525
1572
  * @param {Array.<string>} eventNames
1526
1573
  * @param {Array.<string>|undefined} prefixes
@@ -1649,7 +1696,8 @@ function getVideoWidthFromPIPWindow(mediaElement, pipWindow) {
1649
1696
  }
1650
1697
  /**
1651
1698
  * Emit when video enters and leaves Picture-In-Picture mode.
1652
- * @param {HTMLMediaElement} mediaElement
1699
+ * @param {HTMLMediaElement} elt
1700
+ * @param {Object} stopListening
1653
1701
  * @returns {Observable}
1654
1702
  */
1655
1703
 
@@ -1911,6 +1959,24 @@ var onKeyError$ = compatibleListener(["keyerror", "error"]);
1911
1959
  */
1912
1960
 
1913
1961
  var onKeyStatusesChange$ = compatibleListener(["keystatuseschange"]);
1962
+ /**
1963
+ * @param {HTMLMediaElement} mediaElement
1964
+ * @returns {Observable}
1965
+ */
1966
+
1967
+ var onSeeking = createCompatibleEventListener(["seeking"]);
1968
+ /**
1969
+ * @param {HTMLMediaElement} mediaElement
1970
+ * @returns {Observable}
1971
+ */
1972
+
1973
+ var onSeeked = createCompatibleEventListener(["seeked"]);
1974
+ /**
1975
+ * @param {HTMLMediaElement} mediaElement
1976
+ * @returns {Observable}
1977
+ */
1978
+
1979
+ var onEnded = createCompatibleEventListener(["ended"]);
1914
1980
  /**
1915
1981
  * Utilitary function allowing to add an event listener and remove it
1916
1982
  * automatically once the given `CancellationSignal` emits.
@@ -2492,7 +2558,7 @@ var DEFAULT_CONFIG = {
2492
2558
  * small enough so this (arguably rare) situation won't lead to too much
2493
2559
  * waiting time.
2494
2560
  */
2495
- FORCE_DISCONTINUITY_SEEK_DELAY: 2000,
2561
+ FORCE_DISCONTINUITY_SEEK_DELAY: 3000,
2496
2562
 
2497
2563
  /**
2498
2564
  * Ratio used to know if an already loaded segment should be re-buffered.
@@ -8178,8 +8244,8 @@ var empty = __webpack_require__(1545);
8178
8244
  var of = __webpack_require__(2817);
8179
8245
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js
8180
8246
  var takeUntil = __webpack_require__(3505);
8181
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js
8182
- var concat = __webpack_require__(6362);
8247
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js + 1 modules
8248
+ var concat = __webpack_require__(2034);
8183
8249
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/tap.js
8184
8250
  var tap = __webpack_require__(2006);
8185
8251
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/ignoreElements.js
@@ -10563,8 +10629,8 @@ var shareReplay = __webpack_require__(8515);
10563
10629
  var mergeMap = __webpack_require__(7877);
10564
10630
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/startWith.js
10565
10631
  var startWith = __webpack_require__(6108);
10566
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js
10567
- var concat = __webpack_require__(6362);
10632
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js + 1 modules
10633
+ var concat = __webpack_require__(2034);
10568
10634
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/defer.js
10569
10635
  var defer = __webpack_require__(9917);
10570
10636
  // EXTERNAL MODULE: ./src/utils/cast_to_observable.ts
@@ -11016,7 +11082,7 @@ function initializeDirectfileContent(_ref) {
11016
11082
  * events when it cannot, as well as "unstalled" events when it get out of one.
11017
11083
  */
11018
11084
 
11019
- var stallAvoider$ = (0,stall_avoider/* default */.Z)(playbackObserver, null, empty/* EMPTY */.E, empty/* EMPTY */.E);
11085
+ var stallAvoider$ = (0,stall_avoider/* default */.Z)(playbackObserver, null, speed, empty/* EMPTY */.E, empty/* EMPTY */.E);
11020
11086
  /**
11021
11087
  * Emit a "loaded" events once the initial play has been performed and the
11022
11088
  * media can begin playback.
@@ -11319,13 +11385,14 @@ var EPSILON = 1 / 60;
11319
11385
  * encountered and exited.
11320
11386
  * @param {object} playbackObserver - emit the current playback conditions.
11321
11387
  * @param {Object} manifest - The Manifest of the currently-played content.
11388
+ * @param {Object} speed - The last speed set by the user
11389
+ * @param {Observable} lockedStream$
11322
11390
  * @param {Observable} discontinuityUpdate$ - Observable emitting encountered
11323
11391
  * discontinuities for loaded Period and buffer types.
11324
- * @param {Function} setCurrentTime
11325
11392
  * @returns {Observable}
11326
11393
  */
11327
11394
 
11328
- function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUpdate$) {
11395
+ function StallAvoider(playbackObserver, manifest, speed, lockedStream$, discontinuityUpdate$) {
11329
11396
  var initialDiscontinuitiesStore = [];
11330
11397
  /**
11331
11398
  * Emit every known audio and video buffer discontinuities in chronological
@@ -11374,11 +11441,9 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11374
11441
  var lockedStreamEvt = _ref2[0],
11375
11442
  observation = _ref2[1];
11376
11443
 
11377
- var _a; // TODO(PaulB) also skip when the user's wanted speed is set to `0`, as we
11378
- // might not want to seek in that case?
11379
-
11444
+ var _a;
11380
11445
 
11381
- if (!observation.rebuffering || observation.paused || lockedStreamEvt.bufferType !== "audio" && lockedStreamEvt.bufferType !== "video") {
11446
+ if (!observation.rebuffering || observation.paused || speed.getValue() <= 0 || lockedStreamEvt.bufferType !== "audio" && lockedStreamEvt.bufferType !== "video") {
11382
11447
  return;
11383
11448
  }
11384
11449
 
@@ -11400,6 +11465,9 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11400
11465
  var stall$ = playbackObserver.getReference().asObservable().pipe((0,withLatestFrom/* withLatestFrom */.M)(discontinuitiesStore$), (0,map/* map */.U)(function (_ref3) {
11401
11466
  var observation = _ref3[0],
11402
11467
  discontinuitiesStore = _ref3[1];
11468
+
11469
+ var _a;
11470
+
11403
11471
  var buffered = observation.buffered,
11404
11472
  position = observation.position,
11405
11473
  readyState = observation.readyState,
@@ -11413,19 +11481,28 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11413
11481
  UNFREEZING_SEEK_DELAY = _config$getCurrent.UNFREEZING_SEEK_DELAY,
11414
11482
  UNFREEZING_DELTA_POSITION = _config$getCurrent.UNFREEZING_DELTA_POSITION;
11415
11483
 
11416
- if (freezing !== null) {
11484
+ if (!observation.seeking && is_seeking_approximate && ignoredStallTimeStamp === null && lastSeekingPosition !== null && observation.position < lastSeekingPosition) {
11485
+ log/* default.debug */.Z.debug("Init: the device appeared to have seeked back by itself.");
11417
11486
  var now = performance.now();
11487
+ ignoredStallTimeStamp = now;
11488
+ }
11489
+
11490
+ lastSeekingPosition = observation.seeking ? Math.max((_a = observation.pendingInternalSeek) !== null && _a !== void 0 ? _a : 0, observation.position) : null;
11491
+
11492
+ if (freezing !== null) {
11493
+ var _now = performance.now();
11494
+
11418
11495
  var referenceTimestamp = prevFreezingState === null ? freezing.timestamp : prevFreezingState.attemptTimestamp;
11419
11496
 
11420
- if (now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
11497
+ if (_now - referenceTimestamp > UNFREEZING_SEEK_DELAY) {
11421
11498
  log/* default.warn */.Z.warn("Init: trying to seek to un-freeze player");
11422
11499
  playbackObserver.setCurrentTime(playbackObserver.getCurrentTime() + UNFREEZING_DELTA_POSITION);
11423
11500
  prevFreezingState = {
11424
- attemptTimestamp: now
11501
+ attemptTimestamp: _now
11425
11502
  };
11426
11503
  }
11427
11504
 
11428
- if (now - freezing.timestamp > FREEZING_STALLED_DELAY) {
11505
+ if (_now - freezing.timestamp > FREEZING_STALLED_DELAY) {
11429
11506
  return {
11430
11507
  type: "stalled",
11431
11508
  value: "freezing"
@@ -11442,7 +11519,7 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11442
11519
  var reason;
11443
11520
 
11444
11521
  if (observation.seeking) {
11445
- reason = observation.internalSeeking ? "internal-seek" : "seeking";
11522
+ reason = observation.pendingInternalSeek !== null ? "internal-seek" : "seeking";
11446
11523
  } else {
11447
11524
  reason = "not-ready";
11448
11525
  }
@@ -11461,31 +11538,20 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11461
11538
  // internally by the player to when its due to a regular user seek.
11462
11539
 
11463
11540
 
11464
- var stalledReason = rebuffering.reason === "seeking" && observation.internalSeeking ? "internal-seek" : rebuffering.reason;
11465
-
11466
- if (observation.seeking) {
11467
- lastSeekingPosition = observation.position;
11468
- } else if (lastSeekingPosition !== null) {
11469
- var _now = performance.now();
11470
-
11471
- if (ignoredStallTimeStamp === null) {
11472
- ignoredStallTimeStamp = _now;
11473
- }
11541
+ var stalledReason = rebuffering.reason === "seeking" && observation.pendingInternalSeek !== null ? "internal-seek" : rebuffering.reason;
11474
11542
 
11475
- if (is_seeking_approximate && observation.position < lastSeekingPosition) {
11476
- log/* default.debug */.Z.debug("Init: the device appeared to have seeked back by itself.");
11543
+ if (ignoredStallTimeStamp !== null) {
11544
+ var _now2 = performance.now();
11477
11545
 
11478
- if (_now - ignoredStallTimeStamp < FORCE_DISCONTINUITY_SEEK_DELAY) {
11479
- return {
11480
- type: "stalled",
11481
- value: stalledReason
11482
- };
11483
- } else {
11484
- log/* default.warn */.Z.warn("Init: ignored stall for too long, checking discontinuity", _now - ignoredStallTimeStamp);
11485
- }
11546
+ if (_now2 - ignoredStallTimeStamp < FORCE_DISCONTINUITY_SEEK_DELAY) {
11547
+ log/* default.debug */.Z.debug("Init: letting the device get out of a stall by itself");
11548
+ return {
11549
+ type: "stalled",
11550
+ value: stalledReason
11551
+ };
11552
+ } else {
11553
+ log/* default.warn */.Z.warn("Init: ignored stall for too long, checking discontinuity", _now2 - ignoredStallTimeStamp);
11486
11554
  }
11487
-
11488
- lastSeekingPosition = null;
11489
11555
  }
11490
11556
 
11491
11557
  ignoredStallTimeStamp = null;
@@ -11501,7 +11567,7 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11501
11567
 
11502
11568
  var stalledPosition = rebuffering.position;
11503
11569
 
11504
- if (stalledPosition !== null) {
11570
+ if (stalledPosition !== null && speed.getValue() > 0) {
11505
11571
  var skippableDiscontinuity = findSeekableDiscontinuity(discontinuitiesStore, manifest, stalledPosition);
11506
11572
 
11507
11573
  if (skippableDiscontinuity !== null) {
@@ -11527,7 +11593,7 @@ function StallAvoider(playbackObserver, manifest, lockedStream$, discontinuityUp
11527
11593
 
11528
11594
  var nextBufferRangeGap = (0,ranges/* getNextRangeGap */.XS)(buffered, freezePosition);
11529
11595
 
11530
- if (nextBufferRangeGap < BUFFER_DISCONTINUITY_THRESHOLD) {
11596
+ if (speed.getValue() > 0 && nextBufferRangeGap < BUFFER_DISCONTINUITY_THRESHOLD) {
11531
11597
  var seekTo = freezePosition + nextBufferRangeGap + EPSILON;
11532
11598
 
11533
11599
  if (playbackObserver.getCurrentTime() < seekTo) {
@@ -11844,10 +11910,6 @@ __webpack_require__.d(__webpack_exports__, {
11844
11910
 
11845
11911
  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js
11846
11912
  var inheritsLoose = __webpack_require__(4578);
11847
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/defer.js
11848
- var defer = __webpack_require__(9917);
11849
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/of.js
11850
- var of = __webpack_require__(2817);
11851
11913
  // EXTERNAL MODULE: ./src/log.ts + 1 modules
11852
11914
  var log = __webpack_require__(3887);
11853
11915
  // EXTERNAL MODULE: ./src/core/segment_buffers/implementations/types.ts + 3 modules
@@ -11875,7 +11937,6 @@ var manual_time_ranges = __webpack_require__(4309);
11875
11937
 
11876
11938
 
11877
11939
 
11878
-
11879
11940
  /**
11880
11941
  * Image SegmentBuffer implementation.
11881
11942
  * @class ImageSegmentBuffer
@@ -11895,65 +11956,65 @@ var ImageSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
11895
11956
  }
11896
11957
  /**
11897
11958
  * @param {Object} data
11959
+ * @returns {Promise}
11898
11960
  */
11899
11961
 
11900
11962
 
11901
11963
  var _proto = ImageSegmentBuffer.prototype;
11902
11964
 
11903
11965
  _proto.pushChunk = function pushChunk(infos) {
11904
- var _this2 = this;
11905
-
11906
- return (0,defer/* defer */.P)(function () {
11907
- var _a, _b;
11966
+ var _a, _b;
11908
11967
 
11909
- log/* default.debug */.Z.debug("ISB: appending new data.");
11968
+ log/* default.debug */.Z.debug("ISB: appending new data.");
11910
11969
 
11911
- if (infos.data.chunk === null) {
11912
- return (0,of.of)(undefined);
11913
- }
11970
+ if (infos.data.chunk === null) {
11971
+ return Promise.resolve();
11972
+ }
11914
11973
 
11915
- var _infos$data = infos.data,
11916
- appendWindow = _infos$data.appendWindow,
11917
- chunk = _infos$data.chunk; // The following check is ugly. I don't care, the image buffer is there
11918
- // due to an ugly deprecated API that will soon disappear
11974
+ var _infos$data = infos.data,
11975
+ appendWindow = _infos$data.appendWindow,
11976
+ chunk = _infos$data.chunk; // The following check is ugly. I don't care, the image buffer is there
11977
+ // due to an ugly deprecated API that will soon disappear
11919
11978
 
11920
- var start = chunk.start,
11921
- end = chunk.end,
11922
- timescale = chunk.timescale;
11923
- var appendWindowStart = (_a = appendWindow[0]) !== null && _a !== void 0 ? _a : 0;
11924
- var appendWindowEnd = (_b = appendWindow[1]) !== null && _b !== void 0 ? _b : Infinity;
11925
- var timescaledStart = start / timescale;
11926
- var timescaledEnd = end / timescale;
11927
- var startTime = Math.max(appendWindowStart, timescaledStart);
11928
- var endTime = Math.min(appendWindowEnd, timescaledEnd);
11979
+ var start = chunk.start,
11980
+ end = chunk.end,
11981
+ timescale = chunk.timescale;
11982
+ var appendWindowStart = (_a = appendWindow[0]) !== null && _a !== void 0 ? _a : 0;
11983
+ var appendWindowEnd = (_b = appendWindow[1]) !== null && _b !== void 0 ? _b : Infinity;
11984
+ var timescaledStart = start / timescale;
11985
+ var timescaledEnd = end / timescale;
11986
+ var startTime = Math.max(appendWindowStart, timescaledStart);
11987
+ var endTime = Math.min(appendWindowEnd, timescaledEnd);
11929
11988
 
11930
- _this2._buffered.insert(startTime, endTime);
11989
+ try {
11990
+ this._buffered.insert(startTime, endTime);
11931
11991
 
11932
11992
  if (infos.inventoryInfos !== null) {
11933
- _this2._segmentInventory.insertChunk(infos.inventoryInfos);
11993
+ this._segmentInventory.insertChunk(infos.inventoryInfos);
11934
11994
  }
11995
+ } catch (err) {
11996
+ return Promise.reject(err);
11997
+ }
11935
11998
 
11936
- return (0,of.of)(undefined);
11937
- });
11999
+ return Promise.resolve();
11938
12000
  }
11939
12001
  /**
11940
12002
  * @param {Number} from
11941
12003
  * @param {Number} to
12004
+ * @returns {Promise}
11942
12005
  */
11943
12006
  ;
11944
12007
 
11945
12008
  _proto.removeBuffer = function removeBuffer(start, end) {
11946
- return (0,defer/* defer */.P)(function () {
11947
- log/* default.info */.Z.info("ISB: ignored image data remove order", start, end); // Logic removed as it caused more problems than it resolved:
11948
- // Image thumbnails are always downloaded as a single BIF file, meaning that
11949
- // any removing might necessitate to re-load the whole file in the future
11950
- // which seems pointless.
11951
- // In any case, image handling through the regular RxPlayer APIs has been
11952
- // completely deprecated now for several reasons, and should disappear in
11953
- // the next major version.
11954
-
11955
- return (0,of.of)(undefined);
11956
- });
12009
+ log/* default.info */.Z.info("ISB: ignored image data remove order", start, end); // Logic removed as it caused more problems than it resolved:
12010
+ // Image thumbnails are always downloaded as a single BIF file, meaning that
12011
+ // any removing might necessitate to re-load the whole file in the future
12012
+ // which seems pointless.
12013
+ // In any case, image handling through the regular RxPlayer APIs has been
12014
+ // completely deprecated now for several reasons, and should disappear in
12015
+ // the next major version.
12016
+
12017
+ return Promise.resolve();
11957
12018
  }
11958
12019
  /**
11959
12020
  * Indicate that every chunks from a Segment has been given to pushChunk so
@@ -11962,18 +12023,14 @@ var ImageSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
11962
12023
  * The returned Observable will emit and complete successively once the whole
11963
12024
  * segment has been pushed and this indication is acknowledged.
11964
12025
  * @param {Object} infos
11965
- * @returns {Observable}
12026
+ * @returns {Promise}
11966
12027
  */
11967
12028
  ;
11968
12029
 
11969
12030
  _proto.endOfSegment = function endOfSegment(_infos) {
11970
- var _this3 = this;
12031
+ this._segmentInventory.completeSegment(_infos, this._buffered);
11971
12032
 
11972
- return (0,defer/* defer */.P)(function () {
11973
- _this3._segmentInventory.completeSegment(_infos, _this3._buffered);
11974
-
11975
- return (0,of.of)(undefined);
11976
- });
12033
+ return Promise.resolve();
11977
12034
  }
11978
12035
  /**
11979
12036
  * Returns the currently buffered data, in a TimeRanges object.
@@ -12028,34 +12085,12 @@ __webpack_require__.d(__webpack_exports__, {
12028
12085
 
12029
12086
  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js
12030
12087
  var inheritsLoose = __webpack_require__(4578);
12031
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/merge.js
12032
- var merge = __webpack_require__(3071);
12033
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/interval.js
12034
- var observable_interval = __webpack_require__(6697);
12035
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/startWith.js
12036
- var startWith = __webpack_require__(6108);
12037
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/switchMap.js
12038
- var switchMap = __webpack_require__(4978);
12039
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js
12040
- var concat = __webpack_require__(6362);
12041
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/map.js
12042
- var map = __webpack_require__(9127);
12043
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js
12044
- var takeUntil = __webpack_require__(3505);
12045
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/of.js
12046
- var of = __webpack_require__(2817);
12047
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/Subject.js + 1 modules
12048
- var Subject = __webpack_require__(6716);
12049
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/defer.js
12050
- var defer = __webpack_require__(9917);
12051
12088
  // EXTERNAL MODULE: ./src/compat/event_listeners.ts + 1 modules
12052
12089
  var event_listeners = __webpack_require__(1381);
12053
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/Observable.js + 1 modules
12054
- var Observable = __webpack_require__(1480);
12055
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js
12056
- var distinctUntilChanged = __webpack_require__(3741);
12057
12090
  // EXTERNAL MODULE: ./src/log.ts + 1 modules
12058
12091
  var log = __webpack_require__(3887);
12092
+ // EXTERNAL MODULE: ./src/utils/reference.ts
12093
+ var reference = __webpack_require__(5095);
12059
12094
  // EXTERNAL MODULE: ./src/compat/is_node.ts
12060
12095
  var is_node = __webpack_require__(2203);
12061
12096
  ;// CONCATENATED MODULE: ./src/compat/on_height_width_change.ts
@@ -12087,8 +12122,8 @@ var _ResizeObserver = is_node/* default */.Z ? undefined : window.ResizeObserver
12087
12122
  /* eslint-enable @typescript-eslint/no-unsafe-assignment */
12088
12123
 
12089
12124
  /**
12090
- * Emit the current height and width of the given `element` on subscribtion
12091
- * and each time it changes.
12125
+ * Emit the current height and width of the given `element` each time it
12126
+ * changes.
12092
12127
  *
12093
12128
  * On some browsers, we might not be able to rely on a native API to know when
12094
12129
  * it changes, the `interval` argument allow us to provide us an inverval in
@@ -12099,55 +12134,69 @@ var _ResizeObserver = is_node/* default */.Z ? undefined : window.ResizeObserver
12099
12134
  */
12100
12135
 
12101
12136
 
12102
- function onHeightWidthChange(element, interval) {
12103
- return (0,defer/* defer */.P)(function () {
12104
- if (_ResizeObserver !== undefined) {
12105
- var lastHeight = -1;
12106
- var lastWidth = -1;
12107
- return new Observable/* Observable */.y(function (obs) {
12108
- var resizeObserver = new _ResizeObserver(function (entries) {
12109
- if (entries.length === 0) {
12110
- log/* default.error */.Z.error("Compat: Resized but no observed element.");
12111
- return;
12112
- }
12137
+ function onHeightWidthChange(element, interval, cancellationSignal) {
12138
+ var _element$getBoundingC = element.getBoundingClientRect(),
12139
+ initHeight = _element$getBoundingC.height,
12140
+ initWidth = _element$getBoundingC.width;
12113
12141
 
12114
- var entry = entries[0];
12115
- var _entry$contentRect = entry.contentRect,
12116
- height = _entry$contentRect.height,
12117
- width = _entry$contentRect.width;
12118
-
12119
- if (height !== lastHeight || width !== lastWidth) {
12120
- lastHeight = height;
12121
- lastWidth = width;
12122
- obs.next({
12123
- height: height,
12124
- width: width
12125
- });
12126
- }
12127
- });
12128
- resizeObserver.observe(element);
12129
- return function () {
12130
- resizeObserver.disconnect();
12131
- };
12132
- });
12133
- }
12142
+ var ref = (0,reference/* default */.ZP)({
12143
+ height: initHeight,
12144
+ width: initWidth
12145
+ });
12146
+ var lastHeight = initHeight;
12147
+ var lastWidth = initWidth;
12134
12148
 
12135
- return (0,observable_interval/* interval */.F)(interval).pipe((0,startWith/* startWith */.O)(null), (0,map/* map */.U)(function () {
12136
- var _element$getBoundingC = element.getBoundingClientRect(),
12137
- height = _element$getBoundingC.height,
12138
- width = _element$getBoundingC.width;
12149
+ if (_ResizeObserver !== undefined) {
12150
+ var resizeObserver = new _ResizeObserver(function (entries) {
12151
+ if (entries.length === 0) {
12152
+ log/* default.error */.Z.error("Compat: Resized but no observed element.");
12153
+ return;
12154
+ }
12139
12155
 
12140
- return {
12141
- height: height,
12142
- width: width
12143
- };
12144
- }), (0,distinctUntilChanged/* distinctUntilChanged */.x)(function (o, n) {
12145
- return o.height === n.height && o.width === n.width;
12146
- }));
12147
- });
12156
+ var entry = entries[0];
12157
+ var _entry$contentRect = entry.contentRect,
12158
+ height = _entry$contentRect.height,
12159
+ width = _entry$contentRect.width;
12160
+
12161
+ if (height !== lastHeight || width !== lastWidth) {
12162
+ lastHeight = height;
12163
+ lastWidth = width;
12164
+ ref.setValue({
12165
+ height: height,
12166
+ width: width
12167
+ });
12168
+ }
12169
+ });
12170
+ resizeObserver.observe(element);
12171
+ cancellationSignal.register(function () {
12172
+ resizeObserver.disconnect();
12173
+ });
12174
+ } else {
12175
+ var intervalId = setInterval(function () {
12176
+ var _element$getBoundingC2 = element.getBoundingClientRect(),
12177
+ height = _element$getBoundingC2.height,
12178
+ width = _element$getBoundingC2.width;
12179
+
12180
+ if (height !== lastHeight || width !== lastWidth) {
12181
+ lastHeight = height;
12182
+ lastWidth = width;
12183
+ ref.setValue({
12184
+ height: height,
12185
+ width: width
12186
+ });
12187
+ }
12188
+ }, interval);
12189
+ cancellationSignal.register(function () {
12190
+ clearInterval(intervalId);
12191
+ });
12192
+ }
12193
+
12194
+ return ref;
12148
12195
  }
12149
12196
  // EXTERNAL MODULE: ./src/config.ts + 2 modules
12150
12197
  var config = __webpack_require__(6872);
12198
+ // EXTERNAL MODULE: ./src/utils/task_canceller.ts
12199
+ var task_canceller = __webpack_require__(288);
12151
12200
  // EXTERNAL MODULE: ./src/core/segment_buffers/implementations/types.ts + 3 modules
12152
12201
  var types = __webpack_require__(9612);
12153
12202
  // EXTERNAL MODULE: ./src/core/segment_buffers/implementations/utils/manual_time_ranges.ts
@@ -12796,37 +12845,14 @@ function updateProportionalElements(currentHeight, currentWidth, resolution, tex
12796
12845
 
12797
12846
 
12798
12847
 
12799
- var onEnded$ = event_listeners/* onEnded$ */.C1,
12800
- onSeeked$ = event_listeners/* onSeeked$ */.ik,
12801
- onSeeking$ = event_listeners/* onSeeking$ */.d5;
12802
- /**
12803
- * Generate the interval at which TextTrack HTML Cues should be refreshed.
12804
- * @param {HTMLMediaElement} videoElement
12805
- * @returns {Observable}
12806
- */
12807
-
12808
- function generateRefreshInterval(videoElement) {
12809
- var seeking$ = onSeeking$(videoElement);
12810
- var seeked$ = onSeeked$(videoElement);
12811
- var ended$ = onEnded$(videoElement);
12812
-
12813
- var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
12814
- MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = _config$getCurrent.MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
12815
-
12816
- var manualRefresh$ = (0,merge/* merge */.T)(seeked$, ended$);
12817
- var autoRefresh$ = (0,observable_interval/* interval */.F)(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL).pipe((0,startWith/* startWith */.O)(null));
12818
- return manualRefresh$.pipe((0,startWith/* startWith */.O)(null), (0,switchMap/* switchMap */.w)(function () {
12819
- return (0,concat/* concat */.z)(autoRefresh$.pipe((0,map/* map */.U)(function () {
12820
- return true;
12821
- }), (0,takeUntil/* takeUntil */.R)(seeking$)), (0,of.of)(false));
12822
- }));
12823
- }
12848
+ var onEnded = event_listeners/* onEnded */.M4,
12849
+ onSeeked = event_listeners/* onSeeked */.bQ,
12850
+ onSeeking = event_listeners/* onSeeking */.Q$;
12824
12851
  /**
12825
12852
  * @param {Element} element
12826
12853
  * @param {Element} child
12827
12854
  */
12828
12855
 
12829
-
12830
12856
  function safelyRemoveChild(element, child) {
12831
12857
  try {
12832
12858
  element.removeChild(child);
@@ -12883,88 +12909,55 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
12883
12909
  _this._buffered = new manual_time_ranges/* default */.Z();
12884
12910
  _this._videoElement = videoElement;
12885
12911
  _this._textTrackElement = textTrackElement;
12886
- _this._clearSizeUpdates$ = new Subject/* Subject */.x();
12887
- _this._destroy$ = new Subject/* Subject */.x();
12912
+ _this._sizeUpdateCanceller = new task_canceller/* default */.ZP();
12913
+ _this._canceller = new task_canceller/* default */.ZP();
12888
12914
  _this._buffer = new TextTrackCuesStore();
12889
- _this._currentCues = []; // update text tracks
12890
-
12891
- generateRefreshInterval(_this._videoElement).pipe((0,takeUntil/* takeUntil */.R)(_this._destroy$)).subscribe(function (shouldDisplay) {
12892
- if (!shouldDisplay) {
12893
- _this._disableCurrentCues();
12894
-
12895
- return;
12896
- }
12915
+ _this._currentCues = [];
12897
12916
 
12898
- var _config$getCurrent2 = config/* default.getCurrent */.Z.getCurrent(),
12899
- MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = _config$getCurrent2.MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL; // to spread the time error, we divide the regular chosen interval.
12900
-
12901
-
12902
- var time = Math.max(_this._videoElement.currentTime + MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000 / 2, 0);
12903
-
12904
- var cues = _this._buffer.get(time);
12917
+ _this.autoRefreshSubtitles(_this._canceller.signal);
12905
12918
 
12906
- if (cues.length === 0) {
12907
- _this._disableCurrentCues();
12908
- } else {
12909
- _this._displayCues(cues);
12910
- }
12911
- });
12912
12919
  return _this;
12913
12920
  }
12914
12921
  /**
12915
12922
  * Push segment on Subscription.
12916
12923
  * @param {Object} infos
12917
- * @returns {Observable}
12924
+ * @returns {Promise}
12918
12925
  */
12919
12926
 
12920
12927
 
12921
12928
  var _proto = HTMLTextSegmentBuffer.prototype;
12922
12929
 
12923
12930
  _proto.pushChunk = function pushChunk(infos) {
12924
- var _this2 = this;
12925
-
12926
- return (0,defer/* defer */.P)(function () {
12927
- _this2.pushChunkSync(infos);
12931
+ try {
12932
+ this.pushChunkSync(infos);
12933
+ } catch (err) {
12934
+ return Promise.reject(err);
12935
+ }
12928
12936
 
12929
- return (0,of.of)(undefined);
12930
- });
12937
+ return Promise.resolve();
12931
12938
  }
12932
12939
  /**
12933
12940
  * Remove buffered data.
12934
12941
  * @param {number} start - start position, in seconds
12935
12942
  * @param {number} end - end position, in seconds
12936
- * @returns {Observable}
12943
+ * @returns {Promise}
12937
12944
  */
12938
12945
  ;
12939
12946
 
12940
12947
  _proto.removeBuffer = function removeBuffer(start, end) {
12941
- var _this3 = this;
12942
-
12943
- return (0,defer/* defer */.P)(function () {
12944
- _this3.removeBufferSync(start, end);
12945
-
12946
- return (0,of.of)(undefined);
12947
- });
12948
+ this.removeBufferSync(start, end);
12949
+ return Promise.resolve();
12948
12950
  }
12949
12951
  /**
12950
- * Indicate that every chunks from a Segment has been given to pushChunk so
12951
- * far.
12952
- * This will update our internal Segment inventory accordingly.
12953
- * The returned Observable will emit and complete successively once the whole
12954
- * segment has been pushed and this indication is acknowledged.
12955
12952
  * @param {Object} infos
12956
- * @returns {Observable}
12953
+ * @returns {Promise}
12957
12954
  */
12958
12955
  ;
12959
12956
 
12960
- _proto.endOfSegment = function endOfSegment(_infos) {
12961
- var _this4 = this;
12962
-
12963
- return (0,defer/* defer */.P)(function () {
12964
- _this4._segmentInventory.completeSegment(_infos, _this4._buffered);
12957
+ _proto.endOfSegment = function endOfSegment(infos) {
12958
+ this._segmentInventory.completeSegment(infos, this._buffered);
12965
12959
 
12966
- return (0,of.of)(undefined);
12967
- });
12960
+ return Promise.resolve();
12968
12961
  }
12969
12962
  /**
12970
12963
  * Returns the currently buffered data, in a TimeRanges object.
@@ -12985,9 +12978,7 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
12985
12978
 
12986
12979
  this._buffered.remove(0, Infinity);
12987
12980
 
12988
- this._destroy$.next();
12989
-
12990
- this._destroy$.complete();
12981
+ this._canceller.cancel();
12991
12982
  }
12992
12983
  /**
12993
12984
  * Push the text track contained in `data` to the HTMLTextSegmentBuffer
@@ -13001,7 +12992,7 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13001
12992
  *
13002
12993
  * /!\ This method won't add any data to the linked inventory.
13003
12994
  * Please use the `pushChunk` method for most use-cases.
13004
- * @param {Object} data
12995
+ * @param {Object} infos
13005
12996
  * @returns {boolean}
13006
12997
  */
13007
12998
  ;
@@ -13122,7 +13113,7 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13122
13113
  ;
13123
13114
 
13124
13115
  _proto._disableCurrentCues = function _disableCurrentCues() {
13125
- this._clearSizeUpdates$.next();
13116
+ this._sizeUpdateCanceller.cancel();
13126
13117
 
13127
13118
  if (this._currentCues.length > 0) {
13128
13119
  for (var i = 0; i < this._currentCues.length; i++) {
@@ -13134,7 +13125,7 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13134
13125
  }
13135
13126
  /**
13136
13127
  * Display a new Cue. If one was already present, it will be replaced.
13137
- * @param {HTMLElement} element
13128
+ * @param {HTMLElement} elements
13138
13129
  */
13139
13130
  ;
13140
13131
 
@@ -13149,7 +13140,7 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13149
13140
  // TODO More intelligent handling
13150
13141
 
13151
13142
 
13152
- this._clearSizeUpdates$.next();
13143
+ this._sizeUpdateCanceller.cancel();
13153
13144
 
13154
13145
  for (var i = 0; i < this._currentCues.length; i++) {
13155
13146
  safelyRemoveChild(this._textTrackElement, this._currentCues[i].element);
@@ -13174,11 +13165,16 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13174
13165
  });
13175
13166
 
13176
13167
  if (proportionalCues.length > 0) {
13177
- var _config$getCurrent3 = config/* default.getCurrent */.Z.getCurrent(),
13178
- TEXT_TRACK_SIZE_CHECKS_INTERVAL = _config$getCurrent3.TEXT_TRACK_SIZE_CHECKS_INTERVAL; // update propertionally-sized elements periodically
13168
+ this._sizeUpdateCanceller = new task_canceller/* default */.ZP({
13169
+ cancelOn: this._canceller.signal
13170
+ });
13171
+
13172
+ var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
13173
+ TEXT_TRACK_SIZE_CHECKS_INTERVAL = _config$getCurrent.TEXT_TRACK_SIZE_CHECKS_INTERVAL; // update propertionally-sized elements periodically
13179
13174
 
13180
13175
 
13181
- onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL).pipe((0,takeUntil/* takeUntil */.R)(this._clearSizeUpdates$), (0,takeUntil/* takeUntil */.R)(this._destroy$)).subscribe(function (_ref) {
13176
+ var heightWidthRef = onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL, this._sizeUpdateCanceller.signal);
13177
+ heightWidthRef.onUpdate(function (_ref) {
13182
13178
  var height = _ref.height,
13183
13179
  width = _ref.width;
13184
13180
 
@@ -13188,8 +13184,85 @@ var HTMLTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13188
13184
  _element = _proportionalCues$_i.element;
13189
13185
  updateProportionalElements(height, width, _resolution, _element);
13190
13186
  }
13187
+ }, {
13188
+ clearSignal: this._sizeUpdateCanceller.signal,
13189
+ emitCurrentValue: true
13191
13190
  });
13192
13191
  }
13192
+ }
13193
+ /**
13194
+ * Auto-refresh the display of subtitles according to the media element's
13195
+ * position and events.
13196
+ * @param {Object} cancellationSignal
13197
+ */
13198
+ ;
13199
+
13200
+ _proto.autoRefreshSubtitles = function autoRefreshSubtitles(cancellationSignal) {
13201
+ var _this2 = this;
13202
+
13203
+ var autoRefreshCanceller = null;
13204
+
13205
+ var _config$getCurrent2 = config/* default.getCurrent */.Z.getCurrent(),
13206
+ MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = _config$getCurrent2.MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
13207
+
13208
+ var startAutoRefresh = function startAutoRefresh() {
13209
+ stopAutoRefresh();
13210
+ autoRefreshCanceller = new task_canceller/* default */.ZP({
13211
+ cancelOn: cancellationSignal
13212
+ });
13213
+ var intervalId = setInterval(function () {
13214
+ return _this2.refreshSubtitles();
13215
+ }, MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL);
13216
+ autoRefreshCanceller.signal.register(function () {
13217
+ clearInterval(intervalId);
13218
+ });
13219
+
13220
+ _this2.refreshSubtitles();
13221
+ };
13222
+
13223
+ onSeeking(this._videoElement, function () {
13224
+ stopAutoRefresh();
13225
+
13226
+ _this2._disableCurrentCues();
13227
+ }, cancellationSignal);
13228
+ onSeeked(this._videoElement, startAutoRefresh, cancellationSignal);
13229
+ onEnded(this._videoElement, startAutoRefresh, cancellationSignal);
13230
+
13231
+ function stopAutoRefresh() {
13232
+ if (autoRefreshCanceller !== null) {
13233
+ autoRefreshCanceller.cancel();
13234
+ autoRefreshCanceller = null;
13235
+ }
13236
+ }
13237
+ }
13238
+ /**
13239
+ * Refresh current subtitles according to the current media element's
13240
+ * position.
13241
+ */
13242
+ ;
13243
+
13244
+ _proto.refreshSubtitles = function refreshSubtitles() {
13245
+ var videoElt = this._videoElement;
13246
+
13247
+ var _config$getCurrent3 = config/* default.getCurrent */.Z.getCurrent(),
13248
+ MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = _config$getCurrent3.MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
13249
+
13250
+ var time;
13251
+
13252
+ if (videoElt.paused || videoElt.playbackRate <= 0) {
13253
+ time = videoElt.currentTime;
13254
+ } else {
13255
+ // to spread the time error, we divide the regular chosen interval.
13256
+ time = Math.max(this._videoElement.currentTime + MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000 / 2, 0);
13257
+ }
13258
+
13259
+ var cues = this._buffer.get(time);
13260
+
13261
+ if (cues.length === 0) {
13262
+ this._disableCurrentCues();
13263
+ } else {
13264
+ this._displayCues(cues);
13265
+ }
13193
13266
  };
13194
13267
 
13195
13268
  return HTMLTextSegmentBuffer;
@@ -13263,10 +13336,6 @@ __webpack_require__.d(__webpack_exports__, {
13263
13336
 
13264
13337
  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js
13265
13338
  var inheritsLoose = __webpack_require__(4578);
13266
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/defer.js
13267
- var defer = __webpack_require__(9917);
13268
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/of.js
13269
- var of = __webpack_require__(2817);
13270
13339
  // EXTERNAL MODULE: ./src/compat/browser_detection.ts
13271
13340
  var browser_detection = __webpack_require__(3666);
13272
13341
  ;// CONCATENATED MODULE: ./src/compat/add_text_track.ts
@@ -13468,7 +13537,6 @@ function parseTextTrackToCues(type, data, timestampOffset, language) {
13468
13537
 
13469
13538
 
13470
13539
 
13471
-
13472
13540
  /**
13473
13541
  * Implementation of an SegmentBuffer for "native" text tracks.
13474
13542
  * "Native" text tracks rely on a `<track>` HTMLElement and its associated
@@ -13502,36 +13570,35 @@ var NativeTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13502
13570
  }
13503
13571
  /**
13504
13572
  * @param {Object} infos
13505
- * @returns {Observable}
13573
+ * @returns {Promise}
13506
13574
  */
13507
13575
 
13508
13576
 
13509
13577
  var _proto = NativeTextSegmentBuffer.prototype;
13510
13578
 
13511
13579
  _proto.pushChunk = function pushChunk(infos) {
13512
- var _this2 = this;
13580
+ var _a, _b;
13513
13581
 
13514
- return (0,defer/* defer */.P)(function () {
13515
- var _a, _b;
13582
+ log/* default.debug */.Z.debug("NTSB: Appending new native text tracks");
13516
13583
 
13517
- log/* default.debug */.Z.debug("NTSB: Appending new native text tracks");
13584
+ if (infos.data.chunk === null) {
13585
+ return Promise.resolve();
13586
+ }
13518
13587
 
13519
- if (infos.data.chunk === null) {
13520
- return (0,of.of)(undefined);
13521
- }
13588
+ var _infos$data = infos.data,
13589
+ timestampOffset = _infos$data.timestampOffset,
13590
+ appendWindow = _infos$data.appendWindow,
13591
+ chunk = _infos$data.chunk;
13592
+ assertChunkIsTextTrackSegmentData(chunk);
13593
+ var startTime = chunk.start,
13594
+ endTime = chunk.end,
13595
+ dataString = chunk.data,
13596
+ type = chunk.type,
13597
+ language = chunk.language;
13598
+ var appendWindowStart = (_a = appendWindow[0]) !== null && _a !== void 0 ? _a : 0;
13599
+ var appendWindowEnd = (_b = appendWindow[1]) !== null && _b !== void 0 ? _b : Infinity;
13522
13600
 
13523
- var _infos$data = infos.data,
13524
- timestampOffset = _infos$data.timestampOffset,
13525
- appendWindow = _infos$data.appendWindow,
13526
- chunk = _infos$data.chunk;
13527
- assertChunkIsTextTrackSegmentData(chunk);
13528
- var startTime = chunk.start,
13529
- endTime = chunk.end,
13530
- dataString = chunk.data,
13531
- type = chunk.type,
13532
- language = chunk.language;
13533
- var appendWindowStart = (_a = appendWindow[0]) !== null && _a !== void 0 ? _a : 0;
13534
- var appendWindowEnd = (_b = appendWindow[1]) !== null && _b !== void 0 ? _b : Infinity;
13601
+ try {
13535
13602
  var cues = parseTextTrackToCues(type, dataString, timestampOffset, language);
13536
13603
 
13537
13604
  if (appendWindowStart !== 0 && appendWindowEnd !== Infinity) {
@@ -13573,7 +13640,7 @@ var NativeTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13573
13640
  } else {
13574
13641
  if (cues.length <= 0) {
13575
13642
  log/* default.warn */.Z.warn("NTSB: Current text tracks have no cues nor start time. Aborting");
13576
- return (0,of.of)(undefined);
13643
+ return Promise.resolve();
13577
13644
  }
13578
13645
 
13579
13646
  log/* default.warn */.Z.warn("NTSB: No start time given. Guessing from cues.");
@@ -13587,7 +13654,7 @@ var NativeTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13587
13654
  } else {
13588
13655
  if (cues.length <= 0) {
13589
13656
  log/* default.warn */.Z.warn("NTSB: Current text tracks have no cues nor end time. Aborting");
13590
- return (0,of.of)(undefined);
13657
+ return Promise.resolve();
13591
13658
  }
13592
13659
 
13593
13660
  log/* default.warn */.Z.warn("NTSB: No end time given. Guessing from cues.");
@@ -13596,7 +13663,7 @@ var NativeTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13596
13663
 
13597
13664
  if (end <= start) {
13598
13665
  log/* default.warn */.Z.warn("NTSB: Invalid text track appended: ", "the start time is inferior or equal to the end time.");
13599
- return (0,of.of)(undefined);
13666
+ return Promise.resolve();
13600
13667
  }
13601
13668
 
13602
13669
  if (cues.length > 0) {
@@ -13605,64 +13672,53 @@ var NativeTextSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
13605
13672
  // IE/Edge.
13606
13673
  // TODO Move to compat
13607
13674
 
13608
- var currentCues = _this2._track.cues;
13675
+ var currentCues = this._track.cues;
13609
13676
 
13610
13677
  if (currentCues !== null && currentCues.length > 0) {
13611
13678
  if (firstCue.startTime < currentCues[currentCues.length - 1].startTime) {
13612
- _this2._removeData(firstCue.startTime, +Infinity);
13679
+ this._removeData(firstCue.startTime, +Infinity);
13613
13680
  }
13614
13681
  }
13615
13682
 
13616
13683
  for (var _i = 0; _i < cues.length; _i++) {
13617
- _this2._track.addCue(cues[_i]);
13684
+ this._track.addCue(cues[_i]);
13618
13685
  }
13619
13686
  }
13620
13687
 
13621
- _this2._buffered.insert(start, end);
13688
+ this._buffered.insert(start, end);
13622
13689
 
13623
13690
  if (infos.inventoryInfos !== null) {
13624
- _this2._segmentInventory.insertChunk(infos.inventoryInfos);
13691
+ this._segmentInventory.insertChunk(infos.inventoryInfos);
13625
13692
  }
13693
+ } catch (err) {
13694
+ return Promise.reject(err);
13695
+ }
13626
13696
 
13627
- return (0,of.of)(undefined);
13628
- });
13697
+ return Promise.resolve();
13629
13698
  }
13630
13699
  /**
13631
13700
  * Remove buffered data.
13632
13701
  * @param {number} start - start position, in seconds
13633
13702
  * @param {number} end - end position, in seconds
13634
- * @returns {Observable}
13703
+ * @returns {Promise}
13635
13704
  */
13636
13705
  ;
13637
13706
 
13638
13707
  _proto.removeBuffer = function removeBuffer(start, end) {
13639
- var _this3 = this;
13708
+ this._removeData(start, end);
13640
13709
 
13641
- return (0,defer/* defer */.P)(function () {
13642
- _this3._removeData(start, end);
13643
-
13644
- return (0,of.of)(undefined);
13645
- });
13710
+ return Promise.resolve();
13646
13711
  }
13647
13712
  /**
13648
- * Indicate that every chunks from a Segment has been given to pushChunk so
13649
- * far.
13650
- * This will update our internal Segment inventory accordingly.
13651
- * The returned Observable will emit and complete successively once the whole
13652
- * segment has been pushed and this indication is acknowledged.
13653
13713
  * @param {Object} infos
13654
- * @returns {Observable}
13714
+ * @returns {Promise}
13655
13715
  */
13656
13716
  ;
13657
13717
 
13658
13718
  _proto.endOfSegment = function endOfSegment(_infos) {
13659
- var _this4 = this;
13660
-
13661
- return (0,defer/* defer */.P)(function () {
13662
- _this4._segmentInventory.completeSegment(_infos, _this4._buffered);
13719
+ this._segmentInventory.completeSegment(_infos, this._buffered);
13663
13720
 
13664
- return (0,of.of)(undefined);
13665
- });
13721
+ return Promise.resolve();
13666
13722
  }
13667
13723
  /**
13668
13724
  * Returns the currently buffered data, in a TimeRanges object.
@@ -15340,9 +15396,10 @@ var CustomLoaderError = /*#__PURE__*/function (_Error) {
15340
15396
  (0,_babel_runtime_helpers_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z)(CustomLoaderError, _Error);
15341
15397
 
15342
15398
  /**
15399
+ * @param {string} message
15400
+ * @param {boolean} canRetry
15401
+ * @param {boolean} isOfflineError
15343
15402
  * @param {XMLHttpRequest} xhr
15344
- * @param {string} url
15345
- * @param {string} type
15346
15403
  */
15347
15404
  function CustomLoaderError(message, canRetry, isOfflineError, xhr) {
15348
15405
  var _this;
@@ -31849,12 +31906,13 @@ var take_first_set = __webpack_require__(5278);
31849
31906
  * Loads an image segment.
31850
31907
  * @param {string|null} url
31851
31908
  * @param {Object} content
31909
+ * @param {Object} options
31852
31910
  * @param {Object} cancelSignal
31853
31911
  * @param {Object} callbacks
31854
31912
  * @returns {Promise}
31855
31913
  */
31856
31914
 
31857
- function imageLoader(_x, _x2, _x3, _x4) {
31915
+ function imageLoader(_x, _x2, _x3, _x4, _x5) {
31858
31916
  return _imageLoader.apply(this, arguments);
31859
31917
  }
31860
31918
  /**
@@ -31865,7 +31923,7 @@ function imageLoader(_x, _x2, _x3, _x4) {
31865
31923
  */
31866
31924
 
31867
31925
  function _imageLoader() {
31868
- _imageLoader = (0,asyncToGenerator/* default */.Z)( /*#__PURE__*/regenerator_default().mark(function _callee(url, content, cancelSignal, callbacks) {
31926
+ _imageLoader = (0,asyncToGenerator/* default */.Z)( /*#__PURE__*/regenerator_default().mark(function _callee(url, content, options, cancelSignal, callbacks) {
31869
31927
  var segment, data;
31870
31928
  return regenerator_default().wrap(function _callee$(_context) {
31871
31929
  while (1) {
@@ -31888,6 +31946,7 @@ function _imageLoader() {
31888
31946
  return (0,request/* default */.ZP)({
31889
31947
  url: url,
31890
31948
  responseType: "arraybuffer",
31949
+ timeout: options.timeout,
31891
31950
  onProgress: callbacks.onProgress,
31892
31951
  cancelSignal: cancelSignal
31893
31952
  });
@@ -31968,6 +32027,8 @@ function imageParser(loadedSegment, content) {
31968
32027
  appendWindow: [period.start, period.end]
31969
32028
  };
31970
32029
  }
32030
+ // EXTERNAL MODULE: ./src/config.ts + 2 modules
32031
+ var config = __webpack_require__(6872);
31971
32032
  // EXTERNAL MODULE: ./src/errors/format_error.ts
31972
32033
  var format_error = __webpack_require__(8750);
31973
32034
  // EXTERNAL MODULE: ./src/log.ts + 1 modules
@@ -32001,6 +32062,7 @@ var string_parsing = __webpack_require__(3635);
32001
32062
 
32002
32063
 
32003
32064
 
32065
+
32004
32066
  function generateManifestParser(options) {
32005
32067
  var aggressiveMode = options.aggressiveMode,
32006
32068
  referenceDateTime = options.referenceDateTime;
@@ -32098,13 +32160,16 @@ function generateManifestParser(options) {
32098
32160
  var value = parserResponse.value;
32099
32161
  var externalResources = value.urls.map(function (resourceUrl) {
32100
32162
  return scheduleRequest(function () {
32163
+ var defaultTimeout = config/* default.getCurrent */.Z.getCurrent().DEFAULT_REQUEST_TIMEOUT;
32101
32164
  return value.format === "string" ? (0,request/* default */.ZP)({
32102
32165
  url: resourceUrl,
32103
32166
  responseType: "text",
32167
+ timeout: defaultTimeout,
32104
32168
  cancelSignal: cancelSignal
32105
32169
  }) : (0,request/* default */.ZP)({
32106
32170
  url: resourceUrl,
32107
32171
  responseType: "arraybuffer",
32172
+ timeout: defaultTimeout,
32108
32173
  cancelSignal: cancelSignal
32109
32174
  });
32110
32175
  }).then(function (res) {
@@ -32278,8 +32343,6 @@ function doesXmlSeemsUtf8Encoded(xmlData) {
32278
32343
  }
32279
32344
  // EXTERNAL MODULE: ./src/errors/custom_loader_error.ts
32280
32345
  var custom_loader_error = __webpack_require__(7839);
32281
- // EXTERNAL MODULE: ./src/config.ts + 2 modules
32282
- var config = __webpack_require__(6872);
32283
32346
  // EXTERNAL MODULE: ./src/errors/request_error.ts
32284
32347
  var request_error = __webpack_require__(9105);
32285
32348
  // EXTERNAL MODULE: ./src/errors/error_codes.ts
@@ -32309,7 +32372,6 @@ var is_null_or_undefined = __webpack_require__(1946);
32309
32372
 
32310
32373
 
32311
32374
 
32312
-
32313
32375
  var _Headers = typeof Headers === "function" ? Headers : null;
32314
32376
 
32315
32377
  var _AbortController = typeof AbortController === "function" ? AbortController : null;
@@ -32350,11 +32412,15 @@ function fetchRequest(options) {
32350
32412
  abortController.abort();
32351
32413
  }
32352
32414
 
32353
- var requestTimeout = (0,is_null_or_undefined/* default */.Z)(options.timeout) ? config/* default.getCurrent */.Z.getCurrent().DEFAULT_REQUEST_TIMEOUT : options.timeout;
32354
- var timeout = window.setTimeout(function () {
32355
- timeouted = true;
32356
- abortFetch();
32357
- }, requestTimeout);
32415
+ var timeout;
32416
+
32417
+ if (options.timeout !== undefined) {
32418
+ timeout = window.setTimeout(function () {
32419
+ timeouted = true;
32420
+ abortFetch();
32421
+ }, options.timeout);
32422
+ }
32423
+
32358
32424
  var deregisterCancelLstnr = options.cancelSignal.register(function abortRequest(err) {
32359
32425
  cancellation = err;
32360
32426
  abortFetch();
@@ -32563,7 +32629,7 @@ var check_isobmff_integrity = __webpack_require__(4460);
32563
32629
  */
32564
32630
 
32565
32631
  function addSegmentIntegrityChecks(segmentLoader) {
32566
- return function (url, content, initialCancelSignal, callbacks) {
32632
+ return function (url, content, loaderOptions, initialCancelSignal, callbacks) {
32567
32633
  return new Promise(function (resolve, reject) {
32568
32634
  var requestCanceller = new task_canceller/* default */.ZP({
32569
32635
  cancelOn: initialCancelSignal
@@ -32571,7 +32637,7 @@ function addSegmentIntegrityChecks(segmentLoader) {
32571
32637
  // `stopRejectingOnCancel` here is a function allowing to stop this mechanism
32572
32638
 
32573
32639
  var stopRejectingOnCancel = requestCanceller.signal.register(reject);
32574
- segmentLoader(url, content, requestCanceller.signal, Object.assign(Object.assign({}, callbacks), {
32640
+ segmentLoader(url, content, loaderOptions, requestCanceller.signal, Object.assign(Object.assign({}, callbacks), {
32575
32641
  onNewChunk: function onNewChunk(data) {
32576
32642
  try {
32577
32643
  trowOnIntegrityError(data);
@@ -32646,16 +32712,18 @@ var byte_parsing = __webpack_require__(6968);
32646
32712
  * Perform a request for an initialization segment, agnostic to the container.
32647
32713
  * @param {string} url
32648
32714
  * @param {Object} segment
32715
+ * @param {Object} options
32649
32716
  * @param {CancellationSignal} cancelSignal
32650
32717
  * @param {Object} callbacks
32651
32718
  * @returns {Promise}
32652
32719
  */
32653
32720
 
32654
- function initSegmentLoader(url, segment, cancelSignal, callbacks) {
32721
+ function initSegmentLoader(url, segment, options, cancelSignal, callbacks) {
32655
32722
  if (segment.range === undefined) {
32656
32723
  return (0,request/* default */.ZP)({
32657
32724
  url: url,
32658
32725
  responseType: "arraybuffer",
32726
+ timeout: options.timeout,
32659
32727
  cancelSignal: cancelSignal,
32660
32728
  onProgress: callbacks.onProgress
32661
32729
  }).then(function (data) {
@@ -32673,6 +32741,7 @@ function initSegmentLoader(url, segment, cancelSignal, callbacks) {
32673
32741
  Range: (0,byte_range/* default */.Z)(segment.range)
32674
32742
  },
32675
32743
  responseType: "arraybuffer",
32744
+ timeout: options.timeout,
32676
32745
  cancelSignal: cancelSignal,
32677
32746
  onProgress: callbacks.onProgress
32678
32747
  }).then(function (data) {
@@ -32691,6 +32760,7 @@ function initSegmentLoader(url, segment, cancelSignal, callbacks) {
32691
32760
  Range: (0,byte_range/* default */.Z)([segment.range[0], segment.indexRange[1]])
32692
32761
  },
32693
32762
  responseType: "arraybuffer",
32763
+ timeout: options.timeout,
32694
32764
  cancelSignal: cancelSignal,
32695
32765
  onProgress: callbacks.onProgress
32696
32766
  }).then(function (data) {
@@ -32707,6 +32777,7 @@ function initSegmentLoader(url, segment, cancelSignal, callbacks) {
32707
32777
  Range: (0,byte_range/* default */.Z)(segment.range)
32708
32778
  },
32709
32779
  responseType: "arraybuffer",
32780
+ timeout: options.timeout,
32710
32781
  cancelSignal: cancelSignal,
32711
32782
  onProgress: callbacks.onProgress
32712
32783
  });
@@ -32716,6 +32787,7 @@ function initSegmentLoader(url, segment, cancelSignal, callbacks) {
32716
32787
  Range: (0,byte_range/* default */.Z)(segment.indexRange)
32717
32788
  },
32718
32789
  responseType: "arraybuffer",
32790
+ timeout: options.timeout,
32719
32791
  cancelSignal: cancelSignal,
32720
32792
  onProgress: callbacks.onProgress
32721
32793
  });
@@ -32842,12 +32914,13 @@ function extractCompleteChunks(buffer) {
32842
32914
  *
32843
32915
  * @param {string} url - URL of the segment to download.
32844
32916
  * @param {Object} content - Context of the segment needed.
32917
+ * @param {Object} options
32845
32918
  * @param {Object} callbacks
32846
32919
  * @param {CancellationSignal} cancelSignal
32847
32920
  * @returns {Promise}
32848
32921
  */
32849
32922
 
32850
- function lowLatencySegmentLoader(url, content, callbacks, cancelSignal) {
32923
+ function lowLatencySegmentLoader(url, content, options, callbacks, cancelSignal) {
32851
32924
  var segment = content.segment;
32852
32925
  var headers = segment.range !== undefined ? {
32853
32926
  Range: (0,byte_range/* default */.Z)(segment.range)
@@ -32888,6 +32961,7 @@ function lowLatencySegmentLoader(url, content, callbacks, cancelSignal) {
32888
32961
  url: url,
32889
32962
  headers: headers,
32890
32963
  onData: onData,
32964
+ timeout: options.timeout,
32891
32965
  cancelSignal: cancelSignal
32892
32966
  }).then(function (res) {
32893
32967
  return {
@@ -32925,21 +32999,22 @@ function lowLatencySegmentLoader(url, content, callbacks, cancelSignal) {
32925
32999
  * @param {string} url
32926
33000
  * @param {Object} content
32927
33001
  * @param {boolean} lowLatencyMode
33002
+ * @param {Object} options
32928
33003
  * @param {Object} callbacks
32929
33004
  * @param {Object} cancelSignal
32930
33005
  * @returns {Promise}
32931
33006
  */
32932
33007
 
32933
- function regularSegmentLoader(url, content, lowLatencyMode, callbacks, cancelSignal) {
33008
+ function regularSegmentLoader(url, content, lowLatencyMode, options, callbacks, cancelSignal) {
32934
33009
  if (content.segment.isInit) {
32935
- return initSegmentLoader(url, content.segment, cancelSignal, callbacks);
33010
+ return initSegmentLoader(url, content.segment, options, cancelSignal, callbacks);
32936
33011
  }
32937
33012
 
32938
33013
  var containerType = inferSegmentContainer(content.adaptation.type, content.representation);
32939
33014
 
32940
33015
  if (lowLatencyMode && (containerType === "mp4" || containerType === undefined)) {
32941
33016
  if (fetchIsSupported()) {
32942
- return lowLatencySegmentLoader(url, content, callbacks, cancelSignal);
33017
+ return lowLatencySegmentLoader(url, content, options, callbacks, cancelSignal);
32943
33018
  } else {
32944
33019
  (0,warn_once/* default */.Z)("DASH: Your browser does not have the fetch API. You will have " + "a higher chance of rebuffering when playing close to the live edge");
32945
33020
  }
@@ -32952,6 +33027,7 @@ function regularSegmentLoader(url, content, lowLatencyMode, callbacks, cancelSig
32952
33027
  headers: segment.range !== undefined ? {
32953
33028
  Range: (0,byte_range/* default */.Z)(segment.range)
32954
33029
  } : undefined,
33030
+ timeout: options.timeout,
32955
33031
  cancelSignal: cancelSignal,
32956
33032
  onProgress: callbacks.onProgress
32957
33033
  }).then(function (data) {
@@ -32976,7 +33052,7 @@ function generateSegmentLoader(_ref) {
32976
33052
  * @returns {Observable}
32977
33053
  */
32978
33054
 
32979
- function segmentLoader(url, content, cancelSignal, callbacks) {
33055
+ function segmentLoader(url, content, options, cancelSignal, callbacks) {
32980
33056
  if (url == null) {
32981
33057
  return Promise.resolve({
32982
33058
  resultType: "segment-created",
@@ -32985,7 +33061,7 @@ function generateSegmentLoader(_ref) {
32985
33061
  }
32986
33062
 
32987
33063
  if (lowLatencyMode || customSegmentLoader === undefined) {
32988
- return regularSegmentLoader(url, content, lowLatencyMode, callbacks, cancelSignal);
33064
+ return regularSegmentLoader(url, content, lowLatencyMode, options, callbacks, cancelSignal);
32989
33065
  }
32990
33066
 
32991
33067
  var args = {
@@ -32995,6 +33071,7 @@ function generateSegmentLoader(_ref) {
32995
33071
  representation: content.representation,
32996
33072
  segment: content.segment,
32997
33073
  transport: "dash",
33074
+ timeout: options.timeout,
32998
33075
  url: url
32999
33076
  };
33000
33077
  return new Promise(function (res, rej) {
@@ -33002,7 +33079,7 @@ function generateSegmentLoader(_ref) {
33002
33079
  var hasFinished = false;
33003
33080
  /**
33004
33081
  * Callback triggered when the custom segment loader has a response.
33005
- * @param {Object} args
33082
+ * @param {Object} _args
33006
33083
  */
33007
33084
 
33008
33085
  var resolve = function resolve(_args) {
@@ -33067,7 +33144,7 @@ function generateSegmentLoader(_ref) {
33067
33144
 
33068
33145
  hasFinished = true;
33069
33146
  cancelSignal.deregister(abortCustomLoader);
33070
- regularSegmentLoader(url, content, lowLatencyMode, callbacks, cancelSignal).then(res, rej);
33147
+ regularSegmentLoader(url, content, lowLatencyMode, options, callbacks, cancelSignal).then(res, rej);
33071
33148
  };
33072
33149
 
33073
33150
  var customCallbacks = {
@@ -33801,12 +33878,13 @@ function generateTextTrackLoader(_ref) {
33801
33878
  /**
33802
33879
  * @param {string|null} url
33803
33880
  * @param {Object} content
33881
+ * @param {Object} options
33804
33882
  * @param {Object} cancelSignal
33805
33883
  * @param {Object} callbacks
33806
33884
  * @returns {Promise}
33807
33885
  */
33808
33886
 
33809
- function textTrackLoader(url, content, cancelSignal, callbacks) {
33887
+ function textTrackLoader(url, content, options, cancelSignal, callbacks) {
33810
33888
  var adaptation = content.adaptation,
33811
33889
  representation = content.representation,
33812
33890
  segment = content.segment;
@@ -33820,7 +33898,7 @@ function generateTextTrackLoader(_ref) {
33820
33898
  }
33821
33899
 
33822
33900
  if (segment.isInit) {
33823
- return initSegmentLoader(url, segment, cancelSignal, callbacks);
33901
+ return initSegmentLoader(url, segment, options, cancelSignal, callbacks);
33824
33902
  }
33825
33903
 
33826
33904
  var containerType = inferSegmentContainer(adaptation.type, representation);
@@ -33828,7 +33906,7 @@ function generateTextTrackLoader(_ref) {
33828
33906
 
33829
33907
  if (lowLatencyMode && seemsToBeMP4) {
33830
33908
  if (fetchIsSupported()) {
33831
- return lowLatencySegmentLoader(url, content, callbacks, cancelSignal);
33909
+ return lowLatencySegmentLoader(url, content, options, callbacks, cancelSignal);
33832
33910
  } else {
33833
33911
  (0,warn_once/* default */.Z)("DASH: Your browser does not have the fetch API. You will have " + "a higher chance of rebuffering when playing close to the live edge");
33834
33912
  }
@@ -33841,6 +33919,7 @@ function generateTextTrackLoader(_ref) {
33841
33919
  headers: Array.isArray(range) ? {
33842
33920
  Range: (0,byte_range/* default */.Z)(range)
33843
33921
  } : null,
33922
+ timeout: options.timeout,
33844
33923
  onProgress: callbacks.onProgress,
33845
33924
  cancelSignal: cancelSignal
33846
33925
  }).then(function (data) {
@@ -33857,6 +33936,7 @@ function generateTextTrackLoader(_ref) {
33857
33936
  headers: Array.isArray(range) ? {
33858
33937
  Range: (0,byte_range/* default */.Z)(range)
33859
33938
  } : null,
33939
+ timeout: options.timeout,
33860
33940
  onProgress: callbacks.onProgress,
33861
33941
  cancelSignal: cancelSignal
33862
33942
  }).then(function (data) {
@@ -37287,13 +37367,14 @@ function isMP4EmbeddedTrack(representation) {
37287
37367
  * Segment loader triggered if there was no custom-defined one in the API.
37288
37368
  * @param {string} url
37289
37369
  * @param {Object} content
37370
+ * @param {Object} loaderOptions
37290
37371
  * @param {Object} callbacks
37291
37372
  * @param {Object} cancelSignal
37292
37373
  * @param {boolean} checkMediaSegmentIntegrity
37293
37374
  * @returns {Promise}
37294
37375
  */
37295
37376
 
37296
- function regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaSegmentIntegrity) {
37377
+ function regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity) {
37297
37378
  var headers;
37298
37379
  var range = content.segment.range;
37299
37380
 
@@ -37307,6 +37388,7 @@ function regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaS
37307
37388
  url: url,
37308
37389
  responseType: "arraybuffer",
37309
37390
  headers: headers,
37391
+ timeout: loaderOptions.timeout,
37310
37392
  cancelSignal: cancelSignal,
37311
37393
  onProgress: callbacks.onProgress
37312
37394
  }).then(function (data) {
@@ -37338,7 +37420,7 @@ function regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaS
37338
37420
  var generateSegmentLoader = function generateSegmentLoader(_ref) {
37339
37421
  var checkMediaSegmentIntegrity = _ref.checkMediaSegmentIntegrity,
37340
37422
  customSegmentLoader = _ref.customSegmentLoader;
37341
- return function (url, content, cancelSignal, callbacks) {
37423
+ return function (url, content, loaderOptions, cancelSignal, callbacks) {
37342
37424
  var segment = content.segment,
37343
37425
  manifest = content.manifest,
37344
37426
  period = content.period,
@@ -37413,11 +37495,12 @@ var generateSegmentLoader = function generateSegmentLoader(_ref) {
37413
37495
  representation: representation,
37414
37496
  segment: segment,
37415
37497
  transport: "smooth",
37498
+ timeout: loaderOptions.timeout,
37416
37499
  url: url
37417
37500
  };
37418
37501
 
37419
37502
  if (typeof customSegmentLoader !== "function") {
37420
- return regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaSegmentIntegrity);
37503
+ return regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity);
37421
37504
  }
37422
37505
 
37423
37506
  return new Promise(function (res, rej) {
@@ -37500,7 +37583,7 @@ var generateSegmentLoader = function generateSegmentLoader(_ref) {
37500
37583
 
37501
37584
  hasFinished = true;
37502
37585
  cancelSignal.deregister(abortCustomLoader);
37503
- regularSegmentLoader(url, content, callbacks, cancelSignal, checkMediaSegmentIntegrity).then(res, rej);
37586
+ regularSegmentLoader(url, content, callbacks, loaderOptions, cancelSignal, checkMediaSegmentIntegrity).then(res, rej);
37504
37587
  };
37505
37588
 
37506
37589
  var customCallbacks = {
@@ -37592,11 +37675,11 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37592
37675
  }
37593
37676
  }
37594
37677
 
37595
- /* harmony default export */ function pipelines(options) {
37596
- var smoothManifestParser = smooth(options);
37597
- var segmentLoader = segment_loader(options);
37678
+ /* harmony default export */ function pipelines(transportOptions) {
37679
+ var smoothManifestParser = smooth(transportOptions);
37680
+ var segmentLoader = segment_loader(transportOptions);
37598
37681
  var manifestLoaderOptions = {
37599
- customManifestLoader: options.manifestLoader
37682
+ customManifestLoader: transportOptions.manifestLoader
37600
37683
  };
37601
37684
  var manifestLoader = (0,generate_manifest_loader/* default */.Z)(manifestLoaderOptions, "text");
37602
37685
  var manifestPipeline = {
@@ -37643,9 +37726,9 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37643
37726
 
37644
37727
  var parserResult = smoothManifestParser(documentData, url, manifestReceivedTime);
37645
37728
  var manifest = new src_manifest/* default */.ZP(parserResult, {
37646
- representationFilter: options.representationFilter,
37647
- supplementaryImageTracks: options.supplementaryImageTracks,
37648
- supplementaryTextTracks: options.supplementaryTextTracks
37729
+ representationFilter: transportOptions.representationFilter,
37730
+ supplementaryImageTracks: transportOptions.supplementaryImageTracks,
37731
+ supplementaryTextTracks: transportOptions.supplementaryTextTracks
37649
37732
  });
37650
37733
  return {
37651
37734
  manifest: manifest,
@@ -37663,12 +37746,13 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37663
37746
  * Load a Smooth audio/video segment.
37664
37747
  * @param {string|null} url
37665
37748
  * @param {Object} content
37749
+ * @param {Object} loaderOptions
37666
37750
  * @param {Object} cancelSignal
37667
37751
  * @param {Object} callbacks
37668
37752
  * @returns {Promise}
37669
37753
  */
37670
- loadSegment: function loadSegment(url, content, cancelSignal, callbacks) {
37671
- return segmentLoader(url, content, cancelSignal, callbacks);
37754
+ loadSegment: function loadSegment(url, content, loaderOptions, cancelSignal, callbacks) {
37755
+ return segmentLoader(url, content, loaderOptions, cancelSignal, callbacks);
37672
37756
  },
37673
37757
  parseSegment: function parseSegment(loadedSegment, content, initTimescale) {
37674
37758
  var _a, _b;
@@ -37743,7 +37827,7 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37743
37827
  }
37744
37828
  };
37745
37829
  var textTrackPipeline = {
37746
- loadSegment: function loadSegment(url, content, cancelSignal, callbacks) {
37830
+ loadSegment: function loadSegment(url, content, loaderOptions, cancelSignal, callbacks) {
37747
37831
  var segment = content.segment,
37748
37832
  representation = content.representation;
37749
37833
 
@@ -37760,6 +37844,7 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37760
37844
  return (0,request/* default */.ZP)({
37761
37845
  url: url,
37762
37846
  responseType: "text",
37847
+ timeout: loaderOptions.timeout,
37763
37848
  cancelSignal: cancelSignal,
37764
37849
  onProgress: callbacks.onProgress
37765
37850
  }).then(function (data) {
@@ -37772,10 +37857,11 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37772
37857
  return (0,request/* default */.ZP)({
37773
37858
  url: url,
37774
37859
  responseType: "arraybuffer",
37860
+ timeout: loaderOptions.timeout,
37775
37861
  cancelSignal: cancelSignal,
37776
37862
  onProgress: callbacks.onProgress
37777
37863
  }).then(function (data) {
37778
- if (options.checkMediaSegmentIntegrity !== true) {
37864
+ if (transportOptions.checkMediaSegmentIntegrity !== true) {
37779
37865
  return {
37780
37866
  resultType: "segment-loaded",
37781
37867
  resultData: data
@@ -37946,7 +38032,7 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37946
38032
  }
37947
38033
  };
37948
38034
  var imageTrackPipeline = {
37949
- loadSegment: function loadSegment(url, content, cancelSignal, callbacks) {
38035
+ loadSegment: function loadSegment(url, content, loaderOptions, cancelSignal, callbacks) {
37950
38036
  return (0,asyncToGenerator/* default */.Z)( /*#__PURE__*/regenerator_default().mark(function _callee() {
37951
38037
  var data;
37952
38038
  return regenerator_default().wrap(function _callee$(_context) {
@@ -37968,6 +38054,7 @@ function addNextSegments(adaptation, nextSegments, dlSegment) {
37968
38054
  return (0,request/* default */.ZP)({
37969
38055
  url: url,
37970
38056
  responseType: "arraybuffer",
38057
+ timeout: loaderOptions.timeout,
37971
38058
  onProgress: callbacks.onProgress,
37972
38059
  cancelSignal: cancelSignal
37973
38060
  });
@@ -38291,7 +38378,7 @@ var custom_loader_error = __webpack_require__(7839);
38291
38378
  */
38292
38379
 
38293
38380
  function callCustomManifestLoader(customManifestLoader, fallbackManifestLoader) {
38294
- return function (url, cancelSignal) {
38381
+ return function (url, loaderOptions, cancelSignal) {
38295
38382
  return new Promise(function (res, rej) {
38296
38383
  var timeAPIsDelta = Date.now() - performance.now();
38297
38384
  /** `true` when the custom segmentLoader should not be active anymore. */
@@ -38354,7 +38441,7 @@ function callCustomManifestLoader(customManifestLoader, fallbackManifestLoader)
38354
38441
 
38355
38442
  hasFinished = true;
38356
38443
  cancelSignal.deregister(abortCustomLoader);
38357
- fallbackManifestLoader(url, cancelSignal).then(res, rej);
38444
+ fallbackManifestLoader(url, loaderOptions, cancelSignal).then(res, rej);
38358
38445
  };
38359
38446
 
38360
38447
  var callbacks = {
@@ -38362,7 +38449,9 @@ function callCustomManifestLoader(customManifestLoader, fallbackManifestLoader)
38362
38449
  resolve: resolve,
38363
38450
  fallback: fallback
38364
38451
  };
38365
- var abort = customManifestLoader(url, callbacks);
38452
+ var abort = customManifestLoader(url, callbacks, {
38453
+ timeout: loaderOptions.timeout
38454
+ });
38366
38455
  cancelSignal.register(abortCustomLoader);
38367
38456
  /**
38368
38457
  * The logic to run when the custom loader is cancelled while pending.
@@ -38406,12 +38495,12 @@ function callCustomManifestLoader(customManifestLoader, fallbackManifestLoader)
38406
38495
 
38407
38496
  /**
38408
38497
  * Manifest loader triggered if there was no custom-defined one in the API.
38409
- * @param {string} url
38410
- * @returns {Observable}
38498
+ * @param {string} preferredType
38499
+ * @returns {Function}
38411
38500
  */
38412
38501
 
38413
38502
  function generateRegularManifestLoader(preferredType) {
38414
- return function regularManifestLoader(url, cancelSignal) {
38503
+ return function regularManifestLoader(url, loaderOptions, cancelSignal) {
38415
38504
  if (url === undefined) {
38416
38505
  throw new Error("Cannot perform HTTP(s) request. URL not known");
38417
38506
  } // What follows could be written in a single line, but TypeScript wouldn't
@@ -38424,6 +38513,7 @@ function generateRegularManifestLoader(preferredType) {
38424
38513
  return (0,request/* default */.ZP)({
38425
38514
  url: url,
38426
38515
  responseType: "arraybuffer",
38516
+ timeout: loaderOptions.timeout,
38427
38517
  cancelSignal: cancelSignal
38428
38518
  });
38429
38519
 
@@ -38431,6 +38521,7 @@ function generateRegularManifestLoader(preferredType) {
38431
38521
  return (0,request/* default */.ZP)({
38432
38522
  url: url,
38433
38523
  responseType: "text",
38524
+ timeout: loaderOptions.timeout,
38434
38525
  cancelSignal: cancelSignal
38435
38526
  });
38436
38527
 
@@ -38438,6 +38529,7 @@ function generateRegularManifestLoader(preferredType) {
38438
38529
  return (0,request/* default */.ZP)({
38439
38530
  url: url,
38440
38531
  responseType: "document",
38532
+ timeout: loaderOptions.timeout,
38441
38533
  cancelSignal: cancelSignal
38442
38534
  });
38443
38535
 
@@ -41474,8 +41566,6 @@ __webpack_require__.d(__webpack_exports__, {
41474
41566
 
41475
41567
  // UNUSED EXPORTS: fetchIsSupported, fetchRequest, xhr
41476
41568
 
41477
- // EXTERNAL MODULE: ./src/config.ts + 2 modules
41478
- var config = __webpack_require__(6872);
41479
41569
  // EXTERNAL MODULE: ./src/errors/request_error.ts
41480
41570
  var request_error = __webpack_require__(9105);
41481
41571
  // EXTERNAL MODULE: ./src/utils/is_non_empty_string.ts
@@ -41501,17 +41591,13 @@ var is_null_or_undefined = __webpack_require__(1946);
41501
41591
 
41502
41592
 
41503
41593
 
41504
-
41505
41594
  var DEFAULT_RESPONSE_TYPE = "json";
41506
41595
  function request(options) {
41507
- var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
41508
- DEFAULT_REQUEST_TIMEOUT = _config$getCurrent.DEFAULT_REQUEST_TIMEOUT;
41509
-
41510
41596
  var requestOptions = {
41511
41597
  url: options.url,
41512
41598
  headers: options.headers,
41513
41599
  responseType: (0,is_null_or_undefined/* default */.Z)(options.responseType) ? DEFAULT_RESPONSE_TYPE : options.responseType,
41514
- timeout: (0,is_null_or_undefined/* default */.Z)(options.timeout) ? DEFAULT_REQUEST_TIMEOUT : options.timeout
41600
+ timeout: options.timeout
41515
41601
  };
41516
41602
  return new Promise(function (resolve, reject) {
41517
41603
  var onProgress = options.onProgress,
@@ -41522,9 +41608,20 @@ function request(options) {
41522
41608
  timeout = requestOptions.timeout;
41523
41609
  var xhr = new XMLHttpRequest();
41524
41610
  xhr.open("GET", url, true);
41611
+ var timeoutId;
41525
41612
 
41526
- if (timeout >= 0) {
41527
- xhr.timeout = timeout;
41613
+ if (timeout !== undefined) {
41614
+ xhr.timeout = timeout; // We've seen on some browser (mainly on some LG TVs), that `xhr.timeout`
41615
+ // was either not supported or did not function properly despite the
41616
+ // browser being recent enough to support it.
41617
+ // That's why we also start a manual timeout. We do this a little later
41618
+ // than the "native one" performed on the xhr assuming that the latter
41619
+ // is more precise, it might also be more efficient.
41620
+
41621
+ timeoutId = window.setTimeout(function () {
41622
+ clearCancellingProcess();
41623
+ reject(new request_error/* default */.Z(url, xhr.status, "TIMEOUT", xhr));
41624
+ }, timeout + 3000);
41528
41625
  }
41529
41626
 
41530
41627
  xhr.responseType = responseType;
@@ -41549,6 +41646,8 @@ function request(options) {
41549
41646
 
41550
41647
  if (cancelSignal !== undefined) {
41551
41648
  deregisterCancellationListener = cancelSignal.register(function abortRequest(err) {
41649
+ clearCancellingProcess();
41650
+
41552
41651
  if (!(0,is_null_or_undefined/* default */.Z)(xhr) && xhr.readyState !== 4) {
41553
41652
  xhr.abort();
41554
41653
  }
@@ -41562,18 +41661,12 @@ function request(options) {
41562
41661
  }
41563
41662
 
41564
41663
  xhr.onerror = function onXHRError() {
41565
- if (deregisterCancellationListener !== null) {
41566
- deregisterCancellationListener();
41567
- }
41568
-
41664
+ clearCancellingProcess();
41569
41665
  reject(new request_error/* default */.Z(url, xhr.status, "ERROR_EVENT", xhr));
41570
41666
  };
41571
41667
 
41572
41668
  xhr.ontimeout = function onXHRTimeout() {
41573
- if (deregisterCancellationListener !== null) {
41574
- deregisterCancellationListener();
41575
- }
41576
-
41669
+ clearCancellingProcess();
41577
41670
  reject(new request_error/* default */.Z(url, xhr.status, "TIMEOUT", xhr));
41578
41671
  };
41579
41672
 
@@ -41593,9 +41686,7 @@ function request(options) {
41593
41686
 
41594
41687
  xhr.onload = function onXHRLoad(event) {
41595
41688
  if (xhr.readyState === 4) {
41596
- if (deregisterCancellationListener !== null) {
41597
- deregisterCancellationListener();
41598
- }
41689
+ clearCancellingProcess();
41599
41690
 
41600
41691
  if (xhr.status >= 200 && xhr.status < 300) {
41601
41692
  var receivedTime = performance.now();
@@ -41638,6 +41729,19 @@ function request(options) {
41638
41729
  };
41639
41730
 
41640
41731
  xhr.send();
41732
+ /**
41733
+ * Clear resources and timers created to handle cancellation and timeouts.
41734
+ */
41735
+
41736
+ function clearCancellingProcess() {
41737
+ if (timeoutId !== undefined) {
41738
+ clearTimeout(timeoutId);
41739
+ }
41740
+
41741
+ if (deregisterCancellationListener !== null) {
41742
+ deregisterCancellationListener();
41743
+ }
41744
+ }
41641
41745
  });
41642
41746
  }
41643
41747
  /**
@@ -42680,8 +42784,7 @@ var CancellationSignal = /*#__PURE__*/function () {
42680
42784
  return CancellationSignal;
42681
42785
  }();
42682
42786
  /**
42683
- * Error created when a task is cancelled through the TaskCanceller.
42684
- *
42787
+ * Error created when a task is cancelled.
42685
42788
  * @class CancellationError
42686
42789
  * @extends Error
42687
42790
  */
@@ -43647,16 +43750,29 @@ var config = {
43647
43750
 
43648
43751
  /***/ }),
43649
43752
 
43650
- /***/ 6362:
43753
+ /***/ 2034:
43651
43754
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
43652
43755
 
43653
43756
  "use strict";
43654
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
43655
- /* harmony export */ "z": function() { return /* binding */ concat; }
43656
- /* harmony export */ });
43657
- /* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9834);
43658
- /* harmony import */ var _util_args__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2457);
43659
- /* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3102);
43757
+
43758
+ // EXPORTS
43759
+ __webpack_require__.d(__webpack_exports__, {
43760
+ "z": function() { return /* binding */ concat; }
43761
+ });
43762
+
43763
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/mergeAll.js
43764
+ var mergeAll = __webpack_require__(4367);
43765
+ ;// CONCATENATED MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/concatAll.js
43766
+
43767
+ function concatAll() {
43768
+ return (0,mergeAll/* mergeAll */.J)(1);
43769
+ }
43770
+ //# sourceMappingURL=concatAll.js.map
43771
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/util/args.js
43772
+ var util_args = __webpack_require__(2457);
43773
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/from.js + 8 modules
43774
+ var from = __webpack_require__(3102);
43775
+ ;// CONCATENATED MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js
43660
43776
 
43661
43777
 
43662
43778
 
@@ -43665,7 +43781,7 @@ function concat() {
43665
43781
  for (var _i = 0; _i < arguments.length; _i++) {
43666
43782
  args[_i] = arguments[_i];
43667
43783
  }
43668
- return (0,_operators_concatAll__WEBPACK_IMPORTED_MODULE_0__/* .concatAll */ .u)()((0,_from__WEBPACK_IMPORTED_MODULE_1__/* .from */ .D)(args, (0,_util_args__WEBPACK_IMPORTED_MODULE_2__/* .popScheduler */ .yG)(args)));
43784
+ return concatAll()((0,from/* from */.D)(args, (0,util_args/* popScheduler */.yG)(args)));
43669
43785
  }
43670
43786
  //# sourceMappingURL=concat.js.map
43671
43787
 
@@ -44152,29 +44268,6 @@ function process(asyncIterable, subscriber) {
44152
44268
 
44153
44269
  /***/ }),
44154
44270
 
44155
- /***/ 6697:
44156
- /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
44157
-
44158
- "use strict";
44159
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
44160
- /* harmony export */ "F": function() { return /* binding */ interval; }
44161
- /* harmony export */ });
44162
- /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7991);
44163
- /* harmony import */ var _timer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6625);
44164
-
44165
-
44166
- function interval(period, scheduler) {
44167
- if (period === void 0) { period = 0; }
44168
- if (scheduler === void 0) { scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__/* .asyncScheduler */ .z; }
44169
- if (period < 0) {
44170
- period = 0;
44171
- }
44172
- return (0,_timer__WEBPACK_IMPORTED_MODULE_1__/* .timer */ .H)(period, period, scheduler);
44173
- }
44174
- //# sourceMappingURL=interval.js.map
44175
-
44176
- /***/ }),
44177
-
44178
44271
  /***/ 3071:
44179
44272
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
44180
44273
 
@@ -44413,22 +44506,6 @@ function catchError(selector) {
44413
44506
 
44414
44507
  /***/ }),
44415
44508
 
44416
- /***/ 9834:
44417
- /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
44418
-
44419
- "use strict";
44420
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
44421
- /* harmony export */ "u": function() { return /* binding */ concatAll; }
44422
- /* harmony export */ });
44423
- /* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4367);
44424
-
44425
- function concatAll() {
44426
- return (0,_mergeAll__WEBPACK_IMPORTED_MODULE_0__/* .mergeAll */ .J)(1);
44427
- }
44428
- //# sourceMappingURL=concatAll.js.map
44429
-
44430
- /***/ }),
44431
-
44432
44509
  /***/ 3741:
44433
44510
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
44434
44511
 
@@ -44839,7 +44916,7 @@ function shareReplay(configOrBufferSize, windowTime, scheduler) {
44839
44916
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
44840
44917
  /* harmony export */ "O": function() { return /* binding */ startWith; }
44841
44918
  /* harmony export */ });
44842
- /* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6362);
44919
+ /* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2034);
44843
44920
  /* harmony import */ var _util_args__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2457);
44844
44921
  /* harmony import */ var _util_lift__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6798);
44845
44922
 
@@ -46933,8 +47010,8 @@ function maybeSchedule(scheduler, execute, subscription) {
46933
47010
  //# sourceMappingURL=combineLatest.js.map
46934
47011
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/startWith.js
46935
47012
  var startWith = __webpack_require__(6108);
46936
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js
46937
- var concat = __webpack_require__(6362);
47013
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/concat.js + 1 modules
47014
+ var concat = __webpack_require__(2034);
46938
47015
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/switchMap.js
46939
47016
  var switchMap = __webpack_require__(4978);
46940
47017
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/merge.js
@@ -47833,6 +47910,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
47833
47910
 
47834
47911
 
47835
47912
 
47913
+
47836
47914
  /**
47837
47915
  * Class allowing to facilitate the task of loading and parsing a Manifest.
47838
47916
  * @class ManifestFetcher
@@ -47888,6 +47966,7 @@ var ManifestFetcher = /*#__PURE__*/function () {
47888
47966
  var _this = this;
47889
47967
 
47890
47968
  return new Observable/* Observable */.y(function (obs) {
47969
+ var settings = _this._settings;
47891
47970
  var pipelines = _this._pipelines;
47892
47971
  var requestUrl = url !== null && url !== void 0 ? url : _this._manifestUrl;
47893
47972
  /** `true` if the loading pipeline is already completely executed. */
@@ -47951,16 +48030,23 @@ var ManifestFetcher = /*#__PURE__*/function () {
47951
48030
  * Call the loader part of the pipeline, retrying if it fails according
47952
48031
  * to the current settings.
47953
48032
  * Returns the Promise of the last attempt.
47954
- * @param {string | undefined} resolverUrl
48033
+ * @param {string | undefined} manifestUrl
47955
48034
  * @returns {Promise}
47956
48035
  */
47957
48036
 
47958
48037
 
47959
48038
  function callLoaderWithRetries(manifestUrl) {
47960
48039
  var loadManifest = pipelines.loadManifest;
48040
+ var requestTimeout = (0,is_null_or_undefined/* default */.Z)(settings.requestTimeout) ? config/* default.getCurrent */.Z.getCurrent().DEFAULT_REQUEST_TIMEOUT : settings.requestTimeout;
48041
+
48042
+ if (requestTimeout < 0) {
48043
+ requestTimeout = undefined;
48044
+ }
47961
48045
 
47962
48046
  var callLoader = function callLoader() {
47963
- return loadManifest(manifestUrl, canceller.signal);
48047
+ return loadManifest(manifestUrl, {
48048
+ timeout: requestTimeout
48049
+ }, canceller.signal);
47964
48050
  };
47965
48051
 
47966
48052
  return tryRequestPromiseWithBackoff(callLoader, backoffSettings, canceller.signal);
@@ -48934,11 +49020,15 @@ var generateRequestID = (0,id_generator/* default */.Z)();
48934
49020
  */
48935
49021
 
48936
49022
  function segment_fetcher_createSegmentFetcher(bufferType, pipeline, callbacks, options) {
49023
+ var requestOptions = {
49024
+ timeout: options.requestTimeout < 0 ? undefined : options.requestTimeout
49025
+ };
48937
49026
  /**
48938
49027
  * Cache audio and video initialization segments.
48939
49028
  * This allows to avoid doing too many requests for what are usually very
48940
49029
  * small files.
48941
49030
  */
49031
+
48942
49032
  var cache = (0,array_includes/* default */.Z)(["audio", "video"], bufferType) ? new initialization_segment_cache() : undefined;
48943
49033
  var loadSegment = pipeline.loadSegment,
48944
49034
  parseSegment = pipeline.parseSegment;
@@ -49136,7 +49226,7 @@ function segment_fetcher_createSegmentFetcher(bufferType, pipeline, callbacks, o
49136
49226
  */
49137
49227
 
49138
49228
  function callLoaderWithUrl(url, cancellationSignal) {
49139
- return loadSegment(url, content, cancellationSignal, loaderCallbacks);
49229
+ return loadSegment(url, content, requestOptions, cancellationSignal, loaderCallbacks);
49140
49230
  }
49141
49231
  /**
49142
49232
  * Generate function allowing to parse a loaded segment.
@@ -49222,10 +49312,12 @@ function segment_fetcher_createSegmentFetcher(bufferType, pipeline, callbacks, o
49222
49312
  function getSegmentFetcherOptions(bufferType, _ref) {
49223
49313
  var maxRetryRegular = _ref.maxRetryRegular,
49224
49314
  maxRetryOffline = _ref.maxRetryOffline,
49225
- lowLatencyMode = _ref.lowLatencyMode;
49315
+ lowLatencyMode = _ref.lowLatencyMode,
49316
+ requestTimeout = _ref.requestTimeout;
49226
49317
 
49227
49318
  var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
49228
49319
  DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR = _config$getCurrent.DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
49320
+ DEFAULT_REQUEST_TIMEOUT = _config$getCurrent.DEFAULT_REQUEST_TIMEOUT,
49229
49321
  DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE = _config$getCurrent.DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
49230
49322
  INITIAL_BACKOFF_DELAY_BASE = _config$getCurrent.INITIAL_BACKOFF_DELAY_BASE,
49231
49323
  MAX_BACKOFF_DELAY_BASE = _config$getCurrent.MAX_BACKOFF_DELAY_BASE;
@@ -49234,7 +49326,8 @@ function getSegmentFetcherOptions(bufferType, _ref) {
49234
49326
  maxRetryRegular: bufferType === "image" ? 0 : maxRetryRegular !== null && maxRetryRegular !== void 0 ? maxRetryRegular : DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
49235
49327
  maxRetryOffline: maxRetryOffline !== null && maxRetryOffline !== void 0 ? maxRetryOffline : DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
49236
49328
  baseDelay: lowLatencyMode ? INITIAL_BACKOFF_DELAY_BASE.LOW_LATENCY : INITIAL_BACKOFF_DELAY_BASE.REGULAR,
49237
- maxDelay: lowLatencyMode ? MAX_BACKOFF_DELAY_BASE.LOW_LATENCY : MAX_BACKOFF_DELAY_BASE.REGULAR
49329
+ maxDelay: lowLatencyMode ? MAX_BACKOFF_DELAY_BASE.LOW_LATENCY : MAX_BACKOFF_DELAY_BASE.REGULAR,
49330
+ requestTimeout: (0,is_null_or_undefined/* default */.Z)(requestTimeout) ? DEFAULT_REQUEST_TIMEOUT : requestTimeout
49238
49331
  };
49239
49332
  }
49240
49333
  ;// CONCATENATED MODULE: ./src/core/fetchers/segment/segment_fetcher_creator.ts
@@ -51588,12 +51681,8 @@ function getInitialTime(manifest, lowLatencyMode, startAt) {
51588
51681
  var link_drm_and_content = __webpack_require__(9607);
51589
51682
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/throwError.js
51590
51683
  var throwError = __webpack_require__(3610);
51591
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/interval.js
51592
- var interval = __webpack_require__(6697);
51593
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/tap.js
51594
- var tap = __webpack_require__(2006);
51595
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/fromEvent.js
51596
- var fromEvent = __webpack_require__(2401);
51684
+ // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
51685
+ var assertThisInitialized = __webpack_require__(7326);
51597
51686
  ;// CONCATENATED MODULE: ./src/compat/change_source_buffer_type.ts
51598
51687
  /**
51599
51688
  * Copyright 2015 CANAL+ Group
@@ -51645,6 +51734,7 @@ var types = __webpack_require__(9612);
51645
51734
  ;// CONCATENATED MODULE: ./src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts
51646
51735
 
51647
51736
 
51737
+
51648
51738
  /**
51649
51739
  * Copyright 2015 CANAL+ Group
51650
51740
  *
@@ -51671,6 +51761,7 @@ var types = __webpack_require__(9612);
51671
51761
 
51672
51762
 
51673
51763
 
51764
+
51674
51765
  /**
51675
51766
  * Allows to push and remove new segments to a SourceBuffer in a FIFO queue (not
51676
51767
  * doing so can lead to browser Errors) while keeping an inventory of what has
@@ -51689,14 +51780,14 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51689
51780
  * @constructor
51690
51781
  * @param {string} bufferType
51691
51782
  * @param {string} codec
51692
- * @param {SourceBuffer} sourceBuffer
51783
+ * @param {MediaSource} mediaSource
51693
51784
  */
51694
51785
  function AudioVideoSegmentBuffer(bufferType, codec, mediaSource) {
51695
51786
  var _this;
51696
51787
 
51697
51788
  _this = _SegmentBuffer.call(this) || this;
51698
51789
  var sourceBuffer = mediaSource.addSourceBuffer(codec);
51699
- _this._destroy$ = new Subject/* Subject */.x();
51790
+ _this._canceller = new task_canceller/* default */.ZP();
51700
51791
  _this.bufferType = bufferType;
51701
51792
  _this._mediaSource = mediaSource;
51702
51793
  _this._sourceBuffer = sourceBuffer;
@@ -51705,8 +51796,9 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51705
51796
  _this._lastInitSegment = null;
51706
51797
  _this.codec = codec;
51707
51798
 
51708
- var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
51709
- SOURCE_BUFFER_FLUSHING_INTERVAL = _config$getCurrent.SOURCE_BUFFER_FLUSHING_INTERVAL; // Some browsers (happened with firefox 66) sometimes "forget" to send us
51799
+ var onError = _this._onPendingTaskError.bind((0,assertThisInitialized/* default */.Z)(_this));
51800
+
51801
+ var reCheck = _this._flush.bind((0,assertThisInitialized/* default */.Z)(_this)); // Some browsers (happened with firefox 66) sometimes "forget" to send us
51710
51802
  // `update` or `updateend` events.
51711
51803
  // In that case, we're completely unable to continue the queue here and
51712
51804
  // stay locked in a waiting state.
@@ -51714,15 +51806,23 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51714
51806
  // SourceBuffer is currently updating.
51715
51807
 
51716
51808
 
51717
- (0,interval/* interval */.F)(SOURCE_BUFFER_FLUSHING_INTERVAL).pipe((0,tap/* tap */.b)(function () {
51718
- return _this._flush();
51719
- }), (0,takeUntil/* takeUntil */.R)(_this._destroy$)).subscribe();
51720
- (0,fromEvent/* fromEvent */.R)(_this._sourceBuffer, "error").pipe((0,tap/* tap */.b)(function (err) {
51721
- return _this._onPendingTaskError(err);
51722
- }), (0,takeUntil/* takeUntil */.R)(_this._destroy$)).subscribe();
51723
- (0,fromEvent/* fromEvent */.R)(_this._sourceBuffer, "updateend").pipe((0,tap/* tap */.b)(function () {
51724
- return _this._flush();
51725
- }), (0,takeUntil/* takeUntil */.R)(_this._destroy$)).subscribe();
51809
+ var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
51810
+ SOURCE_BUFFER_FLUSHING_INTERVAL = _config$getCurrent.SOURCE_BUFFER_FLUSHING_INTERVAL;
51811
+
51812
+ var intervalId = setInterval(reCheck, SOURCE_BUFFER_FLUSHING_INTERVAL);
51813
+
51814
+ _this._sourceBuffer.addEventListener("error", onError);
51815
+
51816
+ _this._sourceBuffer.addEventListener("updateend", reCheck);
51817
+
51818
+ _this._canceller.signal.register(function () {
51819
+ clearInterval(intervalId);
51820
+
51821
+ _this._sourceBuffer.removeEventListener("error", onError);
51822
+
51823
+ _this._sourceBuffer.removeEventListener("updateend", reCheck);
51824
+ });
51825
+
51726
51826
  return _this;
51727
51827
  }
51728
51828
  /**
@@ -51749,29 +51849,31 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51749
51849
  * `data.chunk` argument to null.
51750
51850
  *
51751
51851
  * @param {Object} infos
51752
- * @returns {Observable}
51852
+ * @param {Object} cancellationSignal
51853
+ * @returns {Promise}
51753
51854
  */
51754
51855
 
51755
51856
 
51756
51857
  var _proto = AudioVideoSegmentBuffer.prototype;
51757
51858
 
51758
- _proto.pushChunk = function pushChunk(infos) {
51859
+ _proto.pushChunk = function pushChunk(infos, cancellationSignal) {
51759
51860
  assertPushedDataIsBufferSource(infos);
51760
51861
  log/* default.debug */.Z.debug("AVSB: receiving order to push data to the SourceBuffer", this.bufferType, (0,utils/* getLoggableSegmentId */.K)(infos.inventoryInfos));
51761
51862
  return this._addToQueue({
51762
51863
  type: types/* SegmentBufferOperation.Push */.f.Push,
51763
51864
  value: infos
51764
- });
51865
+ }, cancellationSignal);
51765
51866
  }
51766
51867
  /**
51767
51868
  * Remove buffered data (added to the same FIFO queue than `pushChunk`).
51768
51869
  * @param {number} start - start position, in seconds
51769
51870
  * @param {number} end - end position, in seconds
51770
- * @returns {Observable}
51871
+ * @param {Object} cancellationSignal
51872
+ * @returns {Promise}
51771
51873
  */
51772
51874
  ;
51773
51875
 
51774
- _proto.removeBuffer = function removeBuffer(start, end) {
51876
+ _proto.removeBuffer = function removeBuffer(start, end, cancellationSignal) {
51775
51877
  log/* default.debug */.Z.debug("AVSB: receiving order to remove data from the SourceBuffer", this.bufferType, start, end);
51776
51878
  return this._addToQueue({
51777
51879
  type: types/* SegmentBufferOperation.Remove */.f.Remove,
@@ -51779,25 +51881,25 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51779
51881
  start: start,
51780
51882
  end: end
51781
51883
  }
51782
- });
51884
+ }, cancellationSignal);
51783
51885
  }
51784
51886
  /**
51785
51887
  * Indicate that every chunks from a Segment has been given to pushChunk so
51786
51888
  * far.
51787
51889
  * This will update our internal Segment inventory accordingly.
51788
- * The returned Observable will emit and complete successively once the whole
51789
- * segment has been pushed and this indication is acknowledged.
51890
+ * The returned Promise will resolve once the whole segment has been pushed
51891
+ * and this indication is acknowledged.
51790
51892
  * @param {Object} infos
51791
- * @returns {Observable}
51893
+ * @returns {Promise}
51792
51894
  */
51793
51895
  ;
51794
51896
 
51795
- _proto.endOfSegment = function endOfSegment(infos) {
51897
+ _proto.endOfSegment = function endOfSegment(infos, cancellationSignal) {
51796
51898
  log/* default.debug */.Z.debug("AVSB: receiving order for validating end of segment", this.bufferType, (0,utils/* getLoggableSegmentId */.K)(infos));
51797
51899
  return this._addToQueue({
51798
51900
  type: types/* SegmentBufferOperation.EndOfSegment */.f.EndOfSegment,
51799
51901
  value: infos
51800
- });
51902
+ }, cancellationSignal);
51801
51903
  }
51802
51904
  /**
51803
51905
  * Returns the currently buffered data, in a TimeRanges object.
@@ -51854,12 +51956,10 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51854
51956
  ;
51855
51957
 
51856
51958
  _proto.dispose = function dispose() {
51857
- this._destroy$.next();
51858
-
51859
- this._destroy$.complete();
51959
+ this._canceller.cancel();
51860
51960
 
51861
51961
  if (this._pendingTask !== null) {
51862
- this._pendingTask.subject.complete();
51962
+ this._pendingTask.reject(new task_canceller/* CancellationError */.FU());
51863
51963
 
51864
51964
  this._pendingTask = null;
51865
51965
  }
@@ -51868,7 +51968,7 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51868
51968
  var nextElement = this._queue.shift();
51869
51969
 
51870
51970
  if (nextElement !== undefined) {
51871
- nextElement.subject.complete();
51971
+ nextElement.reject(new task_canceller/* CancellationError */.FU());
51872
51972
  }
51873
51973
  }
51874
51974
 
@@ -51882,7 +51982,7 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51882
51982
  }
51883
51983
  /**
51884
51984
  * Called when an error arised that made the current task fail.
51885
- * @param {Event} error
51985
+ * @param {Event} err
51886
51986
  */
51887
51987
  ;
51888
51988
 
@@ -51892,7 +51992,7 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51892
51992
  if (this._pendingTask !== null) {
51893
51993
  var error = err instanceof Error ? err : new Error("An unknown error occured when doing operations " + "on the SourceBuffer");
51894
51994
 
51895
- this._pendingTask.subject.error(error);
51995
+ this._pendingTask.reject(error);
51896
51996
  }
51897
51997
  }
51898
51998
  /**
@@ -51903,40 +52003,46 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51903
52003
  * Cancel queued operation on unsubscription.
51904
52004
  * @private
51905
52005
  * @param {Object} operation
51906
- * @returns {Observable}
52006
+ * @param {Object} cancellationSignal
52007
+ * @returns {Promise}
51907
52008
  */
51908
52009
  ;
51909
52010
 
51910
- _proto._addToQueue = function _addToQueue(operation) {
52011
+ _proto._addToQueue = function _addToQueue(operation, cancellationSignal) {
51911
52012
  var _this2 = this;
51912
52013
 
51913
- return new Observable/* Observable */.y(function (obs) {
52014
+ return new Promise(function (resolve, reject) {
52015
+ if (cancellationSignal.cancellationError !== null) {
52016
+ return reject(cancellationSignal.cancellationError);
52017
+ }
52018
+
51914
52019
  var shouldRestartQueue = _this2._queue.length === 0 && _this2._pendingTask === null;
51915
- var subject = new Subject/* Subject */.x();
51916
52020
  var queueItem = (0,object_assign/* default */.Z)({
51917
- subject: subject
52021
+ resolve: resolve,
52022
+ reject: reject
51918
52023
  }, operation);
51919
52024
 
51920
52025
  _this2._queue.push(queueItem);
51921
52026
 
51922
- var subscription = subject.subscribe(obs);
51923
-
51924
- if (shouldRestartQueue) {
51925
- _this2._flush();
51926
- }
51927
-
51928
- return function () {
51929
- subscription.unsubscribe(); // Remove the corresponding element from the AudioVideoSegmentBuffer's
52027
+ cancellationSignal.register(function (error) {
52028
+ // Remove the corresponding element from the AudioVideoSegmentBuffer's
51930
52029
  // queue.
51931
52030
  // If the operation was a pending task, it should still continue to not
51932
52031
  // let the AudioVideoSegmentBuffer in a weird state.
51933
-
51934
52032
  var index = _this2._queue.indexOf(queueItem);
51935
52033
 
51936
52034
  if (index >= 0) {
51937
52035
  _this2._queue.splice(index, 1);
51938
52036
  }
51939
- };
52037
+
52038
+ queueItem.resolve = noop/* default */.Z;
52039
+ queueItem.reject = noop/* default */.Z;
52040
+ reject(error);
52041
+ });
52042
+
52043
+ if (shouldRestartQueue) {
52044
+ _this2._flush();
52045
+ }
51940
52046
  });
51941
52047
  }
51942
52048
  /**
@@ -51976,10 +52082,9 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
51976
52082
  (0,assert_unreachable/* default */.Z)(task);
51977
52083
  }
51978
52084
 
51979
- var subject = task.subject;
52085
+ var resolve = task.resolve;
51980
52086
  this._pendingTask = null;
51981
- subject.next();
51982
- subject.complete();
52087
+ resolve();
51983
52088
 
51984
52089
  this._flush(); // Go to next item in queue
51985
52090
 
@@ -52008,7 +52113,7 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
52008
52113
  var error = e instanceof Error ? e : new Error("An unknown error occured when preparing a push operation");
52009
52114
  this._lastInitSegment = null; // initialize init segment as a security
52010
52115
 
52011
- nextItem.subject.error(error);
52116
+ nextItem.reject(error);
52012
52117
  return;
52013
52118
  }
52014
52119
 
@@ -52069,7 +52174,7 @@ var AudioVideoSegmentBuffer = /*#__PURE__*/function (_SegmentBuffer) {
52069
52174
  *
52070
52175
  * This method allows to "prepare" that push operation so that all is left is
52071
52176
  * to push the returned segment data one after the other (from first to last).
52072
- * @param {Object} item
52177
+ * @param {Object} data
52073
52178
  * @returns {Object}
52074
52179
  */
52075
52180
  ;
@@ -52230,7 +52335,6 @@ function assertPushedDataIsBufferSource(pushedData) {
52230
52335
 
52231
52336
 
52232
52337
 
52233
-
52234
52338
  var POSSIBLE_BUFFER_TYPES = ["audio", "video", "text", "image"];
52235
52339
  /**
52236
52340
  * Allows to easily create and dispose SegmentBuffers, which are interfaces to
@@ -52248,7 +52352,7 @@ var POSSIBLE_BUFFER_TYPES = ["audio", "video", "text", "image"];
52248
52352
  * To be able to use a SegmentBuffer linked to a native media buffer, you
52249
52353
  * will first need to create it, but also wait until the other one is either
52250
52354
  * created or explicitely disabled through the `disableSegmentBuffer` method.
52251
- * The Observable returned by `waitForUsableBuffers` will emit when
52355
+ * The Promise returned by `waitForUsableBuffers` will emit when
52252
52356
  * that is the case.
52253
52357
  *
52254
52358
  * @class SegmentBuffersStore
@@ -52352,7 +52456,7 @@ var SegmentBuffersStore = /*#__PURE__*/function () {
52352
52456
  * content need to all be created (by creating SegmentBuffers linked to them)
52353
52457
  * before any one can be used.
52354
52458
  *
52355
- * This function will return an Observable emitting when any and all native
52459
+ * This function will return a Promise resolving when any and all native
52356
52460
  * SourceBuffers can be used.
52357
52461
  *
52358
52462
  * From https://w3c.github.io/media-source/#methods
@@ -52360,23 +52464,35 @@ var SegmentBuffersStore = /*#__PURE__*/function () {
52360
52464
  * exception if the media element has reached the HAVE_METADATA
52361
52465
  * readyState. This can occur if the user agent's media engine
52362
52466
  * does not support adding more tracks during playback.
52363
- * @return {Observable}
52467
+ * @param {Object} cancelWaitSignal
52468
+ * @return {Promise}
52364
52469
  */
52365
52470
  ;
52366
52471
 
52367
- _proto.waitForUsableBuffers = function waitForUsableBuffers() {
52472
+ _proto.waitForUsableBuffers = function waitForUsableBuffers(cancelWaitSignal) {
52368
52473
  var _this = this;
52369
52474
 
52370
52475
  if (this._areNativeBuffersUsable()) {
52371
- return (0,of.of)(undefined);
52476
+ return Promise.resolve();
52372
52477
  }
52373
52478
 
52374
- return new Observable/* Observable */.y(function (obs) {
52375
- _this._onNativeBufferAddedOrDisabled.push(function () {
52479
+ return new Promise(function (res, rej) {
52480
+ var onAddedOrDisabled = function onAddedOrDisabled() {
52376
52481
  if (_this._areNativeBuffersUsable()) {
52377
- obs.next(undefined);
52378
- obs.complete();
52482
+ res();
52379
52483
  }
52484
+ };
52485
+
52486
+ _this._onNativeBufferAddedOrDisabled.push(onAddedOrDisabled);
52487
+
52488
+ cancelWaitSignal.register(function (error) {
52489
+ var indexOf = _this._onNativeBufferAddedOrDisabled.indexOf(onAddedOrDisabled);
52490
+
52491
+ if (indexOf >= 0) {
52492
+ _this._onNativeBufferAddedOrDisabled.splice(indexOf, 1);
52493
+ }
52494
+
52495
+ rej(error);
52380
52496
  });
52381
52497
  });
52382
52498
  }
@@ -52625,6 +52741,76 @@ function exhaustMap(project, resultSelector) {
52625
52741
  });
52626
52742
  }
52627
52743
  //# sourceMappingURL=exhaustMap.js.map
52744
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/tap.js
52745
+ var tap = __webpack_require__(2006);
52746
+ ;// CONCATENATED MODULE: ./src/utils/rx-from_cancellable_promise.ts
52747
+ /**
52748
+ * Copyright 2015 CANAL+ Group
52749
+ *
52750
+ * Licensed under the Apache License, Version 2.0 (the "License");
52751
+ * you may not use this file except in compliance with the License.
52752
+ * You may obtain a copy of the License at
52753
+ *
52754
+ * http://www.apache.org/licenses/LICENSE-2.0
52755
+ *
52756
+ * Unless required by applicable law or agreed to in writing, software
52757
+ * distributed under the License is distributed on an "AS IS" BASIS,
52758
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
52759
+ * See the License for the specific language governing permissions and
52760
+ * limitations under the License.
52761
+ */
52762
+
52763
+ /**
52764
+ * Transform a Promise that can be cancelled (through the usage of a
52765
+ * `TaskCanceller`) to an Observable, while keeping the cancellation logic
52766
+ * between both in sync.
52767
+ *
52768
+ * @example
52769
+ * ```js
52770
+ * const canceller = new TaskCanceller();
52771
+ * fromCancellablePromise(
52772
+ * canceller,
52773
+ * () => doSomeCancellableTasks(canceller.signal)
52774
+ * ).subscribe(
52775
+ * (i) => console.log("Emitted: ", i);
52776
+ * (e) => console.log("Error: ", e);
52777
+ * () => console.log("Complete.")
52778
+ * );
52779
+ * ```
52780
+ * @param {Object} canceller
52781
+ * @param {Function} fn
52782
+ * @returns {Observable}
52783
+ */
52784
+
52785
+ function fromCancellablePromise(canceller, fn) {
52786
+ return new Observable/* Observable */.y(function (obs) {
52787
+ var isUnsubscribedFrom = false;
52788
+ var isComplete = false;
52789
+ fn().then(function (i) {
52790
+ if (isUnsubscribedFrom) {
52791
+ return;
52792
+ }
52793
+
52794
+ isComplete = true;
52795
+ obs.next(i);
52796
+ obs.complete();
52797
+ }, function (err) {
52798
+ isComplete = true;
52799
+
52800
+ if (isUnsubscribedFrom) {
52801
+ return;
52802
+ }
52803
+
52804
+ obs.error(err);
52805
+ });
52806
+ return function () {
52807
+ if (!isComplete) {
52808
+ isUnsubscribedFrom = true;
52809
+ canceller.cancel();
52810
+ }
52811
+ };
52812
+ });
52813
+ }
52628
52814
  // EXTERNAL MODULE: ./node_modules/next-tick/index.js
52629
52815
  var next_tick = __webpack_require__(7473);
52630
52816
  var next_tick_default = /*#__PURE__*/__webpack_require__.n(next_tick);
@@ -52982,9 +53168,10 @@ var WeakMapMemory = /*#__PURE__*/function () {
52982
53168
  }();
52983
53169
 
52984
53170
 
52985
- // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/operators/concatAll.js
52986
- var concatAll = __webpack_require__(9834);
52987
53171
  ;// CONCATENATED MODULE: ./src/core/segment_buffers/garbage_collector.ts
53172
+
53173
+
53174
+
52988
53175
  /**
52989
53176
  * Copyright 2015 CANAL+ Group
52990
53177
  *
@@ -53002,27 +53189,48 @@ var concatAll = __webpack_require__(9834);
53002
53189
  */
53003
53190
 
53004
53191
 
53005
-
53006
53192
  /**
53007
53193
  * Perform cleaning of the buffer according to the values set by the user
53008
- * each time `currentTime$` emits and each times the
53194
+ * each time `playbackObserver` emits and each times the
53009
53195
  * maxBufferBehind/maxBufferAhead values change.
53010
53196
  *
53197
+ * Abort this operation when the `cancellationSignal` emits.
53198
+ *
53011
53199
  * @param {Object} opt
53200
+ * @param {Object} cancellationSignal
53012
53201
  * @returns {Observable}
53013
53202
  */
53014
53203
 
53015
- function BufferGarbageCollector(_ref) {
53204
+ function BufferGarbageCollector(_ref, cancellationSignal) {
53016
53205
  var segmentBuffer = _ref.segmentBuffer,
53017
- currentTime$ = _ref.currentTime$,
53018
- maxBufferBehind$ = _ref.maxBufferBehind$,
53019
- maxBufferAhead$ = _ref.maxBufferAhead$;
53020
- return combineLatest([currentTime$, maxBufferBehind$, maxBufferAhead$]).pipe((0,mergeMap/* mergeMap */.z)(function (_ref2) {
53021
- var currentTime = _ref2[0],
53022
- maxBufferBehind = _ref2[1],
53023
- maxBufferAhead = _ref2[2];
53024
- return clearBuffer(segmentBuffer, currentTime, maxBufferBehind, maxBufferAhead);
53025
- }));
53206
+ playbackObserver = _ref.playbackObserver,
53207
+ maxBufferBehind = _ref.maxBufferBehind,
53208
+ maxBufferAhead = _ref.maxBufferAhead;
53209
+ var lastPosition;
53210
+ playbackObserver.listen(function (o) {
53211
+ var _a;
53212
+
53213
+ lastPosition = (_a = o.position.pending) !== null && _a !== void 0 ? _a : o.position.last;
53214
+ clean();
53215
+ }, {
53216
+ includeLastObservation: true,
53217
+ clearSignal: cancellationSignal
53218
+ });
53219
+
53220
+ function clean() {
53221
+ clearBuffer(segmentBuffer, lastPosition, maxBufferBehind.getValue(), maxBufferAhead.getValue(), cancellationSignal)["catch"](function (e) {
53222
+ var errMsg = e instanceof Error ? e.message : "Unknown error";
53223
+ log/* default.error */.Z.error("Could not run BufferGarbageCollector:", errMsg);
53224
+ });
53225
+ }
53226
+
53227
+ maxBufferBehind.onUpdate(clean, {
53228
+ clearSignal: cancellationSignal
53229
+ });
53230
+ maxBufferAhead.onUpdate(clean, {
53231
+ clearSignal: cancellationSignal
53232
+ });
53233
+ clean();
53026
53234
  }
53027
53235
  /**
53028
53236
  * Remove buffer from the browser's memory based on the user's
@@ -53038,96 +53246,133 @@ function BufferGarbageCollector(_ref) {
53038
53246
  * @param {Number} position - The current position
53039
53247
  * @param {Number} maxBufferBehind
53040
53248
  * @param {Number} maxBufferAhead
53041
- * @returns {Observable}
53249
+ * @returns {Promise}
53042
53250
  */
53043
53251
 
53044
- function clearBuffer(segmentBuffer, position, maxBufferBehind, maxBufferAhead) {
53045
- if (!isFinite(maxBufferBehind) && !isFinite(maxBufferAhead)) {
53046
- return empty/* EMPTY */.E;
53047
- }
53252
+ function clearBuffer(_x, _x2, _x3, _x4, _x5) {
53253
+ return _clearBuffer.apply(this, arguments);
53254
+ }
53048
53255
 
53049
- var cleanedupRanges = [];
53256
+ function _clearBuffer() {
53257
+ _clearBuffer = (0,asyncToGenerator/* default */.Z)( /*#__PURE__*/regenerator_default().mark(function _callee(segmentBuffer, position, maxBufferBehind, maxBufferAhead, cancellationSignal) {
53258
+ var cleanedupRanges, _getInnerAndOuterTime, innerRange, outerRanges, collectBufferBehind, collectBufferAhead, _i, _cleanedupRanges, range;
53050
53259
 
53051
- var _getInnerAndOuterTime = (0,ranges/* getInnerAndOuterTimeRanges */.F_)(segmentBuffer.getBufferedRanges(), position),
53052
- innerRange = _getInnerAndOuterTime.innerRange,
53053
- outerRanges = _getInnerAndOuterTime.outerRanges;
53260
+ return regenerator_default().wrap(function _callee$(_context) {
53261
+ while (1) {
53262
+ switch (_context.prev = _context.next) {
53263
+ case 0:
53264
+ if (!(!isFinite(maxBufferBehind) && !isFinite(maxBufferAhead))) {
53265
+ _context.next = 2;
53266
+ break;
53267
+ }
53054
53268
 
53055
- var collectBufferBehind = function collectBufferBehind() {
53056
- if (!isFinite(maxBufferBehind)) {
53057
- return;
53058
- } // begin from the oldest
53269
+ return _context.abrupt("return", Promise.resolve());
53059
53270
 
53271
+ case 2:
53272
+ cleanedupRanges = [];
53273
+ _getInnerAndOuterTime = (0,ranges/* getInnerAndOuterTimeRanges */.F_)(segmentBuffer.getBufferedRanges(), position), innerRange = _getInnerAndOuterTime.innerRange, outerRanges = _getInnerAndOuterTime.outerRanges;
53060
53274
 
53061
- for (var i = 0; i < outerRanges.length; i++) {
53062
- var outerRange = outerRanges[i];
53275
+ collectBufferBehind = function collectBufferBehind() {
53276
+ if (!isFinite(maxBufferBehind)) {
53277
+ return;
53278
+ } // begin from the oldest
53063
53279
 
53064
- if (position - maxBufferBehind >= outerRange.end) {
53065
- cleanedupRanges.push(outerRange);
53066
- } else if (position >= outerRange.end && position - maxBufferBehind > outerRange.start && position - maxBufferBehind < outerRange.end) {
53067
- cleanedupRanges.push({
53068
- start: outerRange.start,
53069
- end: position - maxBufferBehind
53070
- });
53071
- }
53072
- }
53073
53280
 
53074
- if (innerRange != null) {
53075
- if (position - maxBufferBehind > innerRange.start) {
53076
- cleanedupRanges.push({
53077
- start: innerRange.start,
53078
- end: position - maxBufferBehind
53079
- });
53080
- }
53081
- }
53082
- };
53281
+ for (var i = 0; i < outerRanges.length; i++) {
53282
+ var outerRange = outerRanges[i];
53083
53283
 
53084
- var collectBufferAhead = function collectBufferAhead() {
53085
- if (!isFinite(maxBufferAhead)) {
53086
- return;
53087
- } // begin from the oldest
53284
+ if (position - maxBufferBehind >= outerRange.end) {
53285
+ cleanedupRanges.push(outerRange);
53286
+ } else if (position >= outerRange.end && position - maxBufferBehind > outerRange.start && position - maxBufferBehind < outerRange.end) {
53287
+ cleanedupRanges.push({
53288
+ start: outerRange.start,
53289
+ end: position - maxBufferBehind
53290
+ });
53291
+ }
53292
+ }
53088
53293
 
53294
+ if (innerRange != null) {
53295
+ if (position - maxBufferBehind > innerRange.start) {
53296
+ cleanedupRanges.push({
53297
+ start: innerRange.start,
53298
+ end: position - maxBufferBehind
53299
+ });
53300
+ }
53301
+ }
53302
+ };
53089
53303
 
53090
- for (var i = 0; i < outerRanges.length; i++) {
53091
- var outerRange = outerRanges[i];
53304
+ collectBufferAhead = function collectBufferAhead() {
53305
+ if (!isFinite(maxBufferAhead)) {
53306
+ return;
53307
+ } // begin from the oldest
53092
53308
 
53093
- if (position + maxBufferAhead <= outerRange.start) {
53094
- cleanedupRanges.push(outerRange);
53095
- } else if (position <= outerRange.start && position + maxBufferAhead < outerRange.end && position + maxBufferAhead > outerRange.start) {
53096
- cleanedupRanges.push({
53097
- start: position + maxBufferAhead,
53098
- end: outerRange.end
53099
- });
53100
- }
53101
- }
53102
53309
 
53103
- if (innerRange != null) {
53104
- if (position + maxBufferAhead < innerRange.end) {
53105
- cleanedupRanges.push({
53106
- start: position + maxBufferAhead,
53107
- end: innerRange.end
53108
- });
53109
- }
53110
- }
53111
- };
53310
+ for (var i = 0; i < outerRanges.length; i++) {
53311
+ var outerRange = outerRanges[i];
53112
53312
 
53113
- collectBufferBehind();
53114
- collectBufferAhead();
53115
- var clean$ = (0,from/* from */.D)(cleanedupRanges.map(function (range) {
53116
- log/* default.debug */.Z.debug("GC: cleaning range from SegmentBuffer", range.start, range.end);
53313
+ if (position + maxBufferAhead <= outerRange.start) {
53314
+ cleanedupRanges.push(outerRange);
53315
+ } else if (position <= outerRange.start && position + maxBufferAhead < outerRange.end && position + maxBufferAhead > outerRange.start) {
53316
+ cleanedupRanges.push({
53317
+ start: position + maxBufferAhead,
53318
+ end: outerRange.end
53319
+ });
53320
+ }
53321
+ }
53117
53322
 
53118
- if (range.start >= range.end) {
53119
- return (0,of.of)(null);
53120
- }
53323
+ if (innerRange != null) {
53324
+ if (position + maxBufferAhead < innerRange.end) {
53325
+ cleanedupRanges.push({
53326
+ start: position + maxBufferAhead,
53327
+ end: innerRange.end
53328
+ });
53329
+ }
53330
+ }
53331
+ };
53121
53332
 
53122
- return segmentBuffer.removeBuffer(range.start, range.end);
53123
- })).pipe((0,concatAll/* concatAll */.u)(), // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
53124
- // first type parameter as `any` instead of the perfectly fine `unknown`,
53125
- // leading to linter issues, as it forbids the usage of `any`.
53126
- // This is why we're disabling the eslint rule.
53333
+ collectBufferBehind();
53334
+ collectBufferAhead();
53335
+ _i = 0, _cleanedupRanges = cleanedupRanges;
53127
53336
 
53128
- /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
53129
- (0,ignoreElements/* ignoreElements */.l)());
53130
- return clean$;
53337
+ case 9:
53338
+ if (!(_i < _cleanedupRanges.length)) {
53339
+ _context.next = 20;
53340
+ break;
53341
+ }
53342
+
53343
+ range = _cleanedupRanges[_i];
53344
+
53345
+ if (!(range.start < range.end)) {
53346
+ _context.next = 17;
53347
+ break;
53348
+ }
53349
+
53350
+ log/* default.debug */.Z.debug("GC: cleaning range from SegmentBuffer", range.start, range.end);
53351
+
53352
+ if (!(cancellationSignal.cancellationError !== null)) {
53353
+ _context.next = 15;
53354
+ break;
53355
+ }
53356
+
53357
+ throw cancellationSignal.cancellationError;
53358
+
53359
+ case 15:
53360
+ _context.next = 17;
53361
+ return segmentBuffer.removeBuffer(range.start, range.end, cancellationSignal);
53362
+
53363
+ case 17:
53364
+ _i++;
53365
+ _context.next = 9;
53366
+ break;
53367
+
53368
+ case 20:
53369
+ case "end":
53370
+ return _context.stop();
53371
+ }
53372
+ }
53373
+ }, _callee);
53374
+ }));
53375
+ return _clearBuffer.apply(this, arguments);
53131
53376
  }
53132
53377
  // EXTERNAL MODULE: ./src/core/stream/events_generators.ts
53133
53378
  var stream_events_generators = __webpack_require__(8567);
@@ -54430,7 +54675,8 @@ function getSegmentPriority(segmentTime, wantedStartTimestamp) {
54430
54675
  function getBufferStatus(content, initialWantedTime, playbackObserver, fastSwitchThreshold, bufferGoal, maxBufferSize, segmentBuffer) {
54431
54676
  segmentBuffer.synchronizeInventory();
54432
54677
  var representation = content.representation;
54433
- var neededRange = getRangeOfNeededSegments(content, initialWantedTime, bufferGoal);
54678
+ var askedStart = playbackObserver.getIsPaused() || playbackObserver.getPlaybackRate() <= 0 ? initialWantedTime - 0.1 : initialWantedTime;
54679
+ var neededRange = getRangeOfNeededSegments(content, askedStart, bufferGoal);
54434
54680
  var shouldRefreshManifest = representation.index.shouldRefresh(neededRange.start, neededRange.end);
54435
54681
  /**
54436
54682
  * Every segment awaiting an "EndOfSegment" operation, which indicates that a
@@ -54470,7 +54716,7 @@ function getBufferStatus(content, initialWantedTime, playbackObserver, fastSwitc
54470
54716
 
54471
54717
  var prioritizedNeededSegments = segmentsToLoad.map(function (segment) {
54472
54718
  return {
54473
- priority: getSegmentPriority(segment.time, initialWantedTime),
54719
+ priority: getSegmentPriority(segment.time, askedStart),
54474
54720
  segment: segment
54475
54721
  };
54476
54722
  });
@@ -54538,7 +54784,7 @@ function getRangeOfNeededSegments(content, initialWantedTime, bufferGoal) {
54538
54784
  if (!(0,is_null_or_undefined/* default */.Z)(lastIndexPosition) && initialWantedTime >= lastIndexPosition && representationIndex.isInitialized() && representationIndex.isFinished() && isPeriodTheCurrentAndLastOne(manifest, period, initialWantedTime)) {
54539
54785
  wantedStartPosition = lastIndexPosition - 1;
54540
54786
  } else {
54541
- wantedStartPosition = initialWantedTime;
54787
+ wantedStartPosition = initialWantedTime - 0.1;
54542
54788
  }
54543
54789
 
54544
54790
  var wantedEndPosition = wantedStartPosition + bufferGoal;
@@ -54620,6 +54866,15 @@ function getPlayableBufferedSegments(neededRange, segmentInventory) {
54620
54866
  return overlappingChunks;
54621
54867
  }
54622
54868
  ;// CONCATENATED MODULE: ./src/core/stream/representation/force_garbage_collection.ts
54869
+
54870
+
54871
+
54872
+ function force_garbage_collection_createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = force_garbage_collection_unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
54873
+
54874
+ function force_garbage_collection_unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return force_garbage_collection_arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return force_garbage_collection_arrayLikeToArray(o, minLen); }
54875
+
54876
+ function force_garbage_collection_arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
54877
+
54623
54878
  /**
54624
54879
  * Copyright 2015 CANAL+ Group
54625
54880
  *
@@ -54638,44 +54893,20 @@ function getPlayableBufferedSegments(neededRange, segmentInventory) {
54638
54893
 
54639
54894
 
54640
54895
 
54641
-
54642
54896
  /**
54643
54897
  * Run the garbage collector.
54644
54898
  *
54645
54899
  * Try to clean up buffered ranges from a low gcGap at first.
54646
54900
  * If it does not succeed to clean up space, use a higher gcCap.
54647
54901
  *
54648
- * @param {Observable} timings$
54902
+ * @param {number} currentPosition
54649
54903
  * @param {Object} bufferingQueue
54650
- * @returns {Observable}
54904
+ * @param {Object} cancellationSignal
54905
+ * @returns {Promise}
54651
54906
  */
54652
54907
 
54653
- function forceGarbageCollection(currentPosition, bufferingQueue) {
54654
- return (0,defer/* defer */.P)(function () {
54655
- var GC_GAP_CALM = config/* default.getCurrent */.Z.getCurrent().BUFFER_GC_GAPS.CALM;
54656
- var GC_GAP_BEEFY = config/* default.getCurrent */.Z.getCurrent().BUFFER_GC_GAPS.BEEFY;
54657
- log/* default.warn */.Z.warn("Stream: Running garbage collector");
54658
- var buffered = bufferingQueue.getBufferedRanges();
54659
- var cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_CALM); // more aggressive GC if we could not find any range to clean
54660
-
54661
- if (cleanedupRanges.length === 0) {
54662
- cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_BEEFY);
54663
- }
54664
-
54665
- if (log/* default.hasLevel */.Z.hasLevel("DEBUG")) {
54666
- log/* default.debug */.Z.debug("Stream: GC cleaning", cleanedupRanges.map(function (_ref) {
54667
- var start = _ref.start,
54668
- end = _ref.end;
54669
- return "start: " + start + " - end " + end;
54670
- }).join(", "));
54671
- }
54672
-
54673
- return (0,from/* from */.D)(cleanedupRanges.map(function (_ref2) {
54674
- var start = _ref2.start,
54675
- end = _ref2.end;
54676
- return start >= end ? (0,of.of)(null) : bufferingQueue.removeBuffer(start, end);
54677
- })).pipe((0,concatAll/* concatAll */.u)());
54678
- });
54908
+ function forceGarbageCollection(_x, _x2, _x3) {
54909
+ return _forceGarbageCollection.apply(this, arguments);
54679
54910
  }
54680
54911
  /**
54681
54912
  * Buffer garbage collector algorithm.
@@ -54691,6 +54922,68 @@ function forceGarbageCollection(currentPosition, bufferingQueue) {
54691
54922
  * @returns {Array.<Object>} - Ranges selected for clean up
54692
54923
  */
54693
54924
 
54925
+ function _forceGarbageCollection() {
54926
+ _forceGarbageCollection = (0,asyncToGenerator/* default */.Z)( /*#__PURE__*/regenerator_default().mark(function _callee(currentPosition, bufferingQueue, cancellationSignal) {
54927
+ var GC_GAP_CALM, GC_GAP_BEEFY, buffered, cleanedupRanges, _iterator, _step, range, start, end;
54928
+
54929
+ return regenerator_default().wrap(function _callee$(_context) {
54930
+ while (1) {
54931
+ switch (_context.prev = _context.next) {
54932
+ case 0:
54933
+ GC_GAP_CALM = config/* default.getCurrent */.Z.getCurrent().BUFFER_GC_GAPS.CALM;
54934
+ GC_GAP_BEEFY = config/* default.getCurrent */.Z.getCurrent().BUFFER_GC_GAPS.BEEFY;
54935
+ log/* default.warn */.Z.warn("Stream: Running garbage collector");
54936
+ buffered = bufferingQueue.getBufferedRanges();
54937
+ cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_CALM); // more aggressive GC if we could not find any range to clean
54938
+
54939
+ if (cleanedupRanges.length === 0) {
54940
+ cleanedupRanges = selectGCedRanges(currentPosition, buffered, GC_GAP_BEEFY);
54941
+ }
54942
+
54943
+ if (log/* default.hasLevel */.Z.hasLevel("DEBUG")) {
54944
+ log/* default.debug */.Z.debug("Stream: GC cleaning", cleanedupRanges.map(function (_ref2) {
54945
+ var start = _ref2.start,
54946
+ end = _ref2.end;
54947
+ return "start: " + start + " - end " + end;
54948
+ }).join(", "));
54949
+ }
54950
+
54951
+ _iterator = force_garbage_collection_createForOfIteratorHelperLoose(cleanedupRanges);
54952
+
54953
+ case 8:
54954
+ if ((_step = _iterator()).done) {
54955
+ _context.next = 16;
54956
+ break;
54957
+ }
54958
+
54959
+ range = _step.value;
54960
+ start = range.start, end = range.end;
54961
+
54962
+ if (!(start < end)) {
54963
+ _context.next = 14;
54964
+ break;
54965
+ }
54966
+
54967
+ _context.next = 14;
54968
+ return bufferingQueue.removeBuffer(start, end, cancellationSignal);
54969
+
54970
+ case 14:
54971
+ _context.next = 8;
54972
+ break;
54973
+
54974
+ case 16:
54975
+ return _context.abrupt("return");
54976
+
54977
+ case 17:
54978
+ case "end":
54979
+ return _context.stop();
54980
+ }
54981
+ }
54982
+ }, _callee);
54983
+ }));
54984
+ return _forceGarbageCollection.apply(this, arguments);
54985
+ }
54986
+
54694
54987
  function selectGCedRanges(position, buffered, gcGap) {
54695
54988
  var _getInnerAndOuterTime = (0,ranges/* getInnerAndOuterTimeRanges */.F_)(buffered, position),
54696
54989
  innerRange = _getInnerAndOuterTime.innerRange,
@@ -54712,9 +55005,9 @@ function selectGCedRanges(position, buffered, gcGap) {
54712
55005
 
54713
55006
  if (innerRange !== null) {
54714
55007
  if (log/* default.hasLevel */.Z.hasLevel("DEBUG")) {
54715
- log/* default.debug */.Z.debug("Stream: GC removing part of inner range", cleanedupRanges.map(function (_ref3) {
54716
- var start = _ref3.start,
54717
- end = _ref3.end;
55008
+ log/* default.debug */.Z.debug("Stream: GC removing part of inner range", cleanedupRanges.map(function (_ref) {
55009
+ var start = _ref.start,
55010
+ end = _ref.end;
54718
55011
  return "start: " + start + " - end " + end;
54719
55012
  }).join(", "));
54720
55013
  }
@@ -54737,6 +55030,9 @@ function selectGCedRanges(position, buffered, gcGap) {
54737
55030
  return cleanedupRanges;
54738
55031
  }
54739
55032
  ;// CONCATENATED MODULE: ./src/core/stream/representation/append_segment_to_buffer.ts
55033
+
55034
+
55035
+
54740
55036
  /**
54741
55037
  * Copyright 2015 CANAL+ Group
54742
55038
  *
@@ -54758,36 +55054,78 @@ function selectGCedRanges(position, buffered, gcGap) {
54758
55054
  */
54759
55055
 
54760
55056
 
54761
-
54762
55057
  /**
54763
55058
  * Append a segment to the given segmentBuffer.
54764
55059
  * If it leads to a QuotaExceededError, try to run our custom range
54765
55060
  * _garbage collector_ then retry.
54766
- *
54767
55061
  * @param {Observable} playbackObserver
54768
55062
  * @param {Object} segmentBuffer
54769
55063
  * @param {Object} dataInfos
54770
- * @returns {Observable}
55064
+ * @param {Object} cancellationSignal
55065
+ * @returns {Promise}
54771
55066
  */
54772
55067
 
54773
- function appendSegmentToBuffer(playbackObserver, segmentBuffer, dataInfos) {
54774
- var append$ = segmentBuffer.pushChunk(dataInfos);
54775
- return append$.pipe((0,catchError/* catchError */.K)(function (appendError) {
54776
- if (!(appendError instanceof Error) || appendError.name !== "QuotaExceededError") {
54777
- var reason = appendError instanceof Error ? appendError.toString() : "An unknown error happened when pushing content";
54778
- throw new media_error/* default */.Z("BUFFER_APPEND_ERROR", reason);
54779
- }
55068
+ function appendSegmentToBuffer(_x, _x2, _x3, _x4) {
55069
+ return _appendSegmentToBuffer.apply(this, arguments);
55070
+ }
54780
55071
 
54781
- return playbackObserver.getReference().asObservable().pipe((0,take/* take */.q)(1), (0,mergeMap/* mergeMap */.z)(function (observation) {
54782
- var _a;
55072
+ function _appendSegmentToBuffer() {
55073
+ _appendSegmentToBuffer = (0,asyncToGenerator/* default */.Z)( /*#__PURE__*/regenerator_default().mark(function _callee(playbackObserver, segmentBuffer, dataInfos, cancellationSignal) {
55074
+ var _a, reason, _playbackObserver$get, position, currentPos, _reason;
54783
55075
 
54784
- var currentPos = (_a = observation.position.pending) !== null && _a !== void 0 ? _a : observation.position.last;
54785
- return (0,concat/* concat */.z)(forceGarbageCollection(currentPos, segmentBuffer).pipe((0,ignoreElements/* ignoreElements */.l)()), append$).pipe((0,catchError/* catchError */.K)(function (forcedGCError) {
54786
- var reason = forcedGCError instanceof Error ? forcedGCError.toString() : "Could not clean the buffer";
54787
- throw new media_error/* default */.Z("BUFFER_FULL_ERROR", reason);
54788
- }));
54789
- }));
55076
+ return regenerator_default().wrap(function _callee$(_context) {
55077
+ while (1) {
55078
+ switch (_context.prev = _context.next) {
55079
+ case 0:
55080
+ _context.prev = 0;
55081
+ _context.next = 3;
55082
+ return segmentBuffer.pushChunk(dataInfos, cancellationSignal);
55083
+
55084
+ case 3:
55085
+ _context.next = 23;
55086
+ break;
55087
+
55088
+ case 5:
55089
+ _context.prev = 5;
55090
+ _context.t0 = _context["catch"](0);
55091
+
55092
+ if (!(!(_context.t0 instanceof Error) || _context.t0.name !== "QuotaExceededError")) {
55093
+ _context.next = 10;
55094
+ break;
55095
+ }
55096
+
55097
+ reason = _context.t0 instanceof Error ? _context.t0.toString() : "An unknown error happened when pushing content";
55098
+ throw new media_error/* default */.Z("BUFFER_APPEND_ERROR", reason);
55099
+
55100
+ case 10:
55101
+ _playbackObserver$get = playbackObserver.getReference().getValue(), position = _playbackObserver$get.position;
55102
+ currentPos = (_a = position.pending) !== null && _a !== void 0 ? _a : position.last;
55103
+ _context.prev = 12;
55104
+ _context.next = 15;
55105
+ return forceGarbageCollection(currentPos, segmentBuffer, cancellationSignal);
55106
+
55107
+ case 15:
55108
+ _context.next = 17;
55109
+ return segmentBuffer.pushChunk(dataInfos, cancellationSignal);
55110
+
55111
+ case 17:
55112
+ _context.next = 23;
55113
+ break;
55114
+
55115
+ case 19:
55116
+ _context.prev = 19;
55117
+ _context.t1 = _context["catch"](12);
55118
+ _reason = _context.t1 instanceof Error ? _context.t1.toString() : "Could not clean the buffer";
55119
+ throw new media_error/* default */.Z("BUFFER_FULL_ERROR", _reason);
55120
+
55121
+ case 23:
55122
+ case "end":
55123
+ return _context.stop();
55124
+ }
55125
+ }
55126
+ }, _callee, null, [[0, 5], [12, 19]]);
54790
55127
  }));
55128
+ return _appendSegmentToBuffer.apply(this, arguments);
54791
55129
  }
54792
55130
  ;// CONCATENATED MODULE: ./src/core/stream/representation/push_init_segment.ts
54793
55131
  /**
@@ -54808,6 +55146,8 @@ function appendSegmentToBuffer(playbackObserver, segmentBuffer, dataInfos) {
54808
55146
 
54809
55147
 
54810
55148
 
55149
+
55150
+
54811
55151
  /**
54812
55152
  * Push the initialization segment to the SegmentBuffer.
54813
55153
  * The Observable returned:
@@ -54836,9 +55176,12 @@ function pushInitSegment(_ref) {
54836
55176
  appendWindow: [undefined, undefined],
54837
55177
  codec: codec
54838
55178
  };
54839
- return appendSegmentToBuffer(playbackObserver, segmentBuffer, {
54840
- data: data,
54841
- inventoryInfos: null
55179
+ var canceller = new task_canceller/* default */.ZP();
55180
+ return fromCancellablePromise(canceller, function () {
55181
+ return appendSegmentToBuffer(playbackObserver, segmentBuffer, {
55182
+ data: data,
55183
+ inventoryInfos: null
55184
+ }, canceller.signal);
54842
55185
  }).pipe((0,map/* map */.U)(function () {
54843
55186
  var buffered = segmentBuffer.getBufferedRanges();
54844
55187
  return stream_events_generators/* default.addedSegment */.Z.addedSegment(content, segment, buffered, segmentData);
@@ -54866,6 +55209,8 @@ function pushInitSegment(_ref) {
54866
55209
 
54867
55210
 
54868
55211
 
55212
+
55213
+
54869
55214
  /**
54870
55215
  * Push a given media segment (non-init segment) to a SegmentBuffer.
54871
55216
  * The Observable returned:
@@ -54928,9 +55273,12 @@ function pushMediaSegment(_ref) {
54928
55273
  start: estimatedStart,
54929
55274
  end: estimatedEnd
54930
55275
  }, content);
54931
- return appendSegmentToBuffer(playbackObserver, segmentBuffer, {
54932
- data: data,
54933
- inventoryInfos: inventoryInfos
55276
+ var canceller = new task_canceller/* default */.ZP();
55277
+ return fromCancellablePromise(canceller, function () {
55278
+ return appendSegmentToBuffer(playbackObserver, segmentBuffer, {
55279
+ data: data,
55280
+ inventoryInfos: inventoryInfos
55281
+ }, canceller.signal);
54934
55282
  }).pipe((0,map/* map */.U)(function () {
54935
55283
  var buffered = segmentBuffer.getBufferedRanges();
54936
55284
  return stream_events_generators/* default.addedSegment */.Z.addedSegment(content, segment, buffered, chunkData);
@@ -54975,6 +55323,8 @@ function pushMediaSegment(_ref) {
54975
55323
 
54976
55324
 
54977
55325
 
55326
+
55327
+
54978
55328
  /**
54979
55329
  * Build up buffer for a single Representation.
54980
55330
  *
@@ -55149,8 +55499,11 @@ function RepresentationStream(_ref) {
55149
55499
  var gcedPosition = Math.max(0, initialWantedTime - UPTO_CURRENT_POSITION_CLEANUP);
55150
55500
 
55151
55501
  if (gcedPosition > 0) {
55152
- bufferRemoval = segmentBuffer.removeBuffer(0, gcedPosition) // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
55153
- .pipe((0,ignoreElements/* ignoreElements */.l)());
55502
+ var removalCanceller = new task_canceller/* default */.ZP();
55503
+ bufferRemoval = fromCancellablePromise(removalCanceller, function () {
55504
+ return segmentBuffer.removeBuffer(0, gcedPosition, removalCanceller.signal);
55505
+ } // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
55506
+ ).pipe((0,ignoreElements/* ignoreElements */.l)());
55154
55507
  }
55155
55508
  }
55156
55509
 
@@ -55191,9 +55544,12 @@ function RepresentationStream(_ref) {
55191
55544
  case "end-of-segment":
55192
55545
  {
55193
55546
  var segment = evt.value.segment;
55194
- return segmentBuffer.endOfSegment((0,object_assign/* default */.Z)({
55195
- segment: segment
55196
- }, content)) // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
55547
+ var endOfSegmentCanceller = new task_canceller/* default */.ZP();
55548
+ return fromCancellablePromise(endOfSegmentCanceller, function () {
55549
+ return segmentBuffer.endOfSegment((0,object_assign/* default */.Z)({
55550
+ segment: segment
55551
+ }, content), endOfSegmentCanceller.signal);
55552
+ }) // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
55197
55553
  // first type parameter as `any` instead of the perfectly fine `unknown`,
55198
55554
  // leading to linter issues, as it forbids the usage of `any`.
55199
55555
  // This is why we're disabling the eslint rule.
@@ -56102,6 +56458,8 @@ function getFirstSegmentAfterPeriod(inventory, period) {
56102
56458
 
56103
56459
 
56104
56460
 
56461
+
56462
+
56105
56463
  /**
56106
56464
  * Create single PeriodStream Observable:
56107
56465
  * - Lazily create (or reuse) a SegmentBuffer for the given type.
@@ -56154,13 +56512,16 @@ function PeriodStream(_ref) {
56154
56512
  return reloadAfterSwitch(period, bufferType, playbackObserver, 0);
56155
56513
  }
56156
56514
 
56157
- if (period.end === undefined) {
56158
- cleanBuffer$ = segmentBufferStatus.value.removeBuffer(period.start, Infinity);
56159
- } else if (period.end <= period.start) {
56160
- cleanBuffer$ = (0,of.of)(null);
56161
- } else {
56162
- cleanBuffer$ = segmentBufferStatus.value.removeBuffer(period.start, period.end);
56163
- }
56515
+ var canceller = new task_canceller/* default */.ZP();
56516
+ cleanBuffer$ = fromCancellablePromise(canceller, function () {
56517
+ if (period.end === undefined) {
56518
+ return segmentBufferStatus.value.removeBuffer(period.start, Infinity, canceller.signal);
56519
+ } else if (period.end <= period.start) {
56520
+ return Promise.resolve();
56521
+ } else {
56522
+ return segmentBufferStatus.value.removeBuffer(period.start, period.end, canceller.signal);
56523
+ }
56524
+ });
56164
56525
  } else {
56165
56526
  if (segmentBufferStatus.type === "uninitialized") {
56166
56527
  segmentBuffersStore.disableSegmentBuffer(bufferType);
@@ -56198,11 +56559,17 @@ function PeriodStream(_ref) {
56198
56559
  var cleanBuffer$ = strategy.type === "clean-buffer" || strategy.type === "flush-buffer" ? concat/* concat.apply */.z.apply(void 0, strategy.value.map(function (_ref2) {
56199
56560
  var start = _ref2.start,
56200
56561
  end = _ref2.end;
56201
- return segmentBuffer.removeBuffer(start, end);
56562
+ var canceller = new task_canceller/* default */.ZP();
56563
+ return fromCancellablePromise(canceller, function () {
56564
+ return segmentBuffer.removeBuffer(start, end, canceller.signal);
56565
+ });
56202
56566
  })).pipe((0,ignoreElements/* ignoreElements */.l)()) : empty/* EMPTY */.E;
56203
56567
  var bufferGarbageCollector$ = garbageCollectors.get(segmentBuffer);
56204
56568
  var adaptationStream$ = createAdaptationStream(adaptation, segmentBuffer);
56205
- return segmentBuffersStore.waitForUsableBuffers().pipe((0,mergeMap/* mergeMap */.z)(function () {
56569
+ var cancelWait = new task_canceller/* default */.ZP();
56570
+ return fromCancellablePromise(cancelWait, function () {
56571
+ return segmentBuffersStore.waitForUsableBuffers(cancelWait.signal);
56572
+ }).pipe((0,mergeMap/* mergeMap */.z)(function () {
56206
56573
  return (0,concat/* concat */.z)(cleanBuffer$, needsBufferFlush$, (0,merge/* merge */.T)(adaptationStream$, bufferGarbageCollector$));
56207
56574
  }));
56208
56575
  });
@@ -56656,6 +57023,9 @@ function getBlacklistedRanges(segmentBuffer, contents) {
56656
57023
 
56657
57024
 
56658
57025
 
57026
+
57027
+
57028
+
56659
57029
  /**
56660
57030
  * Create and manage the various Stream Observables needed for the content to
56661
57031
  * play:
@@ -56700,19 +57070,21 @@ function StreamOrchestrator(content, playbackObserver, representationEstimator,
56700
57070
  var bufferType = segmentBuffer.bufferType;
56701
57071
  var defaultMaxBehind = MAXIMUM_MAX_BUFFER_BEHIND[bufferType] != null ? MAXIMUM_MAX_BUFFER_BEHIND[bufferType] : Infinity;
56702
57072
  var defaultMaxAhead = MAXIMUM_MAX_BUFFER_AHEAD[bufferType] != null ? MAXIMUM_MAX_BUFFER_AHEAD[bufferType] : Infinity;
56703
- return BufferGarbageCollector({
56704
- segmentBuffer: segmentBuffer,
56705
- currentTime$: playbackObserver.getReference().asObservable().pipe((0,map/* map */.U)(function (o) {
56706
- var _a;
56707
-
56708
- return (_a = o.position.pending) !== null && _a !== void 0 ? _a : o.position.last;
56709
- })),
56710
- maxBufferBehind$: maxBufferBehind.asObservable().pipe((0,map/* map */.U)(function (val) {
56711
- return Math.min(val, defaultMaxBehind);
56712
- })),
56713
- maxBufferAhead$: maxBufferAhead.asObservable().pipe((0,map/* map */.U)(function (val) {
56714
- return Math.min(val, defaultMaxAhead);
56715
- }))
57073
+ return new Observable/* Observable */.y(function () {
57074
+ var canceller = new task_canceller/* default */.ZP();
57075
+ BufferGarbageCollector({
57076
+ segmentBuffer: segmentBuffer,
57077
+ playbackObserver: playbackObserver,
57078
+ maxBufferBehind: (0,reference/* createMappedReference */.lR)(maxBufferBehind, function (val) {
57079
+ return Math.min(val, defaultMaxBehind);
57080
+ }, canceller.signal),
57081
+ maxBufferAhead: (0,reference/* createMappedReference */.lR)(maxBufferAhead, function (val) {
57082
+ return Math.min(val, defaultMaxAhead);
57083
+ }, canceller.signal)
57084
+ }, canceller.signal);
57085
+ return function () {
57086
+ canceller.cancel();
57087
+ };
56716
57088
  });
56717
57089
  }); // Every PeriodStreams for every possible types
56718
57090
 
@@ -56878,7 +57250,15 @@ function StreamOrchestrator(content, playbackObserver, representationEstimator,
56878
57250
  return concat/* concat.apply */.z.apply(void 0, rangesToClean.map(function (_ref3) {
56879
57251
  var start = _ref3.start,
56880
57252
  end = _ref3.end;
56881
- return start >= end ? empty/* EMPTY */.E : segmentBuffer.removeBuffer(start, end).pipe((0,ignoreElements/* ignoreElements */.l)());
57253
+
57254
+ if (start >= end) {
57255
+ return empty/* EMPTY */.E;
57256
+ }
57257
+
57258
+ var canceller = new task_canceller/* default */.ZP();
57259
+ return fromCancellablePromise(canceller, function () {
57260
+ return segmentBuffer.removeBuffer(start, end, canceller.signal);
57261
+ }).pipe((0,ignoreElements/* ignoreElements */.l)());
56882
57262
  }).concat([// Schedule micro task before checking the last playback observation
56883
57263
  // to reduce the risk of race conditions where the next observation
56884
57264
  // was going to be emitted synchronously.
@@ -57631,6 +58011,22 @@ function maintainEndOfStream(mediaSource) {
57631
58011
  var initial_seek_and_play = __webpack_require__(7920);
57632
58012
  // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/timer.js
57633
58013
  var timer = __webpack_require__(6625);
58014
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/fromEvent.js
58015
+ var fromEvent = __webpack_require__(2401);
58016
+ // EXTERNAL MODULE: ./node_modules/rxjs/dist/esm5/internal/scheduler/async.js
58017
+ var scheduler_async = __webpack_require__(7991);
58018
+ ;// CONCATENATED MODULE: ./node_modules/rxjs/dist/esm5/internal/observable/interval.js
58019
+
58020
+
58021
+ function interval(period, scheduler) {
58022
+ if (period === void 0) { period = 0; }
58023
+ if (scheduler === void 0) { scheduler = scheduler_async/* asyncScheduler */.z; }
58024
+ if (period < 0) {
58025
+ period = 0;
58026
+ }
58027
+ return (0,timer/* timer */.H)(period, period, scheduler);
58028
+ }
58029
+ //# sourceMappingURL=interval.js.map
57634
58030
  ;// CONCATENATED MODULE: ./src/core/init/media_duration_updater.ts
57635
58031
  /**
57636
58032
  * Copyright 2015 CANAL+ Group
@@ -57845,7 +58241,7 @@ function areSourceBuffersUpdating$(sourceBuffers) {
57845
58241
  return true;
57846
58242
  })), (0,fromEvent/* fromEvent */.R)(sourceBuffer, "update").pipe((0,map/* map */.U)(function () {
57847
58243
  return false;
57848
- })), (0,interval/* interval */.F)(500).pipe((0,map/* map */.U)(function () {
58244
+ })), interval(500).pipe((0,map/* map */.U)(function () {
57849
58245
  return sourceBuffer.updating;
57850
58246
  }))).pipe((0,startWith/* startWith */.O)(sourceBuffer.updating), (0,distinctUntilChanged/* distinctUntilChanged */.x)()));
57851
58247
  };
@@ -58140,7 +58536,7 @@ function streamEventsEmitter(manifest, mediaElement, observation$) {
58140
58536
  var _config$getCurrent = config/* default.getCurrent */.Z.getCurrent(),
58141
58537
  STREAM_EVENT_EMITTER_POLL_INTERVAL = _config$getCurrent.STREAM_EVENT_EMITTER_POLL_INTERVAL;
58142
58538
 
58143
- return combineLatest([(0,interval/* interval */.F)(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe((0,startWith/* startWith */.O)(null)), observation$]).pipe((0,map/* map */.U)(function (_ref) {
58539
+ return combineLatest([interval(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe((0,startWith/* startWith */.O)(null)), observation$]).pipe((0,map/* map */.U)(function (_ref) {
58144
58540
  var _ = _ref[0],
58145
58541
  observation = _ref[1];
58146
58542
  var seeking = observation.seeking;
@@ -58340,7 +58736,7 @@ function createMediaSourceLoader(_ref) {
58340
58736
  * events when it cannot, as well as "unstalled" events when it get out of one.
58341
58737
  */
58342
58738
 
58343
- var stallAvoider$ = (0,stall_avoider/* default */.Z)(playbackObserver, manifest, lockedStream$, discontinuityUpdate$);
58739
+ var stallAvoider$ = (0,stall_avoider/* default */.Z)(playbackObserver, manifest, speed, lockedStream$, discontinuityUpdate$);
58344
58740
  /**
58345
58741
  * Emit a "loaded" events once the initial play has been performed and the
58346
58742
  * media can begin playback.
@@ -59641,7 +60037,7 @@ var PlaybackObserver = /*#__PURE__*/function () {
59641
60037
  * @param {Object} options
59642
60038
  */
59643
60039
  function PlaybackObserver(mediaElement, options) {
59644
- this._internalSeekingEventsIncomingCounter = 0;
60040
+ this._internalSeeksIncoming = [];
59645
60041
  this._mediaElement = mediaElement;
59646
60042
  this._withMediaSource = options.withMediaSource;
59647
60043
  this._lowLatencyMode = options.lowLatencyMode;
@@ -59675,6 +60071,15 @@ var PlaybackObserver = /*#__PURE__*/function () {
59675
60071
  _proto.getCurrentTime = function getCurrentTime() {
59676
60072
  return this._mediaElement.currentTime;
59677
60073
  }
60074
+ /**
60075
+ * Returns the current playback rate advertised by the `HTMLMediaElement`.
60076
+ * @returns {number}
60077
+ */
60078
+ ;
60079
+
60080
+ _proto.getPlaybackRate = function getPlaybackRate() {
60081
+ return this._mediaElement.playbackRate;
60082
+ }
59678
60083
  /**
59679
60084
  * Returns the current `paused` status advertised by the `HTMLMediaElement`.
59680
60085
  *
@@ -59700,7 +60105,8 @@ var PlaybackObserver = /*#__PURE__*/function () {
59700
60105
  ;
59701
60106
 
59702
60107
  _proto.setCurrentTime = function setCurrentTime(time) {
59703
- this._internalSeekingEventsIncomingCounter += 1;
60108
+ this._internalSeeksIncoming.push(time);
60109
+
59704
60110
  this._mediaElement.currentTime = time;
59705
60111
  }
59706
60112
  /**
@@ -59792,18 +60198,26 @@ var PlaybackObserver = /*#__PURE__*/function () {
59792
60198
 
59793
60199
  var getCurrentObservation = function getCurrentObservation(event) {
59794
60200
  var tmpEvt = event;
60201
+ var startedInternalSeekTime;
59795
60202
 
59796
- if (tmpEvt === "seeking" && _this._internalSeekingEventsIncomingCounter > 0) {
60203
+ if (tmpEvt === "seeking" && _this._internalSeeksIncoming.length > 0) {
59797
60204
  tmpEvt = "internal-seeking";
59798
- _this._internalSeekingEventsIncomingCounter -= 1;
60205
+ startedInternalSeekTime = _this._internalSeeksIncoming.shift();
59799
60206
  }
59800
60207
 
59801
60208
  var _lastObservation = lastObservation !== null && lastObservation !== void 0 ? lastObservation : _this._generateInitialObservation();
59802
60209
 
59803
60210
  var mediaTimings = getMediaInfos(_this._mediaElement, tmpEvt);
59804
- var internalSeeking = mediaTimings.seeking && ( // We've just received the event for internally seeking
59805
- tmpEvt === "internal-seeking" || // or We're still waiting on the previous internal-seek
59806
- _lastObservation.internalSeeking && tmpEvt !== "seeking");
60211
+ var pendingInternalSeek = null;
60212
+
60213
+ if (mediaTimings.seeking) {
60214
+ if (typeof startedInternalSeekTime === "number") {
60215
+ pendingInternalSeek = startedInternalSeekTime;
60216
+ } else if (_lastObservation.pendingInternalSeek !== null && event !== "seeking") {
60217
+ pendingInternalSeek = _lastObservation.pendingInternalSeek;
60218
+ }
60219
+ }
60220
+
59807
60221
  var rebufferingStatus = getRebufferingStatus(_lastObservation, mediaTimings, {
59808
60222
  lowLatencyMode: _this._lowLatencyMode,
59809
60223
  withMediaSource: _this._withMediaSource
@@ -59812,11 +60226,11 @@ var PlaybackObserver = /*#__PURE__*/function () {
59812
60226
  var timings = (0,object_assign/* default */.Z)({}, {
59813
60227
  rebuffering: rebufferingStatus,
59814
60228
  freezing: freezingStatus,
59815
- internalSeeking: internalSeeking
60229
+ pendingInternalSeek: pendingInternalSeek
59816
60230
  }, mediaTimings);
59817
60231
 
59818
60232
  if (log/* default.hasLevel */.Z.hasLevel("DEBUG")) {
59819
- log/* default.debug */.Z.debug("API: current media element state tick", "event", timings.event, "position", timings.position, "seeking", timings.seeking, "internalSeeking", timings.internalSeeking, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
60233
+ log/* default.debug */.Z.debug("API: current media element state tick", "event", timings.event, "position", timings.position, "seeking", timings.seeking, "internalSeek", timings.pendingInternalSeek, "rebuffering", timings.rebuffering !== null, "freezing", timings.freezing !== null, "ended", timings.ended, "paused", timings.paused, "playbackRate", timings.playbackRate, "readyState", timings.readyState);
59820
60234
  }
59821
60235
 
59822
60236
  return timings;
@@ -59874,7 +60288,7 @@ var PlaybackObserver = /*#__PURE__*/function () {
59874
60288
  return (0,object_assign/* default */.Z)(getMediaInfos(this._mediaElement, "init"), {
59875
60289
  rebuffering: null,
59876
60290
  freezing: null,
59877
- internalSeeking: false
60291
+ pendingInternalSeek: null
59878
60292
  });
59879
60293
  };
59880
60294
 
@@ -60180,6 +60594,9 @@ function generateReadOnlyObserver(src, transform, cancellationSignal) {
60180
60594
  getReadyState: function getReadyState() {
60181
60595
  return src.getReadyState();
60182
60596
  },
60597
+ getPlaybackRate: function getPlaybackRate() {
60598
+ return src.getPlaybackRate();
60599
+ },
60183
60600
  getIsPaused: function getIsPaused() {
60184
60601
  return src.getIsPaused();
60185
60602
  },
@@ -61627,7 +62044,7 @@ var Player = /*#__PURE__*/function (_EventEmitter) {
61627
62044
  videoElement.preload = "auto";
61628
62045
  _this.version =
61629
62046
  /* PLAYER_VERSION */
61630
- "3.28.1-dev.2022083000";
62047
+ "3.29.0-dev.2022090500";
61631
62048
  _this.log = log/* default */.Z;
61632
62049
  _this.state = "STOPPED";
61633
62050
  _this.videoElement = videoElement;
@@ -61966,20 +62383,24 @@ var Player = /*#__PURE__*/function (_EventEmitter) {
61966
62383
  var transportPipelines = transportFn(transportOptions);
61967
62384
  var offlineRetry = networkConfig.offlineRetry,
61968
62385
  segmentRetry = networkConfig.segmentRetry,
61969
- manifestRetry = networkConfig.manifestRetry;
62386
+ manifestRetry = networkConfig.manifestRetry,
62387
+ manifestRequestTimeout = networkConfig.manifestRequestTimeout,
62388
+ segmentRequestTimeout = networkConfig.segmentRequestTimeout;
61970
62389
  /** Interface used to load and refresh the Manifest. */
61971
62390
 
61972
62391
  var manifestFetcher = new fetchers_manifest(url, transportPipelines, {
61973
62392
  lowLatencyMode: lowLatencyMode,
61974
62393
  maxRetryRegular: manifestRetry,
61975
- maxRetryOffline: offlineRetry
62394
+ maxRetryOffline: offlineRetry,
62395
+ requestTimeout: manifestRequestTimeout
61976
62396
  });
61977
62397
  /** Interface used to download segments. */
61978
62398
 
61979
62399
  var segmentFetcherCreator = new segment(transportPipelines, {
61980
62400
  lowLatencyMode: lowLatencyMode,
61981
62401
  maxRetryOffline: offlineRetry,
61982
- maxRetryRegular: segmentRetry
62402
+ maxRetryRegular: segmentRetry,
62403
+ requestTimeout: segmentRequestTimeout
61983
62404
  });
61984
62405
  /** Observable emitting the initial Manifest */
61985
62406
 
@@ -62242,14 +62663,14 @@ var Player = /*#__PURE__*/function (_EventEmitter) {
62242
62663
  _this2.trigger(evt, null);
62243
62664
  }); // Handle state updates
62244
62665
 
62245
- playerState$.pipe((0,takeUntil/* takeUntil */.R)(stoppedContent$)).subscribe(function (x) {
62246
- return _this2._priv_setPlayerState(x);
62247
- });
62248
- var endedEvent$ = observation$.pipe((0,filter/* filter */.h)(function (o) {
62249
- return o.event === "ended";
62250
- }));
62251
- (this._priv_stopAtEnd ? endedEvent$ : empty/* EMPTY */.E).pipe((0,takeUntil/* takeUntil */.R)(stoppedContent$)).subscribe(function () {
62252
- currentContentCanceller.cancel();
62666
+ playerState$.pipe((0,takeUntil/* takeUntil */.R)(stoppedContent$)).subscribe(function (newState) {
62667
+ _this2._priv_setPlayerState(newState); // Previous call could have performed all kind of side-effects, thus,
62668
+ // we re-check the current state associated to the RxPlayer
62669
+
62670
+
62671
+ if (_this2.state === "ENDED" && _this2._priv_stopAtEnd) {
62672
+ currentContentCanceller.cancel();
62673
+ }
62253
62674
  }); // Link playback events to the corresponding callbacks
62254
62675
 
62255
62676
  playback$.subscribe({
@@ -64448,7 +64869,7 @@ var Player = /*#__PURE__*/function (_EventEmitter) {
64448
64869
 
64449
64870
  Player.version =
64450
64871
  /* PLAYER_VERSION */
64451
- "3.28.1-dev.2022083000";
64872
+ "3.29.0-dev.2022090500";
64452
64873
  /* harmony default export */ var public_api = (Player);
64453
64874
  ;// CONCATENATED MODULE: ./src/core/api/index.ts
64454
64875
  /**