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

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 (167) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/VERSION +1 -1
  3. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  4. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  5. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +4 -2
  6. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  7. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  8. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  9. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +105 -0
  10. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  11. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  12. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  13. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  14. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  15. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +199 -0
  16. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  17. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  18. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  19. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  20. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  21. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  22. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  23. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  24. package/dist/_esm5.processed/core/api/playback_observer.js +3 -2
  25. package/dist/_esm5.processed/core/api/public_api.d.ts +3 -0
  26. package/dist/_esm5.processed/core/api/public_api.js +24 -13
  27. package/dist/_esm5.processed/core/api/utils.js +3 -3
  28. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +5 -5
  29. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  30. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  31. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +37 -47
  32. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  33. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  34. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  35. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  36. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  37. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  38. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  39. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +6 -5
  40. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  41. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +27 -31
  42. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +2 -2
  43. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  44. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  45. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  46. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  47. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  48. package/dist/_esm5.processed/core/init/utils/media_duration_updater.js +23 -19
  49. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  50. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  51. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +7 -10
  52. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +4 -2
  53. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  54. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +10 -11
  55. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +26 -12
  56. package/dist/_esm5.processed/core/stream/period/period_stream.js +11 -10
  57. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -15
  58. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +1 -1
  59. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  60. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  61. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  62. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  63. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  64. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  65. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +5 -4
  66. package/dist/_esm5.processed/features/features_object.js +1 -0
  67. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  68. package/dist/_esm5.processed/features/types.d.ts +3 -0
  69. package/dist/_esm5.processed/manifest/adaptation.js +4 -0
  70. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  71. package/dist/_esm5.processed/manifest/representation.js +11 -4
  72. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  73. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  74. package/dist/_esm5.processed/public_types.d.ts +1 -0
  75. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +13 -12
  76. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  77. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  78. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  79. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  80. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  81. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  82. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  83. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  84. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  85. package/dist/_esm5.processed/utils/reference.js +6 -0
  86. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  87. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  88. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  89. package/dist/rx-player.js +739 -626
  90. package/dist/rx-player.min.js +1 -1
  91. package/jest.config.js +1 -0
  92. package/package.json +18 -18
  93. package/scripts/build/constants.d.ts +1 -0
  94. package/scripts/report_build_sizes +4 -0
  95. package/sonar-project.properties +1 -1
  96. package/src/compat/eme/close_session.ts +2 -2
  97. package/src/compat/event_listeners.ts +1 -1
  98. package/src/core/adaptive/adaptive_representation_selector.ts +4 -2
  99. package/src/core/api/debug/buffer_graph.ts +247 -0
  100. package/src/core/api/debug/buffer_size_graph.ts +131 -0
  101. package/src/core/api/debug/constants.ts +2 -0
  102. package/src/core/api/debug/index.ts +3 -0
  103. package/src/core/api/debug/modules/general_info.ts +204 -0
  104. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  105. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  106. package/src/core/api/debug/render.ts +40 -0
  107. package/src/core/api/debug/utils.ts +103 -0
  108. package/src/core/api/playback_observer.ts +4 -2
  109. package/src/core/api/public_api.ts +27 -13
  110. package/src/core/api/utils.ts +3 -3
  111. package/src/core/decrypt/attach_media_keys.ts +1 -1
  112. package/src/core/decrypt/content_decryptor.ts +1 -1
  113. package/src/core/decrypt/session_events_listener.ts +37 -49
  114. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  115. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  116. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  117. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  118. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  119. package/src/core/fetchers/utils/schedule_request.ts +6 -5
  120. package/src/core/init/directfile_content_initializer.ts +1 -1
  121. package/src/core/init/media_source_content_initializer.ts +37 -41
  122. package/src/core/init/utils/content_time_boundaries_observer.ts +2 -2
  123. package/src/core/init/utils/create_media_source.ts +4 -16
  124. package/src/core/init/utils/end_of_stream.ts +6 -3
  125. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  126. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  127. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  128. package/src/core/init/utils/media_duration_updater.ts +25 -20
  129. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  130. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  131. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +7 -11
  132. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +4 -2
  133. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  134. package/src/core/stream/adaptation/adaptation_stream.ts +10 -11
  135. package/src/core/stream/orchestrator/stream_orchestrator.ts +26 -12
  136. package/src/core/stream/period/period_stream.ts +11 -10
  137. package/src/core/stream/representation/representation_stream.ts +15 -15
  138. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
  139. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  140. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  141. package/src/experimental/features/debug_element.ts +13 -0
  142. package/src/experimental/features/index.ts +1 -0
  143. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  144. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +5 -4
  145. package/src/features/__tests__/initialize_features.test.ts +11 -0
  146. package/src/features/features_object.ts +1 -0
  147. package/src/features/initialize_features.ts +15 -10
  148. package/src/features/types.ts +9 -0
  149. package/src/manifest/adaptation.ts +7 -0
  150. package/src/manifest/manifest.ts +4 -0
  151. package/src/manifest/representation.ts +10 -4
  152. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  153. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  154. package/src/public_types.ts +1 -0
  155. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +30 -24
  156. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  157. package/src/transports/dash/manifest_parser.ts +1 -1
  158. package/src/transports/dash/segment_loader.ts +4 -4
  159. package/src/transports/local/segment_loader.ts +14 -30
  160. package/src/transports/smooth/segment_loader.ts +4 -4
  161. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  162. package/src/typings/globals.d.ts +2 -0
  163. package/src/utils/cancellable_sleep.ts +5 -14
  164. package/src/utils/create_cancellable_promise.ts +69 -0
  165. package/src/utils/reference.ts +6 -0
  166. package/src/utils/request/xhr.ts +1 -1
  167. package/src/utils/task_canceller.ts +63 -34
@@ -25,13 +25,13 @@ import {
25
25
  } from "../../public_types";
26
26
  import { ITransportPipelines } from "../../transports";
27
27
  import assert from "../../utils/assert";
28
+ import createCancellablePromise from "../../utils/create_cancellable_promise";
28
29
  import objectAssign from "../../utils/object_assign";
29
30
  import createSharedReference, {
30
31
  IReadOnlySharedReference,
31
32
  ISharedReference,
32
33
  } from "../../utils/reference";
33
34
  import TaskCanceller, {
34
- CancellationError,
35
35
  CancellationSignal,
36
36
  } from "../../utils/task_canceller";
37
37
  import AdaptiveRepresentationSelector, {
@@ -125,21 +125,22 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
125
125
  if (this._initialManifestProm !== null) {
126
126
  return;
127
127
  }
128
- this._initialManifestProm = new Promise((res, rej) => {
129
- this._initCanceller.signal.register((err : CancellationError) => {
130
- this._manifestFetcher.dispose();
131
- rej(err);
132
- });
133
- this._manifestFetcher.addEventListener("warning", (err : IPlayerError) =>
134
- this.trigger("warning", err));
135
- this._manifestFetcher.addEventListener("error", (err : unknown) => {
136
- this.trigger("error", err);
137
- rej(err);
138
- });
139
- this._manifestFetcher.addEventListener("manifestReady", (manifest) => {
140
- res(manifest);
128
+ this._initialManifestProm = createCancellablePromise(
129
+ this._initCanceller.signal,
130
+ (res, rej) => {
131
+ this._manifestFetcher.addEventListener("warning", (err : IPlayerError) =>
132
+ this.trigger("warning", err));
133
+ this._manifestFetcher.addEventListener("error", (err : unknown) => {
134
+ this.trigger("error", err);
135
+ rej(err);
136
+ });
137
+ this._manifestFetcher.addEventListener("manifestReady", (manifest) => {
138
+ res(manifest);
139
+ });
141
140
  });
142
- this._manifestFetcher.start();
141
+ this._manifestFetcher.start();
142
+ this._initCanceller.signal.register(() => {
143
+ this._manifestFetcher.dispose();
143
144
  });
144
145
  }
145
146
 
@@ -192,7 +193,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
192
193
  }
193
194
 
194
195
  private _onFatalError(err : unknown) {
195
- if (this._initCanceller.isUsed) {
196
+ if (this._initCanceller.isUsed()) {
196
197
  return;
197
198
  }
198
199
  this._initCanceller.cancel();
@@ -206,13 +207,9 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
206
207
  drmSystemId : string | undefined;
207
208
  unlinkMediaSource : TaskCanceller; }>
208
209
  {
209
- return new Promise((resolve, reject) => {
210
+ const initCanceller = this._initCanceller;
211
+ return createCancellablePromise(initCanceller.signal, (resolve) => {
210
212
  const { keySystems } = this._settings;
211
- const initCanceller = this._initCanceller;
212
-
213
- const unregisterReject = initCanceller.signal.register((err) => {
214
- reject(err);
215
- });
216
213
 
217
214
  /** Initialize decryption capabilities. */
218
215
  const drmInitRef =
@@ -227,9 +224,8 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
227
224
  }
228
225
  stopListeningToDrmUpdates();
229
226
 
230
- const mediaSourceCanceller = new TaskCanceller({
231
- cancelOn: initCanceller.signal,
232
- });
227
+ const mediaSourceCanceller = new TaskCanceller();
228
+ mediaSourceCanceller.linkToSignal(initCanceller.signal);
233
229
  openMediaSource(mediaElement, mediaSourceCanceller.signal)
234
230
  .then((mediaSource) => {
235
231
  const lastDrmStatus = drmInitRef.getValue();
@@ -238,7 +234,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
238
234
  drmInitRef.onUpdate((newDrmStatus, stopListeningToDrmUpdatesAgain) => {
239
235
  if (newDrmStatus.initializationState.type === "initialized") {
240
236
  stopListeningToDrmUpdatesAgain();
241
- unregisterReject();
242
237
  resolve({ mediaSource,
243
238
  drmSystemId: newDrmStatus.drmSystemId,
244
239
  unlinkMediaSource: mediaSourceCanceller });
@@ -246,7 +241,6 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
246
241
  }
247
242
  }, { emitCurrentValue: true, clearSignal: initCanceller.signal });
248
243
  } else if (drmStatus.initializationState.type === "initialized") {
249
- unregisterReject();
250
244
  resolve({ mediaSource,
251
245
  drmSystemId: drmStatus.drmSystemId,
252
246
  unlinkMediaSource: mediaSourceCanceller });
@@ -254,7 +248,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
254
248
  }
255
249
  })
256
250
  .catch((err) => {
257
- if (mediaSourceCanceller.isUsed) {
251
+ if (mediaSourceCanceller.isUsed()) {
258
252
  return;
259
253
  }
260
254
  this._onFatalError(err);
@@ -311,7 +305,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
311
305
  initCanceller.signal);
312
306
 
313
307
  this.trigger("manifestReady", manifest);
314
- if (initCanceller.isUsed) {
308
+ if (initCanceller.isUsed()) {
315
309
  return ;
316
310
  }
317
311
 
@@ -359,15 +353,16 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
359
353
  autoPlay : boolean; }
360
354
  ) : void {
361
355
  currentCanceller.cancel();
362
- if (initCanceller.isUsed) {
356
+ if (initCanceller.isUsed()) {
363
357
  return;
364
358
  }
365
359
  triggerEvent("reloadingMediaSource", null);
366
- if (initCanceller.isUsed) {
360
+ if (initCanceller.isUsed()) {
367
361
  return;
368
362
  }
369
363
 
370
- const newCanceller = new TaskCanceller({ cancelOn: initCanceller.signal });
364
+ const newCanceller = new TaskCanceller();
365
+ newCanceller.linkToSignal(initCanceller.signal);
371
366
  openMediaSource(mediaElement, newCanceller.signal)
372
367
  .then(newMediaSource => {
373
368
  recursivelyLoadOnMediaSource(newMediaSource,
@@ -376,7 +371,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
376
371
  newCanceller);
377
372
  })
378
373
  .catch((err) => {
379
- if (newCanceller.isUsed) {
374
+ if (newCanceller.isUsed()) {
380
375
  return;
381
376
  }
382
377
  onFatalError(err);
@@ -431,7 +426,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
431
426
  (err) => this.trigger("warning", err),
432
427
  cancelSignal);
433
428
 
434
- if (cancelSignal.isCancelled) {
429
+ if (cancelSignal.isCancelled()) {
435
430
  return;
436
431
  }
437
432
 
@@ -483,7 +478,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
483
478
  }, { emitCurrentValue: true, clearSignal: cancelSignal });
484
479
  })
485
480
  .catch((err) => {
486
- if (cancelSignal.isCancelled) {
481
+ if (cancelSignal.isCancelled()) {
487
482
  return; // Current loading cancelled, no need to trigger the error
488
483
  }
489
484
  this._onFatalError(err);
@@ -519,7 +514,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
519
514
  discontinuity: imminentDiscontinuity,
520
515
  position,
521
516
  });
522
- if (cancelSignal.isCancelled) {
517
+ if (cancelSignal.isCancelled()) {
523
518
  return; // Previous call has stopped streams due to a side-effect
524
519
  }
525
520
 
@@ -560,7 +555,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
560
555
 
561
556
  adaptationChange: (value) => {
562
557
  self.trigger("adaptationChange", value);
563
- if (cancelSignal.isCancelled) {
558
+ if (cancelSignal.isCancelled()) {
564
559
  return; // Previous call has stopped streams due to a side-effect
565
560
  }
566
561
  contentTimeBoundariesObserver.onAdaptationChange(value.type,
@@ -570,7 +565,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
570
565
 
571
566
  representationChange: (value) => {
572
567
  self.trigger("representationChange", value);
573
- if (cancelSignal.isCancelled) {
568
+ if (cancelSignal.isCancelled()) {
574
569
  return; // Previous call has stopped streams due to a side-effect
575
570
  }
576
571
  contentTimeBoundariesObserver.onRepresentationChange(value.type, value.period);
@@ -584,7 +579,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
584
579
 
585
580
  periodStreamCleared: (value) => {
586
581
  contentTimeBoundariesObserver.onPeriodCleared(value.type, value.period);
587
- if (cancelSignal.isCancelled) {
582
+ if (cancelSignal.isCancelled()) {
588
583
  return; // Previous call has stopped streams due to a side-effect
589
584
  }
590
585
  self.trigger("periodStreamCleared", value);
@@ -615,7 +610,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
615
610
  encryptionDataEncountered: (value) => {
616
611
  for (const protectionData of value) {
617
612
  protectionRef.setValue(protectionData);
618
- if (cancelSignal.isCancelled) {
613
+ if (cancelSignal.isCancelled()) {
619
614
  return; // Previous call has stopped streams due to a side-effect
620
615
  }
621
616
  }
@@ -674,7 +669,8 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
674
669
  });
675
670
  contentTimeBoundariesObserver.addEventListener("endOfStream", () => {
676
671
  if (endOfStreamCanceller === null) {
677
- endOfStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
672
+ endOfStreamCanceller = new TaskCanceller();
673
+ endOfStreamCanceller.linkToSignal(cancelSignal);
678
674
  log.debug("Init: end-of-stream order received.");
679
675
  maintainEndOfStream(mediaSource, endOfStreamCanceller.signal);
680
676
  }
@@ -112,7 +112,7 @@ export default class ContentTimeBoundariesObserver
112
112
 
113
113
  manifest.addEventListener("manifestUpdate", () => {
114
114
  this.trigger("durationUpdate", getManifestDuration());
115
- if (cancelSignal.isCancelled) {
115
+ if (cancelSignal.isCancelled()) {
116
116
  return;
117
117
  }
118
118
  this._checkEndOfStream();
@@ -161,7 +161,7 @@ export default class ContentTimeBoundariesObserver
161
161
  }
162
162
  }
163
163
  }
164
- if (this._canceller.isUsed) {
164
+ if (this._canceller.isUsed()) {
165
165
  return;
166
166
  }
167
167
  if (adaptation === null) {
@@ -21,10 +21,9 @@ import {
21
21
  } from "../../../compat";
22
22
  import { MediaError } from "../../../errors";
23
23
  import log from "../../../log";
24
+ import createCancellablePromise from "../../../utils/create_cancellable_promise";
24
25
  import isNonEmptyString from "../../../utils/is_non_empty_string";
25
- import TaskCanceller, {
26
- CancellationSignal,
27
- } from "../../../utils/task_canceller";
26
+ import { CancellationSignal } from "../../../utils/task_canceller";
28
27
 
29
28
  /**
30
29
  * Dispose of ressources taken by the MediaSource:
@@ -128,21 +127,10 @@ export default function openMediaSource(
128
127
  mediaElement : HTMLMediaElement,
129
128
  unlinkSignal : CancellationSignal
130
129
  ) : Promise<MediaSource> {
131
- return new Promise((resolve, reject) => {
132
- let hasResolved = false;
130
+ return createCancellablePromise(unlinkSignal, (resolve) => {
133
131
  const mediaSource = createMediaSource(mediaElement, unlinkSignal);
134
- const eventListenerCanceller = new TaskCanceller({ cancelOn: unlinkSignal });
135
-
136
132
  events.onSourceOpen(mediaSource, () => {
137
- eventListenerCanceller.cancel();
138
- hasResolved = true;
139
133
  resolve(mediaSource);
140
- }, eventListenerCanceller.signal);
141
-
142
- unlinkSignal.register((error) => {
143
- if (!hasResolved) {
144
- reject(error);
145
- }
146
- });
134
+ }, unlinkSignal);
147
135
  });
148
136
  }
@@ -70,7 +70,8 @@ export default function triggerEndOfStream(
70
70
 
71
71
  log.debug("Init: Waiting SourceBuffers to be updated before calling endOfStream.");
72
72
 
73
- const innerCanceller = new TaskCanceller({ cancelOn: cancelSignal });
73
+ const innerCanceller = new TaskCanceller();
74
+ innerCanceller.linkToSignal(cancelSignal);
74
75
  for (const sourceBuffer of updatingSourceBuffers) {
75
76
  onSourceBufferUpdate(sourceBuffer, () => {
76
77
  innerCanceller.cancel();
@@ -94,10 +95,12 @@ export function maintainEndOfStream(
94
95
  mediaSource : MediaSource,
95
96
  cancelSignal : CancellationSignal
96
97
  ) : void {
97
- let endOfStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
98
+ let endOfStreamCanceller = new TaskCanceller();
99
+ endOfStreamCanceller.linkToSignal(cancelSignal);
98
100
  onSourceOpen(mediaSource, () => {
99
101
  endOfStreamCanceller.cancel();
100
- endOfStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
102
+ endOfStreamCanceller = new TaskCanceller();
103
+ endOfStreamCanceller.linkToSignal(cancelSignal);
101
104
  triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
102
105
  }, cancelSignal);
103
106
  triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
@@ -43,7 +43,8 @@ export default function getLoadedReference(
43
43
  isDirectfile : boolean,
44
44
  cancelSignal : CancellationSignal
45
45
  ) : IReadOnlySharedReference<boolean> {
46
- const listenCanceller = new TaskCanceller({ cancelOn: cancelSignal });
46
+ const listenCanceller = new TaskCanceller();
47
+ listenCanceller.linkToSignal(cancelSignal);
47
48
  const isLoaded = createSharedReference(false, listenCanceller.signal);
48
49
  playbackObserver.listen((observation) => {
49
50
  if (observation.rebuffering !== null ||
@@ -90,7 +90,7 @@ export default function performInitialSeekAndPlay(
90
90
  onLoadedMetadata();
91
91
  }
92
92
 
93
- cancelSignal.register((err : CancellationError) => {
93
+ const deregisterCancellation = cancelSignal.register((err : CancellationError) => {
94
94
  mediaElement.removeEventListener("loadedmetadata", onLoadedMetadata);
95
95
  rejectAutoPlay(err);
96
96
  });
@@ -112,7 +112,7 @@ export default function performInitialSeekAndPlay(
112
112
  "falsely announced having loaded the content.");
113
113
  onWarning(error);
114
114
  }
115
- if (cancelSignal.isCancelled) {
115
+ if (cancelSignal.isCancelled()) {
116
116
  return ;
117
117
  }
118
118
 
@@ -136,6 +136,7 @@ export default function performInitialSeekAndPlay(
136
136
  }
137
137
  initialPlayPerformed.setValue(true);
138
138
  initialPlayPerformed.finish();
139
+ deregisterCancellation();
139
140
  return resolveAutoPlay({ type: "skipped" as const });
140
141
  }
141
142
 
@@ -143,19 +144,22 @@ export default function performInitialSeekAndPlay(
143
144
  try {
144
145
  playResult = mediaElement.play() ?? Promise.resolve();
145
146
  } catch (playError) {
147
+ deregisterCancellation();
146
148
  return rejectAutoPlay(playError);
147
149
  }
148
150
  playResult
149
151
  .then(() => {
150
- if (cancelSignal.isCancelled) {
152
+ if (cancelSignal.isCancelled()) {
151
153
  return;
152
154
  }
153
155
  initialPlayPerformed.setValue(true);
154
156
  initialPlayPerformed.finish();
157
+ deregisterCancellation();
155
158
  return resolveAutoPlay({ type: "autoplay" as const });
156
159
  })
157
160
  .catch((playError : unknown) => {
158
- if (cancelSignal.isCancelled) {
161
+ deregisterCancellation();
162
+ if (cancelSignal.isCancelled()) {
159
163
  return;
160
164
  }
161
165
  if (playError instanceof Error && playError.name === "NotAllowedError") {
@@ -167,7 +171,7 @@ export default function performInitialSeekAndPlay(
167
171
  "Cannot trigger auto-play automatically: " +
168
172
  "your browser does not allow it.");
169
173
  onWarning(error);
170
- if (cancelSignal.isCancelled) {
174
+ if (cancelSignal.isCancelled()) {
171
175
  return;
172
176
  }
173
177
  return resolveAutoPlay({ type: "autoplay-blocked" as const });
@@ -82,7 +82,8 @@ export default function initializeContentDecryption(
82
82
  return ref;
83
83
  }
84
84
 
85
- const decryptorCanceller = new TaskCanceller({ cancelOn: cancelSignal });
85
+ const decryptorCanceller = new TaskCanceller();
86
+ decryptorCanceller.linkToSignal(cancelSignal);
86
87
  const drmStatusRef = createSharedReference<IDrmInitializationStatus>({
87
88
  initializationState: { type: "uninitialized", value: null },
88
89
  drmSystemId: undefined,
@@ -67,7 +67,8 @@ export default class MediaDurationUpdater {
67
67
  this._canceller.signal);
68
68
 
69
69
  /** TaskCanceller triggered each time the MediaSource open status changes. */
70
- let msUpdateCanceller = new TaskCanceller({ cancelOn: this._canceller.signal });
70
+ let msUpdateCanceller = new TaskCanceller();
71
+ msUpdateCanceller.linkToSignal(this._canceller.signal);
71
72
 
72
73
  isMediaSourceOpened.onUpdate(onMediaSourceOpenedStatusChanged,
73
74
  { emitCurrentValue: true,
@@ -79,18 +80,17 @@ export default class MediaDurationUpdater {
79
80
  if (!isMediaSourceOpened.getValue()) {
80
81
  return;
81
82
  }
82
- msUpdateCanceller = new TaskCanceller({ cancelOn: canceller.signal });
83
+ msUpdateCanceller = new TaskCanceller();
84
+ msUpdateCanceller.linkToSignal(canceller.signal);
83
85
 
84
- /** TaskCanceller triggered each time the content's duration may have change */
85
- let durationChangeCanceller = new TaskCanceller({
86
- cancelOn: msUpdateCanceller.signal,
87
- });
86
+ /** TaskCanceller triggered each time the content's duration may have changed */
87
+ let durationChangeCanceller = new TaskCanceller();
88
+ durationChangeCanceller.linkToSignal(msUpdateCanceller.signal);
88
89
 
89
90
  const reSetDuration = () => {
90
91
  durationChangeCanceller.cancel();
91
- durationChangeCanceller = new TaskCanceller({
92
- cancelOn: msUpdateCanceller.signal,
93
- });
92
+ durationChangeCanceller = new TaskCanceller();
93
+ durationChangeCanceller.linkToSignal(msUpdateCanceller.signal);
94
94
  onDurationMayHaveChanged(durationChangeCanceller.signal);
95
95
  };
96
96
 
@@ -112,10 +112,12 @@ export default class MediaDurationUpdater {
112
112
  );
113
113
 
114
114
  /** TaskCanceller triggered each time SourceBuffers' updating status changes */
115
- let sourceBuffersUpdatingCanceller = new TaskCanceller({ cancelOn: cancelSignal });
115
+ let sourceBuffersUpdatingCanceller = new TaskCanceller();
116
+ sourceBuffersUpdatingCanceller.linkToSignal(cancelSignal);
116
117
  return areSourceBuffersUpdating.onUpdate((areUpdating) => {
117
118
  sourceBuffersUpdatingCanceller.cancel();
118
- sourceBuffersUpdatingCanceller = new TaskCanceller({ cancelOn: cancelSignal });
119
+ sourceBuffersUpdatingCanceller = new TaskCanceller();
120
+ sourceBuffersUpdatingCanceller.linkToSignal(cancelSignal);
119
121
  if (areUpdating) {
120
122
  return;
121
123
  }
@@ -173,20 +175,23 @@ function setMediaSourceDuration(
173
175
 
174
176
  if (newDuration === undefined) {
175
177
  if (manifest.isDynamic) {
176
- const maxPotentialPos = manifest.getLivePosition() ??
177
- manifest.getMaximumSafePosition();
178
- // Some targets poorly support setting a very high number for durations.
179
- // Yet, in dynamic contents, we would prefer setting a value as high as possible
180
- // to still be able to seek anywhere we want to (even ahead of the Manifest if
181
- // we want to). As such, we put it at a safe default value of 2^32 excepted
182
- // when the maximum position is already relatively close to that value, where
183
- // we authorize exceptionally going over it.
184
- newDuration = Math.max(Math.pow(2, 32), maxPotentialPos + YEAR_IN_SECONDS);
178
+ newDuration = manifest.getLivePosition() ??
179
+ manifest.getMaximumSafePosition();
185
180
  } else {
186
181
  newDuration = manifest.getMaximumSafePosition();
187
182
  }
188
183
  }
189
184
 
185
+ if (manifest.isDynamic) {
186
+ // Some targets poorly support setting a very high number for durations.
187
+ // Yet, in dynamic contents, we would prefer setting a value as high as possible
188
+ // to still be able to seek anywhere we want to (even ahead of the Manifest if
189
+ // we want to). As such, we put it at a safe default value of 2^32 excepted
190
+ // when the maximum position is already relatively close to that value, where
191
+ // we authorize exceptionally going over it.
192
+ newDuration = Math.max(Math.pow(2, 32), newDuration + YEAR_IN_SECONDS);
193
+ }
194
+
190
195
  let maxBufferedEnd : number = 0;
191
196
  for (let i = 0; i < mediaSource.sourceBuffers.length; i++) {
192
197
  const sourceBuffer = mediaSource.sourceBuffers[i];
@@ -56,13 +56,15 @@ export default function streamEventsEmitter(
56
56
  }, cancelSignal);
57
57
 
58
58
  let isPollingEvents = false;
59
- let cancelCurrentPolling = new TaskCanceller({ cancelOn: cancelSignal });
59
+ let cancelCurrentPolling = new TaskCanceller();
60
+ cancelCurrentPolling.linkToSignal(cancelSignal);
60
61
 
61
62
  scheduledEventsRef.onUpdate(({ length: scheduledEventsLength }) => {
62
63
  if (scheduledEventsLength === 0) {
63
64
  if (isPollingEvents) {
64
65
  cancelCurrentPolling.cancel();
65
- cancelCurrentPolling = new TaskCanceller({ cancelOn: cancelSignal });
66
+ cancelCurrentPolling = new TaskCanceller();
67
+ cancelCurrentPolling.linkToSignal(cancelSignal);
66
68
  isPollingEvents = false;
67
69
  }
68
70
  return;
@@ -161,7 +163,7 @@ export default function streamEventsEmitter(
161
163
  } else {
162
164
  onEventSkip(event.value);
163
165
  }
164
- if (stopSignal.isCancelled) {
166
+ if (stopSignal.isCancelled()) {
165
167
  return;
166
168
  }
167
169
  }
@@ -172,7 +174,7 @@ export default function streamEventsEmitter(
172
174
  if (typeof event.onExit === "function") {
173
175
  event.onExit();
174
176
  }
175
- if (stopSignal.isCancelled) {
177
+ if (stopSignal.isCancelled()) {
176
178
  return;
177
179
  }
178
180
  }
@@ -28,7 +28,7 @@ export default function listenToMediaError(
28
28
  onError : (error : MediaError) => void,
29
29
  cancelSignal : CancellationSignal
30
30
  ) : void {
31
- if (cancelSignal.isCancelled) {
31
+ if (cancelSignal.isCancelled()) {
32
32
  return;
33
33
  }
34
34
 
@@ -24,6 +24,7 @@ import { getLoggableSegmentId } from "../../../../manifest";
24
24
  import areArraysOfNumbersEqual from "../../../../utils/are_arrays_of_numbers_equal";
25
25
  import assertUnreachable from "../../../../utils/assert_unreachable";
26
26
  import { toUint8Array } from "../../../../utils/byte_parsing";
27
+ import createCancellablePromise from "../../../../utils/create_cancellable_promise";
27
28
  import hashBuffer from "../../../../utils/hash_buffer";
28
29
  import noop from "../../../../utils/noop";
29
30
  import objectAssign from "../../../../utils/object_assign";
@@ -369,15 +370,15 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
369
370
  operation : ISBOperation<BufferSource>,
370
371
  cancellationSignal : CancellationSignal
371
372
  ) : Promise<void> {
372
- return new Promise((resolve, reject) => {
373
- if (cancellationSignal.cancellationError !== null) {
374
- return reject(cancellationSignal.cancellationError);
375
- }
373
+ return createCancellablePromise(cancellationSignal, (resolve, reject) => {
376
374
  const shouldRestartQueue = this._queue.length === 0 &&
377
375
  this._pendingTask === null;
378
376
  const queueItem = objectAssign({ resolve, reject }, operation);
379
377
  this._queue.push(queueItem);
380
- cancellationSignal.register((error : CancellationError) => {
378
+ if (shouldRestartQueue) {
379
+ this._flush();
380
+ }
381
+ return () => {
381
382
  // Remove the corresponding element from the AudioVideoSegmentBuffer's
382
383
  // queue.
383
384
  // If the operation was a pending task, it should still continue to not
@@ -388,12 +389,7 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
388
389
  }
389
390
  queueItem.resolve = noop;
390
391
  queueItem.reject = noop;
391
- reject(error);
392
- });
393
-
394
- if (shouldRestartQueue) {
395
- this._flush();
396
- }
392
+ };
397
393
  });
398
394
  }
399
395
 
@@ -353,7 +353,8 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
353
353
  element : HTMLElement; } => cue.resolution !== null);
354
354
 
355
355
  if (proportionalCues.length > 0) {
356
- this._sizeUpdateCanceller = new TaskCanceller({ cancelOn: this._canceller.signal });
356
+ this._sizeUpdateCanceller = new TaskCanceller();
357
+ this._sizeUpdateCanceller.linkToSignal(this._canceller.signal);
357
358
  const { TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config.getCurrent();
358
359
  // update propertionally-sized elements periodically
359
360
  const heightWidthRef = onHeightWidthChange(this._textTrackElement,
@@ -382,7 +383,8 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
382
383
 
383
384
  const startAutoRefresh = () => {
384
385
  stopAutoRefresh();
385
- autoRefreshCanceller = new TaskCanceller({ cancelOn: cancellationSignal });
386
+ autoRefreshCanceller = new TaskCanceller();
387
+ autoRefreshCanceller.linkToSignal(cancellationSignal);
386
388
  const intervalId = setInterval(() => this.refreshSubtitles(),
387
389
  MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL);
388
390
  autoRefreshCanceller.signal.register(() => {
@@ -17,10 +17,8 @@
17
17
  import { MediaError } from "../../errors";
18
18
  import features from "../../features";
19
19
  import log from "../../log";
20
- import {
21
- CancellationError,
22
- CancellationSignal,
23
- } from "../../utils/task_canceller";
20
+ import createCancellablePromise from "../../utils/create_cancellable_promise";
21
+ import { CancellationSignal } from "../../utils/task_canceller";
24
22
  import {
25
23
  AudioVideoSegmentBuffer,
26
24
  IBufferType,
@@ -194,21 +192,26 @@ export default class SegmentBuffersStore {
194
192
  if (this._areNativeBuffersUsable()) {
195
193
  return Promise.resolve();
196
194
  }
197
- return new Promise((res, rej) => {
198
- const onAddedOrDisabled = () => {
195
+ return createCancellablePromise(cancelWaitSignal, (res) => {
196
+ /* eslint-disable-next-line prefer-const */
197
+ let onAddedOrDisabled : () => void;
198
+
199
+ const removeCallback = () => {
200
+ const indexOf = this._onNativeBufferAddedOrDisabled.indexOf(onAddedOrDisabled);
201
+ if (indexOf >= 0) {
202
+ this._onNativeBufferAddedOrDisabled.splice(indexOf, 1);
203
+ }
204
+ };
205
+
206
+ onAddedOrDisabled = () => {
199
207
  if (this._areNativeBuffersUsable()) {
208
+ removeCallback();
200
209
  res();
201
210
  }
202
211
  };
203
212
  this._onNativeBufferAddedOrDisabled.push(onAddedOrDisabled);
204
213
 
205
- cancelWaitSignal.register((error : CancellationError) => {
206
- const indexOf = this._onNativeBufferAddedOrDisabled.indexOf(onAddedOrDisabled);
207
- if (indexOf >= 0) {
208
- this._onNativeBufferAddedOrDisabled.splice(indexOf, 1);
209
- }
210
- rej(error);
211
- });
214
+ return removeCallback;
212
215
  });
213
216
  }
214
217