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.
- package/CHANGELOG.md +20 -60
- package/FILES.md +1 -1
- package/README.md +2 -33
- package/VERSION +1 -1
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +2 -6
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +20 -10
- package/dist/_esm5.processed/core/api/option_utils.d.ts +0 -2
- package/dist/_esm5.processed/core/api/option_utils.js +0 -6
- package/dist/_esm5.processed/core/api/public_api.d.ts +1 -2
- package/dist/_esm5.processed/core/api/public_api.js +9 -17
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +1 -1
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +3 -14
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +2 -36
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +2 -82
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +19 -10
- package/dist/_esm5.processed/core/stream/representation/utils/get_buffer_status.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/utils/get_needed_segments.js +1 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +1 -8
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +1 -9
- package/dist/_esm5.processed/public_types.d.ts +2 -0
- package/dist/commonjs/compat/is_codec_supported.js +22 -1
- package/dist/commonjs/config.d.ts +2 -1
- package/dist/commonjs/core/adaptive/adaptive_representation_selector.d.ts +2 -19
- package/dist/commonjs/core/adaptive/adaptive_representation_selector.js +2 -2
- package/dist/commonjs/core/adaptive/network_analyzer.js +3 -3
- package/dist/commonjs/core/api/debug/buffer_graph.js +2 -6
- package/dist/commonjs/core/api/debug/modules/general_info.js +17 -10
- package/dist/commonjs/core/api/index.d.ts +1 -1
- package/dist/commonjs/core/api/option_utils.d.ts +2 -0
- package/dist/commonjs/core/api/option_utils.js +2 -3
- package/dist/commonjs/core/api/playback_observer.d.ts +128 -8
- package/dist/commonjs/core/api/playback_observer.js +217 -64
- package/dist/commonjs/core/api/public_api.d.ts +9 -0
- package/dist/commonjs/core/api/public_api.js +41 -16
- package/dist/commonjs/core/api/utils.js +1 -1
- package/dist/commonjs/core/decrypt/get_media_keys.js +2 -6
- package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
- package/dist/commonjs/core/fetchers/manifest/manifest_fetcher.js +11 -3
- package/dist/commonjs/core/fetchers/segment/segment_fetcher.d.ts +8 -1
- package/dist/commonjs/core/fetchers/segment/segment_fetcher.js +8 -4
- package/dist/commonjs/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
- package/dist/commonjs/core/fetchers/utils/schedule_request.js +1 -1
- package/dist/commonjs/core/init/directfile_content_initializer.js +29 -8
- package/dist/commonjs/core/init/media_source_content_initializer.d.ts +6 -0
- package/dist/commonjs/core/init/media_source_content_initializer.js +32 -20
- package/dist/commonjs/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
- package/dist/commonjs/core/init/utils/content_time_boundaries_observer.js +17 -19
- package/dist/commonjs/core/init/utils/create_stream_playback_observer.d.ts +1 -5
- package/dist/commonjs/core/init/utils/create_stream_playback_observer.js +16 -14
- package/dist/commonjs/core/init/utils/get_initial_time.d.ts +17 -3
- package/dist/commonjs/core/init/utils/get_initial_time.js +9 -7
- package/dist/commonjs/core/init/utils/initial_seek_and_play.d.ts +9 -11
- package/dist/commonjs/core/init/utils/initial_seek_and_play.js +121 -91
- package/dist/commonjs/core/init/utils/rebuffering_controller.js +27 -70
- package/dist/commonjs/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
- package/dist/commonjs/core/segment_buffers/garbage_collector.js +1 -2
- package/dist/commonjs/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
- package/dist/commonjs/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/commonjs/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
- package/dist/commonjs/core/segment_buffers/index.d.ts +2 -2
- package/dist/commonjs/core/segment_buffers/inventory/index.d.ts +2 -2
- package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
- package/dist/commonjs/core/segment_buffers/inventory/segment_inventory.js +19 -10
- package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
- package/dist/commonjs/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
- package/dist/commonjs/core/stream/orchestrator/stream_orchestrator.js +14 -18
- package/dist/commonjs/core/stream/period/period_stream.js +5 -8
- package/dist/commonjs/core/stream/period/types.d.ts +2 -3
- package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
- package/dist/commonjs/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
- package/dist/commonjs/core/stream/representation/representation_stream.js +3 -4
- package/dist/commonjs/core/stream/representation/types.d.ts +2 -2
- package/dist/commonjs/core/stream/representation/utils/append_segment_to_buffer.js +11 -12
- package/dist/commonjs/core/stream/representation/utils/get_buffer_status.js +4 -4
- package/dist/commonjs/core/stream/representation/utils/get_needed_segments.js +1 -1
- package/dist/commonjs/default_config.d.ts +12 -16
- package/dist/commonjs/default_config.js +21 -16
- package/dist/commonjs/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
- package/dist/commonjs/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
- package/dist/commonjs/manifest/adaptation.js +2 -1
- package/dist/commonjs/manifest/representation_index/static.d.ts +1 -1
- package/dist/commonjs/manifest/representation_index/static.js +2 -2
- package/dist/commonjs/manifest/representation_index/types.d.ts +4 -4
- package/dist/commonjs/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
- package/dist/commonjs/parsers/manifest/dash/common/indexes/base.js +4 -3
- package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
- package/dist/commonjs/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
- package/dist/commonjs/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
- package/dist/commonjs/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/dash/common/indexes/list.js +2 -2
- package/dist/commonjs/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
- package/dist/commonjs/parsers/manifest/dash/common/indexes/template.js +42 -29
- package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
- package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
- package/dist/commonjs/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +250 -51
- package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
- package/dist/commonjs/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
- package/dist/commonjs/parsers/manifest/dash/common/parse_adaptation_sets.js +13 -10
- package/dist/commonjs/parsers/manifest/dash/common/parse_mpd.js +27 -14
- package/dist/commonjs/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/dash/common/parse_periods.js +17 -18
- package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
- package/dist/commonjs/parsers/manifest/dash/common/parse_representation_index.js +21 -8
- package/dist/commonjs/parsers/manifest/dash/common/parse_representations.js +7 -3
- package/dist/commonjs/parsers/manifest/local/representation_index.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/local/representation_index.js +3 -3
- package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
- package/dist/commonjs/parsers/manifest/metaplaylist/representation_index.js +2 -2
- package/dist/commonjs/parsers/manifest/smooth/representation_index.d.ts +5 -5
- package/dist/commonjs/parsers/manifest/smooth/representation_index.js +25 -9
- package/dist/commonjs/parsers/manifest/utils/index_helpers.js +1 -1
- package/dist/commonjs/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
- package/dist/commonjs/public_types.d.ts +107 -36
- package/dist/commonjs/transports/dash/init_segment_loader.js +10 -5
- package/dist/commonjs/transports/dash/manifest_parser.js +5 -2
- package/dist/commonjs/transports/dash/segment_loader.js +2 -1
- package/dist/commonjs/transports/dash/text_loader.js +2 -0
- package/dist/commonjs/transports/metaplaylist/manifest_loader.js +2 -1
- package/dist/commonjs/transports/metaplaylist/pipelines.js +4 -1
- package/dist/commonjs/transports/smooth/pipelines.js +4 -2
- package/dist/commonjs/transports/smooth/segment_loader.js +2 -1
- package/dist/commonjs/transports/types.d.ts +12 -0
- package/dist/commonjs/transports/utils/generate_manifest_loader.js +6 -3
- package/dist/commonjs/utils/request/fetch.d.ts +6 -0
- package/dist/commonjs/utils/request/fetch.js +29 -8
- package/dist/commonjs/utils/request/xhr.d.ts +11 -5
- package/dist/commonjs/utils/request/xhr.js +29 -8
- package/dist/es2017/compat/is_codec_supported.js +22 -1
- package/dist/es2017/config.d.ts +2 -1
- package/dist/es2017/core/adaptive/adaptive_representation_selector.d.ts +2 -19
- package/dist/es2017/core/adaptive/adaptive_representation_selector.js +2 -2
- package/dist/es2017/core/adaptive/network_analyzer.js +3 -3
- package/dist/es2017/core/api/debug/buffer_graph.js +2 -6
- package/dist/es2017/core/api/debug/modules/general_info.js +17 -10
- package/dist/es2017/core/api/index.d.ts +1 -1
- package/dist/es2017/core/api/option_utils.d.ts +2 -0
- package/dist/es2017/core/api/option_utils.js +2 -3
- package/dist/es2017/core/api/playback_observer.d.ts +128 -8
- package/dist/es2017/core/api/playback_observer.js +217 -66
- package/dist/es2017/core/api/public_api.d.ts +9 -0
- package/dist/es2017/core/api/public_api.js +40 -15
- package/dist/es2017/core/api/utils.js +1 -1
- package/dist/es2017/core/decrypt/get_media_keys.js +2 -6
- package/dist/es2017/core/fetchers/manifest/manifest_fetcher.d.ts +6 -0
- package/dist/es2017/core/fetchers/manifest/manifest_fetcher.js +11 -3
- package/dist/es2017/core/fetchers/segment/segment_fetcher.d.ts +8 -1
- package/dist/es2017/core/fetchers/segment/segment_fetcher.js +8 -4
- package/dist/es2017/core/fetchers/segment/segment_fetcher_creator.d.ts +1 -0
- package/dist/es2017/core/fetchers/utils/schedule_request.js +1 -1
- package/dist/es2017/core/init/directfile_content_initializer.js +31 -8
- package/dist/es2017/core/init/media_source_content_initializer.d.ts +6 -0
- package/dist/es2017/core/init/media_source_content_initializer.js +34 -22
- package/dist/es2017/core/init/utils/content_time_boundaries_observer.d.ts +13 -12
- package/dist/es2017/core/init/utils/content_time_boundaries_observer.js +17 -17
- package/dist/es2017/core/init/utils/create_stream_playback_observer.d.ts +1 -5
- package/dist/es2017/core/init/utils/create_stream_playback_observer.js +16 -14
- package/dist/es2017/core/init/utils/get_initial_time.d.ts +17 -3
- package/dist/es2017/core/init/utils/get_initial_time.js +9 -7
- package/dist/es2017/core/init/utils/initial_seek_and_play.d.ts +9 -11
- package/dist/es2017/core/init/utils/initial_seek_and_play.js +120 -91
- package/dist/es2017/core/init/utils/rebuffering_controller.js +27 -70
- package/dist/es2017/core/init/utils/stream_events_emitter/stream_events_emitter.js +4 -2
- package/dist/es2017/core/segment_buffers/garbage_collector.js +1 -2
- package/dist/es2017/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +9 -2
- package/dist/es2017/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/es2017/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +1 -1
- package/dist/es2017/core/segment_buffers/index.d.ts +2 -2
- package/dist/es2017/core/segment_buffers/inventory/index.d.ts +2 -2
- package/dist/es2017/core/segment_buffers/inventory/segment_inventory.d.ts +25 -8
- package/dist/es2017/core/segment_buffers/inventory/segment_inventory.js +19 -10
- package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.d.ts +2 -2
- package/dist/es2017/core/stream/adaptation/get_representations_switch_strategy.js +16 -9
- package/dist/es2017/core/stream/orchestrator/stream_orchestrator.js +16 -18
- package/dist/es2017/core/stream/period/period_stream.js +4 -7
- package/dist/es2017/core/stream/period/types.d.ts +2 -3
- package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.d.ts +4 -5
- package/dist/es2017/core/stream/period/utils/get_adaptation_switch_strategy.js +17 -13
- package/dist/es2017/core/stream/representation/representation_stream.js +3 -4
- package/dist/es2017/core/stream/representation/types.d.ts +2 -2
- package/dist/es2017/core/stream/representation/utils/append_segment_to_buffer.js +1 -2
- package/dist/es2017/core/stream/representation/utils/get_buffer_status.js +4 -4
- package/dist/es2017/core/stream/representation/utils/get_needed_segments.js +1 -1
- package/dist/es2017/default_config.d.ts +12 -16
- package/dist/es2017/default_config.js +21 -16
- package/dist/es2017/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +3 -1
- package/dist/es2017/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +2 -0
- package/dist/es2017/manifest/adaptation.js +2 -1
- package/dist/es2017/manifest/representation_index/static.d.ts +1 -1
- package/dist/es2017/manifest/representation_index/static.js +2 -2
- package/dist/es2017/manifest/representation_index/types.d.ts +4 -4
- package/dist/es2017/parsers/manifest/dash/common/indexes/base.d.ts +6 -1
- package/dist/es2017/parsers/manifest/dash/common/indexes/base.js +4 -3
- package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +5 -2
- package/dist/es2017/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +15 -4
- package/dist/es2017/parsers/manifest/dash/common/indexes/index.d.ts +5 -5
- package/dist/es2017/parsers/manifest/dash/common/indexes/list.d.ts +1 -1
- package/dist/es2017/parsers/manifest/dash/common/indexes/list.js +2 -2
- package/dist/es2017/parsers/manifest/dash/common/indexes/template.d.ts +12 -5
- package/dist/es2017/parsers/manifest/dash/common/indexes/template.js +40 -27
- package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/index.d.ts +2 -1
- package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +99 -6
- package/dist/es2017/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +246 -51
- package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +40 -17
- package/dist/es2017/parsers/manifest/dash/common/manifest_bounds_calculator.js +38 -18
- package/dist/es2017/parsers/manifest/dash/common/parse_adaptation_sets.js +11 -8
- package/dist/es2017/parsers/manifest/dash/common/parse_mpd.js +27 -13
- package/dist/es2017/parsers/manifest/dash/common/parse_periods.d.ts +1 -1
- package/dist/es2017/parsers/manifest/dash/common/parse_periods.js +13 -16
- package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.d.ts +19 -6
- package/dist/es2017/parsers/manifest/dash/common/parse_representation_index.js +10 -8
- package/dist/es2017/parsers/manifest/dash/common/parse_representations.js +7 -3
- package/dist/es2017/parsers/manifest/local/representation_index.d.ts +1 -1
- package/dist/es2017/parsers/manifest/local/representation_index.js +3 -3
- package/dist/es2017/parsers/manifest/metaplaylist/representation_index.d.ts +1 -1
- package/dist/es2017/parsers/manifest/metaplaylist/representation_index.js +2 -2
- package/dist/es2017/parsers/manifest/smooth/representation_index.d.ts +5 -5
- package/dist/es2017/parsers/manifest/smooth/representation_index.js +25 -9
- package/dist/es2017/parsers/manifest/utils/index_helpers.js +1 -1
- package/dist/es2017/parsers/texttracks/ttml/html/apply_line_height.js +2 -1
- package/dist/es2017/public_types.d.ts +107 -36
- package/dist/es2017/transports/dash/init_segment_loader.js +5 -0
- package/dist/es2017/transports/dash/manifest_parser.js +3 -0
- package/dist/es2017/transports/dash/segment_loader.js +1 -0
- package/dist/es2017/transports/dash/text_loader.js +2 -0
- package/dist/es2017/transports/metaplaylist/manifest_loader.js +1 -0
- package/dist/es2017/transports/metaplaylist/pipelines.js +4 -1
- package/dist/es2017/transports/smooth/pipelines.js +2 -0
- package/dist/es2017/transports/smooth/segment_loader.js +1 -0
- package/dist/es2017/transports/types.d.ts +12 -0
- package/dist/es2017/transports/utils/generate_manifest_loader.js +3 -0
- package/dist/es2017/utils/request/fetch.d.ts +6 -0
- package/dist/es2017/utils/request/fetch.js +29 -8
- package/dist/es2017/utils/request/xhr.d.ts +11 -5
- package/dist/es2017/utils/request/xhr.js +30 -9
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +1335 -812
- package/dist/rx-player.min.js +1 -1
- package/package.json +7 -4
- package/scripts/canal-release.patch +78 -0
- package/scripts/make-dev-releases +65 -0
- package/scripts/update-version +7 -0
- package/sonar-project.properties +1 -1
- package/src/compat/is_codec_supported.ts +23 -1
- package/src/core/adaptive/adaptive_representation_selector.ts +4 -21
- package/src/core/adaptive/network_analyzer.ts +3 -3
- package/src/core/api/debug/buffer_graph.ts +2 -5
- package/src/core/api/debug/modules/general_info.ts +15 -10
- package/src/core/api/index.ts +1 -0
- package/src/core/api/option_utils.ts +3 -3
- package/src/core/api/playback_observer.ts +327 -107
- package/src/core/api/public_api.ts +42 -14
- package/src/core/api/utils.ts +3 -1
- package/src/core/decrypt/get_media_keys.ts +2 -8
- package/src/core/fetchers/manifest/manifest_fetcher.ts +21 -3
- package/src/core/fetchers/segment/segment_fetcher.ts +19 -5
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +1 -0
- package/src/core/fetchers/utils/schedule_request.ts +1 -1
- package/src/core/init/directfile_content_initializer.ts +31 -15
- package/src/core/init/media_source_content_initializer.ts +40 -27
- package/src/core/init/utils/content_time_boundaries_observer.ts +24 -23
- package/src/core/init/utils/create_stream_playback_observer.ts +19 -20
- package/src/core/init/utils/get_initial_time.ts +25 -12
- package/src/core/init/utils/initial_seek_and_play.ts +140 -108
- package/src/core/init/utils/rebuffering_controller.ts +32 -77
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +5 -2
- package/src/core/segment_buffers/garbage_collector.ts +1 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +10 -2
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +1 -1
- package/src/core/segment_buffers/index.ts +2 -0
- package/src/core/segment_buffers/inventory/index.ts +2 -0
- package/src/core/segment_buffers/inventory/segment_inventory.ts +49 -17
- package/src/core/stream/adaptation/get_representations_switch_strategy.ts +21 -12
- package/src/core/stream/orchestrator/stream_orchestrator.ts +14 -19
- package/src/core/stream/period/period_stream.ts +7 -8
- package/src/core/stream/period/types.ts +2 -3
- package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +21 -15
- package/src/core/stream/representation/representation_stream.ts +3 -5
- package/src/core/stream/representation/types.ts +2 -2
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +1 -1
- package/src/core/stream/representation/utils/get_buffer_status.ts +5 -4
- package/src/core/stream/representation/utils/get_needed_segments.ts +2 -2
- package/src/default_config.ts +22 -17
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +3 -1
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +2 -0
- package/src/manifest/adaptation.ts +2 -1
- package/src/manifest/representation_index/static.ts +2 -2
- package/src/manifest/representation_index/types.ts +4 -4
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +182 -36
- package/src/parsers/manifest/dash/common/indexes/base.ts +12 -4
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +19 -5
- package/src/parsers/manifest/dash/common/indexes/index.ts +16 -4
- package/src/parsers/manifest/dash/common/indexes/list.ts +2 -2
- package/src/parsers/manifest/dash/common/indexes/template.ts +52 -31
- package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +4 -1
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +366 -60
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +63 -25
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +10 -4
- package/src/parsers/manifest/dash/common/parse_mpd.ts +28 -15
- package/src/parsers/manifest/dash/common/parse_periods.ts +12 -17
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +50 -26
- package/src/parsers/manifest/dash/common/parse_representations.ts +9 -3
- package/src/parsers/manifest/local/representation_index.ts +3 -3
- package/src/parsers/manifest/metaplaylist/representation_index.ts +2 -2
- package/src/parsers/manifest/smooth/representation_index.ts +23 -9
- package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +1 -1
- package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +1 -1
- package/src/parsers/manifest/utils/index_helpers.ts +1 -1
- package/src/parsers/texttracks/ttml/html/apply_line_height.ts +3 -1
- package/src/public_types.ts +108 -36
- package/src/transports/dash/init_segment_loader.ts +5 -0
- package/src/transports/dash/manifest_parser.ts +6 -0
- package/src/transports/dash/segment_loader.ts +1 -0
- package/src/transports/dash/text_loader.ts +2 -0
- package/src/transports/metaplaylist/manifest_loader.ts +1 -0
- package/src/transports/metaplaylist/pipelines.ts +4 -1
- package/src/transports/smooth/pipelines.ts +2 -0
- package/src/transports/smooth/segment_loader.ts +1 -0
- package/src/transports/types.ts +12 -0
- package/src/transports/utils/generate_manifest_loader.ts +3 -0
- package/src/utils/request/fetch.ts +35 -8
- package/src/utils/request/xhr.ts +45 -14
- package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
- package/dist/commonjs/parsers/manifest/utils/is_segment_still_available.js +0 -54
- package/dist/es2017/parsers/manifest/utils/is_segment_still_available.d.ts +0 -29
- package/dist/es2017/parsers/manifest/utils/is_segment_still_available.js +0 -51
- package/src/parsers/manifest/utils/is_segment_still_available.ts +0 -58
- package/src/typings/object-assign.d.ts +0 -48
package/src/public_types.ts
CHANGED
|
@@ -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
|
-
/**
|
|
190
|
-
|
|
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
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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",
|
|
@@ -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 = {
|
|
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) => {
|
package/src/transports/types.ts
CHANGED
|
@@ -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
|
|
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
|
|
156
|
+
let timeoutId : number | undefined;
|
|
150
157
|
if (options.timeout !== undefined) {
|
|
151
|
-
|
|
152
|
-
|
|
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 (
|
|
174
|
-
clearTimeout(
|
|
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 (
|
|
233
|
-
log.warn("Fetch: Request
|
|
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;
|
package/src/utils/request/xhr.ts
CHANGED
|
@@ -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
|
-
* -
|
|
34
|
-
*
|
|
35
|
-
* -
|
|
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
|
-
* -
|
|
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
|
-
* -
|
|
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
|
|
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,
|
|
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 (
|
|
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,
|
|
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,
|
|
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 ===
|
|
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,
|
|
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,
|
|
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;
|