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,145 @@
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 {
18
+ ICustomMediaKeys,
19
+ ICustomMediaKeySystemAccess,
20
+ } from "../../compat";
21
+ import { EncryptedMediaError } from "../../errors";
22
+ import log from "../../log";
23
+ import isNullOrUndefined from "../../utils/is_null_or_undefined";
24
+ import { CancellationSignal } from "../../utils/task_canceller";
25
+ import getMediaKeySystemAccess from "./find_key_system";
26
+ import {
27
+ IKeySystemOption,
28
+ IMediaKeySessionStores,
29
+ } from "./types";
30
+ import LoadedSessionsStore from "./utils/loaded_sessions_store";
31
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
32
+ import PersistentSessionsStore from "./utils/persistent_sessions_store";
33
+ import ServerCertificateStore from "./utils/server_certificate_store";
34
+
35
+ /**
36
+ * @throws {EncryptedMediaError}
37
+ * @param {Object} keySystemOptions
38
+ * @returns {Object|null}
39
+ */
40
+ function createPersistentSessionsStorage(
41
+ keySystemOptions : IKeySystemOption
42
+ ) : PersistentSessionsStore|null {
43
+ if (keySystemOptions.persistentLicense !== true) {
44
+ return null;
45
+ }
46
+
47
+ const { licenseStorage } = keySystemOptions;
48
+ if (licenseStorage == null) {
49
+ throw new EncryptedMediaError("INVALID_KEY_SYSTEM",
50
+ "No license storage found for persistent license.");
51
+ }
52
+
53
+ log.debug("DRM: Set the given license storage");
54
+ return new PersistentSessionsStore(licenseStorage);
55
+ }
56
+
57
+ /** Object returned by `getMediaKeysInfos`. */
58
+ export interface IMediaKeysInfos {
59
+ /** The MediaKeySystemAccess which allowed to create the MediaKeys instance. */
60
+ mediaKeySystemAccess: MediaKeySystemAccess |
61
+ ICustomMediaKeySystemAccess;
62
+ /** The MediaKeys instance. */
63
+ mediaKeys : MediaKeys |
64
+ ICustomMediaKeys;
65
+ /** Stores allowing to create and retrieve MediaKeySessions. */
66
+ stores : IMediaKeySessionStores;
67
+ /** IKeySystemOption compatible to the created MediaKeys instance. */
68
+ options : IKeySystemOption;
69
+ }
70
+
71
+ /**
72
+ * Create a MediaKeys instance and associated structures (or just return the
73
+ * current ones if sufficient) based on a wanted configuration.
74
+ * @param {HTMLMediaElement} mediaElement - The HTMLMediaElement on which you
75
+ * will attach the MediaKeys instance.
76
+ * This Element is here only used to check if the current MediaKeys and
77
+ * MediaKeySystemAccess instances are sufficient
78
+ * @param {Array.<Object>} keySystemsConfigs - The key system configuration.
79
+ * Needed to ask the right MediaKeySystemAccess.
80
+ * @param {Object} cancelSignal - CancellationSignal allowing to cancel the
81
+ * creation of the MediaKeys instance while the task is still pending.
82
+ * @returns {Promise.<Object>}
83
+ */
84
+ export default async function getMediaKeysInfos(
85
+ mediaElement : HTMLMediaElement,
86
+ keySystemsConfigs: IKeySystemOption[],
87
+ cancelSignal : CancellationSignal
88
+ ) : Promise<IMediaKeysInfos> {
89
+ const evt = await getMediaKeySystemAccess(mediaElement,
90
+ keySystemsConfigs,
91
+ cancelSignal);
92
+ if (cancelSignal.cancellationError !== null) {
93
+ throw cancelSignal.cancellationError;
94
+ }
95
+
96
+ const { options, mediaKeySystemAccess } = evt.value;
97
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
98
+ const persistentSessionsStore = createPersistentSessionsStorage(options);
99
+
100
+ if (currentState !== null && evt.type === "reuse-media-key-system-access") {
101
+ const { mediaKeys, loadedSessionsStore } = currentState;
102
+
103
+ // We might just rely on the currently attached MediaKeys instance.
104
+ // First check if server certificate parameters are the same than in the
105
+ // current MediaKeys instance. If not, re-create MediaKeys from scratch.
106
+ if (ServerCertificateStore.hasOne(mediaKeys) === false ||
107
+ (!isNullOrUndefined(options.serverCertificate) &&
108
+ ServerCertificateStore.has(mediaKeys, options.serverCertificate)))
109
+ {
110
+ return { mediaKeys,
111
+ mediaKeySystemAccess,
112
+ stores: { loadedSessionsStore, persistentSessionsStore },
113
+ options };
114
+
115
+ }
116
+ }
117
+
118
+ const mediaKeys = await createMediaKeys(mediaKeySystemAccess);
119
+ log.info("DRM: MediaKeys created with success");
120
+ const loadedSessionsStore = new LoadedSessionsStore(mediaKeys);
121
+ return { mediaKeys,
122
+ mediaKeySystemAccess,
123
+ stores: { loadedSessionsStore, persistentSessionsStore },
124
+ options };
125
+ }
126
+
127
+ /**
128
+ * Create `MediaKeys` from the `MediaKeySystemAccess` given.
129
+ * Throws the right formatted error if it fails.
130
+ * @param {MediaKeySystemAccess} mediaKeySystemAccess
131
+ * @returns {Observable.<MediaKeys>}
132
+ */
133
+ async function createMediaKeys(
134
+ mediaKeySystemAccess : MediaKeySystemAccess | ICustomMediaKeySystemAccess
135
+ ) : Promise<MediaKeys | ICustomMediaKeys> {
136
+ log.info("DRM: Calling createMediaKeys on the MediaKeySystemAccess");
137
+ try {
138
+ const mediaKeys = await mediaKeySystemAccess.createMediaKeys();
139
+ return mediaKeys;
140
+ } catch (error) {
141
+ const message = error instanceof Error ? error.message :
142
+ "Unknown error when creating MediaKeys.";
143
+ throw new EncryptedMediaError("CREATE_MEDIA_KEYS_ERROR", message);
144
+ }
145
+ }
@@ -19,17 +19,20 @@
19
19
  * It always should be imported through the `features` object.
20
20
  */
21
21
 
22
- import clearEMESession from "./clear_eme_session";
23
- import disposeEME from "./dispose_eme";
24
- import EMEManager from "./eme_manager";
22
+ import clearOnStop from "./clear_on_stop";
23
+ import ContentDecryptor, {
24
+ ContentDecryptorState,
25
+ IContentDecryptorEvent,
26
+ } from "./content_decryptor";
27
+ import disposeDecryptionResources from "./dispose_decryption_resources";
25
28
  import getCurrentKeySystem from "./get_current_key_system";
26
- import { IEMEManagerEvent } from "./types";
27
29
  export * from "./types";
28
30
 
29
- export default EMEManager;
31
+ export default ContentDecryptor;
30
32
  export {
31
- clearEMESession,
32
- disposeEME,
33
+ clearOnStop,
34
+ ContentDecryptorState,
35
+ disposeDecryptionResources,
33
36
  getCurrentKeySystem,
34
- IEMEManagerEvent,
37
+ IContentDecryptorEvent,
35
38
  };
@@ -0,0 +1,51 @@
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 log from "../../log";
18
+ import { CancellationSignal } from "../../utils/task_canceller";
19
+ import { disableMediaKeys } from "./attach_media_keys";
20
+ import getMediaKeysInfos, {
21
+ IMediaKeysInfos,
22
+ } from "./get_media_keys";
23
+ import { IKeySystemOption } from "./types";
24
+
25
+ /**
26
+ * Get media keys infos from key system configs then attach media keys to media element.
27
+ * @param {HTMLMediaElement} mediaElement
28
+ * @param {Array.<Object>} keySystemsConfigs
29
+ * @param {Object} cancelSignal
30
+ * @returns {Promise.<Object>}
31
+ */
32
+ export default async function initMediaKeys(
33
+ mediaElement: HTMLMediaElement,
34
+ keySystemsConfigs: IKeySystemOption[],
35
+ cancelSignal: CancellationSignal
36
+ ): Promise<IMediaKeysInfos> {
37
+ const mediaKeysInfo =
38
+ await getMediaKeysInfos(mediaElement, keySystemsConfigs, cancelSignal);
39
+
40
+ const { mediaKeys } = mediaKeysInfo;
41
+ const shouldDisableOldMediaKeys =
42
+ mediaElement.mediaKeys !== null &&
43
+ mediaElement.mediaKeys !== undefined &&
44
+ mediaKeys !== mediaElement.mediaKeys;
45
+
46
+ if (shouldDisableOldMediaKeys) {
47
+ log.debug("DRM: Disabling old MediaKeys");
48
+ disableMediaKeys(mediaElement);
49
+ }
50
+ return mediaKeysInfo;
51
+ }
@@ -21,15 +21,15 @@ import {
21
21
  defer as observableDefer,
22
22
  EMPTY,
23
23
  identity,
24
+ ignoreElements,
24
25
  map,
25
26
  merge as observableMerge,
26
27
  mergeMap,
27
28
  Observable,
28
29
  of as observableOf,
29
- startWith,
30
30
  Subject,
31
- takeUntil,
32
31
  tap,
32
+ takeUntil,
33
33
  timeout,
34
34
  TimeoutError,
35
35
  } from "rxjs";
@@ -49,20 +49,14 @@ import retryObsWithBackoff, {
49
49
  IBackoffOptions,
50
50
  } from "../../utils/rx-retry_with_backoff";
51
51
  import tryCatch from "../../utils/rx-try_catch";
52
- import checkKeyStatuses, {
53
- IKeyStatusesCheckingOptions,
54
- } from "./check_key_statuses";
55
52
  import {
56
- IInitializationDataInfo,
57
53
  IEMEWarningEvent,
58
- IKeyMessageHandledEvent,
59
- IKeyStatusChangeHandledEvent,
60
54
  IKeySystemOption,
61
- IKeysUpdateEvent,
62
- INoUpdateEvent,
63
- ISessionMessageEvent,
64
- ISessionUpdatedEvent,
55
+ ILicense,
65
56
  } from "./types";
57
+ import checkKeyStatuses, {
58
+ IKeyStatusesCheckingOptions,
59
+ } from "./utils/check_key_statuses";
66
60
 
67
61
  const { onKeyError$,
68
62
  onKeyMessage$,
@@ -91,27 +85,20 @@ export class BlacklistedSessionError extends Error {
91
85
  * @param {MediaKeySession} session - The MediaKeySession concerned.
92
86
  * @param {Object} keySystemOptions - The key system options.
93
87
  * @param {String} keySystem - The configuration keySystem used for deciphering
94
- * @param {Object} initializationData - The initialization data linked to that
95
- * session.
96
88
  * @returns {Observable}
97
89
  */
98
90
  export default function SessionEventsListener(
99
91
  session: MediaKeySession | ICustomMediaKeySession,
100
92
  keySystemOptions: IKeySystemOption,
101
- keySystem: string,
102
- initializationData : IInitializationDataInfo
103
- ) : Observable<IEMEWarningEvent |
104
- ISessionMessageEvent |
105
- INoUpdateEvent |
106
- IKeysUpdateEvent |
107
- ISessionUpdatedEvent>
108
- {
109
- log.info("EME: Binding session events", session.sessionId);
93
+ keySystem: string
94
+ ) : Observable<IEMEWarningEvent | IKeysUpdateEvent> {
95
+ log.info("DRM: Binding session events", session.sessionId);
110
96
  const sessionWarningSubject$ = new Subject<IEMEWarningEvent>();
111
97
  const { getLicenseConfig = {} } = keySystemOptions;
112
98
 
113
- const keyErrors : Observable<never> = onKeyError$(session)
114
- .pipe(map((error) => { throw new EncryptedMediaError("KEY_ERROR", error.type); }));
99
+ const keyErrors = onKeyError$(session).pipe(map((error) : never => {
100
+ throw new EncryptedMediaError("KEY_ERROR", error.type);
101
+ }));
115
102
 
116
103
  const keyStatusesChange$ = onKeyStatusesChange$(session)
117
104
  .pipe(mergeMap((keyStatusesEvent: Event) =>
@@ -121,7 +108,6 @@ export default function SessionEventsListener(
121
108
  keyStatusesEvent)));
122
109
 
123
110
  const keyMessages$ : Observable<IEMEWarningEvent |
124
- ISessionMessageEvent |
125
111
  IKeyMessageHandledEvent > =
126
112
  onKeyMessage$(session).pipe(mergeMap((messageEvent: MediaKeyMessageEvent) => {
127
113
  const message = new Uint8Array(messageEvent.message);
@@ -129,7 +115,7 @@ export default function SessionEventsListener(
129
115
  messageEvent.messageType :
130
116
  "license-request";
131
117
 
132
- log.info(`EME: Received message event, type ${messageType}`,
118
+ log.info(`DRM: Received message event, type ${messageType}`,
133
119
  session.sessionId,
134
120
  messageEvent);
135
121
  const getLicense$ = observableDefer(() => {
@@ -156,36 +142,32 @@ export default function SessionEventsListener(
156
142
  if (!isNullOrUndefined(err)) {
157
143
  const { fallbackOnLastTry } = (err as { fallbackOnLastTry? : boolean });
158
144
  if (fallbackOnLastTry === true) {
159
- log.warn("EME: Last `getLicense` attempt failed. " +
145
+ log.warn("DRM: Last `getLicense` attempt failed. " +
160
146
  "Blacklisting the current session.");
161
147
  throw new BlacklistedSessionError(formattedError);
162
148
  }
163
149
  }
164
150
  throw formattedError;
165
- }),
166
- startWith({ type: "session-message" as const,
167
- value: { messageType, initializationData } })
168
- );
151
+ }));
169
152
  }));
170
153
 
171
154
  const sessionUpdates = observableMerge(keyMessages$, keyStatusesChange$)
172
155
  .pipe(concatMap((
173
156
  evt : IEMEWarningEvent |
174
- ISessionMessageEvent |
175
157
  IKeyMessageHandledEvent |
176
158
  IKeysUpdateEvent |
177
159
  IKeyStatusChangeHandledEvent
178
160
  ) : Observable< IEMEWarningEvent |
179
- ISessionMessageEvent |
180
- INoUpdateEvent |
181
- ISessionUpdatedEvent |
182
161
  IKeysUpdateEvent > => {
183
162
  switch (evt.type) {
184
163
  case "key-message-handled":
185
164
  case "key-status-change-handled":
186
- return updateSessionWithMessage(session,
187
- evt.value.license,
188
- initializationData);
165
+ if (isNullOrUndefined(evt.value.license)) {
166
+ log.info("DRM: No message given, skipping session.update");
167
+ return EMPTY;
168
+ }
169
+
170
+ return updateSessionWithMessage(session, evt.value.license);
189
171
  default:
190
172
  return observableOf(evt);
191
173
  }
@@ -266,31 +248,26 @@ function formatGetLicenseError(error: unknown) : ICustomError {
266
248
  * Returns the right event depending on the action taken.
267
249
  * @param {MediaKeySession} session
268
250
  * @param {ArrayBuffer|TypedArray|null} message
269
- * @param {Object} initializationData
270
251
  * @returns {Observable}
271
252
  */
272
253
  function updateSessionWithMessage(
273
254
  session : MediaKeySession | ICustomMediaKeySession,
274
- message : BufferSource | null,
275
- initializationData : IInitializationDataInfo
276
- ) : Observable<INoUpdateEvent | ISessionUpdatedEvent> {
277
- if (isNullOrUndefined(message)) {
278
- log.info("EME: No message given, skipping session.update");
279
- return observableOf({ type: "no-update" as const,
280
- value: { initializationData } });
281
- }
282
-
283
- log.info("EME: Updating MediaKeySession with message");
255
+ message : BufferSource
256
+ ) : Observable<never> {
257
+ log.info("DRM: Updating MediaKeySession with message");
284
258
  return castToObservable(session.update(message)).pipe(
285
259
  catchError((error: unknown) => {
286
260
  const reason = error instanceof Error ? error.toString() :
287
261
  "`session.update` failed";
288
262
  throw new EncryptedMediaError("KEY_UPDATE_ERROR", reason);
289
263
  }),
290
- tap(() => { log.info("EME: MediaKeySession update succeeded."); }),
291
- map(() => ({ type: "session-updated" as const,
292
- value: { session, license: message, initializationData } }))
293
- );
264
+ tap(() => { log.info("DRM: MediaKeySession update succeeded."); }),
265
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
266
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
267
+ // leading to linter issues, as it forbids the usage of `any`.
268
+ // This is why we're disabling the eslint rule.
269
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
270
+ ignoreElements());
294
271
  }
295
272
 
296
273
  /**
@@ -305,7 +282,7 @@ function handleKeyStatusesChangeEvent(
305
282
  keySystem : string,
306
283
  keyStatusesEvent : Event
307
284
  ) : Observable<IKeyStatusChangeHandledEvent | IKeysUpdateEvent | IEMEWarningEvent> {
308
- log.info("EME: keystatuseschange event received", session.sessionId);
285
+ log.info("DRM: keystatuseschange event received", session.sessionId);
309
286
  const callback$ = observableDefer(() => {
310
287
  return tryCatch(() => {
311
288
  if (typeof keySystemOptions.onKeyStatusesChange !== "function") {
@@ -356,3 +333,64 @@ function getLicenseBackoffOptions(
356
333
  value: formatGetLicenseError(error) }),
357
334
  };
358
335
  }
336
+
337
+ /**
338
+ * Some key ids have updated their status.
339
+ *
340
+ * We put them in two different list:
341
+ *
342
+ * - `blacklistedKeyIDs`: Those key ids won't be used for decryption and the
343
+ * corresponding media it decrypts should not be pushed to the buffer
344
+ * Note that a blacklisted key id can become whitelisted in the future.
345
+ *
346
+ * - `whitelistedKeyIds`: Those key ids were found and their corresponding
347
+ * keys are now being considered for decryption.
348
+ * Note that a whitelisted key id can become blacklisted in the future.
349
+ *
350
+ * Note that each `IKeysUpdateEvent` is independent of any other.
351
+ *
352
+ * A new `IKeysUpdateEvent` does not completely replace a previously emitted
353
+ * one, as it can for example be linked to a whole other decryption session.
354
+ *
355
+ * However, if a key id is encountered in both an older and a newer
356
+ * `IKeysUpdateEvent`, only the older status should be considered.
357
+ */
358
+ export interface IKeysUpdateEvent {
359
+ type: "keys-update";
360
+ value: IKeyUpdateValue;
361
+ }
362
+
363
+ /** Information on key ids linked to a MediaKeySession. */
364
+ export interface IKeyUpdateValue {
365
+ /**
366
+ * The list of key ids that are blacklisted.
367
+ * As such, their corresponding keys won't be used by that session, despite
368
+ * the fact that they were part of the pushed license.
369
+ *
370
+ * Reasons for blacklisting a keys depend on options, but mainly involve unmet
371
+ * output restrictions and CDM internal errors linked to that key id.
372
+ */
373
+ blacklistedKeyIDs : Uint8Array[];
374
+ /*
375
+ * The list of key id linked to that session which are not blacklisted.
376
+ * Together with `blacklistedKeyIDs` it regroups all key ids linked to the
377
+ * session.
378
+ */
379
+ whitelistedKeyIds : Uint8Array[];
380
+ }
381
+
382
+ /** Emitted after the `onKeyStatusesChange` callback has been called. */
383
+ interface IKeyStatusChangeHandledEvent {
384
+ type: "key-status-change-handled";
385
+ value: { session: MediaKeySession |
386
+ ICustomMediaKeySession;
387
+ license: ILicense|null; };
388
+ }
389
+
390
+ /** Emitted after the `getLicense` callback has been called */
391
+ interface IKeyMessageHandledEvent {
392
+ type: "key-message-handled";
393
+ value: { session: MediaKeySession |
394
+ ICustomMediaKeySession;
395
+ license: ILicense|null; };
396
+ }
@@ -0,0 +1,104 @@
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 { ICustomMediaKeys } from "../../compat";
18
+ import {
19
+ EncryptedMediaError,
20
+ ICustomError,
21
+ isKnownError,
22
+ } from "../../errors";
23
+ import log from "../../log";
24
+ import ServerCertificateStore from "./utils/server_certificate_store";
25
+
26
+ /**
27
+ * Call the setServerCertificate API with the given certificate.
28
+ * Resolves on success, rejects on failure.
29
+ *
30
+ * TODO Handle returned value?
31
+ * From the spec:
32
+ * - setServerCertificate resolves with true if everything worked
33
+ * - it resolves with false if the CDM does not support server
34
+ * certificates.
35
+ *
36
+ * @param {MediaKeys} mediaKeys
37
+ * @param {ArrayBuffer} serverCertificate
38
+ * @returns {Promise}
39
+ */
40
+ async function setServerCertificate(
41
+ mediaKeys : ICustomMediaKeys|MediaKeys,
42
+ serverCertificate : BufferSource
43
+ ) : Promise<unknown> {
44
+ try {
45
+ const res = await (mediaKeys as MediaKeys).setServerCertificate(serverCertificate);
46
+ // Note: Even if `setServerCertificate` technically should return a
47
+ // Promise.<boolean>, this is not technically always true.
48
+ // Thus we prefer to return unknown here.
49
+ return res;
50
+ } catch (error) {
51
+ log.warn("DRM: mediaKeys.setServerCertificate returned an error", error);
52
+ const reason = error instanceof Error ? error.toString() :
53
+ "`setServerCertificate` error";
54
+ throw new EncryptedMediaError("LICENSE_SERVER_CERTIFICATE_ERROR", reason);
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Call the setCertificate API. If it fails just emit the error as warning
60
+ * and complete.
61
+ * @param {MediaKeys} mediaKeys
62
+ * @param {ArrayBuffer} serverCertificate
63
+ * @returns {Observable}
64
+ */
65
+ export default async function trySettingServerCertificate(
66
+ mediaKeys : ICustomMediaKeys|MediaKeys,
67
+ serverCertificate : BufferSource
68
+ ) : Promise<{ type: "success"; value: unknown } |
69
+ { type: "already-has-one" } |
70
+ { type: "method-not-implemented" } |
71
+ { type: "error"; value: ICustomError }> {
72
+ if (ServerCertificateStore.hasOne(mediaKeys) === true) {
73
+ log.info("DRM: The MediaKeys already has a server certificate, skipping...");
74
+ return { type: "already-has-one" };
75
+ }
76
+ if (typeof mediaKeys.setServerCertificate !== "function") {
77
+ log.warn("DRM: Could not set the server certificate." +
78
+ " mediaKeys.setServerCertificate is not a function");
79
+ return { type: "method-not-implemented" };
80
+ }
81
+
82
+ log.info("DRM: Setting server certificate on the MediaKeys");
83
+ // Because of browser errors, or a user action that can lead to interrupting
84
+ // server certificate setting, we might be left in a status where we don't
85
+ // know if we attached the server certificate or not.
86
+ // Calling `prepare` allow to invalidate temporarily that status.
87
+ ServerCertificateStore.prepare(mediaKeys);
88
+ try {
89
+ const result = await setServerCertificate(mediaKeys, serverCertificate);
90
+ ServerCertificateStore.set(mediaKeys, serverCertificate);
91
+ return { type: "success", value: result };
92
+ } catch (error) {
93
+ const formattedErr = isKnownError(error) ?
94
+ error :
95
+ new EncryptedMediaError("LICENSE_SERVER_CERTIFICATE_ERROR",
96
+ "Unknown error when setting the server certificate.");
97
+ return { type: "error" as const, value: formattedErr };
98
+ }
99
+ }
100
+
101
+ export {
102
+ trySettingServerCertificate,
103
+ setServerCertificate,
104
+ };