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.
Files changed (174) hide show
  1. package/CHANGELOG.md +30 -8
  2. package/VERSION +1 -1
  3. package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts +1 -1
  4. package/dist/commonjs/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  5. package/dist/commonjs/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  6. package/dist/commonjs/__GENERATED_CODE/embedded_worker.js +1 -1
  7. package/dist/commonjs/compat/browser_compatibility_types.d.ts +7 -2
  8. package/dist/commonjs/compat/browser_compatibility_types.d.ts.map +1 -1
  9. package/dist/commonjs/compat/browser_compatibility_types.js +0 -1
  10. package/dist/commonjs/compat/browser_detection.js +1 -1
  11. package/dist/commonjs/compat/event_listeners.d.ts.map +1 -1
  12. package/dist/commonjs/compat/event_listeners.js +2 -4
  13. package/dist/commonjs/compat/has_mse_in_worker.d.ts.map +1 -1
  14. package/dist/commonjs/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
  15. package/dist/commonjs/core/cmcd/cmcd_data_builder.js +1 -2
  16. package/dist/commonjs/core/main/worker/send_message.d.ts.map +1 -1
  17. package/dist/commonjs/core/main/worker/send_message.js +0 -1
  18. package/dist/commonjs/core/main/worker/worker_main.js +1 -1
  19. package/dist/commonjs/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  20. package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +4 -8
  21. package/dist/commonjs/core/stream/period/period_stream.js +1 -3
  22. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +1 -2
  23. package/dist/commonjs/experimental/tools/mediaCapabilitiesProber/api/index.d.ts.map +1 -1
  24. package/dist/commonjs/main_thread/api/public_api.js +4 -4
  25. package/dist/commonjs/main_thread/decrypt/clear_on_stop.d.ts.map +1 -1
  26. package/dist/commonjs/main_thread/decrypt/clear_on_stop.js +60 -14
  27. package/dist/commonjs/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  28. package/dist/commonjs/main_thread/decrypt/content_decryptor.js +21 -9
  29. package/dist/commonjs/main_thread/decrypt/dispose_decryption_resources.d.ts.map +1 -1
  30. package/dist/commonjs/main_thread/decrypt/dispose_decryption_resources.js +2 -18
  31. package/dist/commonjs/main_thread/decrypt/find_key_system.d.ts.map +1 -1
  32. package/dist/commonjs/main_thread/decrypt/find_key_system.js +134 -68
  33. package/dist/commonjs/main_thread/decrypt/get_key_system_configuration.js +2 -2
  34. package/dist/commonjs/main_thread/decrypt/get_media_keys.js +5 -3
  35. package/dist/commonjs/main_thread/decrypt/init_media_keys.d.ts.map +1 -1
  36. package/dist/commonjs/main_thread/decrypt/init_media_keys.js +2 -2
  37. 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
  38. package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -0
  39. package/dist/commonjs/main_thread/decrypt/utils/media_keys_attacher.js +282 -0
  40. package/dist/commonjs/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
  41. package/dist/commonjs/main_thread/init/utils/rebuffering_controller.js +20 -9
  42. package/dist/commonjs/main_thread/text_displayer/html/text_track_cues_store.js +1 -1
  43. package/dist/commonjs/main_thread/tracks_store/track_dispatcher.d.ts.map +1 -1
  44. package/dist/commonjs/main_thread/tracks_store/track_dispatcher.js +3 -4
  45. package/dist/commonjs/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
  46. package/dist/commonjs/main_thread/tracks_store/tracks_store.js +1 -1
  47. package/dist/commonjs/manifest/classes/representation.d.ts +15 -1
  48. package/dist/commonjs/manifest/classes/representation.d.ts.map +1 -1
  49. package/dist/commonjs/manifest/classes/representation.js +17 -0
  50. package/dist/commonjs/manifest/utils.d.ts +15 -0
  51. package/dist/commonjs/manifest/utils.d.ts.map +1 -1
  52. package/dist/commonjs/manifest/utils.js +28 -5
  53. package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +2 -2
  54. package/dist/commonjs/playback_observer/media_element_playback_observer.js +1 -1
  55. package/dist/commonjs/public_types.d.ts +44 -0
  56. package/dist/commonjs/public_types.d.ts.map +1 -1
  57. package/dist/commonjs/utils/flat_map.d.ts +2 -2
  58. package/dist/commonjs/utils/flat_map.js +2 -2
  59. package/dist/commonjs/utils/url-utils.d.ts.map +1 -1
  60. package/dist/commonjs/utils/url-utils.js +11 -10
  61. package/dist/commonjs/utils/xml-parser.d.ts.map +1 -1
  62. package/dist/commonjs/utils/xml-parser.js +10 -8
  63. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts +1 -1
  64. package/dist/es2017/__GENERATED_CODE/embedded_dash_wasm.d.ts.map +1 -1
  65. package/dist/es2017/__GENERATED_CODE/embedded_worker.d.ts.map +1 -1
  66. package/dist/es2017/__GENERATED_CODE/embedded_worker.js +1 -1
  67. package/dist/es2017/compat/browser_compatibility_types.d.ts +7 -2
  68. package/dist/es2017/compat/browser_compatibility_types.d.ts.map +1 -1
  69. package/dist/es2017/compat/browser_compatibility_types.js +0 -1
  70. package/dist/es2017/compat/browser_detection.js +1 -1
  71. package/dist/es2017/compat/event_listeners.d.ts.map +1 -1
  72. package/dist/es2017/compat/event_listeners.js +2 -4
  73. package/dist/es2017/compat/has_mse_in_worker.d.ts.map +1 -1
  74. package/dist/es2017/core/cmcd/cmcd_data_builder.d.ts.map +1 -1
  75. package/dist/es2017/core/cmcd/cmcd_data_builder.js +1 -2
  76. package/dist/es2017/core/main/worker/send_message.d.ts.map +1 -1
  77. package/dist/es2017/core/main/worker/send_message.js +0 -1
  78. package/dist/es2017/core/main/worker/worker_main.js +1 -1
  79. package/dist/es2017/core/stream/adaptation/adaptation_stream.d.ts.map +1 -1
  80. package/dist/es2017/core/stream/adaptation/adaptation_stream.js +4 -6
  81. package/dist/es2017/core/stream/period/period_stream.js +1 -3
  82. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +1 -2
  83. package/dist/es2017/experimental/tools/mediaCapabilitiesProber/api/index.d.ts.map +1 -1
  84. package/dist/es2017/main_thread/api/public_api.js +4 -4
  85. package/dist/es2017/main_thread/decrypt/clear_on_stop.d.ts.map +1 -1
  86. package/dist/es2017/main_thread/decrypt/clear_on_stop.js +3 -3
  87. package/dist/es2017/main_thread/decrypt/content_decryptor.d.ts.map +1 -1
  88. package/dist/es2017/main_thread/decrypt/content_decryptor.js +21 -9
  89. package/dist/es2017/main_thread/decrypt/dispose_decryption_resources.d.ts.map +1 -1
  90. package/dist/es2017/main_thread/decrypt/dispose_decryption_resources.js +2 -12
  91. package/dist/es2017/main_thread/decrypt/find_key_system.d.ts.map +1 -1
  92. package/dist/es2017/main_thread/decrypt/find_key_system.js +102 -56
  93. package/dist/es2017/main_thread/decrypt/get_key_system_configuration.js +2 -2
  94. package/dist/es2017/main_thread/decrypt/get_media_keys.js +2 -2
  95. package/dist/es2017/main_thread/decrypt/init_media_keys.d.ts.map +1 -1
  96. package/dist/es2017/main_thread/decrypt/init_media_keys.js +2 -2
  97. 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
  98. package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.d.ts.map +1 -0
  99. package/dist/es2017/main_thread/decrypt/utils/media_keys_attacher.js +180 -0
  100. package/dist/es2017/main_thread/init/utils/rebuffering_controller.d.ts.map +1 -1
  101. package/dist/es2017/main_thread/init/utils/rebuffering_controller.js +20 -9
  102. package/dist/es2017/main_thread/text_displayer/html/text_track_cues_store.js +1 -1
  103. package/dist/es2017/main_thread/tracks_store/track_dispatcher.d.ts.map +1 -1
  104. package/dist/es2017/main_thread/tracks_store/track_dispatcher.js +3 -4
  105. package/dist/es2017/main_thread/tracks_store/tracks_store.d.ts.map +1 -1
  106. package/dist/es2017/main_thread/tracks_store/tracks_store.js +2 -2
  107. package/dist/es2017/manifest/classes/representation.d.ts +15 -1
  108. package/dist/es2017/manifest/classes/representation.d.ts.map +1 -1
  109. package/dist/es2017/manifest/classes/representation.js +17 -0
  110. package/dist/es2017/manifest/utils.d.ts +15 -0
  111. package/dist/es2017/manifest/utils.d.ts.map +1 -1
  112. package/dist/es2017/manifest/utils.js +27 -5
  113. package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +2 -2
  114. package/dist/es2017/playback_observer/media_element_playback_observer.js +1 -1
  115. package/dist/es2017/public_types.d.ts +44 -0
  116. package/dist/es2017/public_types.d.ts.map +1 -1
  117. package/dist/es2017/utils/flat_map.d.ts +2 -2
  118. package/dist/es2017/utils/flat_map.js +2 -2
  119. package/dist/es2017/utils/url-utils.d.ts.map +1 -1
  120. package/dist/es2017/utils/url-utils.js +11 -10
  121. package/dist/es2017/utils/xml-parser.d.ts.map +1 -1
  122. package/dist/es2017/utils/xml-parser.js +10 -8
  123. package/dist/rx-player.js +505 -372
  124. package/dist/rx-player.min.js +18 -18
  125. package/dist/worker.js +6 -6
  126. package/package.json +21 -19
  127. package/src/__GENERATED_CODE/embedded_worker.ts +1 -1
  128. package/src/compat/browser_compatibility_types.ts +22 -4
  129. package/src/compat/browser_detection.ts +1 -1
  130. package/src/compat/event_listeners.ts +2 -4
  131. package/src/compat/has_mse_in_worker.ts +1 -1
  132. package/src/core/cmcd/cmcd_data_builder.ts +1 -4
  133. package/src/core/main/worker/send_message.ts +4 -2
  134. package/src/core/main/worker/worker_main.ts +1 -1
  135. package/src/core/stream/adaptation/adaptation_stream.ts +4 -7
  136. package/src/core/stream/period/period_stream.ts +3 -3
  137. package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +1 -2
  138. package/src/main_thread/api/public_api.ts +4 -4
  139. package/src/main_thread/decrypt/__tests__/__global__/media_key_system_access.test.ts +239 -6
  140. package/src/main_thread/decrypt/__tests__/find_key_system.test.ts +325 -0
  141. package/src/main_thread/decrypt/clear_on_stop.ts +3 -3
  142. package/src/main_thread/decrypt/content_decryptor.ts +26 -8
  143. package/src/main_thread/decrypt/dispose_decryption_resources.ts +2 -13
  144. package/src/main_thread/decrypt/find_key_system.ts +120 -81
  145. package/src/main_thread/decrypt/get_key_system_configuration.ts +2 -2
  146. package/src/main_thread/decrypt/get_media_keys.ts +2 -2
  147. package/src/main_thread/decrypt/init_media_keys.ts +2 -2
  148. package/src/main_thread/decrypt/utils/media_keys_attacher.ts +284 -0
  149. package/src/main_thread/init/utils/rebuffering_controller.ts +20 -10
  150. package/src/main_thread/text_displayer/html/text_track_cues_store.ts +1 -1
  151. package/src/main_thread/tracks_store/track_dispatcher.ts +3 -6
  152. package/src/main_thread/tracks_store/tracks_store.ts +2 -1
  153. package/src/manifest/classes/representation.ts +18 -1
  154. package/src/manifest/utils.ts +30 -9
  155. package/src/parsers/manifest/dash/common/parse_representations.ts +2 -2
  156. package/src/playback_observer/media_element_playback_observer.ts +1 -1
  157. package/src/public_types.ts +45 -0
  158. package/src/utils/__tests__/flat_map.test.ts +7 -20
  159. package/src/utils/flat_map.ts +2 -2
  160. package/src/utils/url-utils.ts +11 -10
  161. package/src/utils/xml-parser.ts +13 -8
  162. package/vitest.config.mjs +9 -23
  163. package/dist/commonjs/main_thread/decrypt/attach_media_keys.d.ts +0 -60
  164. package/dist/commonjs/main_thread/decrypt/attach_media_keys.d.ts.map +0 -1
  165. package/dist/commonjs/main_thread/decrypt/attach_media_keys.js +0 -124
  166. package/dist/commonjs/main_thread/decrypt/utils/media_keys_infos_store.d.ts.map +0 -1
  167. package/dist/commonjs/main_thread/decrypt/utils/media_keys_infos_store.js +0 -45
  168. package/dist/es2017/main_thread/decrypt/attach_media_keys.d.ts +0 -60
  169. package/dist/es2017/main_thread/decrypt/attach_media_keys.d.ts.map +0 -1
  170. package/dist/es2017/main_thread/decrypt/attach_media_keys.js +0 -73
  171. package/dist/es2017/main_thread/decrypt/utils/media_keys_infos_store.d.ts.map +0 -1
  172. package/dist/es2017/main_thread/decrypt/utils/media_keys_infos_store.js +0 -43
  173. package/src/main_thread/decrypt/attach_media_keys.ts +0 -125
  174. 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?: ((evt: Event) => void) | null;
274
- onleavepictureinpicture?: ((evt: Event) => void) | null;
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 any;
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
188
- delete (element as any)["on" + eventName];
186
+ delete element[("on" + eventName) as keyof IEventTargetLike];
189
187
  }
190
188
  });
191
189
  });
@@ -1,6 +1,6 @@
1
1
  const hasMseInWorker =
2
2
  typeof MediaSource === "function" &&
3
3
  // eslint-disable-next-line
4
- (MediaSource as any).canConstructInDedicatedWorker === true;
4
+ MediaSource.canConstructInDedicatedWorker === true;
5
5
 
6
6
  export default hasMseInWorker;
@@ -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
- // eslint-disable-next-line
15
- (postMessage as any)(msg, transferables);
14
+ (postMessage as (msg: IWorkerMessage, transferables: Transferable[]) => void)(
15
+ msg,
16
+ transferables,
17
+ );
16
18
  }
17
19
  }
18
20
 
@@ -594,7 +594,7 @@ function loadOrReloadPreparedContent(
594
594
  );
595
595
 
596
596
  StreamOrchestrator(
597
- { initialPeriod: manifest.periods[0], manifest },
597
+ { initialPeriod, manifest },
598
598
  playbackObserver,
599
599
  representationEstimator,
600
600
  segmentSinksStore,
@@ -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 (adapStreamCanceller.isUsed()) {
336
+ if (fnCancelSignal.isCancelled()) {
340
337
  return; // previous callback has stopped everything by side-effect
341
338
  }
342
339
  callbacks.representationChange(repInfo);
343
- if (adapStreamCanceller.isUsed()) {
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, adapStreamCanceller.signal)
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((r) => {
474
- return r.isSupported === true && r.decipherable !== false;
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.isSupported === true &&
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.2024112900";
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.2024112900";
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: ["temporary", "persistent-license"],
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: ["temporary", "persistent-license"],
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: ["temporary", "persistent-license"],
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: ["temporary", "persistent-license"],
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: ["temporary", "persistent-license"],
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: ["temporary", "persistent-license"],
1175
+ sessionTypes: ["persistent-license"],
943
1176
  };
944
1177
  });
945
1178
  expect(mockRequestMediaKeySystemAccess).toHaveBeenCalledTimes(2);