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,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
+ });