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
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,5 +13,4 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- declare const _default: PromiseConstructor;
17
- export default _default;
16
+ export * from "../dist/_esm5.processed/experimental/index";
@@ -13,6 +13,4 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import pinkie from "pinkie";
17
- export default typeof Promise === "function" ? Promise :
18
- pinkie;
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.2022032100",
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 .",
@@ -76,46 +76,43 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "next-tick": "1.1.0",
79
- "pinkie": "2.0.4",
80
79
  "rxjs": "7.4.0"
81
80
  },
82
81
  "devDependencies": {
83
- "@babel/core": "7.16.7",
84
- "@babel/plugin-transform-runtime": "7.16.7",
85
- "@babel/preset-env": "7.16.7",
82
+ "@babel/core": "7.17.7",
83
+ "@babel/plugin-transform-runtime": "7.17.0",
84
+ "@babel/preset-env": "7.16.11",
86
85
  "@babel/preset-react": "7.16.7",
87
86
  "@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",
87
+ "@types/jest": "27.4.1",
88
+ "@types/mocha": "9.1.0",
89
+ "@types/node": "17.0.21",
90
+ "@types/sinon": "10.0.11",
91
+ "@typescript-eslint/eslint-plugin": "5.15.0",
92
+ "@typescript-eslint/eslint-plugin-tslint": "5.15.0",
93
+ "@typescript-eslint/parser": "5.15.0",
95
94
  "arraybuffer-loader": "1.0.8",
96
95
  "babel-loader": "8.2.3",
97
- "chai": "4.3.4",
96
+ "chai": "4.3.6",
98
97
  "cheerio": "1.0.0-rc.10",
99
- "core-js": "3.20.2",
100
- "esbuild": "0.14.10",
101
- "eslint": "8.6.0",
98
+ "core-js": "3.21.1",
99
+ "esbuild": "0.14.27",
100
+ "eslint": "8.11.0",
102
101
  "eslint-plugin-import": "2.25.4",
103
- "eslint-plugin-jsdoc": "37.5.0",
104
- "eslint-plugin-react": "7.28.0",
102
+ "eslint-plugin-jsdoc": "38.0.4",
103
+ "eslint-plugin-react": "7.29.4",
105
104
  "esm": "3.2.25",
106
- "express": "4.17.2",
107
- "highlight.js": "11.3.1",
105
+ "express": "4.17.3",
106
+ "highlight.js": "11.5.0",
108
107
  "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",
108
+ "jest": "27.5.1",
109
+ "karma": "6.3.17",
110
+ "karma-chrome-launcher": "3.1.1",
114
111
  "karma-firefox-launcher": "2.1.2",
115
112
  "karma-mocha": "2.0.1",
116
113
  "karma-webpack": "5.0.0",
117
- "markdown-it": "12.3.0",
118
- "mocha": "9.1.3",
114
+ "markdown-it": "12.3.2",
115
+ "mocha": "9.2.2",
119
116
  "mocha-loader": "5.1.5",
120
117
  "raw-loader": "4.0.2",
121
118
  "react": "17.0.2",
@@ -123,15 +120,15 @@
123
120
  "regenerator-runtime": "0.13.9",
124
121
  "rimraf": "3.0.2",
125
122
  "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",
123
+ "sinon": "13.0.1",
124
+ "terser-webpack-plugin": "5.3.1",
125
+ "ts-jest": "27.1.3",
126
+ "ts-loader": "9.2.8",
130
127
  "tslint": "6.1.3",
131
- "typescript": "4.5.4",
132
- "webpack": "5.65.0",
128
+ "typescript": "4.6.2",
129
+ "webpack": "5.70.0",
133
130
  "webpack-bundle-analyzer": "4.5.0",
134
- "webpack-cli": "4.9.1"
131
+ "webpack-cli": "4.9.2"
135
132
  },
136
133
  "scripts-list": {
137
134
  "Build a demo page (e.g. to test a code change)": {
@@ -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
- declare module "pinkie" {
18
- export default Promise;
19
- }
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";
@@ -24,8 +24,8 @@ set -e
24
24
  version=$1
25
25
 
26
26
  sed -i.bak -e "s/\/\\* PLAYER_VERSION \\*\/\"\(.*\)\";/\/* PLAYER_VERSION *\/\"${version}\";/g" src/core/api/public_api.ts && rm src/core/api/public_api.ts.bak
27
- sed -i.bak -e "s/\"version\": \"[0-9]\+\.[0-9]\+\.[0-9]\+\(-\w\+[0-9]\)\?\"/\"version\": \"${version}\"/g" package.json && rm package.json.bak
28
- sed -i.bak -e "s/sonar\.projectVersion= *[0-9]\+\.[0-9]\+\.[0-9]\+/sonar.projectVersion=${version}/g" sonar-project.properties && rm sonar-project.properties.bak
27
+ sed -i.bak -e "s/\"version\":\s*\"[0-9]\+\.[0-9]\+\.[0-9]\+[^\"]*\"/\"version\": \"${version}\"/g" package.json && rm package.json.bak
28
+ sed -i.bak -e "s/sonar\.projectVersion= *.*/sonar.projectVersion=${version}/g" sonar-project.properties && rm sonar-project.properties.bak
29
29
  echo $version > VERSION
30
30
 
31
31
  npm install
@@ -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.2022032100
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 | ~
@@ -21,11 +21,9 @@
21
21
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
22
22
  /* eslint-disable @typescript-eslint/no-unsafe-return */
23
23
 
24
- import PPromise from "../../utils/promise";
25
-
26
24
  describe("compat - play", () => {
27
25
  it("should call play and returns an Observable if play returns a Promise", (done) => {
28
- const mockPlay = jest.fn(() => PPromise.resolve());
26
+ const mockPlay = jest.fn(() => Promise.resolve());
29
27
  const fakeMediaElement = { play: mockPlay };
30
28
 
31
29
  const play$ = require("../play").default;
@@ -48,7 +46,7 @@ describe("compat - play", () => {
48
46
  it("should throw through an Observable if the `play` promise is rejected", (done) => {
49
47
  const notAllowedError = new Error("NotAllowedError: Can't play");
50
48
  const mockPlay = jest.fn(() => {
51
- return PPromise.reject(notAllowedError);
49
+ return Promise.reject(notAllowedError);
52
50
  });
53
51
  const fakeMediaElement = { play: mockPlay };
54
52
 
@@ -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,98 @@
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 TaskCanceller, {
20
+ CancellationError,
21
+ } from "../../utils/task_canceller";
27
22
  import { ICustomMediaKeySession } from "./custom_media_keys";
28
23
 
29
24
  /**
30
- * Close session and returns and observable that emits when
31
- * the session is closed.
25
+ * Close the given `MediaKeySession` and returns a Promise resolving when the
26
+ * session is closed.
27
+ * This promise does not reject, even if we're unable to close the
28
+ * `MediaKeySession`.
29
+ *
30
+ * Note that there is a lot of browser issues linked to the impossibility to
31
+ * either close a MediaKeySession or to know if a MediaKeySession was closed.
32
+ * Due to this, the returned Promise might take some time before resolving on
33
+ * some devices.
32
34
  * @param {MediaKeySession|Object} session
33
- * @returns {Observable}
35
+ * @returns {Promise.<undefined>}
34
36
  */
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
- );
37
+ export default function closeSession(
38
+ session: MediaKeySession | ICustomMediaKeySession
39
+ ): Promise<void> {
40
+ const timeoutCanceller = new TaskCanceller();
41
+
42
+ return Promise.race([
43
+ session.close()
44
+ .then(() => { timeoutCanceller.cancel(); }),
45
+ // The `closed` promise may resolve, even if `close()` result has not
46
+ // (seen at some point on Firefox).
47
+ session.closed
48
+ .then(() => { timeoutCanceller.cancel(); }),
49
+ waitTimeoutAndCheck(),
50
+ ]);
51
+
52
+ /**
53
+ * If the session is not closed after 1000ms, try to communicate with the
54
+ * MediaKeySession and check if an error is returned.
55
+ * This is needed because on some browsers with poor EME implementation,
56
+ * knowing when a MediaKeySession is closed is actually a hard task.
57
+ *
58
+ * The returned Promise will never reject.
59
+ * @returns {Promise.<undefined>}
60
+ */
61
+ async function waitTimeoutAndCheck() : Promise<void> {
62
+ try {
63
+ await cancellableSleep(1000, timeoutCanceller.signal);
64
+ await tryUpdatingSession();
65
+ } catch (err) {
66
+ if (err instanceof CancellationError) { // cancelled == session closed
67
+ return;
68
+ }
69
+ const message = err instanceof Error ?
70
+ err.message :
71
+ "Unknown error made it impossible to close the session";
72
+ log.error(`DRM: ${message}`);
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Try to update `MediaKeySession` and check its error if it failed.
78
+ * If we still don't know whether it closed yet, wait a second
79
+ * timeout then quit.
80
+ *
81
+ * The returned Promise resolves if the `MediaKeySession` seems closed and
82
+ * rejects if we couldn't know or it doesn't.
83
+ * @returns {Promise.<undefined>}
84
+ */
85
+ async function tryUpdatingSession() : Promise<void> {
86
+ try {
87
+ await session.update(new Uint8Array(1));
88
+ } catch (err) {
89
+ if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
90
+ return;
91
+ }
92
+
93
+ // The caught error can tell if session is closed
94
+ // (Chrome may throw this error)
95
+ // I know... Checking the error message is not the best practice ever.
96
+ if (err instanceof Error &&
97
+ err.message === "The session is already closed."
98
+ ) {
99
+ return;
100
+ }
101
+
102
+ await cancellableSleep(1000, timeoutCanceller.signal);
103
+ }
104
+
105
+ if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
106
+ return;
107
+ }
108
+
109
+ throw new Error("Compat: Couldn't know if session is closed");
110
+ }
78
111
  }
@@ -13,7 +13,6 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import PPromise from "../../utils/promise";
17
16
  import { ICustomMediaKeys } from "./custom_media_keys";
18
17
 
19
18
  // MediaKeySystemAccess implementation
@@ -56,7 +55,7 @@ export default class CustomMediaKeySystemAccess implements ICustomMediaKeySystem
56
55
  * MediaKeySystemAccess. Never rejects.
57
56
  */
58
57
  public createMediaKeys() : Promise<ICustomMediaKeys|MediaKeys> {
59
- return new PPromise((res) => res(this._mediaKeys));
58
+ return new Promise((res) => res(this._mediaKeys));
60
59
  }
61
60
 
62
61
  /**
@@ -20,7 +20,6 @@ import {
20
20
  takeUntil,
21
21
  } from "rxjs";
22
22
  import EventEmitter from "../../../utils/event_emitter";
23
- import PPromise from "../../../utils/promise";
24
23
  import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
25
24
  import * as events from "../../event_listeners";
26
25
  import {
@@ -52,11 +51,11 @@ class IE11MediaKeySession
52
51
  this.keyStatuses = new Map();
53
52
  this._mk = mk;
54
53
  this._closeSession$ = new Subject();
55
- this.closed = new PPromise((resolve) => {
54
+ this.closed = new Promise((resolve) => {
56
55
  this._closeSession$.subscribe(resolve);
57
56
  });
58
57
  this.update = (license: Uint8Array) => {
59
- return new PPromise((resolve, reject) => {
58
+ return new Promise((resolve, reject) => {
60
59
  if (this._ss === undefined) {
61
60
  return reject("MediaKeySession not set.");
62
61
  }
@@ -74,7 +73,7 @@ class IE11MediaKeySession
74
73
  };
75
74
  }
76
75
  generateRequest(_initDataType: string, initData: BufferSource): Promise<void> {
77
- return new PPromise((resolve) => {
76
+ return new Promise((resolve) => {
78
77
  const initDataU8 =
79
78
  initData instanceof Uint8Array ? initData :
80
79
  initData instanceof ArrayBuffer ? new Uint8Array(initData) :
@@ -89,7 +88,7 @@ class IE11MediaKeySession
89
88
  });
90
89
  }
91
90
  close(): Promise<void> {
92
- return new PPromise((resolve) => {
91
+ return new Promise((resolve) => {
93
92
  if (this._ss != null) {
94
93
  this._ss.close();
95
94
  this._ss = undefined;
@@ -100,10 +99,10 @@ class IE11MediaKeySession
100
99
  });
101
100
  }
102
101
  load(): Promise<boolean> {
103
- return PPromise.resolve(false);
102
+ return Promise.resolve(false);
104
103
  }
105
104
  remove(): Promise<void> {
106
- return PPromise.resolve();
105
+ return Promise.resolve();
107
106
  }
108
107
  get sessionId(): string {
109
108
  return this._ss?.sessionId ?? "";