rx-player 4.0.0-dev.2023111400 → 4.0.0-dev.2023120600

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 (407) hide show
  1. package/CHANGELOG.md +11 -227
  2. package/FILES.md +1 -1
  3. package/VERSION +1 -1
  4. package/dist/_esm5.processed/compat/add_text_track.d.ts +1 -3
  5. package/dist/_esm5.processed/compat/add_text_track.js +4 -7
  6. package/dist/_esm5.processed/compat/browser_compatibility_types.d.ts +0 -7
  7. package/dist/_esm5.processed/compat/event_listeners.d.ts +2 -15
  8. package/dist/_esm5.processed/compat/event_listeners.js +2 -37
  9. package/dist/_esm5.processed/compat/index.d.ts +1 -3
  10. package/dist/_esm5.processed/compat/index.js +1 -3
  11. package/dist/_esm5.processed/config.d.ts +9 -21
  12. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +0 -58
  13. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +14 -54
  14. package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.d.ts +2 -8
  15. package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.js +2 -11
  16. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +2 -6
  17. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +13 -32
  18. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +3 -3
  19. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +1 -1
  20. package/dist/_esm5.processed/core/api/option_utils.d.ts +12 -35
  21. package/dist/_esm5.processed/core/api/option_utils.js +41 -230
  22. package/dist/_esm5.processed/core/api/public_api.d.ts +91 -266
  23. package/dist/_esm5.processed/core/api/public_api.js +439 -805
  24. package/dist/_esm5.processed/core/{segment_buffers/implementations/image → api/track_management}/index.d.ts +3 -2
  25. package/dist/_esm5.processed/core/{segment_buffers/implementations/image → api/track_management}/index.js +3 -2
  26. package/dist/_esm5.processed/core/api/{tracks_management/media_element_track_choice_manager.d.ts → track_management/media_element_tracks_store.d.ts} +15 -75
  27. package/dist/_esm5.processed/core/api/{tracks_management/media_element_track_choice_manager.js → track_management/media_element_tracks_store.js} +74 -193
  28. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +84 -0
  29. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +158 -0
  30. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +406 -0
  31. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +932 -0
  32. package/dist/_esm5.processed/core/api/utils.d.ts +1 -0
  33. package/dist/_esm5.processed/core/api/utils.js +28 -11
  34. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +3 -3
  35. package/dist/_esm5.processed/core/decrypt/find_key_system.js +83 -71
  36. package/dist/_esm5.processed/core/decrypt/get_media_keys.js +6 -5
  37. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +10 -72
  38. package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.d.ts +4 -4
  39. package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.js +6 -4
  40. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +1 -3
  41. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +7 -26
  42. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +3 -9
  43. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +16 -9
  44. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -3
  45. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
  46. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.d.ts +1 -6
  47. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +4 -41
  48. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  49. package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +1 -8
  50. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +5 -19
  51. package/dist/_esm5.processed/core/init/types.d.ts +5 -15
  52. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +2 -36
  53. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +2 -82
  54. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +1 -2
  55. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +2 -3
  56. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +2 -2
  57. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  58. package/dist/_esm5.processed/core/segment_buffers/index.js +2 -1
  59. package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +1 -0
  60. package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +1 -0
  61. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.d.ts +33 -0
  62. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +49 -0
  63. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +0 -1
  64. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +2 -16
  65. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +0 -15
  66. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +183 -93
  67. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.d.ts +39 -0
  68. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +133 -0
  69. package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +27 -13
  70. package/dist/_esm5.processed/core/stream/index.d.ts +2 -3
  71. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +2 -0
  72. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +5 -7
  73. package/dist/_esm5.processed/core/stream/period/period_stream.js +13 -12
  74. package/dist/_esm5.processed/core/stream/period/types.d.ts +5 -14
  75. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +2 -4
  76. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +10 -46
  77. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +29 -23
  78. package/dist/_esm5.processed/core/stream/representation/types.d.ts +11 -1
  79. package/dist/_esm5.processed/default_config.d.ts +35 -98
  80. package/dist/_esm5.processed/default_config.js +36 -113
  81. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +1 -3
  82. package/dist/_esm5.processed/errors/custom_loader_error.js +1 -3
  83. package/dist/_esm5.processed/errors/media_error.js +2 -2
  84. package/dist/_esm5.processed/errors/network_error.d.ts +0 -1
  85. package/dist/_esm5.processed/errors/network_error.js +0 -1
  86. package/dist/_esm5.processed/errors/request_error.d.ts +2 -3
  87. package/dist/_esm5.processed/errors/request_error.js +2 -5
  88. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -3
  89. package/dist/_esm5.processed/features/features_object.js +0 -2
  90. package/dist/_esm5.processed/features/list/directfile.js +2 -5
  91. package/dist/_esm5.processed/features/list/index.d.ts +0 -2
  92. package/dist/_esm5.processed/features/list/index.js +0 -2
  93. package/dist/_esm5.processed/features/types.d.ts +3 -27
  94. package/dist/_esm5.processed/manifest/adaptation.d.ts +9 -11
  95. package/dist/_esm5.processed/manifest/adaptation.js +41 -30
  96. package/dist/_esm5.processed/manifest/index.d.ts +3 -4
  97. package/dist/_esm5.processed/manifest/manifest.d.ts +5 -54
  98. package/dist/_esm5.processed/manifest/manifest.js +5 -110
  99. package/dist/_esm5.processed/manifest/period.d.ts +4 -5
  100. package/dist/_esm5.processed/manifest/representation.d.ts +10 -5
  101. package/dist/_esm5.processed/manifest/representation.js +15 -5
  102. package/dist/_esm5.processed/manifest/representation_index/index.d.ts +2 -2
  103. package/dist/_esm5.processed/manifest/representation_index/static.d.ts +2 -0
  104. package/dist/_esm5.processed/manifest/representation_index/static.js +6 -0
  105. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +42 -21
  106. package/dist/_esm5.processed/manifest/types.d.ts +0 -2
  107. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +17 -31
  108. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +26 -19
  109. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -0
  110. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +7 -1
  111. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -6
  112. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -8
  113. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +2 -0
  114. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +6 -0
  115. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  116. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +1 -6
  117. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +3 -5
  118. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +0 -2
  119. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -1
  120. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +2 -2
  121. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +0 -2
  122. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +2 -2
  123. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +10 -6
  124. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +4 -2
  125. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.d.ts +10 -1
  126. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +18 -2
  127. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +4 -4
  128. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +3 -6
  129. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +1 -2
  130. package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +2 -0
  131. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +6 -0
  132. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +6 -6
  133. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +12 -3
  134. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +11 -2
  135. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +0 -1
  136. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +11 -17
  137. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +21 -83
  138. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +53 -125
  139. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.d.ts +119 -0
  140. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +159 -0
  141. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.d.ts +3 -6
  142. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +4 -4
  143. package/dist/_esm5.processed/parsers/manifest/types.d.ts +3 -3
  144. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
  145. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
  146. package/dist/_esm5.processed/public_types.d.ts +396 -308
  147. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.d.ts +5 -4
  148. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +5 -4
  149. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +4 -4
  150. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
  151. package/dist/_esm5.processed/transports/dash/pipelines.js +1 -4
  152. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  153. package/dist/_esm5.processed/transports/dash/segment_loader.js +26 -20
  154. package/dist/_esm5.processed/transports/dash/segment_parser.js +19 -24
  155. package/dist/_esm5.processed/transports/dash/text_loader.js +5 -5
  156. package/dist/_esm5.processed/transports/dash/text_parser.js +28 -33
  157. package/dist/_esm5.processed/transports/local/pipelines.js +1 -10
  158. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
  159. package/dist/_esm5.processed/transports/local/segment_parser.d.ts +1 -1
  160. package/dist/_esm5.processed/transports/local/segment_parser.js +10 -10
  161. package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
  162. package/dist/_esm5.processed/transports/local/text_parser.js +23 -23
  163. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +34 -52
  164. package/dist/_esm5.processed/{utils/list_to_map.d.ts → transports/smooth/is_mp4_embedded_track.d.ts} +5 -5
  165. package/dist/_esm5.processed/{features/list/image_buffer.d.ts → transports/smooth/is_mp4_embedded_track.js} +7 -6
  166. package/dist/_esm5.processed/transports/smooth/pipelines.js +33 -190
  167. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +1 -1
  168. package/dist/_esm5.processed/transports/smooth/segment_loader.js +28 -22
  169. package/dist/_esm5.processed/transports/smooth/utils.d.ts +1 -26
  170. package/dist/_esm5.processed/transports/smooth/utils.js +1 -55
  171. package/dist/_esm5.processed/transports/types.d.ts +94 -89
  172. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  173. package/dist/_esm5.processed/transports/utils/infer_segment_container.d.ts +3 -3
  174. package/dist/_esm5.processed/transports/utils/infer_segment_container.js +5 -7
  175. package/dist/_esm5.processed/transports/utils/parse_text_track.d.ts +8 -12
  176. package/dist/_esm5.processed/transports/utils/parse_text_track.js +19 -21
  177. package/dist/_esm5.processed/utils/array_includes.d.ts +2 -1
  178. package/dist/_esm5.processed/utils/array_includes.js +30 -28
  179. package/dist/_esm5.processed/utils/request/xhr.js +5 -5
  180. package/dist/commonjs/compat/is_codec_supported.js +22 -1
  181. package/dist/commonjs/config.d.ts +1 -0
  182. package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
  183. package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
  184. package/dist/commonjs/core/api/option_utils.d.ts +2 -0
  185. package/dist/commonjs/core/api/option_utils.js +2 -3
  186. package/dist/commonjs/core/api/public_api.d.ts +9 -0
  187. package/dist/commonjs/core/api/public_api.js +34 -9
  188. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  189. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
  190. package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  191. package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
  192. package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  193. package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
  194. package/dist/commonjs/core/init/directfile_content_initializer.js +24 -7
  195. package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
  196. package/dist/commonjs/core/init/media_source_content_initializer.js +4 -6
  197. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  198. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +16 -17
  199. package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
  200. package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
  201. package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +3 -3
  202. package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
  203. package/dist/commonjs/default_config.d.ts +5 -0
  204. package/dist/commonjs/default_config.js +5 -0
  205. package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  206. package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  207. package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
  208. package/dist/commonjs/manifest/representation_index/static.js +2 -2
  209. package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
  210. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  211. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
  212. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  213. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  214. package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  215. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  216. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
  217. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  218. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
  219. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  220. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  221. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
  222. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  223. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  224. package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
  225. package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
  226. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  227. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
  228. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  229. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
  230. package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +7 -3
  231. package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
  232. package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
  233. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  234. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
  235. package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
  236. package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
  237. package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
  238. package/dist/commonjs/public_types.d.ts +78 -34
  239. package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
  240. package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
  241. package/dist/commonjs/transports/dash/segment_loader.js +2 -1
  242. package/dist/commonjs/transports/dash/text_loader.js +2 -0
  243. package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
  244. package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
  245. package/dist/commonjs/transports/smooth/pipelines.js +4 -2
  246. package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
  247. package/dist/commonjs/transports/types.d.ts +12 -0
  248. package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
  249. package/dist/commonjs/utils/request/fetch.d.ts +6 -0
  250. package/dist/commonjs/utils/request/fetch.js +29 -8
  251. package/dist/commonjs/utils/request/xhr.d.ts +11 -5
  252. package/dist/commonjs/utils/request/xhr.js +29 -8
  253. package/dist/es2017/compat/is_codec_supported.js +22 -1
  254. package/dist/es2017/config.d.ts +1 -0
  255. package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
  256. package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
  257. package/dist/es2017/core/api/option_utils.d.ts +2 -0
  258. package/dist/es2017/core/api/option_utils.js +2 -3
  259. package/dist/es2017/core/api/public_api.d.ts +9 -0
  260. package/dist/es2017/core/api/public_api.js +33 -8
  261. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  262. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
  263. package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  264. package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
  265. package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  266. package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
  267. package/dist/es2017/core/init/directfile_content_initializer.js +24 -7
  268. package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
  269. package/dist/es2017/core/init/media_source_content_initializer.js +4 -6
  270. package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  271. package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +16 -15
  272. package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
  273. package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
  274. package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +3 -3
  275. package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
  276. package/dist/es2017/default_config.d.ts +5 -0
  277. package/dist/es2017/default_config.js +5 -0
  278. package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  279. package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  280. package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
  281. package/dist/es2017/manifest/representation_index/static.js +2 -2
  282. package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
  283. package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  284. package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
  285. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  286. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  287. package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  288. package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  289. package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
  290. package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  291. package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
  292. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  293. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  294. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
  295. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  296. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  297. package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
  298. package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
  299. package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  300. package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
  301. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  302. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
  303. package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +7 -3
  304. package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
  305. package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
  306. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  307. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
  308. package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
  309. package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
  310. package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
  311. package/dist/es2017/public_types.d.ts +78 -34
  312. package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
  313. package/dist/es2017/transports/dash/manifest_parser.js +3 -0
  314. package/dist/es2017/transports/dash/segment_loader.js +1 -0
  315. package/dist/es2017/transports/dash/text_loader.js +2 -0
  316. package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
  317. package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
  318. package/dist/es2017/transports/smooth/pipelines.js +2 -0
  319. package/dist/es2017/transports/smooth/segment_loader.js +1 -0
  320. package/dist/es2017/transports/types.d.ts +12 -0
  321. package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
  322. package/dist/es2017/utils/request/fetch.d.ts +6 -0
  323. package/dist/es2017/utils/request/fetch.js +29 -8
  324. package/dist/es2017/utils/request/xhr.d.ts +11 -5
  325. package/dist/es2017/utils/request/xhr.js +30 -9
  326. package/dist/rx-player.js +723 -376
  327. package/dist/rx-player.min.js +1 -1
  328. package/package.json +3 -4
  329. package/scripts/update-version +2 -0
  330. package/sonar-project.properties +1 -1
  331. package/src/compat/is_codec_supported.ts +23 -1
  332. package/src/core/api/debug/buffer_graph.ts +2 -5
  333. package/src/core/api/debug/modules/general_info.ts +15 -10
  334. package/src/core/api/option_utils.ts +3 -3
  335. package/src/core/api/public_api.ts +35 -7
  336. package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
  337. package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
  338. package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
  339. package/src/core/fetchers/utils/schedule_request.ts +1 -1
  340. package/src/core/init/directfile_content_initializer.ts +23 -7
  341. package/src/core/init/media_source_content_initializer.ts +13 -7
  342. package/src/core/init/utils/content_time_boundaries_observer.ts +23 -22
  343. package/src/core/init/utils/get_initial_time.ts +25 -12
  344. package/src/core/stream/representation/utils/get_buffer_status.ts +3 -3
  345. package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
  346. package/src/default_config.ts +5 -0
  347. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
  348. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
  349. package/src/manifest/representation_index/static.ts +2 -2
  350. package/src/manifest/representation_index/types.ts +4 -4
  351. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
  352. package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
  353. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
  354. package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
  355. package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
  356. package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
  357. package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
  358. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
  359. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
  360. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
  361. package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
  362. package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
  363. package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
  364. package/src/parsers/manifest/dash/common/parse_representations.ts +9 -3
  365. package/src/parsers/manifest/local/representation_index.ts +3 -3
  366. package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
  367. package/src/parsers/manifest/smooth/representation_index.ts +23 -9
  368. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
  369. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
  370. package/src/parsers/manifest/utils/index_helpers.ts +1 -1
  371. package/src/public_types.ts +79 -34
  372. package/src/transports/dash/init_segment_loader.ts +5 -0
  373. package/src/transports/dash/manifest_parser.ts +6 -0
  374. package/src/transports/dash/segment_loader.ts +1 -0
  375. package/src/transports/dash/text_loader.ts +2 -0
  376. package/src/transports/metaplaylist/manifest_loader.ts +1 -0
  377. package/src/transports/metaplaylist/pipelines.ts +4 -1
  378. package/src/transports/smooth/pipelines.ts +2 -0
  379. package/src/transports/smooth/segment_loader.ts +1 -0
  380. package/src/transports/types.ts +12 -0
  381. package/src/transports/utils/generate_manifest_loader.ts +3 -0
  382. package/src/utils/request/fetch.ts +35 -8
  383. package/src/utils/request/xhr.ts +45 -14
  384. package/dist/_esm5.processed/compat/fullscreen.d.ts +0 -32
  385. package/dist/_esm5.processed/compat/fullscreen.js +0 -78
  386. package/dist/_esm5.processed/compat/is_offline.d.ts +0 -39
  387. package/dist/_esm5.processed/compat/is_offline.js +0 -43
  388. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +0 -258
  389. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +0 -989
  390. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +0 -75
  391. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +0 -133
  392. package/dist/_esm5.processed/features/list/bif_parser.d.ts +0 -23
  393. package/dist/_esm5.processed/features/list/bif_parser.js +0 -27
  394. package/dist/_esm5.processed/features/list/image_buffer.js +0 -25
  395. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +0 -38
  396. package/dist/_esm5.processed/transports/dash/image_pipelines.js +0 -129
  397. package/dist/_esm5.processed/utils/list_to_map.js +0 -28
  398. package/dist/_esm5.processed/utils/simple_set.d.ts +0 -51
  399. package/dist/_esm5.processed/utils/simple_set.js +0 -57
  400. package/dist/_esm5.processed/utils/uniq.d.ts +0 -36
  401. package/dist/_esm5.processed/utils/uniq.js +0 -43
  402. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  403. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
  404. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  405. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
  406. package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
  407. package/src/typings/object-assign.d.ts +0 -48
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rx-player",
3
3
  "author": "Canal+",
4
- "version": "4.0.0-dev.2023111400",
4
+ "version": "4.0.0-dev.2023120600",
5
5
  "description": "Canal+ HTML5 Video Player",
6
6
  "main": "./dist/commonjs/index.js",
7
7
  "module": "./dist/es2017/index.js",
@@ -138,7 +138,7 @@
138
138
  "demo": "node ./scripts/build_demo.mjs --production-mode",
139
139
  "demo:min": "node ./scripts/build_demo.mjs --production-mode --minify",
140
140
  "demo:watch": "node ./scripts/build_demo.mjs --watch --production-mode",
141
- "doc": "docgen.ico doc/ doc/generated \"$(cat VERSION)\"",
141
+ "doc": "readme.doc doc/ doc/generated \"$(cat VERSION)\"",
142
142
  "lint": "eslint src -c .eslintrc.js",
143
143
  "lint:demo": "eslint -c demo/full/.eslintrc.js demo/full/scripts",
144
144
  "lint:tests": "eslint tests/**/*.js --ignore-pattern '/tests/performance/bundle*'",
@@ -172,6 +172,7 @@
172
172
  "@babel/plugin-transform-runtime": "7.22.15",
173
173
  "@babel/preset-env": "7.22.20",
174
174
  "@babel/preset-react": "7.22.15",
175
+ "@canalplus/readme.doc": "^0.3.0",
175
176
  "@types/chai": "4.3.6",
176
177
  "@types/jest": "29.5.5",
177
178
  "@types/mocha": "10.0.1",
@@ -185,7 +186,6 @@
185
186
  "babel-loader": "9.1.3",
186
187
  "chai": "4.3.8",
187
188
  "core-js": "3.32.2",
188
- "docgen.ico": "^0.2.3",
189
189
  "esbuild": "0.19.3",
190
190
  "eslint": "8.50.0",
191
191
  "eslint-plugin-ban": "1.6.0",
@@ -215,7 +215,6 @@
215
215
  "terser-webpack-plugin": "5.3.9",
216
216
  "ts-jest": "29.1.1",
217
217
  "ts-loader": "9.4.4",
218
- "tslint": "6.1.3",
219
218
  "typescript": "5.2.2",
220
219
  "webpack": "5.88.2",
221
220
  "webpack-cli": "5.1.4"
@@ -22,7 +22,9 @@
22
22
  set -e
23
23
 
24
24
  version=$1
25
+ date_iso=$(date "+%Y-%m-%d")
25
26
 
27
+ sed -i.bak -e "s/^\#\# Unreleased/\#\# v${version} \(${date_iso}\)/gi" CHANGELOG.md && rm CHANGELOG.md.bak
26
28
  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
29
  sed -i.bak -e "s/\"version\":\s*\"[0-9]\+\.[0-9]\+\.[0-9]\+[^\"]*\"/\"version\": \"${version}\"/g" package.json && rm package.json.bak
28
30
  sed -i.bak -e "s/sonar\.projectVersion= *.*/sonar.projectVersion=${version}/g" sonar-project.properties && rm sonar-project.properties.bak
@@ -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-dev.2023111400
4
+ sonar.projectVersion=4.0.0-dev.2023120600
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
@@ -16,6 +16,17 @@
16
16
 
17
17
  import { MediaSource_ } from "./browser_compatibility_types";
18
18
 
19
+ /**
20
+ * Setting this value limit the number of entries in the support map
21
+ * preventing important memory usage, value is arbitrary
22
+ */
23
+ const MAX_SUPPORT_MAP_ENTRIES = 200;
24
+
25
+ /**
26
+ * caching the codec support reduce the amount of call to `isTypeSupported`
27
+ * and help for performance especially on low-end devices.
28
+ */
29
+ const supportMap: Map<string, boolean> = new Map();
19
30
  /**
20
31
  * Returns true if the given codec is supported by the browser's MediaSource
21
32
  * implementation.
@@ -33,7 +44,18 @@ export default function isCodecSupported(mimeType : string) : boolean {
33
44
  /* eslint-disable @typescript-eslint/unbound-method */
34
45
  if (typeof MediaSource_.isTypeSupported === "function") {
35
46
  /* eslint-enable @typescript-eslint/unbound-method */
36
- return MediaSource_.isTypeSupported(mimeType);
47
+ const cachedSupport = supportMap.get(mimeType);
48
+ if (cachedSupport !== undefined) {
49
+ return cachedSupport;
50
+ } else {
51
+ const isSupported = MediaSource_.isTypeSupported(mimeType);
52
+ if (supportMap.size >= MAX_SUPPORT_MAP_ENTRIES) {
53
+ supportMap.clear();
54
+ }
55
+ supportMap.set(mimeType, isSupported);
56
+ return isSupported;
57
+ }
58
+
37
59
  }
38
60
 
39
61
  return true;
@@ -1,7 +1,7 @@
1
1
  import { Representation } from "../../../manifest";
2
2
  import { IBufferedChunk } from "../../segment_buffers";
3
3
 
4
- const BUFFER_WIDTH_IN_SECONDS = 10000;
4
+ const BUFFER_WIDTH_IN_SECONDS = 30 * 60;
5
5
 
6
6
  const COLORS = [
7
7
  "#2ab7ca",
@@ -95,10 +95,7 @@ export default class SegmentBufferGraph {
95
95
  let minimumPosition;
96
96
  let maximumPosition;
97
97
  if (maximumPoint - minimumPoint > BUFFER_WIDTH_IN_SECONDS) {
98
- if (currentTime === undefined) {
99
- minimumPosition = minimumPoint;
100
- maximumPosition = maximumPoint;
101
- } else if (maximumPoint - currentTime < BUFFER_WIDTH_IN_SECONDS / 2) {
98
+ if (maximumPoint - currentTime < BUFFER_WIDTH_IN_SECONDS / 2) {
102
99
  maximumPosition = maximumPoint;
103
100
  minimumPosition = maximumPoint - BUFFER_WIDTH_IN_SECONDS;
104
101
  } else if (currentTime - minimumPoint < BUFFER_WIDTH_IN_SECONDS / 2) {
@@ -157,23 +157,28 @@ export default function constructDebugGeneralInfo(
157
157
  ]);
158
158
  adaptationsElt.appendChild(textAdaps);
159
159
  }
160
- const videoBitrates = instance.getVideoTrack()?.representations.map(r => {
161
- return r.bitrate;
162
- }).filter(bitrate => bitrate !== undefined) ?? [];
163
- const audioBitrates = instance.getAudioTrack()?.representations.map(r => {
164
- return r.bitrate;
165
- }).filter(bitrate => bitrate !== undefined) ?? [];
160
+ const adaptations = instance.__priv_getCurrentAdaptation();
161
+ const videoBitratesStr = adaptations?.video?.representations.map((r) => {
162
+ return String(r.bitrate ?? "N/A") +
163
+ (r.isSupported ? "" : " U!") +
164
+ (r.decipherable !== false ? "" : " E!");
165
+ }) ?? [];
166
+ const audioBitratesStr = adaptations?.video?.representations.map((r) => {
167
+ return String(r.bitrate ?? "N/A") +
168
+ (r.isSupported ? "" : " U!") +
169
+ (r.decipherable !== false ? "" : " E!");
170
+ }) ?? [];
166
171
  representationsElt.innerHTML = "";
167
- if (videoBitrates.length > 0) {
172
+ if (videoBitratesStr.length > 0) {
168
173
  representationsElt.appendChild(createMetricTitle("vb"));
169
174
  representationsElt.appendChild(createElement("span", {
170
- textContent: videoBitrates.join(" ") + " ",
175
+ textContent: videoBitratesStr.join(" ") + " ",
171
176
  }));
172
177
  }
173
- if (audioBitrates.length > 0) {
178
+ if (audioBitratesStr.length > 0) {
174
179
  representationsElt.appendChild(createMetricTitle("ab"));
175
180
  representationsElt.appendChild(createElement("span", {
176
- textContent: audioBitrates.join(" ") + " ",
181
+ textContent: audioBitratesStr.join(" ") + " ",
177
182
  }));
178
183
  }
179
184
  } else {
@@ -42,6 +42,7 @@ export type IParsedStartAtOption = { position : number } |
42
42
  { wallClockTime : number } |
43
43
  { percentage : number } |
44
44
  { fromLastPosition : number } |
45
+ { fromLivePosition : number } |
45
46
  { fromFirstPosition : number };
46
47
 
47
48
  /** Options of the RxPlayer's constructor once parsed. */
@@ -383,9 +384,8 @@ function parseLoadVideoOptions(
383
384
  }
384
385
 
385
386
  if (!isNullOrUndefined(options.startAt)) {
386
- // TODO Better way to express that in TypeScript?
387
- if ((options.startAt as { wallClockTime? : Date|number }).wallClockTime
388
- instanceof Date
387
+ if ("wallClockTime" in options.startAt
388
+ && options.startAt.wallClockTime instanceof Date
389
389
  ) {
390
390
  const wallClockTime = (options.startAt as { wallClockTime : Date })
391
391
  .wallClockTime.getTime() / 1000;
@@ -346,7 +346,7 @@ class Player extends EventEmitter<IPublicAPIEvent> {
346
346
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
347
347
  videoElement.preload = "auto";
348
348
 
349
- this.version = /* PLAYER_VERSION */"4.0.0-dev.2023111400";
349
+ this.version = /* PLAYER_VERSION */"4.0.0-dev.2023120600";
350
350
  this.log = log;
351
351
  this.state = "STOPPED";
352
352
  this.videoElement = videoElement;
@@ -610,6 +610,8 @@ class Player extends EventEmitter<IPublicAPIEvent> {
610
610
  const manifestRequestSettings = { lowLatencyMode,
611
611
  maxRetry : requestConfig.manifest?.maxRetry,
612
612
  requestTimeout: requestConfig.manifest?.timeout,
613
+ connectionTimeout:
614
+ requestConfig.manifest?.connectionTimeout,
613
615
  minimumManifestUpdateInterval,
614
616
  initialManifest };
615
617
 
@@ -667,8 +669,9 @@ class Player extends EventEmitter<IPublicAPIEvent> {
667
669
 
668
670
  const segmentRequestOptions = { lowLatencyMode,
669
671
  maxRetry: requestConfig.segment?.maxRetry,
670
- requestTimeout: requestConfig.segment?.timeout };
671
-
672
+ requestTimeout: requestConfig.segment?.timeout,
673
+ connectionTimeout:
674
+ requestConfig.segment?.connectionTimeout };
672
675
  initializer = new features.mediaSourceInit({
673
676
  adaptiveOptions,
674
677
  autoPlay,
@@ -1958,6 +1961,29 @@ class Player extends EventEmitter<IPublicAPIEvent> {
1958
1961
  return null;
1959
1962
  }
1960
1963
 
1964
+ /**
1965
+ * Returns the current position for live contents.
1966
+ *
1967
+ * Returns `null` if no content is loaded or if the current loaded content is
1968
+ * not considered as a live content.
1969
+ * Returns `undefined` if that live position is currently unknown.
1970
+ * @returns {number}
1971
+ */
1972
+ getLivePosition() : number | undefined |null {
1973
+ if (this._priv_contentInfos === null) {
1974
+ return null;
1975
+ }
1976
+
1977
+ const { isDirectFile, manifest } = this._priv_contentInfos;
1978
+ if (isDirectFile) {
1979
+ return undefined;
1980
+ }
1981
+ if (manifest?.isLive !== true) {
1982
+ return null;
1983
+ }
1984
+ return manifest.getLivePosition();
1985
+ }
1986
+
1961
1987
  /**
1962
1988
  * Get maximum seek-able position.
1963
1989
  * @returns {number}
@@ -2008,9 +2034,11 @@ class Player extends EventEmitter<IPublicAPIEvent> {
2008
2034
  }
2009
2035
  const segmentBufferStatus = this._priv_contentInfos
2010
2036
  .segmentBuffersStore.getStatus(bufferType);
2011
- return segmentBufferStatus.type === "initialized" ?
2012
- segmentBufferStatus.value.getInventory() :
2013
- null;
2037
+ if (segmentBufferStatus.type === "initialized") {
2038
+ segmentBufferStatus.value.synchronizeInventory();
2039
+ return segmentBufferStatus.value.getInventory();
2040
+ }
2041
+ return null;
2014
2042
  }
2015
2043
 
2016
2044
  /**
@@ -2784,7 +2812,7 @@ class Player extends EventEmitter<IPublicAPIEvent> {
2784
2812
  }
2785
2813
  }
2786
2814
  }
2787
- Player.version = /* PLAYER_VERSION */"4.0.0-dev.2023111400";
2815
+ Player.version = /* PLAYER_VERSION */"4.0.0-dev.2023120600";
2788
2816
 
2789
2817
  /** Every events sent by the RxPlayer's public API. */
2790
2818
  interface IPublicAPIEvent {
@@ -29,7 +29,6 @@ import {
29
29
  ITransportPipelines,
30
30
  } from "../../../transports";
31
31
  import EventEmitter from "../../../utils/event_emitter";
32
- import isNullOrUndefined from "../../../utils/is_null_or_undefined";
33
32
  import getMonotonicTimeStamp from "../../../utils/monotonic_timestamp";
34
33
  import noop from "../../../utils/noop";
35
34
  import TaskCanceller from "../../../utils/task_canceller";
@@ -231,14 +230,27 @@ export default class ManifestFetcher extends EventEmitter<IManifestFetcherEvent>
231
230
  ) : Promise<IRequestedData<ILoadedManifestFormat>> {
232
231
  const { loadManifest } = pipelines;
233
232
  let requestTimeout : number | undefined =
234
- isNullOrUndefined(settings.requestTimeout) ?
233
+ (settings.requestTimeout === undefined) ?
235
234
  config.getCurrent().DEFAULT_REQUEST_TIMEOUT :
236
235
  settings.requestTimeout;
236
+
237
+ let connectionTimeout: number | undefined =
238
+ (settings.connectionTimeout === undefined) ?
239
+ config.getCurrent().DEFAULT_CONNECTION_TIMEOUT :
240
+ settings.connectionTimeout;
241
+
237
242
  if (requestTimeout < 0) {
238
243
  requestTimeout = undefined;
239
244
  }
245
+
246
+ if (connectionTimeout < 0) {
247
+ connectionTimeout = undefined;
248
+ }
240
249
  const callLoader = () => loadManifest(manifestUrl,
241
- { timeout: requestTimeout },
250
+ {
251
+ timeout: requestTimeout,
252
+ connectionTimeout,
253
+ },
242
254
  cancelSignal);
243
255
  return scheduleRequestPromise(callLoader, backoffSettings, cancelSignal);
244
256
  }
@@ -722,6 +734,12 @@ export interface IManifestFetcherSettings {
722
734
  * `undefined` will lead to a default, large, timeout being used.
723
735
  */
724
736
  requestTimeout : number | undefined;
737
+ /**
738
+ * Connection timeout, in milliseconds, after which the request is canceled
739
+ * if the responses headers has not being received.
740
+ * Do not set or set to "undefined" to disable it.
741
+ */
742
+ connectionTimeout: number | undefined;
725
743
  /** Limit the frequency of Manifest updates. */
726
744
  minimumManifestUpdateInterval : number;
727
745
  /**
@@ -93,6 +93,8 @@ export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
93
93
  const requestOptions = {
94
94
  timeout: options.requestTimeout < 0 ? undefined :
95
95
  options.requestTimeout,
96
+ connectionTimeout: options.connectionTimeout === undefined ? undefined :
97
+ options.connectionTimeout < 0 ? undefined : options.connectionTimeout,
96
98
  };
97
99
 
98
100
  /**
@@ -457,6 +459,12 @@ export interface ISegmentFetcherOptions {
457
459
  * To set to `-1` for no timeout.
458
460
  */
459
461
  requestTimeout : number;
462
+ /**
463
+ * Connection timeout, in milliseconds, after which the request is canceled
464
+ * if the responses headers has not being received.
465
+ * Do not set or set to "undefined" to disable it.
466
+ */
467
+ connectionTimeout: number | undefined;
460
468
  }
461
469
 
462
470
  /**
@@ -467,12 +475,15 @@ export interface ISegmentFetcherOptions {
467
475
  export function getSegmentFetcherOptions(
468
476
  { maxRetry,
469
477
  lowLatencyMode,
470
- requestTimeout } : { maxRetry? : number | undefined;
471
- requestTimeout? : number | undefined;
472
- lowLatencyMode : boolean; }
478
+ requestTimeout,
479
+ connectionTimeout } : { maxRetry? : number | undefined;
480
+ requestTimeout? : number | undefined;
481
+ connectionTimeout? : number | undefined;
482
+ lowLatencyMode : boolean; }
473
483
  ) : ISegmentFetcherOptions {
474
484
  const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
475
485
  DEFAULT_REQUEST_TIMEOUT,
486
+ DEFAULT_CONNECTION_TIMEOUT,
476
487
  INITIAL_BACKOFF_DELAY_BASE,
477
488
  MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
478
489
  return { maxRetry: maxRetry ?? DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
@@ -480,6 +491,9 @@ export function getSegmentFetcherOptions(
480
491
  INITIAL_BACKOFF_DELAY_BASE.REGULAR,
481
492
  maxDelay: lowLatencyMode ? MAX_BACKOFF_DELAY_BASE.LOW_LATENCY :
482
493
  MAX_BACKOFF_DELAY_BASE.REGULAR,
483
- requestTimeout: isNullOrUndefined(requestTimeout) ? DEFAULT_REQUEST_TIMEOUT :
484
- requestTimeout };
494
+ requestTimeout: (requestTimeout === undefined) ? DEFAULT_REQUEST_TIMEOUT :
495
+ requestTimeout,
496
+ connectionTimeout: (connectionTimeout === undefined) ?
497
+ DEFAULT_CONNECTION_TIMEOUT : connectionTimeout,
498
+ };
485
499
  }
@@ -124,4 +124,5 @@ export interface ISegmentFetcherCreatorBackoffOptions {
124
124
  * `undefined` will lead to a default, large, timeout being used.
125
125
  */
126
126
  requestTimeout : number | undefined;
127
+ connectionTimeout : number | undefined;
127
128
  }
@@ -352,7 +352,7 @@ export async function scheduleRequestWithCdns<T>(
352
352
  * attempts already done for that resource.
353
353
  *
354
354
  * Returns `undefined` if there's no Cdn left to request the resource.
355
- * @param {Array.<Object>}
355
+ * @param {Array.<Object>} sortedCdns
356
356
  * @returns {Object|undefined}
357
357
  */
358
358
  function getPrioritaryRequestableCdnFromSortedList(
@@ -27,6 +27,7 @@ import {
27
27
  IPlayerError,
28
28
  } from "../../public_types";
29
29
  import assert from "../../utils/assert";
30
+ import isNullOrUndefined from "../../utils/is_null_or_undefined";
30
31
  import SharedReference, {
31
32
  IReadOnlySharedReference,
32
33
  } from "../../utils/reference";
@@ -241,11 +242,11 @@ function getDirectFileInitialTime(
241
242
  mediaElement : HTMLMediaElement,
242
243
  startAt? : IInitialTimeOptions
243
244
  ) : number {
244
- if (startAt == null) {
245
+ if (isNullOrUndefined(startAt)) {
245
246
  return 0;
246
247
  }
247
248
 
248
- if (startAt.position != null) {
249
+ if (!isNullOrUndefined(startAt.position)) {
249
250
  return startAt.position;
250
251
  } else if (startAt.wallClockTime != null) {
251
252
  return startAt.wallClockTime;
@@ -254,15 +255,30 @@ function getDirectFileInitialTime(
254
255
  }
255
256
 
256
257
  const duration = mediaElement.duration;
257
- if (duration == null || !isFinite(duration)) {
258
- log.warn("startAt.fromLastPosition set but no known duration, " +
259
- "beginning at 0.");
260
- return 0;
261
- }
262
258
 
263
259
  if (typeof startAt.fromLastPosition === "number") {
260
+ if (isNullOrUndefined(duration) || !isFinite(duration)) {
261
+ log.warn("startAt.fromLastPosition set but no known duration, " +
262
+ "beginning at 0.");
263
+ return 0;
264
+ }
264
265
  return Math.max(0, duration + startAt.fromLastPosition);
266
+ } else if (typeof startAt.fromLivePosition === "number") {
267
+ const livePosition = mediaElement.seekable.length > 0 ?
268
+ mediaElement.seekable.end(0) :
269
+ duration;
270
+ if (isNullOrUndefined(livePosition)) {
271
+ log.warn("startAt.fromLivePosition set but no known live position, " +
272
+ "beginning at 0.");
273
+ return 0;
274
+ }
275
+ return Math.max(0, livePosition + startAt.fromLivePosition);
265
276
  } else if (startAt.percentage != null) {
277
+ if (isNullOrUndefined(duration) || !isFinite(duration)) {
278
+ log.warn("startAt.percentage set but no known duration, " +
279
+ "beginning at 0.");
280
+ return 0;
281
+ }
266
282
  const { percentage } = startAt;
267
283
  if (percentage >= 100) {
268
284
  return duration;
@@ -541,7 +541,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
541
541
  if (
542
542
  // Data is buffered around the current position
543
543
  obs.currentRange !== null ||
544
- // Or, for whatever reason, playback is already advancing
544
+ // Or, for whatever reason, we have no buffer but we're already advancing
545
545
  obs.position > seekedTime + 0.1
546
546
  ) {
547
547
  stopListening();
@@ -728,9 +728,10 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
728
728
  contentTimeBoundariesObserver.addEventListener("periodChange", (period) => {
729
729
  this.trigger("activePeriodChanged", { period });
730
730
  });
731
- contentTimeBoundariesObserver.addEventListener("durationUpdate", (newDuration) => {
732
- mediaSourceDurationUpdater.updateDuration(newDuration.duration, newDuration.isEnd);
733
- });
731
+ contentTimeBoundariesObserver.addEventListener(
732
+ "endingPositionChange",
733
+ (x) => mediaSourceDurationUpdater.updateDuration(x.endingPosition, x.isEnd)
734
+ );
734
735
  contentTimeBoundariesObserver.addEventListener("endOfStream", () => {
735
736
  if (endOfStreamCanceller === null) {
736
737
  endOfStreamCanceller = new TaskCanceller();
@@ -746,9 +747,8 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
746
747
  endOfStreamCanceller = null;
747
748
  }
748
749
  });
749
- const currentDuration = contentTimeBoundariesObserver.getCurrentDuration();
750
- mediaSourceDurationUpdater.updateDuration(currentDuration.duration,
751
- currentDuration.isEnd);
750
+ const endInfo = contentTimeBoundariesObserver.getCurrentEndingTime();
751
+ mediaSourceDurationUpdater.updateDuration(endInfo.endingPosition, endInfo.isEnd);
752
752
  return contentTimeBoundariesObserver;
753
753
  }
754
754
 
@@ -835,6 +835,12 @@ export interface IInitializeArguments {
835
835
  * `-1` indicates no timeout.
836
836
  */
837
837
  requestTimeout : number | undefined;
838
+ /**
839
+ * Amount of time, in milliseconds, after which a request that hasn't receive
840
+ * the headers and status code should be aborted and optionnaly retried,
841
+ * depending on the maxRetry configuration.
842
+ */
843
+ connectionTimeout : number | undefined;
838
844
  /** Maximum number of time a request on error will be retried. */
839
845
  maxRetry : number | undefined;
840
846
  };
@@ -32,8 +32,8 @@ import { IStreamOrchestratorPlaybackObservation } from "../../stream";
32
32
  /**
33
33
  * Observes what's being played and take care of media events relating to time
34
34
  * boundaries:
35
- * - Emits a `durationUpdate` when the duration of the current content is
36
- * known and every time it changes.
35
+ * - Emits a `endingPositionChange` when the known maximum playable position
36
+ * of the current content is known and every time it changes.
37
37
  * - Emits `endOfStream` API once segments have been pushed until the end and
38
38
  * `resumeStream` if downloads starts back.
39
39
  * - Emits a `periodChange` event when the currently-playing Period seemed to
@@ -111,7 +111,7 @@ export default class ContentTimeBoundariesObserver
111
111
  }, { includeLastObservation: true, clearSignal: cancelSignal });
112
112
 
113
113
  manifest.addEventListener("manifestUpdate", () => {
114
- this.trigger("durationUpdate", this._getManifestDuration());
114
+ this.trigger("endingPositionChange", this._getManifestEndTime());
115
115
  if (cancelSignal.isCancelled()) {
116
116
  return;
117
117
  }
@@ -120,11 +120,12 @@ export default class ContentTimeBoundariesObserver
120
120
  }
121
121
 
122
122
  /**
123
- * Returns an estimate of the current duration of the content.
123
+ * Returns an estimate of the current last position which may be played in
124
+ * the content at the moment.
124
125
  * @returns {Object}
125
126
  */
126
- public getCurrentDuration() : IDurationItem {
127
- return this._getManifestDuration();
127
+ public getCurrentEndingTime() : IEndingPositionInformation {
128
+ return this._getManifestEndTime();
128
129
  }
129
130
 
130
131
  /**
@@ -157,12 +158,13 @@ export default class ContentTimeBoundariesObserver
157
158
  .updateLastVideoAdaptation(adaptation);
158
159
  }
159
160
  const endingPosition = this._maximumPositionCalculator.getEndingPosition();
160
- const newDuration = endingPosition !== undefined ?
161
+ const newEndingPosition = endingPosition !== undefined ?
161
162
  { isEnd: true,
162
- duration: endingPosition } :
163
+ endingPosition } :
163
164
  { isEnd: false,
164
- duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
165
- this.trigger("durationUpdate", newDuration);
165
+ endingPosition: this._maximumPositionCalculator
166
+ .getMaximumAvailablePosition() };
167
+ this.trigger("endingPositionChange", newEndingPosition);
166
168
  }
167
169
  }
168
170
  }
@@ -311,13 +313,13 @@ export default class ContentTimeBoundariesObserver
311
313
  }
312
314
  }
313
315
 
314
- private _getManifestDuration() : IDurationItem {
316
+ private _getManifestEndTime() : IEndingPositionInformation {
315
317
  const endingPosition = this._maximumPositionCalculator.getEndingPosition();
316
318
  return endingPosition !== undefined ?
317
319
  { isEnd: true,
318
- duration: endingPosition } :
320
+ endingPosition } :
319
321
  { isEnd: false,
320
- duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
322
+ endingPosition: this._maximumPositionCalculator.getMaximumAvailablePosition() };
321
323
  }
322
324
 
323
325
  private _lazilyCreateActiveStreamInfo(bufferType : IBufferType) : IActiveStreamsInfo {
@@ -348,16 +350,16 @@ export default class ContentTimeBoundariesObserver
348
350
  }
349
351
  }
350
352
 
351
- export interface IDurationItem {
353
+ export interface IEndingPositionInformation {
352
354
  /**
353
355
  * The new maximum known position (note that this is the ending position
354
356
  * currently known of the current content, it might be superior to the last
355
357
  * position at which segments are available and it might also evolve over
356
358
  * time), in seconds.
357
359
  */
358
- duration : number;
360
+ endingPosition : number;
359
361
  /**
360
- * If `true`, the communicated `duration` is the actual end of the content.
362
+ * If `true`, the communicated `endingPosition` is the actual end of the content.
361
363
  * It may still be updated due to a track change or to add precision, but it
362
364
  * is still a (rough) estimate of the maximum position that content should
363
365
  * have.
@@ -365,7 +367,7 @@ export interface IDurationItem {
365
367
  * If `false`, this is the currently known maximum position associated to
366
368
  * the content, but the content is still evolving (typically, new media
367
369
  * segments are still being generated) and as such it can still have a
368
- * longer duration in the future.
370
+ * longer `endingPosition` in the future.
369
371
  */
370
372
  isEnd : boolean;
371
373
  }
@@ -380,10 +382,10 @@ export interface IContentTimeBoundariesObserverEvent {
380
382
  /** Triggered when a new `Period` is currently playing. */
381
383
  periodChange : Period;
382
384
  /**
383
- * Triggered when the duration of the currently-playing content became known
384
- * or changed.
385
+ * Triggered when the ending position of the currently-playing content became
386
+ * known or changed.
385
387
  */
386
- durationUpdate : IDurationItem;
388
+ endingPositionChange : IEndingPositionInformation;
387
389
  /**
388
390
  * Triggered when the last possible chronological segment for all types of
389
391
  * buffers has either been pushed or is being pushed to the corresponding
@@ -460,8 +462,7 @@ class MaximumPositionCalculator {
460
462
  */
461
463
  public getMaximumAvailablePosition() : number {
462
464
  if (this._manifest.isDynamic) {
463
- return this._manifest.getLivePosition() ??
464
- this._manifest.getMaximumSafePosition();
465
+ return this._manifest.getMaximumSafePosition();
465
466
  }
466
467
  if (this._lastVideoAdaptation === undefined ||
467
468
  this._lastAudioAdaptation === undefined)