rx-player 3.26.2 → 3.27.0-dev.20220317

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/.github/workflows/perfs.yml +22 -0
  2. package/CHANGELOG.md +33 -1
  3. package/FILES.md +5 -4
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  6. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  7. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  8. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  12. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  14. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  15. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  16. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  17. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  18. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  19. package/dist/_esm5.processed/config.d.ts +166 -1080
  20. package/dist/_esm5.processed/config.js +17 -1119
  21. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  22. package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
  23. package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
  24. package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
  25. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  26. package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
  27. package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
  28. package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
  29. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  30. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  31. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
  32. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
  33. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  34. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  35. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  36. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  37. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  38. package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
  39. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
  40. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
  41. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  42. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  43. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  44. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  45. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  46. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  47. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  48. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  49. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  50. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  51. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  52. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  53. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  56. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  57. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  58. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  59. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  60. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  61. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  62. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  63. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  64. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  65. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  66. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  67. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
  68. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  70. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  71. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  72. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  73. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  74. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  75. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  76. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  77. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  78. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  79. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  80. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  81. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  83. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  84. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  85. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  86. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  87. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  88. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  89. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  90. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  91. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  92. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  93. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  94. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  95. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  96. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  97. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
  98. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
  99. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
  100. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
  101. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  102. package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
  103. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  104. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
  105. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  106. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
  107. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  108. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  109. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  110. package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
  111. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  112. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  113. package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
  114. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  115. package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
  116. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  117. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  118. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
  119. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  120. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
  121. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
  122. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  123. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  124. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  125. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  126. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  127. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  128. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  129. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  130. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  131. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  132. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  133. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  134. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
  135. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  136. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  137. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  138. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  139. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  140. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  141. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  142. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  143. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  144. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  145. package/dist/_esm5.processed/default_config.js +1145 -0
  146. package/dist/_esm5.processed/errors/request_error.js +3 -1
  147. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  148. package/dist/_esm5.processed/experimental/index.js +2 -0
  149. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  150. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
  151. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
  152. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
  153. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
  154. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  155. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  156. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
  157. package/dist/_esm5.processed/features/features_object.js +1 -1
  158. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  159. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  160. package/dist/_esm5.processed/features/list/eme.js +5 -5
  161. package/dist/_esm5.processed/features/types.d.ts +3 -3
  162. package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
  163. package/dist/_esm5.processed/manifest/adaptation.js +3 -1
  164. package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
  165. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  166. package/dist/_esm5.processed/manifest/period.d.ts +3 -3
  167. package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
  168. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
  169. package/dist/_esm5.processed/manifest/types.d.ts +3 -3
  170. package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
  171. package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
  172. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
  173. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
  174. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
  175. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  176. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
  177. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
  178. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  179. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
  180. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
  181. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
  182. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  183. package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
  184. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
  185. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
  186. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
  187. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  188. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
  189. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
  190. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
  191. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
  192. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
  193. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
  194. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
  195. package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
  196. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
  197. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
  198. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
  199. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  200. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
  201. package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
  202. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
  203. package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
  204. package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
  205. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
  206. package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
  207. package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
  208. package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
  209. package/dist/_esm5.processed/public_types.d.ts +2 -2
  210. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
  211. package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
  212. package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
  213. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  214. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  215. package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
  216. package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
  217. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  218. package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
  219. package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
  220. package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
  221. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  222. package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
  223. package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
  224. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  225. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  226. package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
  227. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
  228. package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
  229. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
  230. package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
  231. package/dist/_esm5.processed/transports/types.d.ts +58 -30
  232. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
  233. package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
  234. package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
  235. package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
  236. package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
  237. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  238. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  239. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  240. package/dist/_esm5.processed/utils/reference.js +72 -24
  241. package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
  242. package/dist/_esm5.processed/utils/request/fetch.js +8 -6
  243. package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
  244. package/dist/_esm5.processed/utils/request/xhr.js +3 -2
  245. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
  246. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  247. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  248. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  249. package/dist/rx-player.js +5242 -3190
  250. package/dist/rx-player.min.js +1 -1
  251. package/dummy +1 -0
  252. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  253. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  254. package/package.json +33 -36
  255. package/scripts/build/templates/experimental/index.d.ts +16 -0
  256. package/scripts/build/templates/experimental/index.js +16 -0
  257. package/scripts/doc-generator/generate_header_html.js +6 -7
  258. package/scripts/doc-generator/generate_page_html.js +3 -4
  259. package/scripts/doc-generator/generate_page_list_html.js +4 -5
  260. package/scripts/doc-generator/generate_sidebar_html.js +4 -7
  261. package/scripts/doc-generator/utils.js +0 -11
  262. package/scripts/generate_demo_list.js +3 -3
  263. package/scripts/generate_documentation_list.js +3 -3
  264. package/scripts/launch_static_server.js +127 -67
  265. package/scripts/run_standalone_demo.js +1 -0
  266. package/scripts/start_demo_web_server.js +1 -0
  267. package/sonar-project.properties +1 -1
  268. package/src/README.md +6 -6
  269. package/src/compat/__tests__/fullscreen.test.ts +7 -7
  270. package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
  271. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  272. package/src/compat/browser_detection.ts +4 -2
  273. package/src/compat/eme/close_session.ts +90 -56
  274. package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
  275. package/src/compat/eme/custom_media_keys/index.ts +28 -41
  276. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  277. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  278. package/src/compat/eme/generate_key_request.ts +25 -33
  279. package/src/compat/eme/load_session.ts +29 -31
  280. package/src/compat/event_listeners.ts +2 -1
  281. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  282. package/src/config.ts +17 -1210
  283. package/src/core/README.md +1 -1
  284. package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
  285. package/src/core/abr/bandwidth_estimator.ts +4 -4
  286. package/src/core/abr/buffer_based_chooser.ts +85 -20
  287. package/src/core/abr/network_analyzer.ts +6 -7
  288. package/src/core/abr/pending_requests_store.ts +3 -5
  289. package/src/core/abr/representation_estimator.ts +6 -3
  290. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  291. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  292. package/src/core/api/get_player_state.ts +1 -1
  293. package/src/core/api/index.ts +3 -0
  294. package/src/core/api/media_element_track_choice_manager.ts +22 -3
  295. package/src/core/api/option_utils.ts +37 -20
  296. package/src/core/api/playback_observer.ts +12 -8
  297. package/src/core/api/public_api.ts +152 -112
  298. package/src/core/api/track_choice_manager.ts +10 -9
  299. package/src/core/decrypt/README.md +22 -0
  300. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  301. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  302. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  303. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  304. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  305. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
  306. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  307. package/src/core/decrypt/clear_on_stop.ts +48 -0
  308. package/src/core/decrypt/content_decryptor.ts +1158 -0
  309. package/src/core/decrypt/create_or_load_session.ts +130 -0
  310. package/src/core/decrypt/create_session.ts +175 -0
  311. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  312. package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
  313. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  314. package/src/core/decrypt/get_media_keys.ts +145 -0
  315. package/src/core/{eme → decrypt}/index.ts +11 -8
  316. package/src/core/decrypt/init_media_keys.ts +51 -0
  317. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  318. package/src/core/decrypt/set_server_certificate.ts +104 -0
  319. package/src/core/{eme → decrypt}/types.ts +129 -259
  320. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  321. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  322. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  323. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  324. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  325. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  326. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  327. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  328. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  329. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  330. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  331. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  332. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  333. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  334. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  335. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  336. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  337. package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
  338. package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
  339. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  340. package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
  341. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  342. package/src/core/init/get_initial_time.ts +2 -1
  343. package/src/core/init/initialize_directfile.ts +19 -22
  344. package/src/core/init/initialize_media_source.ts +43 -106
  345. package/src/core/init/link_drm_and_content.ts +176 -0
  346. package/src/core/init/manifest_update_scheduler.ts +12 -10
  347. package/src/core/init/stall_avoider.ts +6 -5
  348. package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
  349. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  350. package/src/core/init/stream_events_emitter/types.ts +2 -2
  351. package/src/core/init/types.ts +1 -39
  352. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  353. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
  354. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
  355. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
  356. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  357. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  358. package/src/core/stream/events_generators.ts +9 -4
  359. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  360. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  361. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  362. package/src/core/stream/period/period_stream.ts +5 -2
  363. package/src/core/stream/representation/force_garbage_collection.ts +5 -7
  364. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  365. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  366. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  367. package/src/core/stream/representation/push_media_segment.ts +3 -2
  368. package/src/core/stream/representation/representation_stream.ts +30 -7
  369. package/src/core/stream/types.ts +1 -1
  370. package/src/default_config.ts +1241 -0
  371. package/src/errors/request_error.ts +4 -1
  372. package/src/experimental/index.ts +5 -0
  373. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  374. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
  375. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  376. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  377. package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
  378. package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
  379. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  380. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  381. package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
  382. package/src/features/__tests__/initialize_features.test.ts +2 -2
  383. package/src/features/features_object.ts +1 -1
  384. package/src/features/initialize_features.ts +1 -1
  385. package/src/features/list/__tests__/eme.test.ts +5 -5
  386. package/src/features/list/eme.ts +5 -5
  387. package/src/features/types.ts +3 -10
  388. package/src/manifest/adaptation.ts +6 -4
  389. package/src/manifest/manifest.ts +16 -86
  390. package/src/manifest/period.ts +3 -3
  391. package/src/manifest/representation.ts +38 -5
  392. package/src/manifest/representation_index/types.ts +18 -18
  393. package/src/manifest/types.ts +3 -3
  394. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
  395. package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
  396. package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
  397. package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
  398. package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
  399. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
  400. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  401. package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
  402. package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
  403. package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
  404. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
  405. package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
  406. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
  407. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
  408. package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
  409. package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
  410. package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
  411. package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
  412. package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
  413. package/src/parsers/manifest/dash/parsers_types.ts +3 -3
  414. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
  415. package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
  416. package/src/parsers/manifest/smooth/create_parser.ts +24 -21
  417. package/src/parsers/manifest/smooth/representation_index.ts +14 -14
  418. package/src/parsers/manifest/types.ts +28 -28
  419. package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
  420. package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
  421. package/src/parsers/manifest/utils/index_helpers.ts +2 -2
  422. package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
  423. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  424. package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
  425. package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
  426. package/src/public_types.ts +5 -1
  427. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
  428. package/src/transports/dash/image_pipelines.ts +4 -1
  429. package/src/transports/dash/init_segment_loader.ts +1 -1
  430. package/src/transports/dash/manifest_parser.ts +1 -1
  431. package/src/transports/dash/segment_loader.ts +7 -7
  432. package/src/transports/dash/segment_parser.ts +8 -1
  433. package/src/transports/dash/text_loader.ts +2 -2
  434. package/src/transports/dash/text_parser.ts +11 -1
  435. package/src/transports/local/segment_loader.ts +4 -4
  436. package/src/transports/local/segment_parser.ts +4 -0
  437. package/src/transports/local/text_parser.ts +8 -0
  438. package/src/transports/metaplaylist/manifest_loader.ts +1 -1
  439. package/src/transports/metaplaylist/pipelines.ts +1 -1
  440. package/src/transports/smooth/pipelines.ts +29 -16
  441. package/src/transports/smooth/segment_loader.ts +8 -8
  442. package/src/transports/types.ts +59 -30
  443. package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
  444. package/src/transports/utils/generate_manifest_loader.ts +1 -1
  445. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  446. package/src/utils/__tests__/flat_map.test.ts +12 -7
  447. package/src/utils/cancellable_sleep.ts +1 -1
  448. package/src/utils/cast_to_observable.ts +1 -2
  449. package/src/utils/deep_merge.ts +46 -0
  450. package/src/utils/reference.ts +116 -23
  451. package/src/utils/request/fetch.ts +17 -15
  452. package/src/utils/request/xhr.ts +11 -8
  453. package/src/utils/rx-from_cancellable_promise.ts +8 -4
  454. package/src/utils/task_canceller.ts +6 -4
  455. package/tsconfig.json +1 -2
  456. package/tsconfig.modules.json +1 -2
  457. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
  458. package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
  459. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  460. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  461. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  462. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  463. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  464. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  465. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  466. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  467. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
  468. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  469. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  470. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  471. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  472. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  473. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  474. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  475. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  476. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  477. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  478. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  479. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  480. package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
  481. package/src/core/eme/README.md +0 -26
  482. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  483. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  484. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  485. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  486. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  487. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  488. package/src/core/eme/clear_eme_session.ts +0 -62
  489. package/src/core/eme/create_session.ts +0 -187
  490. package/src/core/eme/dispose_eme.ts +0 -25
  491. package/src/core/eme/dispose_media_keys.ts +0 -46
  492. package/src/core/eme/eme_manager.ts +0 -387
  493. package/src/core/eme/get_media_keys.ts +0 -141
  494. package/src/core/eme/get_session.ts +0 -135
  495. package/src/core/eme/init_media_keys.ts +0 -106
  496. package/src/core/eme/set_server_certificate.ts +0 -115
  497. package/src/core/eme/utils/close_session.ts +0 -113
  498. package/src/core/eme/utils/init_data_store.ts +0 -234
  499. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  500. package/src/core/init/create_eme_manager.ts +0 -95
@@ -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.
@@ -14,7 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import PPromise from "pinkie";
18
17
  import {
19
18
  Observable,
20
19
  } from "rxjs";
@@ -31,6 +30,7 @@ import {
31
30
  ITransportPipelines,
32
31
  } from "../../../transports";
33
32
  import assert from "../../../utils/assert";
33
+ import PPromise from "../../../utils/promise";
34
34
  import TaskCanceller from "../../../utils/task_canceller";
35
35
  import errorSelector from "../utils/error_selector";
36
36
  import {
@@ -38,10 +38,6 @@ import {
38
38
  tryRequestPromiseWithBackoff,
39
39
  } from "../utils/try_urls_with_backoff";
40
40
 
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
41
 
46
42
  /** What will be sent once parsed. */
47
43
  export interface IManifestFetcherParsedResult {
@@ -54,11 +50,11 @@ export interface IManifestFetcherParsedResult {
54
50
  * The time (`performance.now()`) at which the request was started (at which
55
51
  * the JavaScript call was done).
56
52
  */
57
- sendingTime? : number;
53
+ sendingTime? : number | undefined;
58
54
  /** The time (`performance.now()`) at which the request was fully received. */
59
- receivedTime? : number;
55
+ receivedTime? : number | undefined;
60
56
  /* The time taken to parse the Manifest through the corresponding parse function. */
61
- parsingTime? : number;
57
+ parsingTime? : number | undefined;
62
58
  }
63
59
 
64
60
  /** Emitted when a fetching or parsing minor error happened. */
@@ -86,7 +82,7 @@ export interface IManifestFetcherParserOptions {
86
82
  * If set, offset to add to `performance.now()` to obtain the current
87
83
  * server's time.
88
84
  */
89
- externalClockOffset? : number;
85
+ externalClockOffset? : number | undefined;
90
86
  /** The previous value of the Manifest (when updating). */
91
87
  previousManifest : Manifest | null;
92
88
  /**
@@ -407,6 +403,10 @@ export default class ManifestFetcher {
407
403
  * @returns {Object}
408
404
  */
409
405
  private _getBackoffSetting(onRetry : (err : unknown) => void) : IBackoffSettings {
406
+ const { DEFAULT_MAX_MANIFEST_REQUEST_RETRY,
407
+ DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
408
+ INITIAL_BACKOFF_DELAY_BASE,
409
+ MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
410
410
  const { lowLatencyMode,
411
411
  maxRetryRegular : ogRegular,
412
412
  maxRetryOffline : ogOffline } = this._settings;
@@ -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
 
@@ -119,7 +115,8 @@ export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
119
115
  /**
120
116
  * If the request succeeded, set to the corresponding
121
117
  * `IChunkCompleteInformation` object.
122
- * If the request failed or was cancelled, set to `null`.
118
+ * For any other completion cases: if the request either failed, was
119
+ * cancelled or just if no request was needed, set to `null`.
123
120
  *
124
121
  * Stays to `undefined` when the request is still pending.
125
122
  */
@@ -216,6 +213,8 @@ export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
216
213
  if (res.resultType !== "segment-created") {
217
214
  requestInfo = res.resultData;
218
215
  sendNetworkMetricsIfAvailable();
216
+ } else {
217
+ requestInfo = null;
219
218
  }
220
219
 
221
220
  if (!canceller.isUsed) {
@@ -439,10 +438,14 @@ export function getSegmentFetcherOptions(
439
438
  bufferType : string,
440
439
  { maxRetryRegular,
441
440
  maxRetryOffline,
442
- lowLatencyMode } : { maxRetryRegular? : number;
443
- maxRetryOffline? : number;
441
+ lowLatencyMode } : { maxRetryRegular? : number | undefined;
442
+ maxRetryOffline? : number | undefined;
444
443
  lowLatencyMode : boolean; }
445
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();
446
449
  return { maxRetryRegular: bufferType === "image" ? 0 :
447
450
  maxRetryRegular ?? DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
448
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,
@@ -14,7 +14,6 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import PPromise from "pinkie";
18
17
  import { isOffline } from "../../../compat";
19
18
  import {
20
19
  CustomLoaderError,
@@ -25,6 +24,7 @@ import {
25
24
  import log from "../../../log";
26
25
  import cancellableSleep from "../../../utils/cancellable_sleep";
27
26
  import getFuzzedDelay from "../../../utils/get_fuzzed_delay";
27
+ import PPromise from "../../../utils/promise";
28
28
  import TaskCanceller, {
29
29
  CancellationSignal,
30
30
  } from "../../../utils/task_canceller";
@@ -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
@@ -100,8 +106,8 @@ export interface IDirectFileOptions { autoPlay : boolean;
100
106
  mediaElement : HTMLMediaElement;
101
107
  playbackObserver : PlaybackObserver;
102
108
  speed : IReadOnlySharedReference<number>;
103
- startAt? : IInitialTimeOptions;
104
- url? : string; }
109
+ startAt? : IInitialTimeOptions | undefined;
110
+ url? : string | undefined; }
105
111
 
106
112
  /**
107
113
  * Launch a content in "Directfile mode".
@@ -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$);