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
@@ -16,15 +16,12 @@
16
16
 
17
17
  import {
18
18
  combineLatest as observableCombineLatest,
19
- EMPTY,
20
- exhaustMap,
21
19
  filter,
22
20
  finalize,
23
21
  ignoreElements,
24
22
  map,
25
23
  merge as observableMerge,
26
24
  mergeMap,
27
- mergeScan,
28
25
  Observable,
29
26
  of as observableOf,
30
27
  share,
@@ -34,7 +31,6 @@ import {
34
31
  switchMap,
35
32
  take,
36
33
  takeUntil,
37
- tap,
38
34
  } from "rxjs";
39
35
  import { shouldReloadMediaSourceOnDecipherabilityUpdate } from "../../compat";
40
36
  import config from "../../config";
@@ -51,9 +47,8 @@ import { PlaybackObserver } from "../api";
51
47
  import {
52
48
  getCurrentKeySystem,
53
49
  IContentProtection,
54
- IEMEManagerEvent,
55
50
  IKeySystemOption,
56
- } from "../eme";
51
+ } from "../decrypt";
57
52
  import {
58
53
  IManifestFetcherParsedResult,
59
54
  IManifestFetcherWarningEvent,
@@ -61,14 +56,16 @@ import {
61
56
  SegmentFetcherCreator,
62
57
  } from "../fetchers";
63
58
  import { ITextTrackSegmentBufferOptions } from "../segment_buffers";
64
- import createEMEManager, {
65
- IEMEDisabledEvent,
66
- } from "./create_eme_manager";
59
+ import { IAudioTrackSwitchingMode } from "../stream";
67
60
  import openMediaSource from "./create_media_source";
68
61
  import EVENTS from "./events_generators";
69
62
  import getInitialTime, {
70
63
  IInitialTimeOptions,
71
64
  } from "./get_initial_time";
65
+ import linkDrmAndContent, {
66
+ IDecryptionDisabledEvent,
67
+ IDecryptionReadyEvent,
68
+ } from "./link_drm_and_content";
72
69
  import createMediaSourceLoader from "./load_on_media_source";
73
70
  import manifestUpdateScheduler, {
74
71
  IManifestRefreshSchedulerEvent,
@@ -79,7 +76,11 @@ import {
79
76
  IMediaSourceLoaderEvent,
80
77
  } from "./types";
81
78
 
82
- const { OUT_OF_SYNC_MANIFEST_REFRESH_DELAY } = config;
79
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
80
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
81
+ // leading to linter issues, as it forbids the usage of `any`.
82
+ // This is why we're disabling the eslint rule.
83
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
83
84
 
84
85
  /** Arguments to give to the `InitializeOnMediaSource` function. */
85
86
  export interface IInitializeArguments {
@@ -91,6 +92,8 @@ export interface IInitializeArguments {
91
92
  bufferOptions : {
92
93
  /** Buffer "goal" at which we stop downloading new segments. */
93
94
  wantedBufferAhead : IReadOnlySharedReference<number>;
95
+ /** Buffer maximum size in kiloBytes at which we stop downloading */
96
+ maxVideoBufferSize : IReadOnlySharedReference<number>;
94
97
  /** Max buffer size after the current position, in seconds (we GC further up). */
95
98
  maxBufferAhead : IReadOnlySharedReference<number>;
96
99
  /** Max buffer size before the current position, in seconds (we GC further down). */
@@ -103,7 +106,7 @@ export interface IInitializeArguments {
103
106
  */
104
107
  enableFastSwitching : boolean;
105
108
  /** Strategy when switching of audio track. */
106
- audioTrackSwitchingMode : "seamless" | "direct";
109
+ audioTrackSwitchingMode : IAudioTrackSwitchingMode;
107
110
  /** Behavior when a new video and/or audio codec is encountered. */
108
111
  onCodecSwitch : "continue" | "reload";
109
112
  };
@@ -144,7 +147,7 @@ export interface IInitializeArguments {
144
147
  *
145
148
  * - download the content's Manifest and handle its refresh logic
146
149
  *
147
- * - Perform EME management if needed
150
+ * - Perform decryption if needed
148
151
  *
149
152
  * - ask for the choice of the wanted Adaptation through events (e.g. to
150
153
  * choose a language)
@@ -193,26 +196,28 @@ export default function InitializeOnMediaSource(
193
196
  shareReplay({ refCount: true })
194
197
  );
195
198
 
196
- /** Send content protection data to the `EMEManager`. */
199
+ /** Send content protection initialization data. */
197
200
  const protectedSegments$ = new Subject<IContentProtection>();
198
201
 
199
- /** Create `EMEManager`, an observable which will handle content DRM. */
200
- const emeManager$ = createEMEManager(mediaElement,
202
+ /** Initialize decryption capabilities and MediaSource. */
203
+ const drmEvents$ = linkDrmAndContent(mediaElement,
201
204
  keySystems,
202
- protectedSegments$).pipe(
203
- // Because multiple Observables here depend on this Observable as a source,
204
- // we prefer deferring Subscription until those Observables are themselves
205
- // all subscribed to.
206
- // This is needed because `emeManager$` might send events synchronously
207
- // on subscription. In that case, it might communicate those events directly
208
- // after the first Subscription is done, making the next subscription miss
209
- // out on those events, even if that second subscription is done
210
- // synchronously after the first one.
211
- // By calling `deferSubscriptions`, we ensure that subscription to
212
- // `emeManager$` effectively starts after a very short delay, thus
213
- // ensuring that no such race condition can occur.
214
- deferSubscriptions(),
215
- share());
205
+ protectedSegments$,
206
+ openMediaSource$)
207
+ .pipe(
208
+ // Because multiple Observables here depend on this Observable as a source,
209
+ // we prefer deferring Subscription until those Observables are themselves
210
+ // all subscribed to.
211
+ // This is needed because `drmEvents$` might send events synchronously
212
+ // on subscription. In that case, it might communicate those events directly
213
+ // after the first Subscription is done, making the next subscription miss
214
+ // out on those events, even if that second subscription is done
215
+ // synchronously after the first one.
216
+ // By calling `deferSubscriptions`, we ensure that subscription to
217
+ // `drmEvents$` effectively starts after a very short delay, thus
218
+ // ensuring that no such race condition can occur.
219
+ deferSubscriptions(),
220
+ share());
216
221
 
217
222
  /**
218
223
  * Translate errors coming from the media element into RxPlayer errors
@@ -220,71 +225,20 @@ export default function InitializeOnMediaSource(
220
225
  */
221
226
  const mediaError$ = throwOnMediaError(mediaElement);
222
227
 
223
- /**
224
- * Wait for the MediaKeys to have been created before opening the MediaSource,
225
- * after that second step is done, ask the EMEManager to attach the MediaKeys.
226
- * Steps are done in that specific order to avoid compatibility issues.
227
- *
228
- * This Observable will emit when ready both the MediaSource and useful
229
- * DRM-specific information.
230
- */
231
- const prepareMediaSource$ = emeManager$.pipe(
232
- mergeScan((
233
- acc : {
234
- /** set to true once EME APIs have been initialized. */
235
- isEmeReady : boolean;
236
- /**
237
- * ID identifying the current MediaKeys' system ID. Can be used to only
238
- * send initialization data linked to that ID as an optimization measure.
239
- */
240
- drmSystemId? : string | undefined;
241
- },
242
- evt : IEMEManagerEvent | IEMEDisabledEvent
243
- ) => {
244
- switch (evt.type) {
245
- case "eme-disabled":
246
- case "attached-media-keys":
247
- return observableOf({ isEmeReady: true,
248
- drmSystemId: acc.drmSystemId });
249
- case "created-media-keys":
250
- const drmSystemId = evt.value.initializationDataSystemId;
251
- return openMediaSource$.pipe(
252
- mergeMap(() => {
253
- // Now that the MediaSource has been opened and linked to the media
254
- // element we can attach the MediaKeys instance to the latter.
255
- evt.value.canAttachMediaKeys.setValue(true);
256
-
257
- // If the `disableMediaKeysAttachmentLock` option has been set to
258
- // `true`, we should not wait until the MediaKeys instance has been
259
- // attached to start loading the content.
260
- // TODO we may want to keep keySystems option knowledge in the EME
261
- // code
262
- const shouldDisableLock = evt.value.options
263
- .disableMediaKeysAttachmentLock === true;
264
- return shouldDisableLock ? observableOf({ isEmeReady: true,
265
- drmSystemId }) :
266
- EMPTY;
267
- }),
268
- startWith({ isEmeReady: false, drmSystemId }));
269
- default:
270
- return EMPTY;
271
- }
272
- }, { isEmeReady: false, drmSystemId: undefined }),
273
- filter((emitted) => emitted.isEmeReady),
274
- take(1),
275
- exhaustMap(({ drmSystemId }) =>
276
- openMediaSource$
277
- .pipe(map((mediaSource) => ({ mediaSource, drmSystemId })))));
228
+ const mediaSourceReady$ = drmEvents$.pipe(
229
+ filter((evt) : evt is IDecryptionReadyEvent<MediaSource> |
230
+ IDecryptionDisabledEvent<MediaSource> =>
231
+ evt.type === "decryption-ready" || evt.type === "decryption-disabled"),
232
+ map(e => e.value),
233
+ take(1));
278
234
 
279
235
  /** Load and play the content asked. */
280
- const loadContent$ = observableCombineLatest([manifest$,
281
- prepareMediaSource$]).pipe(
282
- mergeMap(([manifestEvt, mediaSourceInfo]) => {
236
+ const loadContent$ = observableCombineLatest([manifest$, mediaSourceReady$]).pipe(
237
+ mergeMap(([manifestEvt, { drmSystemId, mediaSource: initialMediaSource } ]) => {
283
238
  if (manifestEvt.type === "warning") {
284
239
  return observableOf(manifestEvt);
285
240
  }
286
241
  const { manifest } = manifestEvt;
287
- const { mediaSource: initialMediaSource, drmSystemId } = mediaSourceInfo;
288
242
 
289
243
  log.debug("Init: Calculating initial time");
290
244
  const initialTime = getInitialTime(manifest, lowLatencyMode, startAt);
@@ -320,25 +274,8 @@ export default function InitializeOnMediaSource(
320
274
  fromEvent(manifest, "decipherabilityUpdate")
321
275
  .pipe(map(EVENTS.decipherabilityUpdate)));
322
276
 
323
- const setUndecipherableRepresentations$ = emeManager$.pipe(
324
- tap((evt) => {
325
- if (evt.type === "keys-update") {
326
- manifest.updateDeciperabilitiesBasedOnKeyIds(evt.value);
327
- } else if (evt.type === "blacklist-protection-data") {
328
- log.info("Init: blacklisting Representations based on protection data.");
329
- manifest.addUndecipherableProtectionData(evt.value);
330
- }
331
- }),
332
- // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
333
- // first type parameter as `any` instead of the perfectly fine `unknown`,
334
- // leading to linter issues, as it forbids the usage of `any`.
335
- // This is why we're disabling the eslint rule.
336
- /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
337
- ignoreElements());
338
-
339
277
  return observableMerge(manifestEvents$,
340
278
  manifestUpdate$,
341
- setUndecipherableRepresentations$,
342
279
  recursiveLoad$)
343
280
  .pipe(startWith(EVENTS.manifestReady(manifest)),
344
281
  finalize(() => { scheduleRefresh$.complete(); }));
@@ -368,6 +305,7 @@ export default function InitializeOnMediaSource(
368
305
  canUseUnsafeMode: true });
369
306
  return null;
370
307
  case "manifest-might-be-out-of-sync":
308
+ const { OUT_OF_SYNC_MANIFEST_REFRESH_DELAY } = config.getCurrent();
371
309
  scheduleRefresh$.next({
372
310
  completeRefresh: true,
373
311
  canUseUnsafeMode: false,
@@ -420,5 +358,5 @@ export default function InitializeOnMediaSource(
420
358
  }
421
359
  }));
422
360
 
423
- return observableMerge(loadContent$, mediaError$, emeManager$);
361
+ return observableMerge(loadContent$, mediaError$, drmEvents$.pipe(ignoreElements()));
424
362
  }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ map,
19
+ merge as observableMerge,
20
+ Observable,
21
+ Subscription,
22
+ } from "rxjs";
23
+ import {
24
+ events,
25
+ hasEMEAPIs,
26
+ } from "../../compat/";
27
+ import { EncryptedMediaError } from "../../errors";
28
+ import features from "../../features";
29
+ import log from "../../log";
30
+ import {
31
+ IContentProtection,
32
+ IKeySystemOption,
33
+ ContentDecryptorState,
34
+ } from "../decrypt";
35
+ import { IWarningEvent } from "./types";
36
+
37
+ const { onEncrypted$ } = events;
38
+
39
+ /**
40
+ * @param {HTMLMediaElement} mediaElement
41
+ * @param {Array.<Object>} keySystems
42
+ * @param {Observable<Object>} contentProtections$
43
+ * @param {Promise} linkingMedia$
44
+ * @returns {Observable}
45
+ */
46
+ export default function linkDrmAndContent<T>(
47
+ mediaElement : HTMLMediaElement,
48
+ keySystems : IKeySystemOption[],
49
+ contentProtections$ : Observable<IContentProtection>,
50
+ linkingMedia$ : Observable<T>
51
+ ) : Observable<IContentDecryptorInitEvent<T>> {
52
+ const encryptedEvents$ = observableMerge(onEncrypted$(mediaElement),
53
+ contentProtections$);
54
+ if (features.ContentDecryptor == null) {
55
+ return observableMerge(
56
+ encryptedEvents$.pipe(map(() => {
57
+ log.error("Init: Encrypted event but EME feature not activated");
58
+ throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
59
+ "EME feature not activated.");
60
+ })),
61
+ linkingMedia$.pipe(map(mediaSource => ({
62
+ type: "decryption-disabled" as const,
63
+ value: { drmSystemId: undefined, mediaSource },
64
+ }))));
65
+ }
66
+
67
+ if (keySystems.length === 0) {
68
+ return observableMerge(
69
+ encryptedEvents$.pipe(map(() => {
70
+ log.error("Init: Ciphered media and no keySystem passed");
71
+ throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
72
+ "Media is encrypted and no `keySystems` given");
73
+ })),
74
+ linkingMedia$.pipe(map(mediaSource => ({
75
+ type: "decryption-disabled" as const,
76
+ value: { drmSystemId: undefined, mediaSource },
77
+ }))));
78
+ }
79
+
80
+ if (!hasEMEAPIs()) {
81
+ return observableMerge(
82
+ encryptedEvents$.pipe(map(() => {
83
+ log.error("Init: Encrypted event but no EME API available");
84
+ throw new EncryptedMediaError("MEDIA_IS_ENCRYPTED_ERROR",
85
+ "Encryption APIs not found.");
86
+ })),
87
+ linkingMedia$.pipe(map(mediaSource => ({
88
+ type: "decryption-disabled" as const,
89
+ value: { drmSystemId: undefined, mediaSource },
90
+ }))));
91
+ }
92
+
93
+ log.debug("Init: Creating ContentDecryptor");
94
+ const ContentDecryptor = features.ContentDecryptor;
95
+ return new Observable((obs) => {
96
+ const contentDecryptor = new ContentDecryptor(mediaElement, keySystems);
97
+
98
+ let mediaSub : Subscription | undefined;
99
+ contentDecryptor.addEventListener("stateChange", (state) => {
100
+ if (state === ContentDecryptorState.WaitingForAttachment) {
101
+ contentDecryptor.removeEventListener("stateChange");
102
+
103
+ mediaSub = linkingMedia$.subscribe(mediaSource => {
104
+ contentDecryptor.addEventListener("stateChange", (newState) => {
105
+ if (newState === ContentDecryptorState.ReadyForContent) {
106
+ obs.next({ type: "decryption-ready",
107
+ value: { drmSystemId: contentDecryptor.systemId,
108
+ mediaSource } });
109
+ contentDecryptor.removeEventListener("stateChange");
110
+ }
111
+ });
112
+
113
+ contentDecryptor.attach();
114
+ });
115
+ }
116
+ });
117
+
118
+ contentDecryptor.addEventListener("error", (e) => {
119
+ obs.error(e);
120
+ });
121
+
122
+ contentDecryptor.addEventListener("warning", (w) => {
123
+ obs.next({ type: "warning", value: w });
124
+ });
125
+
126
+ const protectionDataSub = contentProtections$.subscribe(data => {
127
+ contentDecryptor.onInitializationData(data);
128
+ });
129
+
130
+ return () => {
131
+ protectionDataSub.unsubscribe();
132
+ mediaSub?.unsubscribe();
133
+ contentDecryptor.dispose();
134
+ };
135
+ });
136
+ }
137
+
138
+ export type IContentDecryptorInitEvent<T> = IDecryptionDisabledEvent<T> |
139
+ IDecryptionReadyEvent<T> |
140
+ IWarningEvent;
141
+
142
+ /**
143
+ * Event emitted after deciding that no decryption logic will be launched for
144
+ * the current content.
145
+ */
146
+ export interface IDecryptionDisabledEvent<T> {
147
+ type: "decryption-disabled";
148
+ value: {
149
+ /**
150
+ * Identify the current DRM's system ID.
151
+ * Here `undefined` as no decryption capability has been added.
152
+ */
153
+ drmSystemId: undefined;
154
+ /** The value outputed by the `linkingMedia$` Observable. */
155
+ mediaSource: T;
156
+ };
157
+ }
158
+
159
+ /**
160
+ * Event emitted when decryption capabilities have started and content can
161
+ * begin to be pushed on the HTMLMediaElement.
162
+ */
163
+ export interface IDecryptionReadyEvent<T> {
164
+ type: "decryption-ready";
165
+ value: {
166
+ /**
167
+ * Identify the current DRM's systemId as an hexadecimal string, so the
168
+ * RxPlayer may be able to (optionally) only send the corresponding
169
+ * encryption initialization data.
170
+ * `undefined` if unknown.
171
+ */
172
+ drmSystemId: string | undefined;
173
+ /** The value outputed by the `linkingMedia$` Observable. */
174
+ mediaSource: T;
175
+ };
176
+ }
@@ -38,9 +38,6 @@ import {
38
38
  } from "../fetchers";
39
39
  import { IWarningEvent } from "./types";
40
40
 
41
- const { FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY,
42
- MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE,
43
- MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE } = config;
44
41
 
45
42
  /** Arguments to give to the `manifestUpdateScheduler` */
46
43
  export interface IManifestUpdateSchedulerArguments {
@@ -139,6 +136,9 @@ export default function manifestUpdateScheduler({
139
136
  parsingTime + (updatingTime ?? 0) :
140
137
  undefined;
141
138
 
139
+ const { MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE,
140
+ MIN_MANIFEST_PARSING_TIME_TO_ENTER_UNSAFE_MODE } = config.getCurrent();
141
+
142
142
  /**
143
143
  * "unsafeMode" is a mode where we unlock advanced Manifest parsing
144
144
  * optimizations with the added risk to lose some information.
@@ -147,6 +147,7 @@ export default function manifestUpdateScheduler({
147
147
  * Only perform parsing in `unsafeMode` when the last full parsing took a
148
148
  * lot of time and do not go higher than the maximum consecutive time.
149
149
  */
150
+
150
151
  const unsafeModeEnabled = consecutiveUnsafeMode > 0 ?
151
152
  consecutiveUnsafeMode < MAX_CONSECUTIVE_MANIFEST_PARSING_IN_UNSAFE_MODE :
152
153
  totalUpdateTime !== undefined ?
@@ -309,6 +310,7 @@ export default function manifestUpdateScheduler({
309
310
  "unknown error";
310
311
  log.warn(`MUS: Attempt to update Manifest failed: ${message}`,
311
312
  "Re-downloading the Manifest fully");
313
+ const { FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY } = config.getCurrent();
312
314
  return startManualRefreshTimer(FAILED_PARTIAL_UPDATE_MANIFEST_REFRESH_DELAY,
313
315
  minimumManifestUpdateInterval,
314
316
  newSendingTime)
@@ -44,11 +44,6 @@ import {
44
44
  IWarningEvent,
45
45
  } from "./types";
46
46
 
47
- const { BUFFER_DISCONTINUITY_THRESHOLD,
48
- FORCE_DISCONTINUITY_SEEK_DELAY,
49
- FREEZING_STALLED_DELAY,
50
- UNFREEZING_SEEK_DELAY,
51
- UNFREEZING_DELTA_POSITION } = config;
52
47
 
53
48
  /**
54
49
  * Work-around rounding errors with floating points by setting an acceptable,
@@ -225,6 +220,12 @@ export default function StallAvoider(
225
220
  rebuffering,
226
221
  freezing } = observation;
227
222
 
223
+ const { BUFFER_DISCONTINUITY_THRESHOLD,
224
+ FORCE_DISCONTINUITY_SEEK_DELAY,
225
+ FREEZING_STALLED_DELAY,
226
+ UNFREEZING_SEEK_DELAY,
227
+ UNFREEZING_DELTA_POSITION } = config.getCurrent();
228
+
228
229
  if (freezing !== null) {
229
230
  const now = performance.now();
230
231
 
@@ -43,7 +43,6 @@ import {
43
43
  IStreamEventPayload,
44
44
  } from "./types";
45
45
 
46
- const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config;
47
46
 
48
47
  /**
49
48
  * Tells if a stream event has a duration
@@ -161,6 +160,8 @@ function streamEventsEmitter(manifest: Manifest,
161
160
  if (!hasEvents) {
162
161
  return EMPTY;
163
162
  }
163
+
164
+ const { STREAM_EVENT_EMITTER_POLL_INTERVAL } = config.getCurrent();
164
165
  return observableCombineLatest([
165
166
  interval(STREAM_EVENT_EMITTER_POLL_INTERVAL).pipe(startWith(null)),
166
167
  observation$,
@@ -20,17 +20,6 @@ import Manifest, {
20
20
  Period,
21
21
  Representation,
22
22
  } from "../../manifest";
23
- import {
24
- IAttachedMediaKeysEvent,
25
- IBlacklistProtectionDataEvent,
26
- ICreatedMediaKeysEvent,
27
- IEncryptedEvent,
28
- IInitDataIgnoredEvent,
29
- IKeysUpdateEvent,
30
- INoUpdateEvent,
31
- ISessionMessageEvent,
32
- ISessionUpdatedEvent,
33
- } from "../eme";
34
23
  import SegmentBuffersStore from "../segment_buffers";
35
24
  import {
36
25
  IActivePeriodChangedEvent,
@@ -49,7 +38,6 @@ import {
49
38
  IStreamManifestMightBeOutOfSync,
50
39
  IStreamNeedsManifestRefresh,
51
40
  } from "../stream";
52
- import { IEMEDisabledEvent } from "./create_eme_manager";
53
41
  import {
54
42
  IStreamEventEvent,
55
43
  IStreamEventSkipEvent,
@@ -154,19 +142,6 @@ export type IInitEvent = IManifestReadyEvent |
154
142
  IReloadingMediaSourceEvent |
155
143
  IDecipherabilityUpdateEvent |
156
144
  IWarningEvent |
157
- IEMEDisabledEvent |
158
-
159
- // Coming from the `EMEManager`
160
-
161
- IEncryptedEvent |
162
- ICreatedMediaKeysEvent |
163
- IAttachedMediaKeysEvent |
164
- IInitDataIgnoredEvent |
165
- ISessionMessageEvent |
166
- IKeysUpdateEvent |
167
- INoUpdateEvent |
168
- ISessionUpdatedEvent |
169
- IBlacklistProtectionDataEvent |
170
145
 
171
146
  // Coming from the `MediaSourceLoader`
172
147
 
@@ -192,17 +167,4 @@ export type IInitEvent = IManifestReadyEvent |
192
167
  export type IDirectfileEvent = IStalledEvent |
193
168
  IUnstalledEvent |
194
169
  ILoadedEvent |
195
- IWarningEvent |
196
- IEMEDisabledEvent |
197
-
198
- // Coming from the `EMEManager`
199
-
200
- IEncryptedEvent |
201
- ICreatedMediaKeysEvent |
202
- IAttachedMediaKeysEvent |
203
- IInitDataIgnoredEvent |
204
- ISessionMessageEvent |
205
- IKeysUpdateEvent |
206
- INoUpdateEvent |
207
- ISessionUpdatedEvent |
208
- IBlacklistProtectionDataEvent;
170
+ IWarningEvent;
@@ -48,7 +48,6 @@ import {
48
48
  SegmentBufferOperation,
49
49
  } from "../types";
50
50
 
51
- const { SOURCE_BUFFER_FLUSHING_INTERVAL } = config;
52
51
 
53
52
  /**
54
53
  * Item added to the AudioVideoSegmentBuffer's queue before being processed into
@@ -172,6 +171,8 @@ export default class AudioVideoSegmentBuffer extends SegmentBuffer {
172
171
  this._lastInitSegment = null;
173
172
  this.codec = codec;
174
173
 
174
+ const { SOURCE_BUFFER_FLUSHING_INTERVAL } = config.getCurrent();
175
+
175
176
  // Some browsers (happened with firefox 66) sometimes "forget" to send us
176
177
  // `update` or `updateend` events.
177
178
  // In that case, we're completely unable to continue the queue here and
@@ -48,8 +48,6 @@ const { onEnded$,
48
48
  onSeeked$,
49
49
  onSeeking$ } = events;
50
50
 
51
- const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL,
52
- TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config;
53
51
 
54
52
  /**
55
53
  * Generate the interval at which TextTrack HTML Cues should be refreshed.
@@ -60,7 +58,7 @@ function generateRefreshInterval(videoElement : HTMLMediaElement) : Observable<b
60
58
  const seeking$ = onSeeking$(videoElement);
61
59
  const seeked$ = onSeeked$(videoElement);
62
60
  const ended$ = onEnded$(videoElement);
63
-
61
+ const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL } = config.getCurrent();
64
62
  const manualRefresh$ = observableMerge(seeked$, ended$);
65
63
  const autoRefresh$ = observableInterval(MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL)
66
64
  .pipe(startWith(null));
@@ -182,7 +180,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
182
180
  this._disableCurrentCues();
183
181
  return;
184
182
  }
185
-
183
+ const { MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL } = config.getCurrent();
186
184
  // to spread the time error, we divide the regular chosen interval.
187
185
  const time = Math.max(this._videoElement.currentTime +
188
186
  (MAXIMUM_HTML_TEXT_TRACK_UPDATE_INTERVAL / 1000) / 2,
@@ -420,6 +418,7 @@ export default class HTMLTextSegmentBuffer extends SegmentBuffer {
420
418
  element : HTMLElement; } => cue.resolution !== null);
421
419
 
422
420
  if (proportionalCues.length > 0) {
421
+ const { TEXT_TRACK_SIZE_CHECKS_INTERVAL } = config.getCurrent();
423
422
  // update propertionally-sized elements periodically
424
423
  onHeightWidthChange(this._textTrackElement, TEXT_TRACK_SIZE_CHECKS_INTERVAL)
425
424
  .pipe(takeUntil(this._clearSizeUpdates$),