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
@@ -18,20 +18,19 @@ import { ICustomMediaKeySession } from "../../../compat";
18
18
  import log from "../../../log";
19
19
  import areArraysOfNumbersEqual from "../../../utils/are_arrays_of_numbers_equal";
20
20
  import { assertInterface } from "../../../utils/assert";
21
- import {
22
- base64ToBytes,
23
- bytesToBase64,
24
- } from "../../../utils/base64";
25
- import { concat } from "../../../utils/byte_parsing";
21
+ import { bytesToBase64 } from "../../../utils/base64";
26
22
  import hashBuffer from "../../../utils/hash_buffer";
27
23
  import isNonEmptyString from "../../../utils/is_non_empty_string";
28
24
  import isNullOrUndefined from "../../../utils/is_null_or_undefined";
29
25
  import {
30
- IInitializationDataInfo,
26
+ IProcessedProtectionData,
31
27
  IPersistentSessionInfo,
32
28
  IPersistentSessionStorage,
33
29
  } from "../types";
34
30
  import areInitializationValuesCompatible from "./are_init_values_compatible";
31
+ import { IFormattedInitDataValue } from "./init_data_values_container";
32
+ import { areKeyIdsEqual } from "./key_id_comparison";
33
+ import SerializableBytes from "./serializable_bytes";
35
34
 
36
35
  /**
37
36
  * Throw if the given storage does not respect the right interface.
@@ -43,42 +42,6 @@ function checkStorage(storage : IPersistentSessionStorage) : void {
43
42
  "licenseStorage");
44
43
  }
45
44
 
46
- /** Wrap initialization data and allow serialization of it into base64. */
47
- class InitDataContainer {
48
- /** The initData itself. */
49
- public initData : Uint8Array;
50
-
51
- /**
52
- * Create a new container, wrapping the initialization data given and allowing
53
- * linearization into base64.
54
- * @param {Uint8Array}
55
- */
56
- constructor(initData : Uint8Array) {
57
- this.initData = initData;
58
- }
59
-
60
- /**
61
- * Convert it to base64.
62
- * `toJSON` is specially interpreted by JavaScript engines to be able to rely
63
- * on it when calling `JSON.stringify` on it or any of its parent objects:
64
- * https://tc39.es/ecma262/#sec-serializejsonproperty
65
- * @returns {string}
66
- */
67
- toJSON() : string {
68
- return bytesToBase64(this.initData);
69
- }
70
-
71
- /**
72
- * Decode a base64 sequence representing an initialization data back to an
73
- * Uint8Array.
74
- * @param {string}
75
- * @returns {Uint8Array}
76
- */
77
- static decode(base64 : string) : Uint8Array {
78
- return base64ToBytes(base64);
79
- }
80
- }
81
-
82
45
  /**
83
46
  * Set representing persisted licenses. Depends on a simple local-
84
47
  * storage implementation with a `save`/`load` synchronous interface
@@ -101,12 +64,13 @@ export default class PersistentSessionsStore {
101
64
  this._entries = [];
102
65
  this._storage = storage;
103
66
  try {
104
- this._entries = this._storage.load();
105
- if (!Array.isArray(this._entries)) {
106
- this._entries = [];
67
+ let entries = this._storage.load();
68
+ if (!Array.isArray(entries)) {
69
+ entries = [];
107
70
  }
71
+ this._entries = entries;
108
72
  } catch (e) {
109
- log.warn("EME-PSS: Could not get entries from license storage", e);
73
+ log.warn("DRM-PSS: Could not get entries from license storage", e);
110
74
  this.dispose();
111
75
  }
112
76
  }
@@ -130,11 +94,11 @@ export default class PersistentSessionsStore {
130
94
 
131
95
  /**
132
96
  * Retrieve an entry based on its initialization data.
133
- * @param {Uint8Array} initData
97
+ * @param {Object} initData
134
98
  * @param {string|undefined} initDataType
135
99
  * @returns {Object|null}
136
100
  */
137
- public get(initData : IInitializationDataInfo) : IPersistentSessionInfo | null {
101
+ public get(initData : IProcessedProtectionData) : IPersistentSessionInfo | null {
138
102
  const index = this._getIndex(initData);
139
103
  return index === -1 ? null :
140
104
  this._entries[index];
@@ -151,7 +115,9 @@ export default class PersistentSessionsStore {
151
115
  * @param {string|undefined} initDataType
152
116
  * @returns {*}
153
117
  */
154
- public getAndReuse(initData : IInitializationDataInfo) : IPersistentSessionInfo | null {
118
+ public getAndReuse(
119
+ initData : IProcessedProtectionData
120
+ ) : IPersistentSessionInfo | null {
155
121
  const index = this._getIndex(initData);
156
122
  if (index === -1) {
157
123
  return null;
@@ -168,11 +134,12 @@ export default class PersistentSessionsStore {
168
134
  * @param {MediaKeySession} session
169
135
  */
170
136
  public add(
171
- initData : IInitializationDataInfo,
137
+ initData : IProcessedProtectionData,
138
+ keyIds : Uint8Array[] | undefined,
172
139
  session : MediaKeySession|ICustomMediaKeySession
173
140
  ) : void {
174
141
  if (isNullOrUndefined(session) || !isNonEmptyString(session.sessionId)) {
175
- log.warn("EME-PSS: Invalid Persisten Session given.");
142
+ log.warn("DRM-PSS: Invalid Persisten Session given.");
176
143
  return;
177
144
  }
178
145
  const { sessionId } = session;
@@ -180,45 +147,60 @@ export default class PersistentSessionsStore {
180
147
  if (currentEntry !== null && currentEntry.sessionId === sessionId) {
181
148
  return;
182
149
  } else if (currentEntry !== null) { // currentEntry has a different sessionId
183
- this.delete(initData);
150
+ this.delete(currentEntry.sessionId);
184
151
  }
185
152
 
186
- log.info("EME-PSS: Add new session", sessionId);
153
+ log.info("DRM-PSS: Add new session", sessionId);
187
154
 
188
- this._entries.push({ version: 3,
189
- sessionId,
190
- values: this._formatValuesForStore(initData.values),
191
- initDataType: initData.type });
155
+ const storedValues = prepareValuesForStore(initData.values.getFormattedValues());
156
+ if (keyIds === undefined) {
157
+ this._entries.push({ version: 3,
158
+ sessionId,
159
+ values: storedValues,
160
+ initDataType: initData.type });
161
+ } else {
162
+ this._entries.push({ version: 4,
163
+ sessionId,
164
+ keyIds: keyIds.map((k) => new SerializableBytes(k)),
165
+ values: storedValues,
166
+ initDataType: initData.type });
167
+ }
192
168
  this._save();
193
169
  }
194
170
 
195
171
  /**
196
- * Delete stored MediaKeySession information based on its initialization
197
- * data.
172
+ * Delete stored MediaKeySession information based on its session id.
198
173
  * @param {Uint8Array} initData
199
174
  * @param {string|undefined} initDataType
200
175
  */
201
- public delete(initData : IInitializationDataInfo) : void {
202
- const index = this._getIndex(initData);
176
+ public delete(sessionId : string) : void {
177
+ let index = -1;
178
+ for (let i = 0; i < this._entries.length; i++) {
179
+ const entry = this._entries[i];
180
+ if (entry.sessionId === sessionId) {
181
+ index = i;
182
+ break;
183
+ }
184
+ }
203
185
  if (index === -1) {
204
- log.warn("EME-PSS: initData to delete not found.");
186
+ log.warn("DRM-PSS: initData to delete not found.");
205
187
  return;
206
188
  }
207
189
  const entry = this._entries[index];
208
- log.warn("EME-PSS: Delete session from store", entry.sessionId);
190
+ log.warn("DRM-PSS: Delete session from store", entry.sessionId);
209
191
  this._entries.splice(index, 1);
210
192
  this._save();
211
193
  }
212
194
 
213
195
  public deleteOldSessions(sessionsToDelete : number) : void {
214
- log.info(`EME-PSS: Deleting last ${sessionsToDelete} sessions.`);
196
+ log.info(`DRM-PSS: Deleting last ${sessionsToDelete} sessions.`);
215
197
  if (sessionsToDelete <= 0) {
216
198
  return;
217
199
  }
218
200
  if (sessionsToDelete <= this._entries.length) {
219
201
  this._entries.splice(0, sessionsToDelete);
220
202
  } else {
221
- log.warn("EME-PSS: Asked to remove more information that it contains",
203
+ log.warn("DRM-PSS: Asked to remove more information that it contains",
222
204
  sessionsToDelete,
223
205
  this._entries.length);
224
206
  this._entries = [];
@@ -237,46 +219,85 @@ export default class PersistentSessionsStore {
237
219
  /**
238
220
  * Retrieve index of an entry.
239
221
  * Returns `-1` if not found.
240
- * @param {Uint8Array} initData
241
- * @param {string|undefined} initDataType
222
+ * @param {Object} initData
242
223
  * @returns {number}
243
224
  */
244
- private _getIndex(initData : IInitializationDataInfo) : number {
245
- const formatted = this._formatValuesForStore(initData.values);
246
-
225
+ private _getIndex(initData : IProcessedProtectionData) : number {
247
226
  // Older versions of the format include a concatenation of all
248
227
  // initialization data and its hash.
249
- const concatInitData = concat(...initData.values.map(i => i.data));
250
- const concatInitDataHash = hashBuffer(concatInitData);
228
+ // This is only computed lazily, the first time it is needed.
229
+ let lazyConcatenatedData : null | { initData : Uint8Array;
230
+ initDataHash : number; } = null;
231
+ function getConcatenatedInitDataInfo() {
232
+ if (lazyConcatenatedData === null) {
233
+ const concatInitData = initData.values.constructRequestData();
234
+ lazyConcatenatedData = { initData: concatInitData,
235
+ initDataHash: hashBuffer(concatInitData) };
236
+ }
237
+ return lazyConcatenatedData;
238
+ }
251
239
 
252
240
  for (let i = 0; i < this._entries.length; i++) {
253
241
  const entry = this._entries[i];
254
242
  if (entry.initDataType === initData.type) {
255
243
  switch (entry.version) {
244
+ case 4:
245
+ if (initData.keyIds !== undefined) {
246
+ const foundCompatible = initData.keyIds.every(keyId => {
247
+ const keyIdB64 = bytesToBase64(keyId);
248
+ for (const entryKid of entry.keyIds) {
249
+ if (typeof entryKid === "string") {
250
+ if (keyIdB64 === entryKid) {
251
+ return true;
252
+ }
253
+ } else if (areKeyIdsEqual(entryKid.initData,
254
+ keyId))
255
+ {
256
+ return true;
257
+ }
258
+ }
259
+ return false;
260
+ });
261
+ if (foundCompatible) {
262
+ return i;
263
+ }
264
+ } else {
265
+ const formatted = initData.values.getFormattedValues();
266
+ if (areInitializationValuesCompatible(formatted, entry.values)) {
267
+ return i;
268
+ }
269
+ }
270
+ break;
256
271
 
257
272
  case 3:
273
+ const formatted = initData.values.getFormattedValues();
258
274
  if (areInitializationValuesCompatible(formatted, entry.values)) {
259
275
  return i;
260
276
  }
261
277
  break;
262
278
 
263
- case 2:
264
- if (entry.initDataHash === concatInitDataHash) {
279
+ case 2: {
280
+ const { initData: concatInitData,
281
+ initDataHash: concatHash } = getConcatenatedInitDataInfo();
282
+ if (entry.initDataHash === concatHash) {
265
283
  try {
266
284
  const decodedInitData : Uint8Array = typeof entry.initData === "string" ?
267
- InitDataContainer.decode(entry.initData) :
285
+ SerializableBytes.decode(entry.initData) :
268
286
  entry.initData.initData;
269
287
  if (areArraysOfNumbersEqual(decodedInitData, concatInitData)) {
270
288
  return i;
271
289
  }
272
290
  } catch (e) {
273
- log.warn("EME-PSS: Could not decode initialization data.", e);
291
+ log.warn("DRM-PSS: Could not decode initialization data.", e);
274
292
  }
275
293
  }
276
294
  break;
295
+ }
277
296
 
278
- case 1:
279
- if (entry.initDataHash === concatInitDataHash) {
297
+ case 1: {
298
+ const { initData: concatInitData,
299
+ initDataHash: concatHash } = getConcatenatedInitDataInfo();
300
+ if (entry.initDataHash === concatHash) {
280
301
  if (typeof entry.initData.length === "undefined") {
281
302
  // If length is undefined, it has been linearized. We could still
282
303
  // convert it back to an Uint8Array but this would necessitate some
@@ -288,11 +309,14 @@ export default class PersistentSessionsStore {
288
309
  }
289
310
  }
290
311
  break;
312
+ }
291
313
 
292
- default:
293
- if (entry.initData === concatInitDataHash) {
314
+ default: {
315
+ const { initDataHash: concatHash } = getConcatenatedInitDataInfo();
316
+ if (entry.initData === concatHash) {
294
317
  return i;
295
318
  }
319
+ }
296
320
  }
297
321
  }
298
322
  }
@@ -306,31 +330,25 @@ export default class PersistentSessionsStore {
306
330
  try {
307
331
  this._storage.save(this._entries);
308
332
  } catch (e) {
309
- log.warn("EME-PSS: Could not save licenses in localStorage");
333
+ log.warn("DRM-PSS: Could not save licenses in localStorage");
310
334
  }
311
335
  }
336
+ }
312
337
 
313
- /**
314
- * Format given initializationData's values so they are ready to be stored:
315
- * - sort them by systemId, so they are faster to compare
316
- * - add hash for each initialization data encountered.
317
- * @param {Array.<Object>} initialValues
318
- * @returns {Array.<Object>}
319
- */
320
- private _formatValuesForStore(
321
- initialValues : Array<{ systemId : string | undefined;
322
- data : Uint8Array; }>
323
- ) : Array<{ systemId : string | undefined;
324
- hash : number;
325
- data : InitDataContainer; }> {
326
- return initialValues.slice()
327
- .sort((a, b) => a.systemId === b.systemId ? 0 :
328
- a.systemId === undefined ? 1 :
329
- b.systemId === undefined ? -1 :
330
- a.systemId < b.systemId ? -1 :
331
- 1)
332
- .map(({ systemId, data }) => ({ systemId,
333
- data : new InitDataContainer(data),
334
- hash : hashBuffer(data) }));
335
- }
338
+ /**
339
+ * Format given initializationData's values so they are ready to be stored:
340
+ * - sort them by systemId, so they are faster to compare
341
+ * - add hash for each initialization data encountered.
342
+ * @param {Array.<Object>} initialValues
343
+ * @returns {Array.<Object>}
344
+ */
345
+ function prepareValuesForStore(
346
+ initialValues : IFormattedInitDataValue[]
347
+ ) : Array<{ systemId : string | undefined;
348
+ hash : number;
349
+ data : SerializableBytes; }> {
350
+ return initialValues
351
+ .map(({ systemId, data, hash }) => ({ systemId,
352
+ hash,
353
+ data : new SerializableBytes(data) }));
336
354
  }
@@ -19,14 +19,17 @@ import {
19
19
  bytesToBase64,
20
20
  } from "../../../utils/base64";
21
21
 
22
- /** Wrap initialization data and allow serialization of it into base64. */
23
- export default class InitDataContainer {
24
- /** The initData itself. */
22
+ /** Wrap byte-based data and allow serialization of it into base64. */
23
+ export default class SerializableBytes {
24
+ /**
25
+ * The data itself. Named `initData` for legacy reasons (cannot be changed
26
+ * because it has an impact on saved persistent session information.
27
+ */
25
28
  public initData : Uint8Array;
26
29
 
27
30
  /**
28
- * Create a new container, wrapping the initialization data given and allowing
29
- * linearization into base64.
31
+ * Create a new `SerializableBytes`, wrapping the initialization data
32
+ * given and allowing serialization into base64.
30
33
  * @param {Uint8Array}
31
34
  */
32
35
  constructor(initData : Uint8Array) {
@@ -14,8 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { ICustomMediaKeys } from "../../compat";
18
- import hashBuffer from "../../utils/hash_buffer";
17
+ import { ICustomMediaKeys } from "../../../compat";
18
+ import hashBuffer from "../../../utils/hash_buffer";
19
19
 
20
20
  /**
21
21
  * Keep track of server certificate which have been set for a MediaKeys.
@@ -30,7 +30,6 @@ import {
30
30
  ITransportPipelines,
31
31
  } from "../../../transports";
32
32
  import assert from "../../../utils/assert";
33
- import PPromise from "../../../utils/promise";
34
33
  import TaskCanceller from "../../../utils/task_canceller";
35
34
  import errorSelector from "../utils/error_selector";
36
35
  import {
@@ -38,10 +37,6 @@ import {
38
37
  tryRequestPromiseWithBackoff,
39
38
  } from "../utils/try_urls_with_backoff";
40
39
 
41
- const { DEFAULT_MAX_MANIFEST_REQUEST_RETRY,
42
- DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
43
- INITIAL_BACKOFF_DELAY_BASE,
44
- MAX_BACKOFF_DELAY_BASE } = config;
45
40
 
46
41
  /** What will be sent once parsed. */
47
42
  export interface IManifestFetcherParsedResult {
@@ -407,6 +402,10 @@ export default class ManifestFetcher {
407
402
  * @returns {Object}
408
403
  */
409
404
  private _getBackoffSetting(onRetry : (err : unknown) => void) : IBackoffSettings {
405
+ const { DEFAULT_MAX_MANIFEST_REQUEST_RETRY,
406
+ DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
407
+ INITIAL_BACKOFF_DELAY_BASE,
408
+ MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
410
409
  const { lowLatencyMode,
411
410
  maxRetryRegular : ogRegular,
412
411
  maxRetryOffline : ogOffline } = this._settings;
@@ -431,6 +430,5 @@ export default class ManifestFetcher {
431
430
  * @returns {boolean}
432
431
  */
433
432
  function isPromise<T>(val : T | Promise<T>) : val is Promise<T> {
434
- return val instanceof PPromise ||
435
- val instanceof Promise;
433
+ return val instanceof Promise;
436
434
  }
@@ -53,10 +53,6 @@ import { IBufferType } from "../../segment_buffers";
53
53
  import errorSelector from "../utils/error_selector";
54
54
  import { tryURLsWithBackoff } from "../utils/try_urls_with_backoff";
55
55
 
56
- const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
57
- DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
58
- INITIAL_BACKOFF_DELAY_BASE,
59
- MAX_BACKOFF_DELAY_BASE } = config;
60
56
 
61
57
  const generateRequestID = idGenerator();
62
58
 
@@ -446,6 +442,10 @@ export function getSegmentFetcherOptions(
446
442
  maxRetryOffline? : number | undefined;
447
443
  lowLatencyMode : boolean; }
448
444
  ) : ISegmentFetcherOptions {
445
+ const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
446
+ DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
447
+ INITIAL_BACKOFF_DELAY_BASE,
448
+ MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
449
449
  return { maxRetryRegular: bufferType === "image" ? 0 :
450
450
  maxRetryRegular ?? DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
451
451
  maxRetryOffline: maxRetryOffline ?? DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
@@ -30,8 +30,6 @@ import createSegmentFetcher, {
30
30
  ISegmentFetcherEvent,
31
31
  } from "./segment_fetcher";
32
32
 
33
- const { MIN_CANCELABLE_PRIORITY,
34
- MAX_HIGH_PRIORITY_LEVEL } = config;
35
33
 
36
34
  /**
37
35
  * Interact with the transport pipelines to download segments with the right
@@ -91,6 +89,8 @@ export default class SegmentFetcherCreator {
91
89
  transport : ITransportPipelines,
92
90
  options : ISegmentFetcherCreatorBackoffOptions
93
91
  ) {
92
+ const { MIN_CANCELABLE_PRIORITY,
93
+ MAX_HIGH_PRIORITY_LEVEL } = config.getCurrent();
94
94
  this._transport = transport;
95
95
  this._prioritizer = new ObservablePrioritizer({
96
96
  prioritySteps: { high: MAX_HIGH_PRIORITY_LEVEL,
@@ -24,7 +24,6 @@ import {
24
24
  import log from "../../../log";
25
25
  import cancellableSleep from "../../../utils/cancellable_sleep";
26
26
  import getFuzzedDelay from "../../../utils/get_fuzzed_delay";
27
- import PPromise from "../../../utils/promise";
28
27
  import TaskCanceller, {
29
28
  CancellationSignal,
30
29
  } from "../../../utils/task_canceller";
@@ -171,7 +170,7 @@ export function tryURLsWithBackoff<T>(
171
170
  cancellationSignal : CancellationSignal
172
171
  ) : Promise<T> {
173
172
  if (cancellationSignal.isCancelled) {
174
- return PPromise.reject(cancellationSignal.cancellationError);
173
+ return Promise.reject(cancellationSignal.cancellationError);
175
174
  }
176
175
 
177
176
  const { baseDelay,
@@ -185,7 +184,7 @@ export function tryURLsWithBackoff<T>(
185
184
  const urlsToTry = urls.slice();
186
185
  if (urlsToTry.length === 0) {
187
186
  log.warn("Fetchers: no URL given to `tryURLsWithBackoff`.");
188
- return PPromise.reject(new Error("No URL to request"));
187
+ return Promise.reject(new Error("No URL to request"));
189
188
  }
190
189
  return tryURLsRecursively(urlsToTry[0], 0);
191
190
 
@@ -18,7 +18,6 @@ import config from "../../config";
18
18
  import log from "../../log";
19
19
  import Manifest from "../../manifest";
20
20
 
21
- const { DEFAULT_LIVE_GAP } = config;
22
21
 
23
22
  export interface IInitialTimeOptions { position? : number;
24
23
  wallClockTime? : number;
@@ -90,6 +89,8 @@ export default function getInitialTime(
90
89
  clockOffset } = manifest;
91
90
  const maximumPosition = manifest.getMaximumPosition();
92
91
  let liveTime : number;
92
+ const { DEFAULT_LIVE_GAP } = config.getCurrent();
93
+
93
94
  if (clockOffset == null) {
94
95
  log.info("Init: no clock offset found for a live content, " +
95
96
  "starting close to maximum available position");
@@ -39,16 +39,22 @@ import log from "../../log";
39
39
  import deferSubscriptions from "../../utils/defer_subscriptions";
40
40
  import { IReadOnlySharedReference } from "../../utils/reference";
41
41
  import { PlaybackObserver } from "../api";
42
- import { IKeySystemOption } from "../eme";
43
- import createEMEManager from "./create_eme_manager";
42
+ import { IKeySystemOption } from "../decrypt";
44
43
  import emitLoadedEvent from "./emit_loaded_event";
45
44
  import { IInitialTimeOptions } from "./get_initial_time";
46
45
  import initialSeekAndPlay from "./initial_seek_and_play";
46
+ import linkDrmAndContent from "./link_drm_and_content";
47
47
  import StallAvoider from "./stall_avoider";
48
48
  import throwOnMediaError from "./throw_on_media_error";
49
49
  import { IDirectfileEvent } from "./types";
50
50
  import updatePlaybackRate from "./update_playback_rate";
51
51
 
52
+ // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
53
+ // first type parameter as `any` instead of the perfectly fine `unknown`,
54
+ // leading to linter issues, as it forbids the usage of `any`.
55
+ // This is why we're disabling the eslint rule.
56
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
57
+
52
58
  /**
53
59
  * calculate initial time as a position in seconds.
54
60
  * @param {HTMLMediaElement} mediaElement
@@ -136,10 +142,11 @@ export default function initializeDirectfileContent({
136
142
  startTime: initialTime,
137
143
  mustAutoPlay: autoPlay });
138
144
 
139
- // Create EME Manager, an observable which will manage every EME-related
140
- // issue.
141
- const emeManager$ = linkURL$.pipe(
142
- mergeMap(() => createEMEManager(mediaElement, keySystems, EMPTY)),
145
+ /** Initialize decryption capabilities and the HTMLMediaElement's src attribute. */
146
+ const drmEvents$ = linkDrmAndContent(mediaElement,
147
+ keySystems,
148
+ EMPTY,
149
+ linkURL$).pipe(
143
150
  deferSubscriptions(),
144
151
  share()
145
152
  );
@@ -154,11 +161,6 @@ export default function initializeDirectfileContent({
154
161
  // little longer while the buffer is empty.
155
162
  const playbackRate$ =
156
163
  updatePlaybackRate(mediaElement, speed, observation$)
157
- // NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
158
- // first type parameter as `any` instead of the perfectly fine `unknown`,
159
- // leading to linter issues, as it forbids the usage of `any`.
160
- // This is why we're disabling the eslint rule.
161
- /* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
162
164
  .pipe(ignoreElements());
163
165
 
164
166
  /**
@@ -172,14 +174,9 @@ export default function initializeDirectfileContent({
172
174
  * media can begin playback.
173
175
  * Also emits warning events if issues arise when doing so.
174
176
  */
175
- const loadingEvts$ = emeManager$.pipe(
176
- filter(function isEMEReady(evt) {
177
- if (evt.type === "created-media-keys") {
178
- evt.value.canAttachMediaKeys.setValue(true);
179
- return true;
180
- }
181
- return evt.type === "eme-disabled" || evt.type === "attached-media-keys";
182
- }),
177
+ const loadingEvts$ = drmEvents$.pipe(
178
+ filter((evt) => evt.type === "decryption-ready" ||
179
+ evt.type === "decryption-disabled"),
183
180
  take(1),
184
181
  mergeMap(() => seekAndPlay$),
185
182
  switchMap((evt) => {
@@ -190,7 +187,7 @@ export default function initializeDirectfileContent({
190
187
  }));
191
188
 
192
189
  return observableMerge(loadingEvts$,
193
- emeManager$,
190
+ drmEvents$.pipe(ignoreElements()),
194
191
  mediaError$,
195
192
  playbackRate$,
196
193
  stallAvoider$);