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
package/src/README.md CHANGED
@@ -33,12 +33,12 @@ To better understand the player's architecture, you can find below a
33
33
  Facilitate track V ~ | ~ Abstract the streaming ^ ~
34
34
  switching for +---------------+ | ~ protocol | ~
35
35
  the API | | | V | ~
36
- +--------------+ | | +--------------------------+ | ~
37
- | | | Init | ------> | | | ~
38
- | EMEManager | <------ | (./core/init) | <~~~~~~ | Manifest Fetcher | | ~
39
- | (./core/eme) | ~~~~~~> | | |(./core/fetchers/manifest)| | ~
40
- | | | | | | | ~
41
- +--------------+ +---------------+ +--------------------------+ | ~
36
+ +----------------+ | | +--------------------------+ | ~
37
+ | Content | | Init | ------> | | | ~
38
+ | Decryptor | <---- | (./core/init) | <~~~~~~ | Manifest Fetcher | | ~
39
+ |(./core/decrypt)| ~~~~> | | |(./core/fetchers/manifest)| | ~
40
+ | | | | | | | ~
41
+ +----------------+ +---------------+ +--------------------------+ | ~
42
42
  Negotiate content | ^ Initialize Load and refresh the Manifest | ~
43
43
  decryption | ~ playback and | ~
44
44
  | ~ create/connect | ~
@@ -23,15 +23,15 @@
23
23
 
24
24
  interface IFakeDocument {
25
25
  createElement(eltType: string) : HTMLElement;
26
- fullscreenElement? : Element | null;
27
- mozCancelFullScreen? : () => void;
28
- mozFullScreenElement? : HTMLElement;
29
- msExitFullscreen? : () => void;
30
- exitFullscreen? : () => void;
31
- msFullscreenElement? : Element | null;
26
+ fullscreenElement? : Element | null | undefined;
27
+ mozCancelFullScreen? : (() => void) | undefined;
28
+ mozFullScreenElement? : HTMLElement | undefined;
29
+ msExitFullscreen? : (() => void) | undefined;
30
+ exitFullscreen? : (() => void) | undefined;
31
+ msFullscreenElement? : Element | null | undefined;
32
32
  webkitExitFullscreen : () => void;
33
33
  webkitFullscreenElement : Element | null | undefined;
34
- webkitHidden? : boolean;
34
+ webkitHidden? : boolean | undefined;
35
35
  }
36
36
 
37
37
  const doc = document as unknown as IFakeDocument;
@@ -63,7 +63,7 @@ describe("Compat - isVTTCue", () => {
63
63
  const originalVTTCue = window.VTTCue;
64
64
  win.VTTCue = MockVTTCue;
65
65
  const cue = new VTTCue(0, 10, "");
66
- win.VTTCue = undefined;
66
+ delete win.VTTCue;
67
67
  const isVTTCue = require("../is_vtt_cue").default;
68
68
  expect(isVTTCue(cue)).toEqual(false);
69
69
  window.VTTCue = originalVTTCue;
@@ -40,27 +40,66 @@ describe("compat - shouldFavourSafariMediaKeys", () => {
40
40
  it("should return false if we are not on Safari", () => {
41
41
  jest.mock("../browser_detection", () => {
42
42
  return { __esModule: true as const,
43
- isSafari: false };
43
+ isSafariDesktop: false,
44
+ isSafariMobile: false };
44
45
  });
45
46
  const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
46
47
  expect(shouldFavourCustomSafariEME.default()).toBe(false);
47
48
  });
48
49
 
49
50
  /* eslint-disable max-len */
50
- it("should return false if we are on Safari but WekitMediaKeys is not available", () => {
51
+ it("should return false if we are on Safari Desktop but WekitMediaKeys is not available", () => {
51
52
  /* eslint-enable max-len */
52
53
 
53
54
  win.WebKitMediaKeys = undefined;
54
55
  jest.mock("../browser_detection", () => {
55
56
  return { __esModule: true as const,
56
- isSafari: true };
57
+ isSafariDesktop: true,
58
+ isSafariMobile: false };
57
59
  });
58
60
  const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
59
61
  expect(shouldFavourCustomSafariEME.default()).toBe(false);
60
62
  });
61
63
 
62
64
  /* eslint-disable max-len */
63
- it("should return true if we are on Safari and a WebKitMediaKeys implementation is available", () => {
65
+ it("should return false if we are on Safari Mobile but WekitMediaKeys is not available", () => {
66
+ /* eslint-enable max-len */
67
+
68
+ win.WebKitMediaKeys = undefined;
69
+ jest.mock("../browser_detection", () => {
70
+ return { __esModule: true as const,
71
+ isSafariDesktop: false,
72
+ isSafariMobile: true };
73
+ });
74
+ const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
75
+ expect(shouldFavourCustomSafariEME.default()).toBe(false);
76
+ });
77
+
78
+ /* eslint-disable max-len */
79
+ it("should return true if we are on Safari Desktop and a WebKitMediaKeys implementation is available", () => {
80
+ /* eslint-enable max-len */
81
+
82
+ win.WebKitMediaKeys = {
83
+ isTypeSupported: () => ({}),
84
+ prototype: {
85
+ createSession: () => ({}),
86
+ },
87
+ };
88
+ const proto = win.HTMLMediaElement.prototype as unknown as {
89
+ webkitSetMediaKeys : () => Record<string, never>;
90
+ };
91
+ proto.webkitSetMediaKeys = () => ({});
92
+ jest.mock("../browser_detection", () => {
93
+ return { __esModule: true as const,
94
+ isSafariDesktop: true,
95
+ isSafariMobile: false };
96
+ });
97
+ const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
98
+ expect(shouldFavourCustomSafariEME.default()).toBe(true);
99
+ });
100
+
101
+ /* eslint-disable max-len */
102
+ it("should return true if we are on Safari Mobile and a WebKitMediaKeys implementation is available", () => {
64
103
  /* eslint-enable max-len */
65
104
 
66
105
  win.WebKitMediaKeys = {
@@ -75,7 +114,8 @@ describe("compat - shouldFavourSafariMediaKeys", () => {
75
114
  proto.webkitSetMediaKeys = () => ({});
76
115
  jest.mock("../browser_detection", () => {
77
116
  return { __esModule: true as const,
78
- isSafari: true };
117
+ isSafariDesktop: false,
118
+ isSafariMobile: true };
79
119
  });
80
120
  const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
81
121
  expect(shouldFavourCustomSafariEME.default()).toBe(true);
@@ -54,13 +54,15 @@ interface ISafariWindowObject extends Window {
54
54
  safari? : { pushNotification? : { toString() : string } };
55
55
  }
56
56
 
57
- const isSafari : boolean =
57
+ /** `true` on Safari on a PC platform (i.e. not iPhone / iPad etc.) */
58
+ const isSafariDesktop : boolean =
58
59
  !isNode && (
59
60
  Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor") >= 0 ||
60
61
  (window as ISafariWindowObject).safari?.pushNotification?.toString() ===
61
62
  "[object SafariRemoteNotification]"
62
63
  );
63
64
 
65
+ /** `true` on Safari on an iPhone, iPad & iPod platform */
64
66
  const isSafariMobile : boolean = !isNode &&
65
67
  typeof navigator.platform === "string" &&
66
68
  /iPad|iPhone|iPod/.test(navigator.platform);
@@ -70,7 +72,7 @@ export {
70
72
  isIE11,
71
73
  isIEOrEdge,
72
74
  isFirefox,
73
- isSafari,
75
+ isSafariDesktop,
74
76
  isSafariMobile,
75
77
  isSamsungBrowser,
76
78
  isTizen,
@@ -14,65 +14,99 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- catchError,
19
- map,
20
- mergeMap,
21
- Observable,
22
- of as observableOf,
23
- race as observableRace,
24
- timer as observableTimer,
25
- } from "rxjs";
26
- import castToObservable from "../../utils/cast_to_observable";
17
+ import log from "../../log";
18
+ import cancellableSleep from "../../utils/cancellable_sleep";
19
+ import PPromise from "../../utils/promise";
20
+ import TaskCanceller, {
21
+ CancellationError,
22
+ } from "../../utils/task_canceller";
27
23
  import { ICustomMediaKeySession } from "./custom_media_keys";
28
24
 
29
25
  /**
30
- * Close session and returns and observable that emits when
31
- * the session is closed.
26
+ * Close the given `MediaKeySession` and returns a Promise resolving when the
27
+ * session is closed.
28
+ * This promise does not reject, even if we're unable to close the
29
+ * `MediaKeySession`.
30
+ *
31
+ * Note that there is a lot of browser issues linked to the impossibility to
32
+ * either close a MediaKeySession or to know if a MediaKeySession was closed.
33
+ * Due to this, the returned Promise might take some time before resolving on
34
+ * some devices.
32
35
  * @param {MediaKeySession|Object} session
33
- * @returns {Observable}
36
+ * @returns {Promise.<undefined>}
34
37
  */
35
- export default function closeSession$(
36
- session: MediaKeySession|ICustomMediaKeySession
37
- ): Observable<unknown> {
38
- return observableRace(
39
- castToObservable(session.close()),
40
- // If the session is not closed after 1000ms, try
41
- // to call another method on session to guess if
42
- // session is closed or not.
43
- observableTimer(1000).pipe(
44
- mergeMap(() => {
45
- const tryToUpdateSession$ = castToObservable(
46
- session.update(new Uint8Array(1))
47
- );
48
- return tryToUpdateSession$.pipe(
49
- // Update has resolved, so we can't know if session is closed
50
- map(() => { throw new Error("Compat: Couldn't know if session is " +
51
- "closed"); }),
52
- catchError((err : unknown) => {
53
- // The caught error can tell if session is closed
54
- // (Chrome may throw this error)
55
- if (err instanceof Error &&
56
- err.message === "The session is already closed."
57
- ) {
58
- return observableOf(null);
59
- }
60
- // The `closed` promise may resolve, even if `close()` result has not
61
- // (it may happen on Firefox). Wait for it and timeout after 1 second.
62
- // TODO There is a subtle TypeScript issue there that made casting to
63
- // a type-compatible type mandatory. If a more elegant solution can
64
- // be found, it should be preffered.
65
- const sessionIsClosed$ = castToObservable(session.closed as Promise<unknown>);
66
- return observableRace(
67
- sessionIsClosed$,
68
- observableTimer(1000).pipe(
69
- map(() => { throw new Error("Compat: Couldn't know if session is " +
70
- "closed"); })
71
- )
72
- );
73
- })
74
- );
75
- })
76
- )
77
- );
38
+ export default function closeSession(
39
+ session: MediaKeySession | ICustomMediaKeySession
40
+ ): Promise<void> {
41
+ const timeoutCanceller = new TaskCanceller();
42
+
43
+ return PPromise.race([
44
+ session.close()
45
+ .then(() => { timeoutCanceller.cancel(); }),
46
+ // The `closed` promise may resolve, even if `close()` result has not
47
+ // (seen at some point on Firefox).
48
+ session.closed
49
+ .then(() => { timeoutCanceller.cancel(); }),
50
+ waitTimeoutAndCheck(),
51
+ ]);
52
+
53
+ /**
54
+ * If the session is not closed after 1000ms, try to communicate with the
55
+ * MediaKeySession and check if an error is returned.
56
+ * This is needed because on some browsers with poor EME implementation,
57
+ * knowing when a MediaKeySession is closed is actually a hard task.
58
+ *
59
+ * The returned Promise will never reject.
60
+ * @returns {Promise.<undefined>}
61
+ */
62
+ async function waitTimeoutAndCheck() : Promise<void> {
63
+ try {
64
+ await cancellableSleep(1000, timeoutCanceller.signal);
65
+ await tryUpdatingSession();
66
+ } catch (err) {
67
+ if (err instanceof CancellationError) { // cancelled == session closed
68
+ return;
69
+ }
70
+ const message = err instanceof Error ?
71
+ err.message :
72
+ "Unknown error made it impossible to close the session";
73
+ log.error(`DRM: ${message}`);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Try to update `MediaKeySession` and check its error if it failed.
79
+ * If we still don't know whether it closed yet, wait a second
80
+ * timeout then quit.
81
+ *
82
+ * The returned Promise resolves if the `MediaKeySession` seems closed and
83
+ * rejects if we couldn't know or it doesn't.
84
+ * @returns {Promise.<undefined>}
85
+ */
86
+ async function tryUpdatingSession() : Promise<void> {
87
+ try {
88
+ await session.update(new Uint8Array(1));
89
+ } catch (err) {
90
+ if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
91
+ return;
92
+ }
93
+
94
+ // The caught error can tell if session is closed
95
+ // (Chrome may throw this error)
96
+ // I know... Checking the error message is not the best practice ever.
97
+ if (err instanceof Error &&
98
+ err.message === "The session is already closed."
99
+ ) {
100
+ return;
101
+ }
102
+
103
+ await cancellableSleep(1000, timeoutCanceller.signal);
104
+ }
105
+
106
+ if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
107
+ return;
108
+ }
109
+
110
+ throw new Error("Compat: Couldn't know if session is closed");
111
+ }
78
112
  }
@@ -45,7 +45,7 @@ class IE11MediaKeySession
45
45
  public keyStatuses: ICustomMediaKeyStatusMap;
46
46
  private readonly _mk: MSMediaKeys;
47
47
  private readonly _closeSession$: Subject<void>;
48
- private _ss?: MSMediaKeySession;
48
+ private _ss: MSMediaKeySession | undefined;
49
49
  constructor(mk: MSMediaKeys) {
50
50
  super();
51
51
  this.expiration = NaN;
@@ -14,15 +14,9 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- defer as observableDefer,
19
- Observable,
20
- of as observableOf,
21
- throwError as observableThrow,
22
- } from "rxjs";
17
+ import PPromise from "pinkie";
23
18
  import { MediaError } from "../../../errors";
24
19
  import assert from "../../../utils/assert";
25
- import castToObservable from "../../../utils/cast_to_observable";
26
20
  import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
27
21
  import { isIE11 } from "../../browser_detection";
28
22
  import isNode from "../../is_node";
@@ -47,12 +41,18 @@ import { WebKitMediaKeysConstructor } from "./webkit_media_keys_constructor";
47
41
  /** Generic implementation of the navigator.requestMediaKeySystemAccess API. */
48
42
  type ICompatRequestMediaKeySystemAccessFn =
49
43
  (keyType : string, config : MediaKeySystemConfiguration[]) =>
50
- Observable<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
44
+ Promise<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
51
45
 
52
- let requestMediaKeySystemAccess : null | ICompatRequestMediaKeySystemAccessFn = null;
46
+ let requestMediaKeySystemAccess : ICompatRequestMediaKeySystemAccessFn | null = null;
53
47
 
54
- let _setMediaKeys :
55
- ((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => void) =
48
+ /**
49
+ * Set the given MediaKeys on the given HTMLMediaElement.
50
+ * Emits null when done then complete.
51
+ * @param {HTMLMediaElement} elt
52
+ * @param {Object} mediaKeys
53
+ */
54
+ let setMediaKeys :
55
+ ((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => unknown) =
56
56
  function defaultSetMediaKeys(
57
57
  mediaElement: HTMLMediaElement,
58
58
  mediaKeys: MediaKeys | ICustomMediaKeys | null
@@ -92,11 +92,8 @@ let _setMediaKeys :
92
92
  if (isNode ||
93
93
  (navigator.requestMediaKeySystemAccess != null && !shouldFavourCustomSafariEME())
94
94
  ) {
95
- requestMediaKeySystemAccess = (
96
- a : string,
97
- b : MediaKeySystemConfiguration[]
98
- ) : Observable<MediaKeySystemAccess> =>
99
- castToObservable(navigator.requestMediaKeySystemAccess(a, b));
95
+ requestMediaKeySystemAccess = (...args) =>
96
+ navigator.requestMediaKeySystemAccess(...args);
100
97
  } else {
101
98
  let isTypeSupported: (keyType: string) => boolean;
102
99
  let createCustomMediaKeys: (keyType: string) => ICustomMediaKeys;
@@ -106,23 +103,23 @@ if (isNode ||
106
103
  const callbacks = getOldKitWebKitMediaKeyCallbacks();
107
104
  isTypeSupported = callbacks.isTypeSupported;
108
105
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
109
- _setMediaKeys = callbacks.setMediaKeys;
106
+ setMediaKeys = callbacks.setMediaKeys;
110
107
  // This is for WebKit with prefixed EME api
111
108
  } else if (WebKitMediaKeysConstructor !== undefined) {
112
109
  const callbacks = getWebKitMediaKeysCallbacks();
113
110
  isTypeSupported = callbacks.isTypeSupported;
114
111
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
115
- _setMediaKeys = callbacks.setMediaKeys;
112
+ setMediaKeys = callbacks.setMediaKeys;
116
113
  } else if (isIE11 && MSMediaKeysConstructor !== undefined) {
117
114
  const callbacks = getIE11MediaKeysCallbacks();
118
115
  isTypeSupported = callbacks.isTypeSupported;
119
116
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
120
- _setMediaKeys = callbacks.setMediaKeys;
117
+ setMediaKeys = callbacks.setMediaKeys;
121
118
  } else if (MozMediaKeysConstructor !== undefined) {
122
119
  const callbacks = getMozMediaKeysCallbacks();
123
120
  isTypeSupported = callbacks.isTypeSupported;
124
121
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
125
- _setMediaKeys = callbacks.setMediaKeys;
122
+ setMediaKeys = callbacks.setMediaKeys;
126
123
  } else {
127
124
  const MK = window.MediaKeys as unknown as typeof MediaKeys & {
128
125
  isTypeSupported? : (keyType : string) => boolean;
@@ -155,9 +152,9 @@ if (isNode ||
155
152
  requestMediaKeySystemAccess = function(
156
153
  keyType : string,
157
154
  keySystemConfigurations : MediaKeySystemConfiguration[]
158
- ) : Observable<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
155
+ ) : Promise<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
159
156
  if (!isTypeSupported(keyType)) {
160
- return observableThrow(() => new Error("Unsupported key type"));
157
+ return PPromise.reject(new Error("Unsupported key type"));
161
158
  }
162
159
 
163
160
  for (let i = 0; i < keySystemConfigurations.length; i++) {
@@ -173,18 +170,22 @@ if (isNode ||
173
170
  supported = supported && (distinctiveIdentifier !== "required");
174
171
 
175
172
  if (supported) {
176
- const keySystemConfigurationResponse = {
177
- videoCapabilities,
178
- audioCapabilities,
173
+ const keySystemConfigurationResponse : MediaKeySystemConfiguration = {
179
174
  initDataTypes: ["cenc"],
180
175
  distinctiveIdentifier: "not-allowed" as const,
181
176
  persistentState: "required" as const,
182
177
  sessionTypes: ["temporary", "persistent-license"],
183
178
  };
179
+ if (videoCapabilities !== undefined) {
180
+ keySystemConfigurationResponse.videoCapabilities = videoCapabilities;
181
+ }
182
+ if (audioCapabilities !== undefined) {
183
+ keySystemConfigurationResponse.audioCapabilities = audioCapabilities;
184
+ }
184
185
 
185
186
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
186
187
  const customMediaKeys = createCustomMediaKeys(keyType);
187
- return observableOf(
188
+ return PPromise.resolve(
188
189
  new CustomMediaKeySystemAccess(keyType,
189
190
  customMediaKeys,
190
191
  keySystemConfigurationResponse)
@@ -192,24 +193,10 @@ if (isNode ||
192
193
  }
193
194
  }
194
195
 
195
- return observableThrow(() => new Error("Unsupported configuration"));
196
+ return PPromise.reject(new Error("Unsupported configuration"));
196
197
  };
197
198
  }
198
199
 
199
- /**
200
- * Set the given MediaKeys on the given HTMLMediaElement.
201
- * Emits null when done then complete.
202
- * @param {HTMLMediaElement} elt
203
- * @param {Object} mediaKeys
204
- * @returns {Observable}
205
- */
206
- function setMediaKeys(
207
- elt : HTMLMediaElement,
208
- mediaKeys : MediaKeys|ICustomMediaKeys|null
209
- ) : Observable<unknown> {
210
- return observableDefer(() => castToObservable(_setMediaKeys(elt, mediaKeys)));
211
- }
212
-
213
200
  export {
214
201
  requestMediaKeySystemAccess,
215
202
  setMediaKeys,
@@ -14,16 +14,11 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- merge as observableMerge,
19
- Subject,
20
- takeUntil,
21
- } from "rxjs";
22
17
  import { base64ToBytes } from "../../../utils/base64";
23
18
  import EventEmitter from "../../../utils/event_emitter";
19
+ import noop from "../../../utils/noop";
24
20
  import PPromise from "../../../utils/promise";
25
21
  import { utf8ToStr } from "../../../utils/string_parsing";
26
- import * as events from "../../event_listeners";
27
22
  import {
28
23
  ICustomMediaKeys,
29
24
  ICustomMediaKeySession,
@@ -54,11 +49,16 @@ export function isOldWebkitMediaElement(
54
49
  .webkitGenerateKeyRequest === "function";
55
50
  }
56
51
 
52
+ /**
53
+ * MediaKeySession implementation for older versions of WebKit relying on APIs
54
+ * such as `webkitGenerateKeyRequest` `webkitAddKey` to be called on the
55
+ * HTMLMediaElement.
56
+ * @class OldWebkitMediaKeySession
57
+ */
57
58
  class OldWebkitMediaKeySession
58
59
  extends EventEmitter<IMediaKeySessionEvents>
59
60
  implements ICustomMediaKeySession
60
61
  {
61
- public readonly update: (license: Uint8Array) => Promise<void>;
62
62
  public readonly closed: Promise<void>;
63
63
  public expiration: number;
64
64
  public keyStatuses: ICustomMediaKeyStatusMap;
@@ -66,76 +66,93 @@ class OldWebkitMediaKeySession
66
66
 
67
67
  private readonly _vid: IOldWebkitHTMLMediaElement;
68
68
  private readonly _key: string;
69
- private readonly _closeSession$: Subject<void>;
69
+
70
+ private readonly _onSessionRelatedEvent : (evt : Event) => void;
71
+ private _closeSession : () => void;
70
72
 
71
73
  constructor(mediaElement: IOldWebkitHTMLMediaElement, keySystem: string) {
72
74
  super();
73
- this._closeSession$ = new Subject();
74
75
  this._vid = mediaElement;
75
76
  this._key = keySystem;
76
77
 
77
78
  this.sessionId = "";
79
+ this._closeSession = noop; // Just here to make TypeScript happy
78
80
  this.closed = new PPromise((resolve) => {
79
- this._closeSession$.subscribe(resolve);
81
+ this._closeSession = resolve;
80
82
  });
81
83
  this.keyStatuses = new Map();
82
84
  this.expiration = NaN;
83
85
 
84
- observableMerge(events.onKeyMessage$(mediaElement),
85
- events.onKeyAdded$(mediaElement),
86
- events.onKeyError$(mediaElement))
87
- .pipe(takeUntil(this._closeSession$))
88
- .subscribe((evt: Event) => this.trigger(evt.type, evt));
89
-
90
- this.update = (license: Uint8Array) => {
91
- return new PPromise((resolve, reject) => {
92
- try {
93
- if (this._key.indexOf("clearkey") >= 0) {
94
- const licenseTypedArray =
95
- license instanceof ArrayBuffer ? new Uint8Array(license) :
96
- license;
97
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
98
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
99
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
100
- const json = JSON.parse(utf8ToStr(licenseTypedArray));
101
- const key = base64ToBytes(json.keys[0].k);
102
- const kid = base64ToBytes(json.keys[0].kid);
103
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
104
- /* eslint-enable @typescript-eslint/no-unsafe-argument */
105
- /* eslint-enable @typescript-eslint/no-unsafe-assignment */
106
- resolve(this._vid.webkitAddKey(this._key, key, kid, /* sessionId */ ""));
107
- } else {
108
- resolve(this._vid.webkitAddKey(this._key, license, null, /* sessionId */ ""));
109
- }
110
- } catch (err) {
111
- reject(err);
112
- }
113
- });
86
+ this._onSessionRelatedEvent = (evt : Event) => {
87
+ this.trigger(evt.type, evt);
114
88
  };
89
+
90
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
91
+ .forEach(evt => mediaElement.addEventListener(evt, this._onSessionRelatedEvent));
115
92
  }
116
93
 
117
- generateRequest(_initDataType: string, initData: ArrayBuffer): Promise<void> {
94
+ public update(license: Uint8Array) : Promise<void> {
95
+ return new PPromise((resolve, reject) => {
96
+ try {
97
+ if (this._key.indexOf("clearkey") >= 0) {
98
+ const licenseTypedArray =
99
+ license instanceof ArrayBuffer ? new Uint8Array(license) :
100
+ license;
101
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
102
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
103
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
104
+ const json = JSON.parse(utf8ToStr(licenseTypedArray));
105
+ const key = base64ToBytes(json.keys[0].k);
106
+ const kid = base64ToBytes(json.keys[0].kid);
107
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
108
+ /* eslint-enable @typescript-eslint/no-unsafe-argument */
109
+ /* eslint-enable @typescript-eslint/no-unsafe-assignment */
110
+ resolve(this._vid.webkitAddKey(this._key, key, kid, /* sessionId */ ""));
111
+ } else {
112
+ resolve(this._vid.webkitAddKey(this._key, license, null, /* sessionId */ ""));
113
+ }
114
+ } catch (err) {
115
+ reject(err);
116
+ }
117
+ });
118
+ }
119
+
120
+ public generateRequest(
121
+ _initDataType: string,
122
+ initData: ArrayBuffer
123
+ ): Promise<void> {
118
124
  return new PPromise((resolve) => {
119
125
  this._vid.webkitGenerateKeyRequest(this._key, initData);
120
126
  resolve();
121
127
  });
122
128
  }
123
129
 
124
- close(): Promise<void> {
130
+ public close(): Promise<void> {
125
131
  return new PPromise((resolve) => {
126
- this._closeSession$.next();
127
- this._closeSession$.complete();
132
+ this._unbindSession();
133
+ this._closeSession();
128
134
  resolve();
129
135
  });
130
136
  }
131
137
 
132
- load(): Promise<boolean> {
138
+ /**
139
+ * Load a Persistent MediaKeySession.
140
+ * Do nothing here because this implementation doesn't handle them.
141
+ * @returns {Promise.<boolean>}
142
+ */
143
+ public load(): Promise<boolean> {
144
+ // Not implemented. Always return false as in "no session with that id".
133
145
  return PPromise.resolve(false);
134
146
  }
135
147
 
136
- remove(): Promise<void> {
148
+ public remove(): Promise<void> {
137
149
  return PPromise.resolve();
138
150
  }
151
+
152
+ private _unbindSession() {
153
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
154
+ .forEach(evt => this._vid.removeEventListener(evt, this._onSessionRelatedEvent));
155
+ }
139
156
  }
140
157
 
141
158
  class OldWebKitCustomMediaKeys implements ICustomMediaKeys {