rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.20220317

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/FILES.md +5 -4
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
  5. package/dist/_esm5.processed/compat/browser_detection.js +4 -2
  6. package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
  7. package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
  8. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
  9. package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
  10. package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
  11. package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
  12. package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
  13. package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
  14. package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
  15. package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
  16. package/dist/_esm5.processed/compat/event_listeners.js +2 -1
  17. package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
  18. package/dist/_esm5.processed/config.d.ts +166 -1080
  19. package/dist/_esm5.processed/config.js +17 -1119
  20. package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
  21. package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
  22. package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
  23. package/dist/_esm5.processed/core/api/index.d.ts +2 -1
  24. package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
  25. package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
  26. package/dist/_esm5.processed/core/api/option_utils.js +19 -6
  27. package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
  28. package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
  29. package/dist/_esm5.processed/core/api/public_api.js +72 -33
  30. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
  31. package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
  32. package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
  33. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
  34. package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
  35. package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
  36. package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
  37. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
  38. package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
  39. package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
  40. package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
  41. package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
  42. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
  43. package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
  44. package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
  45. package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
  46. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
  47. package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
  48. package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
  49. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
  50. package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
  51. package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
  52. package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
  53. package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
  54. package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
  55. package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
  56. package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
  57. package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
  58. package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
  59. package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
  60. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
  61. package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
  62. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
  63. package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
  64. package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
  65. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
  66. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
  67. package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
  68. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
  69. package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
  70. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
  71. package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
  72. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
  73. package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
  74. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
  75. package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
  76. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
  77. package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
  78. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
  79. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
  80. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
  81. package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
  82. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
  83. package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
  84. package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
  85. package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
  86. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
  87. package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
  88. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
  89. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
  90. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  91. package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
  92. package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
  93. package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
  94. package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +4 -2
  95. package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
  96. package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
  97. package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
  98. package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
  99. package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
  100. package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
  101. package/dist/_esm5.processed/core/init/types.d.ts +2 -4
  102. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
  103. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
  104. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
  105. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
  106. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
  107. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
  108. package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
  109. package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
  110. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
  111. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
  112. package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
  113. package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
  114. package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
  115. package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
  116. package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
  117. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
  118. package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
  119. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
  120. package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
  121. package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
  122. package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
  123. package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
  124. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
  125. package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
  126. package/dist/_esm5.processed/default_config.d.ts +1114 -0
  127. package/dist/_esm5.processed/default_config.js +1145 -0
  128. package/dist/_esm5.processed/experimental/index.d.ts +2 -0
  129. package/dist/_esm5.processed/experimental/index.js +2 -0
  130. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
  131. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +1 -1
  132. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
  133. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
  134. package/dist/_esm5.processed/features/features_object.js +1 -1
  135. package/dist/_esm5.processed/features/initialize_features.js +1 -1
  136. package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
  137. package/dist/_esm5.processed/features/list/eme.js +5 -5
  138. package/dist/_esm5.processed/features/types.d.ts +3 -3
  139. package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
  140. package/dist/_esm5.processed/manifest/manifest.js +10 -74
  141. package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
  142. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
  143. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
  144. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
  145. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
  146. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
  147. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
  148. package/dist/_esm5.processed/public_types.d.ts +2 -2
  149. package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
  150. package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
  151. package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
  152. package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
  153. package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
  154. package/dist/_esm5.processed/transports/smooth/pipelines.js +68 -10
  155. package/dist/_esm5.processed/transports/types.d.ts +22 -0
  156. package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
  157. package/dist/_esm5.processed/utils/deep_merge.js +53 -0
  158. package/dist/_esm5.processed/utils/reference.d.ts +29 -0
  159. package/dist/_esm5.processed/utils/reference.js +72 -24
  160. package/dist/_esm5.processed/utils/request/fetch.js +1 -2
  161. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  162. package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
  163. package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
  164. package/dist/_esm5.processed/utils/task_canceller.js +3 -3
  165. package/dist/rx-player.js +5002 -3033
  166. package/dist/rx-player.min.js +1 -1
  167. package/dummy +1 -0
  168. package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
  169. package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
  170. package/package.json +32 -34
  171. package/scripts/build/templates/experimental/index.d.ts +16 -0
  172. package/scripts/build/templates/experimental/index.js +16 -0
  173. package/sonar-project.properties +1 -1
  174. package/src/README.md +6 -6
  175. package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
  176. package/src/compat/browser_detection.ts +4 -2
  177. package/src/compat/eme/close_session.ts +90 -56
  178. package/src/compat/eme/custom_media_keys/index.ts +21 -38
  179. package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
  180. package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
  181. package/src/compat/eme/generate_key_request.ts +25 -33
  182. package/src/compat/eme/load_session.ts +29 -31
  183. package/src/compat/event_listeners.ts +2 -1
  184. package/src/compat/should_favour_custom_safari_EME.ts +5 -2
  185. package/src/config.ts +17 -1210
  186. package/src/core/README.md +1 -1
  187. package/src/core/abr/bandwidth_estimator.ts +4 -4
  188. package/src/core/abr/network_analyzer.ts +5 -6
  189. package/src/core/api/__tests__/get_player_state.test.ts +3 -3
  190. package/src/core/api/__tests__/option_utils.test.ts +17 -17
  191. package/src/core/api/get_player_state.ts +1 -1
  192. package/src/core/api/index.ts +3 -0
  193. package/src/core/api/option_utils.ts +37 -20
  194. package/src/core/api/playback_observer.ts +12 -8
  195. package/src/core/api/public_api.ts +151 -111
  196. package/src/core/decrypt/README.md +22 -0
  197. package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
  198. package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
  199. package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
  200. package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
  201. package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
  202. package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
  203. package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
  204. package/src/core/decrypt/clear_on_stop.ts +48 -0
  205. package/src/core/decrypt/content_decryptor.ts +1158 -0
  206. package/src/core/decrypt/create_or_load_session.ts +130 -0
  207. package/src/core/decrypt/create_session.ts +175 -0
  208. package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
  209. package/src/core/{eme → decrypt}/find_key_system.ts +112 -122
  210. package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
  211. package/src/core/decrypt/get_media_keys.ts +145 -0
  212. package/src/core/{eme → decrypt}/index.ts +11 -8
  213. package/src/core/decrypt/init_media_keys.ts +51 -0
  214. package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
  215. package/src/core/decrypt/set_server_certificate.ts +104 -0
  216. package/src/core/{eme → decrypt}/types.ts +128 -258
  217. package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
  218. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
  219. package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
  220. package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
  221. package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
  222. package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
  223. package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
  224. package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
  225. package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
  226. package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
  227. package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
  228. package/src/core/decrypt/utils/key_session_record.ts +175 -0
  229. package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
  230. package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
  231. package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
  232. package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
  233. package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
  234. package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
  235. package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
  236. package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
  237. package/src/core/init/.initialize_media_source.ts.un~ +0 -0
  238. package/src/core/init/get_initial_time.ts +2 -1
  239. package/src/core/init/initialize_directfile.ts +17 -20
  240. package/src/core/init/initialize_media_source.ts +42 -105
  241. package/src/core/init/link_drm_and_content.ts +176 -0
  242. package/src/core/init/manifest_update_scheduler.ts +5 -3
  243. package/src/core/init/stall_avoider.ts +6 -5
  244. package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
  245. package/src/core/init/types.ts +1 -39
  246. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
  247. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
  248. package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
  249. package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
  250. package/src/core/stream/events_generators.ts +9 -4
  251. package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
  252. package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
  253. package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
  254. package/src/core/stream/period/period_stream.ts +5 -2
  255. package/src/core/stream/representation/force_garbage_collection.ts +2 -2
  256. package/src/core/stream/representation/get_buffer_status.ts +28 -16
  257. package/src/core/stream/representation/get_needed_segments.ts +124 -28
  258. package/src/core/stream/representation/get_segment_priority.ts +1 -2
  259. package/src/core/stream/representation/push_media_segment.ts +3 -2
  260. package/src/core/stream/representation/representation_stream.ts +30 -7
  261. package/src/core/stream/types.ts +1 -1
  262. package/src/default_config.ts +1241 -0
  263. package/src/experimental/index.ts +5 -0
  264. package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
  265. package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +2 -1
  266. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
  267. package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
  268. package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
  269. package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
  270. package/src/features/__tests__/initialize_features.test.ts +2 -2
  271. package/src/features/features_object.ts +1 -1
  272. package/src/features/initialize_features.ts +1 -1
  273. package/src/features/list/__tests__/eme.test.ts +5 -5
  274. package/src/features/list/eme.ts +5 -5
  275. package/src/features/types.ts +3 -10
  276. package/src/manifest/manifest.ts +6 -76
  277. package/src/manifest/representation.ts +36 -3
  278. package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
  279. package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
  280. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
  281. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
  282. package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
  283. package/src/parsers/manifest/smooth/create_parser.ts +1 -0
  284. package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
  285. package/src/public_types.ts +5 -1
  286. package/src/transports/dash/image_pipelines.ts +3 -0
  287. package/src/transports/dash/segment_parser.ts +5 -0
  288. package/src/transports/dash/text_parser.ts +8 -0
  289. package/src/transports/local/segment_parser.ts +4 -0
  290. package/src/transports/local/text_parser.ts +8 -0
  291. package/src/transports/smooth/pipelines.ts +22 -9
  292. package/src/transports/types.ts +22 -0
  293. package/src/utils/__tests__/deep_merge.test.ts +48 -0
  294. package/src/utils/deep_merge.ts +46 -0
  295. package/src/utils/reference.ts +116 -23
  296. package/src/utils/request/fetch.ts +1 -2
  297. package/src/utils/request/xhr.ts +2 -1
  298. package/src/utils/rx-from_cancellable_promise.ts +7 -2
  299. package/src/utils/task_canceller.ts +6 -4
  300. package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
  301. package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
  302. package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
  303. package/dist/_esm5.processed/core/eme/create_session.js +0 -126
  304. package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
  305. package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
  306. package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
  307. package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
  308. package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
  309. package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
  310. package/dist/_esm5.processed/core/eme/get_session.js +0 -68
  311. package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
  312. package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
  313. package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
  314. package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
  315. package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
  316. package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
  317. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
  318. package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
  319. package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
  320. package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
  321. package/src/core/eme/README.md +0 -26
  322. package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
  323. package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
  324. package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
  325. package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
  326. package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
  327. package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
  328. package/src/core/eme/clear_eme_session.ts +0 -62
  329. package/src/core/eme/create_session.ts +0 -187
  330. package/src/core/eme/dispose_eme.ts +0 -25
  331. package/src/core/eme/dispose_media_keys.ts +0 -46
  332. package/src/core/eme/eme_manager.ts +0 -387
  333. package/src/core/eme/get_media_keys.ts +0 -141
  334. package/src/core/eme/get_session.ts +0 -135
  335. package/src/core/eme/init_media_keys.ts +0 -106
  336. package/src/core/eme/set_server_certificate.ts +0 -115
  337. package/src/core/eme/utils/close_session.ts +0 -113
  338. package/src/core/eme/utils/init_data_store.ts +0 -234
  339. package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
  340. package/src/core/init/create_eme_manager.ts +0 -95
package/dummy ADDED
@@ -0,0 +1 @@
1
+ This is an unnecessary file, just added to trigger the integration tests in a PR through GitHub actions.
@@ -13,7 +13,4 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- /**
17
- * Free up all ressources taken by the EME management.
18
- */
19
- export default function disposeEME(mediaElement: HTMLMediaElement): void;
16
+ export * from "../dist/_esm5.processed/experimental/index";
@@ -13,9 +13,4 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Observable } from "rxjs";
17
- /**
18
- * @param {Object} mediaKeysInfos
19
- * @returns {Observable}
20
- */
21
- export default function disposeMediaKeys(mediaElement: HTMLMediaElement): Observable<unknown>;
16
+ export * from "../dist/_esm5.processed/experimental/index.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rx-player",
3
3
  "author": "Canal+",
4
- "version": "3.26.3-dev.2022021400",
4
+ "version": "3.27.0-dev.20220317",
5
5
  "description": "Canal+ HTML5 Video Player",
6
6
  "main": "./dist/rx-player.js",
7
7
  "keywords": [
@@ -38,7 +38,7 @@
38
38
  "build:wasm:release": "cd ./src/parsers/manifest/dash/wasm-parser && cargo build --target wasm32-unknown-unknown --release && wasm-opt -O3 -o ../../../../../dist/mpd-parser.wasm target/wasm32-unknown-unknown/release/mpd_node_parser.wasm && cd ../../../../../ && npm run wasm-strip",
39
39
  "certificate": "./scripts/generate_certificate",
40
40
  "check": "npm run check:types && npm run lint",
41
- "check:all": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test && npm run test:memory && node -r esm ./scripts/check_nodejs_import_compatibility.js",
41
+ "check:all": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test:unit && npm run test:integration && npm run test:memory && node -r esm ./scripts/check_nodejs_import_compatibility.js",
42
42
  "check:appveyor": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test:appveyor",
43
43
  "check:types": "tsc --noEmit --project .",
44
44
  "check:types:watch": "tsc --noEmit --watch --project .",
@@ -80,42 +80,40 @@
80
80
  "rxjs": "7.4.0"
81
81
  },
82
82
  "devDependencies": {
83
- "@babel/core": "7.16.7",
84
- "@babel/plugin-transform-runtime": "7.16.7",
85
- "@babel/preset-env": "7.16.7",
83
+ "@babel/core": "7.17.7",
84
+ "@babel/plugin-transform-runtime": "7.17.0",
85
+ "@babel/preset-env": "7.16.11",
86
86
  "@babel/preset-react": "7.16.7",
87
87
  "@types/chai": "4.3.0",
88
- "@types/jest": "27.4.0",
89
- "@types/mocha": "9.0.0",
90
- "@types/node": "17.0.7",
91
- "@types/sinon": "10.0.6",
92
- "@typescript-eslint/eslint-plugin": "5.8.1",
93
- "@typescript-eslint/eslint-plugin-tslint": "5.8.1",
94
- "@typescript-eslint/parser": "5.8.1",
88
+ "@types/jest": "27.4.1",
89
+ "@types/mocha": "9.1.0",
90
+ "@types/node": "17.0.21",
91
+ "@types/sinon": "10.0.11",
92
+ "@typescript-eslint/eslint-plugin": "5.15.0",
93
+ "@typescript-eslint/eslint-plugin-tslint": "5.15.0",
94
+ "@typescript-eslint/parser": "5.15.0",
95
95
  "arraybuffer-loader": "1.0.8",
96
96
  "babel-loader": "8.2.3",
97
- "chai": "4.3.4",
97
+ "chai": "4.3.6",
98
98
  "cheerio": "1.0.0-rc.10",
99
- "core-js": "3.20.2",
100
- "esbuild": "0.14.10",
101
- "eslint": "8.6.0",
99
+ "core-js": "3.21.1",
100
+ "esbuild": "0.14.27",
101
+ "eslint": "8.11.0",
102
102
  "eslint-plugin-import": "2.25.4",
103
- "eslint-plugin-jsdoc": "37.5.0",
104
- "eslint-plugin-react": "7.28.0",
103
+ "eslint-plugin-jsdoc": "38.0.4",
104
+ "eslint-plugin-react": "7.29.4",
105
105
  "esm": "3.2.25",
106
- "express": "4.17.2",
107
- "highlight.js": "11.3.1",
106
+ "express": "4.17.3",
107
+ "highlight.js": "11.5.0",
108
108
  "html-entities": "2.3.2",
109
- "istanbul-instrumenter-loader": "3.0.1",
110
- "jest": "27.4.5",
111
- "karma": "6.3.14",
112
- "karma-chrome-launcher": "3.1.0",
113
- "karma-coverage-istanbul-reporter": "3.0.3",
109
+ "jest": "27.5.1",
110
+ "karma": "6.3.17",
111
+ "karma-chrome-launcher": "3.1.1",
114
112
  "karma-firefox-launcher": "2.1.2",
115
113
  "karma-mocha": "2.0.1",
116
114
  "karma-webpack": "5.0.0",
117
- "markdown-it": "12.3.0",
118
- "mocha": "9.1.3",
115
+ "markdown-it": "12.3.2",
116
+ "mocha": "9.2.2",
119
117
  "mocha-loader": "5.1.5",
120
118
  "raw-loader": "4.0.2",
121
119
  "react": "17.0.2",
@@ -123,15 +121,15 @@
123
121
  "regenerator-runtime": "0.13.9",
124
122
  "rimraf": "3.0.2",
125
123
  "semver": "7.3.5",
126
- "sinon": "12.0.1",
127
- "terser-webpack-plugin": "5.3.0",
128
- "ts-jest": "27.1.2",
129
- "ts-loader": "9.2.6",
124
+ "sinon": "13.0.1",
125
+ "terser-webpack-plugin": "5.3.1",
126
+ "ts-jest": "27.1.3",
127
+ "ts-loader": "9.2.8",
130
128
  "tslint": "6.1.3",
131
- "typescript": "4.5.4",
132
- "webpack": "5.65.0",
129
+ "typescript": "4.6.2",
130
+ "webpack": "5.70.0",
133
131
  "webpack-bundle-analyzer": "4.5.0",
134
- "webpack-cli": "4.9.1"
132
+ "webpack-cli": "4.9.2"
135
133
  },
136
134
  "scripts-list": {
137
135
  "Build a demo page (e.g. to test a code change)": {
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export * from "../__BUILD_DIR__/experimental/index";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright 2015 CANAL+ Group
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export * from "../__BUILD_DIR__/experimental/index.js";
@@ -1,7 +1,7 @@
1
1
  sonar.projectKey=rx-player
2
2
  sonar.organization=rx-player
3
3
  sonar.projectName=rx-player
4
- sonar.projectVersion=3.26.3-dev.2022021400
4
+ sonar.projectVersion=3.27.0-dev.2022031700
5
5
  sonar.sources=./src,./demo,./tests
6
6
  sonar.exclusions=demo/full/bundle.js,demo/standalone/lib.js,demo/bundle.js
7
7
  sonar.host.url=https://sonarcloud.io
package/src/README.md CHANGED
@@ -33,12 +33,12 @@ To better understand the player's architecture, you can find below a
33
33
  Facilitate track V ~ | ~ Abstract the streaming ^ ~
34
34
  switching for +---------------+ | ~ protocol | ~
35
35
  the API | | | V | ~
36
- +--------------+ | | +--------------------------+ | ~
37
- | | | Init | ------> | | | ~
38
- | EMEManager | <------ | (./core/init) | <~~~~~~ | Manifest Fetcher | | ~
39
- | (./core/eme) | ~~~~~~> | | |(./core/fetchers/manifest)| | ~
40
- | | | | | | | ~
41
- +--------------+ +---------------+ +--------------------------+ | ~
36
+ +----------------+ | | +--------------------------+ | ~
37
+ | Content | | Init | ------> | | | ~
38
+ | Decryptor | <---- | (./core/init) | <~~~~~~ | Manifest Fetcher | | ~
39
+ |(./core/decrypt)| ~~~~> | | |(./core/fetchers/manifest)| | ~
40
+ | | | | | | | ~
41
+ +----------------+ +---------------+ +--------------------------+ | ~
42
42
  Negotiate content | ^ Initialize Load and refresh the Manifest | ~
43
43
  decryption | ~ playback and | ~
44
44
  | ~ create/connect | ~
@@ -40,27 +40,66 @@ describe("compat - shouldFavourSafariMediaKeys", () => {
40
40
  it("should return false if we are not on Safari", () => {
41
41
  jest.mock("../browser_detection", () => {
42
42
  return { __esModule: true as const,
43
- isSafari: false };
43
+ isSafariDesktop: false,
44
+ isSafariMobile: false };
44
45
  });
45
46
  const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
46
47
  expect(shouldFavourCustomSafariEME.default()).toBe(false);
47
48
  });
48
49
 
49
50
  /* eslint-disable max-len */
50
- it("should return false if we are on Safari but WekitMediaKeys is not available", () => {
51
+ it("should return false if we are on Safari Desktop but WekitMediaKeys is not available", () => {
51
52
  /* eslint-enable max-len */
52
53
 
53
54
  win.WebKitMediaKeys = undefined;
54
55
  jest.mock("../browser_detection", () => {
55
56
  return { __esModule: true as const,
56
- isSafari: true };
57
+ isSafariDesktop: true,
58
+ isSafariMobile: false };
57
59
  });
58
60
  const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
59
61
  expect(shouldFavourCustomSafariEME.default()).toBe(false);
60
62
  });
61
63
 
62
64
  /* eslint-disable max-len */
63
- it("should return true if we are on Safari and a WebKitMediaKeys implementation is available", () => {
65
+ it("should return false if we are on Safari Mobile but WekitMediaKeys is not available", () => {
66
+ /* eslint-enable max-len */
67
+
68
+ win.WebKitMediaKeys = undefined;
69
+ jest.mock("../browser_detection", () => {
70
+ return { __esModule: true as const,
71
+ isSafariDesktop: false,
72
+ isSafariMobile: true };
73
+ });
74
+ const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
75
+ expect(shouldFavourCustomSafariEME.default()).toBe(false);
76
+ });
77
+
78
+ /* eslint-disable max-len */
79
+ it("should return true if we are on Safari Desktop and a WebKitMediaKeys implementation is available", () => {
80
+ /* eslint-enable max-len */
81
+
82
+ win.WebKitMediaKeys = {
83
+ isTypeSupported: () => ({}),
84
+ prototype: {
85
+ createSession: () => ({}),
86
+ },
87
+ };
88
+ const proto = win.HTMLMediaElement.prototype as unknown as {
89
+ webkitSetMediaKeys : () => Record<string, never>;
90
+ };
91
+ proto.webkitSetMediaKeys = () => ({});
92
+ jest.mock("../browser_detection", () => {
93
+ return { __esModule: true as const,
94
+ isSafariDesktop: true,
95
+ isSafariMobile: false };
96
+ });
97
+ const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
98
+ expect(shouldFavourCustomSafariEME.default()).toBe(true);
99
+ });
100
+
101
+ /* eslint-disable max-len */
102
+ it("should return true if we are on Safari Mobile and a WebKitMediaKeys implementation is available", () => {
64
103
  /* eslint-enable max-len */
65
104
 
66
105
  win.WebKitMediaKeys = {
@@ -75,7 +114,8 @@ describe("compat - shouldFavourSafariMediaKeys", () => {
75
114
  proto.webkitSetMediaKeys = () => ({});
76
115
  jest.mock("../browser_detection", () => {
77
116
  return { __esModule: true as const,
78
- isSafari: true };
117
+ isSafariDesktop: false,
118
+ isSafariMobile: true };
79
119
  });
80
120
  const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
81
121
  expect(shouldFavourCustomSafariEME.default()).toBe(true);
@@ -54,13 +54,15 @@ interface ISafariWindowObject extends Window {
54
54
  safari? : { pushNotification? : { toString() : string } };
55
55
  }
56
56
 
57
- const isSafari : boolean =
57
+ /** `true` on Safari on a PC platform (i.e. not iPhone / iPad etc.) */
58
+ const isSafariDesktop : boolean =
58
59
  !isNode && (
59
60
  Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor") >= 0 ||
60
61
  (window as ISafariWindowObject).safari?.pushNotification?.toString() ===
61
62
  "[object SafariRemoteNotification]"
62
63
  );
63
64
 
65
+ /** `true` on Safari on an iPhone, iPad & iPod platform */
64
66
  const isSafariMobile : boolean = !isNode &&
65
67
  typeof navigator.platform === "string" &&
66
68
  /iPad|iPhone|iPod/.test(navigator.platform);
@@ -70,7 +72,7 @@ export {
70
72
  isIE11,
71
73
  isIEOrEdge,
72
74
  isFirefox,
73
- isSafari,
75
+ isSafariDesktop,
74
76
  isSafariMobile,
75
77
  isSamsungBrowser,
76
78
  isTizen,
@@ -14,65 +14,99 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- catchError,
19
- map,
20
- mergeMap,
21
- Observable,
22
- of as observableOf,
23
- race as observableRace,
24
- timer as observableTimer,
25
- } from "rxjs";
26
- import castToObservable from "../../utils/cast_to_observable";
17
+ import log from "../../log";
18
+ import cancellableSleep from "../../utils/cancellable_sleep";
19
+ import PPromise from "../../utils/promise";
20
+ import TaskCanceller, {
21
+ CancellationError,
22
+ } from "../../utils/task_canceller";
27
23
  import { ICustomMediaKeySession } from "./custom_media_keys";
28
24
 
29
25
  /**
30
- * Close session and returns and observable that emits when
31
- * the session is closed.
26
+ * Close the given `MediaKeySession` and returns a Promise resolving when the
27
+ * session is closed.
28
+ * This promise does not reject, even if we're unable to close the
29
+ * `MediaKeySession`.
30
+ *
31
+ * Note that there is a lot of browser issues linked to the impossibility to
32
+ * either close a MediaKeySession or to know if a MediaKeySession was closed.
33
+ * Due to this, the returned Promise might take some time before resolving on
34
+ * some devices.
32
35
  * @param {MediaKeySession|Object} session
33
- * @returns {Observable}
36
+ * @returns {Promise.<undefined>}
34
37
  */
35
- export default function closeSession$(
36
- session: MediaKeySession|ICustomMediaKeySession
37
- ): Observable<unknown> {
38
- return observableRace(
39
- castToObservable(session.close()),
40
- // If the session is not closed after 1000ms, try
41
- // to call another method on session to guess if
42
- // session is closed or not.
43
- observableTimer(1000).pipe(
44
- mergeMap(() => {
45
- const tryToUpdateSession$ = castToObservable(
46
- session.update(new Uint8Array(1))
47
- );
48
- return tryToUpdateSession$.pipe(
49
- // Update has resolved, so we can't know if session is closed
50
- map(() => { throw new Error("Compat: Couldn't know if session is " +
51
- "closed"); }),
52
- catchError((err : unknown) => {
53
- // The caught error can tell if session is closed
54
- // (Chrome may throw this error)
55
- if (err instanceof Error &&
56
- err.message === "The session is already closed."
57
- ) {
58
- return observableOf(null);
59
- }
60
- // The `closed` promise may resolve, even if `close()` result has not
61
- // (it may happen on Firefox). Wait for it and timeout after 1 second.
62
- // TODO There is a subtle TypeScript issue there that made casting to
63
- // a type-compatible type mandatory. If a more elegant solution can
64
- // be found, it should be preffered.
65
- const sessionIsClosed$ = castToObservable(session.closed as Promise<unknown>);
66
- return observableRace(
67
- sessionIsClosed$,
68
- observableTimer(1000).pipe(
69
- map(() => { throw new Error("Compat: Couldn't know if session is " +
70
- "closed"); })
71
- )
72
- );
73
- })
74
- );
75
- })
76
- )
77
- );
38
+ export default function closeSession(
39
+ session: MediaKeySession | ICustomMediaKeySession
40
+ ): Promise<void> {
41
+ const timeoutCanceller = new TaskCanceller();
42
+
43
+ return PPromise.race([
44
+ session.close()
45
+ .then(() => { timeoutCanceller.cancel(); }),
46
+ // The `closed` promise may resolve, even if `close()` result has not
47
+ // (seen at some point on Firefox).
48
+ session.closed
49
+ .then(() => { timeoutCanceller.cancel(); }),
50
+ waitTimeoutAndCheck(),
51
+ ]);
52
+
53
+ /**
54
+ * If the session is not closed after 1000ms, try to communicate with the
55
+ * MediaKeySession and check if an error is returned.
56
+ * This is needed because on some browsers with poor EME implementation,
57
+ * knowing when a MediaKeySession is closed is actually a hard task.
58
+ *
59
+ * The returned Promise will never reject.
60
+ * @returns {Promise.<undefined>}
61
+ */
62
+ async function waitTimeoutAndCheck() : Promise<void> {
63
+ try {
64
+ await cancellableSleep(1000, timeoutCanceller.signal);
65
+ await tryUpdatingSession();
66
+ } catch (err) {
67
+ if (err instanceof CancellationError) { // cancelled == session closed
68
+ return;
69
+ }
70
+ const message = err instanceof Error ?
71
+ err.message :
72
+ "Unknown error made it impossible to close the session";
73
+ log.error(`DRM: ${message}`);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Try to update `MediaKeySession` and check its error if it failed.
79
+ * If we still don't know whether it closed yet, wait a second
80
+ * timeout then quit.
81
+ *
82
+ * The returned Promise resolves if the `MediaKeySession` seems closed and
83
+ * rejects if we couldn't know or it doesn't.
84
+ * @returns {Promise.<undefined>}
85
+ */
86
+ async function tryUpdatingSession() : Promise<void> {
87
+ try {
88
+ await session.update(new Uint8Array(1));
89
+ } catch (err) {
90
+ if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
91
+ return;
92
+ }
93
+
94
+ // The caught error can tell if session is closed
95
+ // (Chrome may throw this error)
96
+ // I know... Checking the error message is not the best practice ever.
97
+ if (err instanceof Error &&
98
+ err.message === "The session is already closed."
99
+ ) {
100
+ return;
101
+ }
102
+
103
+ await cancellableSleep(1000, timeoutCanceller.signal);
104
+ }
105
+
106
+ if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
107
+ return;
108
+ }
109
+
110
+ throw new Error("Compat: Couldn't know if session is closed");
111
+ }
78
112
  }
@@ -14,15 +14,9 @@
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";
17
+ import PPromise from "pinkie";
23
18
  import { MediaError } from "../../../errors";
24
19
  import assert from "../../../utils/assert";
25
- import castToObservable from "../../../utils/cast_to_observable";
26
20
  import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
27
21
  import { isIE11 } from "../../browser_detection";
28
22
  import isNode from "../../is_node";
@@ -47,12 +41,18 @@ import { WebKitMediaKeysConstructor } from "./webkit_media_keys_constructor";
47
41
  /** Generic implementation of the navigator.requestMediaKeySystemAccess API. */
48
42
  type ICompatRequestMediaKeySystemAccessFn =
49
43
  (keyType : string, config : MediaKeySystemConfiguration[]) =>
50
- Observable<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
44
+ Promise<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
51
45
 
52
- let requestMediaKeySystemAccess : null | ICompatRequestMediaKeySystemAccessFn = null;
46
+ let requestMediaKeySystemAccess : ICompatRequestMediaKeySystemAccessFn | null = null;
53
47
 
54
- let _setMediaKeys :
55
- ((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => void) =
48
+ /**
49
+ * Set the given MediaKeys on the given HTMLMediaElement.
50
+ * Emits null when done then complete.
51
+ * @param {HTMLMediaElement} elt
52
+ * @param {Object} mediaKeys
53
+ */
54
+ let setMediaKeys :
55
+ ((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => unknown) =
56
56
  function defaultSetMediaKeys(
57
57
  mediaElement: HTMLMediaElement,
58
58
  mediaKeys: MediaKeys | ICustomMediaKeys | null
@@ -92,11 +92,8 @@ let _setMediaKeys :
92
92
  if (isNode ||
93
93
  (navigator.requestMediaKeySystemAccess != null && !shouldFavourCustomSafariEME())
94
94
  ) {
95
- requestMediaKeySystemAccess = (
96
- a : string,
97
- b : MediaKeySystemConfiguration[]
98
- ) : Observable<MediaKeySystemAccess> =>
99
- castToObservable(navigator.requestMediaKeySystemAccess(a, b));
95
+ requestMediaKeySystemAccess = (...args) =>
96
+ navigator.requestMediaKeySystemAccess(...args);
100
97
  } else {
101
98
  let isTypeSupported: (keyType: string) => boolean;
102
99
  let createCustomMediaKeys: (keyType: string) => ICustomMediaKeys;
@@ -106,23 +103,23 @@ if (isNode ||
106
103
  const callbacks = getOldKitWebKitMediaKeyCallbacks();
107
104
  isTypeSupported = callbacks.isTypeSupported;
108
105
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
109
- _setMediaKeys = callbacks.setMediaKeys;
106
+ setMediaKeys = callbacks.setMediaKeys;
110
107
  // This is for WebKit with prefixed EME api
111
108
  } else if (WebKitMediaKeysConstructor !== undefined) {
112
109
  const callbacks = getWebKitMediaKeysCallbacks();
113
110
  isTypeSupported = callbacks.isTypeSupported;
114
111
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
115
- _setMediaKeys = callbacks.setMediaKeys;
112
+ setMediaKeys = callbacks.setMediaKeys;
116
113
  } else if (isIE11 && MSMediaKeysConstructor !== undefined) {
117
114
  const callbacks = getIE11MediaKeysCallbacks();
118
115
  isTypeSupported = callbacks.isTypeSupported;
119
116
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
120
- _setMediaKeys = callbacks.setMediaKeys;
117
+ setMediaKeys = callbacks.setMediaKeys;
121
118
  } else if (MozMediaKeysConstructor !== undefined) {
122
119
  const callbacks = getMozMediaKeysCallbacks();
123
120
  isTypeSupported = callbacks.isTypeSupported;
124
121
  createCustomMediaKeys = callbacks.createCustomMediaKeys;
125
- _setMediaKeys = callbacks.setMediaKeys;
122
+ setMediaKeys = callbacks.setMediaKeys;
126
123
  } else {
127
124
  const MK = window.MediaKeys as unknown as typeof MediaKeys & {
128
125
  isTypeSupported? : (keyType : string) => boolean;
@@ -155,9 +152,9 @@ if (isNode ||
155
152
  requestMediaKeySystemAccess = function(
156
153
  keyType : string,
157
154
  keySystemConfigurations : MediaKeySystemConfiguration[]
158
- ) : Observable<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
155
+ ) : Promise<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
159
156
  if (!isTypeSupported(keyType)) {
160
- return observableThrow(() => new Error("Unsupported key type"));
157
+ return PPromise.reject(new Error("Unsupported key type"));
161
158
  }
162
159
 
163
160
  for (let i = 0; i < keySystemConfigurations.length; i++) {
@@ -188,7 +185,7 @@ if (isNode ||
188
185
 
189
186
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
190
187
  const customMediaKeys = createCustomMediaKeys(keyType);
191
- return observableOf(
188
+ return PPromise.resolve(
192
189
  new CustomMediaKeySystemAccess(keyType,
193
190
  customMediaKeys,
194
191
  keySystemConfigurationResponse)
@@ -196,24 +193,10 @@ if (isNode ||
196
193
  }
197
194
  }
198
195
 
199
- return observableThrow(() => new Error("Unsupported configuration"));
196
+ return PPromise.reject(new Error("Unsupported configuration"));
200
197
  };
201
198
  }
202
199
 
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
200
  export {
218
201
  requestMediaKeySystemAccess,
219
202
  setMediaKeys,