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
@@ -22,31 +22,24 @@
22
22
  /* eslint-disable @typescript-eslint/no-unsafe-return */
23
23
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
24
24
  /* eslint-disable @typescript-eslint/no-explicit-any */
25
+ /* eslint-disable no-restricted-properties */
25
26
 
26
- import {
27
- EMPTY,
28
- Observable,
29
- of as observableOf,
30
- Subject,
31
- takeUntil,
32
- throwError as observableThrow,
33
- } from "rxjs";
34
27
  import { ICustomMediaKeySystemAccess } from "../../../../compat";
35
28
  import {
36
29
  defaultKSConfig,
37
30
  defaultWidevineConfig,
38
31
  mockCompat,
39
- testEMEManagerImmediateError,
32
+ testContentDecryptorError,
40
33
  } from "./utils";
41
34
 
42
35
  export function requestMediaKeySystemAccessNoMediaKeys(
43
36
  keySystem : string,
44
37
  config : MediaKeySystemConfiguration[]
45
- ) : Observable<ICustomMediaKeySystemAccess> {
38
+ ) : Promise<ICustomMediaKeySystemAccess> {
46
39
  if (config.length === 0) {
47
40
  throw new Error("requestMediaKeySystemAccessNoMediaKeys: no config given");
48
41
  }
49
- return observableOf({
42
+ return Promise.resolve({
50
43
  keySystem,
51
44
  getConfiguration() { return config[0]; },
52
45
  createMediaKeys() { return new Promise(() => { /* noop */ }); },
@@ -58,7 +51,7 @@ const incompatibleMKSAErrorMessage =
58
51
  "with your wanted configuration has been found in the current browser.";
59
52
 
60
53
  /**
61
- * Check that the given `keySystemsConfigs` lead directly to an
54
+ * Check that the given `keySystemsConfigs` lead to an
62
55
  * `INCOMPATIBLE_KEYSYSTEMS` error.
63
56
  * @param {Array.<Object>} keySystemsConfigs
64
57
  * @returns {Promise}
@@ -67,19 +60,18 @@ async function checkIncompatibleKeySystemsErrorMessage(
67
60
  keySystemsConfigs : unknown[]
68
61
  ) : Promise<void> {
69
62
  const mediaElement = document.createElement("video");
70
- const EMEManager = require("../../eme_manager").default;
63
+ const ContentDecryptor = require("../../content_decryptor").default;
71
64
 
72
- const error : any = await testEMEManagerImmediateError(EMEManager,
73
- mediaElement,
74
- keySystemsConfigs,
75
- EMPTY);
65
+ const error : any = await testContentDecryptorError(ContentDecryptor,
66
+ mediaElement,
67
+ keySystemsConfigs);
76
68
  expect(error).not.toBe(null);
77
69
  expect(error.message).toEqual(incompatibleMKSAErrorMessage);
78
70
  expect(error.name).toEqual("EncryptedMediaError");
79
71
  expect(error.code).toEqual("INCOMPATIBLE_KEYSYSTEMS");
80
72
  }
81
73
 
82
- describe("core - eme - global tests - media key system access", () => {
74
+ describe("core - decrypt - global tests - media key system access", () => {
83
75
  // Used to implement every functions that should never be called.
84
76
  const neverCalledFn = jest.fn();
85
77
 
@@ -100,7 +92,7 @@ describe("core - eme - global tests - media key system access", () => {
100
92
  });
101
93
 
102
94
  it("should throw if given a single incompatible keySystemsConfigs", async () => {
103
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
95
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
104
96
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
105
97
  const getLicenseFn = neverCalledFn;
106
98
  await checkIncompatibleKeySystemsErrorMessage([{ type: "foo",
@@ -110,7 +102,7 @@ describe("core - eme - global tests - media key system access", () => {
110
102
  });
111
103
 
112
104
  it("should throw if given multiple incompatible keySystemsConfigs", async () => {
113
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
105
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
114
106
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
115
107
  const config = [ { type: "foo", getLicense: neverCalledFn },
116
108
  { type: "bar", getLicense: neverCalledFn },
@@ -130,20 +122,19 @@ describe("core - eme - global tests - media key system access", () => {
130
122
  /* eslint-enable max-len */
131
123
  mockCompat({ requestMediaKeySystemAccess: undefined });
132
124
  const mediaElement = document.createElement("video");
133
- const EMEManager = require("../../eme_manager").default;
125
+ const ContentDecryptor = require("../../content_decryptor").default;
134
126
 
135
127
  const config = [{ type: "foo", getLicense: neverCalledFn }];
136
- const error : any = await testEMEManagerImmediateError(EMEManager,
137
- mediaElement,
138
- config,
139
- EMPTY);
128
+ const error : any = await testContentDecryptorError(ContentDecryptor,
129
+ mediaElement,
130
+ config);
140
131
  expect(error).not.toBe(null);
141
132
  expect(error.message)
142
133
  .toEqual("requestMediaKeySystemAccess is not implemented in your browser.");
143
134
  });
144
135
 
145
136
  it("should throw if given a single incompatible keySystemsConfigs", async () => {
146
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
137
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
147
138
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
148
139
  await checkIncompatibleKeySystemsErrorMessage([{ type: "foo",
149
140
  getLicense: neverCalledFn }]);
@@ -154,7 +145,7 @@ describe("core - eme - global tests - media key system access", () => {
154
145
  /* eslint-disable max-len */
155
146
  it("should change persistentState value if persistentStateRequired is set to true", async () => {
156
147
  /* eslint-enable max-len */
157
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
148
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
158
149
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
159
150
  await checkIncompatibleKeySystemsErrorMessage([{ type: "foo",
160
151
  getLicense: neverCalledFn,
@@ -170,7 +161,7 @@ describe("core - eme - global tests - media key system access", () => {
170
161
  /* eslint-disable max-len */
171
162
  it("should not change persistentState value if persistentStateRequired is set to false", async () => {
172
163
  /* eslint-enable max-len */
173
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
164
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
174
165
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
175
166
  await checkIncompatibleKeySystemsErrorMessage([{ type: "foo",
176
167
  getLicense: neverCalledFn,
@@ -182,7 +173,7 @@ describe("core - eme - global tests - media key system access", () => {
182
173
  /* eslint-disable max-len */
183
174
  it("should change distinctiveIdentifier value if distinctiveIdentifierRequired is set to true", async () => {
184
175
  /* eslint-enable max-len */
185
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
176
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
186
177
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
187
178
  await checkIncompatibleKeySystemsErrorMessage([{
188
179
  type: "foo",
@@ -200,7 +191,7 @@ describe("core - eme - global tests - media key system access", () => {
200
191
  /* eslint-disable max-len */
201
192
  it("should not change distinctiveIdentifier value if distinctiveIdentifierRequired is set to false", async () => {
202
193
  /* eslint-enable max-len */
203
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
194
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
204
195
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
205
196
  await checkIncompatibleKeySystemsErrorMessage([{
206
197
  type: "foo",
@@ -212,7 +203,7 @@ describe("core - eme - global tests - media key system access", () => {
212
203
  });
213
204
 
214
205
  it("should do nothing if just licenseStorage is set", async () => {
215
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
206
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
216
207
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
217
208
  const licenseStorage = { save() { throw new Error("Should not save."); },
218
209
  load() { throw new Error("Should not load."); } };
@@ -226,7 +217,7 @@ describe("core - eme - global tests - media key system access", () => {
226
217
  /* eslint-disable max-len */
227
218
  it("should want persistent sessions if both persistentLicense and licenseStorage are set", async () => {
228
219
  /* eslint-enable max-len */
229
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
220
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
230
221
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
231
222
  const licenseStorage = { save() { throw new Error("Should not save."); },
232
223
  load() { throw new Error("Should not load."); } };
@@ -248,7 +239,7 @@ describe("core - eme - global tests - media key system access", () => {
248
239
  /* eslint-disable max-len */
249
240
  it("should want persistent sessions if just persistentLicense is set to true", async () => {
250
241
  /* eslint-enable max-len */
251
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
242
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
252
243
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
253
244
  await checkIncompatibleKeySystemsErrorMessage([{ type: "foo",
254
245
  getLicense: neverCalledFn,
@@ -264,7 +255,7 @@ describe("core - eme - global tests - media key system access", () => {
264
255
  });
265
256
 
266
257
  it("should do nothing if persistentLicense is set to false", async () => {
267
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
258
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
268
259
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
269
260
  await checkIncompatibleKeySystemsErrorMessage([{ type: "foo",
270
261
  getLicense: neverCalledFn,
@@ -274,7 +265,7 @@ describe("core - eme - global tests - media key system access", () => {
274
265
  });
275
266
 
276
267
  it("should translate a `clearkey` keySystem", async () => {
277
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
268
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
278
269
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
279
270
  await checkIncompatibleKeySystemsErrorMessage([{ type: "clearkey",
280
271
  getLicense: neverCalledFn }]);
@@ -286,7 +277,7 @@ describe("core - eme - global tests - media key system access", () => {
286
277
  });
287
278
 
288
279
  it("should translate a `widevine` keySystem", async () => {
289
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
280
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
290
281
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
291
282
  await checkIncompatibleKeySystemsErrorMessage([{ type: "widevine",
292
283
  getLicense: neverCalledFn }]);
@@ -296,7 +287,7 @@ describe("core - eme - global tests - media key system access", () => {
296
287
  });
297
288
 
298
289
  it("should translate a `playready` keySystem", async () => {
299
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
290
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
300
291
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
301
292
  await checkIncompatibleKeySystemsErrorMessage([{ type: "playready",
302
293
  getLicense: neverCalledFn }]);
@@ -310,7 +301,7 @@ describe("core - eme - global tests - media key system access", () => {
310
301
  });
311
302
 
312
303
  it("should translate a `fairplay` keySystem", async () => {
313
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
304
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
314
305
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
315
306
  await checkIncompatibleKeySystemsErrorMessage([{ type: "fairplay",
316
307
  getLicense: neverCalledFn }]);
@@ -320,7 +311,7 @@ describe("core - eme - global tests - media key system access", () => {
320
311
  });
321
312
 
322
313
  it("should translate a multiple keySystems at the same time", async () => {
323
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
314
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
324
315
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
325
316
  await checkIncompatibleKeySystemsErrorMessage([{ type: "playready",
326
317
  getLicense: neverCalledFn },
@@ -342,7 +333,7 @@ describe("core - eme - global tests - media key system access", () => {
342
333
  /* eslint-disable max-len */
343
334
  it("should translate a multiple keySystems at the same time with different configs", async () => {
344
335
  /* eslint-enable max-len */
345
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
336
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
346
337
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
347
338
  await checkIncompatibleKeySystemsErrorMessage([{ type: "playready",
348
339
  persistentLicense: true,
@@ -375,7 +366,7 @@ describe("core - eme - global tests - media key system access", () => {
375
366
  /* eslint-disable max-len */
376
367
  it("should set widevine robustnesses for a `com.widevine.alpha` keySystem", async () => {
377
368
  /* eslint-enable max-len */
378
- const requestMediaKeySystemAccessSpy = jest.fn(() => observableThrow(() => "nope"));
369
+ const requestMediaKeySystemAccessSpy = jest.fn(() => Promise.reject("nope"));
379
370
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
380
371
  await checkIncompatibleKeySystemsErrorMessage([{ type: "playready",
381
372
  persistentLicense: true,
@@ -416,20 +407,17 @@ describe("core - eme - global tests - media key system access", () => {
416
407
  getLicense: neverCalledFn }];
417
408
 
418
409
  const mediaElement = document.createElement("video");
419
- const EMEManager = require("../../eme_manager").default;
420
- EMEManager(mediaElement, config, new Subject<void>())
421
- .subscribe(
422
- (evt : unknown) => {
423
- const eventStr = JSON.stringify(evt as any);
424
- rej(new Error("Received an EMEManager event: " + eventStr));
425
- },
426
- (err : unknown) => { rej(err); },
427
- () => rej(new Error("EMEManager completed."))
428
- );
429
- expect(requestMediaKeySystemAccessSpy).toHaveBeenCalledTimes(1);
430
- expect(requestMediaKeySystemAccessSpy)
431
- .toHaveBeenCalledWith("com.widevine.alpha", defaultWidevineConfig);
432
- res();
410
+ const ContentDecryptor = require("../../content_decryptor").default;
411
+ const contentDecryptor = new ContentDecryptor(mediaElement, config);
412
+ contentDecryptor.addEventListener("error", (error: any) => {
413
+ rej(error);
414
+ });
415
+ setTimeout(() => {
416
+ expect(requestMediaKeySystemAccessSpy).toHaveBeenCalledTimes(1);
417
+ expect(requestMediaKeySystemAccessSpy)
418
+ .toHaveBeenCalledWith("com.widevine.alpha", defaultWidevineConfig);
419
+ res();
420
+ }, 10);
433
421
  });
434
422
  });
435
423
 
@@ -442,7 +430,7 @@ describe("core - eme - global tests - media key system access", () => {
442
430
  if (++callNb === 2) {
443
431
  return requestMediaKeySystemAccessNoMediaKeys(keyType, conf);
444
432
  }
445
- return observableThrow(() => "nope");
433
+ return Promise.reject("nope");
446
434
  });
447
435
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
448
436
  const config = [{ type: "com.widevine.alpha",
@@ -451,55 +439,74 @@ describe("core - eme - global tests - media key system access", () => {
451
439
  getLicense: neverCalledFn }];
452
440
 
453
441
  const mediaElement = document.createElement("video");
454
- const EMEManager = require("../../eme_manager").default;
455
- EMEManager(mediaElement, config, new Subject<void>())
456
- .subscribe(
457
- (evt : unknown) => {
458
- const eventStr = JSON.stringify(evt as any);
459
- rej(new Error("Received an EMEManager event: " + eventStr));
460
- },
461
- (err : unknown) => { rej(err); },
462
- () => rej(new Error("EMEManager completed."))
463
- );
464
- expect(requestMediaKeySystemAccessSpy).toHaveBeenCalledTimes(2);
465
- expect(requestMediaKeySystemAccessSpy)
466
- .toHaveBeenNthCalledWith(1, "com.widevine.alpha", defaultWidevineConfig);
467
- expect(requestMediaKeySystemAccessSpy)
468
- .toHaveBeenNthCalledWith(2, "some-other-working-key-system", defaultKSConfig);
469
- res();
442
+ const ContentDecryptor = require("../../content_decryptor").default;
443
+ const contentDecryptor = new ContentDecryptor(mediaElement, config);
444
+ contentDecryptor.addEventListener("error", (error: any) => {
445
+ rej(error);
446
+ });
447
+ setTimeout(() => {
448
+ expect(requestMediaKeySystemAccessSpy).toHaveBeenCalledTimes(2);
449
+ expect(requestMediaKeySystemAccessSpy)
450
+ .toHaveBeenNthCalledWith(1, "com.widevine.alpha", defaultWidevineConfig);
451
+ expect(requestMediaKeySystemAccessSpy)
452
+ .toHaveBeenNthCalledWith(2, "some-other-working-key-system", defaultKSConfig);
453
+ res();
454
+ }, 10);
470
455
  });
471
456
  });
472
457
 
473
- xit("should not continue to check if the observable is unsubscribed from", () => {
458
+ it("should not continue to check if the ContentDecryptor is disposed from", () => {
474
459
  return new Promise<void>((res, rej) => {
475
- const killSubject$ = new Subject<void>();
460
+ let contentDecryptor : any = null;
476
461
  let rmksHasBeenCalled = false;
477
462
  const requestMediaKeySystemAccessSpy = jest.fn(() => {
478
- if (rmksHasBeenCalled) {
479
- rej("requestMediaKeySystemAccess has already been called.");
480
- }
481
- rmksHasBeenCalled = true;
482
- killSubject$.next();
483
- killSubject$.complete();
484
- return observableThrow(() => "nope");
463
+ return Promise.resolve().then(() => {
464
+ rmksHasBeenCalled = true;
465
+ contentDecryptor.dispose();
466
+ return Promise.reject("nope");
467
+ });
485
468
  });
486
469
  mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
487
470
  const mediaElement = document.createElement("video");
488
- const EMEManager = require("../../eme_manager").default;
471
+ const ContentDecryptor = require("../../content_decryptor").default;
489
472
 
490
473
  const config = [ { type: "foo", getLicense: neverCalledFn },
491
474
  { type: "bar", getLicense: neverCalledFn },
492
475
  { type: "baz", getLicense: neverCalledFn } ];
493
- EMEManager(mediaElement, config, EMPTY)
494
- .pipe(takeUntil(killSubject$))
495
- .subscribe(
496
- () => { rej("We should not have received an event"); },
497
- () => { rej("We should not have received an error."); },
498
- () => {
499
- expect(rmksHasBeenCalled).toBe(true);
500
- setTimeout(() => { res(); }, 10);
501
- }
502
- );
476
+ contentDecryptor = new ContentDecryptor(mediaElement, config);
477
+ contentDecryptor.addEventListener("error", (error: any) => {
478
+ rej(error);
479
+ });
480
+ setTimeout(() => {
481
+ expect(rmksHasBeenCalled).toEqual(true);
482
+ expect(requestMediaKeySystemAccessSpy).toHaveBeenCalledTimes(1);
483
+ expect(requestMediaKeySystemAccessSpy)
484
+ .toHaveBeenNthCalledWith(1, "foo", defaultKSConfig);
485
+ res();
486
+ }, 10);
487
+ });
488
+ });
489
+
490
+ it("should trigger error even if requestMediaKeySystemAccess throws", () => {
491
+ return new Promise<void>((res, rej) => {
492
+ let rmksHasBeenCalled = false;
493
+ const requestMediaKeySystemAccessSpy = jest.fn(() => {
494
+ rmksHasBeenCalled = true;
495
+ throw new Error("nope");
496
+ });
497
+ mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessSpy });
498
+ const mediaElement = document.createElement("video");
499
+ const ContentDecryptor = require("../../content_decryptor").default;
500
+
501
+ const config = [{ type: "foo", getLicense: neverCalledFn }];
502
+ const contentDecryptor = new ContentDecryptor(mediaElement, config);
503
+ contentDecryptor.addEventListener("error", () => {
504
+ expect(rmksHasBeenCalled).toEqual(true);
505
+ res();
506
+ });
507
+ setTimeout(() => {
508
+ rej(new Error("timeout exceeded"));
509
+ }, 10);
503
510
  });
504
511
  });
505
512
  });
@@ -0,0 +1,156 @@
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
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
18
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
19
+ /* eslint-disable @typescript-eslint/no-var-requires */
20
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
21
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
22
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
23
+ /* eslint-disable @typescript-eslint/no-explicit-any */
24
+ /* eslint-disable no-restricted-properties */
25
+
26
+ import {
27
+ MediaKeysImpl,
28
+ mockCompat,
29
+ testContentDecryptorError,
30
+ } from "./utils";
31
+
32
+ describe("core - decrypt - global tests - media key system access", () => {
33
+ /** Used to implement every functions that should never be called. */
34
+ const neverCalledFn = jest.fn();
35
+
36
+ /** Default video element used in our tests. */
37
+ const videoElt = document.createElement("video");
38
+
39
+ /** Default keySystems configuration used in our tests. */
40
+ const ksConfig = [{ type: "com.widevine.alpha", getLicense: neverCalledFn }];
41
+
42
+ beforeEach(() => {
43
+ jest.resetModules();
44
+ jest.restoreAllMocks();
45
+ jest.mock("../../set_server_certificate", () => ({ __esModule: true as const,
46
+ default: neverCalledFn }));
47
+ });
48
+
49
+ afterEach(() => {
50
+ expect(neverCalledFn).not.toHaveBeenCalled();
51
+ });
52
+
53
+ it("should throw if createMediaKeys throws", async () => {
54
+ // == mocks ==
55
+ function requestMediaKeySystemAccessBadMediaKeys(
56
+ keySystem : string,
57
+ conf : MediaKeySystemConfiguration[]
58
+ ) {
59
+ return Promise.resolve({ keySystem,
60
+ getConfiguration() { return conf; },
61
+ createMediaKeys() { throw new Error("No non no"); } });
62
+ }
63
+ mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessBadMediaKeys });
64
+
65
+ // == test ==
66
+ const ContentDecryptor = require("../../content_decryptor").default;
67
+ const error : any =
68
+ await testContentDecryptorError(ContentDecryptor, videoElt, ksConfig);
69
+ expect(error).toBeInstanceOf(Error);
70
+ expect(error.message).toEqual(
71
+ "EncryptedMediaError (CREATE_MEDIA_KEYS_ERROR) No non no"
72
+ );
73
+ expect(error.name).toEqual("EncryptedMediaError");
74
+ expect(error.code).toEqual("CREATE_MEDIA_KEYS_ERROR");
75
+ });
76
+
77
+ it("should throw if createMediaKeys rejects", async () => {
78
+ // == mocks ==
79
+ function requestMediaKeySystemAccessRejMediaKeys(
80
+ keySystem : string,
81
+ conf : MediaKeySystemConfiguration[]
82
+ ) {
83
+ return Promise.resolve({
84
+ keySystem,
85
+ getConfiguration: () => conf,
86
+ createMediaKeys: () => Promise.reject(new Error("No non no")),
87
+ });
88
+ }
89
+ mockCompat({ requestMediaKeySystemAccess: requestMediaKeySystemAccessRejMediaKeys });
90
+
91
+ // == test ==
92
+ const ContentDecryptor = require("../../content_decryptor").default;
93
+ const error : any =
94
+ await testContentDecryptorError(ContentDecryptor, videoElt, ksConfig);
95
+ expect(error).toBeInstanceOf(Error);
96
+ expect(error.message).toEqual(
97
+ "EncryptedMediaError (CREATE_MEDIA_KEYS_ERROR) No non no"
98
+ );
99
+ expect(error.name).toEqual("EncryptedMediaError");
100
+ expect(error.code).toEqual("CREATE_MEDIA_KEYS_ERROR");
101
+ });
102
+
103
+ /* eslint-disable max-len */
104
+ it("should go into the WaitingForAttachment state if createMediaKeys resolves", () => {
105
+ /* eslint-enable max-len */
106
+ return new Promise<void>((res, rej) => {
107
+ mockCompat({});
108
+ const { ContentDecryptorState } = require("../../content_decryptor");
109
+ const ContentDecryptor = require("../../content_decryptor").default;
110
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
111
+ let receivedStateChange = 0;
112
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
113
+ receivedStateChange++;
114
+ try {
115
+ expect(newState).toEqual(ContentDecryptorState.WaitingForAttachment);
116
+ } catch (err) { rej(err); }
117
+ setTimeout(() => {
118
+ try {
119
+ expect(receivedStateChange).toEqual(1);
120
+ expect(contentDecryptor.getState())
121
+ .toEqual(ContentDecryptorState.WaitingForAttachment);
122
+ contentDecryptor.dispose();
123
+ } catch (err) { rej(err); }
124
+ res();
125
+ });
126
+ });
127
+ });
128
+ });
129
+
130
+ /* eslint-disable max-len */
131
+ it("should not create any session if no encrypted event was received", (done) => {
132
+ /* eslint-enable max-len */
133
+
134
+ // == mocks ==
135
+ const setMediaKeysSpy = jest.fn(() => Promise.resolve());
136
+ mockCompat({ setMediaKeys: setMediaKeysSpy });
137
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
138
+
139
+ // == test ==
140
+ const { ContentDecryptorState } = require("../../content_decryptor");
141
+ const ContentDecryptor = require("../../content_decryptor").default;
142
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
143
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
144
+ if (newState === ContentDecryptorState.WaitingForAttachment) {
145
+ contentDecryptor.removeEventListener("stateChange");
146
+ contentDecryptor.attach();
147
+ setTimeout(() => {
148
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
149
+ expect(setMediaKeysSpy).toHaveBeenCalledWith(videoElt, new MediaKeysImpl());
150
+ expect(createSessionSpy).not.toHaveBeenCalled();
151
+ done();
152
+ }, 5);
153
+ }
154
+ });
155
+ });
156
+ });