rx-player 3.30.0-dev.2023020100 → 3.30.0-dev.2023030200

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 (183) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +5 -1
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +23 -12
  5. package/dist/_esm5.processed/compat/browser_detection.js +80 -38
  6. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  8. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  9. package/dist/_esm5.processed/config.d.ts +2 -0
  10. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +4 -2
  11. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  12. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  13. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  14. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  15. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  16. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  17. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  18. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  19. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  20. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +199 -0
  21. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  22. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  23. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  24. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  25. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  26. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  27. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  28. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  29. package/dist/_esm5.processed/core/api/playback_observer.js +3 -2
  30. package/dist/_esm5.processed/core/api/public_api.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/public_api.js +25 -14
  32. package/dist/_esm5.processed/core/api/utils.js +3 -3
  33. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +32 -13
  34. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  35. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  37. package/dist/_esm5.processed/core/decrypt/find_key_system.js +33 -24
  38. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +54 -50
  39. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  40. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  41. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  42. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  43. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  44. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  45. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  46. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  47. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  48. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +27 -31
  49. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +2 -2
  50. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  51. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  52. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  53. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  54. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  55. package/dist/_esm5.processed/core/init/utils/media_duration_updater.js +23 -19
  56. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +1 -1
  57. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  58. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  59. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +7 -10
  60. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +4 -2
  61. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  62. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +25 -16
  63. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +26 -12
  64. package/dist/_esm5.processed/core/stream/period/period_stream.js +11 -10
  65. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -15
  66. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +1 -1
  67. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  68. package/dist/_esm5.processed/default_config.d.ts +16 -0
  69. package/dist/_esm5.processed/default_config.js +19 -0
  70. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  71. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  72. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  73. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  74. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  75. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +8 -4
  76. package/dist/_esm5.processed/features/features_object.js +1 -0
  77. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  78. package/dist/_esm5.processed/features/types.d.ts +3 -0
  79. package/dist/_esm5.processed/manifest/adaptation.js +4 -0
  80. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  81. package/dist/_esm5.processed/manifest/representation.js +11 -4
  82. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  83. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  84. package/dist/_esm5.processed/public_types.d.ts +1 -0
  85. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  86. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  87. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  88. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  89. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  90. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  91. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  92. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  93. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  94. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  95. package/dist/_esm5.processed/utils/reference.js +6 -0
  96. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  97. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  98. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  99. package/dist/rx-player.js +880 -677
  100. package/dist/rx-player.min.js +1 -1
  101. package/jest.config.js +1 -0
  102. package/package.json +19 -18
  103. package/scripts/build/constants.d.ts +1 -0
  104. package/scripts/report_build_sizes +4 -0
  105. package/sonar-project.properties +1 -1
  106. package/src/compat/browser_detection.ts +99 -52
  107. package/src/compat/can_reuse_media_keys.ts +5 -2
  108. package/src/compat/eme/close_session.ts +2 -2
  109. package/src/compat/event_listeners.ts +1 -1
  110. package/src/core/adaptive/adaptive_representation_selector.ts +4 -2
  111. package/src/core/api/debug/buffer_graph.ts +247 -0
  112. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  113. package/src/core/api/debug/constants.ts +2 -0
  114. package/src/core/api/debug/index.ts +3 -0
  115. package/src/core/api/debug/modules/general_info.ts +204 -0
  116. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  117. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  118. package/src/core/api/debug/render.ts +40 -0
  119. package/src/core/api/debug/utils.ts +103 -0
  120. package/src/core/api/playback_observer.ts +4 -2
  121. package/src/core/api/public_api.ts +28 -14
  122. package/src/core/api/utils.ts +3 -3
  123. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  124. package/src/core/decrypt/attach_media_keys.ts +1 -1
  125. package/src/core/decrypt/content_decryptor.ts +1 -1
  126. package/src/core/decrypt/find_key_system.ts +36 -35
  127. package/src/core/decrypt/session_events_listener.ts +57 -56
  128. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  129. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  130. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  131. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  132. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  133. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  134. package/src/core/init/directfile_content_initializer.ts +1 -1
  135. package/src/core/init/media_source_content_initializer.ts +37 -41
  136. package/src/core/init/utils/content_time_boundaries_observer.ts +2 -2
  137. package/src/core/init/utils/create_media_source.ts +4 -16
  138. package/src/core/init/utils/end_of_stream.ts +6 -3
  139. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  140. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  141. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  142. package/src/core/init/utils/media_duration_updater.ts +25 -20
  143. package/src/core/init/utils/rebuffering_controller.ts +1 -1
  144. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  145. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  146. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +7 -11
  147. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +4 -2
  148. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  149. package/src/core/stream/adaptation/adaptation_stream.ts +28 -19
  150. package/src/core/stream/orchestrator/stream_orchestrator.ts +26 -12
  151. package/src/core/stream/period/period_stream.ts +11 -10
  152. package/src/core/stream/representation/representation_stream.ts +15 -15
  153. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
  154. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  155. package/src/default_config.ts +30 -9
  156. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  157. package/src/experimental/features/debug_element.ts +13 -0
  158. package/src/experimental/features/index.ts +1 -0
  159. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  160. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +8 -4
  161. package/src/features/__tests__/initialize_features.test.ts +11 -0
  162. package/src/features/features_object.ts +1 -0
  163. package/src/features/initialize_features.ts +15 -10
  164. package/src/features/types.ts +9 -0
  165. package/src/manifest/adaptation.ts +7 -0
  166. package/src/manifest/manifest.ts +4 -0
  167. package/src/manifest/representation.ts +10 -4
  168. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  169. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  170. package/src/public_types.ts +1 -0
  171. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  172. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  173. package/src/transports/dash/manifest_parser.ts +1 -1
  174. package/src/transports/dash/segment_loader.ts +4 -4
  175. package/src/transports/local/segment_loader.ts +14 -30
  176. package/src/transports/smooth/segment_loader.ts +4 -4
  177. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  178. package/src/typings/globals.d.ts +2 -0
  179. package/src/utils/cancellable_sleep.ts +5 -14
  180. package/src/utils/create_cancellable_promise.ts +69 -0
  181. package/src/utils/reference.ts +6 -0
  182. package/src/utils/request/xhr.ts +1 -1
  183. package/src/utils/task_canceller.ts +63 -34
@@ -40,7 +40,8 @@ var MediaDurationUpdater = /** @class */ (function () {
40
40
  this._currentKnownDuration = currentKnownDuration;
41
41
  var isMediaSourceOpened = createMediaSourceOpenReference(mediaSource, this._canceller.signal);
42
42
  /** TaskCanceller triggered each time the MediaSource open status changes. */
43
- var msUpdateCanceller = new TaskCanceller({ cancelOn: this._canceller.signal });
43
+ var msUpdateCanceller = new TaskCanceller();
44
+ msUpdateCanceller.linkToSignal(this._canceller.signal);
44
45
  isMediaSourceOpened.onUpdate(onMediaSourceOpenedStatusChanged, { emitCurrentValue: true,
45
46
  clearSignal: this._canceller.signal });
46
47
  function onMediaSourceOpenedStatusChanged() {
@@ -48,16 +49,15 @@ var MediaDurationUpdater = /** @class */ (function () {
48
49
  if (!isMediaSourceOpened.getValue()) {
49
50
  return;
50
51
  }
51
- msUpdateCanceller = new TaskCanceller({ cancelOn: canceller.signal });
52
- /** TaskCanceller triggered each time the content's duration may have change */
53
- var durationChangeCanceller = new TaskCanceller({
54
- cancelOn: msUpdateCanceller.signal,
55
- });
52
+ msUpdateCanceller = new TaskCanceller();
53
+ msUpdateCanceller.linkToSignal(canceller.signal);
54
+ /** TaskCanceller triggered each time the content's duration may have changed */
55
+ var durationChangeCanceller = new TaskCanceller();
56
+ durationChangeCanceller.linkToSignal(msUpdateCanceller.signal);
56
57
  var reSetDuration = function () {
57
58
  durationChangeCanceller.cancel();
58
- durationChangeCanceller = new TaskCanceller({
59
- cancelOn: msUpdateCanceller.signal,
60
- });
59
+ durationChangeCanceller = new TaskCanceller();
60
+ durationChangeCanceller.linkToSignal(msUpdateCanceller.signal);
61
61
  onDurationMayHaveChanged(durationChangeCanceller.signal);
62
62
  };
63
63
  currentKnownDuration.onUpdate(reSetDuration, { emitCurrentValue: false,
@@ -68,10 +68,12 @@ var MediaDurationUpdater = /** @class */ (function () {
68
68
  function onDurationMayHaveChanged(cancelSignal) {
69
69
  var areSourceBuffersUpdating = createSourceBuffersUpdatingReference(mediaSource.sourceBuffers, cancelSignal);
70
70
  /** TaskCanceller triggered each time SourceBuffers' updating status changes */
71
- var sourceBuffersUpdatingCanceller = new TaskCanceller({ cancelOn: cancelSignal });
71
+ var sourceBuffersUpdatingCanceller = new TaskCanceller();
72
+ sourceBuffersUpdatingCanceller.linkToSignal(cancelSignal);
72
73
  return areSourceBuffersUpdating.onUpdate(function (areUpdating) {
73
74
  sourceBuffersUpdatingCanceller.cancel();
74
- sourceBuffersUpdatingCanceller = new TaskCanceller({ cancelOn: cancelSignal });
75
+ sourceBuffersUpdatingCanceller = new TaskCanceller();
76
+ sourceBuffersUpdatingCanceller.linkToSignal(cancelSignal);
75
77
  if (areUpdating) {
76
78
  return;
77
79
  }
@@ -119,19 +121,21 @@ function setMediaSourceDuration(mediaSource, manifest, knownDuration) {
119
121
  var newDuration = knownDuration;
120
122
  if (newDuration === undefined) {
121
123
  if (manifest.isDynamic) {
122
- var maxPotentialPos = (_a = manifest.getLivePosition()) !== null && _a !== void 0 ? _a : manifest.getMaximumSafePosition();
123
- // Some targets poorly support setting a very high number for durations.
124
- // Yet, in dynamic contents, we would prefer setting a value as high as possible
125
- // to still be able to seek anywhere we want to (even ahead of the Manifest if
126
- // we want to). As such, we put it at a safe default value of 2^32 excepted
127
- // when the maximum position is already relatively close to that value, where
128
- // we authorize exceptionally going over it.
129
- newDuration = Math.max(Math.pow(2, 32), maxPotentialPos + YEAR_IN_SECONDS);
124
+ newDuration = (_a = manifest.getLivePosition()) !== null && _a !== void 0 ? _a : manifest.getMaximumSafePosition();
130
125
  }
131
126
  else {
132
127
  newDuration = manifest.getMaximumSafePosition();
133
128
  }
134
129
  }
130
+ if (manifest.isDynamic) {
131
+ // Some targets poorly support setting a very high number for durations.
132
+ // Yet, in dynamic contents, we would prefer setting a value as high as possible
133
+ // to still be able to seek anywhere we want to (even ahead of the Manifest if
134
+ // we want to). As such, we put it at a safe default value of 2^32 excepted
135
+ // when the maximum position is already relatively close to that value, where
136
+ // we authorize exceptionally going over it.
137
+ newDuration = Math.max(Math.pow(2, 32), newDuration + YEAR_IN_SECONDS);
138
+ }
135
139
  var maxBufferedEnd = 0;
136
140
  for (var i = 0; i < mediaSource.sourceBuffers.length; i++) {
137
141
  var sourceBuffer = mediaSource.sourceBuffers[i];
@@ -100,7 +100,7 @@ var RebufferingController = /** @class */ (function (_super) {
100
100
  this._canceller.signal.register(function () {
101
101
  playbackRateUpdater.dispose();
102
102
  });
103
- var prevFreezingState;
103
+ var prevFreezingState = null;
104
104
  this._playbackObserver.listen(function (observation) {
105
105
  var _a;
106
106
  var discontinuitiesStore = _this._discontinuitiesStore;
@@ -35,13 +35,15 @@ export default function streamEventsEmitter(manifest, mediaElement, playbackObse
35
35
  scheduledEventsRef.setValue(refreshScheduledEventsList(prev, manifest));
36
36
  }, cancelSignal);
37
37
  var isPollingEvents = false;
38
- var cancelCurrentPolling = new TaskCanceller({ cancelOn: cancelSignal });
38
+ var cancelCurrentPolling = new TaskCanceller();
39
+ cancelCurrentPolling.linkToSignal(cancelSignal);
39
40
  scheduledEventsRef.onUpdate(function (_a) {
40
41
  var scheduledEventsLength = _a.length;
41
42
  if (scheduledEventsLength === 0) {
42
43
  if (isPollingEvents) {
43
44
  cancelCurrentPolling.cancel();
44
- cancelCurrentPolling = new TaskCanceller({ cancelOn: cancelSignal });
45
+ cancelCurrentPolling = new TaskCanceller();
46
+ cancelCurrentPolling.linkToSignal(cancelSignal);
45
47
  isPollingEvents = false;
46
48
  }
47
49
  return;
@@ -127,7 +129,7 @@ export default function streamEventsEmitter(manifest, mediaElement, playbackObse
127
129
  else {
128
130
  onEventSkip(event_2.value);
129
131
  }
130
- if (stopSignal.isCancelled) {
132
+ if (stopSignal.isCancelled()) {
131
133
  return;
132
134
  }
133
135
  }
@@ -138,7 +140,7 @@ export default function streamEventsEmitter(manifest, mediaElement, playbackObse
138
140
  if (typeof event_3.onExit === "function") {
139
141
  event_3.onExit();
140
142
  }
141
- if (stopSignal.isCancelled) {
143
+ if (stopSignal.isCancelled()) {
142
144
  return;
143
145
  }
144
146
  }
@@ -21,7 +21,7 @@ import isNullOrUndefined from "../../../utils/is_null_or_undefined";
21
21
  * @param {Object} cancelSignal
22
22
  */
23
23
  export default function listenToMediaError(mediaElement, onError, cancelSignal) {
24
- if (cancelSignal.isCancelled) {
24
+ if (cancelSignal.isCancelled()) {
25
25
  return;
26
26
  }
27
27
  mediaElement.addEventListener("error", onMediaError);
@@ -35,6 +35,7 @@ import { getLoggableSegmentId } from "../../../../manifest";
35
35
  import areArraysOfNumbersEqual from "../../../../utils/are_arrays_of_numbers_equal";
36
36
  import assertUnreachable from "../../../../utils/assert_unreachable";
37
37
  import { toUint8Array } from "../../../../utils/byte_parsing";
38
+ import createCancellablePromise from "../../../../utils/create_cancellable_promise";
38
39
  import hashBuffer from "../../../../utils/hash_buffer";
39
40
  import noop from "../../../../utils/noop";
40
41
  import objectAssign from "../../../../utils/object_assign";
@@ -227,15 +228,15 @@ var AudioVideoSegmentBuffer = /** @class */ (function (_super) {
227
228
  */
228
229
  AudioVideoSegmentBuffer.prototype._addToQueue = function (operation, cancellationSignal) {
229
230
  var _this = this;
230
- return new Promise(function (resolve, reject) {
231
- if (cancellationSignal.cancellationError !== null) {
232
- return reject(cancellationSignal.cancellationError);
233
- }
231
+ return createCancellablePromise(cancellationSignal, function (resolve, reject) {
234
232
  var shouldRestartQueue = _this._queue.length === 0 &&
235
233
  _this._pendingTask === null;
236
234
  var queueItem = objectAssign({ resolve: resolve, reject: reject }, operation);
237
235
  _this._queue.push(queueItem);
238
- cancellationSignal.register(function (error) {
236
+ if (shouldRestartQueue) {
237
+ _this._flush();
238
+ }
239
+ return function () {
239
240
  // Remove the corresponding element from the AudioVideoSegmentBuffer's
240
241
  // queue.
241
242
  // If the operation was a pending task, it should still continue to not
@@ -246,11 +247,7 @@ var AudioVideoSegmentBuffer = /** @class */ (function (_super) {
246
247
  }
247
248
  queueItem.resolve = noop;
248
249
  queueItem.reject = noop;
249
- reject(error);
250
- });
251
- if (shouldRestartQueue) {
252
- _this._flush();
253
- }
250
+ };
254
251
  });
255
252
  };
256
253
  /**
@@ -272,7 +272,8 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
272
272
  var proportionalCues = this._currentCues
273
273
  .filter(function (cue) { return cue.resolution !== null; });
274
274
  if (proportionalCues.length > 0) {
275
- this._sizeUpdateCanceller = new TaskCanceller({ cancelOn: this._canceller.signal });
275
+ this._sizeUpdateCanceller = new TaskCanceller();
276
+ this._sizeUpdateCanceller.linkToSignal(this._canceller.signal);
276
277
  var TEXT_TRACK_SIZE_CHECKS_INTERVAL = config.getCurrent().TEXT_TRACK_SIZE_CHECKS_INTERVAL;
277
278
  // update propertionally-sized elements periodically
278
279
  var heightWidthRef = onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL, this._sizeUpdateCanceller.signal);
@@ -297,7 +298,8 @@ var HTMLTextSegmentBuffer = /** @class */ (function (_super) {
297
298
  var MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL = config.getCurrent().MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL;
298
299
  var startAutoRefresh = function () {
299
300
  stopAutoRefresh();
300
- autoRefreshCanceller = new TaskCanceller({ cancelOn: cancellationSignal });
301
+ autoRefreshCanceller = new TaskCanceller();
302
+ autoRefreshCanceller.linkToSignal(cancellationSignal);
301
303
  var intervalId = setInterval(function () { return _this.refreshSubtitles(); }, MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL);
302
304
  autoRefreshCanceller.signal.register(function () {
303
305
  clearInterval(intervalId);
@@ -16,6 +16,7 @@
16
16
  import { MediaError } from "../../errors";
17
17
  import features from "../../features";
18
18
  import log from "../../log";
19
+ import createCancellablePromise from "../../utils/create_cancellable_promise";
19
20
  import { AudioVideoSegmentBuffer, } from "./implementations";
20
21
  var POSSIBLE_BUFFER_TYPES = ["audio",
21
22
  "video",
@@ -141,20 +142,23 @@ var SegmentBuffersStore = /** @class */ (function () {
141
142
  if (this._areNativeBuffersUsable()) {
142
143
  return Promise.resolve();
143
144
  }
144
- return new Promise(function (res, rej) {
145
- var onAddedOrDisabled = function () {
145
+ return createCancellablePromise(cancelWaitSignal, function (res) {
146
+ /* eslint-disable-next-line prefer-const */
147
+ var onAddedOrDisabled;
148
+ var removeCallback = function () {
149
+ var indexOf = _this._onNativeBufferAddedOrDisabled.indexOf(onAddedOrDisabled);
150
+ if (indexOf >= 0) {
151
+ _this._onNativeBufferAddedOrDisabled.splice(indexOf, 1);
152
+ }
153
+ };
154
+ onAddedOrDisabled = function () {
146
155
  if (_this._areNativeBuffersUsable()) {
156
+ removeCallback();
147
157
  res();
148
158
  }
149
159
  };
150
160
  _this._onNativeBufferAddedOrDisabled.push(onAddedOrDisabled);
151
- cancelWaitSignal.register(function (error) {
152
- var indexOf = _this._onNativeBufferAddedOrDisabled.indexOf(onAddedOrDisabled);
153
- if (indexOf >= 0) {
154
- _this._onNativeBufferAddedOrDisabled.splice(indexOf, 1);
155
- }
156
- rej(error);
157
- });
161
+ return removeCallback;
158
162
  });
159
163
  };
160
164
  /**
@@ -17,6 +17,8 @@ import nextTick from "next-tick";
17
17
  import config from "../../../config";
18
18
  import { formatError } from "../../../errors";
19
19
  import log from "../../../log";
20
+ import cancellableSleep from "../../../utils/cancellable_sleep";
21
+ import noop from "../../../utils/noop";
20
22
  import objectAssign from "../../../utils/object_assign";
21
23
  import { createMappedReference, createSharedReference, } from "../../../utils/reference";
22
24
  import TaskCanceller from "../../../utils/task_canceller";
@@ -57,7 +59,8 @@ export default function AdaptationStream(_a, callbacks, parentCancelSignal) {
57
59
  var directManualBitrateSwitching = options.manualBitrateSwitchingMode === "direct";
58
60
  var manifest = content.manifest, period = content.period, adaptation = content.adaptation;
59
61
  /** Allows to cancel everything the `AdaptationStream` is doing. */
60
- var adapStreamCanceller = new TaskCanceller({ cancelOn: parentCancelSignal });
62
+ var adapStreamCanceller = new TaskCanceller();
63
+ adapStreamCanceller.linkToSignal(parentCancelSignal);
61
64
  /**
62
65
  * The buffer goal ratio base itself on the value given by `wantedBufferAhead`
63
66
  * to determine a more dynamic buffer goal for a given Representation.
@@ -117,9 +120,8 @@ export default function AdaptationStream(_a, callbacks, parentCancelSignal) {
117
120
  * terminating and as such the next one might be immediately created
118
121
  * recursively.
119
122
  */
120
- var repStreamTerminatingCanceller = new TaskCanceller({
121
- cancelOn: adapStreamCanceller.signal,
122
- });
123
+ var repStreamTerminatingCanceller = new TaskCanceller();
124
+ repStreamTerminatingCanceller.linkToSignal(adapStreamCanceller.signal);
123
125
  var _a = estimateRef.getValue(), representation = _a.representation, manual = _a.manual;
124
126
  if (representation === null) {
125
127
  return;
@@ -188,11 +190,11 @@ export default function AdaptationStream(_a, callbacks, parentCancelSignal) {
188
190
  }
189
191
  var repInfo = { type: adaptation.type, period: period, representation: representation };
190
192
  currentRepresentation.setValue(representation);
191
- if (adapStreamCanceller.isUsed) {
193
+ if (adapStreamCanceller.isUsed()) {
192
194
  return; // previous callback has stopped everything by side-effect
193
195
  }
194
196
  callbacks.representationChange(repInfo);
195
- if (adapStreamCanceller.isUsed) {
197
+ if (adapStreamCanceller.isUsed()) {
196
198
  return; // previous callback has stopped everything by side-effect
197
199
  }
198
200
  var representationStreamCallbacks = {
@@ -208,13 +210,13 @@ export default function AdaptationStream(_a, callbacks, parentCancelSignal) {
208
210
  },
209
211
  addedSegment: function (segmentInfo) {
210
212
  abrCallbacks.addedSegment(segmentInfo);
211
- if (adapStreamCanceller.isUsed) {
213
+ if (adapStreamCanceller.isUsed()) {
212
214
  return;
213
215
  }
214
216
  callbacks.addedSegment(segmentInfo);
215
217
  },
216
218
  terminating: function () {
217
- if (repStreamTerminatingCanceller.isUsed) {
219
+ if (repStreamTerminatingCanceller.isUsed()) {
218
220
  return; // Already handled
219
221
  }
220
222
  repStreamTerminatingCanceller.cancel();
@@ -236,9 +238,8 @@ export default function AdaptationStream(_a, callbacks, parentCancelSignal) {
236
238
  * `TaskCanceller` triggered when the `RepresentationStream` calls its
237
239
  * `terminating` callback.
238
240
  */
239
- var terminatingRepStreamCanceller = new TaskCanceller({
240
- cancelOn: adapStreamCanceller.signal,
241
- });
241
+ var terminatingRepStreamCanceller = new TaskCanceller();
242
+ terminatingRepStreamCanceller.linkToSignal(adapStreamCanceller.signal);
242
243
  var bufferGoal = createMappedReference(wantedBufferAhead, function (prev) {
243
244
  return prev * getBufferGoalRatio(representation);
244
245
  }, terminatingRepStreamCanceller.signal);
@@ -253,16 +254,24 @@ export default function AdaptationStream(_a, callbacks, parentCancelSignal) {
253
254
  defaultCode: "NONE",
254
255
  defaultReason: "Unknown `RepresentationStream` error",
255
256
  });
256
- if (formattedError.code === "BUFFER_FULL_ERROR") {
257
+ if (formattedError.code !== "BUFFER_FULL_ERROR") {
258
+ representationStreamCallbacks.error(err);
259
+ }
260
+ else {
257
261
  var wba = wantedBufferAhead.getValue();
258
262
  var lastBufferGoalRatio = (_a = bufferGoalRatioMap.get(representation.id)) !== null && _a !== void 0 ? _a : 1;
259
- if (lastBufferGoalRatio <= 0.25 || wba * lastBufferGoalRatio <= 2) {
263
+ // 70%, 49%, 34.3%, 24%, 16.81%, 11.76%, 8.24% and 5.76%
264
+ var newBufferGoalRatio = lastBufferGoalRatio * 0.7;
265
+ if (newBufferGoalRatio <= 0.05 || wba * newBufferGoalRatio <= 2) {
260
266
  throw formattedError;
261
267
  }
262
- bufferGoalRatioMap.set(representation.id, lastBufferGoalRatio - 0.25);
263
- return createRepresentationStream(representation, terminateCurrentStream, fastSwitchThreshold, representationStreamCallbacks);
268
+ bufferGoalRatioMap.set(representation.id, newBufferGoalRatio);
269
+ // We wait 4 seconds to let the situation evolve by itself before
270
+ // retrying loading segments with a lower buffer goal
271
+ cancellableSleep(4000, adapStreamCanceller.signal).then(function () {
272
+ return createRepresentationStream(representation, terminateCurrentStream, fastSwitchThreshold, representationStreamCallbacks);
273
+ }).catch(noop);
264
274
  }
265
- representationStreamCallbacks.error(err);
266
275
  },
267
276
  terminating: function () {
268
277
  terminatingRepStreamCanceller.cancel();
@@ -146,9 +146,10 @@ export default function StreamOrchestrator(content, playbackObserver, representa
146
146
  };
147
147
  });
148
148
  // Create automatically the right `PeriodStream` for every possible types
149
- segmentBuffersStore.getBufferTypes().map(function (bufferType) {
149
+ for (var _i = 0, _b = segmentBuffersStore.getBufferTypes(); _i < _b.length; _i++) {
150
+ var bufferType = _b[_i];
150
151
  manageEveryStreams(bufferType, initialPeriod);
151
- });
152
+ }
152
153
  /**
153
154
  * Manage creation and removal of Streams for every Periods for a given type.
154
155
  *
@@ -170,7 +171,8 @@ export default function StreamOrchestrator(content, playbackObserver, representa
170
171
  */
171
172
  var enableOutOfBoundsCheck = false;
172
173
  /** Cancels currently created `PeriodStream`s. */
173
- var currentCanceller = new TaskCanceller({ cancelOn: orchestratorCancelSignal });
174
+ var currentCanceller = new TaskCanceller();
175
+ currentCanceller.linkToSignal(orchestratorCancelSignal);
174
176
  // Restart the current Stream when the wanted time is in another period
175
177
  // than the ones already considered
176
178
  playbackObserver.listen(function (_a) {
@@ -188,7 +190,8 @@ export default function StreamOrchestrator(content, playbackObserver, representa
188
190
  callbacks.periodStreamCleared({ type: bufferType, period: period });
189
191
  }
190
192
  currentCanceller.cancel();
191
- currentCanceller = new TaskCanceller({ cancelOn: orchestratorCancelSignal });
193
+ currentCanceller = new TaskCanceller();
194
+ currentCanceller.linkToSignal(orchestratorCancelSignal);
192
195
  var nextPeriod = (_c = manifest.getPeriodForTime(time)) !== null && _c !== void 0 ? _c : manifest.getNextPeriod(time);
193
196
  if (nextPeriod === undefined) {
194
197
  log.warn("Stream: The wanted position is not found in the Manifest.");
@@ -264,8 +267,15 @@ export default function StreamOrchestrator(content, playbackObserver, representa
264
267
  segmentBufferStatus = segmentBuffersStore.getStatus(bufferType);
265
268
  ofCurrentType = updates
266
269
  .filter(function (update) { return update.adaptation.type === bufferType; });
267
- if (ofCurrentType.length === 0 || segmentBufferStatus.type !== "initialized") {
268
- return [2 /*return*/]; // no need to stop the current Streams.
270
+ if (
271
+ // No update concerns the current type of data
272
+ ofCurrentType.length === 0 ||
273
+ segmentBufferStatus.type !== "initialized" ||
274
+ // The update only notifies of now-decipherable streams
275
+ ofCurrentType.every(function (x) { return x.representation.decipherable === true; })) {
276
+ // Data won't have to be removed from the buffers, no need to stop the
277
+ // current Streams.
278
+ return [2 /*return*/];
269
279
  }
270
280
  segmentBuffer = segmentBufferStatus.value;
271
281
  resettedContent = ofCurrentType.filter(function (update) {
@@ -286,7 +296,8 @@ export default function StreamOrchestrator(content, playbackObserver, representa
286
296
  callbacks.periodStreamCleared({ type: bufferType, period: period });
287
297
  }
288
298
  currentCanceller.cancel();
289
- currentCanceller = new TaskCanceller({ cancelOn: orchestratorCancelSignal });
299
+ currentCanceller = new TaskCanceller();
300
+ currentCanceller.linkToSignal(orchestratorCancelSignal);
290
301
  _i = 0, _a = __spreadArray(__spreadArray([], undecipherableRanges, true), rangesToRemove, true);
291
302
  _c.label = 1;
292
303
  case 1:
@@ -306,7 +317,7 @@ export default function StreamOrchestrator(content, playbackObserver, representa
306
317
  // was going to be emitted synchronously.
307
318
  nextTick(function () {
308
319
  var _a, _b;
309
- if (orchestratorCancelSignal.isCancelled) {
320
+ if (orchestratorCancelSignal.isCancelled()) {
310
321
  return;
311
322
  }
312
323
  var observation = playbackObserver.getReference().getValue();
@@ -315,13 +326,13 @@ export default function StreamOrchestrator(content, playbackObserver, representa
315
326
  callbacks.needsDecipherabilityFlush({ position: observation.position.last,
316
327
  autoPlay: shouldAutoPlay,
317
328
  duration: observation.duration });
318
- if (orchestratorCancelSignal.isCancelled) {
329
+ if (orchestratorCancelSignal.isCancelled()) {
319
330
  return;
320
331
  }
321
332
  }
322
333
  else if (needsFlushingAfterClean(observation, rangesToRemove)) {
323
334
  callbacks.needsBufferFlush();
324
- if (orchestratorCancelSignal.isCancelled) {
335
+ if (orchestratorCancelSignal.isCancelled()) {
325
336
  return;
326
337
  }
327
338
  }
@@ -378,7 +389,8 @@ export default function StreamOrchestrator(content, playbackObserver, representa
378
389
  */
379
390
  var nextStreamInfo = null;
380
391
  /** Emits when the `PeriodStream` linked to `basePeriod` should be destroyed. */
381
- var currentStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
392
+ var currentStreamCanceller = new TaskCanceller();
393
+ currentStreamCanceller.linkToSignal(cancelSignal);
382
394
  // Stop current PeriodStream when the current position goes over the end of
383
395
  // that Period.
384
396
  playbackObserver.listen(function (_a, stopListeningObservations) {
@@ -431,7 +443,9 @@ export default function StreamOrchestrator(content, playbackObserver, representa
431
443
  period: nextStreamInfo.period });
432
444
  nextStreamInfo.canceller.cancel();
433
445
  }
434
- nextStreamInfo = { canceller: new TaskCanceller({ cancelOn: cancelSignal }),
446
+ var nextStreamCanceller = new TaskCanceller();
447
+ nextStreamCanceller.linkToSignal(cancelSignal);
448
+ nextStreamInfo = { canceller: nextStreamCanceller,
435
449
  period: nextPeriod };
436
450
  manageConsecutivePeriodStreams(bufferType, nextPeriod, consecutivePeriodStreamCb, nextStreamInfo.canceller.signal);
437
451
  }
@@ -113,7 +113,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
113
113
  */
114
114
  var adaptationRef = createSharedReference(undefined, parentCancelSignal);
115
115
  callbacks.periodStreamReady({ type: bufferType, period: period, adaptationRef: adaptationRef });
116
- if (parentCancelSignal.isCancelled) {
116
+ if (parentCancelSignal.isCancelled()) {
117
117
  return;
118
118
  }
119
119
  var currentStreamCanceller;
@@ -129,7 +129,8 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
129
129
  if (adaptation === undefined) {
130
130
  return [2 /*return*/];
131
131
  }
132
- streamCanceller = new TaskCanceller({ cancelOn: parentCancelSignal });
132
+ streamCanceller = new TaskCanceller();
133
+ streamCanceller.linkToSignal(parentCancelSignal);
133
134
  currentStreamCanceller === null || currentStreamCanceller === void 0 ? void 0 : currentStreamCanceller.cancel(); // Cancel oreviously created stream if one
134
135
  currentStreamCanceller = streamCanceller;
135
136
  if (!(adaptation === null)) return [3 /*break*/, 7];
@@ -147,7 +148,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
147
148
  case 2: return [4 /*yield*/, segmentBufferStatus.value.removeBuffer(period.start, periodEnd, streamCanceller.signal)];
148
149
  case 3:
149
150
  _d.sent();
150
- if (streamCanceller.isUsed) {
151
+ if (streamCanceller.isUsed()) {
151
152
  return [2 /*return*/]; // The stream has been cancelled
152
153
  }
153
154
  _d.label = 4;
@@ -155,14 +156,14 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
155
156
  case 5:
156
157
  if (segmentBufferStatus.type === "uninitialized") {
157
158
  segmentBuffersStore.disableSegmentBuffer(bufferType);
158
- if (streamCanceller.isUsed) {
159
+ if (streamCanceller.isUsed()) {
159
160
  return [2 /*return*/]; // The stream has been cancelled
160
161
  }
161
162
  }
162
163
  _d.label = 6;
163
164
  case 6:
164
165
  callbacks.adaptationChange({ type: bufferType, adaptation: null, period: period });
165
- if (streamCanceller.isUsed) {
166
+ if (streamCanceller.isUsed()) {
166
167
  return [2 /*return*/]; // Previous call has provoken Stream cancellation by side-effect
167
168
  }
168
169
  return [2 /*return*/, createEmptyAdaptationStream(playbackObserver, wantedBufferAhead, bufferType, { period: period }, callbacks, streamCanceller.signal)];
@@ -179,7 +180,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
179
180
  }
180
181
  log.info("Stream: Updating ".concat(bufferType, " adaptation"), "A: ".concat(adaptation.id), "P: ".concat(period.start));
181
182
  callbacks.adaptationChange({ type: bufferType, adaptation: adaptation, period: period });
182
- if (streamCanceller.isUsed) {
183
+ if (streamCanceller.isUsed()) {
183
184
  return [2 /*return*/]; // Previous call has provoken cancellation by side-effect
184
185
  }
185
186
  readyState = playbackObserver.getReadyState();
@@ -192,7 +193,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
192
193
  return [4 /*yield*/, segmentBuffersStore.waitForUsableBuffers(streamCanceller.signal)];
193
194
  case 8:
194
195
  _d.sent();
195
- if (streamCanceller.isUsed) {
196
+ if (streamCanceller.isUsed()) {
196
197
  return [2 /*return*/]; // The Stream has since been cancelled
197
198
  }
198
199
  if (!(strategy.type === "flush-buffer" || strategy.type === "clean-buffer")) return [3 /*break*/, 13];
@@ -204,7 +205,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
204
205
  return [4 /*yield*/, segmentBuffer.removeBuffer(start, end, streamCanceller.signal)];
205
206
  case 10:
206
207
  _d.sent();
207
- if (streamCanceller.isUsed) {
208
+ if (streamCanceller.isUsed()) {
208
209
  return [2 /*return*/]; // The Stream has since been cancelled
209
210
  }
210
211
  _d.label = 11;
@@ -214,7 +215,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
214
215
  case 12:
215
216
  if (strategy.type === "flush-buffer") {
216
217
  callbacks.needsBufferFlush();
217
- if (streamCanceller.isUsed) {
218
+ if (streamCanceller.isUsed()) {
218
219
  return [2 /*return*/]; // Previous callback cancelled the Stream by side-effect
219
220
  }
220
221
  }
@@ -254,7 +255,7 @@ export default function PeriodStream(_a, callbacks, parentCancelSignal) {
254
255
  defaultReason: "Unknown `AdaptationStream` error",
255
256
  });
256
257
  callbacks.warning(formattedError);
257
- if (cancelSignal.isCancelled) {
258
+ if (cancelSignal.isCancelled()) {
258
259
  return; // Previous callback cancelled the Stream by side-effect
259
260
  }
260
261
  return createEmptyAdaptationStream(playbackObserver, wantedBufferAhead, bufferType, { period: period }, callbacks, cancelSignal);