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
@@ -16,15 +16,12 @@
16
16
 
17
17
  import {
18
18
  combineLatest as observableCombineLatest,
19
- EMPTY,
20
- exhaustMap,
21
19
  filter,
22
20
  finalize,
23
21
  ignoreElements,
24
22
  map,
25
23
  merge as observableMerge,
26
24
  mergeMap,
27
- mergeScan,
28
25
  Observable,
29
26
  of as observableOf,
30
27
  share,
@@ -34,7 +31,6 @@ import {
34
31
  switchMap,
35
32
  take,
36
33
  takeUntil,
37
- tap,
38
34
  } from "rxjs";
39
35
  import { shouldReloadMediaSourceOnDecipherabilityUpdate } from "../../compat";
40
36
  import config from "../../config";
@@ -51,9 +47,8 @@ import { PlaybackObserver } from "../api";
51
47
  import {
52
48
  getCurrentKeySystem,
53
49
  IContentProtection,
54
- IEMEManagerEvent,
55
50
  IKeySystemOption,
56
- } from "../eme";
51
+ } from "../decrypt";
57
52
  import {
58
53
  IManifestFetcherParsedResult,
59
54
  IManifestFetcherWarningEvent,
@@ -61,14 +56,15 @@ import {
61
56
  SegmentFetcherCreator,
62
57
  } from "../fetchers";
63
58
  import { ITextTrackSegmentBufferOptions } from "../segment_buffers";
64
- import createEMEManager, {
65
- IEMEDisabledEvent,
66
- } from "./create_eme_manager";
67
59
  import openMediaSource from "./create_media_source";
68
60
  import EVENTS from "./events_generators";
69
61
  import getInitialTime, {
70
62
  IInitialTimeOptions,
71
63
  } from "./get_initial_time";
64
+ import linkDrmAndContent, {
65
+ IDecryptionDisabledEvent,
66
+ IDecryptionReadyEvent,
67
+ } from "./link_drm_and_content";
72
68
  import createMediaSourceLoader from "./load_on_media_source";
73
69
  import manifestUpdateScheduler, {
74
70
  IManifestRefreshSchedulerEvent,
@@ -79,7 +75,11 @@ import {
79
75
  IMediaSourceLoaderEvent,
80
76
  } from "./types";
81
77
 
82
- const { OUT_OF_SYNC_MANIFEST_REFRESH_DELAY } = config;
78
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
79
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
80
+ // leading to linter issues, as it forbids the usage of `any`.
81
+ // This is why we're disabling the eslint rule.
82
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
83
83
 
84
84
  /** Arguments to give to the `InitializeOnMediaSource` function. */
85
85
  export interface IInitializeArguments {
@@ -91,6 +91,8 @@ export interface IInitializeArguments {
91
91
  bufferOptions : {
92
92
  /** Buffer "goal" at which we stop downloading new segments. */
93
93
  wantedBufferAhead : IReadOnlySharedReference<number>;
94
+ /** Buffer maximum size in kiloBytes at which we stop downloading */
95
+ maxVideoBufferSize : IReadOnlySharedReference<number>;
94
96
  /** Max buffer size after the current position, in seconds (we GC further up). */
95
97
  maxBufferAhead : IReadOnlySharedReference<number>;
96
98
  /** Max buffer size before the current position, in seconds (we GC further down). */
@@ -127,7 +129,7 @@ export interface IInitializeArguments {
127
129
  /** Emit the playback rate (speed) set by the user. */
128
130
  speed : IReadOnlySharedReference<number>;
129
131
  /** The configured starting position. */
130
- startAt? : IInitialTimeOptions;
132
+ startAt? : IInitialTimeOptions | undefined;
131
133
  /** Configuration specific to the text track. */
132
134
  textTrackOptions : ITextTrackSegmentBufferOptions;
133
135
  }
@@ -144,7 +146,7 @@ export interface IInitializeArguments {
144
146
  *
145
147
  * - download the content's Manifest and handle its refresh logic
146
148
  *
147
- * - Perform EME management if needed
149
+ * - Perform decryption if needed
148
150
  *
149
151
  * - ask for the choice of the wanted Adaptation through events (e.g. to
150
152
  * choose a language)
@@ -193,26 +195,28 @@ export default function InitializeOnMediaSource(
193
195
  shareReplay({ refCount: true })
194
196
  );
195
197
 
196
- /** Send content protection data to the `EMEManager`. */
198
+ /** Send content protection initialization data. */
197
199
  const protectedSegments$ = new Subject<IContentProtection>();
198
200
 
199
- /** Create `EMEManager`, an observable which will handle content DRM. */
200
- const emeManager$ = createEMEManager(mediaElement,
201
+ /** Initialize decryption capabilities and MediaSource. */
202
+ const drmEvents$ = linkDrmAndContent(mediaElement,
201
203
  keySystems,
202
- protectedSegments$).pipe(
203
- // Because multiple Observables here depend on this Observable as a source,
204
- // we prefer deferring Subscription until those Observables are themselves
205
- // all subscribed to.
206
- // This is needed because `emeManager$` might send events synchronously
207
- // on subscription. In that case, it might communicate those events directly
208
- // after the first Subscription is done, making the next subscription miss
209
- // out on those events, even if that second subscription is done
210
- // synchronously after the first one.
211
- // By calling `deferSubscriptions`, we ensure that subscription to
212
- // `emeManager$` effectively starts after a very short delay, thus
213
- // ensuring that no such race condition can occur.
214
- deferSubscriptions(),
215
- share());
204
+ protectedSegments$,
205
+ openMediaSource$)
206
+ .pipe(
207
+ // Because multiple Observables here depend on this Observable as a source,
208
+ // we prefer deferring Subscription until those Observables are themselves
209
+ // all subscribed to.
210
+ // This is needed because `drmEvents$` might send events synchronously
211
+ // on subscription. In that case, it might communicate those events directly
212
+ // after the first Subscription is done, making the next subscription miss
213
+ // out on those events, even if that second subscription is done
214
+ // synchronously after the first one.
215
+ // By calling `deferSubscriptions`, we ensure that subscription to
216
+ // `drmEvents$` effectively starts after a very short delay, thus
217
+ // ensuring that no such race condition can occur.
218
+ deferSubscriptions(),
219
+ share());
216
220
 
217
221
  /**
218
222
  * Translate errors coming from the media element into RxPlayer errors
@@ -220,71 +224,20 @@ export default function InitializeOnMediaSource(
220
224
  */
221
225
  const mediaError$ = throwOnMediaError(mediaElement);
222
226
 
223
- /**
224
- * Wait for the MediaKeys to have been created before opening the MediaSource,
225
- * after that second step is done, ask the EMEManager to attach the MediaKeys.
226
- * Steps are done in that specific order to avoid compatibility issues.
227
- *
228
- * This Observable will emit when ready both the MediaSource and useful
229
- * DRM-specific information.
230
- */
231
- const prepareMediaSource$ = emeManager$.pipe(
232
- mergeScan((
233
- acc : {
234
- /** set to true once EME APIs have been initialized. */
235
- isEmeReady : boolean;
236
- /**
237
- * ID identifying the current MediaKeys' system ID. Can be used to only
238
- * send initialization data linked to that ID as an optimization measure.
239
- */
240
- drmSystemId? : string;
241
- },
242
- evt : IEMEManagerEvent | IEMEDisabledEvent
243
- ) => {
244
- switch (evt.type) {
245
- case "eme-disabled":
246
- case "attached-media-keys":
247
- return observableOf({ isEmeReady: true,
248
- drmSystemId: acc.drmSystemId });
249
- case "created-media-keys":
250
- const drmSystemId = evt.value.initializationDataSystemId;
251
- return openMediaSource$.pipe(
252
- mergeMap(() => {
253
- // Now that the MediaSource has been opened and linked to the media
254
- // element we can attach the MediaKeys instance to the latter.
255
- evt.value.canAttachMediaKeys.setValue(true);
256
-
257
- // If the `disableMediaKeysAttachmentLock` option has been set to
258
- // `true`, we should not wait until the MediaKeys instance has been
259
- // attached to start loading the content.
260
- // TODO we may want to keep keySystems option knowledge in the EME
261
- // code
262
- const shouldDisableLock = evt.value.options
263
- .disableMediaKeysAttachmentLock === true;
264
- return shouldDisableLock ? observableOf({ isEmeReady: true,
265
- drmSystemId }) :
266
- EMPTY;
267
- }),
268
- startWith({ isEmeReady: false, drmSystemId }));
269
- default:
270
- return EMPTY;
271
- }
272
- }, { isEmeReady: false, drmSystemId: undefined }),
273
- filter((emitted) => emitted.isEmeReady),
274
- take(1),
275
- exhaustMap(({ drmSystemId }) =>
276
- openMediaSource$
277
- .pipe(map((mediaSource) => ({ mediaSource, drmSystemId })))));
227
+ const mediaSourceReady$ = drmEvents$.pipe(
228
+ filter((evt) : evt is IDecryptionReadyEvent<MediaSource> |
229
+ IDecryptionDisabledEvent<MediaSource> =>
230
+ evt.type === "decryption-ready" || evt.type === "decryption-disabled"),
231
+ map(e => e.value),
232
+ take(1));
278
233
 
279
234
  /** Load and play the content asked. */
280
- const loadContent$ = observableCombineLatest([manifest$,
281
- prepareMediaSource$]).pipe(
282
- mergeMap(([manifestEvt, mediaSourceInfo]) => {
235
+ const loadContent$ = observableCombineLatest([manifest$, mediaSourceReady$]).pipe(
236
+ mergeMap(([manifestEvt, { drmSystemId, mediaSource: initialMediaSource } ]) => {
283
237
  if (manifestEvt.type === "warning") {
284
238
  return observableOf(manifestEvt);
285
239
  }
286
240
  const { manifest } = manifestEvt;
287
- const { mediaSource: initialMediaSource, drmSystemId } = mediaSourceInfo;
288
241
 
289
242
  log.debug("Init: Calculating initial time");
290
243
  const initialTime = getInitialTime(manifest, lowLatencyMode, startAt);
@@ -320,25 +273,8 @@ export default function InitializeOnMediaSource(
320
273
  fromEvent(manifest, "decipherabilityUpdate")
321
274
  .pipe(map(EVENTS.decipherabilityUpdate)));
322
275
 
323
- const setUndecipherableRepresentations$ = emeManager$.pipe(
324
- tap((evt) => {
325
- if (evt.type === "keys-update") {
326
- manifest.updateDeciperabilitiesBasedOnKeyIds(evt.value);
327
- } else if (evt.type === "blacklist-protection-data") {
328
- log.info("Init: blacklisting Representations based on protection data.");
329
- manifest.addUndecipherableProtectionData(evt.value);
330
- }
331
- }),
332
- // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
333
- // first type parameter as `any` instead of the perfectly fine `unknown`,
334
- // leading to linter issues, as it forbids the usage of `any`.
335
- // This is why we're disabling the eslint rule.
336
- /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
337
- ignoreElements());
338
-
339
276
  return observableMerge(manifestEvents$,
340
277
  manifestUpdate$,
341
- setUndecipherableRepresentations$,
342
278
  recursiveLoad$)
343
279
  .pipe(startWith(EVENTS.manifestReady(manifest)),
344
280
  finalize(() => { scheduleRefresh$.complete(); }));
@@ -368,6 +304,7 @@ export default function InitializeOnMediaSource(
368
304
  canUseUnsafeMode: true });
369
305
  return null;
370
306
  case "manifest-might-be-out-of-sync":
307
+ const { OUT_OF_SYNC_MANIFEST_REFRESH_DELAY } = config.getCurrent();
371
308
  scheduleRefresh$.next({
372
309
  completeRefresh: true,
373
310
  canUseUnsafeMode: false,
@@ -420,5 +357,5 @@ export default function InitializeOnMediaSource(
420
357
  }
421
358
  }));
422
359
 
423
- return observableMerge(loadContent$, mediaError$, emeManager$);
360
+ return observableMerge(loadContent$, mediaError$, drmEvents$.pipe(ignoreElements()));
424
361
  }
@@ -0,0 +1,176 @@
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
+ map,
19
+ merge as observableMerge,
20
+ Observable,
21
+ Subscription,
22
+ } from "rxjs";
23
+ import {
24
+ events,
25
+ hasEMEAPIs,
26
+ } from "../../compat/";
27
+ import { EncryptedMediaError } from "../../errors";
28
+ import features from "../../features";
29
+ import log from "../../log";
30
+ import {
31
+ IContentProtection,
32
+ IKeySystemOption,
33
+ ContentDecryptorState,
34
+ } from "../decrypt";
35
+ import { IWarningEvent } from "./types";
36
+
37
+ const { onEncrypted$ } = events;
38
+
39
+ /**
40
+ * @param {HTMLMediaElement} mediaElement
41
+ * @param {Array.<Object>} keySystems
42
+ * @param {Observable<Object>} contentProtections$
43
+ * @param {Promise} linkingMedia$
44
+ * @returns {Observable}
45
+ */
46
+ export default function linkDrmAndContent<T>(
47
+ mediaElement : HTMLMediaElement,
48
+ keySystems : IKeySystemOption[],
49
+ contentProtections$ : Observable<IContentProtection>,
50
+ linkingMedia$ : Observable<T>
51
+ ) : Observable<IContentDecryptorInitEvent<T>> {
52
+ const encryptedEvents$ = observableMerge(onEncrypted$(mediaElement),
53
+ contentProtections$);
54
+ if (features.ContentDecryptor == null) {
55
+ return observableMerge(
56
+ encryptedEvents$.pipe(map(() => {
57
+ log.error("Init: Encrypted event but EME feature not activated");
58
+ throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
59
+ "EME feature not activated.");
60
+ })),
61
+ linkingMedia$.pipe(map(mediaSource => ({
62
+ type: "decryption-disabled" as const,
63
+ value: { drmSystemId: undefined, mediaSource },
64
+ }))));
65
+ }
66
+
67
+ if (keySystems.length === 0) {
68
+ return observableMerge(
69
+ encryptedEvents$.pipe(map(() => {
70
+ log.error("Init: Ciphered media and no keySystem passed");
71
+ throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
72
+ "Media is encrypted and no `keySystems` given");
73
+ })),
74
+ linkingMedia$.pipe(map(mediaSource => ({
75
+ type: "decryption-disabled" as const,
76
+ value: { drmSystemId: undefined, mediaSource },
77
+ }))));
78
+ }
79
+
80
+ if (!hasEMEAPIs()) {
81
+ return observableMerge(
82
+ encryptedEvents$.pipe(map(() => {
83
+ log.error("Init: Encrypted event but no EME API available");
84
+ throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
85
+ "Encryption APIs not found.");
86
+ })),
87
+ linkingMedia$.pipe(map(mediaSource => ({
88
+ type: "decryption-disabled" as const,
89
+ value: { drmSystemId: undefined, mediaSource },
90
+ }))));
91
+ }
92
+
93
+ log.debug("Init: Creating ContentDecryptor");
94
+ const ContentDecryptor = features.ContentDecryptor;
95
+ return new Observable((obs) => {
96
+ const contentDecryptor = new ContentDecryptor(mediaElement, keySystems);
97
+
98
+ let mediaSub : Subscription | undefined;
99
+ contentDecryptor.addEventListener("stateChange", (state) => {
100
+ if (state === ContentDecryptorState.WaitingForAttachment) {
101
+ contentDecryptor.removeEventListener("stateChange");
102
+
103
+ mediaSub = linkingMedia$.subscribe(mediaSource => {
104
+ contentDecryptor.addEventListener("stateChange", (newState) => {
105
+ if (newState === ContentDecryptorState.ReadyForContent) {
106
+ obs.next({ type: "decryption-ready",
107
+ value: { drmSystemId: contentDecryptor.systemId,
108
+ mediaSource } });
109
+ contentDecryptor.removeEventListener("stateChange");
110
+ }
111
+ });
112
+
113
+ contentDecryptor.attach();
114
+ });
115
+ }
116
+ });
117
+
118
+ contentDecryptor.addEventListener("error", (e) => {
119
+ obs.error(e);
120
+ });
121
+
122
+ contentDecryptor.addEventListener("warning", (w) => {
123
+ obs.next({ type: "warning", value: w });
124
+ });
125
+
126
+ const protectionDataSub = contentProtections$.subscribe(data => {
127
+ contentDecryptor.onInitializationData(data);
128
+ });
129
+
130
+ return () => {
131
+ protectionDataSub.unsubscribe();
132
+ mediaSub?.unsubscribe();
133
+ contentDecryptor.dispose();
134
+ };
135
+ });
136
+ }
137
+
138
+ export type IContentDecryptorInitEvent<T> = IDecryptionDisabledEvent<T> |
139
+ IDecryptionReadyEvent<T> |
140
+ IWarningEvent;
141
+
142
+ /**
143
+ * Event emitted after deciding that no decryption logic will be launched for
144
+ * the current content.
145
+ */
146
+ export interface IDecryptionDisabledEvent<T> {
147
+ type: "decryption-disabled";
148
+ value: {
149
+ /**
150
+ * Identify the current DRM's system ID.
151
+ * Here `undefined` as no decryption capability has been added.
152
+ */
153
+ drmSystemId: undefined;
154
+ /** The value outputed by the `linkingMedia$` Observable. */
155
+ mediaSource: T;
156
+ };
157
+ }
158
+
159
+ /**
160
+ * Event emitted when decryption capabilities have started and content can
161
+ * begin to be pushed on the HTMLMediaElement.
162
+ */
163
+ export interface IDecryptionReadyEvent<T> {
164
+ type: "decryption-ready";
165
+ value: {
166
+ /**
167
+ * Identify the current DRM's systemId as an hexadecimal string, so the
168
+ * RxPlayer may be able to (optionally) only send the corresponding
169
+ * encryption initialization data.
170
+ * `undefined` if unknown.
171
+ */
172
+ drmSystemId: string | undefined;
173
+ /** The value outputed by the `linkingMedia$` Observable. */
174
+ mediaSource: T;
175
+ };
176
+ }
@@ -38,9 +38,6 @@ import {
38
38
  } from "../fetchers";
39
39
  import { IWarningEvent } from "./types";
40
40
 
41
- const { FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY,
42
- MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE,
43
- MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE } = config;
44
41
 
45
42
  /** Arguments to give to the `manifestUpdateScheduler` */
46
43
  export interface IManifestUpdateSchedulerArguments {
@@ -48,9 +45,9 @@ export interface IManifestUpdateSchedulerArguments {
48
45
  manifestFetcher : ManifestFetcher;
49
46
  /** Information about the initial load of the manifest */
50
47
  initialManifest : { manifest : Manifest;
51
- sendingTime? : number;
52
- receivedTime? : number;
53
- parsingTime? : number; };
48
+ sendingTime? : number | undefined;
49
+ receivedTime? : number | undefined;
50
+ parsingTime? : number | undefined; };
54
51
  /** Minimum interval to keep between Manifest updates */
55
52
  minimumManifestUpdateInterval : number;
56
53
  /** Allows the rest of the code to ask for a Manifest refresh */
@@ -74,7 +71,7 @@ export interface IManifestRefreshSchedulerEvent {
74
71
  * Optional wanted refresh delay, which is the minimum time you want to wait
75
72
  * before updating the Manifest
76
73
  */
77
- delay? : number;
74
+ delay? : number | undefined;
78
75
  /**
79
76
  * Whether the parsing can be done in the more efficient "unsafeMode".
80
77
  * This mode is extremely fast but can lead to de-synchronisation with the
@@ -127,9 +124,9 @@ export default function manifestUpdateScheduler({
127
124
  * encountered.
128
125
  */
129
126
  function handleManifestRefresh$(
130
- { sendingTime, parsingTime, updatingTime } : { sendingTime?: number;
131
- parsingTime? : number;
132
- updatingTime? : number; }
127
+ { sendingTime, parsingTime, updatingTime } : { sendingTime?: number | undefined;
128
+ parsingTime? : number | undefined;
129
+ updatingTime? : number | undefined; }
133
130
  ) : Observable<IWarningEvent> {
134
131
  /**
135
132
  * Total time taken to fully update the last Manifest, in milliseconds.
@@ -139,6 +136,9 @@ export default function manifestUpdateScheduler({
139
136
  parsingTime + (updatingTime ?? 0) :
140
137
  undefined;
141
138
 
139
+ const { MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE,
140
+ MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE } = config.getCurrent();
141
+
142
142
  /**
143
143
  * "unsafeMode" is a mode where we unlock advanced Manifest parsing
144
144
  * optimizations with the added risk to lose some information.
@@ -147,6 +147,7 @@ export default function manifestUpdateScheduler({
147
147
  * Only perform parsing in `unsafeMode` when the last full parsing took a
148
148
  * lot of time and do not go higher than the maximum consecutive time.
149
149
  */
150
+
150
151
  const unsafeModeEnabled = consecutiveUnsafeMode > 0 ?
151
152
  consecutiveUnsafeMode < MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE :
152
153
  totalUpdateTime !== undefined ?
@@ -309,6 +310,7 @@ export default function manifestUpdateScheduler({
309
310
  "unknown error";
310
311
  log.warn(`MUS: Attempt to update Manifest failed: ${message}`,
311
312
  "Re-downloading the Manifest fully");
313
+ const { FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY } = config.getCurrent();
312
314
  return startManualRefreshTimer(FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY,
313
315
  minimumManifestUpdateInterval,
314
316
  newSendingTime)
@@ -44,11 +44,6 @@ import {
44
44
  IWarningEvent,
45
45
  } from "./types";
46
46
 
47
- const { BUFFER_DISCONTINUITY_THRESHOLD,
48
- FORCE_DISCONTINUITY_SEEK_DELAY,
49
- FREEZING_STALLED_DELAY,
50
- UNFREEZING_SEEK_DELAY,
51
- UNFREEZING_DELTA_POSITION } = config;
52
47
 
53
48
  /**
54
49
  * Work-around rounding errors with floating points by setting an acceptable,
@@ -225,6 +220,12 @@ export default function StallAvoider(
225
220
  rebuffering,
226
221
  freezing } = observation;
227
222
 
223
+ const { BUFFER_DISCONTINUITY_THRESHOLD,
224
+ FORCE_DISCONTINUITY_SEEK_DELAY,
225
+ FREEZING_STALLED_DELAY,
226
+ UNFREEZING_SEEK_DELAY,
227
+ UNFREEZING_DELTA_POSITION } = config.getCurrent();
228
+
228
229
  if (freezing !== null) {
229
230
  const now = performance.now();
230
231
 
@@ -28,12 +28,12 @@
28
28
  * @param {Object} evt2
29
29
  * @returns {Boolean}
30
30
  */
31
- function areSameStreamEvents(evt1: { id?: string;
31
+ function areSameStreamEvents(evt1: { id?: string | undefined;
32
32
  start: number;
33
- end?: number; },
34
- evt2: { id?: string;
33
+ end?: number | undefined; },
34
+ evt2: { id?: string | undefined;
35
35
  start: number;
36
- end?: number; }): boolean {
36
+ end?: number | undefined; }): boolean {
37
37
  return evt1.id === evt2.id &&
38
38
  evt1.start === evt2.start &&
39
39
  evt1.end === evt2.end;
@@ -43,7 +43,6 @@ import {
43
43
  IStreamEventPayload,
44
44
  } from "./types";
45
45
 
46
- const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config;
47
46
 
48
47
  /**
49
48
  * Tells if a stream event has a duration
@@ -161,6 +160,8 @@ function streamEventsEmitter(manifest: Manifest,
161
160
  if (!hasEvents) {
162
161
  return EMPTY;
163
162
  }
163
+
164
+ const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config.getCurrent();
164
165
  return observableCombineLatest([
165
166
  interval(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe(startWith(null)),
166
167
  observation$,
@@ -22,7 +22,7 @@ export interface IStreamEventData {
22
22
  }
23
23
 
24
24
  export interface IStreamEventPayload {
25
- id?: string;
25
+ id?: string | undefined;
26
26
  start: number;
27
27
  end: number;
28
28
  data: IStreamEventData;
@@ -30,7 +30,7 @@ export interface IStreamEventPayload {
30
30
  }
31
31
 
32
32
  export interface INonFiniteStreamEventPayload {
33
- id?: string;
33
+ id?: string | undefined;
34
34
  start: number;
35
35
  data: IStreamEventData;
36
36
  publicEvent: IPublicNonFiniteStreamEvent;
@@ -20,17 +20,6 @@ import Manifest, {
20
20
  Period,
21
21
  Representation,
22
22
  } from "../../manifest";
23
- import {
24
- IAttachedMediaKeysEvent,
25
- IBlacklistProtectionDataEvent,
26
- ICreatedMediaKeysEvent,
27
- IEncryptedEvent,
28
- IInitDataIgnoredEvent,
29
- IKeysUpdateEvent,
30
- INoUpdateEvent,
31
- ISessionMessageEvent,
32
- ISessionUpdatedEvent,
33
- } from "../eme";
34
23
  import SegmentBuffersStore from "../segment_buffers";
35
24
  import {
36
25
  IActivePeriodChangedEvent,
@@ -49,7 +38,6 @@ import {
49
38
  IStreamManifestMightBeOutOfSync,
50
39
  IStreamNeedsManifestRefresh,
51
40
  } from "../stream";
52
- import { IEMEDisabledEvent } from "./create_eme_manager";
53
41
  import {
54
42
  IStreamEventEvent,
55
43
  IStreamEventSkipEvent,
@@ -154,19 +142,6 @@ export type IInitEvent = IManifestReadyEvent |
154
142
  IReloadingMediaSourceEvent |
155
143
  IDecipherabilityUpdateEvent |
156
144
  IWarningEvent |
157
- IEMEDisabledEvent |
158
-
159
- // Coming from the `EMEManager`
160
-
161
- IEncryptedEvent |
162
- ICreatedMediaKeysEvent |
163
- IAttachedMediaKeysEvent |
164
- IInitDataIgnoredEvent |
165
- ISessionMessageEvent |
166
- IKeysUpdateEvent |
167
- INoUpdateEvent |
168
- ISessionUpdatedEvent |
169
- IBlacklistProtectionDataEvent |
170
145
 
171
146
  // Coming from the `MediaSourceLoader`
172
147
 
@@ -192,17 +167,4 @@ export type IInitEvent = IManifestReadyEvent |
192
167
  export type IDirectfileEvent = IStalledEvent |
193
168
  IUnstalledEvent |
194
169
  ILoadedEvent |
195
- IWarningEvent |
196
- IEMEDisabledEvent |
197
-
198
- // Coming from the `EMEManager`
199
-
200
- IEncryptedEvent |
201
- ICreatedMediaKeysEvent |
202
- IAttachedMediaKeysEvent |
203
- IInitDataIgnoredEvent |
204
- ISessionMessageEvent |
205
- IKeysUpdateEvent |
206
- INoUpdateEvent |
207
- ISessionUpdatedEvent |
208
- IBlacklistProtectionDataEvent;
170
+ IWarningEvent;
@@ -48,7 +48,6 @@ import {
48
48
  SegmentBufferOperation,
49
49
  } from "../types";
50
50
 
51
- const { SOURCE_BUFFER_FLUSHING_INTERVAL } = config;
52
51
 
53
52
  /**
54
53
  * Item added to the AudioVideoSegmentBuffer's queue before being processed into
@@ -172,6 +171,8 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
172
171
  this._lastInitSegment = null;
173
172
  this.codec = codec;
174
173
 
174
+ const { SOURCE_BUFFER_FLUSHING_INTERVAL } = config.getCurrent();
175
+
175
176
  // Some browsers (happened with firefox 66) sometimes "forget" to send us
176
177
  // `update` or `updateend` events.
177
178
  // In that case, we're completely unable to continue the queue here and