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
@@ -0,0 +1,130 @@
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 { ICustomMediaKeySession } from "../../compat";
18
+ import log from "../../log";
19
+ import { CancellationSignal } from "../../utils/task_canceller";
20
+ import createSession from "./create_session";
21
+ import {
22
+ IProcessedProtectionData,
23
+ IMediaKeySessionStores,
24
+ MediaKeySessionLoadingType,
25
+ } from "./types";
26
+ import cleanOldLoadedSessions from "./utils/clean_old_loaded_sessions";
27
+ import isSessionUsable from "./utils/is_session_usable";
28
+ import KeySessionRecord from "./utils/key_session_record";
29
+
30
+ /**
31
+ * Handle MediaEncryptedEvents sent by a HTMLMediaElement:
32
+ * Either create a MediaKeySession, recuperate a previous MediaKeySession or
33
+ * load a persistent session.
34
+ *
35
+ * Some previously created MediaKeySession can be closed in this process to
36
+ * respect the maximum limit of concurrent MediaKeySession, as defined by the
37
+ * `EME_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS` config property.
38
+ *
39
+ * You can refer to the events emitted to know about the current situation.
40
+ * @param {Object} initializationData
41
+ * @param {Object} stores
42
+ * @param {string} wantedSessionType
43
+ * @param {number} maxSessionCacheSize
44
+ * @param {Object} cancelSignal
45
+ * @returns {Promise}
46
+ */
47
+ export default async function createOrLoadSession(
48
+ initializationData : IProcessedProtectionData,
49
+ stores : IMediaKeySessionStores,
50
+ wantedSessionType : MediaKeySessionType,
51
+ maxSessionCacheSize : number,
52
+ cancelSignal : CancellationSignal
53
+ ) : Promise<ICreateOrLoadSessionResult> {
54
+ /** Store previously-loaded compatible MediaKeySession, if one. */
55
+ let previousLoadedSession : MediaKeySession |
56
+ ICustomMediaKeySession |
57
+ null = null;
58
+
59
+ const { loadedSessionsStore, persistentSessionsStore } = stores;
60
+ const entry = loadedSessionsStore.reuse(initializationData);
61
+ if (entry !== null) {
62
+ previousLoadedSession = entry.mediaKeySession;
63
+ if (isSessionUsable(previousLoadedSession)) {
64
+ log.info("DRM: Reuse loaded session", previousLoadedSession.sessionId);
65
+ return { type: MediaKeySessionLoadingType.LoadedOpenSession,
66
+ value: { mediaKeySession: previousLoadedSession,
67
+ sessionType: entry.sessionType,
68
+ keySessionRecord: entry.keySessionRecord } };
69
+ } else if (persistentSessionsStore !== null) {
70
+ // If the session is not usable anymore, we can also remove it from the
71
+ // PersistentSessionsStore.
72
+ // TODO Are we sure this is always what we want?
73
+ if (entry.mediaKeySession.sessionId !== "") {
74
+ persistentSessionsStore.delete(entry.mediaKeySession.sessionId);
75
+ }
76
+ }
77
+ }
78
+
79
+ if (previousLoadedSession !== null) {
80
+ await loadedSessionsStore.closeSession(previousLoadedSession);
81
+ if (cancelSignal.cancellationError !== null) {
82
+ throw cancelSignal.cancellationError; // stop here if cancelled since
83
+ }
84
+ }
85
+
86
+ await cleanOldLoadedSessions(loadedSessionsStore, maxSessionCacheSize);
87
+ if (cancelSignal.cancellationError !== null) {
88
+ throw cancelSignal.cancellationError; // stop here if cancelled since
89
+ }
90
+
91
+ const evt = await createSession(stores, initializationData, wantedSessionType);
92
+ return { type: evt.type,
93
+ value: { mediaKeySession: evt.value.mediaKeySession,
94
+ sessionType: evt.value.sessionType,
95
+ keySessionRecord: evt.value.keySessionRecord } };
96
+ }
97
+
98
+ /** Information concerning a MediaKeySession. */
99
+ export interface IMediaKeySessionContext {
100
+ /** The MediaKeySession itself. */
101
+ mediaKeySession : MediaKeySession |
102
+ ICustomMediaKeySession;
103
+ /** The type of MediaKeySession (e.g. "temporary"). */
104
+ sessionType : MediaKeySessionType;
105
+ /** `KeySessionRecord` assiociated to this MediaKeySession. */
106
+ keySessionRecord : KeySessionRecord;
107
+ }
108
+
109
+ /** Event emitted when a new MediaKeySession has been created. */
110
+ export interface ICreatedSession {
111
+ type : MediaKeySessionLoadingType.Created;
112
+ value : IMediaKeySessionContext;
113
+ }
114
+
115
+ /** Event emitted when an already-loaded MediaKeySession is used. */
116
+ export interface ILoadedOpenSession {
117
+ type : MediaKeySessionLoadingType.LoadedOpenSession;
118
+ value : IMediaKeySessionContext;
119
+ }
120
+
121
+ /** Event emitted when a persistent MediaKeySession has been loaded. */
122
+ export interface ILoadedPersistentSessionEvent {
123
+ type : MediaKeySessionLoadingType.LoadedPersistentSession;
124
+ value : IMediaKeySessionContext;
125
+ }
126
+
127
+ /** Every possible result returned by `createOrLoadSession`. */
128
+ export type ICreateOrLoadSessionResult = ICreatedSession |
129
+ ILoadedOpenSession |
130
+ ILoadedPersistentSessionEvent;
@@ -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 PPromise from "pinkie";
18
+ import {
19
+ ICustomMediaKeySession,
20
+ loadSession,
21
+ } from "../../compat";
22
+ import log from "../../log";
23
+ import {
24
+ IProcessedProtectionData,
25
+ IMediaKeySessionStores,
26
+ MediaKeySessionLoadingType,
27
+ } from "./types";
28
+ import isSessionUsable from "./utils/is_session_usable";
29
+ import KeySessionRecord from "./utils/key_session_record";
30
+ import LoadedSessionsStore from "./utils/loaded_sessions_store";
31
+ import PersistentSessionsStore from "./utils/persistent_sessions_store";
32
+
33
+ /**
34
+ * Create a new Session or load a persistent one on the given MediaKeys,
35
+ * according to wanted settings and what is currently stored.
36
+ *
37
+ * If session creating fails, remove the oldest MediaKeySession loaded and
38
+ * retry.
39
+ *
40
+ * /!\ This only creates new sessions.
41
+ * It will fail if loadedSessionsStore already has a MediaKeySession with
42
+ * the given initialization data.
43
+ * @param {Object} stores
44
+ * @param {Object} initData
45
+ * @param {string} wantedSessionType
46
+ * @returns {Promise}
47
+ */
48
+ export default function createSession(
49
+ stores : IMediaKeySessionStores,
50
+ initData : IProcessedProtectionData,
51
+ wantedSessionType : MediaKeySessionType
52
+ ) : Promise<ICreateSessionEvent> {
53
+ const { loadedSessionsStore,
54
+ persistentSessionsStore } = stores;
55
+
56
+ if (wantedSessionType === "temporary") {
57
+ return createTemporarySession(loadedSessionsStore, initData);
58
+ } else if (persistentSessionsStore === null) {
59
+ log.warn("DRM: Cannot create persistent MediaKeySession, " +
60
+ "PersistentSessionsStore not created.");
61
+ return createTemporarySession(loadedSessionsStore, initData);
62
+ }
63
+ return createAndTryToRetrievePersistentSession(loadedSessionsStore,
64
+ persistentSessionsStore,
65
+ initData);
66
+ }
67
+
68
+ /**
69
+ * Create a new temporary MediaKeySession linked to the given initData and
70
+ * initDataType.
71
+ * @param {Object} loadedSessionsStore
72
+ * @param {Object} initData
73
+ * @returns {Promise}
74
+ */
75
+ function createTemporarySession(
76
+ loadedSessionsStore : LoadedSessionsStore,
77
+ initData : IProcessedProtectionData
78
+ ) : Promise<INewSessionCreatedEvent> {
79
+ log.info("DRM: Creating a new temporary session");
80
+ const entry = loadedSessionsStore.createSession(initData, "temporary");
81
+ return PPromise.resolve({ type: MediaKeySessionLoadingType.Created,
82
+ value: entry });
83
+ }
84
+
85
+ /**
86
+ * Create a persistent MediaKeySession and try to load on it a previous
87
+ * MediaKeySession linked to the same initialization data.
88
+ * @param {Object} loadedSessionsStore
89
+ * @param {Object} persistentSessionsStore
90
+ * @param {Object} initData
91
+ * @returns {Promise}
92
+ */
93
+ async function createAndTryToRetrievePersistentSession(
94
+ loadedSessionsStore : LoadedSessionsStore,
95
+ persistentSessionsStore : PersistentSessionsStore,
96
+ initData : IProcessedProtectionData
97
+ ) : Promise<INewSessionCreatedEvent | IPersistentSessionRecoveryEvent> {
98
+ log.info("DRM: Creating persistent MediaKeySession");
99
+
100
+ const entry = loadedSessionsStore.createSession(initData, "persistent-license");
101
+ const storedEntry = persistentSessionsStore.getAndReuse(initData);
102
+ if (storedEntry === null) {
103
+ return { type: MediaKeySessionLoadingType.Created,
104
+ value: entry };
105
+ }
106
+
107
+ try {
108
+ const hasLoadedSession = await loadSession(entry.mediaKeySession,
109
+ storedEntry.sessionId);
110
+ if (!hasLoadedSession) {
111
+ log.warn("DRM: No data stored for the loaded session");
112
+ persistentSessionsStore.delete(storedEntry.sessionId);
113
+ return { type: MediaKeySessionLoadingType.Created,
114
+ value: entry };
115
+ }
116
+
117
+ if (hasLoadedSession && isSessionUsable(entry.mediaKeySession)) {
118
+ persistentSessionsStore.add(initData, initData.keyIds, entry.mediaKeySession);
119
+ log.info("DRM: Succeeded to load persistent session.");
120
+ return { type: MediaKeySessionLoadingType.LoadedPersistentSession,
121
+ value: entry };
122
+ }
123
+
124
+ // Unusable persistent session: recreate a new session from scratch.
125
+ log.warn("DRM: Previous persistent session not usable anymore.");
126
+ return recreatePersistentSession();
127
+ } catch (err) {
128
+ log.warn("DRM: Unable to load persistent session: " +
129
+ (err instanceof Error ? err.toString() :
130
+ "Unknown Error"));
131
+ return recreatePersistentSession();
132
+ }
133
+
134
+ /**
135
+ * Helper function to close and restart the current persistent session
136
+ * considered, and re-create it from scratch.
137
+ * @returns {Observable}
138
+ */
139
+ async function recreatePersistentSession() : Promise<INewSessionCreatedEvent> {
140
+ log.info("DRM: Removing previous persistent session.");
141
+ const persistentEntry = persistentSessionsStore.get(initData);
142
+ if (persistentEntry !== null) {
143
+ persistentSessionsStore.delete(persistentEntry.sessionId);
144
+ }
145
+
146
+ await loadedSessionsStore.closeSession(entry.mediaKeySession);
147
+ const newEntry = loadedSessionsStore.createSession(initData,
148
+ "persistent-license");
149
+ return { type: MediaKeySessionLoadingType.Created,
150
+ value: newEntry };
151
+ }
152
+ }
153
+
154
+ export interface INewSessionCreatedEvent {
155
+ type : MediaKeySessionLoadingType.Created;
156
+ value : {
157
+ mediaKeySession : MediaKeySession |
158
+ ICustomMediaKeySession;
159
+ sessionType : MediaKeySessionType;
160
+ keySessionRecord : KeySessionRecord;
161
+ };
162
+ }
163
+
164
+ export interface IPersistentSessionRecoveryEvent {
165
+ type : MediaKeySessionLoadingType.LoadedPersistentSession;
166
+ value : {
167
+ mediaKeySession : MediaKeySession |
168
+ ICustomMediaKeySession;
169
+ sessionType : MediaKeySessionType;
170
+ keySessionRecord : KeySessionRecord;
171
+ };
172
+ }
173
+
174
+ export type ICreateSessionEvent = INewSessionCreatedEvent |
175
+ IPersistentSessionRecoveryEvent;
@@ -0,0 +1,39 @@
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 { setMediaKeys } from "../../compat";
18
+ import log from "../../log";
19
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
20
+
21
+ /**
22
+ * Free up all ressources taken by the content decryption logic.
23
+ * @param {HTMLMediaElement} mediaElement
24
+ * @returns {Promise}
25
+ */
26
+ export default async function disposeDecryptionResources(
27
+ mediaElement : HTMLMediaElement
28
+ ) : Promise<void> {
29
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
30
+ if (currentState === null) {
31
+ return ;
32
+ }
33
+
34
+ log.info("DRM: Disposing of the current MediaKeys");
35
+ const { loadedSessionsStore } = currentState;
36
+ MediaKeysInfosStore.clearState(mediaElement);
37
+ await loadedSessionsStore.closeAllSessions();
38
+ setMediaKeys(mediaElement, null);
39
+ }
@@ -14,14 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- catchError,
19
- defer as observableDefer,
20
- map,
21
- Observable,
22
- of as observableOf,
23
- throwError as observableThrow,
24
- } from "rxjs";
25
17
  import {
26
18
  ICustomMediaKeySystemAccess,
27
19
  requestMediaKeySystemAccess,
@@ -32,8 +24,10 @@ import { EncryptedMediaError } from "../../errors";
32
24
  import log from "../../log";
33
25
  import arrayIncludes from "../../utils/array_includes";
34
26
  import flatMap from "../../utils/flat_map";
35
- import MediaKeysInfosStore from "./media_keys_infos_store";
27
+ import PPromise from "../../utils/promise";
28
+ import { CancellationSignal } from "../../utils/task_canceller";
36
29
  import { IKeySystemOption } from "./types";
30
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
37
31
 
38
32
  type MediaKeysRequirement = "optional" |
39
33
  "required" |
@@ -65,8 +59,6 @@ interface IKeySystemType { keyName : string | undefined;
65
59
  keyType : string;
66
60
  keySystemOptions : IKeySystemOption; }
67
61
 
68
- const { EME_DEFAULT_WIDEVINE_ROBUSTNESSES,
69
- EME_KEY_SYSTEMS } = config;
70
62
 
71
63
  /**
72
64
  * @param {Array.<Object>} keySystems
@@ -121,6 +113,7 @@ function checkCachedMediaKeySystemAccess(
121
113
  * @returns {string|undefined} - Either the canonical name, or undefined.
122
114
  */
123
115
  function findKeySystemCanonicalName(ksType: string) : string | undefined {
116
+ const { EME_KEY_SYSTEMS } = config.getCurrent();
124
117
  for (const ksName of Object.keys(EME_KEY_SYSTEMS)) {
125
118
  if (arrayIncludes(EME_KEY_SYSTEMS[ksName] as string[], ksType)) {
126
119
  return ksName;
@@ -158,6 +151,7 @@ function buildKeySystemConfigurations(
158
151
  if (keySystem.distinctiveIdentifierRequired === true) {
159
152
  distinctiveIdentifier = "required";
160
153
  }
154
+ const { EME_DEFAULT_WIDEVINE_ROBUSTNESSES } = config.getCurrent();
161
155
 
162
156
  // Set robustness, in order of consideration:
163
157
  // 1. the user specified its own robustnesses
@@ -192,21 +186,23 @@ function buildKeySystemConfigurations(
192
186
  // More details here:
193
187
  // https://storage.googleapis.com/wvdocs/Chrome_EME_Changes_and_Best_Practices.pdf
194
188
  // https://www.w3.org/TR/encrypted-media/#get-supported-configuration-and-consent
189
+
195
190
  const videoCapabilities: IMediaCapability[] =
196
- flatMap(videoRobustnesses,
197
- robustness => [{ contentType: "video/mp4;codecs=\"avc1.4d401e\"",
198
- robustness },
199
- { contentType: "video/mp4;codecs=\"avc1.42e01e\"",
200
- robustness },
201
- { contentType: "video/webm;codecs=\"vp8\"",
202
- robustness } ]);
191
+ flatMap(audioRobustnesses, (robustness) =>
192
+ ["video/mp4;codecs=\"avc1.4d401e\"",
193
+ "video/mp4;codecs=\"avc1.42e01e\"",
194
+ "video/webm;codecs=\"vp8\""].map(contentType => {
195
+ return robustness !== undefined ? { contentType, robustness } :
196
+ { contentType };
197
+ }));
203
198
 
204
199
  const audioCapabilities: IMediaCapability[] =
205
- flatMap(audioRobustnesses,
206
- robustness => [{ contentType: "audio/mp4;codecs=\"mp4a.40.2\"",
207
- robustness },
208
- { contentType: "audio/webm;codecs=opus",
209
- robustness } ]);
200
+ flatMap(audioRobustnesses, (robustness) =>
201
+ ["audio/mp4;codecs=\"mp4a.40.2\"",
202
+ "audio/webm;codecs=opus"].map(contentType => {
203
+ return robustness !== undefined ? { contentType, robustness } :
204
+ { contentType };
205
+ }));
210
206
 
211
207
  // TODO Re-test with a set contentType but an undefined robustness on the
212
208
  // STBs on which this problem was found.
@@ -233,128 +229,124 @@ function buildKeySystemConfigurations(
233
229
  /**
234
230
  * Try to find a compatible key system from the keySystems array given.
235
231
  *
236
- * Returns an Observable which, when subscribed to, will request a
237
- * MediaKeySystemAccess based on the various keySystems provided. This
238
- * Observable will:
239
- * - emit the MediaKeySystemAccess and the keySystems as an object, when
240
- * found. The object is under this form:
241
- * {
242
- * keySystemAccess {MediaKeySystemAccess}
243
- * keySystem {Object}
244
- * }
245
- * - complete immediately after emitting.
246
- * - throw if no compatible key system has been found.
232
+ * This function will request a MediaKeySystemAccess based on the various
233
+ * keySystems provided.
234
+ *
235
+ * This Promise might either:
236
+ * - resolves the MediaKeySystemAccess and the keySystems as an object, when
237
+ * found.
238
+ * - reject if no compatible key system has been found.
247
239
  *
248
240
  * @param {HTMLMediaElement} mediaElement
249
241
  * @param {Array.<Object>} keySystems - The keySystems you want to test.
250
- * @returns {Observable}
242
+ * @param {Object} cancelSignal
243
+ * @returns {Promise.<Object>}
251
244
  */
252
245
  export default function getMediaKeySystemAccess(
253
246
  mediaElement : HTMLMediaElement,
254
- keySystemsConfigs: IKeySystemOption[]
255
- ) : Observable<IFoundMediaKeySystemAccessEvent> {
256
- return observableDefer<Observable<IFoundMediaKeySystemAccessEvent>>(() => {
257
- log.info("EME: Searching for compatible MediaKeySystemAccess");
258
- const currentState = MediaKeysInfosStore.getState(mediaElement);
259
- if (currentState != null) {
260
- // Fast way to find a compatible keySystem if the currently loaded
261
- // one as exactly the same compatibility options.
262
- const cachedKeySystemAccess =
263
- checkCachedMediaKeySystemAccess(keySystemsConfigs,
264
- currentState.mediaKeySystemAccess,
265
- currentState.keySystemOptions);
266
- if (cachedKeySystemAccess !== null) {
267
- log.info("EME: Found cached compatible keySystem");
268
- return observableOf({
269
- type: "reuse-media-key-system-access" as const,
270
- value: { mediaKeySystemAccess: cachedKeySystemAccess.keySystemAccess,
271
- options: cachedKeySystemAccess.keySystemOptions },
272
- });
273
- }
247
+ keySystemsConfigs: IKeySystemOption[],
248
+ cancelSignal : CancellationSignal
249
+ ) : Promise<IFoundMediaKeySystemAccessEvent> {
250
+ log.info("DRM: Searching for compatible MediaKeySystemAccess");
251
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
252
+ if (currentState != null) {
253
+ // Fast way to find a compatible keySystem if the currently loaded
254
+ // one as exactly the same compatibility options.
255
+ const cachedKeySystemAccess =
256
+ checkCachedMediaKeySystemAccess(keySystemsConfigs,
257
+ currentState.mediaKeySystemAccess,
258
+ currentState.keySystemOptions);
259
+ if (cachedKeySystemAccess !== null) {
260
+ log.info("DRM: Found cached compatible keySystem");
261
+ return PPromise.resolve({
262
+ type: "reuse-media-key-system-access" as const,
263
+ value: { mediaKeySystemAccess: cachedKeySystemAccess.keySystemAccess,
264
+ options: cachedKeySystemAccess.keySystemOptions },
265
+ });
274
266
  }
267
+ }
275
268
 
276
- /**
277
- * Array of set keySystems for this content.
278
- * Each item of this array is an object containing the following keys:
279
- * - keyName {string}: keySystem canonical name (e.g. "widevine")
280
- * - keyType {string}: keySystem type (e.g. "com.widevine.alpha")
281
- * - keySystem {Object}: the original keySystem object
282
- * @type {Array.<Object>}
283
- */
284
- const keySystemsType: IKeySystemType[] = keySystemsConfigs.reduce(
285
- (arr: IKeySystemType[], keySystemOptions) => {
286
-
287
- const managedRDNs = EME_KEY_SYSTEMS[keySystemOptions.type];
288
- let ksType;
289
-
290
- if (managedRDNs != null) {
291
- ksType = managedRDNs.map((keyType) => {
292
- const keyName = keySystemOptions.type;
293
- return { keyName, keyType, keySystemOptions };
294
- });
295
- }
296
- else {
297
- const keyName = findKeySystemCanonicalName(keySystemOptions.type);
298
- const keyType = keySystemOptions.type;
299
- ksType = [{ keyName, keyType, keySystemOptions }];
300
- }
301
-
302
- return arr.concat(ksType);
269
+ /**
270
+ * Array of set keySystems for this content.
271
+ * Each item of this array is an object containing the following keys:
272
+ * - keyName {string}: keySystem canonical name (e.g. "widevine")
273
+ * - keyType {string}: keySystem type (e.g. "com.widevine.alpha")
274
+ * - keySystem {Object}: the original keySystem object
275
+ * @type {Array.<Object>}
276
+ */
277
+ const keySystemsType: IKeySystemType[] = keySystemsConfigs.reduce(
278
+ (arr: IKeySystemType[], keySystemOptions) => {
279
+
280
+ const { EME_KEY_SYSTEMS } = config.getCurrent();
281
+ const managedRDNs = EME_KEY_SYSTEMS[keySystemOptions.type];
282
+ let ksType;
283
+
284
+ if (managedRDNs != null) {
285
+ ksType = managedRDNs.map((keyType) => {
286
+ const keyName = keySystemOptions.type;
287
+ return { keyName, keyType, keySystemOptions };
288
+ });
303
289
  }
304
- , []);
305
-
306
- return recursivelyTestKeySystems(0);
307
-
308
- /**
309
- * Test all key system configuration stored in `keySystemsType` one by one
310
- * recursively.
311
- * Returns an Observable which emit the MediaKeySystemAccess if one was
312
- * found compatible with one of the configurations or just throws if none
313
- * were found to be compatible.
314
- * @param {Number} index - The index in `keySystemsType` to start from.
315
- * Should be set to `0` when calling directly.
316
- * @returns {Observable}
317
- */
318
- function recursivelyTestKeySystems(
319
- index : number
320
- ) : Observable<IFoundMediaKeySystemAccessEvent> {
321
- // if we iterated over the whole keySystemsType Array, quit on error
322
- if (index >= keySystemsType.length) {
323
- const error = new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS",
324
- "No key system compatible with your " +
325
- "wanted configuration has been found " +
326
- "in the current browser.");
327
- return observableThrow(() => error);
290
+ else {
291
+ const keyName = findKeySystemCanonicalName(keySystemOptions.type);
292
+ const keyType = keySystemOptions.type;
293
+ ksType = [{ keyName, keyType, keySystemOptions }];
328
294
  }
329
295
 
330
- if (requestMediaKeySystemAccess == null) {
331
- const error = Error("requestMediaKeySystemAccess is not " +
332
- "implemented in your browser.");
333
- return observableThrow(() => error);
334
- }
296
+ return arr.concat(ksType);
297
+ }
298
+ , []);
299
+
300
+ return recursivelyTestKeySystems(0);
301
+
302
+ /**
303
+ * Test all key system configuration stored in `keySystemsType` one by one
304
+ * recursively.
305
+ * Returns a Promise which will emit the MediaKeySystemAccess if one was
306
+ * found compatible with one of the configurations or just reject if none
307
+ * were found to be compatible.
308
+ * @param {Number} index - The index in `keySystemsType` to start from.
309
+ * Should be set to `0` when calling directly.
310
+ * @returns {Promise.<Object>}
311
+ */
312
+ async function recursivelyTestKeySystems(
313
+ index : number
314
+ ) : Promise<IFoundMediaKeySystemAccessEvent> {
315
+ // if we iterated over the whole keySystemsType Array, quit on error
316
+ if (index >= keySystemsType.length) {
317
+ throw new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS",
318
+ "No key system compatible with your wanted " +
319
+ "configuration has been found in the current " +
320
+ "browser.");
321
+
322
+ }
335
323
 
336
- const { keyName, keyType, keySystemOptions } = keySystemsType[index];
337
-
338
- const keySystemConfigurations = buildKeySystemConfigurations(keyName,
339
- keySystemOptions);
340
-
341
- log.debug(`EME: Request keysystem access ${keyType},` +
342
- `${index + 1} of ${keySystemsType.length}`,
343
- keySystemConfigurations);
344
-
345
- return requestMediaKeySystemAccess(keyType, keySystemConfigurations).pipe(
346
- map((keySystemAccess) => {
347
- log.info("EME: Found compatible keysystem", keyType, keySystemConfigurations);
348
- return { type: "create-media-key-system-access" as const,
349
- value: { options: keySystemOptions,
350
- mediaKeySystemAccess: keySystemAccess } };
351
- }),
352
- catchError(() => {
353
- log.debug("EME: Rejected access to keysystem",
354
- keyType,
355
- keySystemConfigurations);
356
- return recursivelyTestKeySystems(index + 1);
357
- }));
324
+ if (requestMediaKeySystemAccess == null) {
325
+ throw new Error("requestMediaKeySystemAccess is not implemented in your browser.");
358
326
  }
359
- });
327
+
328
+ const { keyName, keyType, keySystemOptions } = keySystemsType[index];
329
+
330
+ const keySystemConfigurations = buildKeySystemConfigurations(keyName,
331
+ keySystemOptions);
332
+
333
+ log.debug(`DRM: Request keysystem access ${keyType},` +
334
+ `${index + 1} of ${keySystemsType.length}`,
335
+ keySystemConfigurations);
336
+
337
+ try {
338
+ const keySystemAccess = await requestMediaKeySystemAccess(keyType,
339
+ keySystemConfigurations);
340
+ log.info("DRM: Found compatible keysystem", keyType, keySystemConfigurations);
341
+ return { type: "create-media-key-system-access" as const,
342
+ value: { options: keySystemOptions,
343
+ mediaKeySystemAccess: keySystemAccess } };
344
+ } catch (_) {
345
+ log.debug("DRM: Rejected access to keysystem", keyType, keySystemConfigurations);
346
+ if (cancelSignal.cancellationError !== null) {
347
+ throw cancelSignal.cancellationError;
348
+ }
349
+ return recursivelyTestKeySystems(index + 1);
350
+ }
351
+ }
360
352
  }
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import MediaKeysInfosStore from "./media_keys_infos_store";
17
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
18
18
 
19
19
  /**
20
20
  * Returns the name of the current key system used.