rx-player 3.26.2 → 3.27.0-dev.20220317

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/.github/workflows/perfs.yml +22 -0
  2. package/CHANGELOG.md +33 -1
  3. package/FILES.md +5 -4
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  6. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  8. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  14. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  15. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  16. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  17. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  18. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  19. package/dist/_esm5.processed/config.d.ts +166 -1080
  20. package/dist/_esm5.processed/config.js +17 -1119
  21. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  22. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  23. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  24. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
  27. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
  28. package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
  29. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  30. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  31. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  32. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
  33. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  34. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  35. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  36. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  37. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  38. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
  39. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
  40. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
  41. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  42. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  43. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  44. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  45. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  46. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  47. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  48. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  49. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  50. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  51. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  52. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  53. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  56. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  57. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  58. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  60. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  61. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  62. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  63. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  65. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  66. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  67. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
  68. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  70. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  73. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  74. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  75. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  76. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  77. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  78. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  79. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  81. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  83. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  84. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  85. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  86. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  87. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  88. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  89. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  91. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  92. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  93. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  94. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  95. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  96. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  97. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
  98. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
  99. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
  100. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
  101. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  102. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
  103. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  104. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
  105. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  106. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
  107. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  108. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  109. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  110. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  111. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  112. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  113. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  114. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  115. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  116. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  117. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  118. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
  119. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  120. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
  121. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
  122. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  123. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  124. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  125. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  126. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  127. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  128. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  129. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  130. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  131. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  132. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  133. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  134. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
  135. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  136. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  137. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  138. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  139. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  140. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  141. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  142. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  143. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  144. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  145. package/dist/_esm5.processed/default_config.js +1145 -0
  146. package/dist/_esm5.processed/errors/request_error.js +3 -1
  147. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  148. package/dist/_esm5.processed/experimental/index.js +2 -0
  149. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  150. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  151. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
  152. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  153. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  154. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  155. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  156. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  157. package/dist/_esm5.processed/features/features_object.js +1 -1
  158. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  159. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  160. package/dist/_esm5.processed/features/list/eme.js +5 -5
  161. package/dist/_esm5.processed/features/types.d.ts +3 -3
  162. package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
  163. package/dist/_esm5.processed/manifest/adaptation.js +3 -1
  164. package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
  165. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  166. package/dist/_esm5.processed/manifest/period.d.ts +3 -3
  167. package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
  168. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
  169. package/dist/_esm5.processed/manifest/types.d.ts +3 -3
  170. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  171. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  172. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
  173. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  174. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
  175. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  176. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
  177. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
  178. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  179. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  180. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
  181. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
  182. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  183. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  184. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
  185. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
  186. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
  187. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  188. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
  189. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
  190. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
  191. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
  192. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
  193. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
  194. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
  195. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
  196. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
  197. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  198. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  199. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  200. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  201. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  202. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  203. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
  204. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
  205. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  206. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
  207. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  208. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  209. package/dist/_esm5.processed/public_types.d.ts +2 -2
  210. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
  211. package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
  212. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  213. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  214. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  215. package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
  216. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
  217. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  218. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
  219. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
  220. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
  221. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  222. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
  223. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  224. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  225. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  226. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
  227. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  228. package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
  229. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
  230. package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
  231. package/dist/_esm5.processed/transports/types.d.ts +58 -30
  232. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  233. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
  234. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
  235. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  236. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
  237. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  238. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  239. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  240. package/dist/_esm5.processed/utils/reference.js +72 -24
  241. package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
  242. package/dist/_esm5.processed/utils/request/fetch.js +8 -6
  243. package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
  244. package/dist/_esm5.processed/utils/request/xhr.js +3 -2
  245. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
  246. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  247. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  248. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  249. package/dist/rx-player.js +5242 -3190
  250. package/dist/rx-player.min.js +1 -1
  251. package/dummy +1 -0
  252. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  253. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  254. package/package.json +33 -36
  255. package/scripts/build/templates/experimental/index.d.ts +16 -0
  256. package/scripts/build/templates/experimental/index.js +16 -0
  257. package/scripts/doc-generator/generate_header_html.js +6 -7
  258. package/scripts/doc-generator/generate_page_html.js +3 -4
  259. package/scripts/doc-generator/generate_page_list_html.js +4 -5
  260. package/scripts/doc-generator/generate_sidebar_html.js +4 -7
  261. package/scripts/doc-generator/utils.js +0 -11
  262. package/scripts/generate_demo_list.js +3 -3
  263. package/scripts/generate_documentation_list.js +3 -3
  264. package/scripts/launch_static_server.js +127 -67
  265. package/scripts/run_standalone_demo.js +1 -0
  266. package/scripts/start_demo_web_server.js +1 -0
  267. package/sonar-project.properties +1 -1
  268. package/src/README.md +6 -6
  269. package/src/compat/__tests__/fullscreen.test.ts +7 -7
  270. package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
  271. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  272. package/src/compat/browser_detection.ts +4 -2
  273. package/src/compat/eme/close_session.ts +90 -56
  274. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  275. package/src/compat/eme/custom_media_keys/index.ts +28 -41
  276. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  277. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  278. package/src/compat/eme/generate_key_request.ts +25 -33
  279. package/src/compat/eme/load_session.ts +29 -31
  280. package/src/compat/event_listeners.ts +2 -1
  281. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  282. package/src/config.ts +17 -1210
  283. package/src/core/README.md +1 -1
  284. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  285. package/src/core/abr/bandwidth_estimator.ts +4 -4
  286. package/src/core/abr/buffer_based_chooser.ts +85 -20
  287. package/src/core/abr/network_analyzer.ts +6 -7
  288. package/src/core/abr/pending_requests_store.ts +3 -5
  289. package/src/core/abr/representation_estimator.ts +6 -3
  290. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  291. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  292. package/src/core/api/get_player_state.ts +1 -1
  293. package/src/core/api/index.ts +3 -0
  294. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  295. package/src/core/api/option_utils.ts +37 -20
  296. package/src/core/api/playback_observer.ts +12 -8
  297. package/src/core/api/public_api.ts +152 -112
  298. package/src/core/api/track_choice_manager.ts +10 -9
  299. package/src/core/decrypt/README.md +22 -0
  300. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  301. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  302. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  303. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  304. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  305. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
  306. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  307. package/src/core/decrypt/clear_on_stop.ts +48 -0
  308. package/src/core/decrypt/content_decryptor.ts +1158 -0
  309. package/src/core/decrypt/create_or_load_session.ts +130 -0
  310. package/src/core/decrypt/create_session.ts +175 -0
  311. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  312. package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
  313. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  314. package/src/core/decrypt/get_media_keys.ts +145 -0
  315. package/src/core/{eme → decrypt}/index.ts +11 -8
  316. package/src/core/decrypt/init_media_keys.ts +51 -0
  317. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  318. package/src/core/decrypt/set_server_certificate.ts +104 -0
  319. package/src/core/{eme → decrypt}/types.ts +129 -259
  320. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  321. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  322. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  323. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  324. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  325. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  326. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  327. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  328. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  329. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  330. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  331. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  332. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  333. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  334. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  335. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  336. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  337. package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
  338. package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
  339. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  340. package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
  341. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  342. package/src/core/init/get_initial_time.ts +2 -1
  343. package/src/core/init/initialize_directfile.ts +19 -22
  344. package/src/core/init/initialize_media_source.ts +43 -106
  345. package/src/core/init/link_drm_and_content.ts +176 -0
  346. package/src/core/init/manifest_update_scheduler.ts +12 -10
  347. package/src/core/init/stall_avoider.ts +6 -5
  348. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  349. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  350. package/src/core/init/stream_events_emitter/types.ts +2 -2
  351. package/src/core/init/types.ts +1 -39
  352. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  353. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
  354. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
  355. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  356. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  357. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  358. package/src/core/stream/events_generators.ts +9 -4
  359. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  360. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  361. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  362. package/src/core/stream/period/period_stream.ts +5 -2
  363. package/src/core/stream/representation/force_garbage_collection.ts +5 -7
  364. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  365. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  366. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  367. package/src/core/stream/representation/push_media_segment.ts +3 -2
  368. package/src/core/stream/representation/representation_stream.ts +30 -7
  369. package/src/core/stream/types.ts +1 -1
  370. package/src/default_config.ts +1241 -0
  371. package/src/errors/request_error.ts +4 -1
  372. package/src/experimental/index.ts +5 -0
  373. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  374. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
  375. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  376. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  377. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
  378. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  379. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  380. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  381. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  382. package/src/features/__tests__/initialize_features.test.ts +2 -2
  383. package/src/features/features_object.ts +1 -1
  384. package/src/features/initialize_features.ts +1 -1
  385. package/src/features/list/__tests__/eme.test.ts +5 -5
  386. package/src/features/list/eme.ts +5 -5
  387. package/src/features/types.ts +3 -10
  388. package/src/manifest/adaptation.ts +6 -4
  389. package/src/manifest/manifest.ts +16 -86
  390. package/src/manifest/period.ts +3 -3
  391. package/src/manifest/representation.ts +38 -5
  392. package/src/manifest/representation_index/types.ts +18 -18
  393. package/src/manifest/types.ts +3 -3
  394. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  395. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  396. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  397. package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
  398. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
  399. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
  400. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  401. package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
  402. package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
  403. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  404. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
  405. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  406. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  407. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
  408. package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
  409. package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
  410. package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
  411. package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
  412. package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
  413. package/src/parsers/manifest/dash/parsers_types.ts +3 -3
  414. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  415. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
  416. package/src/parsers/manifest/smooth/create_parser.ts +24 -21
  417. package/src/parsers/manifest/smooth/representation_index.ts +14 -14
  418. package/src/parsers/manifest/types.ts +28 -28
  419. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
  420. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
  421. package/src/parsers/manifest/utils/index_helpers.ts +2 -2
  422. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  423. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  424. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  425. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  426. package/src/public_types.ts +5 -1
  427. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  428. package/src/transports/dash/image_pipelines.ts +4 -1
  429. package/src/transports/dash/init_segment_loader.ts +1 -1
  430. package/src/transports/dash/manifest_parser.ts +1 -1
  431. package/src/transports/dash/segment_loader.ts +7 -7
  432. package/src/transports/dash/segment_parser.ts +8 -1
  433. package/src/transports/dash/text_loader.ts +2 -2
  434. package/src/transports/dash/text_parser.ts +11 -1
  435. package/src/transports/local/segment_loader.ts +4 -4
  436. package/src/transports/local/segment_parser.ts +4 -0
  437. package/src/transports/local/text_parser.ts +8 -0
  438. package/src/transports/metaplaylist/manifest_loader.ts +1 -1
  439. package/src/transports/metaplaylist/pipelines.ts +1 -1
  440. package/src/transports/smooth/pipelines.ts +29 -16
  441. package/src/transports/smooth/segment_loader.ts +8 -8
  442. package/src/transports/types.ts +59 -30
  443. package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
  444. package/src/transports/utils/generate_manifest_loader.ts +1 -1
  445. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  446. package/src/utils/__tests__/flat_map.test.ts +12 -7
  447. package/src/utils/cancellable_sleep.ts +1 -1
  448. package/src/utils/cast_to_observable.ts +1 -2
  449. package/src/utils/deep_merge.ts +46 -0
  450. package/src/utils/reference.ts +116 -23
  451. package/src/utils/request/fetch.ts +17 -15
  452. package/src/utils/request/xhr.ts +11 -8
  453. package/src/utils/rx-from_cancellable_promise.ts +8 -4
  454. package/src/utils/task_canceller.ts +6 -4
  455. package/tsconfig.json +1 -2
  456. package/tsconfig.modules.json +1 -2
  457. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  458. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  459. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  460. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  461. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  462. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  463. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  464. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  465. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  466. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  467. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
  468. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  469. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  470. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  471. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  472. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  473. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  474. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  475. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  476. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  477. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  478. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  479. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  480. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
  481. package/src/core/eme/README.md +0 -26
  482. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  483. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  484. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  485. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  486. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  487. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  488. package/src/core/eme/clear_eme_session.ts +0 -62
  489. package/src/core/eme/create_session.ts +0 -187
  490. package/src/core/eme/dispose_eme.ts +0 -25
  491. package/src/core/eme/dispose_media_keys.ts +0 -46
  492. package/src/core/eme/eme_manager.ts +0 -387
  493. package/src/core/eme/get_media_keys.ts +0 -141
  494. package/src/core/eme/get_session.ts +0 -135
  495. package/src/core/eme/init_media_keys.ts +0 -106
  496. package/src/core/eme/set_server_certificate.ts +0 -115
  497. package/src/core/eme/utils/close_session.ts +0 -113
  498. package/src/core/eme/utils/init_data_store.ts +0 -234
  499. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  500. package/src/core/init/create_eme_manager.ts +0 -95
@@ -0,0 +1,675 @@
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-unsafe-argument */
24
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */
25
+ /* eslint-disable @typescript-eslint/no-explicit-any */
26
+
27
+ import {
28
+ formatFakeChallengeFromInitData,
29
+ MediaKeySessionImpl,
30
+ MediaKeysImpl,
31
+ // MediaKeySystemAccessImpl,
32
+ mockCompat,
33
+ // testContentDecryptorError,
34
+ } from "./utils";
35
+
36
+ describe("core - decrypt - global tests - init data", () => {
37
+ /** Default video element used in our tests. */
38
+ const videoElt = document.createElement("video");
39
+
40
+ const getLicenseSpy = jest.fn(() => {
41
+ return new Promise(() => { /* noop */ });
42
+ });
43
+
44
+ /** Default keySystems configuration used in our tests. */
45
+ const ksConfig = [{ type: "com.widevine.alpha", getLicense: getLicenseSpy }];
46
+
47
+ beforeEach(() => {
48
+ jest.resetModules();
49
+ jest.restoreAllMocks();
50
+ getLicenseSpy.mockReset();
51
+ });
52
+
53
+ /* eslint-disable max-len */
54
+ it("should create a session and generate a request when init data is sent through the arguments", () => {
55
+ /* eslint-enable max-len */
56
+ return new Promise<void>((res, rej) => {
57
+ // == mocks ==
58
+ const { generateKeyRequestSpy } = mockCompat();
59
+ const mediaKeySession = new MediaKeySessionImpl();
60
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
61
+ .mockReturnValue(mediaKeySession);
62
+
63
+ // == vars ==
64
+ const initData = new Uint8Array([54, 55, 75]);
65
+
66
+ // == test ==
67
+ const { ContentDecryptorState } = require("../../content_decryptor");
68
+ const ContentDecryptor = require("../../content_decryptor").default;
69
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
70
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
71
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
72
+ rej(new Error(`Unexpected state: ${newState}`));
73
+ }
74
+ contentDecryptor.removeEventListener("stateChange");
75
+ contentDecryptor.attach();
76
+ });
77
+ contentDecryptor.onInitializationData({
78
+ type: "cenc",
79
+ values: [ { systemId: "15", data: initData } ],
80
+ });
81
+ setTimeout(() => {
82
+ try {
83
+ expect(createSessionSpy).toHaveBeenCalledTimes(1);
84
+ expect(createSessionSpy).toHaveBeenCalledWith("temporary");
85
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(1);
86
+ expect(generateKeyRequestSpy)
87
+ .toHaveBeenCalledWith(mediaKeySession, "cenc", initData);
88
+ expect(getLicenseSpy).toHaveBeenCalledTimes(1);
89
+ expect(getLicenseSpy).toHaveBeenCalledWith(
90
+ formatFakeChallengeFromInitData(initData, "cenc"),
91
+ "license-request"
92
+ );
93
+ res();
94
+ } catch (err) {
95
+ rej(err);
96
+ }
97
+ }, 100);
98
+ });
99
+ });
100
+
101
+ it("should ignore init data already sent through the argument", () => {
102
+ return new Promise<void>((res, rej) => {
103
+ // == mocks ==
104
+ const { generateKeyRequestSpy } = mockCompat();
105
+ const mediaKeySession = new MediaKeySessionImpl();
106
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
107
+ .mockReturnValue(mediaKeySession);
108
+
109
+ // == vars ==
110
+ const initData = new Uint8Array([54, 55, 75]);
111
+
112
+ // == test ==
113
+ const { ContentDecryptorState } = require("../../content_decryptor");
114
+ const ContentDecryptor = require("../../content_decryptor").default;
115
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
116
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
117
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
118
+ rej(new Error(`Unexpected state: ${newState}`));
119
+ }
120
+ contentDecryptor.removeEventListener("stateChange");
121
+ contentDecryptor.attach();
122
+ });
123
+ contentDecryptor.onInitializationData({
124
+ type: "cenc",
125
+ values: [ { systemId: "15", data: initData } ],
126
+ });
127
+ contentDecryptor.onInitializationData({
128
+ type: "cenc",
129
+ values: [ { systemId: "15", data: initData } ],
130
+ });
131
+ setTimeout(() => {
132
+ contentDecryptor.onInitializationData({
133
+ type: "cenc",
134
+ values: [ { systemId: "15", data: initData } ],
135
+ });
136
+ }, 5);
137
+ setTimeout(() => {
138
+ try {
139
+ expect(createSessionSpy).toHaveBeenCalledTimes(1);
140
+ expect(createSessionSpy).toHaveBeenCalledWith("temporary");
141
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(1);
142
+ expect(generateKeyRequestSpy)
143
+ .toHaveBeenCalledWith(mediaKeySession, "cenc", initData);
144
+ expect(getLicenseSpy).toHaveBeenCalledTimes(1);
145
+ expect(getLicenseSpy).toHaveBeenCalledWith(
146
+ formatFakeChallengeFromInitData(initData, "cenc"),
147
+ "license-request"
148
+ );
149
+ res();
150
+ } catch (err) {
151
+ rej(err);
152
+ }
153
+ }, 100);
154
+ });
155
+
156
+ });
157
+
158
+ /* eslint-disable max-len */
159
+ it("should create multiple sessions for multiple sent init data when unknown", () => {
160
+ /* eslint-enable max-len */
161
+ return new Promise<void>((res, rej) => {
162
+ // == mocks ==
163
+ const { generateKeyRequestSpy } = mockCompat();
164
+ const mediaKeySessions = [ new MediaKeySessionImpl(),
165
+ new MediaKeySessionImpl(),
166
+ new MediaKeySessionImpl() ];
167
+ let createSessionCallIdx = 0;
168
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
169
+ .mockImplementation(() => mediaKeySessions[createSessionCallIdx++]);
170
+
171
+ // == vars ==
172
+ const initDatas = [ new Uint8Array([54, 55, 75]),
173
+ new Uint8Array([87, 32]),
174
+ new Uint8Array([87, 77]) ];
175
+
176
+ // == test ==
177
+ const { ContentDecryptorState } = require("../../content_decryptor");
178
+ const ContentDecryptor = require("../../content_decryptor").default;
179
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
180
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
181
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
182
+ rej(new Error(`Unexpected state: ${newState}`));
183
+ }
184
+ contentDecryptor.removeEventListener("stateChange");
185
+ contentDecryptor.attach();
186
+ });
187
+ contentDecryptor.onInitializationData({
188
+ type: "cenc",
189
+ values: [ { systemId: "15", data: initDatas[0] } ],
190
+ });
191
+ contentDecryptor.onInitializationData({
192
+ type: "cenc",
193
+ values: [ { systemId: "15", data: initDatas[1] } ],
194
+ });
195
+ contentDecryptor.onInitializationData({
196
+ type: "cenc",
197
+ values: [ { systemId: "15", data: initDatas[0] } ],
198
+ });
199
+ setTimeout(() => {
200
+ contentDecryptor.onInitializationData({
201
+ type: "cenc",
202
+ values: [ { systemId: "15", data: initDatas[2] } ],
203
+ });
204
+ });
205
+ setTimeout(() => {
206
+ contentDecryptor.onInitializationData({
207
+ type: "cenc",
208
+ values: [ { systemId: "15", data: initDatas[1] } ],
209
+ });
210
+ }, 5);
211
+ setTimeout(() => {
212
+ try {
213
+ expect(createSessionSpy).toHaveBeenCalledTimes(3);
214
+ expect(createSessionSpy).toHaveBeenNthCalledWith(1, "temporary");
215
+ expect(createSessionSpy).toHaveBeenNthCalledWith(2, "temporary");
216
+ expect(createSessionSpy).toHaveBeenNthCalledWith(3, "temporary");
217
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(3);
218
+ expect(generateKeyRequestSpy)
219
+ .toHaveBeenNthCalledWith(1, mediaKeySessions[0], "cenc", initDatas[0]);
220
+ expect(generateKeyRequestSpy)
221
+ .toHaveBeenNthCalledWith(2, mediaKeySessions[1], "cenc", initDatas[1]);
222
+ expect(generateKeyRequestSpy)
223
+ .toHaveBeenNthCalledWith(3, mediaKeySessions[2], "cenc", initDatas[2]);
224
+ expect(getLicenseSpy).toHaveBeenCalledTimes(3);
225
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
226
+ 1,
227
+ formatFakeChallengeFromInitData(initDatas[0], "cenc"),
228
+ "license-request"
229
+ );
230
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
231
+ 2,
232
+ formatFakeChallengeFromInitData(initDatas[1], "cenc"),
233
+ "license-request"
234
+ );
235
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
236
+ 3,
237
+ formatFakeChallengeFromInitData(initDatas[2], "cenc"),
238
+ "license-request"
239
+ );
240
+ res();
241
+ } catch (err) {
242
+ rej(err);
243
+ }
244
+ }, 100);
245
+ });
246
+ });
247
+
248
+ /* eslint-disable max-len */
249
+ it("should create multiple sessions for multiple sent init data types", () => {
250
+ /* eslint-enable max-len */
251
+ return new Promise<void>((res, rej) => {
252
+ // == mocks ==
253
+ const { generateKeyRequestSpy } = mockCompat();
254
+ const mediaKeySessions = [ new MediaKeySessionImpl(),
255
+ new MediaKeySessionImpl() ];
256
+ let createSessionCallIdx = 0;
257
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
258
+ .mockImplementation(() => mediaKeySessions[createSessionCallIdx++]);
259
+
260
+ // == vars ==
261
+ const initData = new Uint8Array([54, 55, 75]);
262
+
263
+ // == test ==
264
+ const { ContentDecryptorState } = require("../../content_decryptor");
265
+ const ContentDecryptor = require("../../content_decryptor").default;
266
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
267
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
268
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
269
+ rej(new Error(`Unexpected state: ${newState}`));
270
+ }
271
+ contentDecryptor.removeEventListener("stateChange");
272
+ contentDecryptor.attach();
273
+ });
274
+ contentDecryptor.onInitializationData({
275
+ type: "cenc",
276
+ values: [ { systemId: "15", data: initData } ],
277
+ });
278
+ contentDecryptor.onInitializationData({
279
+ type: "cenc2",
280
+ values: [ { systemId: "15", data: initData } ],
281
+ });
282
+ setTimeout(() => {
283
+ try {
284
+ expect(createSessionSpy).toHaveBeenCalledTimes(2);
285
+ expect(createSessionSpy).toHaveBeenNthCalledWith(1, "temporary");
286
+ expect(createSessionSpy).toHaveBeenNthCalledWith(2, "temporary");
287
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(2);
288
+ expect(generateKeyRequestSpy)
289
+ .toHaveBeenNthCalledWith(1, mediaKeySessions[0], "cenc", initData);
290
+ expect(generateKeyRequestSpy)
291
+ .toHaveBeenNthCalledWith(2, mediaKeySessions[1], "cenc2", initData);
292
+ expect(getLicenseSpy).toHaveBeenCalledTimes(2);
293
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
294
+ 1,
295
+ formatFakeChallengeFromInitData(initData, "cenc"),
296
+ "license-request"
297
+ );
298
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
299
+ 2,
300
+ formatFakeChallengeFromInitData(initData, "cenc2"),
301
+ "license-request"
302
+ );
303
+ res();
304
+ } catch (err) {
305
+ rej(err);
306
+ }
307
+ }, 100);
308
+ });
309
+ });
310
+
311
+ /* eslint-disable max-len */
312
+ it("should create a session and generate a request when init data is received from the browser", () => {
313
+ /* eslint-enable max-len */
314
+ return new Promise<void>((res, rej) => {
315
+ // == mocks ==
316
+ const { generateKeyRequestSpy, eventTriggers, getInitDataSpy } = mockCompat();
317
+ const { triggerEncrypted } = eventTriggers;
318
+ const mediaKeySession = new MediaKeySessionImpl();
319
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
320
+ .mockReturnValue(mediaKeySession);
321
+
322
+ // == vars ==
323
+ const initData = new Uint8Array([54, 55, 75]);
324
+
325
+ // == test ==
326
+ const { ContentDecryptorState } = require("../../content_decryptor");
327
+ const ContentDecryptor = require("../../content_decryptor").default;
328
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
329
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
330
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
331
+ rej(new Error(`Unexpected state: ${newState}`));
332
+ }
333
+ contentDecryptor.removeEventListener("stateChange");
334
+ contentDecryptor.attach();
335
+ });
336
+ const initDataEvent = {
337
+ type: "cenc",
338
+ values: [ { systemId: "15", data: initData } ],
339
+ };
340
+ triggerEncrypted.next(initDataEvent);
341
+ setTimeout(() => {
342
+ try {
343
+ expect(getInitDataSpy).toHaveBeenCalledTimes(1);
344
+ expect(getInitDataSpy).toHaveBeenCalledWith(initDataEvent);
345
+ expect(createSessionSpy).toHaveBeenCalledTimes(1);
346
+ expect(createSessionSpy).toHaveBeenCalledWith("temporary");
347
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(1);
348
+ expect(generateKeyRequestSpy)
349
+ .toHaveBeenCalledWith(mediaKeySession, "cenc", initData);
350
+ expect(getLicenseSpy).toHaveBeenCalledTimes(1);
351
+ expect(getLicenseSpy).toHaveBeenCalledWith(
352
+ formatFakeChallengeFromInitData(initData, "cenc"),
353
+ "license-request"
354
+ );
355
+ res();
356
+ } catch (err) {
357
+ rej(err);
358
+ }
359
+ }, 100);
360
+ });
361
+ });
362
+
363
+ it("should ignore init data already received through the browser", () => {
364
+ return new Promise<void>((res, rej) => {
365
+ // == mocks ==
366
+ const { generateKeyRequestSpy, eventTriggers, getInitDataSpy } = mockCompat();
367
+ const { triggerEncrypted } = eventTriggers;
368
+ const mediaKeySession = new MediaKeySessionImpl();
369
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
370
+ .mockReturnValue(mediaKeySession);
371
+
372
+ // == vars ==
373
+ const initData = new Uint8Array([54, 55, 75]);
374
+
375
+ // == test ==
376
+ const { ContentDecryptorState } = require("../../content_decryptor");
377
+ const ContentDecryptor = require("../../content_decryptor").default;
378
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
379
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
380
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
381
+ rej(new Error(`Unexpected state: ${newState}`));
382
+ }
383
+ contentDecryptor.removeEventListener("stateChange");
384
+ contentDecryptor.attach();
385
+ });
386
+ const initDataEvent = {
387
+ type: "cenc",
388
+ values: [ { systemId: "15", data: initData } ],
389
+ };
390
+ triggerEncrypted.next(initDataEvent);
391
+ triggerEncrypted.next(initDataEvent);
392
+ setTimeout(() => {
393
+ triggerEncrypted.next(initDataEvent);
394
+ }, 5);
395
+ setTimeout(() => {
396
+ try {
397
+ expect(getInitDataSpy).toHaveBeenCalledTimes(3);
398
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(1,
399
+ initDataEvent);
400
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(2,
401
+ initDataEvent);
402
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(3,
403
+ initDataEvent);
404
+ expect(createSessionSpy).toHaveBeenCalledTimes(1);
405
+ expect(createSessionSpy).toHaveBeenCalledWith("temporary");
406
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(1);
407
+ expect(generateKeyRequestSpy)
408
+ .toHaveBeenCalledWith(mediaKeySession, "cenc", initData);
409
+ expect(getLicenseSpy).toHaveBeenCalledTimes(1);
410
+ expect(getLicenseSpy).toHaveBeenCalledWith(
411
+ formatFakeChallengeFromInitData(initData, "cenc"),
412
+ "license-request"
413
+ );
414
+ res();
415
+ } catch (err) {
416
+ rej(err);
417
+ }
418
+ }, 100);
419
+ });
420
+ });
421
+
422
+ /* eslint-disable max-len */
423
+ it("should create multiple sessions for multiple received init data when unknown", () => {
424
+ /* eslint-enable max-len */
425
+ return new Promise<void>((res, rej) => {
426
+ // == mocks ==
427
+ const { generateKeyRequestSpy, eventTriggers, getInitDataSpy } = mockCompat();
428
+ const { triggerEncrypted } = eventTriggers;
429
+ const mediaKeySessions = [ new MediaKeySessionImpl(),
430
+ new MediaKeySessionImpl(),
431
+ new MediaKeySessionImpl() ];
432
+ let createSessionCallIdx = 0;
433
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
434
+ .mockImplementation(() => mediaKeySessions[createSessionCallIdx++]);
435
+
436
+ // == vars ==
437
+ const initDatas = [ new Uint8Array([54, 55, 75]),
438
+ new Uint8Array([87, 32]),
439
+ new Uint8Array([87, 77]) ];
440
+ const initDataEvents = [ { type: "cenc",
441
+ values: [ { systemId: "15", data: initDatas[0] } ] },
442
+
443
+ { type: "cenc",
444
+ values: [ { systemId: "15", data: initDatas[1] } ] },
445
+
446
+ { type: "cenc",
447
+ values: [ { systemId: "15", data: initDatas[2] } ] } ];
448
+
449
+ // == test ==
450
+ const { ContentDecryptorState } = require("../../content_decryptor");
451
+ const ContentDecryptor = require("../../content_decryptor").default;
452
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
453
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
454
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
455
+ rej(new Error(`Unexpected state: ${newState}`));
456
+ }
457
+ contentDecryptor.removeEventListener("stateChange");
458
+ contentDecryptor.attach();
459
+ });
460
+ triggerEncrypted.next(initDataEvents[0]);
461
+ triggerEncrypted.next(initDataEvents[1]);
462
+ triggerEncrypted.next(initDataEvents[0]);
463
+ setTimeout(() => {
464
+ triggerEncrypted.next(initDataEvents[2]);
465
+ });
466
+ setTimeout(() => {
467
+ triggerEncrypted.next(initDataEvents[1]);
468
+ }, 5);
469
+ setTimeout(() => {
470
+ try {
471
+ expect(getInitDataSpy).toHaveBeenCalledTimes(5);
472
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(1,
473
+ initDataEvents[0]);
474
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(2,
475
+ initDataEvents[1]);
476
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(3,
477
+ initDataEvents[0]);
478
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(4,
479
+ initDataEvents[2]);
480
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(5,
481
+ initDataEvents[1]);
482
+ expect(createSessionSpy).toHaveBeenCalledTimes(3);
483
+ expect(createSessionSpy).toHaveBeenNthCalledWith(1, "temporary");
484
+ expect(createSessionSpy).toHaveBeenNthCalledWith(2, "temporary");
485
+ expect(createSessionSpy).toHaveBeenNthCalledWith(3, "temporary");
486
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(3);
487
+ expect(generateKeyRequestSpy)
488
+ .toHaveBeenNthCalledWith(1, mediaKeySessions[0], "cenc", initDatas[0]);
489
+ expect(generateKeyRequestSpy)
490
+ .toHaveBeenNthCalledWith(2, mediaKeySessions[1], "cenc", initDatas[1]);
491
+ expect(generateKeyRequestSpy)
492
+ .toHaveBeenNthCalledWith(3, mediaKeySessions[2], "cenc", initDatas[2]);
493
+ expect(getLicenseSpy).toHaveBeenCalledTimes(3);
494
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
495
+ 1,
496
+ formatFakeChallengeFromInitData(initDatas[0], "cenc"),
497
+ "license-request"
498
+ );
499
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
500
+ 2,
501
+ formatFakeChallengeFromInitData(initDatas[1], "cenc"),
502
+ "license-request"
503
+ );
504
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
505
+ 3,
506
+ formatFakeChallengeFromInitData(initDatas[2], "cenc"),
507
+ "license-request"
508
+ );
509
+ res();
510
+ } catch (err) {
511
+ rej(err);
512
+ }
513
+ }, 100);
514
+ });
515
+ });
516
+
517
+ /* eslint-disable max-len */
518
+ it("should create multiple sessions for multiple received init data types", () => {
519
+ /* eslint-enable max-len */
520
+ return new Promise<void>((res, rej) => {
521
+ // == mocks ==
522
+ const { generateKeyRequestSpy, eventTriggers, getInitDataSpy } = mockCompat();
523
+ const { triggerEncrypted } = eventTriggers;
524
+ const mediaKeySessions = [ new MediaKeySessionImpl(),
525
+ new MediaKeySessionImpl() ];
526
+ let createSessionCallIdx = 0;
527
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
528
+ .mockImplementation(() => mediaKeySessions[createSessionCallIdx++]);
529
+
530
+ // == vars ==
531
+ const initData = new Uint8Array([54, 55, 75]);
532
+ const initDataEvents = [ { type: "cenc",
533
+ values: [ { systemId: "15", data: initData } ] },
534
+
535
+ { type: "cenc2",
536
+ values: [ { systemId: "15", data: initData } ] } ];
537
+
538
+ // == test ==
539
+ const { ContentDecryptorState } = require("../../content_decryptor");
540
+ const ContentDecryptor = require("../../content_decryptor").default;
541
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
542
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
543
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
544
+ rej(new Error(`Unexpected state: ${newState}`));
545
+ }
546
+ contentDecryptor.removeEventListener("stateChange");
547
+ contentDecryptor.attach();
548
+ });
549
+ triggerEncrypted.next(initDataEvents[0]);
550
+ triggerEncrypted.next(initDataEvents[1]);
551
+ setTimeout(() => {
552
+ try {
553
+ expect(getInitDataSpy).toHaveBeenCalledTimes(2);
554
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(1,
555
+ initDataEvents[0]);
556
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(2,
557
+ initDataEvents[1]);
558
+ expect(createSessionSpy).toHaveBeenCalledTimes(2);
559
+ expect(createSessionSpy).toHaveBeenNthCalledWith(1, "temporary");
560
+ expect(createSessionSpy).toHaveBeenNthCalledWith(2, "temporary");
561
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(2);
562
+ expect(generateKeyRequestSpy)
563
+ .toHaveBeenNthCalledWith(1, mediaKeySessions[0], "cenc", initData);
564
+ expect(generateKeyRequestSpy)
565
+ .toHaveBeenNthCalledWith(2, mediaKeySessions[1], "cenc2", initData);
566
+ expect(getLicenseSpy).toHaveBeenCalledTimes(2);
567
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
568
+ 1,
569
+ formatFakeChallengeFromInitData(initData, "cenc"),
570
+ "license-request"
571
+ );
572
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
573
+ 2,
574
+ formatFakeChallengeFromInitData(initData, "cenc2"),
575
+ "license-request"
576
+ );
577
+ res();
578
+ } catch (err) {
579
+ rej(err);
580
+ }
581
+ }, 100);
582
+ });
583
+ });
584
+
585
+ // eslint-disable-next-line max-len
586
+ it("should consider sent event through arguments and received events through the browser the same way", () => {
587
+ return new Promise<void>((res, rej) => {
588
+ // == mocks ==
589
+ const { generateKeyRequestSpy, eventTriggers, getInitDataSpy } = mockCompat();
590
+ const { triggerEncrypted } = eventTriggers;
591
+ const mediaKeySessions = [ new MediaKeySessionImpl(),
592
+ new MediaKeySessionImpl(),
593
+ new MediaKeySessionImpl() ];
594
+ let createSessionCallIdx = 0;
595
+ const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession")
596
+ .mockImplementation(() => mediaKeySessions[createSessionCallIdx++]);
597
+
598
+ // == vars ==
599
+ const initDatas = [ new Uint8Array([54, 55, 75]),
600
+ new Uint8Array([87, 32]),
601
+ new Uint8Array([87, 77]) ];
602
+ const initDataEvents = [ { type: "cenc",
603
+ values: [ { systemId: "15", data: initDatas[0] } ] },
604
+
605
+ { type: "cenc",
606
+ values: [ { systemId: "15", data: initDatas[1] } ] },
607
+
608
+ { type: "cenc",
609
+ values: [ { systemId: "15", data: initDatas[2] } ] } ];
610
+
611
+ // == test ==
612
+ const { ContentDecryptorState } = require("../../content_decryptor");
613
+ const ContentDecryptor = require("../../content_decryptor").default;
614
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
615
+ contentDecryptor.addEventListener("stateChange", (newState: any) => {
616
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
617
+ rej(new Error(`Unexpected state: ${newState}`));
618
+ }
619
+ contentDecryptor.removeEventListener("stateChange");
620
+ contentDecryptor.attach();
621
+ });
622
+ triggerEncrypted.next(initDataEvents[0]);
623
+ contentDecryptor.onInitializationData(initDataEvents[1]);
624
+ triggerEncrypted.next(initDataEvents[1]);
625
+ triggerEncrypted.next(initDataEvents[0]);
626
+ setTimeout(() => {
627
+ contentDecryptor.onInitializationData(initDataEvents[0]);
628
+ triggerEncrypted.next(initDataEvents[2]);
629
+ });
630
+ setTimeout(() => {
631
+ try {
632
+ expect(getInitDataSpy).toHaveBeenCalledTimes(4);
633
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(1,
634
+ initDataEvents[0]);
635
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(2,
636
+ initDataEvents[1]);
637
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(3,
638
+ initDataEvents[0]);
639
+ expect(getInitDataSpy).toHaveBeenNthCalledWith(4,
640
+ initDataEvents[2]);
641
+ expect(createSessionSpy).toHaveBeenCalledTimes(3);
642
+ expect(createSessionSpy).toHaveBeenNthCalledWith(1, "temporary");
643
+ expect(createSessionSpy).toHaveBeenNthCalledWith(2, "temporary");
644
+ expect(createSessionSpy).toHaveBeenNthCalledWith(3, "temporary");
645
+ expect(generateKeyRequestSpy).toHaveBeenCalledTimes(3);
646
+ expect(generateKeyRequestSpy)
647
+ .toHaveBeenNthCalledWith(1, mediaKeySessions[0], "cenc", initDatas[0]);
648
+ expect(generateKeyRequestSpy)
649
+ .toHaveBeenNthCalledWith(2, mediaKeySessions[1], "cenc", initDatas[1]);
650
+ expect(generateKeyRequestSpy)
651
+ .toHaveBeenNthCalledWith(3, mediaKeySessions[2], "cenc", initDatas[2]);
652
+ expect(getLicenseSpy).toHaveBeenCalledTimes(3);
653
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
654
+ 1,
655
+ formatFakeChallengeFromInitData(initDatas[0], "cenc"),
656
+ "license-request"
657
+ );
658
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
659
+ 2,
660
+ formatFakeChallengeFromInitData(initDatas[1], "cenc"),
661
+ "license-request"
662
+ );
663
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(
664
+ 3,
665
+ formatFakeChallengeFromInitData(initDatas[2], "cenc"),
666
+ "license-request"
667
+ );
668
+ res();
669
+ } catch (err) {
670
+ rej(err);
671
+ }
672
+ }, 100);
673
+ });
674
+ });
675
+ });