rx-player 4.0.0-dev.2023110700 → 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 (479) hide show
  1. package/CHANGELOG.md +18 -226
  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 +14 -35
  21. package/dist/_esm5.processed/core/api/option_utils.js +47 -230
  22. package/dist/_esm5.processed/core/api/public_api.d.ts +92 -266
  23. package/dist/_esm5.processed/core/api/public_api.js +451 -807
  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/html/text_track_cues_store.js +54 -6
  55. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
  56. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.js +19 -2
  57. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +1 -2
  58. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +2 -3
  59. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +2 -2
  60. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  61. package/dist/_esm5.processed/core/segment_buffers/index.js +2 -1
  62. package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +1 -0
  63. package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +1 -0
  64. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.d.ts +33 -0
  65. package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +49 -0
  66. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.d.ts +0 -1
  67. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +2 -16
  68. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +0 -15
  69. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +183 -93
  70. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.d.ts +39 -0
  71. package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +133 -0
  72. package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +27 -13
  73. package/dist/_esm5.processed/core/stream/index.d.ts +2 -3
  74. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +2 -0
  75. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +5 -7
  76. package/dist/_esm5.processed/core/stream/period/period_stream.js +13 -12
  77. package/dist/_esm5.processed/core/stream/period/types.d.ts +5 -14
  78. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +2 -4
  79. package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +10 -46
  80. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +29 -23
  81. package/dist/_esm5.processed/core/stream/representation/types.d.ts +11 -1
  82. package/dist/_esm5.processed/default_config.d.ts +35 -98
  83. package/dist/_esm5.processed/default_config.js +36 -113
  84. package/dist/_esm5.processed/errors/custom_loader_error.d.ts +1 -3
  85. package/dist/_esm5.processed/errors/custom_loader_error.js +1 -3
  86. package/dist/_esm5.processed/errors/media_error.js +2 -2
  87. package/dist/_esm5.processed/errors/network_error.d.ts +0 -1
  88. package/dist/_esm5.processed/errors/network_error.js +0 -1
  89. package/dist/_esm5.processed/errors/request_error.d.ts +2 -3
  90. package/dist/_esm5.processed/errors/request_error.js +2 -5
  91. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -3
  92. package/dist/_esm5.processed/features/features_object.js +0 -2
  93. package/dist/_esm5.processed/features/list/directfile.js +2 -5
  94. package/dist/_esm5.processed/features/list/index.d.ts +0 -2
  95. package/dist/_esm5.processed/features/list/index.js +0 -2
  96. package/dist/_esm5.processed/features/types.d.ts +3 -27
  97. package/dist/_esm5.processed/manifest/adaptation.d.ts +9 -11
  98. package/dist/_esm5.processed/manifest/adaptation.js +41 -30
  99. package/dist/_esm5.processed/manifest/index.d.ts +3 -4
  100. package/dist/_esm5.processed/manifest/manifest.d.ts +5 -54
  101. package/dist/_esm5.processed/manifest/manifest.js +5 -110
  102. package/dist/_esm5.processed/manifest/period.d.ts +4 -5
  103. package/dist/_esm5.processed/manifest/representation.d.ts +10 -5
  104. package/dist/_esm5.processed/manifest/representation.js +33 -10
  105. package/dist/_esm5.processed/manifest/representation_index/index.d.ts +2 -2
  106. package/dist/_esm5.processed/manifest/representation_index/static.d.ts +2 -0
  107. package/dist/_esm5.processed/manifest/representation_index/static.js +6 -0
  108. package/dist/_esm5.processed/manifest/representation_index/types.d.ts +42 -21
  109. package/dist/_esm5.processed/manifest/types.d.ts +0 -2
  110. package/dist/_esm5.processed/parsers/manifest/dash/common/convert_supplemental_codecs.d.ts +17 -0
  111. package/dist/_esm5.processed/parsers/manifest/dash/common/convert_supplemental_codecs.js +26 -0
  112. package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
  113. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +17 -31
  114. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +26 -19
  115. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +2 -0
  116. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +7 -1
  117. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +2 -6
  118. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +11 -8
  119. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +2 -0
  120. package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +6 -0
  121. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
  122. package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +1 -6
  123. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +3 -5
  124. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +0 -2
  125. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -1
  126. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +2 -2
  127. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +0 -2
  128. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +2 -2
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +29 -17
  130. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +13 -6
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +7 -2
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.d.ts +10 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +18 -2
  134. package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +6 -4
  135. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +7 -6
  136. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +5 -2
  137. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  138. package/dist/_esm5.processed/parsers/manifest/local/representation_index.d.ts +2 -0
  139. package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +6 -0
  140. package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +6 -6
  141. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.d.ts +12 -3
  142. package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +11 -2
  143. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +0 -1
  144. package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +11 -17
  145. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +21 -83
  146. package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +53 -125
  147. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.d.ts +119 -0
  148. package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +159 -0
  149. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.d.ts +3 -6
  150. package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +4 -4
  151. package/dist/_esm5.processed/parsers/manifest/types.d.ts +4 -3
  152. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
  153. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
  154. package/dist/_esm5.processed/public_types.d.ts +396 -308
  155. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.d.ts +5 -4
  156. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +5 -4
  157. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +4 -4
  158. package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
  159. package/dist/_esm5.processed/transports/dash/pipelines.js +1 -4
  160. package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
  161. package/dist/_esm5.processed/transports/dash/segment_loader.js +26 -20
  162. package/dist/_esm5.processed/transports/dash/segment_parser.js +19 -24
  163. package/dist/_esm5.processed/transports/dash/text_loader.js +5 -5
  164. package/dist/_esm5.processed/transports/dash/text_parser.js +28 -33
  165. package/dist/_esm5.processed/transports/local/pipelines.js +1 -10
  166. package/dist/_esm5.processed/transports/local/segment_loader.js +2 -2
  167. package/dist/_esm5.processed/transports/local/segment_parser.d.ts +1 -1
  168. package/dist/_esm5.processed/transports/local/segment_parser.js +10 -10
  169. package/dist/_esm5.processed/transports/local/text_parser.d.ts +2 -2
  170. package/dist/_esm5.processed/transports/local/text_parser.js +23 -23
  171. package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +34 -52
  172. package/dist/_esm5.processed/{utils/list_to_map.d.ts → transports/smooth/is_mp4_embedded_track.d.ts} +5 -5
  173. package/dist/_esm5.processed/{features/list/image_buffer.d.ts → transports/smooth/is_mp4_embedded_track.js} +7 -6
  174. package/dist/_esm5.processed/transports/smooth/pipelines.js +33 -190
  175. package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +1 -1
  176. package/dist/_esm5.processed/transports/smooth/segment_loader.js +28 -22
  177. package/dist/_esm5.processed/transports/smooth/utils.d.ts +1 -26
  178. package/dist/_esm5.processed/transports/smooth/utils.js +1 -55
  179. package/dist/_esm5.processed/transports/types.d.ts +94 -89
  180. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  181. package/dist/_esm5.processed/transports/utils/infer_segment_container.d.ts +3 -3
  182. package/dist/_esm5.processed/transports/utils/infer_segment_container.js +5 -7
  183. package/dist/_esm5.processed/transports/utils/parse_text_track.d.ts +8 -12
  184. package/dist/_esm5.processed/transports/utils/parse_text_track.js +19 -21
  185. package/dist/_esm5.processed/utils/array_includes.d.ts +2 -1
  186. package/dist/_esm5.processed/utils/array_includes.js +30 -28
  187. package/dist/_esm5.processed/utils/request/xhr.js +5 -5
  188. package/dist/commonjs/compat/is_codec_supported.js +22 -1
  189. package/dist/commonjs/compat/patch_webkit_source_buffer.js +2 -2
  190. package/dist/commonjs/config.d.ts +1 -0
  191. package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
  192. package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
  193. package/dist/commonjs/core/api/option_utils.d.ts +4 -0
  194. package/dist/commonjs/core/api/option_utils.js +8 -3
  195. package/dist/commonjs/core/api/public_api.d.ts +11 -1
  196. package/dist/commonjs/core/api/public_api.js +46 -11
  197. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  198. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
  199. package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  200. package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
  201. package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  202. package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
  203. package/dist/commonjs/core/init/directfile_content_initializer.js +24 -7
  204. package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
  205. package/dist/commonjs/core/init/media_source_content_initializer.js +4 -6
  206. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  207. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +16 -17
  208. package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
  209. package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
  210. package/dist/commonjs/core/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
  211. package/dist/commonjs/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
  212. package/dist/commonjs/core/segment_buffers/implementations/text/html/utils.js +19 -2
  213. package/dist/commonjs/core/stream/adaptation/adaptation_stream.js +2 -2
  214. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +3 -3
  215. package/dist/commonjs/core/stream/period/period_stream.js +2 -2
  216. package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +3 -3
  217. package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
  218. package/dist/commonjs/default_config.d.ts +5 -0
  219. package/dist/commonjs/default_config.js +5 -0
  220. package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  221. package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  222. package/dist/commonjs/manifest/representation.js +18 -5
  223. package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
  224. package/dist/commonjs/manifest/representation_index/static.js +2 -2
  225. package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
  226. package/dist/commonjs/parsers/manifest/dash/common/convert_supplemental_codecs.d.ts +17 -0
  227. package/dist/commonjs/parsers/manifest/dash/common/convert_supplemental_codecs.js +30 -0
  228. package/dist/commonjs/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
  229. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  230. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
  231. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  232. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  233. package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  234. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  235. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
  236. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  237. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
  238. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  239. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  240. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
  241. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  242. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  243. package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
  244. package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
  245. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  246. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
  247. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  248. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
  249. package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +36 -20
  250. package/dist/commonjs/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +3 -0
  251. package/dist/commonjs/parsers/manifest/dash/js-parser/node_parsers/Representation.js +3 -0
  252. package/dist/commonjs/parsers/manifest/dash/node_parser_types.d.ts +2 -0
  253. package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +4 -0
  254. package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +4 -0
  255. package/dist/commonjs/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  256. package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
  257. package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
  258. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  259. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
  260. package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
  261. package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
  262. package/dist/commonjs/parsers/manifest/types.d.ts +1 -0
  263. package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
  264. package/dist/commonjs/public_types.d.ts +78 -34
  265. package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
  266. package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
  267. package/dist/commonjs/transports/dash/segment_loader.js +2 -1
  268. package/dist/commonjs/transports/dash/text_loader.js +2 -0
  269. package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
  270. package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
  271. package/dist/commonjs/transports/smooth/pipelines.js +4 -2
  272. package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
  273. package/dist/commonjs/transports/types.d.ts +12 -0
  274. package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
  275. package/dist/commonjs/utils/queue_microtask.d.ts +2 -0
  276. package/dist/commonjs/utils/queue_microtask.js +7 -0
  277. package/dist/commonjs/utils/request/fetch.d.ts +6 -0
  278. package/dist/commonjs/utils/request/fetch.js +29 -8
  279. package/dist/commonjs/utils/request/xhr.d.ts +11 -5
  280. package/dist/commonjs/utils/request/xhr.js +29 -8
  281. package/dist/es2017/compat/is_codec_supported.js +22 -1
  282. package/dist/es2017/compat/patch_webkit_source_buffer.js +2 -2
  283. package/dist/es2017/config.d.ts +1 -0
  284. package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
  285. package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
  286. package/dist/es2017/core/api/option_utils.d.ts +4 -0
  287. package/dist/es2017/core/api/option_utils.js +8 -3
  288. package/dist/es2017/core/api/public_api.d.ts +11 -1
  289. package/dist/es2017/core/api/public_api.js +44 -9
  290. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  291. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
  292. package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  293. package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
  294. package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  295. package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
  296. package/dist/es2017/core/init/directfile_content_initializer.js +24 -7
  297. package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
  298. package/dist/es2017/core/init/media_source_content_initializer.js +4 -6
  299. package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  300. package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +16 -15
  301. package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
  302. package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
  303. package/dist/es2017/core/segment_buffers/implementations/text/html/text_track_cues_store.js +54 -6
  304. package/dist/es2017/core/segment_buffers/implementations/text/html/utils.d.ts +2 -1
  305. package/dist/es2017/core/segment_buffers/implementations/text/html/utils.js +18 -2
  306. package/dist/es2017/core/stream/adaptation/adaptation_stream.js +2 -2
  307. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +3 -3
  308. package/dist/es2017/core/stream/period/period_stream.js +2 -2
  309. package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +3 -3
  310. package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
  311. package/dist/es2017/default_config.d.ts +5 -0
  312. package/dist/es2017/default_config.js +5 -0
  313. package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  314. package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  315. package/dist/es2017/manifest/representation.js +18 -5
  316. package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
  317. package/dist/es2017/manifest/representation_index/static.js +2 -2
  318. package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
  319. package/dist/es2017/parsers/manifest/dash/common/convert_supplemental_codecs.d.ts +17 -0
  320. package/dist/es2017/parsers/manifest/dash/common/convert_supplemental_codecs.js +26 -0
  321. package/dist/es2017/parsers/manifest/dash/common/flatten_overlapping_periods.js +5 -0
  322. package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  323. package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
  324. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  325. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  326. package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  327. package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  328. package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
  329. package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  330. package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
  331. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  332. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  333. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
  334. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  335. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  336. package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
  337. package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
  338. package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  339. package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
  340. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  341. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
  342. package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +36 -20
  343. package/dist/es2017/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +3 -0
  344. package/dist/es2017/parsers/manifest/dash/js-parser/node_parsers/Representation.js +3 -0
  345. package/dist/es2017/parsers/manifest/dash/node_parser_types.d.ts +2 -0
  346. package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +4 -0
  347. package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +4 -0
  348. package/dist/es2017/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
  349. package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
  350. package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
  351. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  352. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
  353. package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
  354. package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
  355. package/dist/es2017/parsers/manifest/types.d.ts +1 -0
  356. package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
  357. package/dist/es2017/public_types.d.ts +78 -34
  358. package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
  359. package/dist/es2017/transports/dash/manifest_parser.js +3 -0
  360. package/dist/es2017/transports/dash/segment_loader.js +1 -0
  361. package/dist/es2017/transports/dash/text_loader.js +2 -0
  362. package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
  363. package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
  364. package/dist/es2017/transports/smooth/pipelines.js +2 -0
  365. package/dist/es2017/transports/smooth/segment_loader.js +1 -0
  366. package/dist/es2017/transports/types.d.ts +12 -0
  367. package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
  368. package/dist/es2017/utils/queue_microtask.d.ts +2 -0
  369. package/dist/es2017/utils/queue_microtask.js +5 -0
  370. package/dist/es2017/utils/request/fetch.d.ts +6 -0
  371. package/dist/es2017/utils/request/fetch.js +29 -8
  372. package/dist/es2017/utils/request/xhr.d.ts +11 -5
  373. package/dist/es2017/utils/request/xhr.js +30 -9
  374. package/dist/mpd-parser.wasm +0 -0
  375. package/dist/rx-player.js +900 -492
  376. package/dist/rx-player.min.js +1 -1
  377. package/package.json +3 -7
  378. package/scripts/update-version +2 -0
  379. package/sonar-project.properties +1 -1
  380. package/src/compat/is_codec_supported.ts +23 -1
  381. package/src/compat/patch_webkit_source_buffer.ts +2 -2
  382. package/src/core/api/debug/buffer_graph.ts +2 -5
  383. package/src/core/api/debug/modules/general_info.ts +15 -10
  384. package/src/core/api/option_utils.ts +11 -3
  385. package/src/core/api/public_api.ts +48 -8
  386. package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
  387. package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
  388. package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
  389. package/src/core/fetchers/utils/schedule_request.ts +1 -1
  390. package/src/core/init/directfile_content_initializer.ts +23 -7
  391. package/src/core/init/media_source_content_initializer.ts +13 -7
  392. package/src/core/init/utils/content_time_boundaries_observer.ts +23 -22
  393. package/src/core/init/utils/get_initial_time.ts +25 -12
  394. package/src/core/segment_buffers/implementations/text/html/__tests__/utils.test.ts +15 -0
  395. package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +57 -6
  396. package/src/core/segment_buffers/implementations/text/html/utils.ts +19 -2
  397. package/src/core/stream/adaptation/adaptation_stream.ts +2 -2
  398. package/src/core/stream/orchestrator/stream_orchestrator.ts +3 -3
  399. package/src/core/stream/period/period_stream.ts +2 -2
  400. package/src/core/stream/representation/utils/get_buffer_status.ts +3 -3
  401. package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
  402. package/src/default_config.ts +5 -0
  403. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
  404. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
  405. package/src/manifest/representation.ts +19 -6
  406. package/src/manifest/representation_index/static.ts +2 -2
  407. package/src/manifest/representation_index/types.ts +4 -4
  408. package/src/parsers/manifest/dash/common/__tests__/convert_supplemental_codecs.test.ts +37 -0
  409. package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +20 -0
  410. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
  411. package/src/parsers/manifest/dash/common/convert_supplemental_codecs.ts +32 -0
  412. package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +5 -0
  413. package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
  414. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
  415. package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
  416. package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
  417. package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
  418. package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
  419. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
  420. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
  421. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
  422. package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
  423. package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
  424. package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
  425. package/src/parsers/manifest/dash/common/parse_representations.ts +39 -20
  426. package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +4 -0
  427. package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +4 -0
  428. package/src/parsers/manifest/dash/node_parser_types.ts +2 -0
  429. package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +2 -0
  430. package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +2 -0
  431. package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +4 -0
  432. package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +4 -0
  433. package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +2 -0
  434. package/src/parsers/manifest/local/representation_index.ts +3 -3
  435. package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
  436. package/src/parsers/manifest/smooth/representation_index.ts +23 -9
  437. package/src/parsers/manifest/types.ts +2 -0
  438. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
  439. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
  440. package/src/parsers/manifest/utils/index_helpers.ts +1 -1
  441. package/src/public_types.ts +79 -34
  442. package/src/transports/dash/init_segment_loader.ts +5 -0
  443. package/src/transports/dash/manifest_parser.ts +6 -0
  444. package/src/transports/dash/segment_loader.ts +1 -0
  445. package/src/transports/dash/text_loader.ts +2 -0
  446. package/src/transports/metaplaylist/manifest_loader.ts +1 -0
  447. package/src/transports/metaplaylist/pipelines.ts +4 -1
  448. package/src/transports/smooth/pipelines.ts +2 -0
  449. package/src/transports/smooth/segment_loader.ts +1 -0
  450. package/src/transports/types.ts +12 -0
  451. package/src/transports/utils/generate_manifest_loader.ts +3 -0
  452. package/src/utils/queue_microtask.ts +7 -0
  453. package/src/utils/request/fetch.ts +35 -8
  454. package/src/utils/request/xhr.ts +45 -14
  455. package/dist/_esm5.processed/compat/fullscreen.d.ts +0 -32
  456. package/dist/_esm5.processed/compat/fullscreen.js +0 -78
  457. package/dist/_esm5.processed/compat/is_offline.d.ts +0 -39
  458. package/dist/_esm5.processed/compat/is_offline.js +0 -43
  459. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +0 -258
  460. package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +0 -989
  461. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +0 -75
  462. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +0 -133
  463. package/dist/_esm5.processed/features/list/bif_parser.d.ts +0 -23
  464. package/dist/_esm5.processed/features/list/bif_parser.js +0 -27
  465. package/dist/_esm5.processed/features/list/image_buffer.js +0 -25
  466. package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +0 -38
  467. package/dist/_esm5.processed/transports/dash/image_pipelines.js +0 -129
  468. package/dist/_esm5.processed/utils/list_to_map.js +0 -28
  469. package/dist/_esm5.processed/utils/simple_set.d.ts +0 -51
  470. package/dist/_esm5.processed/utils/simple_set.js +0 -57
  471. package/dist/_esm5.processed/utils/uniq.d.ts +0 -36
  472. package/dist/_esm5.processed/utils/uniq.js +0 -43
  473. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  474. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
  475. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  476. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
  477. package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
  478. package/src/typings/next-tick.d.ts +0 -23
  479. package/src/typings/object-assign.d.ts +0 -48
@@ -27,10 +27,11 @@ function request(options) {
27
27
  responseType: (0, is_null_or_undefined_1.default)(options.responseType) ? DEFAULT_RESPONSE_TYPE :
28
28
  options.responseType,
29
29
  timeout: options.timeout,
30
+ connectionTimeout: options.connectionTimeout,
30
31
  };
31
32
  return new Promise(function (resolve, reject) {
32
33
  var onProgress = options.onProgress, cancelSignal = options.cancelSignal;
33
- var url = requestOptions.url, headers = requestOptions.headers, responseType = requestOptions.responseType, timeout = requestOptions.timeout;
34
+ var url = requestOptions.url, headers = requestOptions.headers, responseType = requestOptions.responseType, timeout = requestOptions.timeout, connectionTimeout = requestOptions.connectionTimeout;
34
35
  var xhr = new XMLHttpRequest();
35
36
  xhr.open("GET", url, true);
36
37
  var timeoutId;
@@ -44,9 +45,19 @@ function request(options) {
44
45
  // is more precise, it might also be more efficient.
45
46
  timeoutId = setTimeout(function () {
46
47
  clearCancellingProcess();
47
- reject(new errors_1.RequestError(url, xhr.status, "TIMEOUT"));
48
+ reject(new errors_1.RequestError(url, xhr.status, errors_1.NetworkErrorTypes.TIMEOUT));
48
49
  }, timeout + 3000);
49
50
  }
51
+ var connectionTimeoutId;
52
+ if (connectionTimeout !== undefined) {
53
+ connectionTimeoutId = setTimeout(function () {
54
+ clearCancellingProcess();
55
+ if (xhr.readyState !== XMLHttpRequest.DONE) {
56
+ xhr.abort();
57
+ }
58
+ reject(new errors_1.RequestError(url, xhr.status, errors_1.NetworkErrorTypes.TIMEOUT));
59
+ }, connectionTimeout);
60
+ }
50
61
  xhr.responseType = responseType;
51
62
  if (xhr.responseType === "document") {
52
63
  xhr.overrideMimeType("text/xml");
@@ -66,7 +77,7 @@ function request(options) {
66
77
  deregisterCancellationListener = cancelSignal
67
78
  .register(function abortRequest(err) {
68
79
  clearCancellingProcess();
69
- if (!(0, is_null_or_undefined_1.default)(xhr) && xhr.readyState !== 4) {
80
+ if (xhr.readyState !== XMLHttpRequest.DONE) {
70
81
  xhr.abort();
71
82
  }
72
83
  reject(err);
@@ -77,12 +88,19 @@ function request(options) {
77
88
  }
78
89
  xhr.onerror = function onXHRError() {
79
90
  clearCancellingProcess();
80
- reject(new errors_1.RequestError(url, xhr.status, "ERROR_EVENT"));
91
+ reject(new errors_1.RequestError(url, xhr.status, errors_1.NetworkErrorTypes.ERROR_EVENT));
81
92
  };
82
93
  xhr.ontimeout = function onXHRTimeout() {
83
94
  clearCancellingProcess();
84
- reject(new errors_1.RequestError(url, xhr.status, "TIMEOUT"));
95
+ reject(new errors_1.RequestError(url, xhr.status, errors_1.NetworkErrorTypes.TIMEOUT));
85
96
  };
97
+ if (connectionTimeout !== undefined) {
98
+ xhr.onreadystatechange = function clearConnectionTimeout() {
99
+ if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED) {
100
+ clearTimeout(connectionTimeoutId);
101
+ }
102
+ };
103
+ }
86
104
  if (onProgress !== undefined) {
87
105
  xhr.onprogress = function onXHRProgress(event) {
88
106
  var currentTime = (0, monotonic_timestamp_1.default)();
@@ -91,7 +109,7 @@ function request(options) {
91
109
  };
92
110
  }
93
111
  xhr.onload = function onXHRLoad(event) {
94
- if (xhr.readyState === 4) {
112
+ if (xhr.readyState === XMLHttpRequest.DONE) {
95
113
  clearCancellingProcess();
96
114
  if (xhr.status >= 200 && xhr.status < 300) {
97
115
  var receivedTime = (0, monotonic_timestamp_1.default)();
@@ -115,7 +133,7 @@ function request(options) {
115
133
  responseData = xhr.response;
116
134
  }
117
135
  if ((0, is_null_or_undefined_1.default)(responseData)) {
118
- reject(new errors_1.RequestError(url, xhr.status, "PARSE_ERROR"));
136
+ reject(new errors_1.RequestError(url, xhr.status, errors_1.NetworkErrorTypes.PARSE_ERROR));
119
137
  return;
120
138
  }
121
139
  resolve({ status: status_1, url: _url,
@@ -123,7 +141,7 @@ function request(options) {
123
141
  size: totalSize, responseData: responseData });
124
142
  }
125
143
  else {
126
- reject(new errors_1.RequestError(url, xhr.status, "ERROR_HTTP_CODE"));
144
+ reject(new errors_1.RequestError(url, xhr.status, errors_1.NetworkErrorTypes.ERROR_HTTP_CODE));
127
145
  }
128
146
  }
129
147
  };
@@ -135,6 +153,9 @@ function request(options) {
135
153
  if (timeoutId !== undefined) {
136
154
  clearTimeout(timeoutId);
137
155
  }
156
+ if (connectionTimeoutId !== undefined) {
157
+ clearTimeout(connectionTimeoutId);
158
+ }
138
159
  if (deregisterCancellationListener !== null) {
139
160
  deregisterCancellationListener();
140
161
  }
@@ -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
  }
@@ -13,8 +13,8 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import nextTick from "next-tick";
17
16
  import EventEmitter from "../utils/event_emitter";
17
+ import queueMicrotask from "../utils/queue_microtask";
18
18
  import globalScope from "./global_scope";
19
19
  import isNode from "./is_node";
20
20
  // TODO This is the last ugly side-effect here.
@@ -41,7 +41,7 @@ export default function patchWebkitSourceBuffer() {
41
41
  sourceBufferWebkitProto._listeners = [];
42
42
  sourceBufferWebkitProto._emitUpdate =
43
43
  function (eventName, val) {
44
- nextTick(() => {
44
+ queueMicrotask(() => {
45
45
  /* eslint-disable no-invalid-this */
46
46
  this.trigger(eventName, val);
47
47
  this.updating = false;
@@ -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
  };
@@ -103,6 +105,8 @@ declare function checkReloadOptions(options?: {
103
105
  position?: number;
104
106
  relative?: number;
105
107
  };
108
+ keySystems?: IKeySystemOption[];
109
+ autoPlay?: boolean;
106
110
  }): void;
107
111
  /**
108
112
  * Parse options given to loadVideo and set default options as found
@@ -139,6 +139,12 @@ function checkReloadOptions(options) {
139
139
  ((_d = options === null || options === void 0 ? void 0 : options.reloadAt) === null || _d === void 0 ? void 0 : _d.relative) !== undefined) {
140
140
  throw new Error("API: reload - Invalid 'reloadAt.relative' option format.");
141
141
  }
142
+ if (!Array.isArray(options === null || options === void 0 ? void 0 : options.keySystems) && (options === null || options === void 0 ? void 0 : options.keySystems) !== undefined) {
143
+ throw new Error("API: reload - Invalid 'keySystems' option format.");
144
+ }
145
+ if ((options === null || options === void 0 ? void 0 : options.autoPlay) !== undefined && typeof options.autoPlay !== "boolean") {
146
+ throw new Error("API: reload - Invalid 'autoPlay' option format.");
147
+ }
142
148
  }
143
149
  /**
144
150
  * Parse options given to loadVideo and set default options as found
@@ -253,9 +259,8 @@ function parseLoadVideoOptions(options) {
253
259
  "an \"html\" textTrackMode. It will be ignored.");
254
260
  }
255
261
  if (!isNullOrUndefined(options.startAt)) {
256
- // TODO Better way to express that in TypeScript?
257
- if (options.startAt.wallClockTime
258
- instanceof Date) {
262
+ if ("wallClockTime" in options.startAt
263
+ && options.startAt.wallClockTime instanceof Date) {
259
264
  const wallClockTime = options.startAt
260
265
  .wallClockTime.getTime() / 1000;
261
266
  startAt = objectAssign({}, options.startAt, { wallClockTime });
@@ -16,7 +16,7 @@
16
16
  import { IErrorCode, IErrorType } from "../../errors";
17
17
  import { IFeature } from "../../features";
18
18
  import Manifest, { Adaptation, Representation } from "../../manifest";
19
- import { IAudioRepresentation, IAudioTrack, IAudioTrackSetting, IAvailableAudioTrack, IAvailableTextTrack, IAvailableVideoTrack, IBrokenRepresentationsLockContext, IConstructorOptions, IKeySystemConfigurationOutput, ILoadVideoOptions, ILockedAudioRepresentationsSettings, ILockedVideoRepresentationsSettings, ITrackUpdateEventPayload, IRepresentationListUpdateContext, IPeriod, IPeriodChangeEvent, IPlayerError, IPlayerState, IPositionUpdate, IStreamEvent, ITextTrack, IVideoRepresentation, ITextTrackSetting, IVideoTrack, IVideoTrackSetting } from "../../public_types";
19
+ import { IAudioRepresentation, IAudioTrack, IAudioTrackSetting, IAvailableAudioTrack, IAvailableTextTrack, IAvailableVideoTrack, IBrokenRepresentationsLockContext, IConstructorOptions, IKeySystemConfigurationOutput, IKeySystemOption, ILoadVideoOptions, ILockedAudioRepresentationsSettings, ILockedVideoRepresentationsSettings, ITrackUpdateEventPayload, IRepresentationListUpdateContext, IPeriod, IPeriodChangeEvent, IPlayerError, IPlayerState, IPositionUpdate, IStreamEvent, ITextTrack, IVideoRepresentation, ITextTrackSetting, IVideoTrack, IVideoTrackSetting } from "../../public_types";
20
20
  import EventEmitter, { IListener } from "../../utils/event_emitter";
21
21
  import Logger from "../../utils/logger";
22
22
  import { IBufferedChunk, IBufferType } from "../segment_buffers";
@@ -159,6 +159,7 @@ declare class Player extends EventEmitter<IPublicAPIEvent> {
159
159
  position?: number;
160
160
  relative?: number;
161
161
  };
162
+ keySystems?: IKeySystemOption[];
162
163
  autoPlay?: boolean;
163
164
  }): void;
164
165
  createDebugElement(element: HTMLElement): {
@@ -556,6 +557,15 @@ declare class Player extends EventEmitter<IPublicAPIEvent> {
556
557
  * @returns {number}
557
558
  */
558
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;
559
569
  /**
560
570
  * Get maximum seek-able position.
561
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.2023110700";
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;
@@ -186,7 +186,7 @@ class Player extends EventEmitter {
186
186
  * @param {Object} reloadOpts
187
187
  */
188
188
  reload(reloadOpts) {
189
- var _a, _b;
189
+ var _a, _b, _c;
190
190
  const { options, manifest, reloadPosition, reloadInPause } = this._priv_reloadingMetadata;
191
191
  if (options === undefined) {
192
192
  throw new Error("API: Can't reload without having previously loaded a content.");
@@ -214,6 +214,13 @@ class Player extends EventEmitter {
214
214
  else if (reloadInPause !== undefined) {
215
215
  autoPlay = !reloadInPause;
216
216
  }
217
+ let keySystems;
218
+ if ((reloadOpts === null || reloadOpts === void 0 ? void 0 : reloadOpts.keySystems) !== undefined) {
219
+ keySystems = reloadOpts.keySystems;
220
+ }
221
+ else if (((_c = this._priv_reloadingMetadata.options) === null || _c === void 0 ? void 0 : _c.keySystems) !== undefined) {
222
+ keySystems = this._priv_reloadingMetadata.options.keySystems;
223
+ }
217
224
  const newOptions = Object.assign(Object.assign({}, options), { initialManifest: manifest });
218
225
  if (startAt !== undefined) {
219
226
  newOptions.startAt = startAt;
@@ -221,6 +228,9 @@ class Player extends EventEmitter {
221
228
  if (autoPlay !== undefined) {
222
229
  newOptions.autoPlay = autoPlay;
223
230
  }
231
+ if (keySystems !== undefined) {
232
+ newOptions.keySystems = keySystems;
233
+ }
224
234
  this._priv_initializeContentPlayback(newOptions);
225
235
  }
226
236
  createDebugElement(element) {
@@ -240,7 +250,7 @@ class Player extends EventEmitter {
240
250
  * @param {Object} options
241
251
  */
242
252
  _priv_initializeContentPlayback(options) {
243
- var _a, _b, _c, _d;
253
+ var _a, _b, _c, _d, _e, _f;
244
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;
245
255
  // Perform multiple checks on the given options
246
256
  if (this.videoElement === null) {
@@ -276,6 +286,7 @@ class Player extends EventEmitter {
276
286
  const manifestRequestSettings = { lowLatencyMode,
277
287
  maxRetry: (_a = requestConfig.manifest) === null || _a === void 0 ? void 0 : _a.maxRetry,
278
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,
279
290
  minimumManifestUpdateInterval,
280
291
  initialManifest };
281
292
  const relyOnVideoVisibilityAndSize = canRelyOnVideoVisibilityAndSize();
@@ -322,8 +333,9 @@ class Player extends EventEmitter {
322
333
  const bufferOptions = objectAssign({ enableFastSwitching,
323
334
  onCodecSwitch }, this._priv_bufferOptions);
324
335
  const segmentRequestOptions = { lowLatencyMode,
325
- maxRetry: (_c = requestConfig.segment) === null || _c === void 0 ? void 0 : _c.maxRetry,
326
- 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 };
327
339
  initializer = new features.mediaSourceInit({
328
340
  adaptiveOptions,
329
341
  autoPlay,
@@ -1452,6 +1464,27 @@ class Player extends EventEmitter {
1452
1464
  }
1453
1465
  return null;
1454
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
+ }
1455
1488
  /**
1456
1489
  * Get maximum seek-able position.
1457
1490
  * @returns {number}
@@ -1496,9 +1529,11 @@ class Player extends EventEmitter {
1496
1529
  }
1497
1530
  const segmentBufferStatus = this._priv_contentInfos
1498
1531
  .segmentBuffersStore.getStatus(bufferType);
1499
- return segmentBufferStatus.type === "initialized" ?
1500
- segmentBufferStatus.value.getInventory() :
1501
- null;
1532
+ if (segmentBufferStatus.type === "initialized") {
1533
+ segmentBufferStatus.value.synchronizeInventory();
1534
+ return segmentBufferStatus.value.getInventory();
1535
+ }
1536
+ return null;
1502
1537
  }
1503
1538
  /**
1504
1539
  * /!\ For tools use only! Do not touch!
@@ -2097,5 +2132,5 @@ class Player extends EventEmitter {
2097
2132
  }
2098
2133
  }
2099
2134
  }
2100
- Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023110700";
2135
+ Player.version = /* PLAYER_VERSION */ "4.0.0-dev.2023120600";
2101
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
  /**