rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.2022032100

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 (400) hide show
  1. package/.eslintrc.js +0 -4
  2. package/CHANGELOG.md +17 -2
  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 +143 -36
  9. package/dist/_esm5.processed/compat/eme/custom_key_system_access.d.ts +15 -0
  10. package/dist/_esm5.processed/compat/eme/custom_key_system_access.js +1 -17
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +6 -7
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  13. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +20 -22
  14. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +58 -40
  15. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +49 -48
  16. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  17. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  18. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  19. package/dist/_esm5.processed/compat/eme/load_session.js +67 -17
  20. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  21. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  22. package/dist/_esm5.processed/config.d.ts +166 -1080
  23. package/dist/_esm5.processed/config.js +17 -1119
  24. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  27. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  28. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  29. package/dist/_esm5.processed/core/api/option_utils.d.ts +6 -3
  30. package/dist/_esm5.processed/core/api/option_utils.js +21 -7
  31. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  32. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  33. package/dist/_esm5.processed/core/api/public_api.js +73 -35
  34. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  35. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  36. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  37. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +103 -0
  38. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  39. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +40 -0
  40. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  41. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +865 -0
  42. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  43. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  45. package/dist/_esm5.processed/core/decrypt/create_session.js +173 -0
  46. package/dist/_esm5.processed/core/{eme/dispose_media_keys.d.ts → decrypt/dispose_decryption_resources.d.ts} +4 -4
  47. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  48. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  49. package/dist/_esm5.processed/core/decrypt/find_key_system.js +299 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  51. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  52. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  53. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  54. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  55. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  56. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  57. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  58. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  60. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  61. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  62. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  63. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  65. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  68. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  69. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +84 -0
  70. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  73. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  74. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  76. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  77. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  78. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  81. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  82. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  83. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +302 -0
  84. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  85. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  86. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  87. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  88. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  89. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  91. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  92. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -5
  93. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  94. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  95. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +2 -3
  96. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  97. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  98. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  99. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +6 -3
  100. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  101. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  102. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  103. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  104. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  105. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  106. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  107. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  108. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  109. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  110. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  111. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  112. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  113. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  114. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  115. package/dist/_esm5.processed/core/stream/index.d.ts +1 -0
  116. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  117. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  118. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  119. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.d.ts +15 -11
  120. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +6 -3
  121. package/dist/_esm5.processed/core/stream/period/index.d.ts +1 -0
  122. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +5 -12
  123. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  124. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  125. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  126. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  127. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  128. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  129. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  130. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  131. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  132. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  133. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  134. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  135. package/dist/_esm5.processed/default_config.js +1145 -0
  136. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  137. package/dist/_esm5.processed/experimental/index.js +2 -0
  138. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  139. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +6 -7
  140. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +2 -3
  141. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +15 -0
  142. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -2
  143. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +3 -5
  144. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +3 -5
  145. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +1 -2
  146. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.js +1 -2
  147. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +1 -2
  148. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -2
  149. package/dist/_esm5.processed/features/features_object.js +1 -1
  150. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  151. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  152. package/dist/_esm5.processed/features/list/eme.js +5 -5
  153. package/dist/_esm5.processed/features/types.d.ts +3 -3
  154. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  155. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  156. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  157. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  158. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  159. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  160. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  161. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  162. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +4 -5
  163. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  164. package/dist/_esm5.processed/public_types.d.ts +3 -2
  165. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +1 -2
  166. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +4 -3
  167. package/dist/_esm5.processed/transports/dash/image_pipelines.js +60 -11
  168. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -2
  169. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
  170. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +1 -1
  171. package/dist/_esm5.processed/transports/dash/segment_loader.js +3 -4
  172. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  173. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -2
  174. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  175. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -3
  176. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  177. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  178. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +2 -3
  179. package/dist/_esm5.processed/transports/smooth/pipelines.js +71 -14
  180. package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -4
  181. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  182. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -2
  183. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -2
  184. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -3
  185. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  186. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  187. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  188. package/dist/_esm5.processed/utils/reference.js +72 -24
  189. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  190. package/dist/_esm5.processed/utils/request/xhr.js +2 -3
  191. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  192. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  193. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  194. package/dist/rx-player.js +4936 -3340
  195. package/dist/rx-player.min.js +1 -1
  196. package/dummy +1 -0
  197. package/{dist/_esm5.processed/utils/promise.d.ts → experimental/index.d.ts} +1 -2
  198. package/{dist/_esm5.processed/utils/promise.js → experimental/index.js} +1 -3
  199. package/package.json +32 -35
  200. package/{src/typings/pinkie.d.ts → scripts/build/templates/experimental/index.d.ts} +1 -4
  201. package/scripts/build/templates/experimental/index.js +16 -0
  202. package/scripts/update-version +2 -2
  203. package/sonar-project.properties +1 -1
  204. package/src/README.md +6 -6
  205. package/src/compat/__tests__/play.test.ts +2 -4
  206. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  207. package/src/compat/browser_detection.ts +4 -2
  208. package/src/compat/eme/close_session.ts +89 -56
  209. package/src/compat/eme/custom_key_system_access.ts +1 -2
  210. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +6 -7
  211. package/src/compat/eme/custom_media_keys/index.ts +20 -38
  212. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +68 -52
  213. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +57 -56
  214. package/src/compat/eme/generate_key_request.ts +25 -33
  215. package/src/compat/eme/load_session.ts +28 -31
  216. package/src/compat/event_listeners.ts +2 -1
  217. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  218. package/src/config.ts +17 -1210
  219. package/src/core/README.md +1 -1
  220. package/src/core/abr/bandwidth_estimator.ts +4 -4
  221. package/src/core/abr/network_analyzer.ts +5 -6
  222. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  223. package/src/core/api/__tests__/option_utils.test.ts +29 -17
  224. package/src/core/api/get_player_state.ts +1 -1
  225. package/src/core/api/index.ts +3 -0
  226. package/src/core/api/option_utils.ts +42 -23
  227. package/src/core/api/playback_observer.ts +12 -8
  228. package/src/core/api/public_api.ts +152 -113
  229. package/src/core/decrypt/README.md +22 -0
  230. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  231. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  232. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  233. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  234. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  235. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  236. package/src/core/{eme → decrypt}/attach_media_keys.ts +48 -56
  237. package/src/core/decrypt/clear_on_stop.ts +47 -0
  238. package/src/core/decrypt/content_decryptor.ts +1157 -0
  239. package/src/core/decrypt/create_or_load_session.ts +130 -0
  240. package/src/core/decrypt/create_session.ts +174 -0
  241. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  242. package/src/core/{eme → decrypt}/find_key_system.ts +111 -122
  243. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  244. package/src/core/decrypt/get_media_keys.ts +145 -0
  245. package/src/core/{eme → decrypt}/index.ts +11 -8
  246. package/src/core/decrypt/init_media_keys.ts +51 -0
  247. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  248. package/src/core/decrypt/set_server_certificate.ts +104 -0
  249. package/src/core/{eme → decrypt}/types.ts +128 -258
  250. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  251. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  252. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  253. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  254. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  255. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +19 -20
  256. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  257. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  258. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  259. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  260. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  261. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  262. package/src/core/decrypt/utils/loaded_sessions_store.ts +317 -0
  263. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  264. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  265. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  266. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  267. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -7
  268. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  269. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  270. package/src/core/fetchers/utils/try_urls_with_backoff.ts +2 -3
  271. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  272. package/src/core/init/get_initial_time.ts +2 -1
  273. package/src/core/init/initialize_directfile.ts +17 -20
  274. package/src/core/init/initialize_media_source.ts +44 -106
  275. package/src/core/init/link_drm_and_content.ts +176 -0
  276. package/src/core/init/manifest_update_scheduler.ts +5 -3
  277. package/src/core/init/stall_avoider.ts +6 -5
  278. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  279. package/src/core/init/types.ts +1 -39
  280. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  281. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  282. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  283. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  284. package/src/core/stream/events_generators.ts +9 -4
  285. package/src/core/stream/index.ts +1 -0
  286. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  287. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  288. package/src/core/stream/period/get_adaptation_switch_strategy.ts +25 -15
  289. package/src/core/stream/period/index.ts +1 -0
  290. package/src/core/stream/period/period_stream.ts +10 -16
  291. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  292. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  293. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  294. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  295. package/src/core/stream/representation/push_media_segment.ts +3 -2
  296. package/src/core/stream/representation/representation_stream.ts +30 -7
  297. package/src/core/stream/types.ts +1 -1
  298. package/src/default_config.ts +1241 -0
  299. package/src/experimental/index.ts +5 -0
  300. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  301. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +7 -7
  302. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  303. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +9 -10
  304. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +2 -4
  305. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +2 -3
  306. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +1 -2
  307. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +3 -5
  308. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +3 -5
  309. package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +1 -2
  310. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +1 -2
  311. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +1 -2
  312. package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.ts +1 -2
  313. package/src/features/__tests__/initialize_features.test.ts +2 -2
  314. package/src/features/features_object.ts +1 -1
  315. package/src/features/initialize_features.ts +1 -1
  316. package/src/features/list/__tests__/eme.test.ts +5 -5
  317. package/src/features/list/eme.ts +5 -5
  318. package/src/features/types.ts +3 -10
  319. package/src/manifest/manifest.ts +6 -76
  320. package/src/manifest/representation.ts +36 -3
  321. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  322. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  323. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  324. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  325. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  326. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +4 -5
  327. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  328. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  329. package/src/public_types.ts +6 -1
  330. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +1 -2
  331. package/src/transports/dash/image_pipelines.ts +15 -14
  332. package/src/transports/dash/init_segment_loader.ts +1 -2
  333. package/src/transports/dash/manifest_parser.ts +2 -3
  334. package/src/transports/dash/segment_loader.ts +4 -5
  335. package/src/transports/dash/segment_parser.ts +5 -0
  336. package/src/transports/dash/text_loader.ts +2 -3
  337. package/src/transports/dash/text_parser.ts +8 -0
  338. package/src/transports/local/segment_loader.ts +2 -3
  339. package/src/transports/local/segment_parser.ts +4 -0
  340. package/src/transports/local/text_parser.ts +8 -0
  341. package/src/transports/metaplaylist/pipelines.ts +2 -3
  342. package/src/transports/smooth/pipelines.ts +26 -14
  343. package/src/transports/smooth/segment_loader.ts +5 -6
  344. package/src/transports/types.ts +22 -0
  345. package/src/transports/utils/call_custom_manifest_loader.ts +1 -2
  346. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  347. package/src/utils/cancellable_sleep.ts +1 -2
  348. package/src/utils/cast_to_observable.ts +0 -2
  349. package/src/utils/deep_merge.ts +46 -0
  350. package/src/utils/reference.ts +116 -23
  351. package/src/utils/request/fetch.ts +1 -2
  352. package/src/utils/request/xhr.ts +3 -3
  353. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  354. package/src/utils/task_canceller.ts +6 -4
  355. package/tsconfig.json +0 -1
  356. package/tsconfig.modules.json +0 -1
  357. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  358. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  359. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  360. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  361. package/dist/_esm5.processed/core/eme/dispose_eme.d.ts +0 -19
  362. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  363. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  364. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  365. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  366. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  367. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  368. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  369. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  370. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  371. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  372. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  373. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  374. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  375. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  376. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  377. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  378. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  379. package/src/core/eme/README.md +0 -26
  380. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  381. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  382. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  383. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  384. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  385. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  386. package/src/core/eme/clear_eme_session.ts +0 -62
  387. package/src/core/eme/create_session.ts +0 -187
  388. package/src/core/eme/dispose_eme.ts +0 -25
  389. package/src/core/eme/dispose_media_keys.ts +0 -46
  390. package/src/core/eme/eme_manager.ts +0 -387
  391. package/src/core/eme/get_media_keys.ts +0 -141
  392. package/src/core/eme/get_session.ts +0 -135
  393. package/src/core/eme/init_media_keys.ts +0 -106
  394. package/src/core/eme/set_server_certificate.ts +0 -115
  395. package/src/core/eme/utils/close_session.ts +0 -113
  396. package/src/core/eme/utils/init_data_store.ts +0 -234
  397. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  398. package/src/core/init/create_eme_manager.ts +0 -95
  399. package/src/utils/__tests__/promise.test.ts +0 -23
  400. package/src/utils/promise.ts +0 -20
@@ -0,0 +1,130 @@
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 { ICustomMediaKeySession } from "../../compat";
18
+ import log from "../../log";
19
+ import { CancellationSignal } from "../../utils/task_canceller";
20
+ import createSession from "./create_session";
21
+ import {
22
+ IProcessedProtectionData,
23
+ IMediaKeySessionStores,
24
+ MediaKeySessionLoadingType,
25
+ } from "./types";
26
+ import cleanOldLoadedSessions from "./utils/clean_old_loaded_sessions";
27
+ import isSessionUsable from "./utils/is_session_usable";
28
+ import KeySessionRecord from "./utils/key_session_record";
29
+
30
+ /**
31
+ * Handle MediaEncryptedEvents sent by a HTMLMediaElement:
32
+ * Either create a MediaKeySession, recuperate a previous MediaKeySession or
33
+ * load a persistent session.
34
+ *
35
+ * Some previously created MediaKeySession can be closed in this process to
36
+ * respect the maximum limit of concurrent MediaKeySession, as defined by the
37
+ * `EME_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS` config property.
38
+ *
39
+ * You can refer to the events emitted to know about the current situation.
40
+ * @param {Object} initializationData
41
+ * @param {Object} stores
42
+ * @param {string} wantedSessionType
43
+ * @param {number} maxSessionCacheSize
44
+ * @param {Object} cancelSignal
45
+ * @returns {Promise}
46
+ */
47
+ export default async function createOrLoadSession(
48
+ initializationData : IProcessedProtectionData,
49
+ stores : IMediaKeySessionStores,
50
+ wantedSessionType : MediaKeySessionType,
51
+ maxSessionCacheSize : number,
52
+ cancelSignal : CancellationSignal
53
+ ) : Promise<ICreateOrLoadSessionResult> {
54
+ /** Store previously-loaded compatible MediaKeySession, if one. */
55
+ let previousLoadedSession : MediaKeySession |
56
+ ICustomMediaKeySession |
57
+ null = null;
58
+
59
+ const { loadedSessionsStore, persistentSessionsStore } = stores;
60
+ const entry = loadedSessionsStore.reuse(initializationData);
61
+ if (entry !== null) {
62
+ previousLoadedSession = entry.mediaKeySession;
63
+ if (isSessionUsable(previousLoadedSession)) {
64
+ log.info("DRM: Reuse loaded session", previousLoadedSession.sessionId);
65
+ return { type: MediaKeySessionLoadingType.LoadedOpenSession,
66
+ value: { mediaKeySession: previousLoadedSession,
67
+ sessionType: entry.sessionType,
68
+ keySessionRecord: entry.keySessionRecord } };
69
+ } else if (persistentSessionsStore !== null) {
70
+ // If the session is not usable anymore, we can also remove it from the
71
+ // PersistentSessionsStore.
72
+ // TODO Are we sure this is always what we want?
73
+ if (entry.mediaKeySession.sessionId !== "") {
74
+ persistentSessionsStore.delete(entry.mediaKeySession.sessionId);
75
+ }
76
+ }
77
+ }
78
+
79
+ if (previousLoadedSession !== null) {
80
+ await loadedSessionsStore.closeSession(previousLoadedSession);
81
+ if (cancelSignal.cancellationError !== null) {
82
+ throw cancelSignal.cancellationError; // stop here if cancelled since
83
+ }
84
+ }
85
+
86
+ await cleanOldLoadedSessions(loadedSessionsStore, maxSessionCacheSize);
87
+ if (cancelSignal.cancellationError !== null) {
88
+ throw cancelSignal.cancellationError; // stop here if cancelled since
89
+ }
90
+
91
+ const evt = await createSession(stores, initializationData, wantedSessionType);
92
+ return { type: evt.type,
93
+ value: { mediaKeySession: evt.value.mediaKeySession,
94
+ sessionType: evt.value.sessionType,
95
+ keySessionRecord: evt.value.keySessionRecord } };
96
+ }
97
+
98
+ /** Information concerning a MediaKeySession. */
99
+ export interface IMediaKeySessionContext {
100
+ /** The MediaKeySession itself. */
101
+ mediaKeySession : MediaKeySession |
102
+ ICustomMediaKeySession;
103
+ /** The type of MediaKeySession (e.g. "temporary"). */
104
+ sessionType : MediaKeySessionType;
105
+ /** `KeySessionRecord` assiociated to this MediaKeySession. */
106
+ keySessionRecord : KeySessionRecord;
107
+ }
108
+
109
+ /** Event emitted when a new MediaKeySession has been created. */
110
+ export interface ICreatedSession {
111
+ type : MediaKeySessionLoadingType.Created;
112
+ value : IMediaKeySessionContext;
113
+ }
114
+
115
+ /** Event emitted when an already-loaded MediaKeySession is used. */
116
+ export interface ILoadedOpenSession {
117
+ type : MediaKeySessionLoadingType.LoadedOpenSession;
118
+ value : IMediaKeySessionContext;
119
+ }
120
+
121
+ /** Event emitted when a persistent MediaKeySession has been loaded. */
122
+ export interface ILoadedPersistentSessionEvent {
123
+ type : MediaKeySessionLoadingType.LoadedPersistentSession;
124
+ value : IMediaKeySessionContext;
125
+ }
126
+
127
+ /** Every possible result returned by `createOrLoadSession`. */
128
+ export type ICreateOrLoadSessionResult = ICreatedSession |
129
+ ILoadedOpenSession |
130
+ ILoadedPersistentSessionEvent;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ ICustomMediaKeySession,
19
+ loadSession,
20
+ } from "../../compat";
21
+ import log from "../../log";
22
+ import {
23
+ IProcessedProtectionData,
24
+ IMediaKeySessionStores,
25
+ MediaKeySessionLoadingType,
26
+ } from "./types";
27
+ import isSessionUsable from "./utils/is_session_usable";
28
+ import KeySessionRecord from "./utils/key_session_record";
29
+ import LoadedSessionsStore from "./utils/loaded_sessions_store";
30
+ import PersistentSessionsStore from "./utils/persistent_sessions_store";
31
+
32
+ /**
33
+ * Create a new Session or load a persistent one on the given MediaKeys,
34
+ * according to wanted settings and what is currently stored.
35
+ *
36
+ * If session creating fails, remove the oldest MediaKeySession loaded and
37
+ * retry.
38
+ *
39
+ * /!\ This only creates new sessions.
40
+ * It will fail if loadedSessionsStore already has a MediaKeySession with
41
+ * the given initialization data.
42
+ * @param {Object} stores
43
+ * @param {Object} initData
44
+ * @param {string} wantedSessionType
45
+ * @returns {Promise}
46
+ */
47
+ export default function createSession(
48
+ stores : IMediaKeySessionStores,
49
+ initData : IProcessedProtectionData,
50
+ wantedSessionType : MediaKeySessionType
51
+ ) : Promise<ICreateSessionEvent> {
52
+ const { loadedSessionsStore,
53
+ persistentSessionsStore } = stores;
54
+
55
+ if (wantedSessionType === "temporary") {
56
+ return createTemporarySession(loadedSessionsStore, initData);
57
+ } else if (persistentSessionsStore === null) {
58
+ log.warn("DRM: Cannot create persistent MediaKeySession, " +
59
+ "PersistentSessionsStore not created.");
60
+ return createTemporarySession(loadedSessionsStore, initData);
61
+ }
62
+ return createAndTryToRetrievePersistentSession(loadedSessionsStore,
63
+ persistentSessionsStore,
64
+ initData);
65
+ }
66
+
67
+ /**
68
+ * Create a new temporary MediaKeySession linked to the given initData and
69
+ * initDataType.
70
+ * @param {Object} loadedSessionsStore
71
+ * @param {Object} initData
72
+ * @returns {Promise}
73
+ */
74
+ function createTemporarySession(
75
+ loadedSessionsStore : LoadedSessionsStore,
76
+ initData : IProcessedProtectionData
77
+ ) : Promise<INewSessionCreatedEvent> {
78
+ log.info("DRM: Creating a new temporary session");
79
+ const entry = loadedSessionsStore.createSession(initData, "temporary");
80
+ return Promise.resolve({ type: MediaKeySessionLoadingType.Created,
81
+ value: entry });
82
+ }
83
+
84
+ /**
85
+ * Create a persistent MediaKeySession and try to load on it a previous
86
+ * MediaKeySession linked to the same initialization data.
87
+ * @param {Object} loadedSessionsStore
88
+ * @param {Object} persistentSessionsStore
89
+ * @param {Object} initData
90
+ * @returns {Promise}
91
+ */
92
+ async function createAndTryToRetrievePersistentSession(
93
+ loadedSessionsStore : LoadedSessionsStore,
94
+ persistentSessionsStore : PersistentSessionsStore,
95
+ initData : IProcessedProtectionData
96
+ ) : Promise<INewSessionCreatedEvent | IPersistentSessionRecoveryEvent> {
97
+ log.info("DRM: Creating persistent MediaKeySession");
98
+
99
+ const entry = loadedSessionsStore.createSession(initData, "persistent-license");
100
+ const storedEntry = persistentSessionsStore.getAndReuse(initData);
101
+ if (storedEntry === null) {
102
+ return { type: MediaKeySessionLoadingType.Created,
103
+ value: entry };
104
+ }
105
+
106
+ try {
107
+ const hasLoadedSession = await loadSession(entry.mediaKeySession,
108
+ storedEntry.sessionId);
109
+ if (!hasLoadedSession) {
110
+ log.warn("DRM: No data stored for the loaded session");
111
+ persistentSessionsStore.delete(storedEntry.sessionId);
112
+ return { type: MediaKeySessionLoadingType.Created,
113
+ value: entry };
114
+ }
115
+
116
+ if (hasLoadedSession && isSessionUsable(entry.mediaKeySession)) {
117
+ persistentSessionsStore.add(initData, initData.keyIds, entry.mediaKeySession);
118
+ log.info("DRM: Succeeded to load persistent session.");
119
+ return { type: MediaKeySessionLoadingType.LoadedPersistentSession,
120
+ value: entry };
121
+ }
122
+
123
+ // Unusable persistent session: recreate a new session from scratch.
124
+ log.warn("DRM: Previous persistent session not usable anymore.");
125
+ return recreatePersistentSession();
126
+ } catch (err) {
127
+ log.warn("DRM: Unable to load persistent session: " +
128
+ (err instanceof Error ? err.toString() :
129
+ "Unknown Error"));
130
+ return recreatePersistentSession();
131
+ }
132
+
133
+ /**
134
+ * Helper function to close and restart the current persistent session
135
+ * considered, and re-create it from scratch.
136
+ * @returns {Observable}
137
+ */
138
+ async function recreatePersistentSession() : Promise<INewSessionCreatedEvent> {
139
+ log.info("DRM: Removing previous persistent session.");
140
+ const persistentEntry = persistentSessionsStore.get(initData);
141
+ if (persistentEntry !== null) {
142
+ persistentSessionsStore.delete(persistentEntry.sessionId);
143
+ }
144
+
145
+ await loadedSessionsStore.closeSession(entry.mediaKeySession);
146
+ const newEntry = loadedSessionsStore.createSession(initData,
147
+ "persistent-license");
148
+ return { type: MediaKeySessionLoadingType.Created,
149
+ value: newEntry };
150
+ }
151
+ }
152
+
153
+ export interface INewSessionCreatedEvent {
154
+ type : MediaKeySessionLoadingType.Created;
155
+ value : {
156
+ mediaKeySession : MediaKeySession |
157
+ ICustomMediaKeySession;
158
+ sessionType : MediaKeySessionType;
159
+ keySessionRecord : KeySessionRecord;
160
+ };
161
+ }
162
+
163
+ export interface IPersistentSessionRecoveryEvent {
164
+ type : MediaKeySessionLoadingType.LoadedPersistentSession;
165
+ value : {
166
+ mediaKeySession : MediaKeySession |
167
+ ICustomMediaKeySession;
168
+ sessionType : MediaKeySessionType;
169
+ keySessionRecord : KeySessionRecord;
170
+ };
171
+ }
172
+
173
+ export type ICreateSessionEvent = INewSessionCreatedEvent |
174
+ IPersistentSessionRecoveryEvent;
@@ -0,0 +1,39 @@
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 { setMediaKeys } from "../../compat";
18
+ import log from "../../log";
19
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
20
+
21
+ /**
22
+ * Free up all ressources taken by the content decryption logic.
23
+ * @param {HTMLMediaElement} mediaElement
24
+ * @returns {Promise}
25
+ */
26
+ export default async function disposeDecryptionResources(
27
+ mediaElement : HTMLMediaElement
28
+ ) : Promise<void> {
29
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
30
+ if (currentState === null) {
31
+ return ;
32
+ }
33
+
34
+ log.info("DRM: Disposing of the current MediaKeys");
35
+ const { loadedSessionsStore } = currentState;
36
+ MediaKeysInfosStore.clearState(mediaElement);
37
+ await loadedSessionsStore.closeAllSessions();
38
+ setMediaKeys(mediaElement, null);
39
+ }
@@ -14,14 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- catchError,
19
- defer as observableDefer,
20
- map,
21
- Observable,
22
- of as observableOf,
23
- throwError as observableThrow,
24
- } from "rxjs";
25
17
  import {
26
18
  ICustomMediaKeySystemAccess,
27
19
  requestMediaKeySystemAccess,
@@ -32,8 +24,9 @@ import { EncryptedMediaError } from "../../errors";
32
24
  import log from "../../log";
33
25
  import arrayIncludes from "../../utils/array_includes";
34
26
  import flatMap from "../../utils/flat_map";
35
- import MediaKeysInfosStore from "./media_keys_infos_store";
27
+ import { CancellationSignal } from "../../utils/task_canceller";
36
28
  import { IKeySystemOption } from "./types";
29
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
37
30
 
38
31
  type MediaKeysRequirement = "optional" |
39
32
  "required" |
@@ -65,8 +58,6 @@ interface IKeySystemType { keyName : string | undefined;
65
58
  keyType : string;
66
59
  keySystemOptions : IKeySystemOption; }
67
60
 
68
- const { EME_DEFAULT_WIDEVINE_ROBUSTNESSES,
69
- EME_KEY_SYSTEMS } = config;
70
61
 
71
62
  /**
72
63
  * @param {Array.<Object>} keySystems
@@ -121,6 +112,7 @@ function checkCachedMediaKeySystemAccess(
121
112
  * @returns {string|undefined} - Either the canonical name, or undefined.
122
113
  */
123
114
  function findKeySystemCanonicalName(ksType: string) : string | undefined {
115
+ const { EME_KEY_SYSTEMS } = config.getCurrent();
124
116
  for (const ksName of Object.keys(EME_KEY_SYSTEMS)) {
125
117
  if (arrayIncludes(EME_KEY_SYSTEMS[ksName] as string[], ksType)) {
126
118
  return ksName;
@@ -158,6 +150,7 @@ function buildKeySystemConfigurations(
158
150
  if (keySystem.distinctiveIdentifierRequired === true) {
159
151
  distinctiveIdentifier = "required";
160
152
  }
153
+ const { EME_DEFAULT_WIDEVINE_ROBUSTNESSES } = config.getCurrent();
161
154
 
162
155
  // Set robustness, in order of consideration:
163
156
  // 1. the user specified its own robustnesses
@@ -235,128 +228,124 @@ function buildKeySystemConfigurations(
235
228
  /**
236
229
  * Try to find a compatible key system from the keySystems array given.
237
230
  *
238
- * Returns an Observable which, when subscribed to, will request a
239
- * MediaKeySystemAccess based on the various keySystems provided. This
240
- * Observable will:
241
- * - emit the MediaKeySystemAccess and the keySystems as an object, when
242
- * found. The object is under this form:
243
- * {
244
- * keySystemAccess {MediaKeySystemAccess}
245
- * keySystem {Object}
246
- * }
247
- * - complete immediately after emitting.
248
- * - throw if no compatible key system has been found.
231
+ * This function will request a MediaKeySystemAccess based on the various
232
+ * keySystems provided.
233
+ *
234
+ * This Promise might either:
235
+ * - resolves the MediaKeySystemAccess and the keySystems as an object, when
236
+ * found.
237
+ * - reject if no compatible key system has been found.
249
238
  *
250
239
  * @param {HTMLMediaElement} mediaElement
251
240
  * @param {Array.<Object>} keySystems - The keySystems you want to test.
252
- * @returns {Observable}
241
+ * @param {Object} cancelSignal
242
+ * @returns {Promise.<Object>}
253
243
  */
254
244
  export default function getMediaKeySystemAccess(
255
245
  mediaElement : HTMLMediaElement,
256
- keySystemsConfigs: IKeySystemOption[]
257
- ) : Observable<IFoundMediaKeySystemAccessEvent> {
258
- return observableDefer<Observable<IFoundMediaKeySystemAccessEvent>>(() => {
259
- log.info("EME: Searching for compatible MediaKeySystemAccess");
260
- const currentState = MediaKeysInfosStore.getState(mediaElement);
261
- if (currentState != null) {
262
- // Fast way to find a compatible keySystem if the currently loaded
263
- // one as exactly the same compatibility options.
264
- const cachedKeySystemAccess =
265
- checkCachedMediaKeySystemAccess(keySystemsConfigs,
266
- currentState.mediaKeySystemAccess,
267
- currentState.keySystemOptions);
268
- if (cachedKeySystemAccess !== null) {
269
- log.info("EME: Found cached compatible keySystem");
270
- return observableOf({
271
- type: "reuse-media-key-system-access" as const,
272
- value: { mediaKeySystemAccess: cachedKeySystemAccess.keySystemAccess,
273
- options: cachedKeySystemAccess.keySystemOptions },
274
- });
275
- }
246
+ keySystemsConfigs: IKeySystemOption[],
247
+ cancelSignal : CancellationSignal
248
+ ) : Promise<IFoundMediaKeySystemAccessEvent> {
249
+ log.info("DRM: Searching for compatible MediaKeySystemAccess");
250
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
251
+ if (currentState != null) {
252
+ // Fast way to find a compatible keySystem if the currently loaded
253
+ // one as exactly the same compatibility options.
254
+ const cachedKeySystemAccess =
255
+ checkCachedMediaKeySystemAccess(keySystemsConfigs,
256
+ currentState.mediaKeySystemAccess,
257
+ currentState.keySystemOptions);
258
+ if (cachedKeySystemAccess !== null) {
259
+ log.info("DRM: Found cached compatible keySystem");
260
+ return Promise.resolve({
261
+ type: "reuse-media-key-system-access" as const,
262
+ value: { mediaKeySystemAccess: cachedKeySystemAccess.keySystemAccess,
263
+ options: cachedKeySystemAccess.keySystemOptions },
264
+ });
276
265
  }
266
+ }
277
267
 
278
- /**
279
- * Array of set keySystems for this content.
280
- * Each item of this array is an object containing the following keys:
281
- * - keyName {string}: keySystem canonical name (e.g. "widevine")
282
- * - keyType {string}: keySystem type (e.g. "com.widevine.alpha")
283
- * - keySystem {Object}: the original keySystem object
284
- * @type {Array.<Object>}
285
- */
286
- const keySystemsType: IKeySystemType[] = keySystemsConfigs.reduce(
287
- (arr: IKeySystemType[], keySystemOptions) => {
288
-
289
- const managedRDNs = EME_KEY_SYSTEMS[keySystemOptions.type];
290
- let ksType;
291
-
292
- if (managedRDNs != null) {
293
- ksType = managedRDNs.map((keyType) => {
294
- const keyName = keySystemOptions.type;
295
- return { keyName, keyType, keySystemOptions };
296
- });
297
- }
298
- else {
299
- const keyName = findKeySystemCanonicalName(keySystemOptions.type);
300
- const keyType = keySystemOptions.type;
301
- ksType = [{ keyName, keyType, keySystemOptions }];
302
- }
303
-
304
- return arr.concat(ksType);
268
+ /**
269
+ * Array of set keySystems for this content.
270
+ * Each item of this array is an object containing the following keys:
271
+ * - keyName {string}: keySystem canonical name (e.g. "widevine")
272
+ * - keyType {string}: keySystem type (e.g. "com.widevine.alpha")
273
+ * - keySystem {Object}: the original keySystem object
274
+ * @type {Array.<Object>}
275
+ */
276
+ const keySystemsType: IKeySystemType[] = keySystemsConfigs.reduce(
277
+ (arr: IKeySystemType[], keySystemOptions) => {
278
+
279
+ const { EME_KEY_SYSTEMS } = config.getCurrent();
280
+ const managedRDNs = EME_KEY_SYSTEMS[keySystemOptions.type];
281
+ let ksType;
282
+
283
+ if (managedRDNs != null) {
284
+ ksType = managedRDNs.map((keyType) => {
285
+ const keyName = keySystemOptions.type;
286
+ return { keyName, keyType, keySystemOptions };
287
+ });
305
288
  }
306
- , []);
307
-
308
- return recursivelyTestKeySystems(0);
309
-
310
- /**
311
- * Test all key system configuration stored in `keySystemsType` one by one
312
- * recursively.
313
- * Returns an Observable which emit the MediaKeySystemAccess if one was
314
- * found compatible with one of the configurations or just throws if none
315
- * were found to be compatible.
316
- * @param {Number} index - The index in `keySystemsType` to start from.
317
- * Should be set to `0` when calling directly.
318
- * @returns {Observable}
319
- */
320
- function recursivelyTestKeySystems(
321
- index : number
322
- ) : Observable<IFoundMediaKeySystemAccessEvent> {
323
- // if we iterated over the whole keySystemsType Array, quit on error
324
- if (index >= keySystemsType.length) {
325
- const error = new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS",
326
- "No key system compatible with your " +
327
- "wanted configuration has been found " +
328
- "in the current browser.");
329
- return observableThrow(() => error);
289
+ else {
290
+ const keyName = findKeySystemCanonicalName(keySystemOptions.type);
291
+ const keyType = keySystemOptions.type;
292
+ ksType = [{ keyName, keyType, keySystemOptions }];
330
293
  }
331
294
 
332
- if (requestMediaKeySystemAccess == null) {
333
- const error = Error("requestMediaKeySystemAccess is not " +
334
- "implemented in your browser.");
335
- return observableThrow(() => error);
336
- }
295
+ return arr.concat(ksType);
296
+ }
297
+ , []);
298
+
299
+ return recursivelyTestKeySystems(0);
300
+
301
+ /**
302
+ * Test all key system configuration stored in `keySystemsType` one by one
303
+ * recursively.
304
+ * Returns a Promise which will emit the MediaKeySystemAccess if one was
305
+ * found compatible with one of the configurations or just reject if none
306
+ * were found to be compatible.
307
+ * @param {Number} index - The index in `keySystemsType` to start from.
308
+ * Should be set to `0` when calling directly.
309
+ * @returns {Promise.<Object>}
310
+ */
311
+ async function recursivelyTestKeySystems(
312
+ index : number
313
+ ) : Promise<IFoundMediaKeySystemAccessEvent> {
314
+ // if we iterated over the whole keySystemsType Array, quit on error
315
+ if (index >= keySystemsType.length) {
316
+ throw new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS",
317
+ "No key system compatible with your wanted " +
318
+ "configuration has been found in the current " +
319
+ "browser.");
320
+
321
+ }
337
322
 
338
- const { keyName, keyType, keySystemOptions } = keySystemsType[index];
339
-
340
- const keySystemConfigurations = buildKeySystemConfigurations(keyName,
341
- keySystemOptions);
342
-
343
- log.debug(`EME: Request keysystem access ${keyType},` +
344
- `${index + 1} of ${keySystemsType.length}`,
345
- keySystemConfigurations);
346
-
347
- return requestMediaKeySystemAccess(keyType, keySystemConfigurations).pipe(
348
- map((keySystemAccess) => {
349
- log.info("EME: Found compatible keysystem", keyType, keySystemConfigurations);
350
- return { type: "create-media-key-system-access" as const,
351
- value: { options: keySystemOptions,
352
- mediaKeySystemAccess: keySystemAccess } };
353
- }),
354
- catchError(() => {
355
- log.debug("EME: Rejected access to keysystem",
356
- keyType,
357
- keySystemConfigurations);
358
- return recursivelyTestKeySystems(index + 1);
359
- }));
323
+ if (requestMediaKeySystemAccess == null) {
324
+ throw new Error("requestMediaKeySystemAccess is not implemented in your browser.");
360
325
  }
361
- });
326
+
327
+ const { keyName, keyType, keySystemOptions } = keySystemsType[index];
328
+
329
+ const keySystemConfigurations = buildKeySystemConfigurations(keyName,
330
+ keySystemOptions);
331
+
332
+ log.debug(`DRM: Request keysystem access ${keyType},` +
333
+ `${index + 1} of ${keySystemsType.length}`,
334
+ keySystemConfigurations);
335
+
336
+ try {
337
+ const keySystemAccess = await requestMediaKeySystemAccess(keyType,
338
+ keySystemConfigurations);
339
+ log.info("DRM: Found compatible keysystem", keyType, keySystemConfigurations);
340
+ return { type: "create-media-key-system-access" as const,
341
+ value: { options: keySystemOptions,
342
+ mediaKeySystemAccess: keySystemAccess } };
343
+ } catch (_) {
344
+ log.debug("DRM: Rejected access to keysystem", keyType, keySystemConfigurations);
345
+ if (cancelSignal.cancellationError !== null) {
346
+ throw cancelSignal.cancellationError;
347
+ }
348
+ return recursivelyTestKeySystems(index + 1);
349
+ }
350
+ }
362
351
  }
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import MediaKeysInfosStore from "./media_keys_infos_store";
17
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
18
18
 
19
19
  /**
20
20
  * Returns the name of the current key system used.