rx-player 3.29.0 → 3.30.0-dev.2023011800
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 +23 -0
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/can_reuse_media_keys.d.ts +3 -2
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +5 -4
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +16 -7
- package/dist/_esm5.processed/compat/event_listeners.d.ts +33 -56
- package/dist/_esm5.processed/compat/event_listeners.js +66 -116
- package/dist/_esm5.processed/compat/index.d.ts +1 -4
- package/dist/_esm5.processed/compat/index.js +1 -4
- package/dist/_esm5.processed/compat/on_height_width_change.d.ts +1 -1
- package/dist/_esm5.processed/compat/on_height_width_change.js +2 -2
- package/dist/_esm5.processed/config.d.ts +1 -0
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.d.ts +3 -1
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +27 -6
- package/dist/_esm5.processed/core/api/playback_observer.d.ts +8 -9
- package/dist/_esm5.processed/core/api/playback_observer.js +6 -7
- package/dist/_esm5.processed/core/api/public_api.d.ts +39 -41
- package/dist/_esm5.processed/core/api/public_api.js +569 -578
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.d.ts +9 -14
- package/dist/_esm5.processed/core/api/tracks_management/track_choice_manager.js +73 -43
- package/dist/_esm5.processed/core/api/utils.d.ts +15 -10
- package/dist/_esm5.processed/core/api/utils.js +84 -19
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +22 -5
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +97 -25
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.d.ts +3 -2
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +3 -2
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.d.ts +1 -1
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +1 -1
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +12 -20
- package/dist/_esm5.processed/core/decrypt/create_session.js +1 -1
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +35 -13
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +1 -1
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +32 -31
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +291 -160
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.d.ts +1 -1
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +1 -1
- package/dist/_esm5.processed/core/decrypt/types.d.ts +0 -6
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.d.ts +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/index.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +153 -89
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +419 -144
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.d.ts +0 -24
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +0 -24
- package/dist/_esm5.processed/core/init/{initialize_directfile.d.ts → directfile_content_initializer.d.ts} +13 -16
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +196 -0
- package/dist/_esm5.processed/core/init/index.d.ts +2 -2
- package/dist/_esm5.processed/core/init/index.js +2 -2
- package/dist/_esm5.processed/core/init/media_source_content_initializer.d.ts +181 -0
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +576 -0
- package/dist/_esm5.processed/core/init/types.d.ts +203 -64
- package/dist/_esm5.processed/core/init/types.js +36 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +164 -0
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +484 -0
- package/dist/_esm5.processed/core/init/{create_media_source.d.ts → utils/create_media_source.d.ts} +8 -4
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +118 -0
- package/dist/_esm5.processed/core/init/{create_stream_playback_observer.d.ts → utils/create_stream_playback_observer.d.ts} +4 -4
- package/dist/_esm5.processed/core/init/{create_stream_playback_observer.js → utils/create_stream_playback_observer.js} +2 -5
- package/dist/_esm5.processed/core/init/{end_of_stream.d.ts → utils/end_of_stream.d.ts} +5 -5
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +85 -0
- package/dist/_esm5.processed/core/init/{get_initial_time.d.ts → utils/get_initial_time.d.ts} +1 -1
- package/dist/_esm5.processed/core/init/{get_initial_time.js → utils/get_initial_time.js} +3 -3
- package/dist/_esm5.processed/core/init/{emit_loaded_event.d.ts → utils/get_loaded_reference.d.ts} +9 -9
- package/dist/_esm5.processed/core/init/{emit_loaded_event.js → utils/get_loaded_reference.js} +23 -17
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.d.ts +63 -0
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +124 -0
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.d.ts +80 -0
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +111 -0
- package/dist/_esm5.processed/core/init/{media_duration_updater.d.ts → utils/media_duration_updater.d.ts} +3 -3
- package/dist/_esm5.processed/core/init/{media_duration_updater.js → utils/media_duration_updater.js} +115 -41
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +113 -0
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +483 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.d.ts +0 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.js +0 -0
- package/dist/_esm5.processed/core/{stream/types.js → init/utils/stream_events_emitter/index.d.ts} +3 -1
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.js +0 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.d.ts +1 -1
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.js +0 -0
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.d.ts +30 -0
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +155 -0
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.d.ts +1 -13
- package/dist/_esm5.processed/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.js +0 -0
- package/dist/_esm5.processed/core/init/{throw_on_media_error.d.ts → utils/throw_on_media_error.d.ts} +5 -5
- package/dist/_esm5.processed/core/init/{throw_on_media_error.js → utils/throw_on_media_error.js} +19 -15
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.d.ts +0 -1
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +0 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +0 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +0 -5
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.d.ts +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/image/image_segment_buffer.js +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +25 -130
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +188 -117
- package/dist/_esm5.processed/core/stream/adaptation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/adaptation/index.js +1 -0
- package/dist/_esm5.processed/core/stream/adaptation/types.d.ts +172 -0
- package/dist/_esm5.processed/core/stream/adaptation/types.js +1 -0
- package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.d.ts → utils/create_representation_estimator.d.ts} +6 -6
- package/dist/_esm5.processed/core/stream/adaptation/{create_representation_estimator.js → utils/create_representation_estimator.js} +3 -4
- package/dist/_esm5.processed/core/stream/index.d.ts +4 -3
- package/dist/_esm5.processed/core/stream/index.js +0 -1
- package/dist/_esm5.processed/core/stream/orchestrator/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +142 -17
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +303 -229
- package/dist/_esm5.processed/core/stream/period/index.d.ts +2 -3
- package/dist/_esm5.processed/core/stream/period/index.js +1 -0
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +27 -62
- package/dist/_esm5.processed/core/stream/period/period_stream.js +278 -105
- package/dist/_esm5.processed/core/stream/period/types.d.ts +110 -0
- package/dist/_esm5.processed/core/stream/period/types.js +1 -0
- package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.d.ts → utils/get_adaptation_switch_strategy.d.ts} +3 -3
- package/dist/_esm5.processed/core/stream/period/{get_adaptation_switch_strategy.js → utils/get_adaptation_switch_strategy.js} +3 -3
- package/dist/_esm5.processed/core/stream/representation/index.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/index.js +1 -0
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +32 -121
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +210 -136
- package/dist/_esm5.processed/core/stream/representation/types.d.ts +267 -0
- package/dist/_esm5.processed/core/stream/representation/types.js +1 -0
- package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.d.ts → utils/append_segment_to_buffer.d.ts} +5 -5
- package/dist/_esm5.processed/core/stream/representation/{append_segment_to_buffer.js → utils/append_segment_to_buffer.js} +8 -3
- package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.d.ts → utils/check_for_discontinuity.d.ts} +2 -2
- package/dist/_esm5.processed/core/stream/representation/{check_for_discontinuity.js → utils/check_for_discontinuity.js} +1 -1
- package/dist/_esm5.processed/core/stream/representation/{downloading_queue.d.ts → utils/downloading_queue.d.ts} +85 -80
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +378 -0
- package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.d.ts → utils/force_garbage_collection.d.ts} +2 -2
- package/dist/_esm5.processed/core/stream/representation/{force_garbage_collection.js → utils/force_garbage_collection.js} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.d.ts → utils/get_buffer_status.d.ts} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_buffer_status.js → utils/get_buffer_status.js} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.d.ts → utils/get_needed_segments.d.ts} +3 -3
- package/dist/_esm5.processed/core/stream/representation/{get_needed_segments.js → utils/get_needed_segments.js} +4 -5
- package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.d.ts → utils/get_segment_priority.d.ts} +0 -0
- package/dist/_esm5.processed/core/stream/representation/{get_segment_priority.js → utils/get_segment_priority.js} +1 -1
- package/dist/_esm5.processed/core/stream/representation/{push_init_segment.d.ts → utils/push_init_segment.d.ts} +9 -12
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +85 -0
- package/dist/_esm5.processed/core/stream/representation/{push_media_segment.d.ts → utils/push_media_segment.d.ts} +9 -12
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +109 -0
- package/dist/_esm5.processed/default_config.d.ts +10 -0
- package/dist/_esm5.processed/default_config.js +12 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +1 -1
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.d.ts +2 -3
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +107 -59
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +6 -7
- package/dist/_esm5.processed/features/initialize_features.js +1 -1
- package/dist/_esm5.processed/features/list/directfile.js +1 -1
- package/dist/_esm5.processed/features/types.d.ts +2 -3
- package/dist/_esm5.processed/manifest/adaptation.d.ts +7 -0
- package/dist/_esm5.processed/manifest/adaptation.js +3 -0
- package/dist/_esm5.processed/manifest/manifest.d.ts +2 -1
- package/dist/_esm5.processed/manifest/manifest.js +4 -3
- package/dist/_esm5.processed/manifest/update_period_in_place.d.ts +26 -1
- package/dist/_esm5.processed/manifest/update_period_in_place.js +58 -7
- package/dist/_esm5.processed/manifest/update_periods.d.ts +19 -2
- package/dist/_esm5.processed/manifest/update_periods.js +62 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +3 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +1 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +7 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +16 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +63 -25
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +3 -0
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +60 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +39 -13
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +7 -3
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +3 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.d.ts +0 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +0 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.js +5 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.js +6 -0
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.d.ts +2 -1
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +13 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +7 -0
- package/dist/_esm5.processed/public_types.d.ts +2 -0
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.js +3 -3
- package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
- package/dist/_esm5.processed/utils/event_emitter.d.ts +3 -13
- package/dist/_esm5.processed/utils/event_emitter.js +0 -19
- package/dist/_esm5.processed/utils/reference.d.ts +46 -67
- package/dist/_esm5.processed/utils/reference.js +63 -93
- package/dist/_esm5.processed/utils/request/xhr.d.ts +3 -68
- package/dist/_esm5.processed/utils/{rx-retry_with_backoff.d.ts → retry_promise_with_backoff.d.ts} +19 -34
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +119 -0
- package/dist/_esm5.processed/utils/sleep.d.ts +10 -0
- package/dist/_esm5.processed/utils/sleep.js +14 -0
- package/dist/_esm5.processed/utils/sorted_list.d.ts +1 -0
- package/dist/_esm5.processed/utils/sorted_list.js +3 -0
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +8116 -11600
- package/dist/rx-player.min.js +1 -1
- package/dist/rx-player.min.js.LICENSE.txt +0 -15
- package/manifest.mpd +149 -0
- package/package.json +26 -26
- package/scripts/build/generate_build.js +1 -8
- package/sonar-project.properties +1 -1
- package/src/README.md +2 -2
- package/src/compat/__tests__/can_reuse_media_keys.test.ts +4 -27
- package/src/compat/can_reuse_media_keys.ts +5 -7
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +14 -15
- package/src/compat/event_listeners.ts +84 -148
- package/src/compat/index.ts +0 -6
- package/src/compat/on_height_width_change.ts +2 -2
- package/src/core/README.md +1 -1
- package/src/core/adaptive/adaptive_representation_selector.ts +36 -7
- package/src/core/api/README.md +0 -33
- package/src/core/api/playback_observer.ts +20 -11
- package/src/core/api/public_api.ts +826 -815
- package/src/core/api/tracks_management/track_choice_manager.ts +97 -57
- package/src/core/api/utils.ts +112 -42
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +42 -38
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +15 -20
- package/src/core/decrypt/__tests__/__global__/media_key_system_access.test.ts +35 -47
- package/src/core/decrypt/__tests__/__global__/utils.ts +116 -17
- package/src/core/decrypt/attach_media_keys.ts +3 -2
- package/src/core/decrypt/clear_on_stop.ts +1 -1
- package/src/core/decrypt/content_decryptor.ts +19 -27
- package/src/core/decrypt/create_session.ts +1 -1
- package/src/core/decrypt/find_key_system.ts +31 -11
- package/src/core/decrypt/get_media_keys.ts +1 -1
- package/src/core/decrypt/session_events_listener.ts +259 -277
- package/src/core/decrypt/set_server_certificate.ts +1 -1
- package/src/core/decrypt/types.ts +0 -5
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +1 -1
- package/src/core/decrypt/utils/loaded_sessions_store.ts +1 -1
- package/src/core/fetchers/README.md +3 -0
- package/src/core/fetchers/index.ts +6 -6
- package/src/core/fetchers/manifest/index.ts +7 -7
- package/src/core/fetchers/manifest/manifest_fetcher.ts +646 -295
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +0 -24
- package/src/core/init/README.md +31 -45
- package/src/core/init/directfile_content_initializer.ts +229 -0
- package/src/core/init/index.ts +3 -3
- package/src/core/init/media_source_content_initializer.ts +819 -0
- package/src/core/init/types.ts +220 -132
- package/src/core/init/{__tests__ → utils/__tests__}/are_same_stream_events.test.ts +0 -0
- package/src/core/init/{__tests__ → utils/__tests__}/refresh_scheduled_events_list.test.ts +0 -0
- package/src/core/init/utils/content_time_boundaries_observer.ts +609 -0
- package/src/core/init/{create_media_source.ts → utils/create_media_source.ts} +60 -55
- package/src/core/init/{create_stream_playback_observer.ts → utils/create_stream_playback_observer.ts} +7 -11
- package/src/core/init/utils/end_of_stream.ts +104 -0
- package/src/core/init/{get_initial_time.ts → utils/get_initial_time.ts} +4 -4
- package/src/core/init/utils/get_loaded_reference.ts +76 -0
- package/src/core/init/utils/initial_seek_and_play.ts +179 -0
- package/src/core/init/utils/initialize_content_decryption.ts +178 -0
- package/src/core/init/{media_duration_updater.ts → utils/media_duration_updater.ts} +166 -84
- package/src/core/init/{rebuffering_controller.ts → utils/rebuffering_controller.ts} +247 -226
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/are_same_stream_events.ts +0 -0
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/index.ts +1 -13
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/refresh_scheduled_events_list.ts +1 -1
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +210 -0
- package/src/core/init/{stream_events_emitter → utils/stream_events_emitter}/types.ts +1 -19
- package/src/core/init/utils/throw_on_media_error.ts +74 -0
- package/src/core/segment_buffers/README.md +5 -4
- package/src/core/segment_buffers/garbage_collector.ts +0 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -8
- package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +3 -3
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +1 -1
- package/src/core/stream/README.md +1 -1
- package/src/core/stream/adaptation/adaptation_stream.ts +265 -330
- package/src/core/stream/adaptation/index.ts +2 -12
- package/src/core/stream/adaptation/types.ts +193 -0
- package/src/core/stream/adaptation/{create_representation_estimator.ts → utils/create_representation_estimator.ts} +10 -9
- package/src/core/stream/index.ts +9 -1
- package/src/core/stream/orchestrator/README.md +1 -4
- package/src/core/stream/orchestrator/index.ts +2 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +423 -326
- package/src/core/stream/period/index.ts +2 -12
- package/src/core/stream/period/period_stream.ts +301 -238
- package/src/core/stream/period/types.ts +132 -0
- package/src/core/stream/period/{get_adaptation_switch_strategy.ts → utils/get_adaptation_switch_strategy.ts} +6 -6
- package/src/core/stream/representation/README.md +2 -23
- package/src/core/stream/representation/index.ts +2 -12
- package/src/core/stream/representation/representation_stream.ts +315 -415
- package/src/core/stream/representation/types.ts +292 -0
- package/src/core/stream/representation/{append_segment_to_buffer.ts → utils/append_segment_to_buffer.ts} +11 -7
- package/src/core/stream/representation/{check_for_discontinuity.ts → utils/check_for_discontinuity.ts} +3 -3
- package/src/core/stream/representation/utils/downloading_queue.ts +592 -0
- package/src/core/stream/representation/{force_garbage_collection.ts → utils/force_garbage_collection.ts} +5 -6
- package/src/core/stream/representation/{get_buffer_status.ts → utils/get_buffer_status.ts} +5 -5
- package/src/core/stream/representation/{get_needed_segments.ts → utils/get_needed_segments.ts} +6 -7
- package/src/core/stream/representation/{get_segment_priority.ts → utils/get_segment_priority.ts} +1 -2
- package/src/core/stream/representation/utils/push_init_segment.ts +80 -0
- package/src/core/stream/representation/utils/push_media_segment.ts +113 -0
- package/src/default_config.ts +13 -1
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +1 -1
- package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +1 -1
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +58 -66
- package/src/experimental/tools/createMetaplaylist/index.ts +29 -38
- package/src/features/__tests__/initialize_features.test.ts +1 -1
- package/src/features/initialize_features.ts +2 -1
- package/src/features/list/__tests__/directfile.test.ts +3 -2
- package/src/features/list/directfile.ts +1 -1
- package/src/features/types.ts +2 -7
- package/src/manifest/__tests__/manifest.test.ts +14 -365
- package/src/manifest/__tests__/update_period_in_place.test.ts +522 -57
- package/src/manifest/__tests__/update_periods.test.ts +254 -40
- package/src/manifest/adaptation.ts +11 -0
- package/src/manifest/manifest.ts +6 -4
- package/src/manifest/update_period_in_place.ts +84 -14
- package/src/manifest/update_periods.ts +93 -33
- package/src/parsers/manifest/dash/common/indexes/base.ts +4 -0
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +8 -1
- package/src/parsers/manifest/dash/common/indexes/template.ts +76 -25
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +61 -3
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +46 -15
- package/src/parsers/manifest/dash/common/parse_representations.ts +7 -3
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.ts +6 -0
- package/src/parsers/manifest/dash/node_parser_types.ts +3 -0
- package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +3 -0
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +4 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.ts +6 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.ts +7 -0
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +3 -0
- package/src/parsers/manifest/types.ts +13 -2
- package/src/parsers/texttracks/ttml/html/create_element.ts +8 -0
- package/src/public_types.ts +2 -0
- package/src/transports/README.md +15 -54
- package/src/transports/dash/manifest_parser.ts +2 -2
- package/src/transports/dash/segment_loader.ts +1 -1
- package/src/transports/dash/text_parser.ts +3 -3
- package/src/transports/local/segment_loader.ts +1 -1
- package/src/utils/__tests__/event_emitter.test.ts +1 -76
- package/src/utils/event_emitter.ts +6 -30
- package/src/utils/reference.ts +112 -169
- package/src/utils/request/xhr.ts +3 -68
- package/src/utils/retry_promise_with_backoff.ts +95 -0
- package/src/utils/sleep.ts +14 -0
- package/src/utils/sorted_list.ts +4 -0
- package/dist/_esm5.processed/compat/play.d.ts +0 -23
- package/dist/_esm5.processed/compat/play.js +0 -32
- package/dist/_esm5.processed/compat/set_element_src.d.ts +0 -26
- package/dist/_esm5.processed/compat/set_element_src.js +0 -37
- package/dist/_esm5.processed/compat/when_loaded_metadata.d.ts +0 -23
- package/dist/_esm5.processed/compat/when_loaded_metadata.js +0 -33
- package/dist/_esm5.processed/core/init/content_time_boundaries_observer.d.ts +0 -45
- package/dist/_esm5.processed/core/init/content_time_boundaries_observer.js +0 -295
- package/dist/_esm5.processed/core/init/create_media_source.js +0 -107
- package/dist/_esm5.processed/core/init/end_of_stream.js +0 -74
- package/dist/_esm5.processed/core/init/events_generators.d.ts +0 -88
- package/dist/_esm5.processed/core/init/events_generators.js +0 -87
- package/dist/_esm5.processed/core/init/initial_seek_and_play.d.ts +0 -81
- package/dist/_esm5.processed/core/init/initial_seek_and_play.js +0 -114
- package/dist/_esm5.processed/core/init/initialize_directfile.js +0 -120
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +0 -122
- package/dist/_esm5.processed/core/init/initialize_media_source.js +0 -201
- package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +0 -62
- package/dist/_esm5.processed/core/init/link_drm_and_content.js +0 -94
- package/dist/_esm5.processed/core/init/load_on_media_source.d.ts +0 -46
- package/dist/_esm5.processed/core/init/load_on_media_source.js +0 -122
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +0 -65
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +0 -233
- package/dist/_esm5.processed/core/init/rebuffering_controller.d.ts +0 -81
- package/dist/_esm5.processed/core/init/rebuffering_controller.js +0 -439
- package/dist/_esm5.processed/core/init/stream_events_emitter/index.d.ts +0 -19
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.d.ts +0 -27
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +0 -126
- package/dist/_esm5.processed/core/init/update_playback_rate.d.ts +0 -0
- package/dist/_esm5.processed/core/init/update_playback_rate.js +0 -1
- package/dist/_esm5.processed/core/stream/events_generators.d.ts +0 -67
- package/dist/_esm5.processed/core/stream/events_generators.js +0 -112
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.d.ts +0 -53
- package/dist/_esm5.processed/core/stream/orchestrator/active_period_emitter.js +0 -124
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.d.ts +0 -35
- package/dist/_esm5.processed/core/stream/orchestrator/are_streams_complete.js +0 -53
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.d.ts +0 -36
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +0 -46
- package/dist/_esm5.processed/core/stream/reload_after_switch.d.ts +0 -47
- package/dist/_esm5.processed/core/stream/reload_after_switch.js +0 -56
- package/dist/_esm5.processed/core/stream/representation/downloading_queue.js +0 -371
- package/dist/_esm5.processed/core/stream/representation/push_init_segment.js +0 -49
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +0 -76
- package/dist/_esm5.processed/core/stream/types.d.ts +0 -437
- package/dist/_esm5.processed/utils/cast_to_observable.d.ts +0 -24
- package/dist/_esm5.processed/utils/cast_to_observable.js +0 -35
- package/dist/_esm5.processed/utils/concat_map_latest.d.ts +0 -23
- package/dist/_esm5.processed/utils/concat_map_latest.js +0 -48
- package/dist/_esm5.processed/utils/defer_subscriptions.d.ts +0 -79
- package/dist/_esm5.processed/utils/defer_subscriptions.js +0 -89
- package/dist/_esm5.processed/utils/filter_map.d.ts +0 -28
- package/dist/_esm5.processed/utils/filter_map.js +0 -32
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +0 -39
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +0 -63
- package/dist/_esm5.processed/utils/rx-next-tick.d.ts +0 -27
- package/dist/_esm5.processed/utils/rx-next-tick.js +0 -41
- package/dist/_esm5.processed/utils/rx-retry_with_backoff.js +0 -70
- package/dist/_esm5.processed/utils/rx-throttle.d.ts +0 -40
- package/dist/_esm5.processed/utils/rx-throttle.js +0 -47
- package/dist/_esm5.processed/utils/rx-try_catch.d.ts +0 -23
- package/dist/_esm5.processed/utils/rx-try_catch.js +0 -30
- package/src/compat/__tests__/play.test.ts +0 -73
- package/src/compat/__tests__/set_element_src.test.ts +0 -71
- package/src/compat/__tests__/when_loaded_metadata.test.ts +0 -109
- package/src/compat/play.ts +0 -37
- package/src/compat/set_element_src.ts +0 -47
- package/src/compat/when_loaded_metadata.ts +0 -40
- package/src/core/init/content_time_boundaries_observer.ts +0 -382
- package/src/core/init/emit_loaded_event.ts +0 -71
- package/src/core/init/end_of_stream.ts +0 -104
- package/src/core/init/events_generators.ts +0 -140
- package/src/core/init/initial_seek_and_play.ts +0 -208
- package/src/core/init/initialize_directfile.ts +0 -191
- package/src/core/init/initialize_media_source.ts +0 -389
- package/src/core/init/link_drm_and_content.ts +0 -176
- package/src/core/init/load_on_media_source.ts +0 -237
- package/src/core/init/manifest_update_scheduler.ts +0 -362
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +0 -182
- package/src/core/init/throw_on_media_error.ts +0 -68
- package/src/core/init/update_playback_rate.ts +0 -0
- package/src/core/stream/events_generators.ts +0 -217
- package/src/core/stream/orchestrator/active_period_emitter.ts +0 -146
- package/src/core/stream/orchestrator/are_streams_complete.ts +0 -70
- package/src/core/stream/period/create_empty_adaptation_stream.ts +0 -70
- package/src/core/stream/reload_after_switch.ts +0 -76
- package/src/core/stream/representation/downloading_queue.ts +0 -632
- package/src/core/stream/representation/push_init_segment.ts +0 -87
- package/src/core/stream/representation/push_media_segment.ts +0 -125
- package/src/core/stream/types.ts +0 -558
- package/src/utils/__tests__/cast_to_observable.test.ts +0 -93
- package/src/utils/__tests__/concat_map_latest.test.ts +0 -221
- package/src/utils/__tests__/defer_subscriptions.test.ts +0 -50
- package/src/utils/__tests__/filter_map.test.ts +0 -87
- package/src/utils/__tests__/rx-throttle.test.ts +0 -252
- package/src/utils/__tests__/rx-try_catch.test.ts +0 -100
- package/src/utils/cast_to_observable.ts +0 -48
- package/src/utils/concat_map_latest.ts +0 -61
- package/src/utils/defer_subscriptions.ts +0 -96
- package/src/utils/filter_map.ts +0 -43
- package/src/utils/rx-from_cancellable_promise.ts +0 -71
- package/src/utils/rx-next-tick.ts +0 -43
- package/src/utils/rx-retry_with_backoff.ts +0 -101
- package/src/utils/rx-throttle.ts +0 -84
- package/src/utils/rx-try_catch.ts +0 -37
|
@@ -14,25 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
concat as observableConcat,
|
|
20
|
-
concatMap,
|
|
21
|
-
defer as observableDefer,
|
|
22
|
-
EMPTY,
|
|
23
|
-
identity,
|
|
24
|
-
ignoreElements,
|
|
25
|
-
map,
|
|
26
|
-
merge as observableMerge,
|
|
27
|
-
mergeMap,
|
|
28
|
-
Observable,
|
|
29
|
-
of as observableOf,
|
|
30
|
-
Subject,
|
|
31
|
-
tap,
|
|
32
|
-
takeUntil,
|
|
33
|
-
timeout,
|
|
34
|
-
TimeoutError,
|
|
35
|
-
} from "rxjs";
|
|
36
17
|
import {
|
|
37
18
|
events,
|
|
38
19
|
ICustomMediaKeySession,
|
|
@@ -43,182 +24,256 @@ import {
|
|
|
43
24
|
IKeySystemOption,
|
|
44
25
|
IPlayerError,
|
|
45
26
|
} from "../../public_types";
|
|
46
|
-
import castToObservable from "../../utils/cast_to_observable";
|
|
47
27
|
import isNonEmptyString from "../../utils/is_non_empty_string";
|
|
48
28
|
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
49
|
-
import
|
|
29
|
+
import retryPromiseWithBackoff, {
|
|
50
30
|
IBackoffOptions,
|
|
51
|
-
} from "../../utils/
|
|
52
|
-
import
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
} from "./types";
|
|
57
|
-
import checkKeyStatuses, {
|
|
58
|
-
IKeyStatusesCheckingOptions,
|
|
59
|
-
} from "./utils/check_key_statuses";
|
|
31
|
+
} from "../../utils/retry_promise_with_backoff";
|
|
32
|
+
import TaskCanceller, {
|
|
33
|
+
CancellationSignal,
|
|
34
|
+
} from "../../utils/task_canceller";
|
|
35
|
+
import checkKeyStatuses from "./utils/check_key_statuses";
|
|
60
36
|
|
|
61
|
-
const { onKeyError
|
|
62
|
-
onKeyMessage
|
|
63
|
-
onKeyStatusesChange
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Error thrown when the MediaKeySession is blacklisted.
|
|
67
|
-
* Such MediaKeySession should not be re-used but other MediaKeySession for the
|
|
68
|
-
* same content can still be used.
|
|
69
|
-
* @class BlacklistedSessionError
|
|
70
|
-
* @extends Error
|
|
71
|
-
*/
|
|
72
|
-
export class BlacklistedSessionError extends Error {
|
|
73
|
-
public sessionError : IPlayerError;
|
|
74
|
-
constructor(sessionError : IPlayerError) {
|
|
75
|
-
super();
|
|
76
|
-
// @see https://stackoverflow.com/questions/41102060/typescript-extending-error-class
|
|
77
|
-
Object.setPrototypeOf(this, BlacklistedSessionError.prototype);
|
|
78
|
-
this.sessionError = sessionError;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
37
|
+
const { onKeyError,
|
|
38
|
+
onKeyMessage,
|
|
39
|
+
onKeyStatusesChange } = events;
|
|
81
40
|
|
|
82
41
|
/**
|
|
83
|
-
*
|
|
42
|
+
* Listen to various events from a MediaKeySession and react accordingly
|
|
84
43
|
* depending on the configuration given.
|
|
85
44
|
* @param {MediaKeySession} session - The MediaKeySession concerned.
|
|
86
45
|
* @param {Object} keySystemOptions - The key system options.
|
|
87
46
|
* @param {String} keySystem - The configuration keySystem used for deciphering
|
|
88
|
-
* @
|
|
47
|
+
* @param {Object} callbacks
|
|
48
|
+
* @param {Object} cancelSignal
|
|
89
49
|
*/
|
|
90
50
|
export default function SessionEventsListener(
|
|
91
|
-
session: MediaKeySession | ICustomMediaKeySession,
|
|
92
|
-
keySystemOptions: IKeySystemOption,
|
|
93
|
-
keySystem: string
|
|
94
|
-
|
|
51
|
+
session : MediaKeySession | ICustomMediaKeySession,
|
|
52
|
+
keySystemOptions : IKeySystemOption,
|
|
53
|
+
keySystem : string,
|
|
54
|
+
callbacks : ISessionEventListenerCallbacks,
|
|
55
|
+
cancelSignal : CancellationSignal
|
|
56
|
+
) : void {
|
|
95
57
|
log.info("DRM: Binding session events", session.sessionId);
|
|
96
|
-
const sessionWarningSubject$ = new Subject<IEMEWarningEvent>();
|
|
97
58
|
const { getLicenseConfig = {} } = keySystemOptions;
|
|
98
59
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}));
|
|
60
|
+
/** Allows to manually cancel everything the `SessionEventsListener` is doing. */
|
|
61
|
+
const manualCanceller = new TaskCanceller({ cancelOn: cancelSignal });
|
|
102
62
|
|
|
103
|
-
|
|
104
|
-
.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
63
|
+
if (!isNullOrUndefined(session.closed)) {
|
|
64
|
+
session.closed
|
|
65
|
+
.then(() => manualCanceller.cancel())
|
|
66
|
+
.catch((err) => { // Should never happen
|
|
67
|
+
if (cancelSignal.isCancelled) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
manualCanceller.cancel();
|
|
71
|
+
callbacks.onError(err);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
109
74
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const messageType = isNonEmptyString(messageEvent.messageType) ?
|
|
115
|
-
messageEvent.messageType :
|
|
116
|
-
"license-request";
|
|
75
|
+
onKeyError(session, (evt) => {
|
|
76
|
+
manualCanceller.cancel();
|
|
77
|
+
callbacks.onError(new EncryptedMediaError("KEY_ERROR", (evt as Event).type));
|
|
78
|
+
}, manualCanceller.signal);
|
|
117
79
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
80
|
+
onKeyStatusesChange(session, (keyStatusesEvent) => {
|
|
81
|
+
handleKeyStatusesChangeEvent(keyStatusesEvent as Event).catch(error => {
|
|
82
|
+
if (cancelSignal.isCancelled ||
|
|
83
|
+
(manualCanceller.isUsed && error instanceof CancellationSignal))
|
|
84
|
+
{
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
manualCanceller.cancel();
|
|
88
|
+
callbacks.onError(error);
|
|
89
|
+
});
|
|
90
|
+
}, manualCanceller.signal);
|
|
91
|
+
|
|
92
|
+
onKeyMessage(session, (evt) => {
|
|
93
|
+
const messageEvent = evt as MediaKeyMessageEvent;
|
|
94
|
+
const message = new Uint8Array(messageEvent.message);
|
|
95
|
+
const messageType = isNonEmptyString(messageEvent.messageType) ?
|
|
96
|
+
messageEvent.messageType :
|
|
97
|
+
"license-request";
|
|
129
98
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return retryObsWithBackoff(getLicense$, backoffOptions).pipe(
|
|
133
|
-
map(licenseObject => ({
|
|
134
|
-
type: "key-message-handled" as const,
|
|
135
|
-
value : { session, license: licenseObject },
|
|
136
|
-
})),
|
|
99
|
+
log.info(`DRM: Received message event, type ${messageType}`,
|
|
100
|
+
session.sessionId);
|
|
137
101
|
|
|
138
|
-
|
|
139
|
-
|
|
102
|
+
const backoffOptions = getLicenseBackoffOptions(getLicenseConfig.retry);
|
|
103
|
+
retryPromiseWithBackoff(() => runGetLicense(message, messageType),
|
|
104
|
+
backoffOptions,
|
|
105
|
+
manualCanceller.signal)
|
|
106
|
+
.then((licenseObject) => {
|
|
107
|
+
if (manualCanceller.isUsed) {
|
|
108
|
+
return Promise.resolve();
|
|
109
|
+
}
|
|
110
|
+
if (isNullOrUndefined(licenseObject)) {
|
|
111
|
+
log.info("DRM: No license given, skipping session.update");
|
|
112
|
+
} else {
|
|
113
|
+
return updateSessionWithMessage(session, licenseObject);
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
.catch((err : unknown) => {
|
|
117
|
+
if (manualCanceller.isUsed) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
manualCanceller.cancel();
|
|
121
|
+
const formattedError = formatGetLicenseError(err);
|
|
140
122
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
123
|
+
if (!isNullOrUndefined(err)) {
|
|
124
|
+
const { fallbackOnLastTry } = (err as { fallbackOnLastTry? : boolean });
|
|
125
|
+
if (fallbackOnLastTry === true) {
|
|
126
|
+
log.warn("DRM: Last `getLicense` attempt failed. " +
|
|
127
|
+
"Blacklisting the current session.");
|
|
128
|
+
callbacks.onError(new BlacklistedSessionError(formattedError));
|
|
129
|
+
return;
|
|
148
130
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
131
|
+
}
|
|
132
|
+
callbacks.onError(formattedError);
|
|
133
|
+
});
|
|
134
|
+
}, manualCanceller.signal);
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @param {Event} keyStatusesEvent
|
|
138
|
+
* @returns {Promise}
|
|
139
|
+
*/
|
|
140
|
+
async function handleKeyStatusesChangeEvent(
|
|
141
|
+
keyStatusesEvent : Event
|
|
142
|
+
) : Promise<void> {
|
|
143
|
+
log.info("DRM: keystatuseschange event received", session.sessionId);
|
|
144
|
+
|
|
145
|
+
await Promise.all([
|
|
146
|
+
runOnKeyStatusesChangeCallback(),
|
|
147
|
+
Promise.resolve(handleKeyStatusEvent()),
|
|
148
|
+
]);
|
|
152
149
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
return
|
|
150
|
+
async function runOnKeyStatusesChangeCallback() {
|
|
151
|
+
if (manualCanceller.isUsed) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (typeof keySystemOptions.onKeyStatusesChange === "function") {
|
|
155
|
+
let ret;
|
|
156
|
+
try {
|
|
157
|
+
ret = await keySystemOptions.onKeyStatusesChange(keyStatusesEvent, session);
|
|
158
|
+
if (manualCanceller.isUsed) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
} catch (error) {
|
|
162
|
+
if (cancelSignal.isCancelled) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const err = new EncryptedMediaError("KEY_STATUS_CHANGE_ERROR",
|
|
166
|
+
"Unknown `onKeyStatusesChange` error");
|
|
167
|
+
if (!isNullOrUndefined(error) &&
|
|
168
|
+
isNonEmptyString((error as { message? : unknown }).message))
|
|
169
|
+
{
|
|
170
|
+
err.message = (error as { message : string }).message;
|
|
167
171
|
}
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
if (isNullOrUndefined(ret)) {
|
|
175
|
+
log.info("DRM: No license given, skipping session.update");
|
|
176
|
+
} else {
|
|
177
|
+
await updateSessionWithMessage(session, ret);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Check current MediaKeyStatus for each key in the given MediaKeySession and:
|
|
184
|
+
* - throw if at least one status is a non-recoverable error
|
|
185
|
+
* - call warning callback for recoverable errors
|
|
186
|
+
* - call onKeyUpdate callback when the MediaKeyStatus of any key is updated
|
|
187
|
+
*/
|
|
188
|
+
function handleKeyStatusEvent() : void {
|
|
189
|
+
if (manualCanceller.isUsed || session.keyStatuses.size === 0) {
|
|
190
|
+
return ;
|
|
191
|
+
}
|
|
192
|
+
const { warning, blacklistedKeyIds, whitelistedKeyIds } =
|
|
193
|
+
checkKeyStatuses(session, keySystemOptions, keySystem);
|
|
194
|
+
if (warning !== undefined) {
|
|
195
|
+
callbacks.onWarning(warning);
|
|
196
|
+
if (manualCanceller.isUsed) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
callbacks.onKeyUpdate({ whitelistedKeyIds, blacklistedKeyIds });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
168
203
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
204
|
+
function runGetLicense(
|
|
205
|
+
message : Uint8Array,
|
|
206
|
+
messageType : MediaKeyMessageType
|
|
207
|
+
) : Promise<BufferSource | null> {
|
|
208
|
+
return new Promise((res, rej) => {
|
|
209
|
+
log.debug("DRM: Calling `getLicense`", messageType);
|
|
210
|
+
const getLicense = keySystemOptions.getLicense(message, messageType);
|
|
211
|
+
const getLicenseTimeout = isNullOrUndefined(getLicenseConfig.timeout) ?
|
|
212
|
+
10 * 1000 :
|
|
213
|
+
getLicenseConfig.timeout;
|
|
214
|
+
|
|
215
|
+
let timeoutId : number | undefined;
|
|
216
|
+
if (getLicenseTimeout >= 0) {
|
|
217
|
+
timeoutId = setTimeout(() => {
|
|
218
|
+
rej(new GetLicenseTimeoutError(
|
|
219
|
+
`"getLicense" timeout exceeded (${getLicenseTimeout} ms)`
|
|
220
|
+
));
|
|
221
|
+
}, getLicenseTimeout) as unknown as number;
|
|
172
222
|
}
|
|
173
|
-
}));
|
|
174
223
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
224
|
+
try {
|
|
225
|
+
Promise.resolve(getLicense).then(
|
|
226
|
+
(val) => {
|
|
227
|
+
clearTimeoutIfOne();
|
|
228
|
+
res(val);
|
|
229
|
+
},
|
|
230
|
+
(err) => {
|
|
231
|
+
clearTimeoutIfOne();
|
|
232
|
+
rej(err);
|
|
233
|
+
});
|
|
234
|
+
} catch (err) {
|
|
235
|
+
clearTimeoutIfOne();
|
|
236
|
+
rej(err);
|
|
237
|
+
}
|
|
238
|
+
function clearTimeoutIfOne() {
|
|
239
|
+
if (timeoutId !== undefined) {
|
|
240
|
+
clearTimeout(timeoutId);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
180
245
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
246
|
+
/**
|
|
247
|
+
* Construct backoff options for the getLicense call.
|
|
248
|
+
* @param {number|undefined} numberOfRetry - Maximum of amount retried.
|
|
249
|
+
* Equal to `2` if not defined.
|
|
250
|
+
* @returns {Object}
|
|
251
|
+
*/
|
|
252
|
+
function getLicenseBackoffOptions(
|
|
253
|
+
numberOfRetry : number | undefined
|
|
254
|
+
) : IBackoffOptions {
|
|
255
|
+
return {
|
|
256
|
+
totalRetry: numberOfRetry ?? 2,
|
|
257
|
+
baseDelay: 200,
|
|
258
|
+
maxDelay: 3000,
|
|
259
|
+
shouldRetry: (error : unknown) =>
|
|
260
|
+
error instanceof GetLicenseTimeoutError ||
|
|
261
|
+
isNullOrUndefined(error) ||
|
|
262
|
+
(error as { noRetry? : boolean }).noRetry !== true,
|
|
263
|
+
onRetry: (error : unknown) =>
|
|
264
|
+
callbacks.onWarning(formatGetLicenseError(error)),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
188
267
|
}
|
|
189
268
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
* @param {String} keySystem - The name of the key system used for deciphering
|
|
199
|
-
* @returns {Observable}
|
|
200
|
-
*/
|
|
201
|
-
function getKeyStatusesEvents(
|
|
202
|
-
session : MediaKeySession | ICustomMediaKeySession,
|
|
203
|
-
options : IKeyStatusesCheckingOptions,
|
|
204
|
-
keySystem : string
|
|
205
|
-
) : Observable<IEMEWarningEvent | IKeysUpdateEvent> {
|
|
206
|
-
return observableDefer(() => {
|
|
207
|
-
if (session.keyStatuses.size === 0) {
|
|
208
|
-
return EMPTY;
|
|
209
|
-
}
|
|
210
|
-
const { warning,
|
|
211
|
-
blacklistedKeyIds,
|
|
212
|
-
whitelistedKeyIds } = checkKeyStatuses(session, options, keySystem);
|
|
213
|
-
const keysUpdate$ = observableOf({ type : "keys-update" as const,
|
|
214
|
-
value : { whitelistedKeyIds,
|
|
215
|
-
blacklistedKeyIds } });
|
|
216
|
-
if (warning !== undefined) {
|
|
217
|
-
return observableConcat(observableOf({ type: "warning" as const, value: warning }),
|
|
218
|
-
keysUpdate$);
|
|
219
|
-
}
|
|
220
|
-
return keysUpdate$;
|
|
221
|
-
});
|
|
269
|
+
export interface ISessionEventListenerCallbacks {
|
|
270
|
+
/**
|
|
271
|
+
* Some key ids related to the current MediaKeySession have updated their
|
|
272
|
+
* statuses.
|
|
273
|
+
*/
|
|
274
|
+
onKeyUpdate : (val : IKeyUpdateValue) => void;
|
|
275
|
+
onWarning : (val : IPlayerError) => void;
|
|
276
|
+
onError : (val : unknown | BlacklistedSessionError) => void;
|
|
222
277
|
}
|
|
223
278
|
|
|
224
279
|
/**
|
|
@@ -228,7 +283,7 @@ function getKeyStatusesEvents(
|
|
|
228
283
|
* @returns {Error}
|
|
229
284
|
*/
|
|
230
285
|
function formatGetLicenseError(error: unknown) : IPlayerError {
|
|
231
|
-
if (error instanceof
|
|
286
|
+
if (error instanceof GetLicenseTimeoutError) {
|
|
232
287
|
return new EncryptedMediaError("KEY_LOAD_TIMEOUT",
|
|
233
288
|
"The license server took too much time to " +
|
|
234
289
|
"respond.");
|
|
@@ -246,111 +301,23 @@ function formatGetLicenseError(error: unknown) : IPlayerError {
|
|
|
246
301
|
|
|
247
302
|
/**
|
|
248
303
|
* Call MediaKeySession.update with the given `message`, if defined.
|
|
249
|
-
* Returns the right event depending on the action taken.
|
|
250
304
|
* @param {MediaKeySession} session
|
|
251
305
|
* @param {ArrayBuffer|TypedArray|null} message
|
|
252
|
-
* @returns {
|
|
306
|
+
* @returns {Promise}
|
|
253
307
|
*/
|
|
254
|
-
function updateSessionWithMessage(
|
|
308
|
+
async function updateSessionWithMessage(
|
|
255
309
|
session : MediaKeySession | ICustomMediaKeySession,
|
|
256
310
|
message : BufferSource
|
|
257
|
-
) :
|
|
311
|
+
) : Promise<void> {
|
|
258
312
|
log.info("DRM: Updating MediaKeySession with message");
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
268
|
-
// leading to linter issues, as it forbids the usage of `any`.
|
|
269
|
-
// This is why we're disabling the eslint rule.
|
|
270
|
-
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
271
|
-
ignoreElements());
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/**
|
|
275
|
-
* @param {MediaKeySession} session
|
|
276
|
-
* @param {Object} keySystemOptions
|
|
277
|
-
* @param {string} keySystem
|
|
278
|
-
* @param {Event} keyStatusesEvent
|
|
279
|
-
* @returns {Observable}
|
|
280
|
-
*/
|
|
281
|
-
function handleKeyStatusesChangeEvent(
|
|
282
|
-
session : MediaKeySession | ICustomMediaKeySession,
|
|
283
|
-
keySystemOptions : IKeySystemOption,
|
|
284
|
-
keySystem : string,
|
|
285
|
-
keyStatusesEvent : Event
|
|
286
|
-
) : Observable<IKeyStatusChangeHandledEvent | IKeysUpdateEvent | IEMEWarningEvent> {
|
|
287
|
-
log.info("DRM: keystatuseschange event received", session.sessionId);
|
|
288
|
-
const callback$ = observableDefer(() => {
|
|
289
|
-
return tryCatch(() => {
|
|
290
|
-
if (typeof keySystemOptions.onKeyStatusesChange !== "function") {
|
|
291
|
-
return EMPTY;
|
|
292
|
-
}
|
|
293
|
-
return castToObservable(keySystemOptions.onKeyStatusesChange(keyStatusesEvent,
|
|
294
|
-
session));
|
|
295
|
-
}, undefined);
|
|
296
|
-
}).pipe(
|
|
297
|
-
map(licenseObject => ({ type: "key-status-change-handled" as const,
|
|
298
|
-
value : { session, license: licenseObject } })),
|
|
299
|
-
catchError((error: unknown) => {
|
|
300
|
-
const err = new EncryptedMediaError("KEY_STATUS_CHANGE_ERROR",
|
|
301
|
-
"Unknown `onKeyStatusesChange` error");
|
|
302
|
-
if (!isNullOrUndefined(error) &&
|
|
303
|
-
isNonEmptyString((error as { message? : unknown }).message))
|
|
304
|
-
{
|
|
305
|
-
err.message = (error as { message : string }).message;
|
|
306
|
-
}
|
|
307
|
-
throw err;
|
|
308
|
-
})
|
|
309
|
-
);
|
|
310
|
-
return observableMerge(getKeyStatusesEvents(session, keySystemOptions, keySystem),
|
|
311
|
-
callback$);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Construct backoff options for the getLicense call.
|
|
316
|
-
* @param {Subject} sessionWarningSubject$ - Subject through which retry
|
|
317
|
-
* warnings will be sent.
|
|
318
|
-
* @param {number|undefined} numberOfRetry - Maximum of amount retried.
|
|
319
|
-
* Equal to `2` if not defined.
|
|
320
|
-
* @returns {Object}
|
|
321
|
-
*/
|
|
322
|
-
function getLicenseBackoffOptions(
|
|
323
|
-
sessionWarningSubject$ : Subject<IEMEWarningEvent>,
|
|
324
|
-
numberOfRetry : number | undefined
|
|
325
|
-
) : IBackoffOptions {
|
|
326
|
-
return {
|
|
327
|
-
totalRetry: numberOfRetry ?? 2,
|
|
328
|
-
baseDelay: 200,
|
|
329
|
-
maxDelay: 3000,
|
|
330
|
-
shouldRetry: (error : unknown) => error instanceof TimeoutError ||
|
|
331
|
-
isNullOrUndefined(error) ||
|
|
332
|
-
(error as { noRetry? : boolean }).noRetry !== true,
|
|
333
|
-
onRetry: (error : unknown) =>
|
|
334
|
-
sessionWarningSubject$.next({ type: "warning",
|
|
335
|
-
value: formatGetLicenseError(error) }),
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Some key ids related to the current MediaKeySession have updated their
|
|
341
|
-
* statuses.
|
|
342
|
-
*
|
|
343
|
-
* Note that each `IKeysUpdateEvent` is independent of any other.
|
|
344
|
-
*
|
|
345
|
-
* A new `IKeysUpdateEvent` does not completely replace a previously emitted
|
|
346
|
-
* one, as it can for example be linked to a whole other decryption session.
|
|
347
|
-
*
|
|
348
|
-
* However, if a key id is encountered in both an older and a newer
|
|
349
|
-
* `IKeysUpdateEvent`, only the newer, updated, status should be considered.
|
|
350
|
-
*/
|
|
351
|
-
export interface IKeysUpdateEvent {
|
|
352
|
-
type: "keys-update";
|
|
353
|
-
value: IKeyUpdateValue;
|
|
313
|
+
try {
|
|
314
|
+
await session.update(message);
|
|
315
|
+
} catch (error) {
|
|
316
|
+
const reason = error instanceof Error ? error.toString() :
|
|
317
|
+
"`session.update` failed";
|
|
318
|
+
throw new EncryptedMediaError("KEY_UPDATE_ERROR", reason);
|
|
319
|
+
}
|
|
320
|
+
log.info("DRM: MediaKeySession update succeeded.");
|
|
354
321
|
}
|
|
355
322
|
|
|
356
323
|
/** Information on key ids linked to a MediaKeySession. */
|
|
@@ -382,18 +349,33 @@ export interface IKeyUpdateValue {
|
|
|
382
349
|
whitelistedKeyIds : Uint8Array[];
|
|
383
350
|
}
|
|
384
351
|
|
|
385
|
-
/**
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
352
|
+
/**
|
|
353
|
+
* Error thrown when the MediaKeySession is blacklisted.
|
|
354
|
+
* Such MediaKeySession should not be re-used but other MediaKeySession for the
|
|
355
|
+
* same content can still be used.
|
|
356
|
+
* @class BlacklistedSessionError
|
|
357
|
+
* @extends Error
|
|
358
|
+
*/
|
|
359
|
+
export class BlacklistedSessionError extends Error {
|
|
360
|
+
public sessionError : IPlayerError;
|
|
361
|
+
constructor(sessionError : IPlayerError) {
|
|
362
|
+
super();
|
|
363
|
+
// @see https://stackoverflow.com/questions/41102060/typescript-extending-error-class
|
|
364
|
+
Object.setPrototypeOf(this, BlacklistedSessionError.prototype);
|
|
365
|
+
this.sessionError = sessionError;
|
|
366
|
+
}
|
|
391
367
|
}
|
|
392
368
|
|
|
393
|
-
/**
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
369
|
+
/**
|
|
370
|
+
* Error thrown when a `getLicense` call timeouts.
|
|
371
|
+
* @class GetLicenseTimeoutError
|
|
372
|
+
* @extends Error
|
|
373
|
+
*/
|
|
374
|
+
export class GetLicenseTimeoutError extends Error {
|
|
375
|
+
constructor(message : string) {
|
|
376
|
+
super();
|
|
377
|
+
// @see https://stackoverflow.com/questions/41102060/typescript-extending-error-class
|
|
378
|
+
Object.setPrototypeOf(this, BlacklistedSessionError.prototype);
|
|
379
|
+
this.message = message;
|
|
380
|
+
}
|
|
399
381
|
}
|
|
@@ -61,7 +61,7 @@ async function setServerCertificate(
|
|
|
61
61
|
* and complete.
|
|
62
62
|
* @param {MediaKeys} mediaKeys
|
|
63
63
|
* @param {ArrayBuffer} serverCertificate
|
|
64
|
-
* @returns {
|
|
64
|
+
* @returns {Promise.<Object>}
|
|
65
65
|
*/
|
|
66
66
|
export default async function trySettingServerCertificate(
|
|
67
67
|
mediaKeys : ICustomMediaKeys|MediaKeys,
|
|
@@ -19,7 +19,6 @@ import Manifest, {
|
|
|
19
19
|
Period,
|
|
20
20
|
Representation,
|
|
21
21
|
} from "../../manifest";
|
|
22
|
-
import { IPlayerError } from "../../public_types";
|
|
23
22
|
import InitDataValuesContainer from "./utils/init_data_values_container";
|
|
24
23
|
import LoadedSessionsStore from "./utils/loaded_sessions_store";
|
|
25
24
|
import PersistentSessionsStore from "./utils/persistent_sessions_store";
|
|
@@ -74,10 +73,6 @@ export interface IInitDataValue {
|
|
|
74
73
|
data: Uint8Array;
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
/** Event emitted when a minor - recoverable - error happened. */
|
|
78
|
-
export interface IEMEWarningEvent { type : "warning";
|
|
79
|
-
value : IPlayerError; }
|
|
80
|
-
|
|
81
76
|
export type ILicense = BufferSource |
|
|
82
77
|
ArrayBuffer;
|
|
83
78
|
|
|
@@ -23,7 +23,7 @@ import LoadedSessionsStore from "./loaded_sessions_store";
|
|
|
23
23
|
* Emit event when a MediaKeySession begin to be closed and another when the
|
|
24
24
|
* MediaKeySession is closed.
|
|
25
25
|
* @param {Object} loadedSessionsStore
|
|
26
|
-
* @returns {
|
|
26
|
+
* @returns {Promise}
|
|
27
27
|
*/
|
|
28
28
|
export default async function cleanOldLoadedSessions(
|
|
29
29
|
loadedSessionsStore : LoadedSessionsStore,
|
|
@@ -479,7 +479,7 @@ export interface IStoredSessionEntry {
|
|
|
479
479
|
* Close a MediaKeySession and just log an error if it fails (while resolving).
|
|
480
480
|
* Emits then complete when done.
|
|
481
481
|
* @param {MediaKeySession} mediaKeySession
|
|
482
|
-
* @returns {
|
|
482
|
+
* @returns {Promise}
|
|
483
483
|
*/
|
|
484
484
|
async function safelyCloseMediaKeySession(
|
|
485
485
|
mediaKeySession : MediaKeySession | ICustomMediaKeySession
|
|
@@ -21,6 +21,9 @@ protocol-agnostic.
|
|
|
21
21
|
This is the part of the code that interacts with `transports` to perform the
|
|
22
22
|
request and parsing of the Manifest file.
|
|
23
23
|
|
|
24
|
+
It also regularly refreshes the Manifest, based on its attributes and other
|
|
25
|
+
criteria, like performances when doing that.
|
|
26
|
+
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
## The SegmentFetcherCreator ###################################################
|