rx-player 3.26.2 → 3.27.0-dev.20220317

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 (500) hide show
  1. package/.github/workflows/perfs.yml +22 -0
  2. package/CHANGELOG.md +33 -1
  3. package/FILES.md +5 -4
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  6. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  8. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  14. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  15. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  16. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  17. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  18. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  19. package/dist/_esm5.processed/config.d.ts +166 -1080
  20. package/dist/_esm5.processed/config.js +17 -1119
  21. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  22. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  23. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  24. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
  27. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
  28. package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
  29. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  30. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  31. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  32. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
  33. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  34. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  35. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  36. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  37. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  38. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
  39. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
  40. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
  41. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  42. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  43. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  44. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  45. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  46. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  47. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  48. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  49. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  50. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  51. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  52. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  53. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  56. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  57. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  58. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  60. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  61. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  62. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  63. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  65. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  66. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  67. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
  68. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  70. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  73. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  74. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  75. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  76. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  77. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  78. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  79. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  81. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  83. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  84. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  85. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  86. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  87. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  88. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  89. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  91. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  92. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  93. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  94. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  95. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  96. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  97. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
  98. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
  99. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
  100. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
  101. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  102. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
  103. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  104. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
  105. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  106. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
  107. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  108. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  109. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  110. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  111. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  112. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  113. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  114. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  115. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  116. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  117. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  118. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
  119. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  120. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
  121. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
  122. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  123. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  124. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  125. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  126. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  127. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  128. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  129. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  130. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  131. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  132. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  133. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  134. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
  135. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  136. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  137. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  138. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  139. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  140. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  141. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  142. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  143. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  144. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  145. package/dist/_esm5.processed/default_config.js +1145 -0
  146. package/dist/_esm5.processed/errors/request_error.js +3 -1
  147. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  148. package/dist/_esm5.processed/experimental/index.js +2 -0
  149. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  150. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  151. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
  152. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  153. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  154. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  155. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  156. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  157. package/dist/_esm5.processed/features/features_object.js +1 -1
  158. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  159. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  160. package/dist/_esm5.processed/features/list/eme.js +5 -5
  161. package/dist/_esm5.processed/features/types.d.ts +3 -3
  162. package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
  163. package/dist/_esm5.processed/manifest/adaptation.js +3 -1
  164. package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
  165. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  166. package/dist/_esm5.processed/manifest/period.d.ts +3 -3
  167. package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
  168. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
  169. package/dist/_esm5.processed/manifest/types.d.ts +3 -3
  170. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  171. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  172. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
  173. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  174. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
  175. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  176. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
  177. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
  178. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  179. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  180. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
  181. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
  182. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  183. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  184. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
  185. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
  186. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
  187. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  188. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
  189. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
  190. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
  191. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
  192. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
  193. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
  194. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
  195. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
  196. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
  197. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  198. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  199. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  200. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  201. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  202. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  203. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
  204. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
  205. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  206. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
  207. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  208. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  209. package/dist/_esm5.processed/public_types.d.ts +2 -2
  210. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
  211. package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
  212. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  213. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  214. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  215. package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
  216. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
  217. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  218. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
  219. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
  220. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
  221. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  222. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
  223. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  224. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  225. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  226. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
  227. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  228. package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
  229. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
  230. package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
  231. package/dist/_esm5.processed/transports/types.d.ts +58 -30
  232. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  233. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
  234. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
  235. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  236. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
  237. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  238. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  239. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  240. package/dist/_esm5.processed/utils/reference.js +72 -24
  241. package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
  242. package/dist/_esm5.processed/utils/request/fetch.js +8 -6
  243. package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
  244. package/dist/_esm5.processed/utils/request/xhr.js +3 -2
  245. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
  246. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  247. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  248. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  249. package/dist/rx-player.js +5242 -3190
  250. package/dist/rx-player.min.js +1 -1
  251. package/dummy +1 -0
  252. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  253. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  254. package/package.json +33 -36
  255. package/scripts/build/templates/experimental/index.d.ts +16 -0
  256. package/scripts/build/templates/experimental/index.js +16 -0
  257. package/scripts/doc-generator/generate_header_html.js +6 -7
  258. package/scripts/doc-generator/generate_page_html.js +3 -4
  259. package/scripts/doc-generator/generate_page_list_html.js +4 -5
  260. package/scripts/doc-generator/generate_sidebar_html.js +4 -7
  261. package/scripts/doc-generator/utils.js +0 -11
  262. package/scripts/generate_demo_list.js +3 -3
  263. package/scripts/generate_documentation_list.js +3 -3
  264. package/scripts/launch_static_server.js +127 -67
  265. package/scripts/run_standalone_demo.js +1 -0
  266. package/scripts/start_demo_web_server.js +1 -0
  267. package/sonar-project.properties +1 -1
  268. package/src/README.md +6 -6
  269. package/src/compat/__tests__/fullscreen.test.ts +7 -7
  270. package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
  271. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  272. package/src/compat/browser_detection.ts +4 -2
  273. package/src/compat/eme/close_session.ts +90 -56
  274. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  275. package/src/compat/eme/custom_media_keys/index.ts +28 -41
  276. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  277. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  278. package/src/compat/eme/generate_key_request.ts +25 -33
  279. package/src/compat/eme/load_session.ts +29 -31
  280. package/src/compat/event_listeners.ts +2 -1
  281. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  282. package/src/config.ts +17 -1210
  283. package/src/core/README.md +1 -1
  284. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  285. package/src/core/abr/bandwidth_estimator.ts +4 -4
  286. package/src/core/abr/buffer_based_chooser.ts +85 -20
  287. package/src/core/abr/network_analyzer.ts +6 -7
  288. package/src/core/abr/pending_requests_store.ts +3 -5
  289. package/src/core/abr/representation_estimator.ts +6 -3
  290. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  291. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  292. package/src/core/api/get_player_state.ts +1 -1
  293. package/src/core/api/index.ts +3 -0
  294. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  295. package/src/core/api/option_utils.ts +37 -20
  296. package/src/core/api/playback_observer.ts +12 -8
  297. package/src/core/api/public_api.ts +152 -112
  298. package/src/core/api/track_choice_manager.ts +10 -9
  299. package/src/core/decrypt/README.md +22 -0
  300. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  301. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  302. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  303. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  304. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  305. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
  306. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  307. package/src/core/decrypt/clear_on_stop.ts +48 -0
  308. package/src/core/decrypt/content_decryptor.ts +1158 -0
  309. package/src/core/decrypt/create_or_load_session.ts +130 -0
  310. package/src/core/decrypt/create_session.ts +175 -0
  311. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  312. package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
  313. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  314. package/src/core/decrypt/get_media_keys.ts +145 -0
  315. package/src/core/{eme → decrypt}/index.ts +11 -8
  316. package/src/core/decrypt/init_media_keys.ts +51 -0
  317. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  318. package/src/core/decrypt/set_server_certificate.ts +104 -0
  319. package/src/core/{eme → decrypt}/types.ts +129 -259
  320. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  321. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  322. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  323. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  324. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  325. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  326. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  327. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  328. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  329. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  330. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  331. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  332. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  333. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  334. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  335. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  336. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  337. package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
  338. package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
  339. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  340. package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
  341. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  342. package/src/core/init/get_initial_time.ts +2 -1
  343. package/src/core/init/initialize_directfile.ts +19 -22
  344. package/src/core/init/initialize_media_source.ts +43 -106
  345. package/src/core/init/link_drm_and_content.ts +176 -0
  346. package/src/core/init/manifest_update_scheduler.ts +12 -10
  347. package/src/core/init/stall_avoider.ts +6 -5
  348. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  349. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  350. package/src/core/init/stream_events_emitter/types.ts +2 -2
  351. package/src/core/init/types.ts +1 -39
  352. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  353. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
  354. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
  355. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  356. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  357. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  358. package/src/core/stream/events_generators.ts +9 -4
  359. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  360. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  361. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  362. package/src/core/stream/period/period_stream.ts +5 -2
  363. package/src/core/stream/representation/force_garbage_collection.ts +5 -7
  364. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  365. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  366. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  367. package/src/core/stream/representation/push_media_segment.ts +3 -2
  368. package/src/core/stream/representation/representation_stream.ts +30 -7
  369. package/src/core/stream/types.ts +1 -1
  370. package/src/default_config.ts +1241 -0
  371. package/src/errors/request_error.ts +4 -1
  372. package/src/experimental/index.ts +5 -0
  373. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  374. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
  375. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  376. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  377. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
  378. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  379. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  380. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  381. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  382. package/src/features/__tests__/initialize_features.test.ts +2 -2
  383. package/src/features/features_object.ts +1 -1
  384. package/src/features/initialize_features.ts +1 -1
  385. package/src/features/list/__tests__/eme.test.ts +5 -5
  386. package/src/features/list/eme.ts +5 -5
  387. package/src/features/types.ts +3 -10
  388. package/src/manifest/adaptation.ts +6 -4
  389. package/src/manifest/manifest.ts +16 -86
  390. package/src/manifest/period.ts +3 -3
  391. package/src/manifest/representation.ts +38 -5
  392. package/src/manifest/representation_index/types.ts +18 -18
  393. package/src/manifest/types.ts +3 -3
  394. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  395. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  396. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  397. package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
  398. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
  399. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
  400. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  401. package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
  402. package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
  403. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  404. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
  405. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  406. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  407. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
  408. package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
  409. package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
  410. package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
  411. package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
  412. package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
  413. package/src/parsers/manifest/dash/parsers_types.ts +3 -3
  414. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  415. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
  416. package/src/parsers/manifest/smooth/create_parser.ts +24 -21
  417. package/src/parsers/manifest/smooth/representation_index.ts +14 -14
  418. package/src/parsers/manifest/types.ts +28 -28
  419. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
  420. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
  421. package/src/parsers/manifest/utils/index_helpers.ts +2 -2
  422. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  423. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  424. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  425. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  426. package/src/public_types.ts +5 -1
  427. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  428. package/src/transports/dash/image_pipelines.ts +4 -1
  429. package/src/transports/dash/init_segment_loader.ts +1 -1
  430. package/src/transports/dash/manifest_parser.ts +1 -1
  431. package/src/transports/dash/segment_loader.ts +7 -7
  432. package/src/transports/dash/segment_parser.ts +8 -1
  433. package/src/transports/dash/text_loader.ts +2 -2
  434. package/src/transports/dash/text_parser.ts +11 -1
  435. package/src/transports/local/segment_loader.ts +4 -4
  436. package/src/transports/local/segment_parser.ts +4 -0
  437. package/src/transports/local/text_parser.ts +8 -0
  438. package/src/transports/metaplaylist/manifest_loader.ts +1 -1
  439. package/src/transports/metaplaylist/pipelines.ts +1 -1
  440. package/src/transports/smooth/pipelines.ts +29 -16
  441. package/src/transports/smooth/segment_loader.ts +8 -8
  442. package/src/transports/types.ts +59 -30
  443. package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
  444. package/src/transports/utils/generate_manifest_loader.ts +1 -1
  445. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  446. package/src/utils/__tests__/flat_map.test.ts +12 -7
  447. package/src/utils/cancellable_sleep.ts +1 -1
  448. package/src/utils/cast_to_observable.ts +1 -2
  449. package/src/utils/deep_merge.ts +46 -0
  450. package/src/utils/reference.ts +116 -23
  451. package/src/utils/request/fetch.ts +17 -15
  452. package/src/utils/request/xhr.ts +11 -8
  453. package/src/utils/rx-from_cancellable_promise.ts +8 -4
  454. package/src/utils/task_canceller.ts +6 -4
  455. package/tsconfig.json +1 -2
  456. package/tsconfig.modules.json +1 -2
  457. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  458. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  459. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  460. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  461. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  462. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  463. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  464. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  465. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  466. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  467. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
  468. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  469. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  470. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  471. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  472. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  473. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  474. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  475. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  476. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  477. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  478. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  479. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  480. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
  481. package/src/core/eme/README.md +0 -26
  482. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  483. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  484. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  485. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  486. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  487. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  488. package/src/core/eme/clear_eme_session.ts +0 -62
  489. package/src/core/eme/create_session.ts +0 -187
  490. package/src/core/eme/dispose_eme.ts +0 -25
  491. package/src/core/eme/dispose_media_keys.ts +0 -46
  492. package/src/core/eme/eme_manager.ts +0 -387
  493. package/src/core/eme/get_media_keys.ts +0 -141
  494. package/src/core/eme/get_session.ts +0 -135
  495. package/src/core/eme/init_media_keys.ts +0 -106
  496. package/src/core/eme/set_server_certificate.ts +0 -115
  497. package/src/core/eme/utils/close_session.ts +0 -113
  498. package/src/core/eme/utils/init_data_store.ts +0 -234
  499. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  500. package/src/core/init/create_eme_manager.ts +0 -95
@@ -48,8 +48,8 @@ const emptyPersistentSessionsStore = {
48
48
  function checkNothingHappen(persistentSessionsStore : any, limit : number) {
49
49
  const deleteLastSpy = jest.spyOn(persistentSessionsStore, "deleteOldSessions");
50
50
  const logInfoSpy = jest.fn();
51
- jest.mock("../../../log", () => ({ __esModule: true as const,
52
- default: { info: logInfoSpy } }));
51
+ jest.mock("../../../../log", () => ({ __esModule: true as const,
52
+ default: { info: logInfoSpy } }));
53
53
  const cleanOldStoredPersistentInfo = require("../clean_old_stored_persistent_info")
54
54
  .default;
55
55
  cleanOldStoredPersistentInfo(persistentSessionsStore, limit);
@@ -73,22 +73,22 @@ function checkRemoved(
73
73
  ) {
74
74
  const deleteLastSpy = jest.spyOn(persistentSessionsStore, "deleteOldSessions");
75
75
  const logInfoSpy = jest.fn();
76
- jest.mock("../../../log", () => ({ __esModule: true as const,
77
- default: { info: logInfoSpy } }));
76
+ jest.mock("../../../../log", () => ({ __esModule: true as const,
77
+ default: { info: logInfoSpy } }));
78
78
  const cleanOldStoredPersistentInfo = require("../clean_old_stored_persistent_info")
79
79
  .default;
80
80
  cleanOldStoredPersistentInfo(persistentSessionsStore, limit);
81
81
  expect(deleteLastSpy).toHaveBeenCalledTimes(1);
82
82
  expect(deleteLastSpy).toHaveBeenCalledWith(numberToRemove);
83
83
  expect(logInfoSpy).toHaveBeenCalledTimes(1);
84
- expect(logInfoSpy).toHaveBeenCalledWith("EME: Too many stored persistent sessions," +
84
+ expect(logInfoSpy).toHaveBeenCalledWith("DRM: Too many stored persistent sessions," +
85
85
  " removing some.",
86
86
  persistentSessionsStore.getLength(),
87
87
  numberToRemove);
88
88
  jest.resetModules();
89
89
  }
90
90
 
91
- describe("core - eme - cleanOldStoredPersistentInfo", () => {
91
+ describe("core - decrypt - cleanOldStoredPersistentInfo", () => {
92
92
  it("should do nothing with a negative limit", () => {
93
93
  checkNothingHappen(createPersistentSessionsStore(), -1);
94
94
  checkNothingHappen(createPersistentSessionsStore(), -20);
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import areArraysOfNumbersEqual from "../../../utils/are_arrays_of_numbers_equal";
18
- import InitDataContainer from "./init_data_container";
18
+ import SerializableBytes from "./serializable_bytes";
19
19
 
20
20
  /**
21
21
  * Returns `true` if both values are compatible initialization data, which
@@ -29,10 +29,10 @@ import InitDataContainer from "./init_data_container";
29
29
  export default function areInitializationValuesCompatible(
30
30
  stored : Array<{ systemId : string | undefined;
31
31
  hash : number;
32
- data : Uint8Array | InitDataContainer; }>,
32
+ data : Uint8Array | SerializableBytes | string; }>,
33
33
  newElts : Array<{ systemId : string | undefined;
34
34
  hash : number;
35
- data : Uint8Array | InitDataContainer; }>
35
+ data : Uint8Array | SerializableBytes | string; }>
36
36
  ) : boolean {
37
37
  return _isAInB(stored, newElts) ??
38
38
  _isAInB(newElts, stored) ??
@@ -62,10 +62,10 @@ export default function areInitializationValuesCompatible(
62
62
  function _isAInB(
63
63
  a : Array<{ systemId : string | undefined;
64
64
  hash : number;
65
- data : Uint8Array | InitDataContainer; }>,
65
+ data : Uint8Array | SerializableBytes | string; }>,
66
66
  b : Array<{ systemId : string | undefined;
67
67
  hash : number;
68
- data : Uint8Array | InitDataContainer; }>
68
+ data : Uint8Array | SerializableBytes | string; }>
69
69
  ) : boolean | null {
70
70
  if (a.length === 0) {
71
71
  return false;
@@ -89,11 +89,11 @@ function _isAInB(
89
89
 
90
90
  const aData : Uint8Array =
91
91
  firstAElt.data instanceof Uint8Array ? firstAElt.data :
92
- typeof firstAElt.data === "string" ? InitDataContainer.decode(firstAElt.data) :
92
+ typeof firstAElt.data === "string" ? SerializableBytes.decode(firstAElt.data) :
93
93
  firstAElt.data.initData;
94
94
  const bData : Uint8Array =
95
95
  bElt.data instanceof Uint8Array ? bElt.data :
96
- typeof bElt.data === "string" ? InitDataContainer.decode(bElt.data) :
96
+ typeof bElt.data === "string" ? SerializableBytes.decode(bElt.data) :
97
97
  bElt.data.initData;
98
98
  if (!areArraysOfNumbersEqual(aData, bData)) {
99
99
  return false;
@@ -117,11 +117,11 @@ function _isAInB(
117
117
  }
118
118
  const aNewData : Uint8Array =
119
119
  aElt.data instanceof Uint8Array ? aElt.data :
120
- typeof aElt.data === "string" ? InitDataContainer.decode(aElt.data) :
120
+ typeof aElt.data === "string" ? SerializableBytes.decode(aElt.data) :
121
121
  aElt.data.initData;
122
122
  const bNewData : Uint8Array =
123
123
  bNewElt.data instanceof Uint8Array ? bNewElt.data :
124
- typeof bNewElt.data === "string" ? InitDataContainer.decode(bNewElt.data) :
124
+ typeof bNewElt.data === "string" ? SerializableBytes.decode(bNewElt.data) :
125
125
  bNewElt.data.initData;
126
126
  if (!areArraysOfNumbersEqual(aNewData, bNewData)) {
127
127
  return false;
@@ -14,11 +14,12 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { ICustomMediaKeySession } from "../../compat";
18
- import getUUIDKidFromKeyStatusKID from "../../compat/eme/get_uuid_kid_from_keystatus_kid";
19
- import { EncryptedMediaError } from "../../errors";
20
- import { bytesToHex } from "../../utils/string_parsing";
21
- import { IEMEWarningEvent } from "./types";
17
+ import { ICustomMediaKeySession } from "../../../compat";
18
+ /* eslint-disable-next-line max-len */
19
+ import getUUIDKidFromKeyStatusKID from "../../../compat/eme/get_uuid_kid_from_keystatus_kid";
20
+ import { EncryptedMediaError } from "../../../errors";
21
+ import { bytesToHex } from "../../../utils/string_parsing";
22
+ import { IEMEWarningEvent } from "../types";
22
23
 
23
24
  const KEY_STATUSES = { EXPIRED: "expired",
24
25
  INTERNAL_ERROR: "internal-error",
@@ -13,7 +13,10 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { EMPTY, mapTo, merge as observableMerge, startWith, } from "rxjs";
16
+
17
+ import PPromise from "../../../utils/promise";
18
+ import LoadedSessionsStore from "./loaded_sessions_store";
19
+
17
20
  /**
18
21
  * Close sessions from the loadedSessionsStore to allow at maximum `limit`
19
22
  * stored MediaKeySessions in it.
@@ -23,23 +26,20 @@ import { EMPTY, mapTo, merge as observableMerge, startWith, } from "rxjs";
23
26
  * @param {Object} loadedSessionsStore
24
27
  * @returns {Observable}
25
28
  */
26
- export default function cleanOldLoadedSessions(loadedSessionsStore, limit) {
27
- if (limit < 0 || limit >= loadedSessionsStore.getLength()) {
28
- return EMPTY;
29
- }
30
- var cleaningOldSessions$ = [];
31
- var entries = loadedSessionsStore
32
- .getAll()
33
- .slice(); // clone
34
- var toDelete = entries.length - limit;
35
- for (var i = 0; i < toDelete; i++) {
36
- var entry = entries[i];
37
- var cleaning$ = loadedSessionsStore
38
- .closeSession(entry.initializationData)
39
- .pipe(mapTo({ type: "cleaned-old-session",
40
- value: entry }), startWith({ type: "cleaning-old-session",
41
- value: entry }));
42
- cleaningOldSessions$.push(cleaning$);
43
- }
44
- return observableMerge.apply(void 0, cleaningOldSessions$);
29
+ export default async function cleanOldLoadedSessions(
30
+ loadedSessionsStore : LoadedSessionsStore,
31
+ limit : number
32
+ ) : Promise<void> {
33
+ if (limit < 0 || limit >= loadedSessionsStore.getLength()) {
34
+ return ;
35
+ }
36
+
37
+ const proms : Array<Promise<unknown>> = [];
38
+ const entries = loadedSessionsStore.getAll().slice(); // clone
39
+ const toDelete = entries.length - limit;
40
+ for (let i = 0; i < toDelete; i++) {
41
+ const entry = entries[i];
42
+ proms.push(loadedSessionsStore.closeSession(entry.mediaKeySession));
43
+ }
44
+ await PPromise.all(proms);
45
45
  }
@@ -14,8 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import log from "../../log";
18
- import PersistentSessionsStore from "./utils/persistent_sessions_store";
17
+ import log from "../../../log";
18
+ import PersistentSessionsStore from "./persistent_sessions_store";
19
19
 
20
20
  /**
21
21
  * Remove old information from a PersistentSessionsStore so that it respects the
@@ -41,7 +41,7 @@ export default function cleanOldStoredPersistentInfo(
41
41
  }
42
42
  const numberOfPersistentSessions = persistentSessionsStore.getLength();
43
43
  const toDelete = numberOfPersistentSessions - limit;
44
- log.info("EME: Too many stored persistent sessions, removing some.",
44
+ log.info("DRM: Too many stored persistent sessions, removing some.",
45
45
  numberOfPersistentSessions,
46
46
  toDelete);
47
47
  persistentSessionsStore.deleteOldSessions(toDelete);
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import startsWith from "../../utils/starts_with";
17
+ import startsWith from "../../../utils/starts_with";
18
18
 
19
19
  /**
20
20
  * @param {string} keySystem
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { concat } from "../../../utils/byte_parsing";
18
+ import hashBuffer from "../../../utils/hash_buffer";
19
+ import { IInitDataValue } from "../types";
20
+ import areInitializationValuesCompatible from "./are_init_values_compatible";
21
+
22
+ /**
23
+ * Wrap initialization data values and reformat it so it becomes easier to check
24
+ * compatibility with other `InitDataValuesContainer`.
25
+ * @class InitDataValuesContainer
26
+ */
27
+ export default class InitDataValuesContainer {
28
+ private readonly _innerValues : IInitDataValue[];
29
+ private _lazyFormattedValues : IFormattedInitDataValue[] | null;
30
+
31
+ /**
32
+ * Construct a new `InitDataValuesContainer`.
33
+ * Note that the data is not formatted right away.
34
+ * It is only really formatted lazily the first time we need it.
35
+ *
36
+ * @param {Array.<Object>} initDataValues
37
+ */
38
+ constructor(initDataValues : IInitDataValue[]) {
39
+ this._innerValues = initDataValues;
40
+ this._lazyFormattedValues = null;
41
+ }
42
+
43
+ /**
44
+ * Construct data that should be given to the `generateRequest` EME API.
45
+ * @returns {Uint8Array}
46
+ */
47
+ public constructRequestData() : Uint8Array {
48
+ // `generateKeyRequest` awaits a single Uint8Array containing all
49
+ // initialization data.
50
+ return concat(...this._innerValues.map(i => i.data));
51
+ }
52
+
53
+ /**
54
+ * Returns `true` if the given `InitDataValuesContainer` seems to be
55
+ * "compatible" with the one stored in this instance.
56
+ * Returns `false` if not.
57
+ *
58
+ * By "compatible" we mean that it will generate the same key request.
59
+ * @param {InitDataValuesContainer | Object} initDataValues
60
+ * @returns {boolean}
61
+ */
62
+ public isCompatibleWith(
63
+ initDataValues : InitDataValuesContainer | IFormattedInitDataValue[]
64
+ ) : boolean {
65
+ const formatted = initDataValues instanceof InitDataValuesContainer ?
66
+ initDataValues.getFormattedValues() :
67
+ initDataValues;
68
+ return areInitializationValuesCompatible(this.getFormattedValues(), formatted);
69
+ }
70
+
71
+ /**
72
+ * Return the stored initialization data values, with added niceties:
73
+ * - they are sorted always the same way for similar
74
+ * `InitDataValuesContainer`
75
+ * - each value is associated to its hash, which is always done with the
76
+ * same hashing function than for all other InitDataValuesContainer).
77
+ *
78
+ * The main point being to be able to compare much faster multiple
79
+ * `InitDataValuesContainer`, though that data can also be used in any
80
+ * other way.
81
+ * @returns {Array.<Object>}
82
+ */
83
+ public getFormattedValues() : IFormattedInitDataValue[] {
84
+ if (this._lazyFormattedValues === null) {
85
+ this._lazyFormattedValues = formatInitDataValues(this._innerValues);
86
+ }
87
+ return this._lazyFormattedValues;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Format given initializationData's values so they are faster to compare:
93
+ * - sort them by systemId
94
+ * - add hash for each initialization data encountered.
95
+ * @param {Array.<Object>} initialValues
96
+ * @returns {Array.<Object>}
97
+ */
98
+ function formatInitDataValues(
99
+ initialValues : IInitDataValue[]
100
+ ) : IFormattedInitDataValue[] {
101
+ return initialValues.slice()
102
+ .sort((a, b) => a.systemId === b.systemId ? 0 :
103
+ a.systemId === undefined ? 1 :
104
+ b.systemId === undefined ? -1 :
105
+ a.systemId < b.systemId ? -1 :
106
+ 1)
107
+ .map(({ systemId, data }) => ({ systemId,
108
+ data,
109
+ hash: hashBuffer(data) }));
110
+ }
111
+
112
+ /**
113
+ * Formatted initialization data value, so it is faster to compare to others.
114
+ */
115
+ export interface IFormattedInitDataValue {
116
+ systemId : string | undefined;
117
+ hash : number;
118
+ data : Uint8Array;
119
+ }
@@ -22,7 +22,6 @@ import arrayIncludes from "../../../utils/array_includes";
22
22
  * If all key statuses attached to session are valid (either not
23
23
  * "expired" or "internal-error"), return true.
24
24
  * If not, return false.
25
- * @param {Uint8Array} initData
26
25
  * @param {MediaKeySession} loadedSession
27
26
  * @returns {MediaKeySession}
28
27
  */
@@ -40,24 +39,24 @@ export default function isSessionUsable(
40
39
  });
41
40
 
42
41
  if (keyStatuses.length <= 0) {
43
- log.debug("EME: isSessionUsable: MediaKeySession given has an empty keyStatuses",
42
+ log.debug("DRM: isSessionUsable: MediaKeySession given has an empty keyStatuses",
44
43
  loadedSession.sessionId);
45
44
  return false;
46
45
  }
47
46
 
48
47
  if (arrayIncludes(keyStatuses, "expired")) {
49
- log.debug("EME: isSessionUsable: MediaKeySession given has an expired key",
48
+ log.debug("DRM: isSessionUsable: MediaKeySession given has an expired key",
50
49
  loadedSession.sessionId);
51
50
  return false;
52
51
  }
53
52
 
54
53
  if (arrayIncludes(keyStatuses, "internal-error")) {
55
- log.debug("EME: isSessionUsable: MediaKeySession given has a key with an " +
54
+ log.debug("DRM: isSessionUsable: MediaKeySession given has a key with an " +
56
55
  "internal-error",
57
56
  loadedSession.sessionId);
58
57
  return false;
59
58
  }
60
59
 
61
- log.debug("EME: isSessionUsable: MediaKeySession is usable", loadedSession.sessionId);
60
+ log.debug("DRM: isSessionUsable: MediaKeySession is usable", loadedSession.sessionId);
62
61
  return true;
63
62
  }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import areArraysOfNumbersEqual from "../../../utils/are_arrays_of_numbers_equal";
18
+
19
+ /**
20
+ * Returns `true` if both given key id appear to be equal.
21
+ * @param {Uint8Array} keyId1
22
+ * @param {Uint8Array} keyId2
23
+ * @returns {boolean}
24
+ */
25
+ export function areKeyIdsEqual(
26
+ keyId1 : Uint8Array,
27
+ keyId2 : Uint8Array
28
+ ) : boolean {
29
+ return keyId1 === keyId2 || areArraysOfNumbersEqual(keyId1, keyId2);
30
+ }
31
+
32
+ /**
33
+ * @param {Uint8Array} wantedKeyId
34
+ * @param {Array.<Uint8Array>} keyIdsArr
35
+ * @returns {boolean}
36
+ */
37
+ export function isKeyIdContainedIn(
38
+ wantedKeyId : Uint8Array,
39
+ keyIdsArr : Uint8Array[]
40
+ ) : boolean {
41
+ return keyIdsArr.some(k => areKeyIdsEqual(k, wantedKeyId));
42
+ }
43
+
44
+ /**
45
+ * Returns `true` if all key ids in `wantedKeyIds` are present in the
46
+ * `keyIdsArr` array.
47
+ * @param {Array.<Uint8Array>} wantedKeyIds
48
+ * @param {Array.<Uint8Array>} keyIdsArr
49
+ * @returns {boolean}
50
+ */
51
+ export function areAllKeyIdsContainedIn(
52
+ wantedKeyIds : Uint8Array[],
53
+ keyIdsArr : Uint8Array[]
54
+ ) : boolean {
55
+ for (const keyId of wantedKeyIds) {
56
+ const found = keyIdsArr.some(k => areKeyIdsEqual(k, keyId));
57
+ if (!found) {
58
+ return false;
59
+ }
60
+ }
61
+ return true;
62
+ }
63
+
64
+ /**
65
+ * Returns `true` if at least one key id in `wantedKeyIds` is present in the
66
+ * `keyIdsArr` array.
67
+ * @param {Array.<Uint8Array>} wantedKeyIds
68
+ * @param {Array.<Uint8Array>} keyIdsArr
69
+ * @returns {boolean}
70
+ */
71
+ export function areSomeKeyIdsContainedIn(
72
+ wantedKeyIds : Uint8Array[],
73
+ keyIdsArr : Uint8Array[]
74
+ ) : boolean {
75
+ for (const keyId of wantedKeyIds) {
76
+ const found = keyIdsArr.some(k => areKeyIdsEqual(k, keyId));
77
+ if (found) {
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { IProcessedProtectionData } from "../types";
18
+ import {
19
+ areKeyIdsEqual,
20
+ areAllKeyIdsContainedIn,
21
+ } from "./key_id_comparison";
22
+
23
+ /**
24
+ * Class storing key-related information linked to a created `MediaKeySession`.
25
+ *
26
+ * This class allows to regroup one or multiple key ids and can be linked to a
27
+ * single MediaKeySession so you can know which key that MediaKeySession
28
+ * handles.
29
+ *
30
+ * The main use case behind the complexities of this `KeySessionRecord` is to
31
+ * better handle the `singleLicensePer` RxPlayer option, which allows the
32
+ * recuperation of a license containing multiple keys, even if only one of
33
+ * those keys was asked for (which in turn allows to reduce the number of
34
+ * requests and to improve performance).
35
+ * Here, the `KeySessionRecord` will regroup all those key's id and can be
36
+ * linked to the corresponding MediaKeySession.
37
+ * That way, you can later check if another encrypted content is compatible with
38
+ * that session through the `KeySessionRecord`'s `isCompatibleWith` method.
39
+ *
40
+ * @example
41
+ * ```js
42
+ * const record = new KeySessionRecord(initData);
43
+ *
44
+ * // Create a MediaKeySession linked to that initialization data and fetch the
45
+ * // license
46
+ * // ...
47
+ *
48
+ * // Once the license has been loaded to the MediaKeySession linked to that
49
+ - // initialization data, associate the license's key Ids with the latter.
50
+ * record.associateKeyIds(someKeyIds);
51
+ *
52
+ * // Function called when new initialization data is encountered
53
+ * function onNewInitializationData(newInitializationData) {
54
+ * if (record.isCompatibleWith(newInitializationData)) {
55
+ * console.log("This initialization data should already be handled, ignored.");
56
+ * } else {
57
+ * console.log("This initialization data is not handled yet.";
58
+ * }
59
+ * }
60
+ * ```
61
+ * @class KeySessionRecord
62
+ */
63
+ export default class KeySessionRecord {
64
+ private readonly _initializationData : IProcessedProtectionData;
65
+ private _keyIds : Uint8Array[] | null;
66
+
67
+ /**
68
+ * Create a new `KeySessionRecord`, linked to its corresponding initialization
69
+ * data,
70
+ * @param {Object} initializationData
71
+ */
72
+ constructor(initializationData : IProcessedProtectionData) {
73
+ this._initializationData = initializationData;
74
+ this._keyIds = null;
75
+ }
76
+
77
+ /**
78
+ * Associate supplementary key ids to this `KeySessionRecord` so it becomes
79
+ * "compatible" to them.
80
+ *
81
+ * After this call, new initialization data linked to subsets of those key
82
+ * ids will be considered compatible to this `KeySessionRecord` (calls to
83
+ * `isCompatibleWith` with the corresponding initialization data will return
84
+ * `true`).
85
+ * @param {Array.<Uint8Array>} keyIds
86
+ */
87
+ public associateKeyIds(
88
+ keyIds : Uint8Array[] | IterableIterator<Uint8Array>
89
+ ) : void {
90
+ if (this._keyIds === null) {
91
+ this._keyIds = [];
92
+ }
93
+ const keyIdsArr = Array.from(keyIds);
94
+ for (const keyId of keyIdsArr) {
95
+ if (!this.isAssociatedWithKeyId(keyId)) {
96
+ this._keyIds.push(keyId);
97
+ }
98
+ }
99
+ }
100
+
101
+ /**
102
+ * @param {Uint8Array} keyId
103
+ * @returns {boolean}
104
+ */
105
+ public isAssociatedWithKeyId(keyId : Uint8Array) : boolean {
106
+ if (this._keyIds === null) {
107
+ return false;
108
+ }
109
+ for (const storedKeyId of this._keyIds) {
110
+ if (areKeyIdsEqual(storedKeyId, keyId)) {
111
+ return true;
112
+ }
113
+ }
114
+ return false;
115
+ }
116
+
117
+ /**
118
+ * @returns {Array.<Uint8Array>}
119
+ */
120
+ public getAssociatedKeyIds() : Uint8Array[] {
121
+ if (this._keyIds === null) {
122
+ return [];
123
+ }
124
+ return this._keyIds;
125
+ }
126
+
127
+ /**
128
+ * Check if that `KeySessionRecord` is compatible to the initialization data
129
+ * given.
130
+ *
131
+ * If it returns `true`, it means that this `KeySessionRecord` is already
132
+ * linked to that initialization data's key. As such, if that
133
+ * `KeySessionRecord` is already associated to an active MediaKeySession for
134
+ * example, the content linked to that initialization data should already be
135
+ * handled.
136
+ *
137
+ * If it returns `false`, it means that this `KeySessionRecord` has no
138
+ * relation with the given initialization data.
139
+ *
140
+ * @param {Object} initializationData
141
+ * @returns {boolean}
142
+ */
143
+ public isCompatibleWith(
144
+ initializationData : IProcessedProtectionData
145
+ ) : boolean {
146
+ const { keyIds } = initializationData;
147
+ if (keyIds !== undefined) {
148
+ if (this._keyIds !== null && areAllKeyIdsContainedIn(keyIds, this._keyIds)) {
149
+ return true;
150
+ }
151
+ if (this._initializationData.keyIds !== undefined) {
152
+ return areAllKeyIdsContainedIn(keyIds, this._initializationData.keyIds);
153
+ }
154
+ }
155
+ return this._checkInitializationDataCompatibility(initializationData);
156
+ }
157
+
158
+ private _checkInitializationDataCompatibility(
159
+ initializationData : IProcessedProtectionData
160
+ ) : boolean {
161
+ if (initializationData.keyIds !== undefined &&
162
+ this._initializationData.keyIds !== undefined)
163
+ {
164
+ return areAllKeyIdsContainedIn(initializationData.keyIds,
165
+ this._initializationData.keyIds);
166
+ }
167
+
168
+ if (this._initializationData.type !== initializationData.type) {
169
+ return false;
170
+ }
171
+
172
+ return this._initializationData.values
173
+ .isCompatibleWith(initializationData.values);
174
+ }
175
+ }