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
@@ -14,6 +14,16 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { MediaSource_ } from "./browser_compatibility_types";
17
+ /**
18
+ * Setting this value limit the number of entries in the support map
19
+ * preventing important memory usage, value is arbitrary
20
+ */
21
+ const MAX_SUPPORT_MAP_ENTRIES = 200;
22
+ /**
23
+ * caching the codec support reduce the amount of call to `isTypeSupported`
24
+ * and help for performance especially on low-end devices.
25
+ */
26
+ const supportMap = new Map();
17
27
  /**
18
28
  * Returns true if the given codec is supported by the browser's MediaSource
19
29
  * implementation.
@@ -30,7 +40,18 @@ export default function isCodecSupported(mimeType) {
30
40
  /* eslint-disable @typescript-eslint/unbound-method */
31
41
  if (typeof MediaSource_.isTypeSupported === "function") {
32
42
  /* eslint-enable @typescript-eslint/unbound-method */
33
- return MediaSource_.isTypeSupported(mimeType);
43
+ const cachedSupport = supportMap.get(mimeType);
44
+ if (cachedSupport !== undefined) {
45
+ return cachedSupport;
46
+ }
47
+ else {
48
+ const isSupported = MediaSource_.isTypeSupported(mimeType);
49
+ if (supportMap.size >= MAX_SUPPORT_MAP_ENTRIES) {
50
+ supportMap.clear();
51
+ }
52
+ supportMap.set(mimeType, isSupported);
53
+ return isSupported;
54
+ }
34
55
  }
35
56
  return true;
36
57
  }
@@ -18,6 +18,7 @@ declare class ConfigHandler {
18
18
  _config: {
19
19
  DEFAULT_UNMUTED_VOLUME: number;
20
20
  DEFAULT_REQUEST_TIMEOUT: number;
21
+ DEFAULT_CONNECTION_TIMEOUT: number;
21
22
  DEFAULT_TEXT_TRACK_MODE: "native" | "html";
22
23
  DEFAULT_ENABLE_FAST_SWITCHING: boolean;
23
24
  DELTA_POSITION_AFTER_RELOAD: {
@@ -1,4 +1,4 @@
1
- const BUFFER_WIDTH_IN_SECONDS = 10000;
1
+ const BUFFER_WIDTH_IN_SECONDS = 30 * 60;
2
2
  const COLORS = [
3
3
  "#2ab7ca",
4
4
  "#fed766",
@@ -65,11 +65,7 @@ export default class SegmentBufferGraph {
65
65
  let minimumPosition;
66
66
  let maximumPosition;
67
67
  if (maximumPoint - minimumPoint > BUFFER_WIDTH_IN_SECONDS) {
68
- if (currentTime === undefined) {
69
- minimumPosition = minimumPoint;
70
- maximumPosition = maximumPoint;
71
- }
72
- else if (maximumPoint - currentTime < BUFFER_WIDTH_IN_SECONDS / 2) {
68
+ if (maximumPoint - currentTime < BUFFER_WIDTH_IN_SECONDS / 2) {
73
69
  maximumPosition = maximumPoint;
74
70
  minimumPosition = maximumPoint - BUFFER_WIDTH_IN_SECONDS;
75
71
  }
@@ -141,23 +141,30 @@ export default function constructDebugGeneralInfo(instance, parentElt, cancelSig
141
141
  ]);
142
142
  adaptationsElt.appendChild(textAdaps);
143
143
  }
144
- const videoBitrates = (_c = (_b = instance.getVideoTrack()) === null || _b === void 0 ? void 0 : _b.representations.map(r => {
145
- return r.bitrate;
146
- }).filter(bitrate => bitrate !== undefined)) !== null && _c !== void 0 ? _c : [];
147
- const audioBitrates = (_e = (_d = instance.getAudioTrack()) === null || _d === void 0 ? void 0 : _d.representations.map(r => {
148
- return r.bitrate;
149
- }).filter(bitrate => bitrate !== undefined)) !== null && _e !== void 0 ? _e : [];
144
+ const adaptations = instance.__priv_getCurrentAdaptation();
145
+ const videoBitratesStr = (_c = (_b = adaptations === null || adaptations === void 0 ? void 0 : adaptations.video) === null || _b === void 0 ? void 0 : _b.representations.map((r) => {
146
+ var _a;
147
+ return String((_a = r.bitrate) !== null && _a !== void 0 ? _a : "N/A") +
148
+ (r.isSupported ? "" : " U!") +
149
+ (r.decipherable !== false ? "" : " E!");
150
+ })) !== null && _c !== void 0 ? _c : [];
151
+ const audioBitratesStr = (_e = (_d = adaptations === null || adaptations === void 0 ? void 0 : adaptations.video) === null || _d === void 0 ? void 0 : _d.representations.map((r) => {
152
+ var _a;
153
+ return String((_a = r.bitrate) !== null && _a !== void 0 ? _a : "N/A") +
154
+ (r.isSupported ? "" : " U!") +
155
+ (r.decipherable !== false ? "" : " E!");
156
+ })) !== null && _e !== void 0 ? _e : [];
150
157
  representationsElt.innerHTML = "";
151
- if (videoBitrates.length > 0) {
158
+ if (videoBitratesStr.length > 0) {
152
159
  representationsElt.appendChild(createMetricTitle("vb"));
153
160
  representationsElt.appendChild(createElement("span", {
154
- textContent: videoBitrates.join(" ") + " ",
161
+ textContent: videoBitratesStr.join(" ") + " ",
155
162
  }));
156
163
  }
157
- if (audioBitrates.length > 0) {
164
+ if (audioBitratesStr.length > 0) {
158
165
  representationsElt.appendChild(createMetricTitle("ab"));
159
166
  representationsElt.appendChild(createElement("span", {
160
- textContent: audioBitrates.join(" ") + " ",
167
+ textContent: audioBitratesStr.join(" ") + " ",
161
168
  }));
162
169
  }
163
170
  }
@@ -23,6 +23,8 @@ export type IParsedStartAtOption = {
23
23
  percentage: number;
24
24
  } | {
25
25
  fromLastPosition: number;
26
+ } | {
27
+ fromLivePosition: number;
26
28
  } | {
27
29
  fromFirstPosition: number;
28
30
  };
@@ -259,9 +259,8 @@ function parseLoadVideoOptions(options) {
259
259
  "an \"html\" textTrackMode. It will be ignored.");
260
260
  }
261
261
  if (!isNullOrUndefined(options.startAt)) {
262
- // TODO Better way to express that in TypeScript?
263
- if (options.startAt.wallClockTime
264
- instanceof Date) {
262
+ if ("wallClockTime" in options.startAt
263
+ && options.startAt.wallClockTime instanceof Date) {
265
264
  const wallClockTime = options.startAt
266
265
  .wallClockTime.getTime() / 1000;
267
266
  startAt = objectAssign({}, options.startAt, { wallClockTime });
@@ -557,6 +557,15 @@ declare class Player extends EventEmitter<IPublicAPIEvent> {
557
557
  * @returns {number}
558
558
  */
559
559
  getMinimumPosition(): number | null;
560
+ /**
561
+ * Returns the current position for live contents.
562
+ *
563
+ * Returns `null` if no content is loaded or if the current loaded content is
564
+ * not considered as a live content.
565
+ * Returns `undefined` if that live position is currently unknown.
566
+ * @returns {number}
567
+ */
568
+ getLivePosition(): number | undefined | null;
560
569
  /**
561
570
  * Get maximum seek-able position.
562
571
  * @returns {number}
@@ -91,7 +91,7 @@ class Player extends EventEmitter {
91
91
  // Workaround to support Firefox autoplay on FF 42.
92
92
  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1194624
93
93
  videoElement.preload = "auto";
94
- this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023111400";
94
+ this.version = /* PLAYER_VERSION */ "4.0.0-dev.2023120600";
95
95
  this.log = log;
96
96
  this.state = "STOPPED";
97
97
  this.videoElement = videoElement;
@@ -250,7 +250,7 @@ class Player extends EventEmitter {
250
250
  * @param {Object} options
251
251
  */
252
252
  _priv_initializeContentPlayback(options) {
253
- var _a, _b, _c, _d;
253
+ var _a, _b, _c, _d, _e, _f;
254
254
  const { autoPlay, defaultAudioTrackSwitchingMode, enableFastSwitching, initialManifest, keySystems, lowLatencyMode, minimumManifestUpdateInterval, requestConfig, onCodecSwitch, startAt, transport, checkMediaSegmentIntegrity, manifestLoader, referenceDateTime, representationFilter, segmentLoader, serverSyncInfos, __priv_manifestUpdateUrl, __priv_patchLastSegmentInSidx, url } = options;
255
255
  // Perform multiple checks on the given options
256
256
  if (this.videoElement === null) {
@@ -286,6 +286,7 @@ class Player extends EventEmitter {
286
286
  const manifestRequestSettings = { lowLatencyMode,
287
287
  maxRetry: (_a = requestConfig.manifest) === null || _a === void 0 ? void 0 : _a.maxRetry,
288
288
  requestTimeout: (_b = requestConfig.manifest) === null || _b === void 0 ? void 0 : _b.timeout,
289
+ connectionTimeout: (_c = requestConfig.manifest) === null || _c === void 0 ? void 0 : _c.connectionTimeout,
289
290
  minimumManifestUpdateInterval,
290
291
  initialManifest };
291
292
  const relyOnVideoVisibilityAndSize = canRelyOnVideoVisibilityAndSize();
@@ -332,8 +333,9 @@ class Player extends EventEmitter {
332
333
  const bufferOptions = objectAssign({ enableFastSwitching,
333
334
  onCodecSwitch }, this._priv_bufferOptions);
334
335
  const segmentRequestOptions = { lowLatencyMode,
335
- maxRetry: (_c = requestConfig.segment) === null || _c === void 0 ? void 0 : _c.maxRetry,
336
- requestTimeout: (_d = requestConfig.segment) === null || _d === void 0 ? void 0 : _d.timeout };
336
+ maxRetry: (_d = requestConfig.segment) === null || _d === void 0 ? void 0 : _d.maxRetry,
337
+ requestTimeout: (_e = requestConfig.segment) === null || _e === void 0 ? void 0 : _e.timeout,
338
+ connectionTimeout: (_f = requestConfig.segment) === null || _f === void 0 ? void 0 : _f.connectionTimeout };
337
339
  initializer = new features.mediaSourceInit({
338
340
  adaptiveOptions,
339
341
  autoPlay,
@@ -1462,6 +1464,27 @@ class Player extends EventEmitter {
1462
1464
  }
1463
1465
  return null;
1464
1466
  }
1467
+ /**
1468
+ * Returns the current position for live contents.
1469
+ *
1470
+ * Returns `null` if no content is loaded or if the current loaded content is
1471
+ * not considered as a live content.
1472
+ * Returns `undefined` if that live position is currently unknown.
1473
+ * @returns {number}
1474
+ */
1475
+ getLivePosition() {
1476
+ if (this._priv_contentInfos === null) {
1477
+ return null;
1478
+ }
1479
+ const { isDirectFile, manifest } = this._priv_contentInfos;
1480
+ if (isDirectFile) {
1481
+ return undefined;
1482
+ }
1483
+ if ((manifest === null || manifest === void 0 ? void 0 : manifest.isLive) !== true) {
1484
+ return null;
1485
+ }
1486
+ return manifest.getLivePosition();
1487
+ }
1465
1488
  /**
1466
1489
  * Get maximum seek-able position.
1467
1490
  * @returns {number}
@@ -1506,9 +1529,11 @@ class Player extends EventEmitter {
1506
1529
  }
1507
1530
  const segmentBufferStatus = this._priv_contentInfos
1508
1531
  .segmentBuffersStore.getStatus(bufferType);
1509
- return segmentBufferStatus.type === "initialized" ?
1510
- segmentBufferStatus.value.getInventory() :
1511
- null;
1532
+ if (segmentBufferStatus.type === "initialized") {
1533
+ segmentBufferStatus.value.synchronizeInventory();
1534
+ return segmentBufferStatus.value.getInventory();
1535
+ }
1536
+ return null;
1512
1537
  }
1513
1538
  /**
1514
1539
  * /!\ For tools use only! Do not touch!
@@ -2107,5 +2132,5 @@ class Player extends EventEmitter {
2107
2132
  }
2108
2133
  }
2109
2134
  }
2110
- Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023111400";
2135
+ Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023120600";
2111
2136
  export default Player;
@@ -171,6 +171,12 @@ export interface IManifestFetcherSettings {
171
171
  * `undefined` will lead to a default, large, timeout being used.
172
172
  */
173
173
  requestTimeout: number | undefined;
174
+ /**
175
+ * Connection timeout, in milliseconds, after which the request is canceled
176
+ * if the responses headers has not being received.
177
+ * Do not set or set to "undefined" to disable it.
178
+ */
179
+ connectionTimeout: number | undefined;
174
180
  /** Limit the frequency of Manifest updates. */
175
181
  minimumManifestUpdateInterval: number;
176
182
  /**
@@ -18,7 +18,6 @@ import { formatError } from "../../../errors";
18
18
  import log from "../../../log";
19
19
  import Manifest from "../../../manifest";
20
20
  import EventEmitter from "../../../utils/event_emitter";
21
- import isNullOrUndefined from "../../../utils/is_null_or_undefined";
22
21
  import getMonotonicTimeStamp from "../../../utils/monotonic_timestamp";
23
22
  import noop from "../../../utils/noop";
24
23
  import TaskCanceller from "../../../utils/task_canceller";
@@ -157,13 +156,22 @@ export default class ManifestFetcher extends EventEmitter {
157
156
  */
158
157
  function callLoaderWithRetries(manifestUrl) {
159
158
  const { loadManifest } = pipelines;
160
- let requestTimeout = isNullOrUndefined(settings.requestTimeout) ?
159
+ let requestTimeout = (settings.requestTimeout === undefined) ?
161
160
  config.getCurrent().DEFAULT_REQUEST_TIMEOUT :
162
161
  settings.requestTimeout;
162
+ let connectionTimeout = (settings.connectionTimeout === undefined) ?
163
+ config.getCurrent().DEFAULT_CONNECTION_TIMEOUT :
164
+ settings.connectionTimeout;
163
165
  if (requestTimeout < 0) {
164
166
  requestTimeout = undefined;
165
167
  }
166
- const callLoader = () => loadManifest(manifestUrl, { timeout: requestTimeout }, cancelSignal);
168
+ if (connectionTimeout < 0) {
169
+ connectionTimeout = undefined;
170
+ }
171
+ const callLoader = () => loadManifest(manifestUrl, {
172
+ timeout: requestTimeout,
173
+ connectionTimeout,
174
+ }, cancelSignal);
167
175
  return scheduleRequestPromise(callLoader, backoffSettings, cancelSignal);
168
176
  }
169
177
  }
@@ -135,14 +135,21 @@ export interface ISegmentFetcherOptions {
135
135
  * To set to `-1` for no timeout.
136
136
  */
137
137
  requestTimeout: number;
138
+ /**
139
+ * Connection timeout, in milliseconds, after which the request is canceled
140
+ * if the responses headers has not being received.
141
+ * Do not set or set to "undefined" to disable it.
142
+ */
143
+ connectionTimeout: number | undefined;
138
144
  }
139
145
  /**
140
146
  * @param {string} bufferType
141
147
  * @param {Object}
142
148
  * @returns {Object}
143
149
  */
144
- export declare function getSegmentFetcherOptions({ maxRetry, lowLatencyMode, requestTimeout }: {
150
+ export declare function getSegmentFetcherOptions({ maxRetry, lowLatencyMode, requestTimeout, connectionTimeout }: {
145
151
  maxRetry?: number | undefined;
146
152
  requestTimeout?: number | undefined;
153
+ connectionTimeout?: number | undefined;
147
154
  lowLatencyMode: boolean;
148
155
  }): ISegmentFetcherOptions;
@@ -56,6 +56,8 @@ export default function createSegmentFetcher(bufferType, pipeline, cdnPrioritize
56
56
  const requestOptions = {
57
57
  timeout: options.requestTimeout < 0 ? undefined :
58
58
  options.requestTimeout,
59
+ connectionTimeout: options.connectionTimeout === undefined ? undefined :
60
+ options.connectionTimeout < 0 ? undefined : options.connectionTimeout,
59
61
  };
60
62
  /**
61
63
  * Cache audio and video initialization segments.
@@ -283,13 +285,15 @@ export default function createSegmentFetcher(bufferType, pipeline, cdnPrioritize
283
285
  * @param {Object}
284
286
  * @returns {Object}
285
287
  */
286
- export function getSegmentFetcherOptions({ maxRetry, lowLatencyMode, requestTimeout }) {
287
- const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR, DEFAULT_REQUEST_TIMEOUT, INITIAL_BACKOFF_DELAY_BASE, MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
288
+ export function getSegmentFetcherOptions({ maxRetry, lowLatencyMode, requestTimeout, connectionTimeout }) {
289
+ const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR, DEFAULT_REQUEST_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT, INITIAL_BACKOFF_DELAY_BASE, MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
288
290
  return { maxRetry: maxRetry !== null && maxRetry !== void 0 ? maxRetry : DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
289
291
  baseDelay: lowLatencyMode ? INITIAL_BACKOFF_DELAY_BASE.LOW_LATENCY :
290
292
  INITIAL_BACKOFF_DELAY_BASE.REGULAR,
291
293
  maxDelay: lowLatencyMode ? MAX_BACKOFF_DELAY_BASE.LOW_LATENCY :
292
294
  MAX_BACKOFF_DELAY_BASE.REGULAR,
293
- requestTimeout: isNullOrUndefined(requestTimeout) ? DEFAULT_REQUEST_TIMEOUT :
294
- requestTimeout };
295
+ requestTimeout: (requestTimeout === undefined) ? DEFAULT_REQUEST_TIMEOUT :
296
+ requestTimeout,
297
+ connectionTimeout: (connectionTimeout === undefined) ?
298
+ DEFAULT_CONNECTION_TIMEOUT : connectionTimeout, };
295
299
  }
@@ -74,4 +74,5 @@ export interface ISegmentFetcherCreatorBackoffOptions {
74
74
  * `undefined` will lead to a default, large, timeout being used.
75
75
  */
76
76
  requestTimeout: number | undefined;
77
+ connectionTimeout: number | undefined;
77
78
  }
@@ -287,7 +287,7 @@ export async function scheduleRequestWithCdns(cdns, cdnPrioritizer, performReque
287
287
  * attempts already done for that resource.
288
288
  *
289
289
  * Returns `undefined` if there's no Cdn left to request the resource.
290
- * @param {Array.<Object>}
290
+ * @param {Array.<Object>} sortedCdns
291
291
  * @returns {Object|undefined}
292
292
  */
293
293
  function getPrioritaryRequestableCdnFromSortedList(sortedCdns) {
@@ -20,6 +20,7 @@
20
20
  import { clearElementSrc } from "../../compat";
21
21
  import log from "../../log";
22
22
  import assert from "../../utils/assert";
23
+ import isNullOrUndefined from "../../utils/is_null_or_undefined";
23
24
  import SharedReference from "../../utils/reference";
24
25
  import TaskCanceller from "../../utils/task_canceller";
25
26
  import { ContentInitializer } from "./types";
@@ -174,10 +175,10 @@ export default class DirectFileContentInitializer extends ContentInitializer {
174
175
  * @returns {number}
175
176
  */
176
177
  function getDirectFileInitialTime(mediaElement, startAt) {
177
- if (startAt == null) {
178
+ if (isNullOrUndefined(startAt)) {
178
179
  return 0;
179
180
  }
180
- if (startAt.position != null) {
181
+ if (!isNullOrUndefined(startAt.position)) {
181
182
  return startAt.position;
182
183
  }
183
184
  else if (startAt.wallClockTime != null) {
@@ -187,15 +188,31 @@ function getDirectFileInitialTime(mediaElement, startAt) {
187
188
  return startAt.fromFirstPosition;
188
189
  }
189
190
  const duration = mediaElement.duration;
190
- if (duration == null || !isFinite(duration)) {
191
- log.warn("startAt.fromLastPosition set but no known duration, " +
192
- "beginning at 0.");
193
- return 0;
194
- }
195
191
  if (typeof startAt.fromLastPosition === "number") {
192
+ if (isNullOrUndefined(duration) || !isFinite(duration)) {
193
+ log.warn("startAt.fromLastPosition set but no known duration, " +
194
+ "beginning at 0.");
195
+ return 0;
196
+ }
196
197
  return Math.max(0, duration + startAt.fromLastPosition);
197
198
  }
199
+ else if (typeof startAt.fromLivePosition === "number") {
200
+ const livePosition = mediaElement.seekable.length > 0 ?
201
+ mediaElement.seekable.end(0) :
202
+ duration;
203
+ if (isNullOrUndefined(livePosition)) {
204
+ log.warn("startAt.fromLivePosition set but no known live position, " +
205
+ "beginning at 0.");
206
+ return 0;
207
+ }
208
+ return Math.max(0, livePosition + startAt.fromLivePosition);
209
+ }
198
210
  else if (startAt.percentage != null) {
211
+ if (isNullOrUndefined(duration) || !isFinite(duration)) {
212
+ log.warn("startAt.percentage set but no known duration, " +
213
+ "beginning at 0.");
214
+ return 0;
215
+ }
199
216
  const { percentage } = startAt;
200
217
  if (percentage >= 100) {
201
218
  return duration;
@@ -160,6 +160,12 @@ export interface IInitializeArguments {
160
160
  * `-1` indicates no timeout.
161
161
  */
162
162
  requestTimeout: number | undefined;
163
+ /**
164
+ * Amount of time, in milliseconds, after which a request that hasn't receive
165
+ * the headers and status code should be aborted and optionnaly retried,
166
+ * depending on the maxRetry configuration.
167
+ */
168
+ connectionTimeout: number | undefined;
163
169
  /** Maximum number of time a request on error will be retried. */
164
170
  maxRetry: number | undefined;
165
171
  };
@@ -359,7 +359,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
359
359
  if (
360
360
  // Data is buffered around the current position
361
361
  obs.currentRange !== null ||
362
- // Or, for whatever reason, playback is already advancing
362
+ // Or, for whatever reason, we have no buffer but we're already advancing
363
363
  obs.position > seekedTime + 0.1) {
364
364
  stopListening();
365
365
  playbackObserver.setCurrentTime(obs.position + 0.001);
@@ -512,9 +512,7 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
512
512
  contentTimeBoundariesObserver.addEventListener("periodChange", (period) => {
513
513
  this.trigger("activePeriodChanged", { period });
514
514
  });
515
- contentTimeBoundariesObserver.addEventListener("durationUpdate", (newDuration) => {
516
- mediaSourceDurationUpdater.updateDuration(newDuration.duration, newDuration.isEnd);
517
- });
515
+ contentTimeBoundariesObserver.addEventListener("endingPositionChange", (x) => mediaSourceDurationUpdater.updateDuration(x.endingPosition, x.isEnd));
518
516
  contentTimeBoundariesObserver.addEventListener("endOfStream", () => {
519
517
  if (endOfStreamCanceller === null) {
520
518
  endOfStreamCanceller = new TaskCanceller();
@@ -530,8 +528,8 @@ export default class MediaSourceContentInitializer extends ContentInitializer {
530
528
  endOfStreamCanceller = null;
531
529
  }
532
530
  });
533
- const currentDuration = contentTimeBoundariesObserver.getCurrentDuration();
534
- mediaSourceDurationUpdater.updateDuration(currentDuration.duration, currentDuration.isEnd);
531
+ const endInfo = contentTimeBoundariesObserver.getCurrentEndingTime();
532
+ mediaSourceDurationUpdater.updateDuration(endInfo.endingPosition, endInfo.isEnd);
535
533
  return contentTimeBoundariesObserver;
536
534
  }
537
535
  /**
@@ -22,8 +22,8 @@ import { IStreamOrchestratorPlaybackObservation } from "../../stream";
22
22
  /**
23
23
  * Observes what's being played and take care of media events relating to time
24
24
  * boundaries:
25
- * - Emits a `durationUpdate` when the duration of the current content is
26
- * known and every time it changes.
25
+ * - Emits a `endingPositionChange` when the known maximum playable position
26
+ * of the current content is known and every time it changes.
27
27
  * - Emits `endOfStream` API once segments have been pushed until the end and
28
28
  * `resumeStream` if downloads starts back.
29
29
  * - Emits a `periodChange` event when the currently-playing Period seemed to
@@ -56,10 +56,11 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
56
56
  */
57
57
  constructor(manifest: Manifest, playbackObserver: IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>, bufferTypes: IBufferType[]);
58
58
  /**
59
- * Returns an estimate of the current duration of the content.
59
+ * Returns an estimate of the current last position which may be played in
60
+ * the content at the moment.
60
61
  * @returns {Object}
61
62
  */
62
- getCurrentDuration(): IDurationItem;
63
+ getCurrentEndingTime(): IEndingPositionInformation;
63
64
  /**
64
65
  * Method to call any time an Adaptation has been selected.
65
66
  *
@@ -126,20 +127,20 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
126
127
  private _addActivelyLoadedPeriod;
127
128
  private _removeActivelyLoadedPeriod;
128
129
  private _checkCurrentPeriod;
129
- private _getManifestDuration;
130
+ private _getManifestEndTime;
130
131
  private _lazilyCreateActiveStreamInfo;
131
132
  private _checkEndOfStream;
132
133
  }
133
- export interface IDurationItem {
134
+ export interface IEndingPositionInformation {
134
135
  /**
135
136
  * The new maximum known position (note that this is the ending position
136
137
  * currently known of the current content, it might be superior to the last
137
138
  * position at which segments are available and it might also evolve over
138
139
  * time), in seconds.
139
140
  */
140
- duration: number;
141
+ endingPosition: number;
141
142
  /**
142
- * If `true`, the communicated `duration` is the actual end of the content.
143
+ * If `true`, the communicated `endingPosition` is the actual end of the content.
143
144
  * It may still be updated due to a track change or to add precision, but it
144
145
  * is still a (rough) estimate of the maximum position that content should
145
146
  * have.
@@ -147,7 +148,7 @@ export interface IDurationItem {
147
148
  * If `false`, this is the currently known maximum position associated to
148
149
  * the content, but the content is still evolving (typically, new media
149
150
  * segments are still being generated) and as such it can still have a
150
- * longer duration in the future.
151
+ * longer `endingPosition` in the future.
151
152
  */
152
153
  isEnd: boolean;
153
154
  }
@@ -161,10 +162,10 @@ export interface IContentTimeBoundariesObserverEvent {
161
162
  /** Triggered when a new `Period` is currently playing. */
162
163
  periodChange: Period;
163
164
  /**
164
- * Triggered when the duration of the currently-playing content became known
165
- * or changed.
165
+ * Triggered when the ending position of the currently-playing content became
166
+ * known or changed.
166
167
  */
167
- durationUpdate: IDurationItem;
168
+ endingPositionChange: IEndingPositionInformation;
168
169
  /**
169
170
  * Triggered when the last possible chronological segment for all types of
170
171
  * buffers has either been pushed or is being pushed to the corresponding
@@ -21,8 +21,8 @@ import TaskCanceller from "../../../utils/task_canceller";
21
21
  /**
22
22
  * Observes what's being played and take care of media events relating to time
23
23
  * boundaries:
24
- * - Emits a `durationUpdate` when the duration of the current content is
25
- * known and every time it changes.
24
+ * - Emits a `endingPositionChange` when the known maximum playable position
25
+ * of the current content is known and every time it changes.
26
26
  * - Emits `endOfStream` API once segments have been pushed until the end and
27
27
  * `resumeStream` if downloads starts back.
28
28
  * - Emits a `periodChange` event when the currently-playing Period seemed to
@@ -65,7 +65,7 @@ export default class ContentTimeBoundariesObserver extends EventEmitter {
65
65
  }
66
66
  }, { includeLastObservation: true, clearSignal: cancelSignal });
67
67
  manifest.addEventListener("manifestUpdate", () => {
68
- this.trigger("durationUpdate", this._getManifestDuration());
68
+ this.trigger("endingPositionChange", this._getManifestEndTime());
69
69
  if (cancelSignal.isCancelled()) {
70
70
  return;
71
71
  }
@@ -73,11 +73,12 @@ export default class ContentTimeBoundariesObserver extends EventEmitter {
73
73
  }, cancelSignal);
74
74
  }
75
75
  /**
76
- * Returns an estimate of the current duration of the content.
76
+ * Returns an estimate of the current last position which may be played in
77
+ * the content at the moment.
77
78
  * @returns {Object}
78
79
  */
79
- getCurrentDuration() {
80
- return this._getManifestDuration();
80
+ getCurrentEndingTime() {
81
+ return this._getManifestEndTime();
81
82
  }
82
83
  /**
83
84
  * Method to call any time an Adaptation has been selected.
@@ -106,12 +107,13 @@ export default class ContentTimeBoundariesObserver extends EventEmitter {
106
107
  .updateLastVideoAdaptation(adaptation);
107
108
  }
108
109
  const endingPosition = this._maximumPositionCalculator.getEndingPosition();
109
- const newDuration = endingPosition !== undefined ?
110
+ const newEndingPosition = endingPosition !== undefined ?
110
111
  { isEnd: true,
111
- duration: endingPosition } :
112
+ endingPosition } :
112
113
  { isEnd: false,
113
- duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
114
- this.trigger("durationUpdate", newDuration);
114
+ endingPosition: this._maximumPositionCalculator
115
+ .getMaximumAvailablePosition() };
116
+ this.trigger("endingPositionChange", newEndingPosition);
115
117
  }
116
118
  }
117
119
  }
@@ -238,13 +240,13 @@ export default class ContentTimeBoundariesObserver extends EventEmitter {
238
240
  }
239
241
  }
240
242
  }
241
- _getManifestDuration() {
243
+ _getManifestEndTime() {
242
244
  const endingPosition = this._maximumPositionCalculator.getEndingPosition();
243
245
  return endingPosition !== undefined ?
244
246
  { isEnd: true,
245
- duration: endingPosition } :
247
+ endingPosition } :
246
248
  { isEnd: false,
247
- duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
249
+ endingPosition: this._maximumPositionCalculator.getMaximumAvailablePosition() };
248
250
  }
249
251
  _lazilyCreateActiveStreamInfo(bufferType) {
250
252
  let streamInfo = this._activeStreams.get(bufferType);
@@ -315,9 +317,8 @@ class MaximumPositionCalculator {
315
317
  * @returns {number}
316
318
  */
317
319
  getMaximumAvailablePosition() {
318
- var _a;
319
320
  if (this._manifest.isDynamic) {
320
- return (_a = this._manifest.getLivePosition()) !== null && _a !== void 0 ? _a : this._manifest.getMaximumSafePosition();
321
+ return this._manifest.getMaximumSafePosition();
321
322
  }
322
323
  if (this._lastVideoAdaptation === undefined ||
323
324
  this._lastAudioAdaptation === undefined) {
@@ -37,11 +37,25 @@ export interface IInitialTimeOptions {
37
37
  */
38
38
  fromFirstPosition?: number | null | undefined;
39
39
  /**
40
- * If set, we should begin at this position relative to the content's end,
41
- * in seconds.
40
+ * If set, we should begin at this position relative to the content's maximum
41
+ * seekable position, in seconds.
42
+ *
43
+ * It should consequently in most cases be a negative value.
42
44
  */
43
45
  fromLastPosition?: number | null | undefined;
44
- /** If set, we should begin at this position relative to the whole duration of
46
+ /**
47
+ * If set, we should begin at this position relative to the content's live
48
+ * edge if it makes sense, in seconds.
49
+ *
50
+ * It should consequently in most cases be a negative value.
51
+ *
52
+ * If the live edge is unknown or if it does not make sense for the current
53
+ * content, that position is relative to the content's maximum position
54
+ * instead.
55
+ */
56
+ fromLivePosition?: number | null | undefined;
57
+ /**
58
+ * If set, we should begin at this position relative to the whole duration of
45
59
  * the content, in percentage.
46
60
  */
47
61
  percentage?: number | null | undefined;