rx-player 4.0.0-beta.0 → 4.0.0-beta.2

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 (297) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +93 -0
  3. package/CONTRIBUTING.md +48 -168
  4. package/FILES.md +40 -92
  5. package/VERSION +1 -1
  6. package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
  7. package/dist/_esm5.processed/compat/browser_detection.js +85 -38
  8. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  9. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  10. package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
  11. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  12. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
  13. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
  14. package/dist/_esm5.processed/config.d.ts +4 -0
  15. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
  16. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
  17. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
  18. package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
  19. package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
  20. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
  21. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
  22. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  23. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  24. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  25. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  26. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  27. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  28. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  29. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  30. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
  32. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  33. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  34. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  35. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  36. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  37. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  38. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  39. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  40. package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
  41. package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
  42. package/dist/_esm5.processed/core/api/public_api.js +280 -60
  43. package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
  44. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
  45. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
  46. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
  47. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
  48. package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
  49. package/dist/_esm5.processed/core/api/utils.js +23 -3
  50. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
  51. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  52. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  53. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
  55. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
  56. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  57. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
  58. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
  59. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  60. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  61. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  62. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  63. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  64. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  65. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  66. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
  67. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
  68. package/dist/_esm5.processed/core/init/types.d.ts +9 -1
  69. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
  70. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
  71. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  72. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  73. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  74. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  75. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  76. package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
  77. package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
  78. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
  79. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
  80. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  81. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  82. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
  83. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
  84. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
  85. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
  86. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
  87. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
  88. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
  89. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  90. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  91. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
  92. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
  93. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
  94. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
  95. package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
  96. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
  97. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
  98. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
  99. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  100. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
  101. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
  102. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
  103. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
  104. package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
  105. package/dist/_esm5.processed/default_config.d.ts +41 -0
  106. package/dist/_esm5.processed/default_config.js +46 -2
  107. package/dist/_esm5.processed/errors/index.d.ts +2 -2
  108. package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
  109. package/dist/_esm5.processed/errors/media_error.js +18 -5
  110. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  111. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  112. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  113. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  114. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
  115. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
  116. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  117. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
  118. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
  119. package/dist/_esm5.processed/features/features_object.js +1 -0
  120. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  121. package/dist/_esm5.processed/features/types.d.ts +3 -0
  122. package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
  123. package/dist/_esm5.processed/manifest/adaptation.js +80 -1
  124. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  125. package/dist/_esm5.processed/manifest/period.js +2 -2
  126. package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
  127. package/dist/_esm5.processed/manifest/representation.js +32 -4
  128. package/dist/_esm5.processed/manifest/utils.js +1 -3
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  130. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
  134. package/dist/_esm5.processed/public_types.d.ts +13 -3
  135. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
  136. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  137. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  138. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  139. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  140. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  141. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
  142. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
  143. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  144. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  145. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  146. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  147. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  148. package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
  149. package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
  150. package/dist/_esm5.processed/utils/reference.js +6 -0
  151. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  152. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  153. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  154. package/dist/mpd-parser.wasm +0 -0
  155. package/dist/rx-player.js +5424 -4712
  156. package/dist/rx-player.min.js +1 -1
  157. package/jest.config.js +1 -5
  158. package/package.json +44 -40
  159. package/scripts/build/constants.d.ts +1 -0
  160. package/scripts/build/generate_build.js +1 -1
  161. package/scripts/fast_demo_build.js +40 -40
  162. package/scripts/generate_full_demo.js +1 -1
  163. package/sonar-project.properties +1 -1
  164. package/src/compat/browser_detection.ts +105 -52
  165. package/src/compat/can_reuse_media_keys.ts +5 -2
  166. package/src/compat/eme/close_session.ts +2 -2
  167. package/src/compat/eme/load_session.ts +1 -1
  168. package/src/compat/event_listeners.ts +1 -1
  169. package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
  170. package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
  171. package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
  172. package/src/core/adaptive/buffer_based_chooser.ts +144 -26
  173. package/src/core/adaptive/guess_based_chooser.ts +9 -8
  174. package/src/core/adaptive/network_analyzer.ts +9 -4
  175. package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
  176. package/src/core/api/debug/buffer_graph.ts +247 -0
  177. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  178. package/src/core/api/debug/constants.ts +2 -0
  179. package/src/core/api/debug/index.ts +3 -0
  180. package/src/core/api/debug/modules/general_info.ts +184 -0
  181. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  182. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  183. package/src/core/api/debug/render.ts +40 -0
  184. package/src/core/api/debug/utils.ts +103 -0
  185. package/src/core/api/playback_observer.ts +5 -2
  186. package/src/core/api/public_api.ts +334 -73
  187. package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
  188. package/src/core/api/track_management/track_dispatcher.ts +37 -14
  189. package/src/core/api/track_management/tracks_store.ts +77 -167
  190. package/src/core/api/utils.ts +29 -3
  191. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  192. package/src/core/decrypt/attach_media_keys.ts +1 -1
  193. package/src/core/decrypt/content_decryptor.ts +1 -1
  194. package/src/core/decrypt/find_key_system.ts +25 -11
  195. package/src/core/decrypt/session_events_listener.ts +45 -39
  196. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  197. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
  198. package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
  199. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  200. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  201. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  202. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  203. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  204. package/src/core/init/directfile_content_initializer.ts +2 -1
  205. package/src/core/init/media_source_content_initializer.ts +89 -50
  206. package/src/core/init/types.ts +9 -1
  207. package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
  208. package/src/core/init/utils/create_media_source.ts +4 -16
  209. package/src/core/init/utils/end_of_stream.ts +6 -3
  210. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  211. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  212. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  213. package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
  214. package/src/core/init/utils/rebuffering_controller.ts +115 -4
  215. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  216. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  217. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
  218. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
  219. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
  220. package/src/core/segment_buffers/implementations/types.ts +16 -4
  221. package/src/core/segment_buffers/index.ts +2 -0
  222. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  223. package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
  224. package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
  225. package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
  226. package/src/core/stream/period/period_stream.ts +13 -11
  227. package/src/core/stream/representation/representation_stream.ts +49 -37
  228. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
  229. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  230. package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
  231. package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
  232. package/src/core/stream/utils/create_reload_request.ts +1 -1
  233. package/src/default_config.ts +59 -11
  234. package/src/errors/__tests__/media_error.test.ts +6 -6
  235. package/src/errors/index.ts +4 -1
  236. package/src/errors/media_error.ts +67 -1
  237. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  238. package/src/experimental/features/debug_element.ts +13 -0
  239. package/src/experimental/features/index.ts +1 -0
  240. package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
  241. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  242. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
  243. package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
  244. package/src/features/__tests__/initialize_features.test.ts +11 -0
  245. package/src/features/features_object.ts +1 -0
  246. package/src/features/initialize_features.ts +15 -10
  247. package/src/features/types.ts +9 -0
  248. package/src/manifest/__tests__/manifest.test.ts +7 -7
  249. package/src/manifest/__tests__/period.test.ts +90 -45
  250. package/src/manifest/adaptation.ts +96 -1
  251. package/src/manifest/manifest.ts +4 -0
  252. package/src/manifest/period.ts +4 -2
  253. package/src/manifest/representation.ts +77 -5
  254. package/src/manifest/utils.ts +1 -3
  255. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  256. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  257. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
  258. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
  259. package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
  260. package/src/public_types.ts +16 -1
  261. package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
  262. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  263. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  264. package/src/transports/dash/manifest_parser.ts +1 -1
  265. package/src/transports/dash/segment_loader.ts +4 -4
  266. package/src/transports/local/segment_loader.ts +14 -30
  267. package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
  268. package/src/transports/smooth/segment_loader.ts +4 -4
  269. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  270. package/src/typings/globals.d.ts +21 -19
  271. package/src/utils/cancellable_sleep.ts +5 -14
  272. package/src/utils/create_cancellable_promise.ts +69 -0
  273. package/src/utils/is_null_or_undefined.ts +1 -1
  274. package/src/utils/reference.ts +6 -0
  275. package/src/utils/request/xhr.ts +1 -1
  276. package/src/utils/task_canceller.ts +63 -34
  277. package/tsconfig.json +1 -1
  278. package/tsconfig.modules.json +1 -1
  279. package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
  280. package/locked_reps.js +0 -46
  281. package/scripts/doc-generator/construct_table_of_contents.js +0 -76
  282. package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
  283. package/scripts/doc-generator/create_documentation.js +0 -331
  284. package/scripts/doc-generator/create_documentation_page.js +0 -209
  285. package/scripts/doc-generator/create_page.js +0 -210
  286. package/scripts/doc-generator/generate_header_html.js +0 -147
  287. package/scripts/doc-generator/generate_page_html.js +0 -115
  288. package/scripts/doc-generator/generate_page_list_html.js +0 -92
  289. package/scripts/doc-generator/generate_sidebar_html.js +0 -85
  290. package/scripts/doc-generator/get_search_data_for_content.js +0 -137
  291. package/scripts/doc-generator/index.js +0 -34
  292. package/scripts/doc-generator/parse_doc_configs.js +0 -327
  293. package/scripts/doc-generator/scripts/lunr.js +0 -10
  294. package/scripts/doc-generator/scripts/script.js +0 -451
  295. package/scripts/doc-generator/styles/code.css +0 -99
  296. package/scripts/doc-generator/styles/style.css +0 -835
  297. package/scripts/doc-generator/utils.js +0 -74
package/jest.config.js CHANGED
@@ -6,11 +6,6 @@ module.exports = {
6
6
  roots: ["<rootDir>/src"],
7
7
  preset: "ts-jest",
8
8
  testEnvironment: "jsdom",
9
- // Without this, Jest just fails when importing rxjs, for some arcane
10
- // ESM-vs-CommonJS reasons linked to how it works internally.
11
- moduleNameMapper: {
12
- "^rxjs$": require.resolve("rxjs"),
13
- },
14
9
  testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"],
15
10
  collectCoverageFrom: [
16
11
  "src/**/*.ts",
@@ -59,6 +54,7 @@ module.exports = {
59
54
  HTML_VTT: 1,
60
55
  LOCAL_MANIFEST: 1,
61
56
  METAPLAYLIST: 1,
57
+ DEBUG_ELEMENT: 1,
62
58
  NATIVE_SAMI: 1,
63
59
  NATIVE_SRT: 1,
64
60
  NATIVE_TTML: 1,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rx-player",
3
3
  "author": "Canal+",
4
- "version": "4.0.0-beta.0",
4
+ "version": "4.0.0-beta.2",
5
5
  "description": "Canal+ HTML5 Video Player",
6
6
  "main": "./dist/rx-player.js",
7
7
  "keywords": [
@@ -12,8 +12,6 @@
12
12
  "mediasource",
13
13
  "mse",
14
14
  "reactive",
15
- "rx",
16
- "rxjs",
17
15
  "smooth",
18
16
  "streaming",
19
17
  "typescript",
@@ -42,12 +40,14 @@
42
40
  "check:appveyor": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test:appveyor",
43
41
  "check:types": "tsc --noEmit --project .",
44
42
  "check:types:watch": "tsc --noEmit --watch --project .",
43
+ "check:demo": "npm run check:demo:types && npm run lint:demo",
44
+ "check:demo:types": "tsc --noEmit --project demo/full",
45
45
  "demo": "node ./scripts/generate_full_demo.js --production-mode",
46
46
  "demo:min": "node ./scripts/generate_full_demo.js --production-mode --minify",
47
47
  "demo:watch": "node ./scripts/generate_full_demo.js --watch --production-mode",
48
- "doc": "rm -rf doc/generated; node ./scripts/doc-generator/index.js doc/ doc/generated \"$(cat VERSION)\"",
48
+ "doc": "docgen.ico doc/ doc/generated \"$(cat VERSION)\"",
49
49
  "lint": "eslint src -c .eslintrc.js",
50
- "lint:demo": "eslint demo/full/scripts",
50
+ "lint:demo": "eslint -c demo/full/.eslintrc.js demo/full/scripts",
51
51
  "lint:tests": "eslint tests/**/*.js --ignore-pattern '/tests/performance/bundle*'",
52
52
  "list": "node scripts/list-npm-scripts.js",
53
53
  "prepublishOnly": "npm run build:modular",
@@ -80,58 +80,59 @@
80
80
  "next-tick": "1.1.0"
81
81
  },
82
82
  "devDependencies": {
83
- "@babel/core": "7.20.12",
84
- "@babel/plugin-transform-runtime": "7.19.6",
85
- "@babel/preset-env": "7.20.2",
86
- "@babel/preset-react": "7.18.6",
87
- "@types/chai": "4.3.4",
88
- "@types/jest": "29.4.0",
83
+ "@babel/core": "7.22.5",
84
+ "@babel/plugin-transform-runtime": "7.22.5",
85
+ "@babel/preset-env": "7.22.5",
86
+ "@babel/preset-react": "7.22.5",
87
+ "@types/chai": "4.3.5",
88
+ "@types/jest": "29.5.2",
89
89
  "@types/mocha": "10.0.1",
90
- "@types/node": "18.11.18",
91
- "@types/sinon": "10.0.13",
92
- "@typescript-eslint/eslint-plugin": "5.49.0",
93
- "@typescript-eslint/eslint-plugin-tslint": "5.49.0",
94
- "@typescript-eslint/parser": "5.49.0",
90
+ "@types/node": "20.3.1",
91
+ "@types/react": "18.2.12",
92
+ "@types/react-dom": "18.2.5",
93
+ "@types/sinon": "10.0.15",
94
+ "@typescript-eslint/eslint-plugin": "5.59.11",
95
+ "@typescript-eslint/eslint-plugin-tslint": "5.59.11",
96
+ "@typescript-eslint/parser": "5.59.11",
95
97
  "arraybuffer-loader": "1.0.8",
96
98
  "babel-loader": "9.1.2",
97
99
  "chai": "4.3.7",
98
- "cheerio": "1.0.0-rc.12",
99
- "core-js": "3.27.2",
100
- "esbuild": "0.17.4",
101
- "eslint": "8.32.0",
100
+ "core-js": "3.31.0",
101
+ "docgen.ico": "^0.2.3",
102
+ "esbuild": "0.18.2",
103
+ "eslint": "8.42.0",
104
+ "eslint-plugin-ban": "1.6.0",
102
105
  "eslint-plugin-import": "2.27.5",
103
- "eslint-plugin-jsdoc": "39.6.9",
104
- "eslint-plugin-react": "7.32.1",
106
+ "eslint-plugin-jsdoc": "46.2.6",
107
+ "eslint-plugin-react": "7.32.2",
105
108
  "esm": "3.2.25",
106
109
  "express": "4.18.2",
107
- "highlight.js": "11.7.0",
108
- "html-entities": "2.3.3",
109
- "jest": "29.4.1",
110
- "jest-environment-jsdom": "29.4.1",
111
- "karma": "6.4.1",
112
- "karma-chrome-launcher": "3.1.1",
110
+ "github-buttons": "2.27.0",
111
+ "html-entities": "2.3.6",
112
+ "jest": "29.5.0",
113
+ "jest-environment-jsdom": "29.5.0",
114
+ "karma": "6.4.2",
115
+ "karma-chrome-launcher": "3.2.0",
113
116
  "karma-firefox-launcher": "2.1.2",
114
117
  "karma-mocha": "2.0.1",
115
118
  "karma-webpack": "5.0.0",
116
- "markdown-it": "13.0.1",
117
119
  "mocha": "10.2.0",
118
120
  "mocha-loader": "5.1.5",
119
121
  "raw-loader": "4.0.2",
120
122
  "react": "18.2.0",
121
123
  "react-dom": "18.2.0",
122
124
  "regenerator-runtime": "0.13.11",
123
- "rimraf": "4.1.2",
124
- "rxjs": "7.8.0",
125
- "semver": "7.3.8",
126
- "sinon": "15.0.1",
127
- "terser-webpack-plugin": "5.3.6",
128
- "ts-jest": "29.0.5",
129
- "ts-loader": "9.4.2",
125
+ "rimraf": "5.0.1",
126
+ "semver": "7.5.1",
127
+ "sinon": "15.1.2",
128
+ "terser-webpack-plugin": "5.3.9",
129
+ "ts-jest": "29.1.0",
130
+ "ts-loader": "9.4.3",
130
131
  "tslint": "6.1.3",
131
- "typescript": "4.9.4",
132
- "webpack": "5.75.0",
133
- "webpack-bundle-analyzer": "4.7.0",
134
- "webpack-cli": "5.0.1"
132
+ "typescript": "5.1.3",
133
+ "webpack": "5.86.0",
134
+ "webpack-bundle-analyzer": "4.9.0",
135
+ "webpack-cli": "5.1.4"
135
136
  },
136
137
  "scripts-list": {
137
138
  "Build a demo page (e.g. to test a code change)": {
@@ -142,6 +143,9 @@
142
143
  "demo": "Build the demo in demo/bundle.js",
143
144
  "demo:min": "Build the demo and minify it in demo/bundle.js",
144
145
  "demo:watch": "Build the demo in demo/bundle.js each times the files update.",
146
+ "check:demo": "Check the validity of the full demo directory by running the type checker and linter on it",
147
+ "check:demo:types": "Check TypeScript types in full demo files",
148
+ "lint:demo": "Run linter on the full demo files",
145
149
  "standalone": "Build and launch the \"standalone\" demo (without any UI) on a local server. Re-build on file updates.",
146
150
  "certificate": "Generate a certificate to be able to use HTTPS locally for the demo pages (`npm run start` and `npm run standalone` will then listen to HTTPS requests through a communicated port)"
147
151
  },
@@ -42,6 +42,7 @@ declare const enum __FEATURES__ {
42
42
  HTML_VTT = IS_DISABLED,
43
43
  LOCAL_MANIFEST = IS_DISABLED,
44
44
  METAPLAYLIST = IS_DISABLED,
45
+ DEBUG_ELEMENT = IS_DISABLED,
45
46
  NATIVE_SAMI = IS_DISABLED,
46
47
  NATIVE_SRT = IS_DISABLED,
47
48
  NATIVE_TTML = IS_DISABLED,
@@ -22,7 +22,7 @@ const { spawn } = require("child_process");
22
22
  const fs = require("fs/promises");
23
23
  const os = require("os");
24
24
  const path = require("path");
25
- const rimraf = require("rimraf");
25
+ const { rimraf } = require("rimraf");
26
26
 
27
27
  const BUILD_DIR_FROM_ROOT = "dist/_esm5.processed";
28
28
 
@@ -52,34 +52,40 @@ function fastDemoBuild(options) {
52
52
  const watch = !!options.watch;
53
53
  const isDevMode = !options.production;
54
54
  const includeWasmParser = !!options.includeWasmParser;
55
- let beforeTime = process.hrtime.bigint();
56
55
 
57
- esbuild.build({
58
- entryPoints: [path.join(__dirname, "../demo/full/scripts/index.jsx")],
56
+ /** Declare a plugin to anounce when a build begins and ends */
57
+ const consolePlugin = {
58
+ name: "onEnd",
59
+ setup(build) {
60
+ build.onStart(() => {
61
+ console.log(`\x1b[33m[${getHumanReadableHours()}]\x1b[0m ` +
62
+ "New demo build started");
63
+ })
64
+ build.onEnd(result => {
65
+ if (result.errors.length > 0 || result.warnings.length > 0) {
66
+ const { errors, warnings } = result;
67
+ console.log(`\x1b[33m[${getHumanReadableHours()}]\x1b[0m ` +
68
+ `Demo re-built with ${errors.length} error(s) and ` +
69
+ ` ${warnings.length} warning(s) `);
70
+ return;
71
+ }
72
+ console.log(`\x1b[32m[${getHumanReadableHours()}]\x1b[0m ` +
73
+ "Demo built!");
74
+ });
75
+ },
76
+ };
77
+
78
+ // Create a context for incremental builds
79
+ esbuild.context({
80
+ entryPoints: [path.join(__dirname, "../demo/full/scripts/index.tsx")],
59
81
  bundle: true,
82
+ target: "es2017",
60
83
  minify,
61
84
  outfile: path.join(__dirname, "../demo/full/bundle.js"),
62
- watch: !watch ? undefined : {
63
- onRebuild(error, result) {
64
- if (error) {
65
- console.error(`\x1b[31m[${getHumanReadableHours()}]\x1b[0m Demo re-build failed:`,
66
- err);
67
- } else {
68
- if (result.errors > 0 || result.warnings > 0) {
69
- const { errors, warnings } = result;
70
- console.log(`\x1b[33m[${getHumanReadableHours()}]\x1b[0m ` +
71
- `Demo re-built with ${errors.length} error(s) and ` +
72
- ` ${warnings.length} warning(s) ` +
73
- `(in ${stats.endTime - stats.startTime} ms).`);
74
- }
75
- console.log(`\x1b[32m[${getHumanReadableHours()}]\x1b[0m ` +
76
- "Demo re-built!");
77
- }
78
- },
79
- },
85
+ plugins: [consolePlugin],
80
86
  define: {
81
87
  "process.env.NODE_ENV": JSON.stringify(isDevMode ? "development" : "production"),
82
- __INCLUDE_WASM_PARSER__: includeWasmParser,
88
+ __INCLUDE_WASM_PARSER__: JSON.stringify(includeWasmParser),
83
89
  __ENVIRONMENT__: JSON.stringify({
84
90
  PRODUCTION: 0,
85
91
  DEV: 1,
@@ -89,24 +95,18 @@ function fastDemoBuild(options) {
89
95
  CURRENT_LEVEL: "INFO",
90
96
  }),
91
97
  }
92
- }).then(
93
- (result) => {
94
- if (result.errors > 0 || result.warnings > 0) {
95
- const { errors, warnings } = result;
96
- console.log(`\x1b[33m[${getHumanReadableHours()}]\x1b[0m ` +
97
- `Demo built with ${errors.length} error(s) and ` +
98
- ` ${warnings.length} warning(s) ` +
99
- `(in ${stats.endTime - stats.startTime} ms).`);
100
- }
101
- const fullTime = (process.hrtime.bigint() - beforeTime) / 1000000n;
102
- console.log(`\x1b[32m[${getHumanReadableHours()}]\x1b[0m ` +
103
- `Build done in ${fullTime}ms`);
104
- },
105
- (err) => {
106
- console.error(`\x1b[31m[${getHumanReadableHours()}]\x1b[0m Demo build failed:`,
107
- err);
108
- process.exit(1);
109
- });
98
+ })
99
+ .then((context) => {
100
+ if (watch) {
101
+ return context.watch();
102
+ }
103
+ })
104
+ .catch((err) => {
105
+ console.error(
106
+ `\x1b[31m[${getHumanReadableHours()}]\x1b[0m Demo build failed:`,
107
+ err);
108
+ process.exit(1);
109
+ });
110
110
  }
111
111
 
112
112
  /**
@@ -60,7 +60,7 @@ function generateFullDemo(options) {
60
60
 
61
61
  const webpackDemoConfig = {
62
62
  mode: isDevMode ? "development" : "production",
63
- entry: path.join(__dirname, "../demo/full/scripts/index.jsx"),
63
+ entry: path.join(__dirname, "../demo/full/scripts/index.tsx"),
64
64
  resolve: {
65
65
  extensions: [".ts", ".tsx", ".js", ".jsx", ".json"],
66
66
  },
@@ -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=4.0.0-beta.0
4
+ sonar.projectVersion=4.0.0-beta.2
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
@@ -24,71 +24,124 @@ interface IIE11Document extends Document {
24
24
  documentMode? : unknown;
25
25
  }
26
26
 
27
- // true on IE11
28
- // false on Edge and other IEs/browsers.
29
- const isIE11 : boolean =
30
- !isNode &&
31
- typeof (window as IIE11WindowObject).MSInputMethodContext !== "undefined" &&
32
- typeof (document as IIE11Document).documentMode !== "undefined";
33
-
34
- // true for IE / Edge
35
- const isIEOrEdge : boolean = isNode ?
36
- false :
37
- navigator.appName === "Microsoft Internet Explorer" ||
38
- navigator.appName === "Netscape" &&
39
- /(Trident|Edge)\//.test(navigator.userAgent);
40
-
41
- const isEdgeChromium: boolean = !isNode &&
42
- navigator.userAgent.toLowerCase().indexOf("edg/") !== -1;
43
-
44
- const isFirefox : boolean = !isNode &&
45
- navigator.userAgent.toLowerCase().indexOf("firefox") !== -1;
46
-
47
- const isSamsungBrowser : boolean = !isNode &&
48
- /SamsungBrowser/.test(navigator.userAgent);
49
-
50
- const isTizen : boolean = !isNode &&
51
- /Tizen/.test(navigator.userAgent);
52
-
53
- const isWebOs : boolean = !isNode &&
54
- navigator.userAgent.indexOf("Web0S") >= 0;
55
-
56
- // Inspired form: http://webostv.developer.lge.com/discover/specifications/web-engine/
57
- // Note: even that page doesn't correspond to what we've actually seen in the
58
- // wild
59
- const isWebOs2021 : boolean = isWebOs &&
60
- (
61
- /[Ww]eb[O0]S.TV-2021/.test(navigator.userAgent) ||
62
- /[Cc]hr[o0]me\/79/.test(navigator.userAgent)
63
- );
64
- const isWebOs2022 : boolean = isWebOs &&
65
- (
66
- /[Ww]eb[O0]S.TV-2022/.test(navigator.userAgent) ||
67
- /[Cc]hr[o0]me\/87/.test(navigator.userAgent)
68
- );
27
+ /** Edge Chromium, regardless of the device */
28
+ let isEdgeChromium = false;
69
29
 
70
- interface ISafariWindowObject extends Window {
71
- safari? : { pushNotification? : { toString() : string } };
72
- }
30
+ /** IE11, regardless of the device */
31
+ let isIE11 = false;
32
+
33
+ /** IE11 or Edge __Legacy__ (not Edge Chromium), regardless of the device */
34
+ let isIEOrEdge = false;
35
+
36
+ /** Firefox, regardless of the device */
37
+ let isFirefox = false;
73
38
 
74
39
  /** `true` on Safari on a PC platform (i.e. not iPhone / iPad etc.) */
75
- const isSafariDesktop : boolean =
76
- !isNode && (
40
+ let isSafariDesktop = false;
41
+
42
+ /** `true` on Safari on an iPhone, iPad & iPod platform */
43
+ let isSafariMobile = false;
44
+
45
+ /** Samsung's own browser application */
46
+ let isSamsungBrowser = false;
47
+
48
+ /** `true` on devices where Tizen is the OS (e.g. Samsung TVs). */
49
+ let isTizen = false;
50
+
51
+ /** `true` on devices where WebOS is the OS (e.g. LG TVs). */
52
+ let isWebOs = false;
53
+
54
+ /** `true` specifically for WebOS 2021 version. */
55
+ let isWebOs2021 = false;
56
+
57
+ /** `true` specifically for WebOS 2022 version. */
58
+ let isWebOs2022 = false;
59
+
60
+ /** `true` for Panasonic devices. */
61
+ let isPanasonic = false;
62
+
63
+ /** `true` for the PlayStation 5 game console. */
64
+ let isPlayStation5 = false;
65
+
66
+ ((function findCurrentBrowser() : void {
67
+ if (isNode) {
68
+ return ;
69
+ }
70
+
71
+ // 1 - Find out browser between IE/Edge Legacy/Edge Chromium/Firefox/Safari
72
+
73
+ if (typeof (window as IIE11WindowObject).MSInputMethodContext !== "undefined" &&
74
+ typeof (document as IIE11Document).documentMode !== "undefined")
75
+ {
76
+ isIE11 = true;
77
+ isIEOrEdge = true;
78
+ } else if (
79
+ navigator.appName === "Microsoft Internet Explorer" ||
80
+ navigator.appName === "Netscape" &&
81
+ /(Trident|Edge)\//.test(navigator.userAgent)
82
+ ) {
83
+ isIEOrEdge = true;
84
+ } else if (navigator.userAgent.toLowerCase().indexOf("edg/") !== -1) {
85
+ isEdgeChromium = true;
86
+ } else if (navigator.userAgent.toLowerCase().indexOf("firefox") !== -1) {
87
+ isFirefox = true;
88
+ } else if (typeof navigator.platform === "string" &&
89
+ /iPad|iPhone|iPod/.test(navigator.platform))
90
+ {
91
+ isSafariMobile = true;
92
+ } else if (
77
93
  Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor") >= 0 ||
78
94
  (window as ISafariWindowObject).safari?.pushNotification?.toString() ===
79
95
  "[object SafariRemoteNotification]"
80
- );
96
+ ) {
97
+ isSafariDesktop = true;
98
+ }
81
99
 
82
- /** `true` on Safari on an iPhone, iPad & iPod platform */
83
- const isSafariMobile : boolean = !isNode &&
84
- typeof navigator.platform === "string" &&
85
- /iPad|iPhone|iPod/.test(navigator.platform);
100
+ // 2 - Find out specific device/platform information
101
+
102
+ // Samsung browser e.g. on Android
103
+ if (/SamsungBrowser/.test(navigator.userAgent)) {
104
+ isSamsungBrowser = true;
105
+ }
106
+
107
+ if (navigator.userAgent.indexOf("PlayStation 5") !== -1) {
108
+ isPlayStation5 = true;
109
+ } else if (/Tizen/.test(navigator.userAgent)) {
110
+ isTizen = true;
111
+
112
+ // Inspired form: http://webostv.developer.lge.com/discover/specifications/web-engine/
113
+ // Note: even that page doesn't correspond to what we've actually seen in the
114
+ // wild
115
+ } else if (/[Ww]eb[O0]S/.test(navigator.userAgent)) {
116
+ isWebOs = true;
117
+
118
+ if (
119
+ /[Ww]eb[O0]S.TV-2022/.test(navigator.userAgent) ||
120
+ /[Cc]hr[o0]me\/87/.test(navigator.userAgent)
121
+ ) {
122
+ isWebOs2022 = true;
123
+ } else if (
124
+ /[Ww]eb[O0]S.TV-2021/.test(navigator.userAgent) ||
125
+ /[Cc]hr[o0]me\/79/.test(navigator.userAgent)
126
+ ) {
127
+ isWebOs2021 = true;
128
+ }
129
+ } else if (/[Pp]anasonic/.test(navigator.userAgent)) {
130
+ isPanasonic = true;
131
+ }
132
+ })());
133
+
134
+ interface ISafariWindowObject extends Window {
135
+ safari? : { pushNotification? : { toString() : string } };
136
+ }
86
137
 
87
138
  export {
88
139
  isEdgeChromium,
89
140
  isIE11,
90
141
  isIEOrEdge,
91
142
  isFirefox,
143
+ isPanasonic,
144
+ isPlayStation5,
92
145
  isSafariDesktop,
93
146
  isSafariMobile,
94
147
  isSamsungBrowser,
@@ -1,4 +1,7 @@
1
- import { isWebOs } from "./browser_detection";
1
+ import {
2
+ isPanasonic,
3
+ isWebOs,
4
+ } from "./browser_detection";
2
5
 
3
6
  /**
4
7
  * Returns `true` if a `MediaKeys` instance (the `Encrypted Media Extension`
@@ -13,5 +16,5 @@ import { isWebOs } from "./browser_detection";
13
16
  * @returns {boolean}
14
17
  */
15
18
  export default function canReuseMediaKeys() : boolean {
16
- return !isWebOs;
19
+ return !isWebOs && !isPanasonic;
17
20
  }
@@ -86,7 +86,7 @@ export default function closeSession(
86
86
  try {
87
87
  await session.update(new Uint8Array(1));
88
88
  } catch (err) {
89
- if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
89
+ if (timeoutCanceller.isUsed()) { // Reminder: cancelled == session closed
90
90
  return;
91
91
  }
92
92
 
@@ -102,7 +102,7 @@ export default function closeSession(
102
102
  await cancellableSleep(1000, timeoutCanceller.signal);
103
103
  }
104
104
 
105
- if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
105
+ if (timeoutCanceller.isUsed()) { // Reminder: cancelled == session closed
106
106
  return;
107
107
  }
108
108
 
@@ -36,7 +36,7 @@ export default async function loadSession(
36
36
  session : MediaKeySession | ICustomMediaKeySession,
37
37
  sessionId : string
38
38
  ) : Promise<boolean> {
39
- log.info("Compat/DRM: Load persisted session", sessionId);
39
+ log.info("DRM: Load persisted session", sessionId);
40
40
  const isLoaded = await session.load(sessionId);
41
41
 
42
42
  if (!isLoaded || session.keyStatuses.size > 0) {
@@ -119,7 +119,7 @@ function createCompatibleEventListener(
119
119
  listener: (event? : unknown) => void,
120
120
  cancelSignal: CancellationSignal
121
121
  ) => {
122
- if (cancelSignal.isCancelled) {
122
+ if (cancelSignal.isCancelled()) {
123
123
  return;
124
124
  }
125
125
 
@@ -0,0 +1,27 @@
1
+ import { isPlayStation5 } from "./browser_detection";
2
+
3
+ /**
4
+ * Some platforms have issues when the `MediaSource`'s `duration` property
5
+ * is set to a very high value (playback freezes) but not when setting it
6
+ * to `Infinity`, which is what the HTML spec as of now (2023-05-15) recommends
7
+ * for live contents.
8
+ *
9
+ * However setting the `MediaSource`'s `duration` property to `Infinity` seems
10
+ * more risky, considering all platforms we now support, than setting it at a
11
+ * relatively high ~2**32 value which is what we do generally.
12
+ *
13
+ * Moreover, setting it to `Infinity` require us to use another MSE API,
14
+ * `setLiveSeekableRange` to properly allow seeking. We're used to MSE issues so
15
+ * I'm not too confident of using another MSE API for all platforms directly.
16
+ *
17
+ * So this methods just return `true` based on a whitelist of platform for which
18
+ * it has been detected that high `duration` values cause issues but setting it
19
+ * to Infinity AND playing with `setLiveSeekableRange` does not.
20
+ *
21
+ * @returns {boolean}
22
+ */
23
+ export default function hasIssuesWithHighMediaSourceDuration(): boolean {
24
+ // For now only seen on the Webkit present in the PlayStation 5, for which the
25
+ // alternative is known to work.
26
+ return isPlayStation5;
27
+ }