rx-player 3.26.3-dev.2022021400 → 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 (340) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/FILES.md +5 -4
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  5. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  6. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  7. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  14. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  15. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  16. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  17. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  18. package/dist/_esm5.processed/config.d.ts +166 -1080
  19. package/dist/_esm5.processed/config.js +17 -1119
  20. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  21. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  22. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  23. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  24. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  25. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  26. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  27. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  28. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  29. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  30. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  31. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  32. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  33. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  34. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  35. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  37. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  38. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  39. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  40. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  41. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  42. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  43. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  45. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  46. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  47. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  48. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  49. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  51. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  52. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  53. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  54. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  56. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  57. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  58. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  59. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  60. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  61. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  62. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  63. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  64. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  65. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  68. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  70. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  71. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  72. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  73. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  74. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  76. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  77. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  78. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  80. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  81. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  83. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  84. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  85. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  86. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  87. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  88. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  91. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  92. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  93. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  94. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
  95. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  96. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  97. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  98. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  99. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  100. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  101. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  102. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  103. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  104. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  105. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  106. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  107. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  108. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  109. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  110. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  111. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  112. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  113. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  114. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  115. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  118. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  119. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  120. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  121. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  122. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  123. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  124. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  125. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  126. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  127. package/dist/_esm5.processed/default_config.js +1145 -0
  128. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  129. package/dist/_esm5.processed/experimental/index.js +2 -0
  130. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  131. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -1
  132. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  133. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  134. package/dist/_esm5.processed/features/features_object.js +1 -1
  135. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  136. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  137. package/dist/_esm5.processed/features/list/eme.js +5 -5
  138. package/dist/_esm5.processed/features/types.d.ts +3 -3
  139. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  140. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  141. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  142. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  143. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  144. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  145. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  146. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  147. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  148. package/dist/_esm5.processed/public_types.d.ts +2 -2
  149. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
  150. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  151. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  152. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  153. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  154. package/dist/_esm5.processed/transports/smooth/pipelines.js +68 -10
  155. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  156. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  157. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  158. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  159. package/dist/_esm5.processed/utils/reference.js +72 -24
  160. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  161. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  162. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  163. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  164. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  165. package/dist/rx-player.js +5002 -3033
  166. package/dist/rx-player.min.js +1 -1
  167. package/dummy +1 -0
  168. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  169. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  170. package/package.json +32 -34
  171. package/scripts/build/templates/experimental/index.d.ts +16 -0
  172. package/scripts/build/templates/experimental/index.js +16 -0
  173. package/sonar-project.properties +1 -1
  174. package/src/README.md +6 -6
  175. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  176. package/src/compat/browser_detection.ts +4 -2
  177. package/src/compat/eme/close_session.ts +90 -56
  178. package/src/compat/eme/custom_media_keys/index.ts +21 -38
  179. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  180. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  181. package/src/compat/eme/generate_key_request.ts +25 -33
  182. package/src/compat/eme/load_session.ts +29 -31
  183. package/src/compat/event_listeners.ts +2 -1
  184. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  185. package/src/config.ts +17 -1210
  186. package/src/core/README.md +1 -1
  187. package/src/core/abr/bandwidth_estimator.ts +4 -4
  188. package/src/core/abr/network_analyzer.ts +5 -6
  189. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  190. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  191. package/src/core/api/get_player_state.ts +1 -1
  192. package/src/core/api/index.ts +3 -0
  193. package/src/core/api/option_utils.ts +37 -20
  194. package/src/core/api/playback_observer.ts +12 -8
  195. package/src/core/api/public_api.ts +151 -111
  196. package/src/core/decrypt/README.md +22 -0
  197. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  198. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  199. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  200. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  201. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  202. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  203. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  204. package/src/core/decrypt/clear_on_stop.ts +48 -0
  205. package/src/core/decrypt/content_decryptor.ts +1158 -0
  206. package/src/core/decrypt/create_or_load_session.ts +130 -0
  207. package/src/core/decrypt/create_session.ts +175 -0
  208. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  209. package/src/core/{eme → decrypt}/find_key_system.ts +112 -122
  210. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  211. package/src/core/decrypt/get_media_keys.ts +145 -0
  212. package/src/core/{eme → decrypt}/index.ts +11 -8
  213. package/src/core/decrypt/init_media_keys.ts +51 -0
  214. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  215. package/src/core/decrypt/set_server_certificate.ts +104 -0
  216. package/src/core/{eme → decrypt}/types.ts +128 -258
  217. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  218. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  219. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  220. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  221. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  222. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  223. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  224. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  225. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  226. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  227. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  228. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  229. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  230. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  231. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  232. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  233. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
  235. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  236. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  237. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  238. package/src/core/init/get_initial_time.ts +2 -1
  239. package/src/core/init/initialize_directfile.ts +17 -20
  240. package/src/core/init/initialize_media_source.ts +42 -105
  241. package/src/core/init/link_drm_and_content.ts +176 -0
  242. package/src/core/init/manifest_update_scheduler.ts +5 -3
  243. package/src/core/init/stall_avoider.ts +6 -5
  244. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  245. package/src/core/init/types.ts +1 -39
  246. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  247. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  248. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  249. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  250. package/src/core/stream/events_generators.ts +9 -4
  251. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  252. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  253. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  254. package/src/core/stream/period/period_stream.ts +5 -2
  255. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  256. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  257. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  258. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  259. package/src/core/stream/representation/push_media_segment.ts +3 -2
  260. package/src/core/stream/representation/representation_stream.ts +30 -7
  261. package/src/core/stream/types.ts +1 -1
  262. package/src/default_config.ts +1241 -0
  263. package/src/experimental/index.ts +5 -0
  264. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  265. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
  266. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  267. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  268. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  269. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  270. package/src/features/__tests__/initialize_features.test.ts +2 -2
  271. package/src/features/features_object.ts +1 -1
  272. package/src/features/initialize_features.ts +1 -1
  273. package/src/features/list/__tests__/eme.test.ts +5 -5
  274. package/src/features/list/eme.ts +5 -5
  275. package/src/features/types.ts +3 -10
  276. package/src/manifest/manifest.ts +6 -76
  277. package/src/manifest/representation.ts +36 -3
  278. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  279. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  280. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  281. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  282. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  283. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  284. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  285. package/src/public_types.ts +5 -1
  286. package/src/transports/dash/image_pipelines.ts +3 -0
  287. package/src/transports/dash/segment_parser.ts +5 -0
  288. package/src/transports/dash/text_parser.ts +8 -0
  289. package/src/transports/local/segment_parser.ts +4 -0
  290. package/src/transports/local/text_parser.ts +8 -0
  291. package/src/transports/smooth/pipelines.ts +22 -9
  292. package/src/transports/types.ts +22 -0
  293. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  294. package/src/utils/deep_merge.ts +46 -0
  295. package/src/utils/reference.ts +116 -23
  296. package/src/utils/request/fetch.ts +1 -2
  297. package/src/utils/request/xhr.ts +2 -1
  298. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  299. package/src/utils/task_canceller.ts +6 -4
  300. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  301. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  302. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  303. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  304. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  305. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  306. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  307. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  308. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  309. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  310. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  311. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  312. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  313. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  314. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  315. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  316. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  317. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  318. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  319. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  320. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  321. package/src/core/eme/README.md +0 -26
  322. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  323. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  324. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  325. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  326. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  327. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  328. package/src/core/eme/clear_eme_session.ts +0 -62
  329. package/src/core/eme/create_session.ts +0 -187
  330. package/src/core/eme/dispose_eme.ts +0 -25
  331. package/src/core/eme/dispose_media_keys.ts +0 -46
  332. package/src/core/eme/eme_manager.ts +0 -387
  333. package/src/core/eme/get_media_keys.ts +0 -141
  334. package/src/core/eme/get_session.ts +0 -135
  335. package/src/core/eme/init_media_keys.ts +0 -106
  336. package/src/core/eme/set_server_certificate.ts +0 -115
  337. package/src/core/eme/utils/close_session.ts +0 -113
  338. package/src/core/eme/utils/init_data_store.ts +0 -234
  339. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  340. package/src/core/init/create_eme_manager.ts +0 -95
@@ -0,0 +1,418 @@
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/restrict-template-expressions */
24
+ /* eslint-disable no-restricted-properties */
25
+
26
+ import { ICustomError } from "../../../../errors";
27
+ import { concat } from "../../../../utils/byte_parsing";
28
+ import {
29
+ formatFakeChallengeFromInitData,
30
+ MediaKeySessionImpl,
31
+ MediaKeysImpl,
32
+ mockCompat,
33
+ } from "./utils";
34
+
35
+ /** Default video element used in our tests. */
36
+ const videoElt = document.createElement("video");
37
+
38
+ /* eslint-disable max-len */
39
+ describe("core - decrypt - global tests - getLicense", () => {
40
+
41
+ beforeEach(() => {
42
+ jest.resetModules();
43
+ jest.restoreAllMocks();
44
+ });
45
+
46
+ it("should update the session after getLicense resolves with a license", async () => {
47
+ await checkGetLicense({ isGetLicensePromiseBased: true,
48
+ configuredRetries: undefined,
49
+ configuredTimeout: undefined,
50
+ getTimeout: () => undefined,
51
+ nbRetries: 0,
52
+ ignoreLicenseRequests: false });
53
+ });
54
+
55
+ it("should update the session after getLicense returns a license directly", async () => {
56
+ await checkGetLicense({ isGetLicensePromiseBased: false,
57
+ configuredRetries: undefined,
58
+ configuredTimeout: undefined,
59
+ getTimeout: () => undefined,
60
+ nbRetries: 0,
61
+ ignoreLicenseRequests: false });
62
+ });
63
+
64
+ it("should not update the session after getLicense resolves with null", async () => {
65
+ await checkGetLicense({ isGetLicensePromiseBased: true,
66
+ configuredRetries: undefined,
67
+ configuredTimeout: undefined,
68
+ getTimeout: () => undefined,
69
+ nbRetries: 0,
70
+ ignoreLicenseRequests: true });
71
+ });
72
+
73
+ it("should not update the session after getLicense returns null directly", async () => {
74
+ await checkGetLicense({ isGetLicensePromiseBased: false,
75
+ configuredRetries: undefined,
76
+ configuredTimeout: undefined,
77
+ getTimeout: () => undefined,
78
+ nbRetries: 0,
79
+ ignoreLicenseRequests: true });
80
+ });
81
+
82
+ it("should be able to retry maximum two times and fail after 3 tries with a rejected promise", async () => {
83
+ await checkGetLicense({ isGetLicensePromiseBased: true,
84
+ configuredRetries: undefined,
85
+ configuredTimeout: undefined,
86
+ getTimeout: () => undefined,
87
+ nbRetries: 3,
88
+ ignoreLicenseRequests: false });
89
+ });
90
+
91
+ it("should be able to retry maximum two times and fail after 3 tries with a thrown error", async () => {
92
+ await checkGetLicense({ isGetLicensePromiseBased: false,
93
+ configuredRetries: undefined,
94
+ configuredTimeout: undefined,
95
+ getTimeout: () => undefined,
96
+ nbRetries: 3,
97
+ ignoreLicenseRequests: true });
98
+ });
99
+
100
+ it("should be able to retry two times and succeed after a time with a resolved license", async () => {
101
+ await checkGetLicense({ isGetLicensePromiseBased: true,
102
+ configuredRetries: undefined,
103
+ configuredTimeout: undefined,
104
+ getTimeout: () => undefined,
105
+ nbRetries: 2,
106
+ ignoreLicenseRequests: false });
107
+ });
108
+
109
+ it("should be able to retry two times and succeed after a time with a returned license", async () => {
110
+ await checkGetLicense({ isGetLicensePromiseBased: false,
111
+ configuredRetries: undefined,
112
+ configuredTimeout: undefined,
113
+ getTimeout: () => undefined,
114
+ nbRetries: 2,
115
+ ignoreLicenseRequests: false });
116
+ });
117
+
118
+ it("should be able to retry two times and succeed after a time with a resolved null", async () => {
119
+ await checkGetLicense({ isGetLicensePromiseBased: true,
120
+ configuredRetries: undefined,
121
+ configuredTimeout: undefined,
122
+ getTimeout: () => undefined,
123
+ nbRetries: 2,
124
+ ignoreLicenseRequests: true });
125
+ });
126
+
127
+ it("should be able to retry two times and succeed after a time with a returned null", async () => {
128
+ await checkGetLicense({ isGetLicensePromiseBased: false,
129
+ configuredRetries: undefined,
130
+ configuredTimeout: undefined,
131
+ getTimeout: () => undefined,
132
+ nbRetries: 2,
133
+ ignoreLicenseRequests: true });
134
+ });
135
+
136
+ it("should be able to retry one time and succeed after a time with a resolved license", async () => {
137
+ await checkGetLicense({ isGetLicensePromiseBased: true,
138
+ configuredRetries: undefined,
139
+ configuredTimeout: undefined,
140
+ getTimeout: () => undefined,
141
+ nbRetries: 1,
142
+ ignoreLicenseRequests: false });
143
+ });
144
+
145
+ it("should be able to retry one time and succeed after a time with a returned license", async () => {
146
+ await checkGetLicense({ isGetLicensePromiseBased: false,
147
+ configuredRetries: undefined,
148
+ configuredTimeout: undefined,
149
+ getTimeout: () => undefined,
150
+ nbRetries: 1,
151
+ ignoreLicenseRequests: false });
152
+ });
153
+
154
+ it("should be able to retry two times and succeed after a time with a resolved null", async () => {
155
+ await checkGetLicense({ isGetLicensePromiseBased: true,
156
+ configuredRetries: undefined,
157
+ configuredTimeout: undefined,
158
+ getTimeout: () => undefined,
159
+ nbRetries: 1,
160
+ ignoreLicenseRequests: true });
161
+ });
162
+
163
+ it("should be able to retry two times and succeed after a time with a returned null", async () => {
164
+ await checkGetLicense({ isGetLicensePromiseBased: false,
165
+ configuredRetries: undefined,
166
+ configuredTimeout: undefined,
167
+ getTimeout: () => undefined,
168
+ nbRetries: 1,
169
+ ignoreLicenseRequests: true });
170
+ });
171
+
172
+ it("should be able to fetch a license directly even when getLicenseConfig.retry is set to `0`", async () => {
173
+ await checkGetLicense({ isGetLicensePromiseBased: true,
174
+ configuredRetries: 0,
175
+ configuredTimeout: undefined,
176
+ getTimeout: () => undefined,
177
+ nbRetries: 0,
178
+ ignoreLicenseRequests: false });
179
+ });
180
+
181
+ it("should fail after first failure when getLicenseConfig.retry is set to `0`", async () => {
182
+ await checkGetLicense({ isGetLicensePromiseBased: true,
183
+ configuredRetries: 1,
184
+ configuredTimeout: undefined,
185
+ getTimeout: () => undefined,
186
+ nbRetries: 0,
187
+ ignoreLicenseRequests: false });
188
+ });
189
+
190
+ it("should fail after two failures when getLicenseConfig.retry is set to `1`", async () => {
191
+ await checkGetLicense({ isGetLicensePromiseBased: true,
192
+ configuredRetries: 2,
193
+ configuredTimeout: undefined,
194
+ getTimeout: () => undefined,
195
+ nbRetries: 2,
196
+ ignoreLicenseRequests: false });
197
+ });
198
+
199
+ it("should not fail after one failure when getLicenseConfig.retry is set to `1`", async () => {
200
+ await checkGetLicense({ isGetLicensePromiseBased: true,
201
+ configuredRetries: 2,
202
+ configuredTimeout: undefined,
203
+ getTimeout: () => undefined,
204
+ nbRetries: 1,
205
+ ignoreLicenseRequests: false });
206
+ });
207
+
208
+ it("should not fail after 5 failures when getLicenseConfig.retry is set to `6`", async () => {
209
+ await checkGetLicense({ isGetLicensePromiseBased: true,
210
+ configuredRetries: 6,
211
+ configuredTimeout: undefined,
212
+ getTimeout: () => undefined,
213
+ nbRetries: 5,
214
+ ignoreLicenseRequests: false });
215
+ }, 15000);
216
+
217
+ it("should fail after 6 failures when getLicenseConfig.retry is set to `6`", async () => {
218
+ await checkGetLicense({ isGetLicensePromiseBased: true,
219
+ configuredRetries: 6,
220
+ configuredTimeout: undefined,
221
+ getTimeout: () => undefined,
222
+ nbRetries: 6,
223
+ ignoreLicenseRequests: false });
224
+ }, 15000);
225
+
226
+ it("should not fail after 5 failures when getLicenseConfig.retry is set to `Infinity`", async () => {
227
+ await checkGetLicense({ isGetLicensePromiseBased: true,
228
+ configuredRetries: Infinity,
229
+ configuredTimeout: undefined,
230
+ getTimeout: () => undefined,
231
+ nbRetries: 5,
232
+ ignoreLicenseRequests: false });
233
+ }, 15000);
234
+
235
+ });
236
+
237
+ /**
238
+ * HUGE function to check most getLicense scenarios.
239
+ * @param {Object} opts
240
+ */
241
+ function checkGetLicense(
242
+ { isGetLicensePromiseBased,
243
+ configuredRetries,
244
+ configuredTimeout,
245
+ getTimeout,
246
+ nbRetries,
247
+ ignoreLicenseRequests } : {
248
+ /**
249
+ * Set it to false if you want to return directly a value from
250
+ * `getLicense` (i.e. not wrapped in a Promise).
251
+ * This is valable both for success, and errors (which will be either
252
+ * thrown directly or wrapped in a rejecting Promise).
253
+ *
254
+ * This value will be forced to `true` if the `getTimeout` call for the
255
+ * corresponding `getLicense` returns something other than `undefined`.
256
+ */
257
+ isGetLicensePromiseBased : boolean;
258
+ /** Maximum amount of retries: value of getLicenseConfig.retry. */
259
+ configuredRetries : number | undefined;
260
+ /**
261
+ * Return getLicense timeout after which the response will be emitted, in
262
+ * milliseconds.
263
+ * Put to `undefined` for no timeout at all (synchronous).
264
+ * Note that if a timeout is given, getLicense will return a Promise.
265
+ * As such, `isGetLicensePromiseBased` will be ignored.
266
+ */
267
+ getTimeout : (callIdx : number) => number | undefined;
268
+ /** Maximum configured timeout: value of getLicenseConfig.timeout. */
269
+ configuredTimeout : number | undefined;
270
+ /**
271
+ * Nb of times getLicense should fail in a row.
272
+ * If put at a higher value or equal to `configuredRetries`, no license
273
+ * will be obtained.
274
+ */
275
+ nbRetries : number;
276
+ /**
277
+ * If `true`, getLicense will return `null` - to ignore a request - when
278
+ * it succeed.
279
+ */
280
+ ignoreLicenseRequests : boolean; }
281
+ ) : Promise<void> {
282
+ return new Promise((res, rej) => {
283
+ // == mocks ==
284
+ mockCompat();
285
+ const mediaKeySession = new MediaKeySessionImpl();
286
+ jest.spyOn(MediaKeysImpl.prototype, "createSession").mockReturnValue(mediaKeySession);
287
+ const updateSpy = jest.spyOn(mediaKeySession, "update");
288
+ let remainingRetries = nbRetries;
289
+ const getLicenseSpy = jest.fn(() => {
290
+ const callIdx = nbRetries - remainingRetries;
291
+ const timeout = getTimeout(callIdx);
292
+ if (remainingRetries === 0) {
293
+ const challengeU8 = new Uint8Array(challenge);
294
+ const result = ignoreLicenseRequests ? null :
295
+ concat(challengeU8, challengeU8);
296
+ if (timeout !== undefined) {
297
+ return new Promise(resolve => {
298
+ setTimeout(() => resolve(result), timeout);
299
+ });
300
+ }
301
+ return isGetLicensePromiseBased ? Promise.resolve(result) :
302
+ result;
303
+ }
304
+ remainingRetries--;
305
+ if (timeout !== undefined) {
306
+ return new Promise((_, reject) => {
307
+ setTimeout(() => {
308
+ reject("AAAA");
309
+ }, timeout);
310
+ });
311
+ }
312
+ if (!isGetLicensePromiseBased) {
313
+ throw new Error("AAAA");
314
+ }
315
+ return Promise.reject(new Error("AAAA"));
316
+ });
317
+
318
+ // == vars ==
319
+ /** Default keySystems configuration used in our tests. */
320
+ const maxRetries = configuredRetries === undefined ? 3 :
321
+ configuredRetries;
322
+ const shouldFail = nbRetries >= maxRetries;
323
+ let warningsLeft = nbRetries;
324
+ const ksConfig = [{ type: "com.widevine.alpha",
325
+ getLicense: getLicenseSpy,
326
+ getLicenseConfig: configuredRetries !== undefined ||
327
+ configuredTimeout !== undefined ?
328
+ { retry: configuredRetries,
329
+ timeout: configuredTimeout } :
330
+ undefined }];
331
+ const initData = new Uint8Array([54, 55, 75]);
332
+ const initDataEvent = { type: "cenc", values: [ { systemId: "15", data: initData } ] };
333
+ const challenge = formatFakeChallengeFromInitData(initData, "cenc");
334
+ function checkKeyLoadError(error : unknown) {
335
+ try {
336
+ expect(error).toBeInstanceOf(Error);
337
+ expect((error as ICustomError).name).toEqual("EncryptedMediaError");
338
+ expect((error as ICustomError).type).toEqual("ENCRYPTED_MEDIA_ERROR");
339
+ expect((error as ICustomError).code).toEqual("KEY_LOAD_ERROR");
340
+ expect((error as ICustomError).message).toEqual("AAAA");
341
+ } catch (e) {
342
+ rej(e);
343
+ }
344
+ }
345
+
346
+ // == test ==
347
+ const { ContentDecryptorState } = require("../../content_decryptor");
348
+ const ContentDecryptor = require("../../content_decryptor").default;
349
+ const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
350
+
351
+ contentDecryptor.addEventListener("stateChange", (newState: number) => {
352
+ if (newState !== ContentDecryptorState.WaitingForAttachment) {
353
+ rej(new Error(`Unexpected state: ${newState}`));
354
+ }
355
+ contentDecryptor.removeEventListener("stateChange");
356
+ contentDecryptor.attach();
357
+ });
358
+
359
+ contentDecryptor.addEventListener("error", (error: unknown) => {
360
+ if (shouldFail) {
361
+ try {
362
+ checkKeyLoadError(error);
363
+ expect(getLicenseSpy).toHaveBeenCalledTimes(maxRetries);
364
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(maxRetries, challenge, "license-request");
365
+ expect(updateSpy).toHaveBeenCalledTimes(0);
366
+ res();
367
+ } catch (e) {
368
+ rej(e);
369
+ }
370
+ } else {
371
+ rej(new Error(`Unexpected error: ${error}`));
372
+ }
373
+ });
374
+
375
+ contentDecryptor.addEventListener("warning", (warning: Error) => {
376
+ if (warningsLeft-- > 0) {
377
+ try {
378
+ checkKeyLoadError(warning);
379
+ const requestIdx = nbRetries - remainingRetries;
380
+ expect(getLicenseSpy).toHaveBeenCalledTimes(requestIdx);
381
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(requestIdx, challenge, "license-request");
382
+ } catch (e) {
383
+ rej(e);
384
+ }
385
+ } else {
386
+ rej(new Error(`Unexpected warning: ${warning}`));
387
+ }
388
+ });
389
+
390
+ contentDecryptor.onInitializationData(initDataEvent);
391
+
392
+ const timeout = nbRetries === 0 ? 100 :
393
+ nbRetries === 1 ? 300 :
394
+ nbRetries === 2 ? 800 :
395
+ nbRetries === 3 ? 1200 :
396
+ nbRetries === 4 ? 3000 :
397
+ 10000;
398
+ setTimeout(() => {
399
+ try {
400
+ if (ignoreLicenseRequests) {
401
+ expect(updateSpy).toHaveBeenCalledTimes(0);
402
+ } else {
403
+ const license = concat(challenge, challenge);
404
+ expect(updateSpy).toHaveBeenCalledTimes(1);
405
+ expect(updateSpy).toHaveBeenCalledWith(license);
406
+ }
407
+ expect(getLicenseSpy).toHaveBeenCalledTimes(nbRetries + 1);
408
+ for (let i = 1; i <= nbRetries + 1; i++) {
409
+ expect(getLicenseSpy).toHaveBeenNthCalledWith(i, challenge, "license-request");
410
+ }
411
+ contentDecryptor.dispose();
412
+ res();
413
+ } catch (e) {
414
+ rej(e);
415
+ }
416
+ }, timeout);
417
+ });
418
+ }