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
@@ -14,15 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- defer as observableDefer,
19
- Observable,
20
- of as observableOf,
21
- throwError as observableThrow,
22
- } from "rxjs";
23
17
  import { MediaError } from "../../../errors";
24
18
  import assert from "../../../utils/assert";
25
- import castToObservable from "../../../utils/cast_to_observable";
26
19
  import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
27
20
  import { isIE11 } from "../../browser_detection";
28
21
  import isNode from "../../is_node";
@@ -47,12 +40,18 @@ import { WebKitMediaKeysConstructor } from "./webkit_media_keys_constructor";
47
40
  /** Generic implementation of the navigator.requestMediaKeySystemAccess API. */
48
41
  type ICompatRequestMediaKeySystemAccessFn =
49
42
  (keyType : string, config : MediaKeySystemConfiguration[]) =>
50
- Observable<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
43
+ Promise<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
51
44
 
52
- let requestMediaKeySystemAccess : null | ICompatRequestMediaKeySystemAccessFn = null;
45
+ let requestMediaKeySystemAccess : ICompatRequestMediaKeySystemAccessFn | null = null;
53
46
 
54
- let _setMediaKeys :
55
- ((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => void) =
47
+ /**
48
+ * Set the given MediaKeys on the given HTMLMediaElement.
49
+ * Emits null when done then complete.
50
+ * @param {HTMLMediaElement} elt
51
+ * @param {Object} mediaKeys
52
+ */
53
+ let setMediaKeys :
54
+ ((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => unknown) =
56
55
  function defaultSetMediaKeys(
57
56
  mediaElement: HTMLMediaElement,
58
57
  mediaKeys: MediaKeys | ICustomMediaKeys | null
@@ -92,11 +91,8 @@ let _setMediaKeys :
92
91
  if (isNode ||
93
92
  (navigator.requestMediaKeySystemAccess != null && !shouldFavourCustomSafariEME())
94
93
  ) {
95
- requestMediaKeySystemAccess = (
96
- a : string,
97
- b : MediaKeySystemConfiguration[]
98
- ) : Observable<MediaKeySystemAccess> =>
99
- castToObservable(navigator.requestMediaKeySystemAccess(a, b));
94
+ requestMediaKeySystemAccess = (...args) =>
95
+ navigator.requestMediaKeySystemAccess(...args);
100
96
  } else {
101
97
  let isTypeSupported: (keyType: string) => boolean;
102
98
  let createCustomMediaKeys: (keyType: string) => ICustomMediaKeys;
@@ -106,23 +102,23 @@ if (isNode ||
106
102
  const callbacks = getOldKitWebKitMediaKeyCallbacks();
107
103
  isTypeSupported = callbacks.isTypeSupported;
108
104
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
109
- _setMediaKeys = callbacks.setMediaKeys;
105
+ setMediaKeys = callbacks.setMediaKeys;
110
106
  // This is for WebKit with prefixed EME api
111
107
  } else if (WebKitMediaKeysConstructor !== undefined) {
112
108
  const callbacks = getWebKitMediaKeysCallbacks();
113
109
  isTypeSupported = callbacks.isTypeSupported;
114
110
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
115
- _setMediaKeys = callbacks.setMediaKeys;
111
+ setMediaKeys = callbacks.setMediaKeys;
116
112
  } else if (isIE11 && MSMediaKeysConstructor !== undefined) {
117
113
  const callbacks = getIE11MediaKeysCallbacks();
118
114
  isTypeSupported = callbacks.isTypeSupported;
119
115
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
120
- _setMediaKeys = callbacks.setMediaKeys;
116
+ setMediaKeys = callbacks.setMediaKeys;
121
117
  } else if (MozMediaKeysConstructor !== undefined) {
122
118
  const callbacks = getMozMediaKeysCallbacks();
123
119
  isTypeSupported = callbacks.isTypeSupported;
124
120
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
125
- _setMediaKeys = callbacks.setMediaKeys;
121
+ setMediaKeys = callbacks.setMediaKeys;
126
122
  } else {
127
123
  const MK = window.MediaKeys as unknown as typeof MediaKeys & {
128
124
  isTypeSupported? : (keyType : string) => boolean;
@@ -155,9 +151,9 @@ if (isNode ||
155
151
  requestMediaKeySystemAccess = function(
156
152
  keyType : string,
157
153
  keySystemConfigurations : MediaKeySystemConfiguration[]
158
- ) : Observable<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
154
+ ) : Promise<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
159
155
  if (!isTypeSupported(keyType)) {
160
- return observableThrow(() => new Error("Unsupported key type"));
156
+ return Promise.reject(new Error("Unsupported key type"));
161
157
  }
162
158
 
163
159
  for (let i = 0; i < keySystemConfigurations.length; i++) {
@@ -188,7 +184,7 @@ if (isNode ||
188
184
 
189
185
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
190
186
  const customMediaKeys = createCustomMediaKeys(keyType);
191
- return observableOf(
187
+ return Promise.resolve(
192
188
  new CustomMediaKeySystemAccess(keyType,
193
189
  customMediaKeys,
194
190
  keySystemConfigurationResponse)
@@ -196,24 +192,10 @@ if (isNode ||
196
192
  }
197
193
  }
198
194
 
199
- return observableThrow(() => new Error("Unsupported configuration"));
195
+ return Promise.reject(new Error("Unsupported configuration"));
200
196
  };
201
197
  }
202
198
 
203
- /**
204
- * Set the given MediaKeys on the given HTMLMediaElement.
205
- * Emits null when done then complete.
206
- * @param {HTMLMediaElement} elt
207
- * @param {Object} mediaKeys
208
- * @returns {Observable}
209
- */
210
- function setMediaKeys(
211
- elt : HTMLMediaElement,
212
- mediaKeys : MediaKeys|ICustomMediaKeys|null
213
- ) : Observable<unknown> {
214
- return observableDefer(() => castToObservable(_setMediaKeys(elt, mediaKeys)));
215
- }
216
-
217
199
  export {
218
200
  requestMediaKeySystemAccess,
219
201
  setMediaKeys,
@@ -14,16 +14,10 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- merge as observableMerge,
19
- Subject,
20
- takeUntil,
21
- } from "rxjs";
22
17
  import { base64ToBytes } from "../../../utils/base64";
23
18
  import EventEmitter from "../../../utils/event_emitter";
24
- import PPromise from "../../../utils/promise";
19
+ import noop from "../../../utils/noop";
25
20
  import { utf8ToStr } from "../../../utils/string_parsing";
26
- import * as events from "../../event_listeners";
27
21
  import {
28
22
  ICustomMediaKeys,
29
23
  ICustomMediaKeySession,
@@ -54,11 +48,16 @@ export function isOldWebkitMediaElement(
54
48
  .webkitGenerateKeyRequest === "function";
55
49
  }
56
50
 
51
+ /**
52
+ * MediaKeySession implementation for older versions of WebKit relying on APIs
53
+ * such as `webkitGenerateKeyRequest` `webkitAddKey` to be called on the
54
+ * HTMLMediaElement.
55
+ * @class OldWebkitMediaKeySession
56
+ */
57
57
  class OldWebkitMediaKeySession
58
58
  extends EventEmitter<IMediaKeySessionEvents>
59
59
  implements ICustomMediaKeySession
60
60
  {
61
- public readonly update: (license: Uint8Array) => Promise<void>;
62
61
  public readonly closed: Promise<void>;
63
62
  public expiration: number;
64
63
  public keyStatuses: ICustomMediaKeyStatusMap;
@@ -66,75 +65,92 @@ class OldWebkitMediaKeySession
66
65
 
67
66
  private readonly _vid: IOldWebkitHTMLMediaElement;
68
67
  private readonly _key: string;
69
- private readonly _closeSession$: Subject<void>;
68
+
69
+ private readonly _onSessionRelatedEvent : (evt : Event) => void;
70
+ private _closeSession : () => void;
70
71
 
71
72
  constructor(mediaElement: IOldWebkitHTMLMediaElement, keySystem: string) {
72
73
  super();
73
- this._closeSession$ = new Subject();
74
74
  this._vid = mediaElement;
75
75
  this._key = keySystem;
76
76
 
77
77
  this.sessionId = "";
78
- this.closed = new PPromise((resolve) => {
79
- this._closeSession$.subscribe(resolve);
78
+ this._closeSession = noop; // Just here to make TypeScript happy
79
+ this.closed = new Promise((resolve) => {
80
+ this._closeSession = resolve;
80
81
  });
81
82
  this.keyStatuses = new Map();
82
83
  this.expiration = NaN;
83
84
 
84
- observableMerge(events.onKeyMessage$(mediaElement),
85
- events.onKeyAdded$(mediaElement),
86
- events.onKeyError$(mediaElement))
87
- .pipe(takeUntil(this._closeSession$))
88
- .subscribe((evt: Event) => this.trigger(evt.type, evt));
89
-
90
- this.update = (license: Uint8Array) => {
91
- return new PPromise((resolve, reject) => {
92
- try {
93
- if (this._key.indexOf("clearkey") >= 0) {
94
- const licenseTypedArray =
95
- license instanceof ArrayBuffer ? new Uint8Array(license) :
96
- license;
97
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
98
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
99
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
100
- const json = JSON.parse(utf8ToStr(licenseTypedArray));
101
- const key = base64ToBytes(json.keys[0].k);
102
- const kid = base64ToBytes(json.keys[0].kid);
103
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
104
- /* eslint-enable @typescript-eslint/no-unsafe-argument */
105
- /* eslint-enable @typescript-eslint/no-unsafe-assignment */
106
- resolve(this._vid.webkitAddKey(this._key, key, kid, /* sessionId */ ""));
107
- } else {
108
- resolve(this._vid.webkitAddKey(this._key, license, null, /* sessionId */ ""));
109
- }
110
- } catch (err) {
111
- reject(err);
112
- }
113
- });
85
+ this._onSessionRelatedEvent = (evt : Event) => {
86
+ this.trigger(evt.type, evt);
114
87
  };
88
+
89
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
90
+ .forEach(evt => mediaElement.addEventListener(evt, this._onSessionRelatedEvent));
115
91
  }
116
92
 
117
- generateRequest(_initDataType: string, initData: ArrayBuffer): Promise<void> {
118
- return new PPromise((resolve) => {
93
+ public update(license: Uint8Array) : Promise<void> {
94
+ return new Promise((resolve, reject) => {
95
+ try {
96
+ if (this._key.indexOf("clearkey") >= 0) {
97
+ const licenseTypedArray =
98
+ license instanceof ArrayBuffer ? new Uint8Array(license) :
99
+ license;
100
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
101
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
102
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
103
+ const json = JSON.parse(utf8ToStr(licenseTypedArray));
104
+ const key = base64ToBytes(json.keys[0].k);
105
+ const kid = base64ToBytes(json.keys[0].kid);
106
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
107
+ /* eslint-enable @typescript-eslint/no-unsafe-argument */
108
+ /* eslint-enable @typescript-eslint/no-unsafe-assignment */
109
+ resolve(this._vid.webkitAddKey(this._key, key, kid, /* sessionId */ ""));
110
+ } else {
111
+ resolve(this._vid.webkitAddKey(this._key, license, null, /* sessionId */ ""));
112
+ }
113
+ } catch (err) {
114
+ reject(err);
115
+ }
116
+ });
117
+ }
118
+
119
+ public generateRequest(
120
+ _initDataType: string,
121
+ initData: ArrayBuffer
122
+ ): Promise<void> {
123
+ return new Promise((resolve) => {
119
124
  this._vid.webkitGenerateKeyRequest(this._key, initData);
120
125
  resolve();
121
126
  });
122
127
  }
123
128
 
124
- close(): Promise<void> {
125
- return new PPromise((resolve) => {
126
- this._closeSession$.next();
127
- this._closeSession$.complete();
129
+ public close(): Promise<void> {
130
+ return new Promise((resolve) => {
131
+ this._unbindSession();
132
+ this._closeSession();
128
133
  resolve();
129
134
  });
130
135
  }
131
136
 
132
- load(): Promise<boolean> {
133
- return PPromise.resolve(false);
137
+ /**
138
+ * Load a Persistent MediaKeySession.
139
+ * Do nothing here because this implementation doesn't handle them.
140
+ * @returns {Promise.<boolean>}
141
+ */
142
+ public load(): Promise<boolean> {
143
+ // Not implemented. Always return false as in "no session with that id".
144
+ return Promise.resolve(false);
145
+ }
146
+
147
+ public remove(): Promise<void> {
148
+ return Promise.resolve();
134
149
  }
135
150
 
136
- remove(): Promise<void> {
137
- return PPromise.resolve();
151
+ private _unbindSession() {
152
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
153
+ .forEach(evt => this._vid.removeEventListener(evt, this._onSessionRelatedEvent));
138
154
  }
139
155
  }
140
156
 
@@ -14,15 +14,9 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- merge as observableMerge,
19
- Subject,
20
- takeUntil,
21
- } from "rxjs";
22
17
  import EventEmitter from "../../../utils/event_emitter";
23
- import PPromise from "../../../utils/promise";
18
+ import noop from "../../../utils/noop";
24
19
  import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
25
- import * as events from "../../event_listeners";
26
20
  import getWebKitFairplayInitData from "../get_webkit_fairplay_initdata";
27
21
  import {
28
22
  ICustomMediaKeys,
@@ -80,17 +74,19 @@ class WebkitMediaKeySession
80
74
  extends EventEmitter<IMediaKeySessionEvents>
81
75
  implements ICustomMediaKeySession
82
76
  {
83
- public readonly update: (license: Uint8Array) => Promise<void>;
84
77
  public readonly closed: Promise<void>;
85
78
  public expiration: number;
86
79
  public keyStatuses: ICustomMediaKeyStatusMap;
87
80
 
88
81
  private readonly _videoElement: HTMLMediaElement;
89
- private readonly _closeSession$: Subject<void>;
90
82
  private readonly _keyType: string;
91
83
  private _nativeSession: undefined | MediaKeySession;
92
84
  private _serverCertificate: Uint8Array | undefined;
93
85
 
86
+ private readonly _onEvent : (evt : Event) => void;
87
+ private _closeSession : () => void;
88
+ private _unbindSession : () => void;
89
+
94
90
  /**
95
91
  * @param {HTMLMediaElement} mediaElement
96
92
  * @param {string} keyType
@@ -103,60 +99,47 @@ class WebkitMediaKeySession
103
99
  ) {
104
100
  super();
105
101
  this._serverCertificate = serverCertificate;
106
- this._closeSession$ = new Subject();
107
102
  this._videoElement = mediaElement;
108
103
  this._keyType = keyType;
109
104
 
110
- this.closed = new PPromise((resolve) => {
111
- this._closeSession$.subscribe(resolve);
105
+ this._unbindSession = noop;
106
+ this._closeSession = noop; // Just here to make TypeScript happy
107
+ this.closed = new Promise((resolve) => {
108
+ this._closeSession = resolve;
112
109
  });
113
110
  this.keyStatuses = new Map();
114
111
  this.expiration = NaN;
115
112
 
116
- this.update = (license: BufferSource) => {
117
- return new PPromise((resolve, reject) => {
118
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
119
- if (this._nativeSession === undefined ||
120
- this._nativeSession.update === undefined ||
121
- typeof this._nativeSession.update !== "function") {
122
- return reject("Unavailable WebKit key session.");
123
- }
124
- try {
125
- let uInt8Arraylicense: Uint8Array;
126
- if (license instanceof ArrayBuffer) {
127
- uInt8Arraylicense = new Uint8Array(license);
128
- } else if (license instanceof Uint8Array) {
129
- uInt8Arraylicense = license;
130
- } else {
131
- uInt8Arraylicense = new Uint8Array(license.buffer);
132
- }
133
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
134
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
135
- resolve(this._nativeSession.update(uInt8Arraylicense));
136
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
137
- } catch (err) {
138
- reject(err);
139
- }
140
- /* eslint-enable @typescript-eslint/no-unsafe-member-access */
141
- });
113
+ this._onEvent = (evt : Event) => {
114
+ this.trigger(evt.type, evt);
142
115
  };
143
116
  }
144
117
 
145
- listenEvent(session: MediaKeySession) {
146
- observableMerge(events.onKeyMessage$(session),
147
- events.onKeyAdded$(session),
148
- events.onKeyError$(session))
149
- .pipe(takeUntil(this._closeSession$))
150
- .subscribe((evt: Event) => {
151
- this.trigger(evt.type, evt);
152
- });
118
+ public update(license: BufferSource) : Promise<void> {
119
+ return new Promise((resolve, reject) => {
120
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
121
+ if (this._nativeSession === undefined ||
122
+ this._nativeSession.update === undefined ||
123
+ typeof this._nativeSession.update !== "function") {
124
+ return reject("Unavailable WebKit key session.");
125
+ }
126
+ try {
127
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
128
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
129
+ resolve(this._nativeSession.update(license));
130
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
131
+ } catch (err) {
132
+ reject(err);
133
+ }
134
+ /* eslint-enable @typescript-eslint/no-unsafe-member-access */
135
+ });
153
136
  }
154
137
 
155
- generateRequest(
138
+ public generateRequest(
156
139
  _initDataType: string,
157
140
  initData: ArrayBuffer
158
141
  ): Promise<void> {
159
- return new PPromise((resolve) => {
142
+ return new Promise((resolve) => {
160
143
  const elt = this._videoElement as ICompatHTMLMediaElement;
161
144
  if (elt.webkitKeys?.createSession === undefined) {
162
145
  throw new Error("No WebKitMediaKeys API.");
@@ -178,17 +161,17 @@ class WebkitMediaKeySession
178
161
  if (keySession === undefined || keySession === null) {
179
162
  throw new Error("Impossible to get the key sessions");
180
163
  }
181
- this.listenEvent(keySession);
164
+ this._listenEvent(keySession);
182
165
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
183
166
  this._nativeSession = keySession;
184
167
  resolve();
185
168
  });
186
169
  }
187
170
 
188
- close(): Promise<void> {
189
- return new PPromise((resolve, reject) => {
190
- this._closeSession$.next();
191
- this._closeSession$.complete();
171
+ public close(): Promise<void> {
172
+ return new Promise((resolve, reject) => {
173
+ this._unbindSession();
174
+ this._closeSession();
192
175
  if (this._nativeSession === undefined) {
193
176
  reject("No session to close.");
194
177
  return;
@@ -201,11 +184,11 @@ class WebkitMediaKeySession
201
184
  }
202
185
 
203
186
  load(): Promise<boolean> {
204
- return PPromise.resolve(false);
187
+ return Promise.resolve(false);
205
188
  }
206
189
 
207
190
  remove(): Promise<void> {
208
- return PPromise.resolve();
191
+ return Promise.resolve();
209
192
  }
210
193
 
211
194
  get sessionId(): string {
@@ -215,6 +198,24 @@ class WebkitMediaKeySession
215
198
  /* eslint-enable @typescript-eslint/no-unsafe-member-access */
216
199
  /* eslint-enable @typescript-eslint/no-unsafe-return */
217
200
  }
201
+
202
+ private _listenEvent(session: MediaKeySession) : void {
203
+ this._unbindSession(); // If previous session was linked
204
+
205
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
206
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
207
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
208
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
209
+ .forEach(evt => session.addEventListener(evt, this._onEvent));
210
+
211
+ this._unbindSession = () => {
212
+ ["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
213
+ .forEach(evt => session.removeEventListener(evt, this._onEvent));
214
+ };
215
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
216
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
217
+ /* eslint-enable @typescript-eslint/no-unsafe-call */
218
+ }
218
219
  }
219
220
 
220
221
  class WebKitCustomMediaKeys implements ICustomWebKitMediaKeys {
@@ -251,7 +252,7 @@ class WebKitCustomMediaKeys implements ICustomWebKitMediaKeys {
251
252
 
252
253
  setServerCertificate(serverCertificate: Uint8Array): Promise<void> {
253
254
  this._serverCertificate = serverCertificate;
254
- return PPromise.resolve();
255
+ return Promise.resolve();
255
256
  }
256
257
  }
257
258
 
@@ -14,18 +14,12 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- catchError,
19
- defer as observableDefer,
20
- Observable,
21
- } from "rxjs";
22
17
  import log from "../../log";
23
18
  import { getNextBoxOffsets } from "../../parsers/containers/isobmff";
24
19
  import {
25
20
  be4toi,
26
21
  concat,
27
22
  } from "../../utils/byte_parsing";
28
- import castToObservable from "../../utils/cast_to_observable";
29
23
  import { PSSH_TO_INTEGER } from "./constants";
30
24
  import { ICustomMediaKeySession } from "./custom_media_keys";
31
25
 
@@ -136,37 +130,35 @@ export function patchInitData(initData : Uint8Array) : Uint8Array {
136
130
  * "encrypted" event for the corresponding request.
137
131
  * @param {string} sessionType - Type of session you want to generate. Consult
138
132
  * EME Specification for more information on session types.
139
- * @returns {Observable} - Emit when done. Errors if fails.
133
+ * @returns {Promise} - Emit when done. Errors if fails.
140
134
  */
141
135
  export default function generateKeyRequest(
142
136
  session: MediaKeySession|ICustomMediaKeySession,
143
137
  initializationDataType : string | undefined,
144
138
  initializationData : Uint8Array
145
- ) : Observable<unknown> {
146
- return observableDefer(() => {
147
- log.debug("Compat: Calling generateRequest on the MediaKeySession");
148
- let patchedInit : Uint8Array;
149
- try {
150
- patchedInit = patchInitData(initializationData);
151
- } catch (_e) {
152
- patchedInit = initializationData;
153
- }
154
- const initDataType = initializationDataType ?? "";
155
- return castToObservable(session.generateRequest(initDataType, patchedInit))
156
- .pipe(catchError(error => {
157
- if (initDataType !== "" || !(error instanceof TypeError)) {
158
- throw error;
159
- }
139
+ ) : Promise<unknown> {
140
+ log.debug("Compat: Calling generateRequest on the MediaKeySession");
141
+ let patchedInit : Uint8Array;
142
+ try {
143
+ patchedInit = patchInitData(initializationData);
144
+ } catch (_e) {
145
+ patchedInit = initializationData;
146
+ }
147
+ const initDataType = initializationDataType ?? "";
148
+ return session.generateRequest(initDataType, patchedInit)
149
+ .catch((error) => {
150
+ if (initDataType !== "" || !(error instanceof TypeError)) {
151
+ throw error;
152
+ }
160
153
 
161
- // On newer EME versions of the specification, the initialization data
162
- // type given to generateRequest cannot be an empty string (it returns
163
- // a rejected promise with a TypeError in that case).
164
- // Retry with a default "cenc" value for initialization data type if
165
- // we're in that condition.
166
- log.warn("Compat: error while calling `generateRequest` with an empty " +
167
- "initialization data type. Retrying with a default \"cenc\" value.",
168
- error);
169
- return castToObservable(session.generateRequest("cenc", patchedInit));
170
- }));
171
- });
154
+ // On newer EME versions of the specification, the initialization data
155
+ // type given to generateRequest cannot be an empty string (it returns
156
+ // a rejected promise with a TypeError in that case).
157
+ // Retry with a default "cenc" value for initialization data type if
158
+ // we're in that condition.
159
+ log.warn("Compat: error while calling `generateRequest` with an empty " +
160
+ "initialization data type. Retrying with a default \"cenc\" value.",
161
+ error);
162
+ return session.generateRequest("cenc", patchedInit);
163
+ });
172
164
  }
@@ -14,20 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- defer as observableDefer,
19
- map,
20
- mergeMap,
21
- Observable,
22
- of as observableOf,
23
- race as observableRace,
24
- take,
25
- timer as observableTimer,
26
- } from "rxjs";
27
17
  import log from "../../log";
28
- import castToObservable from "../../utils/cast_to_observable";
29
- import tryCatch from "../../utils/rx-try_catch";
30
- import { onKeyStatusesChange$ } from "../event_listeners";
31
18
  import { ICustomMediaKeySession } from "./custom_media_keys";
32
19
 
33
20
  const EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
@@ -46,26 +33,36 @@ const EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
46
33
  * @param {string} sessionId
47
34
  * @returns {Observable}
48
35
  */
49
- export default function loadSession(
36
+ export default async function loadSession(
50
37
  session : MediaKeySession | ICustomMediaKeySession,
51
38
  sessionId : string
52
- ) : Observable<boolean> {
53
- return observableDefer(() => {
54
- log.info("Compat/EME: Load persisted session", sessionId);
55
- return tryCatch<undefined, boolean>(() => castToObservable(session.load(sessionId)),
56
- undefined);
57
- }).pipe(mergeMap((isLoaded : boolean) : Observable<boolean> => {
58
- if (!isLoaded || session.keyStatuses.size > 0) {
59
- return observableOf(isLoaded);
39
+ ) : Promise<boolean> {
40
+ log.info("Compat/DRM: Load persisted session", sessionId);
41
+ const isLoaded = await session.load(sessionId);
42
+
43
+ if (!isLoaded || session.keyStatuses.size > 0) {
44
+ return isLoaded;
45
+ }
46
+
47
+ // A browser race condition can exist, seen for example in some
48
+ // Chromium/Chrome versions where the `keyStatuses` property from a loaded
49
+ // MediaKeySession would not be populated directly as the load answer but
50
+ // asynchronously after.
51
+ return new Promise((resolve) => {
52
+ (session as MediaKeySession).addEventListener("keystatuseschange",
53
+ resolveWithLoadedStatus);
54
+ const timeout = setTimeout(resolveWithLoadedStatus,
55
+ EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES);
56
+
57
+ function resolveWithLoadedStatus() {
58
+ cleanUp();
59
+ resolve(isLoaded);
60
60
  }
61
61
 
62
- // A browser race condition can exist, seen for example in some
63
- // Chromium/Chrome versions where the `keyStatuses` property from a loaded
64
- // MediaKeySession would not be populated directly as the load answer but
65
- // asynchronously after.
66
- return observableRace(
67
- observableTimer(EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES),
68
- onKeyStatusesChange$(session)
69
- ).pipe(take(1), map(() => isLoaded));
70
- }));
62
+ function cleanUp() {
63
+ clearTimeout(timeout);
64
+ (session as MediaKeySession).removeEventListener("keystatuseschange",
65
+ resolveWithLoadedStatus);
66
+ }
67
+ });
71
68
  }