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.
- package/CHANGELOG.md +2 -1
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
- package/dist/_esm5.processed/compat/event_listeners.js +1 -1
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +4 -2
- package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +105 -0
- package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
- package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/index.js +2 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +199 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
- package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/render.js +32 -0
- package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
- package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +3 -2
- package/dist/_esm5.processed/core/api/public_api.d.ts +3 -0
- package/dist/_esm5.processed/core/api/public_api.js +24 -13
- package/dist/_esm5.processed/core/api/utils.js +3 -3
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +5 -5
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +37 -47
- package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
- package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +6 -5
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +27 -31
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +2 -2
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
- package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
- package/dist/_esm5.processed/core/init/utils/media_duration_updater.js +23 -19
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
- package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +7 -10
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +4 -2
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +10 -11
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +26 -12
- package/dist/_esm5.processed/core/stream/period/period_stream.js +11 -10
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +15 -15
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
- package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
- package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
- package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
- package/dist/_esm5.processed/experimental/features/index.js +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +5 -4
- package/dist/_esm5.processed/features/features_object.js +1 -0
- package/dist/_esm5.processed/features/initialize_features.js +13 -10
- package/dist/_esm5.processed/features/types.d.ts +3 -0
- package/dist/_esm5.processed/manifest/adaptation.js +4 -0
- package/dist/_esm5.processed/manifest/manifest.js +2 -0
- package/dist/_esm5.processed/manifest/representation.js +11 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
- package/dist/_esm5.processed/public_types.d.ts +1 -0
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +13 -12
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
- package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
- package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
- package/dist/_esm5.processed/utils/reference.js +6 -0
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
- package/dist/_esm5.processed/utils/task_canceller.js +55 -22
- package/dist/rx-player.js +739 -626
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +1 -0
- package/package.json +18 -18
- package/scripts/build/constants.d.ts +1 -0
- package/scripts/report_build_sizes +4 -0
- package/sonar-project.properties +1 -1
- package/src/compat/eme/close_session.ts +2 -2
- package/src/compat/event_listeners.ts +1 -1
- package/src/core/adaptive/adaptive_representation_selector.ts +4 -2
- package/src/core/api/debug/buffer_graph.ts +247 -0
- package/src/core/api/debug/buffer_size_graph.ts +131 -0
- package/src/core/api/debug/constants.ts +2 -0
- package/src/core/api/debug/index.ts +3 -0
- package/src/core/api/debug/modules/general_info.ts +204 -0
- package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
- package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
- package/src/core/api/debug/render.ts +40 -0
- package/src/core/api/debug/utils.ts +103 -0
- package/src/core/api/playback_observer.ts +4 -2
- package/src/core/api/public_api.ts +27 -13
- package/src/core/api/utils.ts +3 -3
- package/src/core/decrypt/attach_media_keys.ts +1 -1
- package/src/core/decrypt/content_decryptor.ts +1 -1
- package/src/core/decrypt/session_events_listener.ts +37 -49
- package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
- package/src/core/fetchers/cdn_prioritizer.ts +18 -9
- package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
- package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
- package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
- package/src/core/fetchers/utils/schedule_request.ts +6 -5
- package/src/core/init/directfile_content_initializer.ts +1 -1
- package/src/core/init/media_source_content_initializer.ts +37 -41
- package/src/core/init/utils/content_time_boundaries_observer.ts +2 -2
- package/src/core/init/utils/create_media_source.ts +4 -16
- package/src/core/init/utils/end_of_stream.ts +6 -3
- package/src/core/init/utils/get_loaded_reference.ts +2 -1
- package/src/core/init/utils/initial_seek_and_play.ts +9 -5
- package/src/core/init/utils/initialize_content_decryption.ts +2 -1
- package/src/core/init/utils/media_duration_updater.ts +25 -20
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
- package/src/core/init/utils/throw_on_media_error.ts +1 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +7 -11
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +4 -2
- package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +10 -11
- package/src/core/stream/orchestrator/stream_orchestrator.ts +26 -12
- package/src/core/stream/period/period_stream.ts +11 -10
- package/src/core/stream/representation/representation_stream.ts +15 -15
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
- package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
- package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
- package/src/experimental/features/debug_element.ts +13 -0
- package/src/experimental/features/index.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +5 -4
- package/src/features/__tests__/initialize_features.test.ts +11 -0
- package/src/features/features_object.ts +1 -0
- package/src/features/initialize_features.ts +15 -10
- package/src/features/types.ts +9 -0
- package/src/manifest/adaptation.ts +7 -0
- package/src/manifest/manifest.ts +4 -0
- package/src/manifest/representation.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
- package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
- package/src/public_types.ts +1 -0
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +30 -24
- package/src/transports/dash/low_latency_segment_loader.ts +2 -2
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +4 -4
- package/src/transports/local/segment_loader.ts +14 -30
- package/src/transports/smooth/segment_loader.ts +4 -4
- package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
- package/src/typings/globals.d.ts +2 -0
- package/src/utils/cancellable_sleep.ts +5 -14
- package/src/utils/create_cancellable_promise.ts +69 -0
- package/src/utils/reference.ts +6 -0
- package/src/utils/request/xhr.ts +1 -1
- 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 =
|
|
129
|
-
this._initCanceller.signal
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
},
|
|
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(
|
|
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(
|
|
98
|
+
let endOfStreamCanceller = new TaskCanceller();
|
|
99
|
+
endOfStreamCanceller.linkToSignal(cancelSignal);
|
|
98
100
|
onSourceOpen(mediaSource, () => {
|
|
99
101
|
endOfStreamCanceller.cancel();
|
|
100
|
-
endOfStreamCanceller = new TaskCanceller(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
83
|
+
msUpdateCanceller = new TaskCanceller();
|
|
84
|
+
msUpdateCanceller.linkToSignal(canceller.signal);
|
|
83
85
|
|
|
84
|
-
/** TaskCanceller triggered each time the content's duration may have
|
|
85
|
-
let durationChangeCanceller = new TaskCanceller(
|
|
86
|
-
|
|
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
|
-
|
|
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(
|
|
115
|
+
let sourceBuffersUpdatingCanceller = new TaskCanceller();
|
|
116
|
+
sourceBuffersUpdatingCanceller.linkToSignal(cancelSignal);
|
|
116
117
|
return areSourceBuffersUpdating.onUpdate((areUpdating) => {
|
|
117
118
|
sourceBuffersUpdatingCanceller.cancel();
|
|
118
|
-
sourceBuffersUpdatingCanceller = new TaskCanceller(
|
|
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
|
-
|
|
177
|
-
|
|
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(
|
|
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(
|
|
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
|
}
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
|
198
|
-
|
|
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
|
-
|
|
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
|
|