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

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 (336) hide show
  1. package/CHANGELOG.md +20 -60
  2. package/FILES.md +1 -1
  3. package/README.md +2 -33
  4. package/VERSION +1 -1
  5. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +2 -6
  6. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +20 -10
  7. package/dist/_esm5.processed/core/api/option_utils.d.ts +0 -2
  8. package/dist/_esm5.processed/core/api/option_utils.js +0 -6
  9. package/dist/_esm5.processed/core/api/public_api.d.ts +1 -2
  10. package/dist/_esm5.processed/core/api/public_api.js +9 -17
  11. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
  12. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +3 -14
  13. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +2 -36
  14. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +2 -82
  15. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  16. package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +1 -1
  17. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  18. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  19. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  20. package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +2 -2
  21. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  22. package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +19 -10
  23. package/dist/_esm5.processed/core/stream/representation/utils/get_buffer_status.js +1 -1
  24. package/dist/_esm5.processed/core/stream/representation/utils/get_needed_segments.js +1 -1
  25. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
  26. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  27. package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
  28. package/dist/_esm5.processed/public_types.d.ts +2 -0
  29. package/dist/commonjs/compat/is_codec_supported.js +22 -1
  30. package/dist/commonjs/config.d.ts +2 -1
  31. package/dist/commonjs/core/adaptive/adaptive_representation_selector.d.ts +2 -19
  32. package/dist/commonjs/core/adaptive/adaptive_representation_selector.js +2 -2
  33. package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
  34. package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
  35. package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
  36. package/dist/commonjs/core/api/index.d.ts +1 -1
  37. package/dist/commonjs/core/api/option_utils.d.ts +2 -0
  38. package/dist/commonjs/core/api/option_utils.js +2 -3
  39. package/dist/commonjs/core/api/playback_observer.d.ts +128 -8
  40. package/dist/commonjs/core/api/playback_observer.js +217 -64
  41. package/dist/commonjs/core/api/public_api.d.ts +9 -0
  42. package/dist/commonjs/core/api/public_api.js +41 -16
  43. package/dist/commonjs/core/api/utils.js +1 -1
  44. package/dist/commonjs/core/decrypt/get_media_keys.js +2 -6
  45. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  46. package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
  47. package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  48. package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
  49. package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  50. package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
  51. package/dist/commonjs/core/init/directfile_content_initializer.js +29 -8
  52. package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
  53. package/dist/commonjs/core/init/media_source_content_initializer.js +32 -20
  54. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  55. package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +17 -19
  56. package/dist/commonjs/core/init/utils/create_stream_playback_observer.d.ts +1 -5
  57. package/dist/commonjs/core/init/utils/create_stream_playback_observer.js +16 -14
  58. package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
  59. package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
  60. package/dist/commonjs/core/init/utils/initial_seek_and_play.d.ts +9 -11
  61. package/dist/commonjs/core/init/utils/initial_seek_and_play.js +121 -91
  62. package/dist/commonjs/core/init/utils/rebuffering_controller.js +27 -70
  63. package/dist/commonjs/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
  64. package/dist/commonjs/core/segment_buffers/garbage_collector.js +1 -2
  65. package/dist/commonjs/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  66. package/dist/commonjs/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  67. package/dist/commonjs/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  68. package/dist/commonjs/core/segment_buffers/index.d.ts +2 -2
  69. package/dist/commonjs/core/segment_buffers/inventory/index.d.ts +2 -2
  70. package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  71. package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.js +19 -10
  72. package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
  73. package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
  74. package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +14 -18
  75. package/dist/commonjs/core/stream/period/period_stream.js +5 -8
  76. package/dist/commonjs/core/stream/period/types.d.ts +2 -3
  77. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
  78. package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
  79. package/dist/commonjs/core/stream/representation/representation_stream.js +3 -4
  80. package/dist/commonjs/core/stream/representation/types.d.ts +2 -2
  81. package/dist/commonjs/core/stream/representation/utils/append_segment_to_buffer.js +11 -12
  82. package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +4 -4
  83. package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
  84. package/dist/commonjs/default_config.d.ts +12 -16
  85. package/dist/commonjs/default_config.js +21 -16
  86. package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  87. package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  88. package/dist/commonjs/manifest/adaptation.js +2 -1
  89. package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
  90. package/dist/commonjs/manifest/representation_index/static.js +2 -2
  91. package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
  92. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  93. package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
  94. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  95. package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  96. package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  97. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  98. package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
  99. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  100. package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
  101. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  102. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  103. package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
  104. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  105. package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  106. package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
  107. package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
  108. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  109. package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
  110. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  111. package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
  112. package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +7 -3
  113. package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
  114. package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
  115. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  116. package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
  117. package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
  118. package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
  119. package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
  120. package/dist/commonjs/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  121. package/dist/commonjs/public_types.d.ts +107 -36
  122. package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
  123. package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
  124. package/dist/commonjs/transports/dash/segment_loader.js +2 -1
  125. package/dist/commonjs/transports/dash/text_loader.js +2 -0
  126. package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
  127. package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
  128. package/dist/commonjs/transports/smooth/pipelines.js +4 -2
  129. package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
  130. package/dist/commonjs/transports/types.d.ts +12 -0
  131. package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
  132. package/dist/commonjs/utils/request/fetch.d.ts +6 -0
  133. package/dist/commonjs/utils/request/fetch.js +29 -8
  134. package/dist/commonjs/utils/request/xhr.d.ts +11 -5
  135. package/dist/commonjs/utils/request/xhr.js +29 -8
  136. package/dist/es2017/compat/is_codec_supported.js +22 -1
  137. package/dist/es2017/config.d.ts +2 -1
  138. package/dist/es2017/core/adaptive/adaptive_representation_selector.d.ts +2 -19
  139. package/dist/es2017/core/adaptive/adaptive_representation_selector.js +2 -2
  140. package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
  141. package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
  142. package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
  143. package/dist/es2017/core/api/index.d.ts +1 -1
  144. package/dist/es2017/core/api/option_utils.d.ts +2 -0
  145. package/dist/es2017/core/api/option_utils.js +2 -3
  146. package/dist/es2017/core/api/playback_observer.d.ts +128 -8
  147. package/dist/es2017/core/api/playback_observer.js +217 -66
  148. package/dist/es2017/core/api/public_api.d.ts +9 -0
  149. package/dist/es2017/core/api/public_api.js +40 -15
  150. package/dist/es2017/core/api/utils.js +1 -1
  151. package/dist/es2017/core/decrypt/get_media_keys.js +2 -6
  152. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
  153. package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
  154. package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
  155. package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
  156. package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
  157. package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
  158. package/dist/es2017/core/init/directfile_content_initializer.js +31 -8
  159. package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
  160. package/dist/es2017/core/init/media_source_content_initializer.js +34 -22
  161. package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
  162. package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +17 -17
  163. package/dist/es2017/core/init/utils/create_stream_playback_observer.d.ts +1 -5
  164. package/dist/es2017/core/init/utils/create_stream_playback_observer.js +16 -14
  165. package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
  166. package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
  167. package/dist/es2017/core/init/utils/initial_seek_and_play.d.ts +9 -11
  168. package/dist/es2017/core/init/utils/initial_seek_and_play.js +120 -91
  169. package/dist/es2017/core/init/utils/rebuffering_controller.js +27 -70
  170. package/dist/es2017/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
  171. package/dist/es2017/core/segment_buffers/garbage_collector.js +1 -2
  172. package/dist/es2017/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
  173. package/dist/es2017/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
  174. package/dist/es2017/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
  175. package/dist/es2017/core/segment_buffers/index.d.ts +2 -2
  176. package/dist/es2017/core/segment_buffers/inventory/index.d.ts +2 -2
  177. package/dist/es2017/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
  178. package/dist/es2017/core/segment_buffers/inventory/segment_inventory.js +19 -10
  179. package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
  180. package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
  181. package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +16 -18
  182. package/dist/es2017/core/stream/period/period_stream.js +4 -7
  183. package/dist/es2017/core/stream/period/types.d.ts +2 -3
  184. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
  185. package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
  186. package/dist/es2017/core/stream/representation/representation_stream.js +3 -4
  187. package/dist/es2017/core/stream/representation/types.d.ts +2 -2
  188. package/dist/es2017/core/stream/representation/utils/append_segment_to_buffer.js +1 -2
  189. package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +4 -4
  190. package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
  191. package/dist/es2017/default_config.d.ts +12 -16
  192. package/dist/es2017/default_config.js +21 -16
  193. package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
  194. package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
  195. package/dist/es2017/manifest/adaptation.js +2 -1
  196. package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
  197. package/dist/es2017/manifest/representation_index/static.js +2 -2
  198. package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
  199. package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
  200. package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
  201. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
  202. package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
  203. package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
  204. package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
  205. package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
  206. package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
  207. package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
  208. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
  209. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
  210. package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
  211. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
  212. package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
  213. package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
  214. package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
  215. package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
  216. package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
  217. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
  218. package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
  219. package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +7 -3
  220. package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
  221. package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
  222. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
  223. package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
  224. package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
  225. package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
  226. package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
  227. package/dist/es2017/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
  228. package/dist/es2017/public_types.d.ts +107 -36
  229. package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
  230. package/dist/es2017/transports/dash/manifest_parser.js +3 -0
  231. package/dist/es2017/transports/dash/segment_loader.js +1 -0
  232. package/dist/es2017/transports/dash/text_loader.js +2 -0
  233. package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
  234. package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
  235. package/dist/es2017/transports/smooth/pipelines.js +2 -0
  236. package/dist/es2017/transports/smooth/segment_loader.js +1 -0
  237. package/dist/es2017/transports/types.d.ts +12 -0
  238. package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
  239. package/dist/es2017/utils/request/fetch.d.ts +6 -0
  240. package/dist/es2017/utils/request/fetch.js +29 -8
  241. package/dist/es2017/utils/request/xhr.d.ts +11 -5
  242. package/dist/es2017/utils/request/xhr.js +30 -9
  243. package/dist/mpd-parser.wasm +0 -0
  244. package/dist/rx-player.js +1335 -812
  245. package/dist/rx-player.min.js +1 -1
  246. package/package.json +7 -4
  247. package/scripts/canal-release.patch +78 -0
  248. package/scripts/make-dev-releases +65 -0
  249. package/scripts/update-version +7 -0
  250. package/sonar-project.properties +1 -1
  251. package/src/compat/is_codec_supported.ts +23 -1
  252. package/src/core/adaptive/adaptive_representation_selector.ts +4 -21
  253. package/src/core/adaptive/network_analyzer.ts +3 -3
  254. package/src/core/api/debug/buffer_graph.ts +2 -5
  255. package/src/core/api/debug/modules/general_info.ts +15 -10
  256. package/src/core/api/index.ts +1 -0
  257. package/src/core/api/option_utils.ts +3 -3
  258. package/src/core/api/playback_observer.ts +327 -107
  259. package/src/core/api/public_api.ts +42 -14
  260. package/src/core/api/utils.ts +3 -1
  261. package/src/core/decrypt/get_media_keys.ts +2 -8
  262. package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
  263. package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
  264. package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
  265. package/src/core/fetchers/utils/schedule_request.ts +1 -1
  266. package/src/core/init/directfile_content_initializer.ts +31 -15
  267. package/src/core/init/media_source_content_initializer.ts +40 -27
  268. package/src/core/init/utils/content_time_boundaries_observer.ts +24 -23
  269. package/src/core/init/utils/create_stream_playback_observer.ts +19 -20
  270. package/src/core/init/utils/get_initial_time.ts +25 -12
  271. package/src/core/init/utils/initial_seek_and_play.ts +140 -108
  272. package/src/core/init/utils/rebuffering_controller.ts +32 -77
  273. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +5 -2
  274. package/src/core/segment_buffers/garbage_collector.ts +1 -1
  275. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -2
  276. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
  277. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +1 -1
  278. package/src/core/segment_buffers/index.ts +2 -0
  279. package/src/core/segment_buffers/inventory/index.ts +2 -0
  280. package/src/core/segment_buffers/inventory/segment_inventory.ts +49 -17
  281. package/src/core/stream/adaptation/get_representations_switch_strategy.ts +21 -12
  282. package/src/core/stream/orchestrator/stream_orchestrator.ts +14 -19
  283. package/src/core/stream/period/period_stream.ts +7 -8
  284. package/src/core/stream/period/types.ts +2 -3
  285. package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +21 -15
  286. package/src/core/stream/representation/representation_stream.ts +3 -5
  287. package/src/core/stream/representation/types.ts +2 -2
  288. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
  289. package/src/core/stream/representation/utils/get_buffer_status.ts +5 -4
  290. package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
  291. package/src/default_config.ts +22 -17
  292. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
  293. package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
  294. package/src/manifest/adaptation.ts +2 -1
  295. package/src/manifest/representation_index/static.ts +2 -2
  296. package/src/manifest/representation_index/types.ts +4 -4
  297. package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
  298. package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
  299. package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
  300. package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
  301. package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
  302. package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
  303. package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
  304. package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
  305. package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
  306. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
  307. package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
  308. package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
  309. package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
  310. package/src/parsers/manifest/dash/common/parse_representations.ts +9 -3
  311. package/src/parsers/manifest/local/representation_index.ts +3 -3
  312. package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
  313. package/src/parsers/manifest/smooth/representation_index.ts +23 -9
  314. package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
  315. package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
  316. package/src/parsers/manifest/utils/index_helpers.ts +1 -1
  317. package/src/parsers/texttracks/ttml/html/apply_line_height.ts +3 -1
  318. package/src/public_types.ts +108 -36
  319. package/src/transports/dash/init_segment_loader.ts +5 -0
  320. package/src/transports/dash/manifest_parser.ts +6 -0
  321. package/src/transports/dash/segment_loader.ts +1 -0
  322. package/src/transports/dash/text_loader.ts +2 -0
  323. package/src/transports/metaplaylist/manifest_loader.ts +1 -0
  324. package/src/transports/metaplaylist/pipelines.ts +4 -1
  325. package/src/transports/smooth/pipelines.ts +2 -0
  326. package/src/transports/smooth/segment_loader.ts +1 -0
  327. package/src/transports/types.ts +12 -0
  328. package/src/transports/utils/generate_manifest_loader.ts +3 -0
  329. package/src/utils/request/fetch.ts +35 -8
  330. package/src/utils/request/xhr.ts +45 -14
  331. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  332. package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
  333. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
  334. package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
  335. package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
  336. package/src/typings/object-assign.d.ts +0 -48
@@ -186,8 +186,35 @@ export interface IRepresentationFilterRepresentation {
186
186
  /** String identifying the Representation, unique per Adaptation. */
187
187
  id : string;
188
188
  bitrate? : number | undefined;
189
- /** Codec used by the media segments of that Representation. */
190
- codec? : string | undefined;
189
+ /**
190
+ * Codec(s) relied on by the media segments of that Representation.
191
+ *
192
+ * For the great majority of cases, this value will be set to either
193
+ * `undefined` (meaning the codec is unknown) or to an array with a
194
+ * single element which will be the actual codec relied on when the
195
+ * corresponding Representation will be played.
196
+ *
197
+ * However in some very rare scenarios, this value might be set to an array
198
+ * with multiple codecs, itself being a list of its candidate codecs from the
199
+ * most wanted to the most compatible.
200
+ * The conditions for this more complex format are very specific:
201
+ *
202
+ * - It can only happen if the `representationFilter` callback is called in
203
+ * an environment where it hasn't yet been possible for the RxPlayer to
204
+ * check for codec support (mainly when running through the RxPlayer's
205
+ * `MULTI_THREAD` feature in a browser without MSE-in-worker
206
+ * capabilities).
207
+ *
208
+ * - The corresponding Representation is compatible to a restrictive codec
209
+ * yet also retro-compatible to a less restrictive one.
210
+ *
211
+ * The main example being Dolby Vision Representations which are
212
+ * retro-compatible to HDR10 HEVC codecs.
213
+ * In that very specific case, we could have an array with two elements:
214
+ * 1. The Dolby Vision codec
215
+ * 2. The base HDR10 codec
216
+ */
217
+ codecs? : string[] | undefined;
191
218
  /**
192
219
  * This property makes the most sense for video Representations.
193
220
  * It defines the height of the video, in pixels.
@@ -255,10 +282,20 @@ export type IStartAtOption =
255
282
  percentage : number;
256
283
  } | {
257
284
  /**
258
- * If set, we should begin at this position relative to the content's end,
259
- * in seconds.
285
+ * If set, we should begin at this position relative to the content's maximum
286
+ * seekable position, in seconds.
260
287
  */
261
288
  fromLastPosition : number;
289
+ } | {
290
+ /**
291
+ * If set, we should begin at this position relative to the content's live
292
+ * edge if it makes sense, in seconds.
293
+ *
294
+ * If the live edge is unknown or if it does not make sense for the current
295
+ * content, that position is relative to the content's maximum position
296
+ * instead.
297
+ */
298
+ fromLivePosition : number;
262
299
  } | {
263
300
  /**
264
301
  * If set, we should begin at this position relative to the content's start,
@@ -267,40 +304,38 @@ export type IStartAtOption =
267
304
  fromFirstPosition : number;
268
305
  };
269
306
 
307
+ export interface RequestRetryParameters {
308
+ /**
309
+ * The amount of time maximum we should retry a request before failing on Error.
310
+ * Set to `Infinity` for an infinite number of requests.
311
+ */
312
+ maxRetry? : number | undefined;
313
+ /**
314
+ * Amount of time, in milliseconds, after which a request should be
315
+ * aborted and optionally retried, depending on the maxRetry configuration.
316
+ *
317
+ * Setting it to `-1` allows to disable any timeout.
318
+ * `undefined` means that a default, large, timeout will be used instead.
319
+ */
320
+ timeout? : number | undefined;
321
+ /**
322
+ * Amount of time, in milliseconds, after which a request that hasn't receive
323
+ * the headers and status code should be aborted and optionnaly retried,
324
+ * depending on the maxRetry configuration.
325
+ */
326
+ connectionTimeout?: number | undefined;
327
+ }
328
+
270
329
  /** Value for the `requestConfig` option of the `loadVideo` method. */
271
330
  export interface IRequestConfig {
272
- manifest? : {
273
- /**
274
- * The amount of time maximum we should retry a Manifest or Manifest-related
275
- * request before failing on Error.
276
- * Set to `Infinity` for an infinite number of requests.
277
- */
278
- maxRetry? : number | undefined;
279
- /**
280
- * Amount of time, in milliseconds, after which a manifest request should be
281
- * aborted and optionally retried, depending on the current configuration.
282
- *
283
- * Setting it to `-1` allows to disable any timeout.
284
- * `undefined` means that a default, large, timeout will be used instead.
285
- */
286
- timeout? : number | undefined;
287
- } | undefined;
288
- segment? : {
289
- /**
290
- * The amount of time maximum we should retry a segment or segment-related
291
- * request before failing on Error.
292
- * Set to `Infinity` for an infinite number of requests.
293
- */
294
- maxRetry? : number | undefined;
295
- /**
296
- * Amount of time, in milliseconds, after which a segment request should be
297
- * aborted and optionally retried, depending on the current configuration.
298
- *
299
- * Setting it to `-1` allows to disable any timeout.
300
- * `undefined` means that a default, large, timeout will be used instead.
301
- */
302
- timeout? : number | undefined;
303
- } | undefined;
331
+ /**
332
+ * Defines the retry parameters when requesting manifest
333
+ */
334
+ manifest? : RequestRetryParameters | undefined;
335
+ /**
336
+ * Defines the retry parameters when requesting a segment
337
+ */
338
+ segment? : RequestRetryParameters | undefined;
304
339
  }
305
340
 
306
341
  export type ISegmentLoader = (
@@ -949,20 +984,57 @@ export interface ILockedAudioRepresentationsSettings {
949
984
  }
950
985
 
951
986
  export interface IAudioTrackSetting {
987
+ /** `id` of the audio track you want to set. */
952
988
  trackId : string;
989
+ /**
990
+ * `id` of the Period for which you want that setting applied.
991
+ * Keeping it undefined means it will apply to the currently-playing Period.
992
+ */
953
993
  periodId? : string | undefined;
994
+ /**
995
+ * Behavior wanted when replacing an audio track / Adaptation by another.
996
+ * @see IAudioTrackSwitchingMode
997
+ *
998
+ * Keeping it undefined means that the RxPlayer will automatically select
999
+ * the most adapted choice.
1000
+ */
954
1001
  switchingMode? : IAudioTrackSwitchingMode | undefined;
1002
+ /**
1003
+ * Representations (a.k.a. qualities) you want to play in that new track.
1004
+ * Keeping it undefined means that all compatible qualities may be played.
1005
+ */
955
1006
  lockedRepresentations? : string[] | undefined;
956
1007
  }
957
1008
 
958
1009
  export interface IVideoTrackSetting {
1010
+ /** `id` of the video track you want to set. */
959
1011
  trackId : string;
1012
+ /**
1013
+ * `id` of the Period for which you want that setting applied.
1014
+ * Keeping it undefined means it will apply to the currently-playing Period.
1015
+ */
960
1016
  periodId? : string | undefined;
1017
+ /**
1018
+ * Behavior wanted when replacing an video track / Adaptation by another.
1019
+ * @see IVideoTrackSwitchingMode
1020
+ *
1021
+ * Keeping it undefined means that the RxPlayer will automatically select
1022
+ * the most adapted choice.
1023
+ */
961
1024
  switchingMode? : IVideoTrackSwitchingMode | undefined;
1025
+ /**
1026
+ * Representations (a.k.a. qualities) you want to play in that new track.
1027
+ * Keeping it undefined means that all compatible qualities may be played.
1028
+ */
962
1029
  lockedRepresentations? : string[] | undefined;
963
1030
  }
964
1031
 
965
1032
  export interface ITextTrackSetting {
1033
+ /** `id` of the text track you want to set. */
966
1034
  trackId : string;
1035
+ /**
1036
+ * `id` of the Period for which you want that setting applied.
1037
+ * Keeping it undefined means it will apply to the currently-playing Period.
1038
+ */
967
1039
  periodId? : string | undefined;
968
1040
  }
@@ -50,6 +50,7 @@ export default function initSegmentLoader(
50
50
  return request({ url,
51
51
  responseType: "arraybuffer",
52
52
  timeout: options.timeout,
53
+ connectionTimeout: options.connectionTimeout,
53
54
  cancelSignal,
54
55
  onProgress: callbacks.onProgress })
55
56
  .then(data => ({ resultType: "segment-loaded",
@@ -61,6 +62,7 @@ export default function initSegmentLoader(
61
62
  headers: { Range: byteRange(segment.range) },
62
63
  responseType: "arraybuffer",
63
64
  timeout: options.timeout,
65
+ connectionTimeout: options.connectionTimeout,
64
66
  cancelSignal,
65
67
  onProgress: callbacks.onProgress })
66
68
  .then(data => ({ resultType: "segment-loaded",
@@ -74,6 +76,7 @@ export default function initSegmentLoader(
74
76
  segment.indexRange[1] ]) },
75
77
  responseType: "arraybuffer",
76
78
  timeout: options.timeout,
79
+ connectionTimeout: options.connectionTimeout,
77
80
  cancelSignal,
78
81
  onProgress: callbacks.onProgress })
79
82
  .then(data => ({ resultType: "segment-loaded",
@@ -84,12 +87,14 @@ export default function initSegmentLoader(
84
87
  headers: { Range: byteRange(segment.range) },
85
88
  responseType: "arraybuffer",
86
89
  timeout: options.timeout,
90
+ connectionTimeout: options.connectionTimeout,
87
91
  cancelSignal,
88
92
  onProgress: callbacks.onProgress });
89
93
  const indexRequest$ = request({ url,
90
94
  headers: { Range: byteRange(segment.indexRange) },
91
95
  responseType: "arraybuffer",
92
96
  timeout: options.timeout,
97
+ connectionTimeout: options.connectionTimeout,
93
98
  cancelSignal,
94
99
  onProgress: callbacks.onProgress });
95
100
 
@@ -151,14 +151,20 @@ export default function generateManifestParser(
151
151
  const externalResources = value.urls.map(resourceUrl => {
152
152
  return scheduleRequest(() => {
153
153
  const defaultTimeout = config.getCurrent().DEFAULT_REQUEST_TIMEOUT;
154
+ const defaultConnectionTimeout = config.getCurrent().DEFAULT_CONNECTION_TIMEOUT;
155
+
154
156
  return value.format === "string" ? request({ url: resourceUrl,
155
157
  responseType: "text",
156
158
  timeout: defaultTimeout,
159
+ connectionTimeout:
160
+ defaultConnectionTimeout,
157
161
  cancelSignal }) :
158
162
 
159
163
  request({ url: resourceUrl,
160
164
  responseType: "arraybuffer",
161
165
  timeout: defaultTimeout,
166
+ connectionTimeout:
167
+ defaultConnectionTimeout,
162
168
  cancelSignal });
163
169
  }).then((res) => {
164
170
  if (value.format === "string") {
@@ -84,6 +84,7 @@ export function regularSegmentLoader(
84
84
  { Range: byteRange(segment.range) } :
85
85
  undefined,
86
86
  timeout: options.timeout,
87
+ connectionTimeout: options.connectionTimeout,
87
88
  cancelSignal,
88
89
  onProgress: callbacks.onProgress })
89
90
  .then((data) => ({ resultType: "segment-loaded",
@@ -99,6 +99,7 @@ export default function generateTextTrackLoader(
99
99
  { Range: byteRange(range) } :
100
100
  null,
101
101
  timeout: options.timeout,
102
+ connectionTimeout: options.connectionTimeout,
102
103
  onProgress: callbacks.onProgress,
103
104
  cancelSignal })
104
105
  .then((data) => ({ resultType: "segment-loaded",
@@ -111,6 +112,7 @@ export default function generateTextTrackLoader(
111
112
  { Range: byteRange(range) } :
112
113
  null,
113
114
  timeout: options.timeout,
115
+ connectionTimeout: options.connectionTimeout,
114
116
  onProgress: callbacks.onProgress,
115
117
  cancelSignal })
116
118
  .then((data) => ({ resultType: "segment-loaded",
@@ -40,6 +40,7 @@ function regularManifestLoader(
40
40
  return request({ url,
41
41
  responseType: "text",
42
42
  timeout: loaderOptions.timeout,
43
+ connectionTimeout: loaderOptions.connectionTimeout,
43
44
  cancelSignal });
44
45
  }
45
46
 
@@ -177,7 +177,10 @@ export default function(options : ITransportOptions): ITransportPipelines {
177
177
  * Whether a ManifestLoader's timeout should be relied on here
178
178
  * is ambiguous.
179
179
  */
180
- const manOpts = { timeout: config.getCurrent().DEFAULT_REQUEST_TIMEOUT };
180
+ const manOpts = {
181
+ timeout: config.getCurrent().DEFAULT_REQUEST_TIMEOUT,
182
+ connectionTimeout: config.getCurrent().DEFAULT_CONNECTION_TIMEOUT,
183
+ };
181
184
  return transport.manifest.loadManifest(resource.url, manOpts, cancelSignal);
182
185
  }
183
186
  });
@@ -203,6 +203,7 @@ export default function(transportOptions : ITransportOptions) : ITransportPipeli
203
203
  return request({ url,
204
204
  responseType: "text",
205
205
  timeout: loaderOptions.timeout,
206
+ connectionTimeout: loaderOptions.connectionTimeout,
206
207
  cancelSignal,
207
208
  onProgress: callbacks.onProgress })
208
209
  .then((data) => ({ resultType: "segment-loaded" as const,
@@ -211,6 +212,7 @@ export default function(transportOptions : ITransportOptions) : ITransportPipeli
211
212
  return request({ url,
212
213
  responseType: "arraybuffer",
213
214
  timeout: loaderOptions.timeout,
215
+ connectionTimeout: loaderOptions.connectionTimeout,
214
216
  cancelSignal,
215
217
  onProgress: callbacks.onProgress })
216
218
  .then((data) => {
@@ -65,6 +65,7 @@ function regularSegmentLoader(
65
65
  responseType: "arraybuffer",
66
66
  headers,
67
67
  timeout: loaderOptions.timeout,
68
+ connectionTimeout: loaderOptions.connectionTimeout,
68
69
  cancelSignal,
69
70
  onProgress: callbacks.onProgress })
70
71
  .then((data) => {
@@ -169,6 +169,12 @@ export interface IManifestLoaderOptions {
169
169
  * `undefined` means that no timeout will be enforced.
170
170
  */
171
171
  timeout? : number | undefined;
172
+ /**
173
+ * Connection timeout, in milliseconds, after which the request is canceled
174
+ * if the responses headers has not being received.
175
+ * Do not set or set to "undefined" to disable it.
176
+ */
177
+ connectionTimeout? : number | undefined;
172
178
  }
173
179
 
174
180
  /** Functions allowing to load and parse segments of any type. */
@@ -217,6 +223,12 @@ export interface ISegmentLoaderOptions {
217
223
  * `undefined` means that no timeout will be enforced.
218
224
  */
219
225
  timeout? : number | undefined;
226
+ /**
227
+ * Connection timeout, in milliseconds, after which the request is canceled
228
+ * if the responses headers has not being received.
229
+ * Do not set or set to "undefined" to disable it.
230
+ */
231
+ connectionTimeout? : number | undefined;
220
232
  }
221
233
 
222
234
  /**
@@ -57,16 +57,19 @@ function generateRegularManifestLoader(
57
57
  return request({ url,
58
58
  responseType: "arraybuffer",
59
59
  timeout: loaderOptions.timeout,
60
+ connectionTimeout: loaderOptions.connectionTimeout,
60
61
  cancelSignal });
61
62
  case "text":
62
63
  return request({ url,
63
64
  responseType: "text",
64
65
  timeout: loaderOptions.timeout,
66
+ connectionTimeout: loaderOptions.connectionTimeout,
65
67
  cancelSignal });
66
68
  case "document":
67
69
  return request({ url,
68
70
  responseType: "document",
69
71
  timeout: loaderOptions.timeout,
72
+ connectionTimeout: loaderOptions.connectionTimeout,
70
73
  cancelSignal });
71
74
  default:
72
75
  assertUnreachable(preferredType);
@@ -95,6 +95,12 @@ export interface IFetchOptions {
95
95
  * if not all data has been received yet.
96
96
  */
97
97
  timeout? : number | undefined;
98
+ /**
99
+ * Optional connection timeout, in milliseconds, after which the request is canceled
100
+ * if the responses headers has not being received.
101
+ * Do not set or set to "undefined" to disable it.
102
+ */
103
+ connectionTimeout? : number | undefined;
98
104
  }
99
105
 
100
106
 
@@ -128,7 +134,8 @@ export default function fetchRequest(
128
134
 
129
135
  log.debug("Fetch: Called with URL", options.url);
130
136
  let cancellation : CancellationError | null = null;
131
- let timeouted = false;
137
+ let isTimedOut = false;
138
+ let isConnectionTimedOut = false;
132
139
  const sendingTime = getMonotonicTimeStamp();
133
140
  const abortController: AbortController | null =
134
141
  !isNullOrUndefined(_AbortController) ? new _AbortController() :
@@ -146,14 +153,28 @@ export default function fetchRequest(
146
153
  abortController.abort();
147
154
  }
148
155
 
149
- let timeout : number | undefined;
156
+ let timeoutId : number | undefined;
150
157
  if (options.timeout !== undefined) {
151
- timeout = setTimeout(() => {
152
- timeouted = true;
158
+ timeoutId = setTimeout(() => {
159
+ isTimedOut = true;
160
+ if (connectionTimeoutId !== undefined) {
161
+ clearTimeout(connectionTimeoutId);
162
+ }
153
163
  abortFetch();
154
164
  }, options.timeout);
155
165
  }
156
166
 
167
+ let connectionTimeoutId: number | undefined;
168
+ if (options.connectionTimeout !== undefined) {
169
+ connectionTimeoutId = setTimeout(() => {
170
+ isConnectionTimedOut = true;
171
+ if (timeoutId !== undefined) {
172
+ clearTimeout(timeoutId);
173
+ }
174
+ abortFetch();
175
+ }, options.connectionTimeout);
176
+ }
177
+
157
178
  const deregisterCancelLstnr = options.cancelSignal
158
179
  .register(function abortRequest(err : CancellationError) {
159
180
  cancellation = err;
@@ -170,8 +191,8 @@ export default function fetchRequest(
170
191
  options.url,
171
192
  fetchOpts
172
193
  ).then((response : Response) : Promise<IFetchedStreamComplete> => {
173
- if (!isNullOrUndefined(timeout)) {
174
- clearTimeout(timeout);
194
+ if (connectionTimeoutId !== undefined) {
195
+ clearTimeout(connectionTimeoutId);
175
196
  }
176
197
  if (response.status >= 300) {
177
198
  log.warn("Fetch: Request HTTP Error", response.status, response.url);
@@ -212,6 +233,9 @@ export default function fetchRequest(
212
233
  options.onData(dataInfo);
213
234
  return readBufferAndSendEvents();
214
235
  } else if (data.done) {
236
+ if (timeoutId !== undefined) {
237
+ clearTimeout(timeoutId);
238
+ }
215
239
  deregisterCancelLstnr();
216
240
  const receivedTime = getMonotonicTimeStamp();
217
241
  const requestDuration = receivedTime - sendingTime;
@@ -229,8 +253,11 @@ export default function fetchRequest(
229
253
  throw cancellation;
230
254
  }
231
255
  deregisterCancelLstnr();
232
- if (timeouted) {
233
- log.warn("Fetch: Request timeouted.");
256
+ if (isTimedOut) {
257
+ log.warn("Fetch: Request timed out.");
258
+ throw new RequestError(options.url, 0, NetworkErrorTypes.TIMEOUT);
259
+ } else if (isConnectionTimedOut) {
260
+ log.warn("Fetch: Request connection timed out.");
234
261
  throw new RequestError(options.url, 0, NetworkErrorTypes.TIMEOUT);
235
262
  } else if (err instanceof RequestError) {
236
263
  throw err;
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { RequestError } from "../../errors";
17
+ import { NetworkErrorTypes, RequestError } from "../../errors";
18
18
  import isNonEmptyString from "../is_non_empty_string";
19
19
  import isNullOrUndefined from "../is_null_or_undefined";
20
20
  import getMonotonicTimeStamp from "../monotonic_timestamp";
@@ -30,14 +30,14 @@ const DEFAULT_RESPONSE_TYPE : XMLHttpRequestResponseType = "json";
30
30
  * Perform an HTTP request, according to the options given.
31
31
  *
32
32
  * Several errors can be rejected. Namely:
33
- * - RequestErrorTypes.TIMEOUT_ERROR: the request timeouted (took too long to
34
- * respond).
35
- * - RequestErrorTypes.PARSE_ERROR: the browser APIs used to parse the
33
+ * - NetworkErrorTypes.TIMEOUT: the request timed out (took too long)
34
+ *
35
+ * - NetworkErrorTypes.PARSE_ERROR: the browser APIs used to parse the
36
36
  * data failed.
37
- * - RequestErrorTypes.ERROR_HTTP_CODE: the HTTP code at the time of reception
37
+ * - NetworkErrorTypes.ERROR_HTTP_CODE: the HTTP code at the time of reception
38
38
  * was not in the 200-299 (included)
39
39
  * range.
40
- * - RequestErrorTypes.ERROR_EVENT: The XHR had an error event before the
40
+ * - NetworkErrorTypes.ERROR_EVENT: The XHR had an error event before the
41
41
  * response could be fetched.
42
42
  * @param {Object} options
43
43
  * @returns {Promise.<Object>}
@@ -70,6 +70,7 @@ export default function request<T>(
70
70
  responseType: isNullOrUndefined(options.responseType) ? DEFAULT_RESPONSE_TYPE :
71
71
  options.responseType,
72
72
  timeout: options.timeout,
73
+ connectionTimeout: options.connectionTimeout,
73
74
  };
74
75
 
75
76
  return new Promise((resolve, reject) => {
@@ -77,7 +78,8 @@ export default function request<T>(
77
78
  const { url,
78
79
  headers,
79
80
  responseType,
80
- timeout } = requestOptions;
81
+ timeout,
82
+ connectionTimeout } = requestOptions;
81
83
  const xhr = new XMLHttpRequest();
82
84
  xhr.open("GET", url, true);
83
85
 
@@ -93,9 +95,19 @@ export default function request<T>(
93
95
  // is more precise, it might also be more efficient.
94
96
  timeoutId = setTimeout(() => {
95
97
  clearCancellingProcess();
96
- reject(new RequestError(url, xhr.status, "TIMEOUT"));
98
+ reject(new RequestError(url, xhr.status, NetworkErrorTypes.TIMEOUT));
97
99
  }, timeout + 3000);
98
100
  }
101
+ let connectionTimeoutId: undefined | number;
102
+ if (connectionTimeout !== undefined) {
103
+ connectionTimeoutId = setTimeout(() => {
104
+ clearCancellingProcess();
105
+ if (xhr.readyState !== XMLHttpRequest.DONE) {
106
+ xhr.abort();
107
+ }
108
+ reject(new RequestError(url, xhr.status, NetworkErrorTypes.TIMEOUT));
109
+ }, connectionTimeout);
110
+ }
99
111
 
100
112
  xhr.responseType = responseType;
101
113
 
@@ -120,7 +132,7 @@ export default function request<T>(
120
132
  deregisterCancellationListener = cancelSignal
121
133
  .register(function abortRequest(err : CancellationError) {
122
134
  clearCancellingProcess();
123
- if (!isNullOrUndefined(xhr) && xhr.readyState !== 4) {
135
+ if (xhr.readyState !== XMLHttpRequest.DONE) {
124
136
  xhr.abort();
125
137
  }
126
138
  reject(err);
@@ -133,14 +145,23 @@ export default function request<T>(
133
145
 
134
146
  xhr.onerror = function onXHRError() {
135
147
  clearCancellingProcess();
136
- reject(new RequestError(url, xhr.status, "ERROR_EVENT"));
148
+ reject(new RequestError(url, xhr.status, NetworkErrorTypes.ERROR_EVENT));
137
149
  };
138
150
 
139
151
  xhr.ontimeout = function onXHRTimeout() {
140
152
  clearCancellingProcess();
141
- reject(new RequestError(url, xhr.status, "TIMEOUT"));
153
+ reject(new RequestError(url, xhr.status, NetworkErrorTypes.TIMEOUT));
142
154
  };
143
155
 
156
+
157
+ if (connectionTimeout !== undefined) {
158
+ xhr.onreadystatechange = function clearConnectionTimeout() {
159
+ if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED) {
160
+ clearTimeout(connectionTimeoutId);
161
+ }
162
+ };
163
+ }
164
+
144
165
  if (onProgress !== undefined) {
145
166
  xhr.onprogress = function onXHRProgress(event) {
146
167
  const currentTime = getMonotonicTimeStamp();
@@ -154,7 +175,7 @@ export default function request<T>(
154
175
  }
155
176
 
156
177
  xhr.onload = function onXHRLoad(event : ProgressEvent) {
157
- if (xhr.readyState === 4) {
178
+ if (xhr.readyState === XMLHttpRequest.DONE) {
158
179
  clearCancellingProcess();
159
180
  if (xhr.status >= 200 && xhr.status < 300) {
160
181
  const receivedTime = getMonotonicTimeStamp();
@@ -179,7 +200,7 @@ export default function request<T>(
179
200
  }
180
201
 
181
202
  if (isNullOrUndefined(responseData)) {
182
- reject(new RequestError(url, xhr.status, "PARSE_ERROR"));
203
+ reject(new RequestError(url, xhr.status, NetworkErrorTypes.PARSE_ERROR));
183
204
  return;
184
205
  }
185
206
 
@@ -193,7 +214,7 @@ export default function request<T>(
193
214
  responseData });
194
215
 
195
216
  } else {
196
- reject(new RequestError(url, xhr.status, "ERROR_HTTP_CODE"));
217
+ reject(new RequestError(url, xhr.status, NetworkErrorTypes.ERROR_HTTP_CODE));
197
218
  }
198
219
  }
199
220
  };
@@ -207,6 +228,10 @@ export default function request<T>(
207
228
  if (timeoutId !== undefined) {
208
229
  clearTimeout(timeoutId);
209
230
  }
231
+
232
+ if (connectionTimeoutId !== undefined) {
233
+ clearTimeout(connectionTimeoutId);
234
+ }
210
235
  if (deregisterCancellationListener !== null) {
211
236
  deregisterCancellationListener();
212
237
  }
@@ -241,6 +266,12 @@ export interface IRequestOptions<ResponseType> {
241
266
  * To not set or to set to `undefined` for disable.
242
267
  */
243
268
  timeout? : number | undefined;
269
+ /**
270
+ * Optional connection timeout, in milliseconds, after which the request is canceled
271
+ * if the responses headers has not being received.
272
+ * Do not set or set to "undefined" to disable it.
273
+ */
274
+ connectionTimeout? : number | undefined;
244
275
  /**
245
276
  * "Cancelation token" used to be able to cancel the request.
246
277
  * When this token is "cancelled", the request will be aborted and the Promise
@@ -1,29 +0,0 @@
1
- /**
2
- * Copyright 2015 CANAL+ Group
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { ISegment } from "../../../manifest";
17
- import { IIndexSegment } from "./index_helpers";
18
- /**
19
- * Returns true if a Segment returned by the corresponding index is still
20
- * considered available.
21
- * Returns false if it is not available anymore.
22
- * Returns undefined if we cannot know whether it is still available or not.
23
- * /!\ We do not check the mediaURLs of the segment.
24
- * @param {Object} segment
25
- * @param {Array.<Object>} timescale
26
- * @param {number} timeline
27
- * @returns {Boolean|undefined}
28
- */
29
- export default function isSegmentStillAvailable(segment: ISegment, timeline: IIndexSegment[], timescale: number, indexTimeOffset: number): boolean | undefined;