rx-player 4.3.0-dev.2024112900 → 4.3.0-dev.2025012900
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 +30 -8
- package/VERSION +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
- package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
- package/dist/commonjs/compat/browser_compatibility_types.d.ts +7 -2
- package/dist/commonjs/compat/browser_compatibility_types.d.ts.map +1 -1
- package/dist/commonjs/compat/browser_compatibility_types.js +0 -1
- package/dist/commonjs/compat/browser_detection.js +1 -1
- package/dist/commonjs/compat/event_listeners.d.ts.map +1 -1
- package/dist/commonjs/compat/event_listeners.js +2 -4
- package/dist/commonjs/compat/has_mse_in_worker.d.ts.map +1 -1
- package/dist/commonjs/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
- package/dist/commonjs/core/cmcd/cmcd_data_builder.js +1 -2
- package/dist/commonjs/core/main/worker/send_message.d.ts.map +1 -1
- package/dist/commonjs/core/main/worker/send_message.js +0 -1
- package/dist/commonjs/core/main/worker/worker_main.js +1 -1
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
- package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +4 -8
- package/dist/commonjs/core/stream/period/period_stream.js +1 -3
- package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +1 -2
- package/dist/commonjs/experimental/tools/mediaCapabilitiesProber/api/index.d.ts.map +1 -1
- package/dist/commonjs/main_thread/api/public_api.js +4 -4
- package/dist/commonjs/main_thread/decrypt/clear_on_stop.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/clear_on_stop.js +60 -14
- package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/content_decryptor.js +21 -9
- package/dist/commonjs/main_thread/decrypt/dispose_decryption_resources.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/dispose_decryption_resources.js +2 -18
- package/dist/commonjs/main_thread/decrypt/find_key_system.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/find_key_system.js +134 -68
- package/dist/commonjs/main_thread/decrypt/get_key_system_configuration.js +2 -2
- package/dist/commonjs/main_thread/decrypt/get_media_keys.js +5 -3
- package/dist/commonjs/main_thread/decrypt/init_media_keys.d.ts.map +1 -1
- package/dist/commonjs/main_thread/decrypt/init_media_keys.js +2 -2
- package/dist/{es2017/main_thread/decrypt/utils/media_keys_infos_store.d.ts → commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts} +31 -9
- package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -0
- package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.js +282 -0
- package/dist/commonjs/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
- package/dist/commonjs/main_thread/init/utils/rebuffering_controller.js +20 -9
- package/dist/commonjs/main_thread/text_displayer/html/text_track_cues_store.js +1 -1
- package/dist/commonjs/main_thread/tracks_store/track_dispatcher.d.ts.map +1 -1
- package/dist/commonjs/main_thread/tracks_store/track_dispatcher.js +3 -4
- package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
- package/dist/commonjs/main_thread/tracks_store/tracks_store.js +1 -1
- package/dist/commonjs/manifest/classes/representation.d.ts +15 -1
- package/dist/commonjs/manifest/classes/representation.d.ts.map +1 -1
- package/dist/commonjs/manifest/classes/representation.js +17 -0
- package/dist/commonjs/manifest/utils.d.ts +15 -0
- package/dist/commonjs/manifest/utils.d.ts.map +1 -1
- package/dist/commonjs/manifest/utils.js +28 -5
- package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +2 -2
- package/dist/commonjs/playback_observer/media_element_playback_observer.js +1 -1
- package/dist/commonjs/public_types.d.ts +44 -0
- package/dist/commonjs/public_types.d.ts.map +1 -1
- package/dist/commonjs/utils/flat_map.d.ts +2 -2
- package/dist/commonjs/utils/flat_map.js +2 -2
- package/dist/commonjs/utils/url-utils.d.ts.map +1 -1
- package/dist/commonjs/utils/url-utils.js +11 -10
- package/dist/commonjs/utils/xml-parser.d.ts.map +1 -1
- package/dist/commonjs/utils/xml-parser.js +10 -8
- package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
- package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
- package/dist/es2017/compat/browser_compatibility_types.d.ts +7 -2
- package/dist/es2017/compat/browser_compatibility_types.d.ts.map +1 -1
- package/dist/es2017/compat/browser_compatibility_types.js +0 -1
- package/dist/es2017/compat/browser_detection.js +1 -1
- package/dist/es2017/compat/event_listeners.d.ts.map +1 -1
- package/dist/es2017/compat/event_listeners.js +2 -4
- package/dist/es2017/compat/has_mse_in_worker.d.ts.map +1 -1
- package/dist/es2017/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
- package/dist/es2017/core/cmcd/cmcd_data_builder.js +1 -2
- package/dist/es2017/core/main/worker/send_message.d.ts.map +1 -1
- package/dist/es2017/core/main/worker/send_message.js +0 -1
- package/dist/es2017/core/main/worker/worker_main.js +1 -1
- package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
- package/dist/es2017/core/stream/adaptation/adaptation_stream.js +4 -6
- package/dist/es2017/core/stream/period/period_stream.js +1 -3
- package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +1 -2
- package/dist/es2017/experimental/tools/mediaCapabilitiesProber/api/index.d.ts.map +1 -1
- package/dist/es2017/main_thread/api/public_api.js +4 -4
- package/dist/es2017/main_thread/decrypt/clear_on_stop.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/clear_on_stop.js +3 -3
- package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/content_decryptor.js +21 -9
- package/dist/es2017/main_thread/decrypt/dispose_decryption_resources.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/dispose_decryption_resources.js +2 -12
- package/dist/es2017/main_thread/decrypt/find_key_system.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/find_key_system.js +102 -56
- package/dist/es2017/main_thread/decrypt/get_key_system_configuration.js +2 -2
- package/dist/es2017/main_thread/decrypt/get_media_keys.js +2 -2
- package/dist/es2017/main_thread/decrypt/init_media_keys.d.ts.map +1 -1
- package/dist/es2017/main_thread/decrypt/init_media_keys.js +2 -2
- package/dist/{commonjs/main_thread/decrypt/utils/media_keys_infos_store.d.ts → es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts} +31 -9
- package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -0
- package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.js +180 -0
- package/dist/es2017/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
- package/dist/es2017/main_thread/init/utils/rebuffering_controller.js +20 -9
- package/dist/es2017/main_thread/text_displayer/html/text_track_cues_store.js +1 -1
- package/dist/es2017/main_thread/tracks_store/track_dispatcher.d.ts.map +1 -1
- package/dist/es2017/main_thread/tracks_store/track_dispatcher.js +3 -4
- package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
- package/dist/es2017/main_thread/tracks_store/tracks_store.js +2 -2
- package/dist/es2017/manifest/classes/representation.d.ts +15 -1
- package/dist/es2017/manifest/classes/representation.d.ts.map +1 -1
- package/dist/es2017/manifest/classes/representation.js +17 -0
- package/dist/es2017/manifest/utils.d.ts +15 -0
- package/dist/es2017/manifest/utils.d.ts.map +1 -1
- package/dist/es2017/manifest/utils.js +27 -5
- package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +2 -2
- package/dist/es2017/playback_observer/media_element_playback_observer.js +1 -1
- package/dist/es2017/public_types.d.ts +44 -0
- package/dist/es2017/public_types.d.ts.map +1 -1
- package/dist/es2017/utils/flat_map.d.ts +2 -2
- package/dist/es2017/utils/flat_map.js +2 -2
- package/dist/es2017/utils/url-utils.d.ts.map +1 -1
- package/dist/es2017/utils/url-utils.js +11 -10
- package/dist/es2017/utils/xml-parser.d.ts.map +1 -1
- package/dist/es2017/utils/xml-parser.js +10 -8
- package/dist/rx-player.js +505 -372
- package/dist/rx-player.min.js +18 -18
- package/dist/worker.js +6 -6
- package/package.json +21 -19
- package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
- package/src/compat/browser_compatibility_types.ts +22 -4
- package/src/compat/browser_detection.ts +1 -1
- package/src/compat/event_listeners.ts +2 -4
- package/src/compat/has_mse_in_worker.ts +1 -1
- package/src/core/cmcd/cmcd_data_builder.ts +1 -4
- package/src/core/main/worker/send_message.ts +4 -2
- package/src/core/main/worker/worker_main.ts +1 -1
- package/src/core/stream/adaptation/adaptation_stream.ts +4 -7
- package/src/core/stream/period/period_stream.ts +3 -3
- package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +1 -2
- package/src/main_thread/api/public_api.ts +4 -4
- package/src/main_thread/decrypt/__tests__/__global__/media_key_system_access.test.ts +239 -6
- package/src/main_thread/decrypt/__tests__/find_key_system.test.ts +325 -0
- package/src/main_thread/decrypt/clear_on_stop.ts +3 -3
- package/src/main_thread/decrypt/content_decryptor.ts +26 -8
- package/src/main_thread/decrypt/dispose_decryption_resources.ts +2 -13
- package/src/main_thread/decrypt/find_key_system.ts +120 -81
- package/src/main_thread/decrypt/get_key_system_configuration.ts +2 -2
- package/src/main_thread/decrypt/get_media_keys.ts +2 -2
- package/src/main_thread/decrypt/init_media_keys.ts +2 -2
- package/src/main_thread/decrypt/utils/media_keys_attacher.ts +284 -0
- package/src/main_thread/init/utils/rebuffering_controller.ts +20 -10
- package/src/main_thread/text_displayer/html/text_track_cues_store.ts +1 -1
- package/src/main_thread/tracks_store/track_dispatcher.ts +3 -6
- package/src/main_thread/tracks_store/tracks_store.ts +2 -1
- package/src/manifest/classes/representation.ts +18 -1
- package/src/manifest/utils.ts +30 -9
- package/src/parsers/manifest/dash/common/parse_representations.ts +2 -2
- package/src/playback_observer/media_element_playback_observer.ts +1 -1
- package/src/public_types.ts +45 -0
- package/src/utils/__tests__/flat_map.test.ts +7 -20
- package/src/utils/flat_map.ts +2 -2
- package/src/utils/url-utils.ts +11 -10
- package/src/utils/xml-parser.ts +13 -8
- package/vitest.config.mjs +9 -23
- package/dist/commonjs/main_thread/decrypt/attach_media_keys.d.ts +0 -60
- package/dist/commonjs/main_thread/decrypt/attach_media_keys.d.ts.map +0 -1
- package/dist/commonjs/main_thread/decrypt/attach_media_keys.js +0 -124
- package/dist/commonjs/main_thread/decrypt/utils/media_keys_infos_store.d.ts.map +0 -1
- package/dist/commonjs/main_thread/decrypt/utils/media_keys_infos_store.js +0 -45
- package/dist/es2017/main_thread/decrypt/attach_media_keys.d.ts +0 -60
- package/dist/es2017/main_thread/decrypt/attach_media_keys.d.ts.map +0 -1
- package/dist/es2017/main_thread/decrypt/attach_media_keys.js +0 -73
- package/dist/es2017/main_thread/decrypt/utils/media_keys_infos_store.d.ts.map +0 -1
- package/dist/es2017/main_thread/decrypt/utils/media_keys_infos_store.js +0 -43
- package/src/main_thread/decrypt/attach_media_keys.ts +0 -125
- package/src/main_thread/decrypt/utils/media_keys_infos_store.ts +0 -88
|
@@ -270,8 +270,20 @@ export interface IMediaElement extends IEventTarget<IMediaElementEventMap> {
|
|
|
270
270
|
oncanplay: ((evt: Event) => void) | null;
|
|
271
271
|
oncanplaythrough: ((evt: Event) => void) | null;
|
|
272
272
|
onended: ((evt: Event) => void) | null;
|
|
273
|
-
onenterpictureinpicture?:
|
|
274
|
-
|
|
273
|
+
onenterpictureinpicture?:
|
|
274
|
+
| ((
|
|
275
|
+
evt: Event & {
|
|
276
|
+
pictureInPictureWindow: ICompatPictureInPictureWindow;
|
|
277
|
+
},
|
|
278
|
+
) => void)
|
|
279
|
+
| null;
|
|
280
|
+
onleavepictureinpicture?:
|
|
281
|
+
| ((
|
|
282
|
+
evt: Event & {
|
|
283
|
+
pictureInPictureWindow: ICompatPictureInPictureWindow;
|
|
284
|
+
},
|
|
285
|
+
) => void)
|
|
286
|
+
| null;
|
|
275
287
|
onerror: ((evt: Event) => void) | null;
|
|
276
288
|
onloadeddata: ((evt: Event) => void) | null;
|
|
277
289
|
onloadedmetadata: ((evt: Event) => void) | null;
|
|
@@ -402,11 +414,17 @@ interface ICompatVideoTrack {
|
|
|
402
414
|
export interface ICompatPictureInPictureWindow extends EventTarget {
|
|
403
415
|
width: number;
|
|
404
416
|
height: number;
|
|
417
|
+
onresize: ((evt: Event) => void) | null;
|
|
405
418
|
}
|
|
406
419
|
|
|
407
|
-
/* eslint-disable */
|
|
408
420
|
/** MediaSource implementation, including vendored implementations. */
|
|
409
|
-
const gs = globalScope as
|
|
421
|
+
const gs = globalScope as typeof window & {
|
|
422
|
+
MozMediaSource?: typeof MediaSource | undefined | null;
|
|
423
|
+
WebKitMediaSource?: typeof MediaSource | undefined | null;
|
|
424
|
+
MSMediaSource?: typeof MediaSource | undefined | null;
|
|
425
|
+
ManagedMediaSource?: typeof MediaSource | undefined | null;
|
|
426
|
+
};
|
|
427
|
+
|
|
410
428
|
const MediaSource_:
|
|
411
429
|
| { new (): IMediaSource; isTypeSupported(type: string): boolean }
|
|
412
430
|
| undefined =
|
|
@@ -170,7 +170,7 @@ let isA1KStb40xx = false;
|
|
|
170
170
|
isPanasonic = true;
|
|
171
171
|
} else if (navigator.userAgent.indexOf("Xbox") !== -1) {
|
|
172
172
|
isXbox = true;
|
|
173
|
-
} else if (navigator.userAgent.indexOf("Model/a1-kstb40xx")) {
|
|
173
|
+
} else if (navigator.userAgent.indexOf("Model/a1-kstb40xx") !== -1) {
|
|
174
174
|
isA1KStb40xx = true;
|
|
175
175
|
}
|
|
176
176
|
})();
|
|
@@ -176,16 +176,14 @@ function createCompatibleEventListener(
|
|
|
176
176
|
(element as IEventEmitterLike).addEventListener(eventName, listener);
|
|
177
177
|
} else {
|
|
178
178
|
hasSetOnFn = true;
|
|
179
|
-
|
|
180
|
-
(element as any)["on" + eventName] = listener;
|
|
179
|
+
element[("on" + eventName) as keyof IEventTargetLike] = listener;
|
|
181
180
|
}
|
|
182
181
|
cancelSignal.register(() => {
|
|
183
182
|
if (typeof element.removeEventListener === "function") {
|
|
184
183
|
(element as IEventEmitterLike).removeEventListener(eventName, listener);
|
|
185
184
|
}
|
|
186
185
|
if (hasSetOnFn) {
|
|
187
|
-
|
|
188
|
-
delete (element as any)["on" + eventName];
|
|
186
|
+
delete element[("on" + eventName) as keyof IEventTargetLike];
|
|
189
187
|
}
|
|
190
188
|
});
|
|
191
189
|
});
|
|
@@ -333,10 +333,7 @@ export default class CmcdDataBuilder {
|
|
|
333
333
|
props.st = content.manifest.isDynamic ? "l" : "v";
|
|
334
334
|
props.tb = content.adaptation.representations.reduce(
|
|
335
335
|
(acc: number | undefined, representation: IRepresentation) => {
|
|
336
|
-
if (
|
|
337
|
-
representation.isSupported !== true ||
|
|
338
|
-
representation.decipherable === false
|
|
339
|
-
) {
|
|
336
|
+
if (representation.isPlayable() !== true) {
|
|
340
337
|
return acc;
|
|
341
338
|
}
|
|
342
339
|
if (acc === undefined) {
|
|
@@ -11,8 +11,10 @@ export default function sendMessage(
|
|
|
11
11
|
postMessage(msg);
|
|
12
12
|
} else {
|
|
13
13
|
// TypeScript made a mistake here, and 2busy2fix
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
(postMessage as (msg: IWorkerMessage, transferables: Transferable[]) => void)(
|
|
15
|
+
msg,
|
|
16
|
+
transferables,
|
|
17
|
+
);
|
|
16
18
|
}
|
|
17
19
|
}
|
|
18
20
|
|
|
@@ -95,10 +95,7 @@ export default function AdaptationStream(
|
|
|
95
95
|
|
|
96
96
|
const initialRepIds = content.representations.getValue().representationIds;
|
|
97
97
|
const initialRepresentations = content.adaptation.representations.filter(
|
|
98
|
-
(r) =>
|
|
99
|
-
arrayIncludes(initialRepIds, r.id) &&
|
|
100
|
-
r.decipherable !== false &&
|
|
101
|
-
r.isSupported !== false,
|
|
98
|
+
(r) => arrayIncludes(initialRepIds, r.id) && r.isPlayable() !== false,
|
|
102
99
|
);
|
|
103
100
|
|
|
104
101
|
/** Emit the list of Representation for the adaptive logic. */
|
|
@@ -336,11 +333,11 @@ export default function AdaptationStream(
|
|
|
336
333
|
representation,
|
|
337
334
|
};
|
|
338
335
|
currentRepresentation.setValue(representation);
|
|
339
|
-
if (
|
|
336
|
+
if (fnCancelSignal.isCancelled()) {
|
|
340
337
|
return; // previous callback has stopped everything by side-effect
|
|
341
338
|
}
|
|
342
339
|
callbacks.representationChange(repInfo);
|
|
343
|
-
if (
|
|
340
|
+
if (fnCancelSignal.isCancelled()) {
|
|
344
341
|
return; // previous callback has stopped everything by side-effect
|
|
345
342
|
}
|
|
346
343
|
|
|
@@ -453,7 +450,7 @@ export default function AdaptationStream(
|
|
|
453
450
|
|
|
454
451
|
// We wait 4 seconds to let the situation evolve by itself before
|
|
455
452
|
// retrying loading segments with a lower buffer goal
|
|
456
|
-
cancellableSleep(4000,
|
|
453
|
+
cancellableSleep(4000, fnCancelSignal)
|
|
457
454
|
.then(() => {
|
|
458
455
|
return createRepresentationStream(
|
|
459
456
|
representation,
|
|
@@ -470,9 +470,9 @@ function createOrReuseSegmentSink(
|
|
|
470
470
|
* @returns {string}
|
|
471
471
|
*/
|
|
472
472
|
function getFirstDeclaredMimeType(adaptation: IAdaptation): string {
|
|
473
|
-
const representations = adaptation.representations.filter(
|
|
474
|
-
|
|
475
|
-
|
|
473
|
+
const representations = adaptation.representations.filter(
|
|
474
|
+
(r) => r.isPlayable() !== false,
|
|
475
|
+
);
|
|
476
476
|
if (representations.length === 0) {
|
|
477
477
|
const noRepErr = new MediaError(
|
|
478
478
|
"NO_PLAYABLE_REPRESENTATION",
|
|
@@ -189,8 +189,7 @@ export default function getAdaptationSwitchStrategy(
|
|
|
189
189
|
function hasCompatibleCodec(adaptation: IAdaptation, segmentSinkCodec: string): boolean {
|
|
190
190
|
return adaptation.representations.some(
|
|
191
191
|
(rep) =>
|
|
192
|
-
rep.
|
|
193
|
-
rep.decipherable !== false &&
|
|
192
|
+
rep.isPlayable() === true &&
|
|
194
193
|
areCodecsCompatible(rep.getMimeTypeString(), segmentSinkCodec),
|
|
195
194
|
);
|
|
196
195
|
}
|
|
@@ -411,7 +411,7 @@ class Player extends EventEmitter<IPublicAPIEvent> {
|
|
|
411
411
|
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
|
|
412
412
|
videoElement.preload = "auto";
|
|
413
413
|
|
|
414
|
-
this.version = /* PLAYER_VERSION */ "4.3.0-dev.
|
|
414
|
+
this.version = /* PLAYER_VERSION */ "4.3.0-dev.2025012900";
|
|
415
415
|
this.log = log;
|
|
416
416
|
this.state = "STOPPED";
|
|
417
417
|
this.videoElement = videoElement;
|
|
@@ -1335,7 +1335,7 @@ class Player extends EventEmitter<IPublicAPIEvent> {
|
|
|
1335
1335
|
* `false` otherwise.
|
|
1336
1336
|
*/
|
|
1337
1337
|
isPaused(): boolean {
|
|
1338
|
-
if (this.videoElement) {
|
|
1338
|
+
if (this.videoElement !== null) {
|
|
1339
1339
|
if (arrayIncludes(["LOADING", "RELOADING"], this.state)) {
|
|
1340
1340
|
return !this._priv_lastAutoPlay;
|
|
1341
1341
|
} else {
|
|
@@ -2778,7 +2778,7 @@ class Player extends EventEmitter<IPublicAPIEvent> {
|
|
|
2778
2778
|
// Emit initial events for the Period
|
|
2779
2779
|
if (!isNullOrUndefined(tracksStore)) {
|
|
2780
2780
|
const periodRef = tracksStore.getPeriodObjectFromPeriod(period);
|
|
2781
|
-
if (periodRef) {
|
|
2781
|
+
if (periodRef !== undefined) {
|
|
2782
2782
|
const audioTrack = tracksStore.getChosenAudioTrack(periodRef, true);
|
|
2783
2783
|
this._priv_triggerEventIfNotStopped("audioTrackChange", audioTrack, cancelSignal);
|
|
2784
2784
|
const textTrack = tracksStore.getChosenTextTrack(periodRef);
|
|
@@ -3330,7 +3330,7 @@ class Player extends EventEmitter<IPublicAPIEvent> {
|
|
|
3330
3330
|
}
|
|
3331
3331
|
}
|
|
3332
3332
|
}
|
|
3333
|
-
Player.version = /* PLAYER_VERSION */ "4.3.0-dev.
|
|
3333
|
+
Player.version = /* PLAYER_VERSION */ "4.3.0-dev.2025012900";
|
|
3334
3334
|
|
|
3335
3335
|
/** Every events sent by the RxPlayer's public API. */
|
|
3336
3336
|
interface IPublicAPIEvent {
|
|
@@ -367,6 +367,108 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
367
367
|
);
|
|
368
368
|
});
|
|
369
369
|
|
|
370
|
+
it("should want only persistent sessions if wantedSessionTypes is set to `['persistent-license']`", async () => {
|
|
371
|
+
const mockRequestMediaKeySystemAccess = vi
|
|
372
|
+
.fn()
|
|
373
|
+
.mockImplementation(() => Promise.reject("nope"));
|
|
374
|
+
mockCompat({
|
|
375
|
+
requestMediaKeySystemAccess: mockRequestMediaKeySystemAccess,
|
|
376
|
+
});
|
|
377
|
+
await checkIncompatibleKeySystemsErrorMessage([
|
|
378
|
+
{
|
|
379
|
+
type: "foo",
|
|
380
|
+
getLicense: neverCalledFn,
|
|
381
|
+
wantedSessionTypes: ["persistent-license"],
|
|
382
|
+
},
|
|
383
|
+
]);
|
|
384
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
385
|
+
|
|
386
|
+
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
387
|
+
return {
|
|
388
|
+
...conf,
|
|
389
|
+
sessionTypes: ["persistent-license"],
|
|
390
|
+
};
|
|
391
|
+
});
|
|
392
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
393
|
+
1,
|
|
394
|
+
"foo",
|
|
395
|
+
expectedConfig,
|
|
396
|
+
);
|
|
397
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
398
|
+
2,
|
|
399
|
+
"foo",
|
|
400
|
+
removeCapabiltiesFromConfig(expectedConfig),
|
|
401
|
+
);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
it("should want only temporary sessions if wantedSessionTypes is set to `['temporary']`", async () => {
|
|
405
|
+
const mockRequestMediaKeySystemAccess = vi
|
|
406
|
+
.fn()
|
|
407
|
+
.mockImplementation(() => Promise.reject("nope"));
|
|
408
|
+
mockCompat({
|
|
409
|
+
requestMediaKeySystemAccess: mockRequestMediaKeySystemAccess,
|
|
410
|
+
});
|
|
411
|
+
await checkIncompatibleKeySystemsErrorMessage([
|
|
412
|
+
{
|
|
413
|
+
type: "foo",
|
|
414
|
+
getLicense: neverCalledFn,
|
|
415
|
+
wantedSessionTypes: ["temporary"],
|
|
416
|
+
},
|
|
417
|
+
]);
|
|
418
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
419
|
+
|
|
420
|
+
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
421
|
+
return {
|
|
422
|
+
...conf,
|
|
423
|
+
sessionTypes: ["temporary"],
|
|
424
|
+
};
|
|
425
|
+
});
|
|
426
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
427
|
+
1,
|
|
428
|
+
"foo",
|
|
429
|
+
expectedConfig,
|
|
430
|
+
);
|
|
431
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
432
|
+
2,
|
|
433
|
+
"foo",
|
|
434
|
+
removeCapabiltiesFromConfig(expectedConfig),
|
|
435
|
+
);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
it("should want both temporary and persistent sessions if wantedSessionTypes is set to `['persistent-license', 'temporary']`", async () => {
|
|
439
|
+
const mockRequestMediaKeySystemAccess = vi
|
|
440
|
+
.fn()
|
|
441
|
+
.mockImplementation(() => Promise.reject("nope"));
|
|
442
|
+
mockCompat({
|
|
443
|
+
requestMediaKeySystemAccess: mockRequestMediaKeySystemAccess,
|
|
444
|
+
});
|
|
445
|
+
await checkIncompatibleKeySystemsErrorMessage([
|
|
446
|
+
{
|
|
447
|
+
type: "foo",
|
|
448
|
+
getLicense: neverCalledFn,
|
|
449
|
+
wantedSessionTypes: ["persistent-license", "temporary"],
|
|
450
|
+
},
|
|
451
|
+
]);
|
|
452
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
453
|
+
|
|
454
|
+
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
455
|
+
return {
|
|
456
|
+
...conf,
|
|
457
|
+
sessionTypes: ["persistent-license", "temporary"],
|
|
458
|
+
};
|
|
459
|
+
});
|
|
460
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
461
|
+
1,
|
|
462
|
+
"foo",
|
|
463
|
+
expectedConfig,
|
|
464
|
+
);
|
|
465
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
466
|
+
2,
|
|
467
|
+
"foo",
|
|
468
|
+
removeCapabiltiesFromConfig(expectedConfig),
|
|
469
|
+
);
|
|
470
|
+
});
|
|
471
|
+
|
|
370
472
|
it("should want persistent sessions if persistentLicenseConfig is set", async () => {
|
|
371
473
|
const mockRequestMediaKeySystemAccess = vi
|
|
372
474
|
.fn()
|
|
@@ -387,6 +489,137 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
387
489
|
]);
|
|
388
490
|
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
389
491
|
|
|
492
|
+
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
493
|
+
return {
|
|
494
|
+
...conf,
|
|
495
|
+
persistentState: "required",
|
|
496
|
+
sessionTypes: ["persistent-license"],
|
|
497
|
+
};
|
|
498
|
+
});
|
|
499
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
500
|
+
1,
|
|
501
|
+
"foo",
|
|
502
|
+
expectedConfig,
|
|
503
|
+
);
|
|
504
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
505
|
+
2,
|
|
506
|
+
"foo",
|
|
507
|
+
removeCapabiltiesFromConfig(expectedConfig),
|
|
508
|
+
);
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
it("should not want persistent sessions if persistentLicenseConfig is set but wantedSessionTypes only wants temporary licenses", async () => {
|
|
512
|
+
const mockRequestMediaKeySystemAccess = vi
|
|
513
|
+
.fn()
|
|
514
|
+
.mockImplementation(() => Promise.reject("nope"));
|
|
515
|
+
mockCompat({
|
|
516
|
+
requestMediaKeySystemAccess: mockRequestMediaKeySystemAccess,
|
|
517
|
+
});
|
|
518
|
+
const persistentLicenseConfig = {
|
|
519
|
+
save() {
|
|
520
|
+
throw new Error("Should not save.");
|
|
521
|
+
},
|
|
522
|
+
load() {
|
|
523
|
+
throw new Error("Should not load.");
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
await checkIncompatibleKeySystemsErrorMessage([
|
|
527
|
+
{
|
|
528
|
+
type: "foo",
|
|
529
|
+
getLicense: neverCalledFn,
|
|
530
|
+
wantedSessionTypes: ["temporary"],
|
|
531
|
+
persistentLicenseConfig,
|
|
532
|
+
},
|
|
533
|
+
]);
|
|
534
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
535
|
+
|
|
536
|
+
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
537
|
+
return {
|
|
538
|
+
...conf,
|
|
539
|
+
sessionTypes: ["temporary"],
|
|
540
|
+
};
|
|
541
|
+
});
|
|
542
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
543
|
+
1,
|
|
544
|
+
"foo",
|
|
545
|
+
expectedConfig,
|
|
546
|
+
);
|
|
547
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
548
|
+
2,
|
|
549
|
+
"foo",
|
|
550
|
+
removeCapabiltiesFromConfig(expectedConfig),
|
|
551
|
+
);
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
it("should properly handle persistentLicenseConfig and wantedSessionTypes set to persistent-license", async () => {
|
|
555
|
+
const mockRequestMediaKeySystemAccess = vi
|
|
556
|
+
.fn()
|
|
557
|
+
.mockImplementation(() => Promise.reject("nope"));
|
|
558
|
+
mockCompat({
|
|
559
|
+
requestMediaKeySystemAccess: mockRequestMediaKeySystemAccess,
|
|
560
|
+
});
|
|
561
|
+
const persistentLicenseConfig = {
|
|
562
|
+
save() {
|
|
563
|
+
throw new Error("Should not save.");
|
|
564
|
+
},
|
|
565
|
+
load() {
|
|
566
|
+
throw new Error("Should not load.");
|
|
567
|
+
},
|
|
568
|
+
};
|
|
569
|
+
await checkIncompatibleKeySystemsErrorMessage([
|
|
570
|
+
{
|
|
571
|
+
type: "foo",
|
|
572
|
+
getLicense: neverCalledFn,
|
|
573
|
+
wantedSessionTypes: ["persistent-license"],
|
|
574
|
+
persistentLicenseConfig,
|
|
575
|
+
},
|
|
576
|
+
]);
|
|
577
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
578
|
+
|
|
579
|
+
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
580
|
+
return {
|
|
581
|
+
...conf,
|
|
582
|
+
persistentState: "required",
|
|
583
|
+
sessionTypes: ["persistent-license"],
|
|
584
|
+
};
|
|
585
|
+
});
|
|
586
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
587
|
+
1,
|
|
588
|
+
"foo",
|
|
589
|
+
expectedConfig,
|
|
590
|
+
);
|
|
591
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenNthCalledWith(
|
|
592
|
+
2,
|
|
593
|
+
"foo",
|
|
594
|
+
removeCapabiltiesFromConfig(expectedConfig),
|
|
595
|
+
);
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
it("should properly handle persistentLicenseConfig and wantedSessionTypes set to both temporary and persistent-license", async () => {
|
|
599
|
+
const mockRequestMediaKeySystemAccess = vi
|
|
600
|
+
.fn()
|
|
601
|
+
.mockImplementation(() => Promise.reject("nope"));
|
|
602
|
+
mockCompat({
|
|
603
|
+
requestMediaKeySystemAccess: mockRequestMediaKeySystemAccess,
|
|
604
|
+
});
|
|
605
|
+
const persistentLicenseConfig = {
|
|
606
|
+
save() {
|
|
607
|
+
throw new Error("Should not save.");
|
|
608
|
+
},
|
|
609
|
+
load() {
|
|
610
|
+
throw new Error("Should not load.");
|
|
611
|
+
},
|
|
612
|
+
};
|
|
613
|
+
await checkIncompatibleKeySystemsErrorMessage([
|
|
614
|
+
{
|
|
615
|
+
type: "foo",
|
|
616
|
+
getLicense: neverCalledFn,
|
|
617
|
+
wantedSessionTypes: ["temporary", "persistent-license"],
|
|
618
|
+
persistentLicenseConfig,
|
|
619
|
+
},
|
|
620
|
+
]);
|
|
621
|
+
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
622
|
+
|
|
390
623
|
const expectedConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map((conf) => {
|
|
391
624
|
return {
|
|
392
625
|
...conf,
|
|
@@ -680,7 +913,7 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
680
913
|
return {
|
|
681
914
|
...conf,
|
|
682
915
|
persistentState: "required",
|
|
683
|
-
sessionTypes: ["
|
|
916
|
+
sessionTypes: ["persistent-license"],
|
|
684
917
|
};
|
|
685
918
|
});
|
|
686
919
|
const expectedPersistentConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map(
|
|
@@ -688,7 +921,7 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
688
921
|
return {
|
|
689
922
|
...conf,
|
|
690
923
|
persistentState: "required",
|
|
691
|
-
sessionTypes: ["
|
|
924
|
+
sessionTypes: ["persistent-license"],
|
|
692
925
|
};
|
|
693
926
|
},
|
|
694
927
|
);
|
|
@@ -786,7 +1019,7 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
786
1019
|
return {
|
|
787
1020
|
...conf,
|
|
788
1021
|
persistentState: "required",
|
|
789
|
-
sessionTypes: ["
|
|
1022
|
+
sessionTypes: ["persistent-license"],
|
|
790
1023
|
};
|
|
791
1024
|
});
|
|
792
1025
|
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|
|
@@ -833,7 +1066,7 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
833
1066
|
return {
|
|
834
1067
|
...conf,
|
|
835
1068
|
persistentState: "required",
|
|
836
|
-
sessionTypes: ["
|
|
1069
|
+
sessionTypes: ["persistent-license"],
|
|
837
1070
|
};
|
|
838
1071
|
},
|
|
839
1072
|
);
|
|
@@ -842,7 +1075,7 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
842
1075
|
return {
|
|
843
1076
|
...conf,
|
|
844
1077
|
persistentState: "required",
|
|
845
|
-
sessionTypes: ["
|
|
1078
|
+
sessionTypes: ["persistent-license"],
|
|
846
1079
|
};
|
|
847
1080
|
});
|
|
848
1081
|
const expectedIdentifierConfig: MediaKeySystemConfiguration[] = defaultKSConfig.map(
|
|
@@ -939,7 +1172,7 @@ describe("decrypt - global tests - media key system access", () => {
|
|
|
939
1172
|
return {
|
|
940
1173
|
...conf,
|
|
941
1174
|
persistentState: "required",
|
|
942
|
-
sessionTypes: ["
|
|
1175
|
+
sessionTypes: ["persistent-license"],
|
|
943
1176
|
};
|
|
944
1177
|
});
|
|
945
1178
|
expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);
|