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,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 {
@@ -170,15 +167,17 @@ export class MediaKeySessionImpl extends EventEmitter<Record<string, unknown>> {
170
167
 
171
168
  public generateRequest(initDataType: string, initData: BufferSource) : Promise<void> {
172
169
  const msg = formatFakeChallengeFromInitData(initData, initDataType);
173
- const event : MediaKeyMessageEvent =
174
- Object.assign(new CustomEvent("message"),
175
- { message: msg.buffer,
176
- messageType: "license-request" as const });
177
-
178
- this.trigger("message", event);
179
- if (this.onmessage !== null && this.onmessage !== undefined) {
180
- this.onmessage(event);
181
- }
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);
182
181
  return Promise.resolve();
183
182
  }
184
183
 
@@ -240,8 +239,8 @@ export class MediaKeySystemAccessImpl {
240
239
  export function requestMediaKeySystemAccessImpl(
241
240
  keySystem : string,
242
241
  config : MediaKeySystemConfiguration[]
243
- ) : Observable<MediaKeySystemAccessImpl> {
244
- return observableOf(new MediaKeySystemAccessImpl(keySystem, config));
242
+ ) : Promise<MediaKeySystemAccessImpl> {
243
+ return Promise.resolve(new MediaKeySystemAccessImpl(keySystem, config));
245
244
  }
246
245
 
247
246
  /**
@@ -267,16 +266,14 @@ export function mockCompat(exportedFunctions = {}) {
267
266
  };
268
267
 
269
268
  const rmksaSpy = jest.fn(requestMediaKeySystemAccessImpl);
270
- const setMediaKeysSpy = jest.fn(() => observableOf(null));
269
+ const setMediaKeysSpy = jest.fn();
271
270
  const generateKeyRequestSpy = jest.fn((
272
271
  mks : MediaKeySessionImpl,
273
272
  initializationDataType,
274
273
  initializationData
275
274
  ) => {
276
- return observableDefer(() => {
277
- return castToObservable(mks.generateRequest(initializationDataType,
278
- initializationData));
279
- });
275
+ return mks.generateRequest(initializationDataType,
276
+ initializationData);
280
277
  });
281
278
 
282
279
  const getInitDataSpy = jest.fn((encryptedEvent : IEncryptedEventData) => {
@@ -303,9 +300,7 @@ export function mockCompat(exportedFunctions = {}) {
303
300
  }
304
301
 
305
302
  /**
306
- * Check that the EMEManager, when called with those arguments, throws
307
- * directly without any event emitted.
308
- *
303
+ * Check that the ContentDecryptor, when called with those arguments, throws.
309
304
  * If that's the case, resolve with the corresponding error.
310
305
  * Else, reject.
311
306
  * @param {HTMLMediaElement} mediaElement
@@ -313,79 +308,22 @@ export function mockCompat(exportedFunctions = {}) {
313
308
  * @param {Observable} contentProtections$
314
309
  * @returns {Promise}
315
310
  */
316
- export function testEMEManagerImmediateError(
317
- /* eslint-disable @typescript-eslint/naming-convention */
318
- /* eslint-disable @typescript-eslint/no-explicit-any */
319
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
320
- EMEManager : any,
321
- /* eslint-enable @typescript-eslint/no-explicit-any */
322
- /* eslint-enable @typescript-eslint/naming-convention */
311
+ export function testContentDecryptorError(
312
+ ContentDecryptor : any,
323
313
  mediaElement : HTMLMediaElement,
324
- keySystemsConfigs : unknown[],
325
- contentProtections$ : Observable<unknown>
314
+ keySystemsConfigs : unknown[]
326
315
  ) : Promise<unknown> {
327
316
  return new Promise((res, rej) => {
328
- EMEManager(mediaElement, keySystemsConfigs, contentProtections$)
329
- .subscribe(
330
- (evt : unknown) => {
331
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
332
- const eventStr = JSON.stringify(evt as any);
333
- rej(new Error("Received an EMEManager event: " + eventStr));
334
- },
335
- (err : unknown) => { res(err); },
336
- () => rej(new Error("EMEManager completed."))
337
- );
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);
338
324
  });
339
325
  }
340
326
 
341
- /**
342
- * Check that the event received corresponds to the session-message event for a
343
- * license request.
344
- * @param {Object} evt
345
- * @param {Object} initDataVal
346
- */
347
- export function expectLicenseRequestMessage(
348
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
349
- evt : { type : string; value : any },
350
- initDataVal : { type : string | undefined;
351
- values : Array<{ systemId : string | unknown;
352
- data : Uint8Array; }>; }
353
- ) : void {
354
- expect(evt.type).toEqual("session-message");
355
- expect(evt.value.messageType).toEqual("license-request");
356
- expect(evt.value.initializationData).toEqual(initDataVal);
357
- }
358
-
359
- /**
360
- * @param {Object} evt
361
- * @param {Uint8Array} initData
362
- * @param {string|undefined} initDataType
363
- */
364
- export function expectInitDataIgnored(
365
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
366
- evt : { type : string; value : any },
367
- initDataVal : { type : string | undefined;
368
- values : Array<{ systemId : string | undefined;
369
- data : Uint8Array; }>; }
370
- ) : void {
371
- expect(evt.type).toEqual("init-data-ignored");
372
- expect(evt.value.initializationData).toEqual(initDataVal);
373
- }
374
-
375
- /**
376
- * @param {Object} evt
377
- * @param {Uint8Array} initData
378
- * @param {string|undefined} initDataType
379
- */
380
- export function expectEncryptedEventReceived(
381
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
382
- evt : { type : string; value : any },
383
- initData : IEncryptedEventData
384
- ) : void {
385
- expect(evt.type).toEqual("encrypted-event-received");
386
- expect(evt.value).toEqual(initData);
387
- }
388
-
389
327
  /**
390
328
  * Does the reverse operation than what `formatFakeChallengeFromInitData` does:
391
329
  * Retrieve initialization data from a fake challenge done in our tests
@@ -14,51 +14,27 @@
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 { CancellationSignal } from "../../utils/task_canceller";
31
24
  import {
32
25
  IKeySystemOption,
33
26
  } from "./types";
34
27
  import LoadedSessionsStore from "./utils/loaded_sessions_store";
28
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
35
29
 
36
30
  /**
37
- * Dispose the media keys on media element.
31
+ * Dispose of the MediaKeys instance attached to the given media element, if
32
+ * one.
38
33
  * @param {Object} mediaElement
39
- * @returns {Observable}
40
34
  */
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;
35
+ export function disableMediaKeys(mediaElement : HTMLMediaElement): void {
36
+ MediaKeysInfosStore.setState(mediaElement, null);
37
+ setMediaKeys(mediaElement, null);
62
38
  }
63
39
 
64
40
  /**
@@ -69,34 +45,50 @@ export interface IMediaKeysState {
69
45
  * @param {HTMLMediaElement} mediaElement
70
46
  * @returns {Observable}
71
47
  */
72
- export default function attachMediaKeys(
48
+ export default async function attachMediaKeys(
73
49
  mediaElement : HTMLMediaElement,
74
50
  { keySystemOptions,
75
51
  loadedSessionsStore,
76
52
  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);
53
+ mediaKeys } : IMediaKeysState,
54
+ cancelSignal : CancellationSignal
55
+ ) : Promise<void> {
56
+ const previousState = MediaKeysInfosStore.getState(mediaElement);
57
+ const closeAllSessions = previousState !== null &&
58
+ previousState.loadedSessionsStore !== loadedSessionsStore ?
59
+ previousState.loadedSessionsStore.closeAllSessions() :
60
+ Promise.resolve();
85
61
 
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
- });
62
+ await closeAllSessions;
63
+
64
+ // If this task has been cancelled while we were closing previous sessions,
65
+ // stop now (and thus avoid setting the new media keys);
66
+ if (cancelSignal.isCancelled) {
67
+ throw cancelSignal.cancellationError;
68
+ }
69
+
70
+ MediaKeysInfosStore.setState(mediaElement, { keySystemOptions,
71
+ mediaKeySystemAccess,
72
+ mediaKeys,
73
+ loadedSessionsStore });
74
+ if (mediaElement.mediaKeys === mediaKeys) {
75
+ return ;
76
+ }
77
+ log.info("DRM: Attaching MediaKeys to the media element");
78
+ setMediaKeys(mediaElement, mediaKeys);
79
+ log.info("DRM: MediaKeys attached with success");
80
+ }
81
+
82
+ /** MediaKeys and associated state attached to a media element. */
83
+ export interface IMediaKeysState {
84
+ /** Options set when the MediaKeys has been attached. */
85
+ keySystemOptions : IKeySystemOption;
86
+ /** LoadedSessionsStore associated to the MediaKeys instance. */
87
+ loadedSessionsStore : LoadedSessionsStore;
88
+ /** The MediaKeySystemAccess allowing to create MediaKeys instances. */
89
+ mediaKeySystemAccess: MediaKeySystemAccess |
90
+ ICustomMediaKeySystemAccess;
91
+ /** The MediaKeys instance to attach to the media element. */
92
+ mediaKeys : MediaKeys |
93
+ ICustomMediaKeys;
102
94
  }
@@ -0,0 +1,47 @@
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 disposeDecryptionResources from "./dispose_decryption_resources";
20
+ import MediaKeysInfosStore from "./utils/media_keys_infos_store";
21
+
22
+ /**
23
+ * Clear DRM-related resources that should be cleared when the current content
24
+ * stops its playback.
25
+ * @param {HTMLMediaElement} mediaElement
26
+ * @returns {Observable}
27
+ */
28
+ export default function clearOnStop(
29
+ mediaElement : HTMLMediaElement
30
+ ) : Promise<void> {
31
+ log.info("DRM: Clearing-up DRM session.");
32
+ if (shouldUnsetMediaKeys()) {
33
+ log.info("DRM: disposing current MediaKeys.");
34
+ return disposeDecryptionResources(mediaElement);
35
+ }
36
+
37
+ const currentState = MediaKeysInfosStore.getState(mediaElement);
38
+ if (currentState !== null &&
39
+ currentState.keySystemOptions.closeSessionsOnStop === true)
40
+ {
41
+ log.info("DRM: closing all current sessions.");
42
+ return currentState.loadedSessionsStore.closeAllSessions();
43
+ }
44
+ log.info("DRM: Nothing to clear. Returning right away. No state =",
45
+ currentState === null);
46
+ return Promise.resolve();
47
+ }