rx-player 3.26.2 → 3.27.0-dev.20220317
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/.github/workflows/perfs.yml +22 -0
- package/CHANGELOG.md +33 -1
- package/FILES.md +5 -4
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
- package/dist/_esm5.processed/compat/browser_detection.js +4 -2
- package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
- package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +27 -24
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
- package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
- package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
- package/dist/_esm5.processed/compat/event_listeners.js +2 -1
- package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
- package/dist/_esm5.processed/config.d.ts +166 -1080
- package/dist/_esm5.processed/config.js +17 -1119
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.d.ts +28 -6
- package/dist/_esm5.processed/core/abr/buffer_based_chooser.js +63 -12
- package/dist/_esm5.processed/core/abr/network_analyzer.d.ts +1 -1
- package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
- package/dist/_esm5.processed/core/abr/pending_requests_store.js +3 -5
- package/dist/_esm5.processed/core/abr/representation_estimator.d.ts +1 -1
- package/dist/_esm5.processed/core/abr/representation_estimator.js +2 -2
- package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
- package/dist/_esm5.processed/core/api/index.d.ts +2 -1
- package/dist/_esm5.processed/core/api/media_element_track_choice_manager.d.ts +6 -0
- package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +22 -4
- package/dist/_esm5.processed/core/api/option_utils.d.ts +3 -1
- package/dist/_esm5.processed/core/api/option_utils.js +19 -6
- package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
- package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
- package/dist/_esm5.processed/core/api/public_api.js +72 -33
- package/dist/_esm5.processed/core/api/track_choice_manager.d.ts +6 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -51
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +30 -75
- package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +104 -0
- package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
- package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
- package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
- package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
- package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
- package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +120 -242
- package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
- package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +85 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.d.ts +4 -4
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -3
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +2 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +6 -2
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
- package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +1 -1
- package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +3 -3
- package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +5 -3
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
- package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
- package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.d.ts +4 -4
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
- package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/are_same_stream_events.d.ts +4 -4
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/types.d.ts +2 -2
- package/dist/_esm5.processed/core/init/types.d.ts +2 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +3 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +32 -31
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +4 -4
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
- package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
- package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +5 -6
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
- package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
- package/dist/_esm5.processed/default_config.d.ts +1114 -0
- package/dist/_esm5.processed/default_config.js +1145 -0
- package/dist/_esm5.processed/errors/request_error.js +3 -1
- package/dist/_esm5.processed/experimental/index.d.ts +2 -0
- package/dist/_esm5.processed/experimental/index.js +2 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.d.ts +2 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +2 -4
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.d.ts +3 -3
- package/dist/_esm5.processed/features/features_object.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +1 -1
- package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
- package/dist/_esm5.processed/features/list/eme.js +5 -5
- package/dist/_esm5.processed/features/types.d.ts +3 -3
- package/dist/_esm5.processed/manifest/adaptation.d.ts +2 -2
- package/dist/_esm5.processed/manifest/adaptation.js +3 -1
- package/dist/_esm5.processed/manifest/manifest.d.ts +10 -23
- package/dist/_esm5.processed/manifest/manifest.js +10 -74
- package/dist/_esm5.processed/manifest/period.d.ts +3 -3
- package/dist/_esm5.processed/manifest/representation.d.ts +37 -5
- package/dist/_esm5.processed/manifest/representation_index/types.d.ts +18 -18
- package/dist/_esm5.processed/manifest/types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.d.ts +6 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.d.ts +14 -14
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.d.ts +17 -17
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.d.ts +28 -20
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +20 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.d.ts +17 -35
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +109 -96
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.d.ts +8 -8
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.d.ts +18 -27
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +25 -23
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.d.ts +21 -15
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +19 -19
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.d.ts +15 -38
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +8 -8
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.d.ts +30 -30
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.d.ts +3 -3
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.d.ts +7 -7
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.d.ts +8 -8
- package/dist/_esm5.processed/parsers/manifest/types.d.ts +28 -28
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.d.ts +3 -2
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +15 -5
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.d.ts +2 -2
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.d.ts +11 -1
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +31 -19
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.d.ts +2 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.d.ts +1 -1
- package/dist/_esm5.processed/public_types.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +2 -1
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +4 -1
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/segment_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/text_loader.js +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/local/segment_loader.d.ts +1 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +1 -1
- package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
- package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +1 -1
- package/dist/_esm5.processed/transports/smooth/pipelines.js +69 -11
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +0 -1
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/types.d.ts +58 -30
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -1
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.d.ts +1 -1
- package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -1
- package/dist/_esm5.processed/utils/cast_to_observable.d.ts +1 -2
- package/dist/_esm5.processed/utils/cast_to_observable.js +1 -1
- package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
- package/dist/_esm5.processed/utils/deep_merge.js +53 -0
- package/dist/_esm5.processed/utils/reference.d.ts +29 -0
- package/dist/_esm5.processed/utils/reference.js +72 -24
- package/dist/_esm5.processed/utils/request/fetch.d.ts +4 -5
- package/dist/_esm5.processed/utils/request/fetch.js +8 -6
- package/dist/_esm5.processed/utils/request/xhr.d.ts +6 -6
- package/dist/_esm5.processed/utils/request/xhr.js +3 -2
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.d.ts +1 -2
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
- package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
- package/dist/_esm5.processed/utils/task_canceller.js +3 -3
- package/dist/rx-player.js +5242 -3190
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
- package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
- package/package.json +33 -36
- package/scripts/build/templates/experimental/index.d.ts +16 -0
- package/scripts/build/templates/experimental/index.js +16 -0
- package/scripts/doc-generator/generate_header_html.js +6 -7
- package/scripts/doc-generator/generate_page_html.js +3 -4
- package/scripts/doc-generator/generate_page_list_html.js +4 -5
- package/scripts/doc-generator/generate_sidebar_html.js +4 -7
- package/scripts/doc-generator/utils.js +0 -11
- package/scripts/generate_demo_list.js +3 -3
- package/scripts/generate_documentation_list.js +3 -3
- package/scripts/launch_static_server.js +127 -67
- package/scripts/run_standalone_demo.js +1 -0
- package/scripts/start_demo_web_server.js +1 -0
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/fullscreen.test.ts +7 -7
- package/src/compat/__tests__/is_vtt_cue.test.ts +1 -1
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
- package/src/compat/browser_detection.ts +4 -2
- package/src/compat/eme/close_session.ts +90 -56
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +1 -1
- package/src/compat/eme/custom_media_keys/index.ts +28 -41
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +29 -31
- package/src/compat/event_listeners.ts +2 -1
- package/src/compat/should_favour_custom_safari_EME.ts +5 -2
- package/src/config.ts +17 -1210
- package/src/core/README.md +1 -1
- package/src/core/abr/__tests__/{get_estimate_from_buffer_levels.test.ts → buffer_based_chooser.test.ts} +94 -123
- package/src/core/abr/bandwidth_estimator.ts +4 -4
- package/src/core/abr/buffer_based_chooser.ts +85 -20
- package/src/core/abr/network_analyzer.ts +6 -7
- package/src/core/abr/pending_requests_store.ts +3 -5
- package/src/core/abr/representation_estimator.ts +6 -3
- package/src/core/api/__tests__/get_player_state.test.ts +3 -3
- package/src/core/api/__tests__/option_utils.test.ts +17 -17
- package/src/core/api/get_player_state.ts +1 -1
- package/src/core/api/index.ts +3 -0
- package/src/core/api/media_element_track_choice_manager.ts +22 -3
- package/src/core/api/option_utils.ts +37 -20
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +152 -112
- package/src/core/api/track_choice_manager.ts +10 -9
- package/src/core/decrypt/README.md +22 -0
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
- package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
- package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
- package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
- package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +36 -103
- package/src/core/{eme → decrypt}/attach_media_keys.ts +49 -56
- package/src/core/decrypt/clear_on_stop.ts +48 -0
- package/src/core/decrypt/content_decryptor.ts +1158 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +175 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +126 -134
- package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
- package/src/core/decrypt/get_media_keys.ts +145 -0
- package/src/core/{eme → decrypt}/index.ts +11 -8
- package/src/core/decrypt/init_media_keys.ts +51 -0
- package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
- package/src/core/decrypt/set_server_certificate.ts +104 -0
- package/src/core/{eme → decrypt}/types.ts +129 -259
- package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
- package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
- package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
- package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +20 -20
- package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
- package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
- package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
- package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
- package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
- package/src/core/decrypt/utils/key_session_record.ts +175 -0
- package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
- package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
- package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
- package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
- package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +9 -9
- package/src/core/fetchers/segment/segment_fetcher.ts +10 -7
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +1 -1
- package/src/core/init/.initialize_media_source.ts.un~ +0 -0
- package/src/core/init/get_initial_time.ts +2 -1
- package/src/core/init/initialize_directfile.ts +19 -22
- package/src/core/init/initialize_media_source.ts +43 -106
- package/src/core/init/link_drm_and_content.ts +176 -0
- package/src/core/init/manifest_update_scheduler.ts +12 -10
- package/src/core/init/stall_avoider.ts +6 -5
- package/src/core/init/stream_events_emitter/are_same_stream_events.ts +4 -4
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
- package/src/core/init/stream_events_emitter/types.ts +2 -2
- package/src/core/init/types.ts +1 -39
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +6 -7
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +32 -31
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +4 -4
- package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
- package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
- package/src/core/stream/events_generators.ts +9 -4
- package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
- package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
- package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
- package/src/core/stream/period/period_stream.ts +5 -2
- package/src/core/stream/representation/force_garbage_collection.ts +5 -7
- package/src/core/stream/representation/get_buffer_status.ts +28 -16
- package/src/core/stream/representation/get_needed_segments.ts +124 -28
- package/src/core/stream/representation/get_segment_priority.ts +1 -2
- package/src/core/stream/representation/push_media_segment.ts +3 -2
- package/src/core/stream/representation/representation_stream.ts +30 -7
- package/src/core/stream/types.ts +1 -1
- package/src/default_config.ts +1241 -0
- package/src/errors/request_error.ts +4 -1
- package/src/experimental/index.ts +5 -0
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +5 -7
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +1 -1
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +3 -3
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/types.ts +3 -3
- package/src/features/__tests__/initialize_features.test.ts +2 -2
- package/src/features/features_object.ts +1 -1
- package/src/features/initialize_features.ts +1 -1
- package/src/features/list/__tests__/eme.test.ts +5 -5
- package/src/features/list/eme.ts +5 -5
- package/src/features/types.ts +3 -10
- package/src/manifest/adaptation.ts +6 -4
- package/src/manifest/manifest.ts +16 -86
- package/src/manifest/period.ts +3 -3
- package/src/manifest/representation.ts +38 -5
- package/src/manifest/representation_index/types.ts +18 -18
- package/src/manifest/types.ts +3 -3
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +1 -0
- package/src/parsers/manifest/dash/common/get_hdr_information.ts +1 -1
- package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +3 -3
- package/src/parsers/manifest/dash/common/indexes/base.ts +6 -6
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +4 -2
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +2 -2
- package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/list.ts +14 -14
- package/src/parsers/manifest/dash/common/indexes/template.ts +18 -18
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +1 -1
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +51 -23
- package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +2 -2
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +167 -134
- package/src/parsers/manifest/dash/common/parse_mpd.ts +9 -10
- package/src/parsers/manifest/dash/common/parse_periods.ts +80 -79
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +83 -75
- package/src/parsers/manifest/dash/common/parse_representations.ts +44 -63
- package/src/parsers/manifest/dash/node_parser_types.ts +30 -30
- package/src/parsers/manifest/dash/parsers_types.ts +3 -3
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -1
- package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +4 -4
- package/src/parsers/manifest/smooth/create_parser.ts +24 -21
- package/src/parsers/manifest/smooth/representation_index.ts +14 -14
- package/src/parsers/manifest/types.ts +28 -28
- package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +31 -33
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +15 -6
- package/src/parsers/manifest/utils/index_helpers.ts +2 -2
- package/src/parsers/manifest/utils/update_segment_timeline.ts +32 -21
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
- package/src/parsers/texttracks/webvtt/html/to_html.ts +2 -2
- package/src/parsers/texttracks/webvtt/parse_cue_block.ts +1 -1
- package/src/public_types.ts +5 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +2 -2
- package/src/transports/dash/image_pipelines.ts +4 -1
- package/src/transports/dash/init_segment_loader.ts +1 -1
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +7 -7
- package/src/transports/dash/segment_parser.ts +8 -1
- package/src/transports/dash/text_loader.ts +2 -2
- package/src/transports/dash/text_parser.ts +11 -1
- package/src/transports/local/segment_loader.ts +4 -4
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/metaplaylist/manifest_loader.ts +1 -1
- package/src/transports/metaplaylist/pipelines.ts +1 -1
- package/src/transports/smooth/pipelines.ts +29 -16
- package/src/transports/smooth/segment_loader.ts +8 -8
- package/src/transports/types.ts +59 -30
- package/src/transports/utils/call_custom_manifest_loader.ts +6 -6
- package/src/transports/utils/generate_manifest_loader.ts +1 -1
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/__tests__/flat_map.test.ts +12 -7
- package/src/utils/cancellable_sleep.ts +1 -1
- package/src/utils/cast_to_observable.ts +1 -2
- package/src/utils/deep_merge.ts +46 -0
- package/src/utils/reference.ts +116 -23
- package/src/utils/request/fetch.ts +17 -15
- package/src/utils/request/xhr.ts +11 -8
- package/src/utils/rx-from_cancellable_promise.ts +8 -4
- package/src/utils/task_canceller.ts +6 -4
- package/tsconfig.json +1 -2
- package/tsconfig.modules.json +1 -2
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.d.ts +0 -29
- package/dist/_esm5.processed/core/abr/get_estimate_from_buffer_levels.js +0 -67
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
- package/dist/_esm5.processed/core/eme/create_session.js +0 -126
- package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
- package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
- package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
- package/dist/_esm5.processed/core/eme/find_key_system.js +0 -243
- package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
- package/dist/_esm5.processed/core/eme/get_session.js +0 -68
- package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
- package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
- package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
- package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
- package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
- package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
- package/src/core/abr/get_estimate_from_buffer_levels.ts +0 -85
- package/src/core/eme/README.md +0 -26
- package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
- package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
- package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
- package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
- package/src/core/eme/clear_eme_session.ts +0 -62
- package/src/core/eme/create_session.ts +0 -187
- package/src/core/eme/dispose_eme.ts +0 -25
- package/src/core/eme/dispose_media_keys.ts +0 -46
- package/src/core/eme/eme_manager.ts +0 -387
- package/src/core/eme/get_media_keys.ts +0 -141
- package/src/core/eme/get_session.ts +0 -135
- package/src/core/eme/init_media_keys.ts +0 -106
- package/src/core/eme/set_server_certificate.ts +0 -115
- package/src/core/eme/utils/close_session.ts +0 -113
- package/src/core/eme/utils/init_data_store.ts +0 -234
- package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
- package/src/core/init/create_eme_manager.ts +0 -95
|
@@ -18,20 +18,19 @@ import { ICustomMediaKeySession } from "../../../compat";
|
|
|
18
18
|
import log from "../../../log";
|
|
19
19
|
import areArraysOfNumbersEqual from "../../../utils/are_arrays_of_numbers_equal";
|
|
20
20
|
import { assertInterface } from "../../../utils/assert";
|
|
21
|
-
import {
|
|
22
|
-
base64ToBytes,
|
|
23
|
-
bytesToBase64,
|
|
24
|
-
} from "../../../utils/base64";
|
|
25
|
-
import { concat } from "../../../utils/byte_parsing";
|
|
21
|
+
import { bytesToBase64 } from "../../../utils/base64";
|
|
26
22
|
import hashBuffer from "../../../utils/hash_buffer";
|
|
27
23
|
import isNonEmptyString from "../../../utils/is_non_empty_string";
|
|
28
24
|
import isNullOrUndefined from "../../../utils/is_null_or_undefined";
|
|
29
25
|
import {
|
|
30
|
-
|
|
26
|
+
IProcessedProtectionData,
|
|
31
27
|
IPersistentSessionInfo,
|
|
32
28
|
IPersistentSessionStorage,
|
|
33
29
|
} from "../types";
|
|
34
30
|
import areInitializationValuesCompatible from "./are_init_values_compatible";
|
|
31
|
+
import { IFormattedInitDataValue } from "./init_data_values_container";
|
|
32
|
+
import { areKeyIdsEqual } from "./key_id_comparison";
|
|
33
|
+
import SerializableBytes from "./serializable_bytes";
|
|
35
34
|
|
|
36
35
|
/**
|
|
37
36
|
* Throw if the given storage does not respect the right interface.
|
|
@@ -43,42 +42,6 @@ function checkStorage(storage : IPersistentSessionStorage) : void {
|
|
|
43
42
|
"licenseStorage");
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
/** Wrap initialization data and allow serialization of it into base64. */
|
|
47
|
-
class InitDataContainer {
|
|
48
|
-
/** The initData itself. */
|
|
49
|
-
public initData : Uint8Array;
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Create a new container, wrapping the initialization data given and allowing
|
|
53
|
-
* linearization into base64.
|
|
54
|
-
* @param {Uint8Array}
|
|
55
|
-
*/
|
|
56
|
-
constructor(initData : Uint8Array) {
|
|
57
|
-
this.initData = initData;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Convert it to base64.
|
|
62
|
-
* `toJSON` is specially interpreted by JavaScript engines to be able to rely
|
|
63
|
-
* on it when calling `JSON.stringify` on it or any of its parent objects:
|
|
64
|
-
* https://tc39.es/ecma262/#sec-serializejsonproperty
|
|
65
|
-
* @returns {string}
|
|
66
|
-
*/
|
|
67
|
-
toJSON() : string {
|
|
68
|
-
return bytesToBase64(this.initData);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Decode a base64 sequence representing an initialization data back to an
|
|
73
|
-
* Uint8Array.
|
|
74
|
-
* @param {string}
|
|
75
|
-
* @returns {Uint8Array}
|
|
76
|
-
*/
|
|
77
|
-
static decode(base64 : string) : Uint8Array {
|
|
78
|
-
return base64ToBytes(base64);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
45
|
/**
|
|
83
46
|
* Set representing persisted licenses. Depends on a simple local-
|
|
84
47
|
* storage implementation with a `save`/`load` synchronous interface
|
|
@@ -101,12 +64,13 @@ export default class PersistentSessionsStore {
|
|
|
101
64
|
this._entries = [];
|
|
102
65
|
this._storage = storage;
|
|
103
66
|
try {
|
|
104
|
-
|
|
105
|
-
if (!Array.isArray(
|
|
106
|
-
|
|
67
|
+
let entries = this._storage.load();
|
|
68
|
+
if (!Array.isArray(entries)) {
|
|
69
|
+
entries = [];
|
|
107
70
|
}
|
|
71
|
+
this._entries = entries;
|
|
108
72
|
} catch (e) {
|
|
109
|
-
log.warn("
|
|
73
|
+
log.warn("DRM-PSS: Could not get entries from license storage", e);
|
|
110
74
|
this.dispose();
|
|
111
75
|
}
|
|
112
76
|
}
|
|
@@ -130,11 +94,11 @@ export default class PersistentSessionsStore {
|
|
|
130
94
|
|
|
131
95
|
/**
|
|
132
96
|
* Retrieve an entry based on its initialization data.
|
|
133
|
-
* @param {
|
|
97
|
+
* @param {Object} initData
|
|
134
98
|
* @param {string|undefined} initDataType
|
|
135
99
|
* @returns {Object|null}
|
|
136
100
|
*/
|
|
137
|
-
public get(initData :
|
|
101
|
+
public get(initData : IProcessedProtectionData) : IPersistentSessionInfo | null {
|
|
138
102
|
const index = this._getIndex(initData);
|
|
139
103
|
return index === -1 ? null :
|
|
140
104
|
this._entries[index];
|
|
@@ -151,7 +115,9 @@ export default class PersistentSessionsStore {
|
|
|
151
115
|
* @param {string|undefined} initDataType
|
|
152
116
|
* @returns {*}
|
|
153
117
|
*/
|
|
154
|
-
public getAndReuse(
|
|
118
|
+
public getAndReuse(
|
|
119
|
+
initData : IProcessedProtectionData
|
|
120
|
+
) : IPersistentSessionInfo | null {
|
|
155
121
|
const index = this._getIndex(initData);
|
|
156
122
|
if (index === -1) {
|
|
157
123
|
return null;
|
|
@@ -168,11 +134,12 @@ export default class PersistentSessionsStore {
|
|
|
168
134
|
* @param {MediaKeySession} session
|
|
169
135
|
*/
|
|
170
136
|
public add(
|
|
171
|
-
initData :
|
|
137
|
+
initData : IProcessedProtectionData,
|
|
138
|
+
keyIds : Uint8Array[] | undefined,
|
|
172
139
|
session : MediaKeySession|ICustomMediaKeySession
|
|
173
140
|
) : void {
|
|
174
141
|
if (isNullOrUndefined(session) || !isNonEmptyString(session.sessionId)) {
|
|
175
|
-
log.warn("
|
|
142
|
+
log.warn("DRM-PSS: Invalid Persisten Session given.");
|
|
176
143
|
return;
|
|
177
144
|
}
|
|
178
145
|
const { sessionId } = session;
|
|
@@ -180,45 +147,60 @@ export default class PersistentSessionsStore {
|
|
|
180
147
|
if (currentEntry !== null && currentEntry.sessionId === sessionId) {
|
|
181
148
|
return;
|
|
182
149
|
} else if (currentEntry !== null) { // currentEntry has a different sessionId
|
|
183
|
-
this.delete(
|
|
150
|
+
this.delete(currentEntry.sessionId);
|
|
184
151
|
}
|
|
185
152
|
|
|
186
|
-
log.info("
|
|
153
|
+
log.info("DRM-PSS: Add new session", sessionId);
|
|
187
154
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
155
|
+
const storedValues = prepareValuesForStore(initData.values.getFormattedValues());
|
|
156
|
+
if (keyIds === undefined) {
|
|
157
|
+
this._entries.push({ version: 3,
|
|
158
|
+
sessionId,
|
|
159
|
+
values: storedValues,
|
|
160
|
+
initDataType: initData.type });
|
|
161
|
+
} else {
|
|
162
|
+
this._entries.push({ version: 4,
|
|
163
|
+
sessionId,
|
|
164
|
+
keyIds: keyIds.map((k) => new SerializableBytes(k)),
|
|
165
|
+
values: storedValues,
|
|
166
|
+
initDataType: initData.type });
|
|
167
|
+
}
|
|
192
168
|
this._save();
|
|
193
169
|
}
|
|
194
170
|
|
|
195
171
|
/**
|
|
196
|
-
* Delete stored MediaKeySession information based on its
|
|
197
|
-
* data.
|
|
172
|
+
* Delete stored MediaKeySession information based on its session id.
|
|
198
173
|
* @param {Uint8Array} initData
|
|
199
174
|
* @param {string|undefined} initDataType
|
|
200
175
|
*/
|
|
201
|
-
public delete(
|
|
202
|
-
|
|
176
|
+
public delete(sessionId : string) : void {
|
|
177
|
+
let index = -1;
|
|
178
|
+
for (let i = 0; i < this._entries.length; i++) {
|
|
179
|
+
const entry = this._entries[i];
|
|
180
|
+
if (entry.sessionId === sessionId) {
|
|
181
|
+
index = i;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
203
185
|
if (index === -1) {
|
|
204
|
-
log.warn("
|
|
186
|
+
log.warn("DRM-PSS: initData to delete not found.");
|
|
205
187
|
return;
|
|
206
188
|
}
|
|
207
189
|
const entry = this._entries[index];
|
|
208
|
-
log.warn("
|
|
190
|
+
log.warn("DRM-PSS: Delete session from store", entry.sessionId);
|
|
209
191
|
this._entries.splice(index, 1);
|
|
210
192
|
this._save();
|
|
211
193
|
}
|
|
212
194
|
|
|
213
195
|
public deleteOldSessions(sessionsToDelete : number) : void {
|
|
214
|
-
log.info(`
|
|
196
|
+
log.info(`DRM-PSS: Deleting last ${sessionsToDelete} sessions.`);
|
|
215
197
|
if (sessionsToDelete <= 0) {
|
|
216
198
|
return;
|
|
217
199
|
}
|
|
218
200
|
if (sessionsToDelete <= this._entries.length) {
|
|
219
201
|
this._entries.splice(0, sessionsToDelete);
|
|
220
202
|
} else {
|
|
221
|
-
log.warn("
|
|
203
|
+
log.warn("DRM-PSS: Asked to remove more information that it contains",
|
|
222
204
|
sessionsToDelete,
|
|
223
205
|
this._entries.length);
|
|
224
206
|
this._entries = [];
|
|
@@ -237,46 +219,85 @@ export default class PersistentSessionsStore {
|
|
|
237
219
|
/**
|
|
238
220
|
* Retrieve index of an entry.
|
|
239
221
|
* Returns `-1` if not found.
|
|
240
|
-
* @param {
|
|
241
|
-
* @param {string|undefined} initDataType
|
|
222
|
+
* @param {Object} initData
|
|
242
223
|
* @returns {number}
|
|
243
224
|
*/
|
|
244
|
-
private _getIndex(initData :
|
|
245
|
-
const formatted = this._formatValuesForStore(initData.values);
|
|
246
|
-
|
|
225
|
+
private _getIndex(initData : IProcessedProtectionData) : number {
|
|
247
226
|
// Older versions of the format include a concatenation of all
|
|
248
227
|
// initialization data and its hash.
|
|
249
|
-
|
|
250
|
-
|
|
228
|
+
// This is only computed lazily, the first time it is needed.
|
|
229
|
+
let lazyConcatenatedData : null | { initData : Uint8Array;
|
|
230
|
+
initDataHash : number; } = null;
|
|
231
|
+
function getConcatenatedInitDataInfo() {
|
|
232
|
+
if (lazyConcatenatedData === null) {
|
|
233
|
+
const concatInitData = initData.values.constructRequestData();
|
|
234
|
+
lazyConcatenatedData = { initData: concatInitData,
|
|
235
|
+
initDataHash: hashBuffer(concatInitData) };
|
|
236
|
+
}
|
|
237
|
+
return lazyConcatenatedData;
|
|
238
|
+
}
|
|
251
239
|
|
|
252
240
|
for (let i = 0; i < this._entries.length; i++) {
|
|
253
241
|
const entry = this._entries[i];
|
|
254
242
|
if (entry.initDataType === initData.type) {
|
|
255
243
|
switch (entry.version) {
|
|
244
|
+
case 4:
|
|
245
|
+
if (initData.keyIds !== undefined) {
|
|
246
|
+
const foundCompatible = initData.keyIds.every(keyId => {
|
|
247
|
+
const keyIdB64 = bytesToBase64(keyId);
|
|
248
|
+
for (const entryKid of entry.keyIds) {
|
|
249
|
+
if (typeof entryKid === "string") {
|
|
250
|
+
if (keyIdB64 === entryKid) {
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
} else if (areKeyIdsEqual(entryKid.initData,
|
|
254
|
+
keyId))
|
|
255
|
+
{
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return false;
|
|
260
|
+
});
|
|
261
|
+
if (foundCompatible) {
|
|
262
|
+
return i;
|
|
263
|
+
}
|
|
264
|
+
} else {
|
|
265
|
+
const formatted = initData.values.getFormattedValues();
|
|
266
|
+
if (areInitializationValuesCompatible(formatted, entry.values)) {
|
|
267
|
+
return i;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
break;
|
|
256
271
|
|
|
257
272
|
case 3:
|
|
273
|
+
const formatted = initData.values.getFormattedValues();
|
|
258
274
|
if (areInitializationValuesCompatible(formatted, entry.values)) {
|
|
259
275
|
return i;
|
|
260
276
|
}
|
|
261
277
|
break;
|
|
262
278
|
|
|
263
|
-
case 2:
|
|
264
|
-
|
|
279
|
+
case 2: {
|
|
280
|
+
const { initData: concatInitData,
|
|
281
|
+
initDataHash: concatHash } = getConcatenatedInitDataInfo();
|
|
282
|
+
if (entry.initDataHash === concatHash) {
|
|
265
283
|
try {
|
|
266
284
|
const decodedInitData : Uint8Array = typeof entry.initData === "string" ?
|
|
267
|
-
|
|
285
|
+
SerializableBytes.decode(entry.initData) :
|
|
268
286
|
entry.initData.initData;
|
|
269
287
|
if (areArraysOfNumbersEqual(decodedInitData, concatInitData)) {
|
|
270
288
|
return i;
|
|
271
289
|
}
|
|
272
290
|
} catch (e) {
|
|
273
|
-
log.warn("
|
|
291
|
+
log.warn("DRM-PSS: Could not decode initialization data.", e);
|
|
274
292
|
}
|
|
275
293
|
}
|
|
276
294
|
break;
|
|
295
|
+
}
|
|
277
296
|
|
|
278
|
-
case 1:
|
|
279
|
-
|
|
297
|
+
case 1: {
|
|
298
|
+
const { initData: concatInitData,
|
|
299
|
+
initDataHash: concatHash } = getConcatenatedInitDataInfo();
|
|
300
|
+
if (entry.initDataHash === concatHash) {
|
|
280
301
|
if (typeof entry.initData.length === "undefined") {
|
|
281
302
|
// If length is undefined, it has been linearized. We could still
|
|
282
303
|
// convert it back to an Uint8Array but this would necessitate some
|
|
@@ -288,11 +309,14 @@ export default class PersistentSessionsStore {
|
|
|
288
309
|
}
|
|
289
310
|
}
|
|
290
311
|
break;
|
|
312
|
+
}
|
|
291
313
|
|
|
292
|
-
default:
|
|
293
|
-
|
|
314
|
+
default: {
|
|
315
|
+
const { initDataHash: concatHash } = getConcatenatedInitDataInfo();
|
|
316
|
+
if (entry.initData === concatHash) {
|
|
294
317
|
return i;
|
|
295
318
|
}
|
|
319
|
+
}
|
|
296
320
|
}
|
|
297
321
|
}
|
|
298
322
|
}
|
|
@@ -306,31 +330,25 @@ export default class PersistentSessionsStore {
|
|
|
306
330
|
try {
|
|
307
331
|
this._storage.save(this._entries);
|
|
308
332
|
} catch (e) {
|
|
309
|
-
log.warn("
|
|
333
|
+
log.warn("DRM-PSS: Could not save licenses in localStorage");
|
|
310
334
|
}
|
|
311
335
|
}
|
|
336
|
+
}
|
|
312
337
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
b.systemId === undefined ? -1 :
|
|
330
|
-
a.systemId < b.systemId ? -1 :
|
|
331
|
-
1)
|
|
332
|
-
.map(({ systemId, data }) => ({ systemId,
|
|
333
|
-
data : new InitDataContainer(data),
|
|
334
|
-
hash : hashBuffer(data) }));
|
|
335
|
-
}
|
|
338
|
+
/**
|
|
339
|
+
* Format given initializationData's values so they are ready to be stored:
|
|
340
|
+
* - sort them by systemId, so they are faster to compare
|
|
341
|
+
* - add hash for each initialization data encountered.
|
|
342
|
+
* @param {Array.<Object>} initialValues
|
|
343
|
+
* @returns {Array.<Object>}
|
|
344
|
+
*/
|
|
345
|
+
function prepareValuesForStore(
|
|
346
|
+
initialValues : IFormattedInitDataValue[]
|
|
347
|
+
) : Array<{ systemId : string | undefined;
|
|
348
|
+
hash : number;
|
|
349
|
+
data : SerializableBytes; }> {
|
|
350
|
+
return initialValues
|
|
351
|
+
.map(({ systemId, data, hash }) => ({ systemId,
|
|
352
|
+
hash,
|
|
353
|
+
data : new SerializableBytes(data) }));
|
|
336
354
|
}
|
|
@@ -19,14 +19,17 @@ import {
|
|
|
19
19
|
bytesToBase64,
|
|
20
20
|
} from "../../../utils/base64";
|
|
21
21
|
|
|
22
|
-
/** Wrap
|
|
23
|
-
export default class
|
|
24
|
-
/**
|
|
22
|
+
/** Wrap byte-based data and allow serialization of it into base64. */
|
|
23
|
+
export default class SerializableBytes {
|
|
24
|
+
/**
|
|
25
|
+
* The data itself. Named `initData` for legacy reasons (cannot be changed
|
|
26
|
+
* because it has an impact on saved persistent session information.
|
|
27
|
+
*/
|
|
25
28
|
public initData : Uint8Array;
|
|
26
29
|
|
|
27
30
|
/**
|
|
28
|
-
* Create a new
|
|
29
|
-
*
|
|
31
|
+
* Create a new `SerializableBytes`, wrapping the initialization data
|
|
32
|
+
* given and allowing serialization into base64.
|
|
30
33
|
* @param {Uint8Array}
|
|
31
34
|
*/
|
|
32
35
|
constructor(initData : Uint8Array) {
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { ICustomMediaKeys } from "
|
|
18
|
-
import hashBuffer from "
|
|
17
|
+
import { ICustomMediaKeys } from "../../../compat";
|
|
18
|
+
import hashBuffer from "../../../utils/hash_buffer";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Keep track of server certificate which have been set for a MediaKeys.
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import PPromise from "pinkie";
|
|
18
17
|
import {
|
|
19
18
|
Observable,
|
|
20
19
|
} from "rxjs";
|
|
@@ -31,6 +30,7 @@ import {
|
|
|
31
30
|
ITransportPipelines,
|
|
32
31
|
} from "../../../transports";
|
|
33
32
|
import assert from "../../../utils/assert";
|
|
33
|
+
import PPromise from "../../../utils/promise";
|
|
34
34
|
import TaskCanceller from "../../../utils/task_canceller";
|
|
35
35
|
import errorSelector from "../utils/error_selector";
|
|
36
36
|
import {
|
|
@@ -38,10 +38,6 @@ import {
|
|
|
38
38
|
tryRequestPromiseWithBackoff,
|
|
39
39
|
} from "../utils/try_urls_with_backoff";
|
|
40
40
|
|
|
41
|
-
const { DEFAULT_MAX_MANIFEST_REQUEST_RETRY,
|
|
42
|
-
DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
|
|
43
|
-
INITIAL_BACKOFF_DELAY_BASE,
|
|
44
|
-
MAX_BACKOFF_DELAY_BASE } = config;
|
|
45
41
|
|
|
46
42
|
/** What will be sent once parsed. */
|
|
47
43
|
export interface IManifestFetcherParsedResult {
|
|
@@ -54,11 +50,11 @@ export interface IManifestFetcherParsedResult {
|
|
|
54
50
|
* The time (`performance.now()`) at which the request was started (at which
|
|
55
51
|
* the JavaScript call was done).
|
|
56
52
|
*/
|
|
57
|
-
sendingTime? : number;
|
|
53
|
+
sendingTime? : number | undefined;
|
|
58
54
|
/** The time (`performance.now()`) at which the request was fully received. */
|
|
59
|
-
receivedTime? : number;
|
|
55
|
+
receivedTime? : number | undefined;
|
|
60
56
|
/* The time taken to parse the Manifest through the corresponding parse function. */
|
|
61
|
-
parsingTime? : number;
|
|
57
|
+
parsingTime? : number | undefined;
|
|
62
58
|
}
|
|
63
59
|
|
|
64
60
|
/** Emitted when a fetching or parsing minor error happened. */
|
|
@@ -86,7 +82,7 @@ export interface IManifestFetcherParserOptions {
|
|
|
86
82
|
* If set, offset to add to `performance.now()` to obtain the current
|
|
87
83
|
* server's time.
|
|
88
84
|
*/
|
|
89
|
-
externalClockOffset? : number;
|
|
85
|
+
externalClockOffset? : number | undefined;
|
|
90
86
|
/** The previous value of the Manifest (when updating). */
|
|
91
87
|
previousManifest : Manifest | null;
|
|
92
88
|
/**
|
|
@@ -407,6 +403,10 @@ export default class ManifestFetcher {
|
|
|
407
403
|
* @returns {Object}
|
|
408
404
|
*/
|
|
409
405
|
private _getBackoffSetting(onRetry : (err : unknown) => void) : IBackoffSettings {
|
|
406
|
+
const { DEFAULT_MAX_MANIFEST_REQUEST_RETRY,
|
|
407
|
+
DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
|
|
408
|
+
INITIAL_BACKOFF_DELAY_BASE,
|
|
409
|
+
MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
|
|
410
410
|
const { lowLatencyMode,
|
|
411
411
|
maxRetryRegular : ogRegular,
|
|
412
412
|
maxRetryOffline : ogOffline } = this._settings;
|
|
@@ -53,10 +53,6 @@ import { IBufferType } from "../../segment_buffers";
|
|
|
53
53
|
import errorSelector from "../utils/error_selector";
|
|
54
54
|
import { tryURLsWithBackoff } from "../utils/try_urls_with_backoff";
|
|
55
55
|
|
|
56
|
-
const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
|
|
57
|
-
DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
|
|
58
|
-
INITIAL_BACKOFF_DELAY_BASE,
|
|
59
|
-
MAX_BACKOFF_DELAY_BASE } = config;
|
|
60
56
|
|
|
61
57
|
const generateRequestID = idGenerator();
|
|
62
58
|
|
|
@@ -119,7 +115,8 @@ export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
|
|
|
119
115
|
/**
|
|
120
116
|
* If the request succeeded, set to the corresponding
|
|
121
117
|
* `IChunkCompleteInformation` object.
|
|
122
|
-
*
|
|
118
|
+
* For any other completion cases: if the request either failed, was
|
|
119
|
+
* cancelled or just if no request was needed, set to `null`.
|
|
123
120
|
*
|
|
124
121
|
* Stays to `undefined` when the request is still pending.
|
|
125
122
|
*/
|
|
@@ -216,6 +213,8 @@ export default function createSegmentFetcher<TLoadedFormat, TSegmentDataType>(
|
|
|
216
213
|
if (res.resultType !== "segment-created") {
|
|
217
214
|
requestInfo = res.resultData;
|
|
218
215
|
sendNetworkMetricsIfAvailable();
|
|
216
|
+
} else {
|
|
217
|
+
requestInfo = null;
|
|
219
218
|
}
|
|
220
219
|
|
|
221
220
|
if (!canceller.isUsed) {
|
|
@@ -439,10 +438,14 @@ export function getSegmentFetcherOptions(
|
|
|
439
438
|
bufferType : string,
|
|
440
439
|
{ maxRetryRegular,
|
|
441
440
|
maxRetryOffline,
|
|
442
|
-
lowLatencyMode } : { maxRetryRegular? : number;
|
|
443
|
-
maxRetryOffline? : number;
|
|
441
|
+
lowLatencyMode } : { maxRetryRegular? : number | undefined;
|
|
442
|
+
maxRetryOffline? : number | undefined;
|
|
444
443
|
lowLatencyMode : boolean; }
|
|
445
444
|
) : ISegmentFetcherOptions {
|
|
445
|
+
const { DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
|
|
446
|
+
DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
|
|
447
|
+
INITIAL_BACKOFF_DELAY_BASE,
|
|
448
|
+
MAX_BACKOFF_DELAY_BASE } = config.getCurrent();
|
|
446
449
|
return { maxRetryRegular: bufferType === "image" ? 0 :
|
|
447
450
|
maxRetryRegular ?? DEFAULT_MAX_REQUESTS_RETRY_ON_ERROR,
|
|
448
451
|
maxRetryOffline: maxRetryOffline ?? DEFAULT_MAX_REQUESTS_RETRY_ON_OFFLINE,
|
|
@@ -30,8 +30,6 @@ import createSegmentFetcher, {
|
|
|
30
30
|
ISegmentFetcherEvent,
|
|
31
31
|
} from "./segment_fetcher";
|
|
32
32
|
|
|
33
|
-
const { MIN_CANCELABLE_PRIORITY,
|
|
34
|
-
MAX_HIGH_PRIORITY_LEVEL } = config;
|
|
35
33
|
|
|
36
34
|
/**
|
|
37
35
|
* Interact with the transport pipelines to download segments with the right
|
|
@@ -91,6 +89,8 @@ export default class SegmentFetcherCreator {
|
|
|
91
89
|
transport : ITransportPipelines,
|
|
92
90
|
options : ISegmentFetcherCreatorBackoffOptions
|
|
93
91
|
) {
|
|
92
|
+
const { MIN_CANCELABLE_PRIORITY,
|
|
93
|
+
MAX_HIGH_PRIORITY_LEVEL } = config.getCurrent();
|
|
94
94
|
this._transport = transport;
|
|
95
95
|
this._prioritizer = new ObservablePrioritizer({
|
|
96
96
|
prioritySteps: { high: MAX_HIGH_PRIORITY_LEVEL,
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import PPromise from "pinkie";
|
|
18
17
|
import { isOffline } from "../../../compat";
|
|
19
18
|
import {
|
|
20
19
|
CustomLoaderError,
|
|
@@ -25,6 +24,7 @@ import {
|
|
|
25
24
|
import log from "../../../log";
|
|
26
25
|
import cancellableSleep from "../../../utils/cancellable_sleep";
|
|
27
26
|
import getFuzzedDelay from "../../../utils/get_fuzzed_delay";
|
|
27
|
+
import PPromise from "../../../utils/promise";
|
|
28
28
|
import TaskCanceller, {
|
|
29
29
|
CancellationSignal,
|
|
30
30
|
} from "../../../utils/task_canceller";
|
|
Binary file
|
|
@@ -18,7 +18,6 @@ import config from "../../config";
|
|
|
18
18
|
import log from "../../log";
|
|
19
19
|
import Manifest from "../../manifest";
|
|
20
20
|
|
|
21
|
-
const { DEFAULT_LIVE_GAP } = config;
|
|
22
21
|
|
|
23
22
|
export interface IInitialTimeOptions { position? : number;
|
|
24
23
|
wallClockTime? : number;
|
|
@@ -90,6 +89,8 @@ export default function getInitialTime(
|
|
|
90
89
|
clockOffset } = manifest;
|
|
91
90
|
const maximumPosition = manifest.getMaximumPosition();
|
|
92
91
|
let liveTime : number;
|
|
92
|
+
const { DEFAULT_LIVE_GAP } = config.getCurrent();
|
|
93
|
+
|
|
93
94
|
if (clockOffset == null) {
|
|
94
95
|
log.info("Init: no clock offset found for a live content, " +
|
|
95
96
|
"starting close to maximum available position");
|
|
@@ -39,16 +39,22 @@ import log from "../../log";
|
|
|
39
39
|
import deferSubscriptions from "../../utils/defer_subscriptions";
|
|
40
40
|
import { IReadOnlySharedReference } from "../../utils/reference";
|
|
41
41
|
import { PlaybackObserver } from "../api";
|
|
42
|
-
import { IKeySystemOption } from "../
|
|
43
|
-
import createEMEManager from "./create_eme_manager";
|
|
42
|
+
import { IKeySystemOption } from "../decrypt";
|
|
44
43
|
import emitLoadedEvent from "./emit_loaded_event";
|
|
45
44
|
import { IInitialTimeOptions } from "./get_initial_time";
|
|
46
45
|
import initialSeekAndPlay from "./initial_seek_and_play";
|
|
46
|
+
import linkDrmAndContent from "./link_drm_and_content";
|
|
47
47
|
import StallAvoider from "./stall_avoider";
|
|
48
48
|
import throwOnMediaError from "./throw_on_media_error";
|
|
49
49
|
import { IDirectfileEvent } from "./types";
|
|
50
50
|
import updatePlaybackRate from "./update_playback_rate";
|
|
51
51
|
|
|
52
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
53
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
54
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
55
|
+
// This is why we're disabling the eslint rule.
|
|
56
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
57
|
+
|
|
52
58
|
/**
|
|
53
59
|
* calculate initial time as a position in seconds.
|
|
54
60
|
* @param {HTMLMediaElement} mediaElement
|
|
@@ -100,8 +106,8 @@ export interface IDirectFileOptions { autoPlay : boolean;
|
|
|
100
106
|
mediaElement : HTMLMediaElement;
|
|
101
107
|
playbackObserver : PlaybackObserver;
|
|
102
108
|
speed : IReadOnlySharedReference<number>;
|
|
103
|
-
startAt? : IInitialTimeOptions;
|
|
104
|
-
url? : string; }
|
|
109
|
+
startAt? : IInitialTimeOptions | undefined;
|
|
110
|
+
url? : string | undefined; }
|
|
105
111
|
|
|
106
112
|
/**
|
|
107
113
|
* Launch a content in "Directfile mode".
|
|
@@ -136,10 +142,11 @@ export default function initializeDirectfileContent({
|
|
|
136
142
|
startTime: initialTime,
|
|
137
143
|
mustAutoPlay: autoPlay });
|
|
138
144
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
145
|
+
/** Initialize decryption capabilities and the HTMLMediaElement's src attribute. */
|
|
146
|
+
const drmEvents$ = linkDrmAndContent(mediaElement,
|
|
147
|
+
keySystems,
|
|
148
|
+
EMPTY,
|
|
149
|
+
linkURL$).pipe(
|
|
143
150
|
deferSubscriptions(),
|
|
144
151
|
share()
|
|
145
152
|
);
|
|
@@ -154,11 +161,6 @@ export default function initializeDirectfileContent({
|
|
|
154
161
|
// little longer while the buffer is empty.
|
|
155
162
|
const playbackRate$ =
|
|
156
163
|
updatePlaybackRate(mediaElement, speed, observation$)
|
|
157
|
-
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
158
|
-
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
159
|
-
// leading to linter issues, as it forbids the usage of `any`.
|
|
160
|
-
// This is why we're disabling the eslint rule.
|
|
161
|
-
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
162
164
|
.pipe(ignoreElements());
|
|
163
165
|
|
|
164
166
|
/**
|
|
@@ -172,14 +174,9 @@ export default function initializeDirectfileContent({
|
|
|
172
174
|
* media can begin playback.
|
|
173
175
|
* Also emits warning events if issues arise when doing so.
|
|
174
176
|
*/
|
|
175
|
-
const loadingEvts$ =
|
|
176
|
-
filter(
|
|
177
|
-
|
|
178
|
-
evt.value.canAttachMediaKeys.setValue(true);
|
|
179
|
-
return true;
|
|
180
|
-
}
|
|
181
|
-
return evt.type === "eme-disabled" || evt.type === "attached-media-keys";
|
|
182
|
-
}),
|
|
177
|
+
const loadingEvts$ = drmEvents$.pipe(
|
|
178
|
+
filter((evt) => evt.type === "decryption-ready" ||
|
|
179
|
+
evt.type === "decryption-disabled"),
|
|
183
180
|
take(1),
|
|
184
181
|
mergeMap(() => seekAndPlay$),
|
|
185
182
|
switchMap((evt) => {
|
|
@@ -190,7 +187,7 @@ export default function initializeDirectfileContent({
|
|
|
190
187
|
}));
|
|
191
188
|
|
|
192
189
|
return observableMerge(loadingEvts$,
|
|
193
|
-
|
|
190
|
+
drmEvents$.pipe(ignoreElements()),
|
|
194
191
|
mediaError$,
|
|
195
192
|
playbackRate$,
|
|
196
193
|
stallAvoider$);
|