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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +93 -0
  3. package/CONTRIBUTING.md +48 -168
  4. package/FILES.md +40 -92
  5. package/VERSION +1 -1
  6. package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
  7. package/dist/_esm5.processed/compat/browser_detection.js +85 -38
  8. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  9. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  10. package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
  11. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  12. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
  13. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
  14. package/dist/_esm5.processed/config.d.ts +4 -0
  15. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
  16. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
  17. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
  18. package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
  19. package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
  20. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
  21. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
  22. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  23. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  24. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  25. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  26. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  27. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  28. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  29. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  30. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
  32. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  33. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  34. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  35. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  36. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  37. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  38. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  39. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  40. package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
  41. package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
  42. package/dist/_esm5.processed/core/api/public_api.js +280 -60
  43. package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
  44. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
  45. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
  46. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
  47. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
  48. package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
  49. package/dist/_esm5.processed/core/api/utils.js +23 -3
  50. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
  51. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  52. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  53. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
  55. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
  56. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  57. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
  58. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
  59. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  60. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  61. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  62. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  63. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  64. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  65. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  66. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
  67. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
  68. package/dist/_esm5.processed/core/init/types.d.ts +9 -1
  69. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
  70. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
  71. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  72. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  73. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  74. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  75. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  76. package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
  77. package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
  78. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
  79. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
  80. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  81. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  82. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
  83. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
  84. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
  85. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
  86. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
  87. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
  88. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
  89. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  90. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  91. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
  92. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
  93. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
  94. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
  95. package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
  96. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
  97. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
  98. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
  99. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  100. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
  101. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
  102. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
  103. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
  104. package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
  105. package/dist/_esm5.processed/default_config.d.ts +41 -0
  106. package/dist/_esm5.processed/default_config.js +46 -2
  107. package/dist/_esm5.processed/errors/index.d.ts +2 -2
  108. package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
  109. package/dist/_esm5.processed/errors/media_error.js +18 -5
  110. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  111. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  112. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  113. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  114. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
  115. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
  116. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  117. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
  118. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
  119. package/dist/_esm5.processed/features/features_object.js +1 -0
  120. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  121. package/dist/_esm5.processed/features/types.d.ts +3 -0
  122. package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
  123. package/dist/_esm5.processed/manifest/adaptation.js +80 -1
  124. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  125. package/dist/_esm5.processed/manifest/period.js +2 -2
  126. package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
  127. package/dist/_esm5.processed/manifest/representation.js +32 -4
  128. package/dist/_esm5.processed/manifest/utils.js +1 -3
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  130. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
  134. package/dist/_esm5.processed/public_types.d.ts +13 -3
  135. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
  136. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  137. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  138. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  139. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  140. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  141. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
  142. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
  143. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  144. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  145. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  146. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  147. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  148. package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
  149. package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
  150. package/dist/_esm5.processed/utils/reference.js +6 -0
  151. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  152. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  153. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  154. package/dist/mpd-parser.wasm +0 -0
  155. package/dist/rx-player.js +5424 -4712
  156. package/dist/rx-player.min.js +1 -1
  157. package/jest.config.js +1 -5
  158. package/package.json +44 -40
  159. package/scripts/build/constants.d.ts +1 -0
  160. package/scripts/build/generate_build.js +1 -1
  161. package/scripts/fast_demo_build.js +40 -40
  162. package/scripts/generate_full_demo.js +1 -1
  163. package/sonar-project.properties +1 -1
  164. package/src/compat/browser_detection.ts +105 -52
  165. package/src/compat/can_reuse_media_keys.ts +5 -2
  166. package/src/compat/eme/close_session.ts +2 -2
  167. package/src/compat/eme/load_session.ts +1 -1
  168. package/src/compat/event_listeners.ts +1 -1
  169. package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
  170. package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
  171. package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
  172. package/src/core/adaptive/buffer_based_chooser.ts +144 -26
  173. package/src/core/adaptive/guess_based_chooser.ts +9 -8
  174. package/src/core/adaptive/network_analyzer.ts +9 -4
  175. package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
  176. package/src/core/api/debug/buffer_graph.ts +247 -0
  177. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  178. package/src/core/api/debug/constants.ts +2 -0
  179. package/src/core/api/debug/index.ts +3 -0
  180. package/src/core/api/debug/modules/general_info.ts +184 -0
  181. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  182. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  183. package/src/core/api/debug/render.ts +40 -0
  184. package/src/core/api/debug/utils.ts +103 -0
  185. package/src/core/api/playback_observer.ts +5 -2
  186. package/src/core/api/public_api.ts +334 -73
  187. package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
  188. package/src/core/api/track_management/track_dispatcher.ts +37 -14
  189. package/src/core/api/track_management/tracks_store.ts +77 -167
  190. package/src/core/api/utils.ts +29 -3
  191. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  192. package/src/core/decrypt/attach_media_keys.ts +1 -1
  193. package/src/core/decrypt/content_decryptor.ts +1 -1
  194. package/src/core/decrypt/find_key_system.ts +25 -11
  195. package/src/core/decrypt/session_events_listener.ts +45 -39
  196. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  197. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
  198. package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
  199. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  200. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  201. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  202. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  203. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  204. package/src/core/init/directfile_content_initializer.ts +2 -1
  205. package/src/core/init/media_source_content_initializer.ts +89 -50
  206. package/src/core/init/types.ts +9 -1
  207. package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
  208. package/src/core/init/utils/create_media_source.ts +4 -16
  209. package/src/core/init/utils/end_of_stream.ts +6 -3
  210. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  211. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  212. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  213. package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
  214. package/src/core/init/utils/rebuffering_controller.ts +115 -4
  215. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  216. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  217. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
  218. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
  219. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
  220. package/src/core/segment_buffers/implementations/types.ts +16 -4
  221. package/src/core/segment_buffers/index.ts +2 -0
  222. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  223. package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
  224. package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
  225. package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
  226. package/src/core/stream/period/period_stream.ts +13 -11
  227. package/src/core/stream/representation/representation_stream.ts +49 -37
  228. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
  229. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  230. package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
  231. package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
  232. package/src/core/stream/utils/create_reload_request.ts +1 -1
  233. package/src/default_config.ts +59 -11
  234. package/src/errors/__tests__/media_error.test.ts +6 -6
  235. package/src/errors/index.ts +4 -1
  236. package/src/errors/media_error.ts +67 -1
  237. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  238. package/src/experimental/features/debug_element.ts +13 -0
  239. package/src/experimental/features/index.ts +1 -0
  240. package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
  241. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  242. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
  243. package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
  244. package/src/features/__tests__/initialize_features.test.ts +11 -0
  245. package/src/features/features_object.ts +1 -0
  246. package/src/features/initialize_features.ts +15 -10
  247. package/src/features/types.ts +9 -0
  248. package/src/manifest/__tests__/manifest.test.ts +7 -7
  249. package/src/manifest/__tests__/period.test.ts +90 -45
  250. package/src/manifest/adaptation.ts +96 -1
  251. package/src/manifest/manifest.ts +4 -0
  252. package/src/manifest/period.ts +4 -2
  253. package/src/manifest/representation.ts +77 -5
  254. package/src/manifest/utils.ts +1 -3
  255. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  256. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  257. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
  258. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
  259. package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
  260. package/src/public_types.ts +16 -1
  261. package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
  262. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  263. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  264. package/src/transports/dash/manifest_parser.ts +1 -1
  265. package/src/transports/dash/segment_loader.ts +4 -4
  266. package/src/transports/local/segment_loader.ts +14 -30
  267. package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
  268. package/src/transports/smooth/segment_loader.ts +4 -4
  269. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  270. package/src/typings/globals.d.ts +21 -19
  271. package/src/utils/cancellable_sleep.ts +5 -14
  272. package/src/utils/create_cancellable_promise.ts +69 -0
  273. package/src/utils/is_null_or_undefined.ts +1 -1
  274. package/src/utils/reference.ts +6 -0
  275. package/src/utils/request/xhr.ts +1 -1
  276. package/src/utils/task_canceller.ts +63 -34
  277. package/tsconfig.json +1 -1
  278. package/tsconfig.modules.json +1 -1
  279. package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
  280. package/locked_reps.js +0 -46
  281. package/scripts/doc-generator/construct_table_of_contents.js +0 -76
  282. package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
  283. package/scripts/doc-generator/create_documentation.js +0 -331
  284. package/scripts/doc-generator/create_documentation_page.js +0 -209
  285. package/scripts/doc-generator/create_page.js +0 -210
  286. package/scripts/doc-generator/generate_header_html.js +0 -147
  287. package/scripts/doc-generator/generate_page_html.js +0 -115
  288. package/scripts/doc-generator/generate_page_list_html.js +0 -92
  289. package/scripts/doc-generator/generate_sidebar_html.js +0 -85
  290. package/scripts/doc-generator/get_search_data_for_content.js +0 -137
  291. package/scripts/doc-generator/index.js +0 -34
  292. package/scripts/doc-generator/parse_doc_configs.js +0 -327
  293. package/scripts/doc-generator/scripts/lunr.js +0 -10
  294. package/scripts/doc-generator/scripts/script.js +0 -451
  295. package/scripts/doc-generator/styles/code.css +0 -99
  296. package/scripts/doc-generator/styles/style.css +0 -835
  297. package/scripts/doc-generator/utils.js +0 -74
@@ -1,5 +1,6 @@
1
1
  import log from "../../../log";
2
2
  import arrayFindIndex from "../../../utils/array_find_index";
3
+ import createCancellablePromise from "../../../utils/create_cancellable_promise";
3
4
  import TaskCanceller, { CancellationError, } from "../../../utils/task_canceller";
4
5
  var TaskPrioritizer = /** @class */ (function () {
5
6
  /**
@@ -41,18 +42,31 @@ var TaskPrioritizer = /** @class */ (function () {
41
42
  TaskPrioritizer.prototype.create = function (taskFn, priority, callbacks, cancelSignal) {
42
43
  var _this = this;
43
44
  var newTask;
44
- return new Promise(function (resolve, reject) {
45
+ return createCancellablePromise(cancelSignal, function (resolve, reject) {
45
46
  /** Function allowing to start the underlying Promise. */
46
47
  var trigger = function () {
47
48
  if (newTask.hasEnded) {
48
- unregisterCancelSignal();
49
49
  return;
50
50
  }
51
- var interrupter = new TaskCanceller({ cancelOn: cancelSignal });
51
+ var finishTask = function () {
52
+ unlinkInterrupter();
53
+ _this._endTask(newTask);
54
+ };
55
+ var onResolve = function (value) {
56
+ callbacks.beforeEnded();
57
+ finishTask();
58
+ resolve(value);
59
+ };
60
+ var onReject = function (err) {
61
+ finishTask();
62
+ reject(err);
63
+ };
64
+ var interrupter = new TaskCanceller();
65
+ var unlinkInterrupter = interrupter.linkToSignal(cancelSignal);
52
66
  newTask.interrupter = interrupter;
53
67
  interrupter.signal.register(function () {
54
68
  newTask.interrupter = null;
55
- if (!cancelSignal.isCancelled) {
69
+ if (!cancelSignal.isCancelled()) {
56
70
  callbacks.beforeInterrupted();
57
71
  }
58
72
  });
@@ -63,31 +77,14 @@ var TaskPrioritizer = /** @class */ (function () {
63
77
  newTask.taskFn(interrupter.signal)
64
78
  .then(onResolve)
65
79
  .catch(function (err) {
66
- if (!cancelSignal.isCancelled &&
67
- interrupter.isUsed &&
80
+ if (!cancelSignal.isCancelled() &&
81
+ interrupter.isUsed() &&
68
82
  err instanceof CancellationError) {
69
83
  return;
70
84
  }
71
85
  onReject(err);
72
86
  });
73
87
  };
74
- var unregisterCancelSignal = cancelSignal.register(function (cancellationError) {
75
- _this._endTask(newTask);
76
- reject(cancellationError);
77
- });
78
- var finishTask = function () {
79
- unregisterCancelSignal();
80
- _this._endTask(newTask);
81
- };
82
- var onResolve = function (value) {
83
- callbacks.beforeEnded();
84
- finishTask();
85
- resolve(value);
86
- };
87
- var onReject = function (err) {
88
- finishTask();
89
- reject(err);
90
- };
91
88
  newTask = {
92
89
  hasEnded: false,
93
90
  priority: priority,
@@ -112,6 +109,7 @@ var TaskPrioritizer = /** @class */ (function () {
112
109
  _this._interruptCancellableTasks();
113
110
  }
114
111
  }
112
+ return function () { return _this._endTask(newTask); };
115
113
  });
116
114
  };
117
115
  TaskPrioritizer.prototype._endTask = function (task) {
@@ -251,14 +251,14 @@ export function scheduleRequestWithCdns(cdns, cdnPrioritizer, performRequest, op
251
251
  var nextCdn;
252
252
  return __generator(this, function (_a) {
253
253
  nextCdn = getCdnToRequest();
254
- if (cancellationSignal.isCancelled) {
254
+ if (cancellationSignal.isCancelled()) {
255
255
  throw cancellationSignal.cancellationError;
256
256
  }
257
257
  if (nextCdn === undefined) {
258
258
  throw prevRequestError;
259
259
  }
260
260
  onRetry(prevRequestError);
261
- if (cancellationSignal.isCancelled) {
261
+ if (cancellationSignal.isCancelled()) {
262
262
  throw cancellationSignal.cancellationError;
263
263
  }
264
264
  return [2 /*return*/, waitPotentialBackoffAndRequest(nextCdn, prevRequestError)];
@@ -286,25 +286,35 @@ export function scheduleRequestWithCdns(cdns, cdnPrioritizer, performRequest, op
286
286
  if (blockedFor <= 0) {
287
287
  return requestCdn(nextWantedCdn);
288
288
  }
289
- var canceller = new TaskCanceller({ cancelOn: cancellationSignal });
289
+ var canceller = new TaskCanceller();
290
+ var unlinkCanceller = canceller.linkToSignal(cancellationSignal);
290
291
  return new Promise(function (res, rej) {
291
292
  /* eslint-disable-next-line @typescript-eslint/no-misused-promises */
292
293
  cdnPrioritizer === null || cdnPrioritizer === void 0 ? void 0 : cdnPrioritizer.addEventListener("priorityChange", function () {
293
294
  var updatedPrioritaryCdn = getCdnToRequest();
294
- if (cancellationSignal.isCancelled) {
295
+ if (cancellationSignal.isCancelled()) {
295
296
  throw cancellationSignal.cancellationError;
296
297
  }
297
298
  if (updatedPrioritaryCdn === undefined) {
298
- return rej(prevRequestError);
299
+ return cleanAndReject(prevRequestError);
299
300
  }
300
301
  if (updatedPrioritaryCdn !== nextWantedCdn) {
301
302
  canceller.cancel();
302
303
  waitPotentialBackoffAndRequest(updatedPrioritaryCdn, prevRequestError)
303
- .then(res, rej);
304
+ .then(cleanAndResolve, cleanAndReject);
304
305
  }
305
306
  }, canceller.signal);
306
307
  cancellableSleep(blockedFor, canceller.signal)
307
- .then(function () { return requestCdn(nextWantedCdn).then(res, rej); }, noop);
308
+ .then(function () { return requestCdn(nextWantedCdn)
309
+ .then(cleanAndResolve, cleanAndReject); }, noop);
310
+ function cleanAndResolve(response) {
311
+ unlinkCanceller();
312
+ res(response);
313
+ }
314
+ function cleanAndReject(err) {
315
+ unlinkCanceller();
316
+ rej(err);
317
+ }
308
318
  });
309
319
  }
310
320
  /**
@@ -73,7 +73,7 @@ var DirectFileContentInitializer = /** @class */ (function (_super) {
73
73
  * Class trying to avoid various stalling situations, emitting "stalled"
74
74
  * events when it cannot, as well as "unstalled" events when it get out of one.
75
75
  */
76
- var rebufferingController = new RebufferingController(playbackObserver, null, speed);
76
+ var rebufferingController = new RebufferingController(playbackObserver, null, null, speed);
77
77
  rebufferingController.addEventListener("stalled", function (evt) {
78
78
  return _this.trigger("stalled", evt);
79
79
  });
@@ -145,7 +145,7 @@ var DirectFileContentInitializer = /** @class */ (function (_super) {
145
145
  }, { emitCurrentValue: true, clearSignal: cancelSignal });
146
146
  })
147
147
  .catch(function (err) {
148
- if (!cancelSignal.isCancelled) {
148
+ if (!cancelSignal.isCancelled()) {
149
149
  _this._onFatalError(err);
150
150
  }
151
151
  });
@@ -69,6 +69,7 @@ import config from "../../config";
69
69
  import { MediaError } from "../../errors";
70
70
  import log from "../../log";
71
71
  import assert from "../../utils/assert";
72
+ import createCancellablePromise from "../../utils/create_cancellable_promise";
72
73
  import objectAssign from "../../utils/object_assign";
73
74
  import createSharedReference from "../../utils/reference";
74
75
  import TaskCanceller from "../../utils/task_canceller";
@@ -86,7 +87,7 @@ import getInitialTime from "./utils/get_initial_time";
86
87
  import getLoadedReference from "./utils/get_loaded_reference";
87
88
  import performInitialSeekAndPlay from "./utils/initial_seek_and_play";
88
89
  import initializeContentDecryption from "./utils/initialize_content_decryption";
89
- import MediaDurationUpdater from "./utils/media_duration_updater";
90
+ import MediaSourceDurationUpdater from "./utils/media_source_duration_updater";
90
91
  import RebufferingController from "./utils/rebuffering_controller";
91
92
  import streamEventsEmitter from "./utils/stream_events_emitter";
92
93
  import listenToMediaError from "./utils/throw_on_media_error";
@@ -127,11 +128,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
127
128
  if (this._initialManifestProm !== null) {
128
129
  return;
129
130
  }
130
- this._initialManifestProm = new Promise(function (res, rej) {
131
- _this._initCanceller.signal.register(function (err) {
132
- _this._manifestFetcher.dispose();
133
- rej(err);
134
- });
131
+ this._initialManifestProm = createCancellablePromise(this._initCanceller.signal, function (res, rej) {
135
132
  _this._manifestFetcher.addEventListener("warning", function (err) {
136
133
  return _this.trigger("warning", err);
137
134
  });
@@ -142,7 +139,10 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
142
139
  _this._manifestFetcher.addEventListener("manifestReady", function (manifest) {
143
140
  res(manifest);
144
141
  });
145
- _this._manifestFetcher.start();
142
+ });
143
+ this._manifestFetcher.start();
144
+ this._initCanceller.signal.register(function () {
145
+ _this._manifestFetcher.dispose();
146
146
  });
147
147
  };
148
148
  /**
@@ -176,7 +176,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
176
176
  this._initCanceller.cancel();
177
177
  };
178
178
  MediaSourceContentInitializer.prototype._onFatalError = function (err) {
179
- if (this._initCanceller.isUsed) {
179
+ if (this._initCanceller.isUsed()) {
180
180
  return;
181
181
  }
182
182
  this._initCanceller.cancel();
@@ -184,12 +184,9 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
184
184
  };
185
185
  MediaSourceContentInitializer.prototype._initializeMediaSourceAndDecryption = function (mediaElement, protectionRef) {
186
186
  var _this = this;
187
- return new Promise(function (resolve, reject) {
187
+ var initCanceller = this._initCanceller;
188
+ return createCancellablePromise(initCanceller.signal, function (resolve) {
188
189
  var keySystems = _this._settings.keySystems;
189
- var initCanceller = _this._initCanceller;
190
- var unregisterReject = initCanceller.signal.register(function (err) {
191
- reject(err);
192
- });
193
190
  /** Initialize decryption capabilities. */
194
191
  var drmInitRef = initializeContentDecryption(mediaElement, keySystems, protectionRef, {
195
192
  onWarning: function (err) { return _this.trigger("warning", err); },
@@ -200,9 +197,8 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
200
197
  return;
201
198
  }
202
199
  stopListeningToDrmUpdates();
203
- var mediaSourceCanceller = new TaskCanceller({
204
- cancelOn: initCanceller.signal,
205
- });
200
+ var mediaSourceCanceller = new TaskCanceller();
201
+ mediaSourceCanceller.linkToSignal(initCanceller.signal);
206
202
  openMediaSource(mediaElement, mediaSourceCanceller.signal)
207
203
  .then(function (mediaSource) {
208
204
  var lastDrmStatus = drmInitRef.getValue();
@@ -211,7 +207,6 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
211
207
  drmInitRef.onUpdate(function (newDrmStatus, stopListeningToDrmUpdatesAgain) {
212
208
  if (newDrmStatus.initializationState.type === "initialized") {
213
209
  stopListeningToDrmUpdatesAgain();
214
- unregisterReject();
215
210
  resolve({ mediaSource: mediaSource, drmSystemId: newDrmStatus.drmSystemId,
216
211
  unlinkMediaSource: mediaSourceCanceller });
217
212
  return;
@@ -219,14 +214,13 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
219
214
  }, { emitCurrentValue: true, clearSignal: initCanceller.signal });
220
215
  }
221
216
  else if (drmStatus.initializationState.type === "initialized") {
222
- unregisterReject();
223
217
  resolve({ mediaSource: mediaSource, drmSystemId: drmStatus.drmSystemId,
224
218
  unlinkMediaSource: mediaSourceCanceller });
225
219
  return;
226
220
  }
227
221
  })
228
222
  .catch(function (err) {
229
- if (mediaSourceCanceller.isUsed) {
223
+ if (mediaSourceCanceller.isUsed()) {
230
224
  return;
231
225
  }
232
226
  _this._onFatalError(err);
@@ -252,20 +246,21 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
252
246
  bufferOnMediaSource(opts, onReloadMediaSource, currentCanceller.signal);
253
247
  function onReloadMediaSource(reloadOrder) {
254
248
  currentCanceller.cancel();
255
- if (initCanceller.isUsed) {
249
+ if (initCanceller.isUsed()) {
256
250
  return;
257
251
  }
258
- triggerEvent("reloadingMediaSource", null);
259
- if (initCanceller.isUsed) {
252
+ triggerEvent("reloadingMediaSource", reloadOrder);
253
+ if (initCanceller.isUsed()) {
260
254
  return;
261
255
  }
262
- var newCanceller = new TaskCanceller({ cancelOn: initCanceller.signal });
256
+ var newCanceller = new TaskCanceller();
257
+ newCanceller.linkToSignal(initCanceller.signal);
263
258
  openMediaSource(mediaElement, newCanceller.signal)
264
259
  .then(function (newMediaSource) {
265
260
  recursivelyLoadOnMediaSource(newMediaSource, reloadOrder.position, reloadOrder.autoPlay, newCanceller);
266
261
  })
267
262
  .catch(function (err) {
268
- if (newCanceller.isUsed) {
263
+ if (newCanceller.isUsed()) {
269
264
  return;
270
265
  }
271
266
  onFatalError(err);
@@ -302,7 +297,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
302
297
  subBufferOptions = objectAssign({ textTrackOptions: textTrackOptions, drmSystemId: drmSystemId }, bufferOptions);
303
298
  segmentFetcherCreator = new SegmentFetcherCreator(transport, segmentRequestOptions, initCanceller.signal);
304
299
  this.trigger("manifestReady", manifest);
305
- if (initCanceller.isUsed) {
300
+ if (initCanceller.isUsed()) {
306
301
  return [2 /*return*/];
307
302
  }
308
303
  bufferOnMediaSource = this._startBufferingOnMediaSource.bind(this);
@@ -336,7 +331,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
336
331
  segmentBuffersStore.disposeAll();
337
332
  });
338
333
  var _b = performInitialSeekAndPlay(mediaElement, playbackObserver, initialTime, autoPlay, function (err) { return _this.trigger("warning", err); }, cancelSignal), autoPlayResult = _b.autoPlayResult, initialPlayPerformed = _b.initialPlayPerformed, initialSeekPerformed = _b.initialSeekPerformed;
339
- if (cancelSignal.isCancelled) {
334
+ if (cancelSignal.isCancelled()) {
340
335
  return;
341
336
  }
342
337
  initialPlayPerformed.onUpdate(function (isPerformed, stopListening) {
@@ -346,7 +341,18 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
346
341
  }
347
342
  }, { clearSignal: cancelSignal, emitCurrentValue: true });
348
343
  var streamObserver = createStreamPlaybackObserver(manifest, playbackObserver, { autoPlay: autoPlay, initialPlayPerformed: initialPlayPerformed, initialSeekPerformed: initialSeekPerformed, speed: speed, startTime: initialTime });
349
- var rebufferingController = this._createRebufferingController(playbackObserver, manifest, speed, cancelSignal);
344
+ var rebufferingController = this._createRebufferingController(playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal);
345
+ rebufferingController.addEventListener("needsReload", function () {
346
+ // NOTE couldn't both be always calculated at event destination?
347
+ // Maybe there are exceptions?
348
+ var position = initialSeekPerformed.getValue() ?
349
+ playbackObserver.getCurrentTime() :
350
+ initialTime;
351
+ var autoplay = initialPlayPerformed.getValue() ?
352
+ !playbackObserver.getIsPaused() :
353
+ autoPlay;
354
+ onReloadOrder({ position: position, autoPlay: autoplay });
355
+ }, cancelSignal);
350
356
  var contentTimeBoundariesObserver = this
351
357
  ._createContentTimeBoundariesObserver(manifest, mediaSource, streamObserver, segmentBuffersStore, cancelSignal);
352
358
  /**
@@ -365,7 +371,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
365
371
  }, { emitCurrentValue: true, clearSignal: cancelSignal });
366
372
  })
367
373
  .catch(function (err) {
368
- if (cancelSignal.isCancelled) {
374
+ if (cancelSignal.isCancelled()) {
369
375
  return; // Current loading cancelled, no need to trigger the error
370
376
  }
371
377
  _this._onFatalError(err);
@@ -381,7 +387,32 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
381
387
  function handleStreamOrchestratorCallbacks() {
382
388
  return {
383
389
  needsBufferFlush: function () {
384
- return playbackObserver.setCurrentTime(mediaElement.currentTime + 0.001);
390
+ var seekedTime = mediaElement.currentTime + 0.001;
391
+ playbackObserver.setCurrentTime(seekedTime);
392
+ // Seek again once data begins to be buffered.
393
+ // This is sadly necessary on some browsers to avoid decoding
394
+ // issues after a flush.
395
+ //
396
+ // NOTE: there's in theory a potential race condition in the following
397
+ // logic as the callback could be called when media data is still
398
+ // being removed by the browser - which is an asynchronous process.
399
+ // The following condition checking for buffered data could thus lead
400
+ // to a false positive where we're actually checking previous data.
401
+ // For now, such scenario is avoided by setting the
402
+ // `includeLastObservation` option to `false` and calling
403
+ // `needsBufferFlush` once MSE media removal operations have been
404
+ // explicitely validated by the browser, but that's a complex and easy
405
+ // to break system.
406
+ playbackObserver.listen(function (obs, stopListening) {
407
+ if (
408
+ // Data is buffered around the current position
409
+ obs.currentRange !== null ||
410
+ // Or, for whatever reason, playback is already advancing
411
+ obs.position > seekedTime + 0.1) {
412
+ stopListening();
413
+ playbackObserver.setCurrentTime(obs.position + 0.001);
414
+ }
415
+ }, { includeLastObservation: false, clearSignal: cancelSignal });
385
416
  },
386
417
  streamStatusUpdate: function (value) {
387
418
  // Announce discontinuities if found
@@ -392,7 +423,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
392
423
  discontinuity: imminentDiscontinuity,
393
424
  position: position,
394
425
  });
395
- if (cancelSignal.isCancelled) {
426
+ if (cancelSignal.isCancelled()) {
396
427
  return; // Previous call has stopped streams due to a side-effect
397
428
  }
398
429
  // If the status for the last Period indicates that segments are all loaded
@@ -429,14 +460,14 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
429
460
  },
430
461
  adaptationChange: function (value) {
431
462
  self.trigger("adaptationChange", value);
432
- if (cancelSignal.isCancelled) {
463
+ if (cancelSignal.isCancelled()) {
433
464
  return; // Previous call has stopped streams due to a side-effect
434
465
  }
435
466
  contentTimeBoundariesObserver.onAdaptationChange(value.type, value.period, value.adaptation);
436
467
  },
437
468
  representationChange: function (value) {
438
469
  self.trigger("representationChange", value);
439
- if (cancelSignal.isCancelled) {
470
+ if (cancelSignal.isCancelled()) {
440
471
  return; // Previous call has stopped streams due to a side-effect
441
472
  }
442
473
  contentTimeBoundariesObserver.onRepresentationChange(value.type, value.period);
@@ -446,7 +477,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
446
477
  periodStreamReady: function (value) { return self.trigger("periodStreamReady", value); },
447
478
  periodStreamCleared: function (value) {
448
479
  contentTimeBoundariesObserver.onPeriodCleared(value.type, value.period);
449
- if (cancelSignal.isCancelled) {
480
+ if (cancelSignal.isCancelled()) {
450
481
  return; // Previous call has stopped streams due to a side-effect
451
482
  }
452
483
  self.trigger("periodStreamCleared", value);
@@ -476,7 +507,7 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
476
507
  for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
477
508
  var protectionData = value_1[_i];
478
509
  protectionRef.setValue(protectionData);
479
- if (cancelSignal.isCancelled) {
510
+ if (cancelSignal.isCancelled()) {
480
511
  return; // Previous call has stopped streams due to a side-effect
481
512
  }
482
513
  }
@@ -503,9 +534,9 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
503
534
  MediaSourceContentInitializer.prototype._createContentTimeBoundariesObserver = function (manifest, mediaSource, streamObserver, segmentBuffersStore, cancelSignal) {
504
535
  var _this = this;
505
536
  /** Maintains the MediaSource's duration up-to-date with the Manifest */
506
- var mediaDurationUpdater = new MediaDurationUpdater(manifest, mediaSource);
537
+ var mediaSourceDurationUpdater = new MediaSourceDurationUpdater(mediaSource);
507
538
  cancelSignal.register(function () {
508
- mediaDurationUpdater.stop();
539
+ mediaSourceDurationUpdater.stopUpdating();
509
540
  });
510
541
  /** Allows to cancel a pending `end-of-stream` operation. */
511
542
  var endOfStreamCanceller = null;
@@ -520,12 +551,12 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
520
551
  _this.trigger("activePeriodChanged", { period: period });
521
552
  });
522
553
  contentTimeBoundariesObserver.addEventListener("durationUpdate", function (newDuration) {
523
- log.debug("Init: Duration has to be updated.", newDuration);
524
- mediaDurationUpdater.updateKnownDuration(newDuration);
554
+ mediaSourceDurationUpdater.updateDuration(newDuration.duration, newDuration.isEnd);
525
555
  });
526
556
  contentTimeBoundariesObserver.addEventListener("endOfStream", function () {
527
557
  if (endOfStreamCanceller === null) {
528
- endOfStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
558
+ endOfStreamCanceller = new TaskCanceller();
559
+ endOfStreamCanceller.linkToSignal(cancelSignal);
529
560
  log.debug("Init: end-of-stream order received.");
530
561
  maintainEndOfStream(mediaSource, endOfStreamCanceller.signal);
531
562
  }
@@ -537,6 +568,8 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
537
568
  endOfStreamCanceller = null;
538
569
  }
539
570
  });
571
+ var currentDuration = contentTimeBoundariesObserver.getCurrentDuration();
572
+ mediaSourceDurationUpdater.updateDuration(currentDuration.duration, currentDuration.isEnd);
540
573
  return contentTimeBoundariesObserver;
541
574
  };
542
575
  /**
@@ -557,9 +590,9 @@ var MediaSourceContentInitializer = /** @class */ (function (_super) {
557
590
  * @param {Object} cancelSignal
558
591
  * @returns {Object}
559
592
  */
560
- MediaSourceContentInitializer.prototype._createRebufferingController = function (playbackObserver, manifest, speed, cancelSignal) {
593
+ MediaSourceContentInitializer.prototype._createRebufferingController = function (playbackObserver, manifest, segmentBuffersStore, speed, cancelSignal) {
561
594
  var _this = this;
562
- var rebufferingController = new RebufferingController(playbackObserver, manifest, speed);
595
+ var rebufferingController = new RebufferingController(playbackObserver, manifest, segmentBuffersStore, speed);
563
596
  // Bubble-up events
564
597
  rebufferingController.addEventListener("stalled", function (evt) { return _this.trigger("stalled", evt); });
565
598
  rebufferingController.addEventListener("unstalled", function () { return _this.trigger("unstalled", null); });
@@ -95,7 +95,15 @@ export interface IContentInitializerEvents {
95
95
  * Event sent when we're starting attach a new MediaSource to the media element
96
96
  * (after removing the previous one).
97
97
  */
98
- reloadingMediaSource: null;
98
+ reloadingMediaSource: {
99
+ /** The position we're reloading at, in seconds. */
100
+ position: number;
101
+ /**
102
+ * If `true`, we'll play directly after finishing the reloading operation.
103
+ * If `false`, we'll be paused after it.
104
+ */
105
+ autoPlay: boolean;
106
+ };
99
107
  /** Event sent after the player stalled. */
100
108
  stalled: IStallingSituation;
101
109
  /** Event sent when the player goes out of a stalling situation. */
@@ -55,6 +55,11 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
55
55
  * @param {Object} playbackObserver
56
56
  */
57
57
  constructor(manifest: Manifest, playbackObserver: IReadOnlyPlaybackObserver<IStreamOrchestratorPlaybackObservation>, bufferTypes: IBufferType[]);
58
+ /**
59
+ * Returns an estimate of the current duration of the content.
60
+ * @returns {Object}
61
+ */
62
+ getCurrentDuration(): IDurationItem;
58
63
  /**
59
64
  * Method to call any time an Adaptation has been selected.
60
65
  *
@@ -121,9 +126,31 @@ export default class ContentTimeBoundariesObserver extends EventEmitter<IContent
121
126
  private _addActivelyLoadedPeriod;
122
127
  private _removeActivelyLoadedPeriod;
123
128
  private _checkCurrentPeriod;
129
+ private _getManifestDuration;
124
130
  private _lazilyCreateActiveStreamInfo;
125
131
  private _checkEndOfStream;
126
132
  }
133
+ export interface IDurationItem {
134
+ /**
135
+ * The new maximum known position (note that this is the ending position
136
+ * currently known of the current content, it might be superior to the last
137
+ * position at which segments are available and it might also evolve over
138
+ * time), in seconds.
139
+ */
140
+ duration: number;
141
+ /**
142
+ * If `true`, the communicated `duration` is the actual end of the content.
143
+ * It may still be updated due to a track change or to add precision, but it
144
+ * is still a (rough) estimate of the maximum position that content should
145
+ * have.
146
+ *
147
+ * If `false`, this is the currently known maximum position associated to
148
+ * the content, but the content is still evolving (typically, new media
149
+ * segments are still being generated) and as such it can still have a
150
+ * longer duration in the future.
151
+ */
152
+ isEnd: boolean;
153
+ }
127
154
  /**
128
155
  * Events triggered by a `ContentTimeBoundariesObserver` where the keys are the
129
156
  * event names and the value is the payload of those events.
@@ -137,7 +164,7 @@ export interface IContentTimeBoundariesObserverEvent {
137
164
  * Triggered when the duration of the currently-playing content became known
138
165
  * or changed.
139
166
  */
140
- durationUpdate: number | undefined;
167
+ durationUpdate: IDurationItem;
141
168
  /**
142
169
  * Triggered when the last possible chronological segment for all types of
143
170
  * buffers has either been pushed or is being pushed to the corresponding
@@ -82,19 +82,21 @@ var ContentTimeBoundariesObserver = /** @class */ (function (_super) {
82
82
  }
83
83
  }, { includeLastObservation: true, clearSignal: cancelSignal });
84
84
  manifest.addEventListener("manifestUpdate", function () {
85
- _this.trigger("durationUpdate", getManifestDuration());
86
- if (cancelSignal.isCancelled) {
85
+ _this.trigger("durationUpdate", _this._getManifestDuration());
86
+ if (cancelSignal.isCancelled()) {
87
87
  return;
88
88
  }
89
89
  _this._checkEndOfStream();
90
90
  }, cancelSignal);
91
- function getManifestDuration() {
92
- return manifest.isDynamic ?
93
- maximumPositionCalculator.getMaximumAvailablePosition() :
94
- maximumPositionCalculator.getEndingPosition();
95
- }
96
91
  return _this;
97
92
  }
93
+ /**
94
+ * Returns an estimate of the current duration of the content.
95
+ * @returns {Object}
96
+ */
97
+ ContentTimeBoundariesObserver.prototype.getCurrentDuration = function () {
98
+ return this._getManifestDuration();
99
+ };
98
100
  /**
99
101
  * Method to call any time an Adaptation has been selected.
100
102
  *
@@ -121,14 +123,17 @@ var ContentTimeBoundariesObserver = /** @class */ (function (_super) {
121
123
  this._maximumPositionCalculator
122
124
  .updateLastVideoAdaptation(adaptation);
123
125
  }
124
- var newDuration = this._manifest.isDynamic ?
125
- this._maximumPositionCalculator.getMaximumAvailablePosition() :
126
- this._maximumPositionCalculator.getEndingPosition();
126
+ var endingPosition = this._maximumPositionCalculator.getEndingPosition();
127
+ var newDuration = endingPosition !== undefined ?
128
+ { isEnd: true,
129
+ duration: endingPosition } :
130
+ { isEnd: false,
131
+ duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
127
132
  this.trigger("durationUpdate", newDuration);
128
133
  }
129
134
  }
130
135
  }
131
- if (this._canceller.isUsed) {
136
+ if (this._canceller.isUsed()) {
132
137
  return;
133
138
  }
134
139
  if (adaptation === null) {
@@ -258,6 +263,14 @@ var ContentTimeBoundariesObserver = /** @class */ (function (_super) {
258
263
  return state_1.value;
259
264
  }
260
265
  };
266
+ ContentTimeBoundariesObserver.prototype._getManifestDuration = function () {
267
+ var endingPosition = this._maximumPositionCalculator.getEndingPosition();
268
+ return endingPosition !== undefined ?
269
+ { isEnd: true,
270
+ duration: endingPosition } :
271
+ { isEnd: false,
272
+ duration: this._maximumPositionCalculator.getMaximumAvailablePosition() };
273
+ };
261
274
  ContentTimeBoundariesObserver.prototype._lazilyCreateActiveStreamInfo = function (bufferType) {
262
275
  var streamInfo = this._activeStreams.get(bufferType);
263
276
  if (streamInfo === undefined) {
@@ -16,8 +16,8 @@
16
16
  import { clearElementSrc, events, MediaSource_, } from "../../../compat";
17
17
  import { MediaError } from "../../../errors";
18
18
  import log from "../../../log";
19
+ import createCancellablePromise from "../../../utils/create_cancellable_promise";
19
20
  import isNonEmptyString from "../../../utils/is_non_empty_string";
20
- import TaskCanceller from "../../../utils/task_canceller";
21
21
  /**
22
22
  * Dispose of ressources taken by the MediaSource:
23
23
  * - Clear the MediaSource' SourceBuffers
@@ -100,19 +100,10 @@ function createMediaSource(mediaElement, unlinkSignal) {
100
100
  * @returns {Promise}
101
101
  */
102
102
  export default function openMediaSource(mediaElement, unlinkSignal) {
103
- return new Promise(function (resolve, reject) {
104
- var hasResolved = false;
103
+ return createCancellablePromise(unlinkSignal, function (resolve) {
105
104
  var mediaSource = createMediaSource(mediaElement, unlinkSignal);
106
- var eventListenerCanceller = new TaskCanceller({ cancelOn: unlinkSignal });
107
105
  events.onSourceOpen(mediaSource, function () {
108
- eventListenerCanceller.cancel();
109
- hasResolved = true;
110
106
  resolve(mediaSource);
111
- }, eventListenerCanceller.signal);
112
- unlinkSignal.register(function (error) {
113
- if (!hasResolved) {
114
- reject(error);
115
- }
116
- });
107
+ }, unlinkSignal);
117
108
  });
118
109
  }
@@ -55,7 +55,8 @@ export default function triggerEndOfStream(mediaSource, cancelSignal) {
55
55
  return;
56
56
  }
57
57
  log.debug("Init: Waiting SourceBuffers to be updated before calling endOfStream.");
58
- var innerCanceller = new TaskCanceller({ cancelOn: cancelSignal });
58
+ var innerCanceller = new TaskCanceller();
59
+ innerCanceller.linkToSignal(cancelSignal);
59
60
  for (var _i = 0, updatingSourceBuffers_1 = updatingSourceBuffers; _i < updatingSourceBuffers_1.length; _i++) {
60
61
  var sourceBuffer = updatingSourceBuffers_1[_i];
61
62
  onSourceBufferUpdate(sourceBuffer, function () {
@@ -75,10 +76,12 @@ export default function triggerEndOfStream(mediaSource, cancelSignal) {
75
76
  * @param {Object} cancelSignal
76
77
  */
77
78
  export function maintainEndOfStream(mediaSource, cancelSignal) {
78
- var endOfStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
79
+ var endOfStreamCanceller = new TaskCanceller();
80
+ endOfStreamCanceller.linkToSignal(cancelSignal);
79
81
  onSourceOpen(mediaSource, function () {
80
82
  endOfStreamCanceller.cancel();
81
- endOfStreamCanceller = new TaskCanceller({ cancelOn: cancelSignal });
83
+ endOfStreamCanceller = new TaskCanceller();
84
+ endOfStreamCanceller.linkToSignal(cancelSignal);
82
85
  triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);
83
86
  }, cancelSignal);
84
87
  triggerEndOfStream(mediaSource, endOfStreamCanceller.signal);