rx-player 3.26.2 → 3.27.0-dev.20220317

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/.github/workflows/perfs.yml +22 -0
  2. package/CHANGELOG.md +33 -1
  3. package/FILES.md +5 -4
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  6. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  8. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  14. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  15. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  16. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  17. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  18. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  19. package/dist/_esm5.processed/config.d.ts +166 -1080
  20. package/dist/_esm5.processed/config.js +17 -1119
  21. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  22. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  23. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  24. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
  27. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
  28. package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
  29. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  30. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  31. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  32. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
  33. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  34. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  35. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  36. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  37. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  38. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
  39. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
  40. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
  41. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  42. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  43. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  44. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  45. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  46. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  47. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  48. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  49. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  50. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  51. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  52. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  53. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  56. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  57. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  58. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  60. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  61. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  62. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  63. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  65. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  66. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  67. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
  68. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  70. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  73. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  74. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  75. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  76. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  77. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  78. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  79. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  81. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  83. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  84. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  85. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  86. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  87. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  88. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  89. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  91. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  92. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  93. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  94. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  95. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  96. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  97. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
  98. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
  99. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
  100. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
  101. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  102. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
  103. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  104. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
  105. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  106. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
  107. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  108. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  109. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  110. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  111. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  112. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  113. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  114. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  115. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  116. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  117. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  118. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
  119. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  120. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
  121. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
  122. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  123. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  124. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  125. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  126. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  127. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  128. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  129. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  130. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  131. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  132. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  133. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  134. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
  135. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  136. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  137. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  138. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  139. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  140. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  141. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  142. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  143. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  144. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  145. package/dist/_esm5.processed/default_config.js +1145 -0
  146. package/dist/_esm5.processed/errors/request_error.js +3 -1
  147. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  148. package/dist/_esm5.processed/experimental/index.js +2 -0
  149. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  150. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  151. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
  152. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  153. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  154. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  155. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  156. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  157. package/dist/_esm5.processed/features/features_object.js +1 -1
  158. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  159. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  160. package/dist/_esm5.processed/features/list/eme.js +5 -5
  161. package/dist/_esm5.processed/features/types.d.ts +3 -3
  162. package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
  163. package/dist/_esm5.processed/manifest/adaptation.js +3 -1
  164. package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
  165. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  166. package/dist/_esm5.processed/manifest/period.d.ts +3 -3
  167. package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
  168. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
  169. package/dist/_esm5.processed/manifest/types.d.ts +3 -3
  170. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  171. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  172. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
  173. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  174. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
  175. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  176. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
  177. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
  178. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  179. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  180. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
  181. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
  182. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  183. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  184. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
  185. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
  186. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
  187. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  188. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
  189. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
  190. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
  191. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
  192. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
  193. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
  194. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
  195. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
  196. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
  197. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  198. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  199. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  200. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  201. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  202. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  203. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
  204. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
  205. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  206. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
  207. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  208. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  209. package/dist/_esm5.processed/public_types.d.ts +2 -2
  210. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
  211. package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
  212. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  213. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  214. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  215. package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
  216. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
  217. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  218. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
  219. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
  220. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
  221. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  222. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
  223. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  224. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  225. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  226. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
  227. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  228. package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
  229. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
  230. package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
  231. package/dist/_esm5.processed/transports/types.d.ts +58 -30
  232. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  233. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
  234. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
  235. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  236. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
  237. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  238. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  239. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  240. package/dist/_esm5.processed/utils/reference.js +72 -24
  241. package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
  242. package/dist/_esm5.processed/utils/request/fetch.js +8 -6
  243. package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
  244. package/dist/_esm5.processed/utils/request/xhr.js +3 -2
  245. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
  246. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  247. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  248. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  249. package/dist/rx-player.js +5242 -3190
  250. package/dist/rx-player.min.js +1 -1
  251. package/dummy +1 -0
  252. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  253. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  254. package/package.json +33 -36
  255. package/scripts/build/templates/experimental/index.d.ts +16 -0
  256. package/scripts/build/templates/experimental/index.js +16 -0
  257. package/scripts/doc-generator/generate_header_html.js +6 -7
  258. package/scripts/doc-generator/generate_page_html.js +3 -4
  259. package/scripts/doc-generator/generate_page_list_html.js +4 -5
  260. package/scripts/doc-generator/generate_sidebar_html.js +4 -7
  261. package/scripts/doc-generator/utils.js +0 -11
  262. package/scripts/generate_demo_list.js +3 -3
  263. package/scripts/generate_documentation_list.js +3 -3
  264. package/scripts/launch_static_server.js +127 -67
  265. package/scripts/run_standalone_demo.js +1 -0
  266. package/scripts/start_demo_web_server.js +1 -0
  267. package/sonar-project.properties +1 -1
  268. package/src/README.md +6 -6
  269. package/src/compat/__tests__/fullscreen.test.ts +7 -7
  270. package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
  271. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  272. package/src/compat/browser_detection.ts +4 -2
  273. package/src/compat/eme/close_session.ts +90 -56
  274. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  275. package/src/compat/eme/custom_media_keys/index.ts +28 -41
  276. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  277. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  278. package/src/compat/eme/generate_key_request.ts +25 -33
  279. package/src/compat/eme/load_session.ts +29 -31
  280. package/src/compat/event_listeners.ts +2 -1
  281. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  282. package/src/config.ts +17 -1210
  283. package/src/core/README.md +1 -1
  284. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  285. package/src/core/abr/bandwidth_estimator.ts +4 -4
  286. package/src/core/abr/buffer_based_chooser.ts +85 -20
  287. package/src/core/abr/network_analyzer.ts +6 -7
  288. package/src/core/abr/pending_requests_store.ts +3 -5
  289. package/src/core/abr/representation_estimator.ts +6 -3
  290. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  291. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  292. package/src/core/api/get_player_state.ts +1 -1
  293. package/src/core/api/index.ts +3 -0
  294. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  295. package/src/core/api/option_utils.ts +37 -20
  296. package/src/core/api/playback_observer.ts +12 -8
  297. package/src/core/api/public_api.ts +152 -112
  298. package/src/core/api/track_choice_manager.ts +10 -9
  299. package/src/core/decrypt/README.md +22 -0
  300. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  301. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  302. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  303. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  304. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  305. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
  306. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  307. package/src/core/decrypt/clear_on_stop.ts +48 -0
  308. package/src/core/decrypt/content_decryptor.ts +1158 -0
  309. package/src/core/decrypt/create_or_load_session.ts +130 -0
  310. package/src/core/decrypt/create_session.ts +175 -0
  311. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  312. package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
  313. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  314. package/src/core/decrypt/get_media_keys.ts +145 -0
  315. package/src/core/{eme → decrypt}/index.ts +11 -8
  316. package/src/core/decrypt/init_media_keys.ts +51 -0
  317. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  318. package/src/core/decrypt/set_server_certificate.ts +104 -0
  319. package/src/core/{eme → decrypt}/types.ts +129 -259
  320. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  321. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  322. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  323. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  324. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  325. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  326. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  327. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  328. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  329. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  330. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  331. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  332. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  333. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  334. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  335. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  336. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  337. package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
  338. package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
  339. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  340. package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
  341. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  342. package/src/core/init/get_initial_time.ts +2 -1
  343. package/src/core/init/initialize_directfile.ts +19 -22
  344. package/src/core/init/initialize_media_source.ts +43 -106
  345. package/src/core/init/link_drm_and_content.ts +176 -0
  346. package/src/core/init/manifest_update_scheduler.ts +12 -10
  347. package/src/core/init/stall_avoider.ts +6 -5
  348. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  349. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  350. package/src/core/init/stream_events_emitter/types.ts +2 -2
  351. package/src/core/init/types.ts +1 -39
  352. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  353. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
  354. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
  355. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  356. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  357. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  358. package/src/core/stream/events_generators.ts +9 -4
  359. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  360. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  361. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  362. package/src/core/stream/period/period_stream.ts +5 -2
  363. package/src/core/stream/representation/force_garbage_collection.ts +5 -7
  364. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  365. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  366. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  367. package/src/core/stream/representation/push_media_segment.ts +3 -2
  368. package/src/core/stream/representation/representation_stream.ts +30 -7
  369. package/src/core/stream/types.ts +1 -1
  370. package/src/default_config.ts +1241 -0
  371. package/src/errors/request_error.ts +4 -1
  372. package/src/experimental/index.ts +5 -0
  373. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  374. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
  375. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  376. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  377. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
  378. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  379. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  380. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  381. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  382. package/src/features/__tests__/initialize_features.test.ts +2 -2
  383. package/src/features/features_object.ts +1 -1
  384. package/src/features/initialize_features.ts +1 -1
  385. package/src/features/list/__tests__/eme.test.ts +5 -5
  386. package/src/features/list/eme.ts +5 -5
  387. package/src/features/types.ts +3 -10
  388. package/src/manifest/adaptation.ts +6 -4
  389. package/src/manifest/manifest.ts +16 -86
  390. package/src/manifest/period.ts +3 -3
  391. package/src/manifest/representation.ts +38 -5
  392. package/src/manifest/representation_index/types.ts +18 -18
  393. package/src/manifest/types.ts +3 -3
  394. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  395. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  396. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  397. package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
  398. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
  399. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
  400. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  401. package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
  402. package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
  403. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  404. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
  405. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  406. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  407. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
  408. package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
  409. package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
  410. package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
  411. package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
  412. package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
  413. package/src/parsers/manifest/dash/parsers_types.ts +3 -3
  414. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  415. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
  416. package/src/parsers/manifest/smooth/create_parser.ts +24 -21
  417. package/src/parsers/manifest/smooth/representation_index.ts +14 -14
  418. package/src/parsers/manifest/types.ts +28 -28
  419. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
  420. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
  421. package/src/parsers/manifest/utils/index_helpers.ts +2 -2
  422. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  423. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  424. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  425. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  426. package/src/public_types.ts +5 -1
  427. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  428. package/src/transports/dash/image_pipelines.ts +4 -1
  429. package/src/transports/dash/init_segment_loader.ts +1 -1
  430. package/src/transports/dash/manifest_parser.ts +1 -1
  431. package/src/transports/dash/segment_loader.ts +7 -7
  432. package/src/transports/dash/segment_parser.ts +8 -1
  433. package/src/transports/dash/text_loader.ts +2 -2
  434. package/src/transports/dash/text_parser.ts +11 -1
  435. package/src/transports/local/segment_loader.ts +4 -4
  436. package/src/transports/local/segment_parser.ts +4 -0
  437. package/src/transports/local/text_parser.ts +8 -0
  438. package/src/transports/metaplaylist/manifest_loader.ts +1 -1
  439. package/src/transports/metaplaylist/pipelines.ts +1 -1
  440. package/src/transports/smooth/pipelines.ts +29 -16
  441. package/src/transports/smooth/segment_loader.ts +8 -8
  442. package/src/transports/types.ts +59 -30
  443. package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
  444. package/src/transports/utils/generate_manifest_loader.ts +1 -1
  445. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  446. package/src/utils/__tests__/flat_map.test.ts +12 -7
  447. package/src/utils/cancellable_sleep.ts +1 -1
  448. package/src/utils/cast_to_observable.ts +1 -2
  449. package/src/utils/deep_merge.ts +46 -0
  450. package/src/utils/reference.ts +116 -23
  451. package/src/utils/request/fetch.ts +17 -15
  452. package/src/utils/request/xhr.ts +11 -8
  453. package/src/utils/rx-from_cancellable_promise.ts +8 -4
  454. package/src/utils/task_canceller.ts +6 -4
  455. package/tsconfig.json +1 -2
  456. package/tsconfig.modules.json +1 -2
  457. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  458. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  459. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  460. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  461. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  462. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  463. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  464. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  465. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  466. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  467. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
  468. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  469. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  470. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  471. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  472. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  473. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  474. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  475. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  476. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  477. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  478. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  479. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  480. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
  481. package/src/core/eme/README.md +0 -26
  482. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  483. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  484. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  485. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  486. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  487. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  488. package/src/core/eme/clear_eme_session.ts +0 -62
  489. package/src/core/eme/create_session.ts +0 -187
  490. package/src/core/eme/dispose_eme.ts +0 -25
  491. package/src/core/eme/dispose_media_keys.ts +0 -46
  492. package/src/core/eme/eme_manager.ts +0 -387
  493. package/src/core/eme/get_media_keys.ts +0 -141
  494. package/src/core/eme/get_session.ts +0 -135
  495. package/src/core/eme/init_media_keys.ts +0 -106
  496. package/src/core/eme/set_server_certificate.ts +0 -115
  497. package/src/core/eme/utils/close_session.ts +0 -113
  498. package/src/core/eme/utils/init_data_store.ts +0 -234
  499. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  500. package/src/core/init/create_eme_manager.ts +0 -95
@@ -0,0 +1,262 @@
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
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */
26
+
27
+ import {
28
+ MediaKeysImpl,
29
+ MediaKeySystemAccessImpl,
30
+ mockCompat,
31
+ } from "./utils";
32
+
33
+ describe("core - decrypt - global tests - server certificate", () => {
34
+
35
+ const getLicenseSpy = jest.fn(() => {
36
+ return new Promise(() => { /* noop */ });
37
+ });
38
+
39
+ /** Default video element used in our tests. */
40
+ const videoElt = document.createElement("video");
41
+
42
+ const serverCertificate = [1, 2, 3];
43
+
44
+ /** Default keySystems configuration used in our tests. */
45
+ const ksConfigCert = [{ type: "com.widevine.alpha",
46
+ getLicense: getLicenseSpy,
47
+ serverCertificate }];
48
+
49
+ beforeEach(() => {
50
+ jest.resetModules();
51
+ jest.restoreAllMocks();
52
+ });
53
+
54
+ it("should set the serverCertificate only after the MediaKeys is attached", (done) => {
55
+ const { setMediaKeysSpy } = mockCompat();
56
+ setMediaKeysSpy.mockImplementation(() => {
57
+ expect(createSessionSpy).not.toHaveBeenCalled();
58
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
59
+ });
60
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
61
+ const serverCertificateSpy =
62
+ jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
63
+ .mockImplementation((_serverCertificate : BufferSource) => {
64
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
65
+ expect(createSessionSpy).not.toHaveBeenCalled();
66
+ return Promise.resolve(true);
67
+ });
68
+
69
+ const { ContentDecryptorState } = require("../../content_decryptor");
70
+ const ContentDecryptor = require("../../content_decryptor").default;
71
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
72
+
73
+ contentDecryptor.addEventListener("stateChange", (state: any) => {
74
+ if (state === ContentDecryptorState.WaitingForAttachment) {
75
+ contentDecryptor.removeEventListener("stateChange");
76
+ setTimeout(() => {
77
+ expect(setMediaKeysSpy).not.toHaveBeenCalled();
78
+ expect(createSessionSpy).not.toHaveBeenCalled();
79
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
80
+ contentDecryptor.attach();
81
+ }, 5);
82
+ }
83
+ });
84
+ setTimeout(() => {
85
+ contentDecryptor.dispose();
86
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
87
+ expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
88
+ expect(createSessionSpy).not.toHaveBeenCalled();
89
+ done();
90
+ }, 10);
91
+ });
92
+
93
+ it("should not call serverCertificate multiple times on init data", (done) => {
94
+ const { setMediaKeysSpy } = mockCompat();
95
+ setMediaKeysSpy.mockImplementation(() => {
96
+ expect(createSessionSpy).not.toHaveBeenCalled();
97
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
98
+ });
99
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
100
+ const serverCertificateSpy =
101
+ jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
102
+ .mockImplementation((_serverCertificate : BufferSource) => {
103
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
104
+ expect(createSessionSpy).not.toHaveBeenCalled();
105
+ return Promise.resolve(true);
106
+ });
107
+
108
+ const { ContentDecryptorState } = require("../../content_decryptor");
109
+ const ContentDecryptor = require("../../content_decryptor").default;
110
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
111
+
112
+ contentDecryptor.addEventListener("stateChange", (state: any) => {
113
+ if (state === ContentDecryptorState.WaitingForAttachment) {
114
+ contentDecryptor.removeEventListener("stateChange");
115
+ setTimeout(() => {
116
+ expect(setMediaKeysSpy).not.toHaveBeenCalled();
117
+ expect(createSessionSpy).not.toHaveBeenCalled();
118
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
119
+ const initData = new Uint8Array([54, 55, 75]);
120
+ contentDecryptor.onInitializationData({
121
+ type: "cenc2",
122
+ values: [ { systemId: "15", data: initData } ],
123
+ });
124
+ contentDecryptor.attach();
125
+ }, 5);
126
+ }
127
+ });
128
+ setTimeout(() => {
129
+ contentDecryptor.dispose();
130
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
131
+ expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
132
+ expect(createSessionSpy).toHaveBeenCalledTimes(1);
133
+ done();
134
+ }, 10);
135
+ });
136
+
137
+ /* eslint-disable max-len */
138
+ it("should emit warning if serverCertificate call rejects but still continue", (done) => {
139
+ /* eslint-enable max-len */
140
+
141
+ const { setMediaKeysSpy } = mockCompat();
142
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
143
+ const serverCertificateSpy =
144
+ jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
145
+ .mockImplementation((_serverCertificate : BufferSource) => {
146
+ throw new Error("some error");
147
+ });
148
+
149
+ const { ContentDecryptorState } = require("../../content_decryptor");
150
+ const ContentDecryptor = require("../../content_decryptor").default;
151
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
152
+
153
+ contentDecryptor.addEventListener("stateChange", (state: any) => {
154
+ if (state === ContentDecryptorState.WaitingForAttachment) {
155
+ contentDecryptor.removeEventListener("stateChange");
156
+ contentDecryptor.attach();
157
+ }
158
+ });
159
+
160
+ let warningsReceived = 0;
161
+ contentDecryptor.addEventListener("warning", (w: any) => {
162
+ expect(w.code).toEqual("LICENSE_SERVER_CERTIFICATE_ERROR");
163
+ expect(w.type).toEqual("ENCRYPTED_MEDIA_ERROR");
164
+ warningsReceived++;
165
+ });
166
+ setTimeout(() => {
167
+ contentDecryptor.dispose();
168
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
169
+ expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
170
+ expect(createSessionSpy).not.toHaveBeenCalled();
171
+ expect(warningsReceived).toEqual(1);
172
+ done();
173
+ }, 10);
174
+ });
175
+
176
+ /* eslint-disable max-len */
177
+ it("should emit warning if serverCertificate call throws but still continue", (done) => {
178
+ /* eslint-enable max-len */
179
+
180
+ const { setMediaKeysSpy } = mockCompat();
181
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
182
+ const serverCertificateSpy =
183
+ jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
184
+ .mockImplementation((_serverCertificate : BufferSource) => {
185
+ return Promise.reject(new Error("some error"));
186
+ });
187
+
188
+ const { ContentDecryptorState } = require("../../content_decryptor");
189
+ const ContentDecryptor = require("../../content_decryptor").default;
190
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
191
+
192
+ contentDecryptor.addEventListener("stateChange", (state: any) => {
193
+ if (state === ContentDecryptorState.WaitingForAttachment) {
194
+ contentDecryptor.removeEventListener("stateChange");
195
+ contentDecryptor.attach();
196
+ }
197
+ });
198
+
199
+ let warningsReceived = 0;
200
+ contentDecryptor.addEventListener("warning", (w: any) => {
201
+ expect(w.code).toEqual("LICENSE_SERVER_CERTIFICATE_ERROR");
202
+ expect(w.type).toEqual("ENCRYPTED_MEDIA_ERROR");
203
+ warningsReceived++;
204
+ });
205
+ setTimeout(() => {
206
+ contentDecryptor.dispose();
207
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
208
+ expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
209
+ expect(createSessionSpy).not.toHaveBeenCalled();
210
+ expect(warningsReceived).toEqual(1);
211
+ done();
212
+ }, 10);
213
+ });
214
+
215
+ /* eslint-disable max-len */
216
+ it("should just continue if setServerCertificate is undefined", (done) => {
217
+ /* eslint-enable max-len */
218
+ const { setMediaKeysSpy } = mockCompat();
219
+ jest.spyOn(MediaKeySystemAccessImpl.prototype, "createMediaKeys")
220
+ .mockImplementation(() => {
221
+ const mediaKeys = new MediaKeysImpl();
222
+ (mediaKeys as { setServerCertificate? : unknown })
223
+ .setServerCertificate = undefined;
224
+ return Promise.resolve(mediaKeys);
225
+ });
226
+ setMediaKeysSpy.mockImplementation(() => {
227
+ expect(createSessionSpy).not.toHaveBeenCalled();
228
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
229
+ });
230
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
231
+ const serverCertificateSpy = jest.spyOn(MediaKeysImpl.prototype,
232
+ "setServerCertificate");
233
+ const { ContentDecryptorState } = require("../../content_decryptor");
234
+ const ContentDecryptor = require("../../content_decryptor").default;
235
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
236
+
237
+ contentDecryptor.addEventListener("stateChange", (state: any) => {
238
+ if (state === ContentDecryptorState.WaitingForAttachment) {
239
+ contentDecryptor.removeEventListener("stateChange");
240
+ setTimeout(() => {
241
+ expect(setMediaKeysSpy).not.toHaveBeenCalled();
242
+ expect(createSessionSpy).not.toHaveBeenCalled();
243
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
244
+ const initData = new Uint8Array([54, 55, 75]);
245
+ contentDecryptor.onInitializationData({
246
+ type: "cenc2",
247
+ values: [ { systemId: "15", data: initData } ],
248
+ });
249
+
250
+ contentDecryptor.attach();
251
+ }, 5);
252
+ }
253
+ });
254
+ setTimeout(() => {
255
+ contentDecryptor.dispose();
256
+ expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
257
+ expect(serverCertificateSpy).not.toHaveBeenCalled();
258
+ expect(createSessionSpy).toHaveBeenCalledTimes(1);
259
+ done();
260
+ }, 10);
261
+ });
262
+ });
@@ -21,20 +21,17 @@
21
21
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
22
22
  /* eslint-disable @typescript-eslint/no-unsafe-return */
23
23
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
24
+ /* eslint-disable @typescript-eslint/naming-convention */
25
+ /* eslint-disable @typescript-eslint/no-explicit-any */
26
+ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
24
27
  /* eslint-disable no-restricted-properties */
25
28
 
26
- import {
27
- defer as observableDefer,
28
- Observable,
29
- of as observableOf,
30
- Subject,
31
- } from "rxjs";
29
+ import { Subject } from "rxjs";
32
30
  import { IEncryptedEventData } from "../../../../compat/eme";
33
31
  import {
34
32
  base64ToBytes,
35
33
  bytesToBase64,
36
34
  } from "../../../../utils/base64";
37
- import castToObservable from "../../../../utils/cast_to_observable";
38
35
  import EventEmitter, { fromEvent } from "../../../../utils/event_emitter";
39
36
  import flatMap from "../../../../utils/flat_map";
40
37
  import {
@@ -44,20 +41,15 @@ import {
44
41
 
45
42
  /** Default MediaKeySystemAccess configuration used by the RxPlayer. */
46
43
  export const defaultKSConfig = [{
47
- audioCapabilities: [ { contentType: "audio/mp4;codecs=\"mp4a.40.2\"",
48
- robustness: undefined },
49
- { contentType: "audio/webm;codecs=opus",
50
- robustness: undefined } ],
44
+ audioCapabilities: [ { contentType: "audio/mp4;codecs=\"mp4a.40.2\"" },
45
+ { contentType: "audio/webm;codecs=opus" } ],
51
46
  distinctiveIdentifier: "optional" as const,
52
47
  initDataTypes: ["cenc"] as const,
53
48
  persistentState: "optional" as const,
54
49
  sessionTypes: ["temporary"] as const,
55
- videoCapabilities: [ { contentType: "video/mp4;codecs=\"avc1.4d401e\"",
56
- robustness: undefined },
57
- { contentType: "video/mp4;codecs=\"avc1.42e01e\"",
58
- robustness: undefined },
59
- { contentType: "video/webm;codecs=\"vp8\"",
60
- robustness: undefined } ],
50
+ videoCapabilities: [ { contentType: "video/mp4;codecs=\"avc1.4d401e\"" },
51
+ { contentType: "video/mp4;codecs=\"avc1.42e01e\"" },
52
+ { contentType: "video/webm;codecs=\"vp8\"" } ],
61
53
  }];
62
54
 
63
55
  /** Default Widevine MediaKeySystemAccess configuration used by the RxPlayer. */
@@ -175,15 +167,17 @@ export class MediaKeySessionImpl extends EventEmitter<Record<string, unknown>> {
175
167
 
176
168
  public generateRequest(initDataType: string, initData: BufferSource) : Promise<void> {
177
169
  const msg = formatFakeChallengeFromInitData(initData, initDataType);
178
- const event : MediaKeyMessageEvent =
179
- Object.assign(new CustomEvent("message"),
180
- { message: msg.buffer,
181
- messageType: "license-request" as const });
182
-
183
- this.trigger("message", event);
184
- if (this.onmessage !== null && this.onmessage !== undefined) {
185
- this.onmessage(event);
186
- }
170
+ setTimeout(() => {
171
+ const event : MediaKeyMessageEvent =
172
+ Object.assign(new CustomEvent("message"),
173
+ { message: msg.buffer,
174
+ messageType: "license-request" as const });
175
+
176
+ this.trigger("message", event);
177
+ if (this.onmessage !== null && this.onmessage !== undefined) {
178
+ this.onmessage(event);
179
+ }
180
+ }, 5);
187
181
  return Promise.resolve();
188
182
  }
189
183
 
@@ -245,8 +239,8 @@ export class MediaKeySystemAccessImpl {
245
239
  export function requestMediaKeySystemAccessImpl(
246
240
  keySystem : string,
247
241
  config : MediaKeySystemConfiguration[]
248
- ) : Observable<MediaKeySystemAccessImpl> {
249
- return observableOf(new MediaKeySystemAccessImpl(keySystem, config));
242
+ ) : Promise<MediaKeySystemAccessImpl> {
243
+ return Promise.resolve(new MediaKeySystemAccessImpl(keySystem, config));
250
244
  }
251
245
 
252
246
  /**
@@ -272,16 +266,14 @@ export function mockCompat(exportedFunctions = {}) {
272
266
  };
273
267
 
274
268
  const rmksaSpy = jest.fn(requestMediaKeySystemAccessImpl);
275
- const setMediaKeysSpy = jest.fn(() => observableOf(null));
269
+ const setMediaKeysSpy = jest.fn();
276
270
  const generateKeyRequestSpy = jest.fn((
277
271
  mks : MediaKeySessionImpl,
278
272
  initializationDataType,
279
273
  initializationData
280
274
  ) => {
281
- return observableDefer(() => {
282
- return castToObservable(mks.generateRequest(initializationDataType,
283
- initializationData));
284
- });
275
+ return mks.generateRequest(initializationDataType,
276
+ initializationData);
285
277
  });
286
278
 
287
279
  const getInitDataSpy = jest.fn((encryptedEvent : IEncryptedEventData) => {
@@ -308,9 +300,7 @@ export function mockCompat(exportedFunctions = {}) {
308
300
  }
309
301
 
310
302
  /**
311
- * Check that the EMEManager, when called with those arguments, throws
312
- * directly without any event emitted.
313
- *
303
+ * Check that the ContentDecryptor, when called with those arguments, throws.
314
304
  * If that's the case, resolve with the corresponding error.
315
305
  * Else, reject.
316
306
  * @param {HTMLMediaElement} mediaElement
@@ -318,79 +308,22 @@ export function mockCompat(exportedFunctions = {}) {
318
308
  * @param {Observable} contentProtections$
319
309
  * @returns {Promise}
320
310
  */
321
- export function testEMEManagerImmediateError(
322
- /* eslint-disable @typescript-eslint/naming-convention */
323
- /* eslint-disable @typescript-eslint/no-explicit-any */
324
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
325
- EMEManager : any,
326
- /* eslint-enable @typescript-eslint/no-explicit-any */
327
- /* eslint-enable @typescript-eslint/naming-convention */
311
+ export function testContentDecryptorError(
312
+ ContentDecryptor : any,
328
313
  mediaElement : HTMLMediaElement,
329
- keySystemsConfigs : unknown[],
330
- contentProtections$ : Observable<unknown>
314
+ keySystemsConfigs : unknown[]
331
315
  ) : Promise<unknown> {
332
316
  return new Promise((res, rej) => {
333
- EMEManager(mediaElement, keySystemsConfigs, contentProtections$)
334
- .subscribe(
335
- (evt : unknown) => {
336
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
- const eventStr = JSON.stringify(evt as any);
338
- rej(new Error("Received an EMEManager event: " + eventStr));
339
- },
340
- (err : unknown) => { res(err); },
341
- () => rej(new Error("EMEManager completed."))
342
- );
317
+ const contentDecryptor = new ContentDecryptor(mediaElement, keySystemsConfigs);
318
+ contentDecryptor.addEventListener("error", (error: any) => {
319
+ res(error);
320
+ });
321
+ setTimeout(() => {
322
+ rej(new Error("Timeout exceeded"));
323
+ }, 10);
343
324
  });
344
325
  }
345
326
 
346
- /**
347
- * Check that the event received corresponds to the session-message event for a
348
- * license request.
349
- * @param {Object} evt
350
- * @param {Object} initDataVal
351
- */
352
- export function expectLicenseRequestMessage(
353
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
- evt : { type : string; value : any },
355
- initDataVal : { type : string | undefined;
356
- values : Array<{ systemId : string | unknown;
357
- data : Uint8Array; }>; }
358
- ) : void {
359
- expect(evt.type).toEqual("session-message");
360
- expect(evt.value.messageType).toEqual("license-request");
361
- expect(evt.value.initializationData).toEqual(initDataVal);
362
- }
363
-
364
- /**
365
- * @param {Object} evt
366
- * @param {Uint8Array} initData
367
- * @param {string|undefined} initDataType
368
- */
369
- export function expectInitDataIgnored(
370
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
371
- evt : { type : string; value : any },
372
- initDataVal : { type : string | undefined;
373
- values : Array<{ systemId : string | undefined;
374
- data : Uint8Array; }>; }
375
- ) : void {
376
- expect(evt.type).toEqual("init-data-ignored");
377
- expect(evt.value.initializationData).toEqual(initDataVal);
378
- }
379
-
380
- /**
381
- * @param {Object} evt
382
- * @param {Uint8Array} initData
383
- * @param {string|undefined} initDataType
384
- */
385
- export function expectEncryptedEventReceived(
386
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
387
- evt : { type : string; value : any },
388
- initData : IEncryptedEventData
389
- ) : void {
390
- expect(evt.type).toEqual("encrypted-event-received");
391
- expect(evt.value).toEqual(initData);
392
- }
393
-
394
327
  /**
395
328
  * Does the reverse operation than what `formatFakeChallengeFromInitData` does:
396
329
  * Retrieve initialization data from a fake challenge done in our tests
@@ -14,51 +14,28 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- defer as observableDefer,
19
- mergeMap,
20
- tap,
21
- Observable,
22
- of as observableOf,
23
- } from "rxjs";
24
17
  import {
25
18
  ICustomMediaKeys,
26
19
  ICustomMediaKeySystemAccess,
27
20
  setMediaKeys,
28
21
  } from "../../compat";
29
22
  import log from "../../log";
30
- import MediaKeysInfosStore from "./media_keys_infos_store";
23
+ import PPromise from "../../utils/promise";
24
+ import { CancellationSignal } from "../../utils/task_canceller";
31
25
  import {
32
26
  IKeySystemOption,
33
27
  } from "./types";
34
28
  import LoadedSessionsStore from "./utils/loaded_sessions_store";
29
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
35
30
 
36
31
  /**
37
- * Dispose the media keys on media element.
32
+ * Dispose of the MediaKeys instance attached to the given media element, if
33
+ * one.
38
34
  * @param {Object} mediaElement
39
- * @returns {Observable}
40
35
  */
41
- export function disableMediaKeys(
42
- mediaElement : HTMLMediaElement
43
- ): Observable<unknown> {
44
- return observableDefer(() => {
45
- MediaKeysInfosStore.setState(mediaElement, null);
46
- return setMediaKeys(mediaElement, null);
47
- });
48
- }
49
-
50
- /** MediaKeys and associated state attached to a media element. */
51
- export interface IMediaKeysState {
52
- /** Options set when the MediaKeys has been attached. */
53
- keySystemOptions : IKeySystemOption;
54
- /** LoadedSessionsStore associated to the MediaKeys instance. */
55
- loadedSessionsStore : LoadedSessionsStore;
56
- /** The MediaKeySystemAccess allowing to create MediaKeys instances. */
57
- mediaKeySystemAccess: MediaKeySystemAccess |
58
- ICustomMediaKeySystemAccess;
59
- /** The MediaKeys instance to attach to the media element. */
60
- mediaKeys : MediaKeys |
61
- ICustomMediaKeys;
36
+ export function disableMediaKeys(mediaElement : HTMLMediaElement): void {
37
+ MediaKeysInfosStore.setState(mediaElement, null);
38
+ setMediaKeys(mediaElement, null);
62
39
  }
63
40
 
64
41
  /**
@@ -69,34 +46,50 @@ export interface IMediaKeysState {
69
46
  * @param {HTMLMediaElement} mediaElement
70
47
  * @returns {Observable}
71
48
  */
72
- export default function attachMediaKeys(
49
+ export default async function attachMediaKeys(
73
50
  mediaElement : HTMLMediaElement,
74
51
  { keySystemOptions,
75
52
  loadedSessionsStore,
76
53
  mediaKeySystemAccess,
77
- mediaKeys } : IMediaKeysState
78
- ) : Observable<unknown> {
79
- return observableDefer(() => {
80
- const previousState = MediaKeysInfosStore.getState(mediaElement);
81
- const closeAllSessions$ = previousState !== null &&
82
- previousState.loadedSessionsStore !== loadedSessionsStore ?
83
- previousState.loadedSessionsStore.closeAllSessions() :
84
- observableOf(null);
54
+ mediaKeys } : IMediaKeysState,
55
+ cancelSignal : CancellationSignal
56
+ ) : Promise<void> {
57
+ const previousState = MediaKeysInfosStore.getState(mediaElement);
58
+ const closeAllSessions = previousState !== null &&
59
+ previousState.loadedSessionsStore !== loadedSessionsStore ?
60
+ previousState.loadedSessionsStore.closeAllSessions() :
61
+ PPromise.resolve();
85
62
 
86
- return closeAllSessions$.pipe(
87
- mergeMap(() => {
88
- MediaKeysInfosStore.setState(mediaElement,
89
- { keySystemOptions,
90
- mediaKeySystemAccess,
91
- mediaKeys,
92
- loadedSessionsStore });
93
- if (mediaElement.mediaKeys === mediaKeys) {
94
- return observableOf(null);
95
- }
96
- log.info("EME: Attaching MediaKeys to the media element");
97
- return setMediaKeys(mediaElement, mediaKeys)
98
- .pipe(tap(() => { log.info("EME: MediaKeys attached with success"); }));
99
- })
100
- );
101
- });
63
+ await closeAllSessions;
64
+
65
+ // If this task has been cancelled while we were closing previous sessions,
66
+ // stop now (and thus avoid setting the new media keys);
67
+ if (cancelSignal.isCancelled) {
68
+ throw cancelSignal.cancellationError;
69
+ }
70
+
71
+ MediaKeysInfosStore.setState(mediaElement, { keySystemOptions,
72
+ mediaKeySystemAccess,
73
+ mediaKeys,
74
+ loadedSessionsStore });
75
+ if (mediaElement.mediaKeys === mediaKeys) {
76
+ return ;
77
+ }
78
+ log.info("DRM: Attaching MediaKeys to the media element");
79
+ setMediaKeys(mediaElement, mediaKeys);
80
+ log.info("DRM: MediaKeys attached with success");
81
+ }
82
+
83
+ /** MediaKeys and associated state attached to a media element. */
84
+ export interface IMediaKeysState {
85
+ /** Options set when the MediaKeys has been attached. */
86
+ keySystemOptions : IKeySystemOption;
87
+ /** LoadedSessionsStore associated to the MediaKeys instance. */
88
+ loadedSessionsStore : LoadedSessionsStore;
89
+ /** The MediaKeySystemAccess allowing to create MediaKeys instances. */
90
+ mediaKeySystemAccess: MediaKeySystemAccess |
91
+ ICustomMediaKeySystemAccess;
92
+ /** The MediaKeys instance to attach to the media element. */
93
+ mediaKeys : MediaKeys |
94
+ ICustomMediaKeys;
102
95
  }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { shouldUnsetMediaKeys } from "../../compat/";
18
+ import log from "../../log";
19
+ import PPromise from "../../utils/promise";
20
+ import disposeDecryptionResources from "./dispose_decryption_resources";
21
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
22
+
23
+ /**
24
+ * Clear DRM-related resources that should be cleared when the current content
25
+ * stops its playback.
26
+ * @param {HTMLMediaElement} mediaElement
27
+ * @returns {Observable}
28
+ */
29
+ export default function clearOnStop(
30
+ mediaElement : HTMLMediaElement
31
+ ) : Promise<void> {
32
+ log.info("DRM: Clearing-up DRM session.");
33
+ if (shouldUnsetMediaKeys()) {
34
+ log.info("DRM: disposing current MediaKeys.");
35
+ return disposeDecryptionResources(mediaElement);
36
+ }
37
+
38
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
39
+ if (currentState !== null &&
40
+ currentState.keySystemOptions.closeSessionsOnStop === true)
41
+ {
42
+ log.info("DRM: closing all current sessions.");
43
+ return currentState.loadedSessionsStore.closeAllSessions();
44
+ }
45
+ log.info("DRM: Nothing to clear. Returning right away. No state =",
46
+ currentState === null);
47
+ return PPromise.resolve();
48
+ }