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
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
filter,
|
|
19
|
-
mapTo,
|
|
20
|
-
mergeMap,
|
|
21
|
-
Observable,
|
|
22
|
-
of as observableOf,
|
|
23
|
-
startWith,
|
|
24
|
-
take,
|
|
25
|
-
} from "rxjs";
|
|
26
|
-
import log from "../../log";
|
|
27
|
-
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
28
|
-
import createSharedReference from "../../utils/reference";
|
|
29
|
-
import attachMediaKeys, {
|
|
30
|
-
disableMediaKeys,
|
|
31
|
-
} from "./attach_media_keys";
|
|
32
|
-
import getDrmSystemId from "./get_drm_system_id";
|
|
33
|
-
import getMediaKeysInfos from "./get_media_keys";
|
|
34
|
-
import {
|
|
35
|
-
IAttachedMediaKeysEvent,
|
|
36
|
-
ICreatedMediaKeysEvent,
|
|
37
|
-
IKeySystemOption,
|
|
38
|
-
} from "./types";
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Get media keys infos from key system configs then attach media keys to media element.
|
|
42
|
-
* @param {HTMLMediaElement} mediaElement
|
|
43
|
-
* @param {Array.<Object>} keySystemsConfigs
|
|
44
|
-
* @returns {Observable}
|
|
45
|
-
*/
|
|
46
|
-
export default function initMediaKeys(
|
|
47
|
-
mediaElement : HTMLMediaElement,
|
|
48
|
-
keySystemsConfigs: IKeySystemOption[]
|
|
49
|
-
): Observable<ICreatedMediaKeysEvent|IAttachedMediaKeysEvent> {
|
|
50
|
-
return getMediaKeysInfos(mediaElement, keySystemsConfigs)
|
|
51
|
-
.pipe(mergeMap(({ mediaKeys, mediaKeySystemAccess, stores, options }) => {
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* String identifying the key system, allowing the rest of the code to
|
|
55
|
-
* only advertise the required initialization data for license requests.
|
|
56
|
-
*
|
|
57
|
-
* Note that we only set this value if retro-compatibility to older
|
|
58
|
-
* persistent logic in the RxPlayer is not important, as the optimizations
|
|
59
|
-
* this property unlocks can break the loading of MediaKeySessions
|
|
60
|
-
* persisted in older RxPlayer's versions.
|
|
61
|
-
*/
|
|
62
|
-
let initializationDataSystemId : string | undefined;
|
|
63
|
-
if (isNullOrUndefined(options.licenseStorage) ||
|
|
64
|
-
options.licenseStorage.disableRetroCompatibility === true)
|
|
65
|
-
{
|
|
66
|
-
initializationDataSystemId = getDrmSystemId(mediaKeySystemAccess.keySystem);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const canAttachMediaKeys = createSharedReference(false);
|
|
70
|
-
const shouldDisableOldMediaKeys =
|
|
71
|
-
mediaElement.mediaKeys !== null &&
|
|
72
|
-
mediaElement.mediaKeys !== undefined &&
|
|
73
|
-
mediaKeys !== mediaElement.mediaKeys;
|
|
74
|
-
|
|
75
|
-
let disableOldMediaKeys$ : Observable<unknown> = observableOf(null);
|
|
76
|
-
if (shouldDisableOldMediaKeys) {
|
|
77
|
-
log.debug("EME: Disabling old MediaKeys");
|
|
78
|
-
disableOldMediaKeys$ = disableMediaKeys(mediaElement);
|
|
79
|
-
}
|
|
80
|
-
return disableOldMediaKeys$.pipe(
|
|
81
|
-
mergeMap(() => {
|
|
82
|
-
log.debug("EME: Attaching current MediaKeys");
|
|
83
|
-
return canAttachMediaKeys.asObservable().pipe(
|
|
84
|
-
filter(canAttach => canAttach),
|
|
85
|
-
mergeMap(() => {
|
|
86
|
-
const stateToAttatch = { loadedSessionsStore: stores.loadedSessionsStore,
|
|
87
|
-
mediaKeySystemAccess,
|
|
88
|
-
mediaKeys,
|
|
89
|
-
keySystemOptions: options };
|
|
90
|
-
return attachMediaKeys(mediaElement, stateToAttatch);
|
|
91
|
-
}),
|
|
92
|
-
take(1),
|
|
93
|
-
mapTo({ type: "attached-media-keys" as const,
|
|
94
|
-
value: { mediaKeySystemAccess, mediaKeys, stores, options } }),
|
|
95
|
-
startWith({ type: "created-media-keys" as const,
|
|
96
|
-
value: { mediaKeySystemAccess,
|
|
97
|
-
initializationDataSystemId,
|
|
98
|
-
mediaKeys,
|
|
99
|
-
stores,
|
|
100
|
-
options,
|
|
101
|
-
canAttachMediaKeys } })
|
|
102
|
-
);
|
|
103
|
-
})
|
|
104
|
-
);
|
|
105
|
-
}));
|
|
106
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
defer as observableDefer,
|
|
20
|
-
EMPTY,
|
|
21
|
-
ignoreElements,
|
|
22
|
-
tap,
|
|
23
|
-
Observable,
|
|
24
|
-
of as observableOf,
|
|
25
|
-
} from "rxjs";
|
|
26
|
-
import { ICustomMediaKeys } from "../../compat";
|
|
27
|
-
import { EncryptedMediaError } from "../../errors";
|
|
28
|
-
import log from "../../log";
|
|
29
|
-
import castToObservable from "../../utils/cast_to_observable";
|
|
30
|
-
import tryCatch from "../../utils/rx-try_catch";
|
|
31
|
-
import ServerCertificateStore from "./server_certificate_store";
|
|
32
|
-
import { IEMEWarningEvent } from "./types";
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Call the setServerCertificate API with the given certificate.
|
|
36
|
-
* Complete observable on success, throw when failed.
|
|
37
|
-
*
|
|
38
|
-
* TODO Handle returned value?
|
|
39
|
-
* From the spec:
|
|
40
|
-
* - setServerCertificate resolves with true if everything worked
|
|
41
|
-
* - it resolves with false if the CDM does not support server
|
|
42
|
-
* certificates.
|
|
43
|
-
*
|
|
44
|
-
* @param {MediaKeys} mediaKeys
|
|
45
|
-
* @param {ArrayBuffer} serverCertificate
|
|
46
|
-
* @returns {Observable}
|
|
47
|
-
*/
|
|
48
|
-
function setServerCertificate(
|
|
49
|
-
mediaKeys : ICustomMediaKeys|MediaKeys,
|
|
50
|
-
serverCertificate : BufferSource
|
|
51
|
-
) : Observable<boolean> {
|
|
52
|
-
return observableDefer(() => {
|
|
53
|
-
return tryCatch<void, boolean>(() =>
|
|
54
|
-
castToObservable(
|
|
55
|
-
(mediaKeys as MediaKeys).setServerCertificate(serverCertificate)
|
|
56
|
-
)
|
|
57
|
-
, undefined).pipe(catchError((error: unknown) => {
|
|
58
|
-
log.warn("EME: mediaKeys.setServerCertificate returned an error", error);
|
|
59
|
-
const reason = error instanceof Error ? error.toString() :
|
|
60
|
-
"`setServerCertificate` error";
|
|
61
|
-
throw new EncryptedMediaError("LICENSE_SERVER_CERTIFICATE_ERROR", reason);
|
|
62
|
-
}));
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Call the setCertificate API. If it fails just emit the error as warning
|
|
68
|
-
* and complete.
|
|
69
|
-
* @param {MediaKeys} mediaKeys
|
|
70
|
-
* @param {ArrayBuffer} serverCertificate
|
|
71
|
-
* @returns {Observable}
|
|
72
|
-
*/
|
|
73
|
-
export default function trySettingServerCertificate(
|
|
74
|
-
mediaKeys : ICustomMediaKeys|MediaKeys,
|
|
75
|
-
serverCertificate : BufferSource
|
|
76
|
-
) : Observable<IEMEWarningEvent> {
|
|
77
|
-
return observableDefer(() => {
|
|
78
|
-
if (typeof mediaKeys.setServerCertificate !== "function") {
|
|
79
|
-
log.warn("EME: Could not set the server certificate." +
|
|
80
|
-
" mediaKeys.setServerCertificate is not a function");
|
|
81
|
-
return EMPTY;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (ServerCertificateStore.hasOne(mediaKeys) === true) {
|
|
85
|
-
log.info("EME: The MediaKeys already has a server certificate, skipping...");
|
|
86
|
-
return EMPTY;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
log.info("EME: Setting server certificate on the MediaKeys");
|
|
90
|
-
// Because of browser errors, or a user action that can lead to interrupting
|
|
91
|
-
// server certificate setting, we might be left in a status where we don't
|
|
92
|
-
// know if we attached the server certificate or not.
|
|
93
|
-
// Calling `prepare` allow to invalidate temporarily that status.
|
|
94
|
-
ServerCertificateStore.prepare(mediaKeys);
|
|
95
|
-
return setServerCertificate(mediaKeys, serverCertificate).pipe(
|
|
96
|
-
tap(() => { ServerCertificateStore.set(mediaKeys, serverCertificate); }),
|
|
97
|
-
|
|
98
|
-
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
99
|
-
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
100
|
-
// leading to linter issues, as it forbids the usage of `any`.
|
|
101
|
-
// This is why we're disabling the eslint rule.
|
|
102
|
-
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
103
|
-
ignoreElements(),
|
|
104
|
-
catchError(error => observableOf({
|
|
105
|
-
type: "warning" as const,
|
|
106
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
107
|
-
value: error,
|
|
108
|
-
})));
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export {
|
|
113
|
-
trySettingServerCertificate,
|
|
114
|
-
setServerCertificate,
|
|
115
|
-
};
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
mergeMap,
|
|
20
|
-
Observable,
|
|
21
|
-
of as observableOf,
|
|
22
|
-
take,
|
|
23
|
-
tap,
|
|
24
|
-
timer,
|
|
25
|
-
race as observableRace,
|
|
26
|
-
} from "rxjs";
|
|
27
|
-
import {
|
|
28
|
-
closeSession,
|
|
29
|
-
ICustomMediaKeySession,
|
|
30
|
-
} from "../../../compat";
|
|
31
|
-
import { onKeyMessage$, onKeyStatusesChange$ } from "../../../compat/event_listeners";
|
|
32
|
-
import config from "../../../config";
|
|
33
|
-
import log from "../../../log";
|
|
34
|
-
|
|
35
|
-
const { EME_SESSION_CLOSING_MAX_RETRY,
|
|
36
|
-
EME_SESSION_CLOSING_INITIAL_DELAY,
|
|
37
|
-
EME_SESSION_CLOSING_MAX_DELAY } = config;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Close a MediaKeySession with multiple attempts if needed and do not throw if
|
|
41
|
-
* this action throws an error.
|
|
42
|
-
* Emits then complete when done.
|
|
43
|
-
* @param {MediaKeySession} mediaKeySession
|
|
44
|
-
* @returns {Observable}
|
|
45
|
-
*/
|
|
46
|
-
export default function safelyCloseMediaKeySession(
|
|
47
|
-
mediaKeySession : MediaKeySession | ICustomMediaKeySession
|
|
48
|
-
) : Observable<unknown> {
|
|
49
|
-
return recursivelyTryToCloseMediaKeySession(0);
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Perform a new attempt at closing the MediaKeySession.
|
|
53
|
-
* If this operation fails due to a not-"callable" (an EME term)
|
|
54
|
-
* MediaKeySession, retry based on either a timer or on MediaKeySession
|
|
55
|
-
* events, whichever comes first.
|
|
56
|
-
* Emits then complete when done.
|
|
57
|
-
* @param {number} retryNb - The attempt number starting at 0.
|
|
58
|
-
* @returns {Observable}
|
|
59
|
-
*/
|
|
60
|
-
function recursivelyTryToCloseMediaKeySession(
|
|
61
|
-
retryNb : number
|
|
62
|
-
) : Observable<unknown> {
|
|
63
|
-
log.debug("EME: Trying to close a MediaKeySession",
|
|
64
|
-
mediaKeySession.sessionId,
|
|
65
|
-
retryNb);
|
|
66
|
-
return closeSession(mediaKeySession).pipe(
|
|
67
|
-
tap(() => { log.debug("EME: Succeeded to close MediaKeySession"); }),
|
|
68
|
-
catchError((err : unknown) => {
|
|
69
|
-
// Unitialized MediaKeySession may not close properly until their
|
|
70
|
-
// corresponding `generateRequest` or `load` call are handled by the
|
|
71
|
-
// browser.
|
|
72
|
-
// In that case the EME specification tells us that the browser is
|
|
73
|
-
// supposed to reject the `close` call with an InvalidStateError.
|
|
74
|
-
if (!(err instanceof Error) || err.name !== "InvalidStateError" ||
|
|
75
|
-
mediaKeySession.sessionId !== "")
|
|
76
|
-
{
|
|
77
|
-
return failToCloseSession(err);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// We will retry either:
|
|
81
|
-
// - when an event indicates that the MediaKeySession is
|
|
82
|
-
// initialized (`callable` is the proper EME term here)
|
|
83
|
-
// - after a delay, raising exponentially
|
|
84
|
-
const nextRetryNb = retryNb + 1;
|
|
85
|
-
if (nextRetryNb > EME_SESSION_CLOSING_MAX_RETRY) {
|
|
86
|
-
return failToCloseSession(err);
|
|
87
|
-
}
|
|
88
|
-
const delay = Math.min(Math.pow(2, retryNb) * EME_SESSION_CLOSING_INITIAL_DELAY,
|
|
89
|
-
EME_SESSION_CLOSING_MAX_DELAY);
|
|
90
|
-
log.warn("EME: attempt to close a mediaKeySession failed, " +
|
|
91
|
-
"scheduling retry...", delay);
|
|
92
|
-
return observableRace([timer(delay),
|
|
93
|
-
onKeyStatusesChange$(mediaKeySession),
|
|
94
|
-
onKeyMessage$(mediaKeySession)])
|
|
95
|
-
.pipe(
|
|
96
|
-
take(1),
|
|
97
|
-
mergeMap(() => recursivelyTryToCloseMediaKeySession(nextRetryNb)));
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Log error anouncing that we could not close the MediaKeySession and emits
|
|
103
|
-
* then complete through Observable.
|
|
104
|
-
* TODO Emit warning?
|
|
105
|
-
* @returns {Observable}
|
|
106
|
-
*/
|
|
107
|
-
function failToCloseSession(err : unknown) : Observable<null> {
|
|
108
|
-
log.error("EME: Could not close MediaKeySession: " +
|
|
109
|
-
(err instanceof Error ? err.toString() :
|
|
110
|
-
"Unknown error"));
|
|
111
|
-
return observableOf(null);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import hashBuffer from "../../../utils/hash_buffer";
|
|
18
|
-
import { IInitializationDataInfo } from "../types";
|
|
19
|
-
import areInitializationValuesCompatible from "./are_init_values_compatible";
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Store a unique value associated to an initData and initDataType.
|
|
23
|
-
* @class InitDataStore
|
|
24
|
-
*/
|
|
25
|
-
export default class InitDataStore<T> {
|
|
26
|
-
/**
|
|
27
|
-
* Contains every stored elements alongside the corresponding initialization
|
|
28
|
-
* data, in storage chronological order (from first stored to last stored).
|
|
29
|
-
*/
|
|
30
|
-
private _storage : Array<{
|
|
31
|
-
/** Initialization data type. */
|
|
32
|
-
type : string | undefined;
|
|
33
|
-
/** Every initialization data for that type. */
|
|
34
|
-
values: Array<{
|
|
35
|
-
/** Hex encoded system id, which identifies the key system. */
|
|
36
|
-
systemId : string | undefined;
|
|
37
|
-
/** The initialization data itself for that type and systemId. */
|
|
38
|
-
data: Uint8Array;
|
|
39
|
-
/**
|
|
40
|
-
* A hash of the `data` property, done with the `hashBuffer` util, for
|
|
41
|
-
* faster comparison.
|
|
42
|
-
*/
|
|
43
|
-
hash : number;
|
|
44
|
-
}>;
|
|
45
|
-
payload : T;
|
|
46
|
-
}>;
|
|
47
|
-
|
|
48
|
-
/** Construct a new InitDataStore. */
|
|
49
|
-
constructor() {
|
|
50
|
-
this._storage = [];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Returns all stored value, in the order in which they have been stored.
|
|
55
|
-
* Note: it is possible to move a value to the end of this array by calling
|
|
56
|
-
* the `getAndReuse` method.
|
|
57
|
-
* @returns {Array}
|
|
58
|
-
*/
|
|
59
|
-
public getAll() : T[] {
|
|
60
|
-
return this._storage.map(item => item.payload);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Returns the number of stored values.
|
|
65
|
-
* @returns {number}
|
|
66
|
-
*/
|
|
67
|
-
public getLength() : number {
|
|
68
|
-
return this._storage.length;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Returns `true` if no initialization data is stored yet in this
|
|
73
|
-
* InitDataStore.
|
|
74
|
-
* Returns `false` otherwise.
|
|
75
|
-
* @returns {boolean}
|
|
76
|
-
*/
|
|
77
|
-
public isEmpty() : boolean {
|
|
78
|
-
return this._storage.length === 0;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Returns the element associated with the given initData and initDataType.
|
|
83
|
-
* Returns `undefined` if not found.
|
|
84
|
-
* @param {Uint8Array} initData
|
|
85
|
-
* @param {string|undefined} initDataType
|
|
86
|
-
* @returns {*}
|
|
87
|
-
*/
|
|
88
|
-
public get(initializationData : IInitializationDataInfo) : T | undefined {
|
|
89
|
-
const index = this._findIndex(initializationData);
|
|
90
|
-
return index >= 0 ? this._storage[index].payload :
|
|
91
|
-
undefined;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Like `get`, but also move the corresponding value at the end of the store
|
|
96
|
-
* (as returned by `getAll`) if found.
|
|
97
|
-
* This can be used for example to tell when a previously-stored value is
|
|
98
|
-
* re-used to then be able to implement a caching replacement algorithm based
|
|
99
|
-
* on the least-recently-used values by just evicting the first values
|
|
100
|
-
* returned by `getAll`.
|
|
101
|
-
* @param {Uint8Array} initData
|
|
102
|
-
* @param {string|undefined} initDataType
|
|
103
|
-
* @returns {*}
|
|
104
|
-
*/
|
|
105
|
-
public getAndReuse(
|
|
106
|
-
initializationData : IInitializationDataInfo
|
|
107
|
-
) : T | undefined {
|
|
108
|
-
const index = this._findIndex(initializationData);
|
|
109
|
-
if (index === -1) {
|
|
110
|
-
return undefined;
|
|
111
|
-
}
|
|
112
|
-
const item = this._storage.splice(index, 1)[0];
|
|
113
|
-
this._storage.push(item);
|
|
114
|
-
return item.payload;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Add to the store a value linked to the corresponding initData and
|
|
119
|
-
* initDataType.
|
|
120
|
-
* If a value was already stored linked to those, replace it.
|
|
121
|
-
* @param {Object} initializationData
|
|
122
|
-
* @param {*} payload
|
|
123
|
-
*/
|
|
124
|
-
public store(
|
|
125
|
-
initializationData : IInitializationDataInfo,
|
|
126
|
-
payload : T
|
|
127
|
-
) : void {
|
|
128
|
-
const indexOf = this._findIndex(initializationData);
|
|
129
|
-
if (indexOf >= 0) {
|
|
130
|
-
// this._storage contains the stored value in the same order they have
|
|
131
|
-
// been put. So here we want to remove the previous element and re-push
|
|
132
|
-
// it to the end.
|
|
133
|
-
this._storage.splice(indexOf, 1);
|
|
134
|
-
}
|
|
135
|
-
const values = this._formatValuesForStore(initializationData.values);
|
|
136
|
-
this._storage.push({ type: initializationData.type,
|
|
137
|
-
values,
|
|
138
|
-
payload });
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Add to the store a value linked to the corresponding initData and
|
|
143
|
-
* initDataType.
|
|
144
|
-
* If a value linked to those was already stored, do nothing and returns
|
|
145
|
-
* `false`.
|
|
146
|
-
* If not, add the value and return `true`.
|
|
147
|
-
*
|
|
148
|
-
* This can be used as a more performant version of doing both a `get` call -
|
|
149
|
-
* to see if a value is stored linked to that data - and then if not doing a
|
|
150
|
-
* store. `storeIfNone` is more performant as it will only perform hashing
|
|
151
|
-
* and a look-up a single time.
|
|
152
|
-
* @param {Object} initializationData
|
|
153
|
-
* @param {*} payload
|
|
154
|
-
* @returns {boolean}
|
|
155
|
-
*/
|
|
156
|
-
public storeIfNone(
|
|
157
|
-
initializationData : IInitializationDataInfo,
|
|
158
|
-
payload : T
|
|
159
|
-
) : boolean {
|
|
160
|
-
const indexOf = this._findIndex(initializationData);
|
|
161
|
-
if (indexOf >= 0) {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
const values = this._formatValuesForStore(initializationData.values);
|
|
165
|
-
this._storage.push({ type: initializationData.type,
|
|
166
|
-
values,
|
|
167
|
-
payload });
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Remove an initDataType and initData combination from this store.
|
|
173
|
-
* Returns the associated value if it has been found, `undefined` otherwise.
|
|
174
|
-
* @param {Uint8Array} initData
|
|
175
|
-
* @param {string|undefined} initDataType
|
|
176
|
-
* @returns {*}
|
|
177
|
-
*/
|
|
178
|
-
public remove(initializationData : IInitializationDataInfo) : T | undefined {
|
|
179
|
-
const indexOf = this._findIndex(initializationData);
|
|
180
|
-
if (indexOf === -1) {
|
|
181
|
-
return undefined;
|
|
182
|
-
}
|
|
183
|
-
return this._storage.splice(indexOf, 1)[0].payload;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Find the index of the corresponding initialization data in `this._storage`.
|
|
188
|
-
* Returns `-1` if not found.
|
|
189
|
-
* @param {Object} initializationData
|
|
190
|
-
* @returns {boolean}
|
|
191
|
-
*/
|
|
192
|
-
private _findIndex(
|
|
193
|
-
initializationData : IInitializationDataInfo
|
|
194
|
-
) : number {
|
|
195
|
-
const formattedVals = this._formatValuesForStore(initializationData.values);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
// Begin by the last element as we usually re-encounter the last stored
|
|
199
|
-
// initData sooner than the first one.
|
|
200
|
-
for (let i = this._storage.length - 1; i >= 0; i--) {
|
|
201
|
-
const stored = this._storage[i];
|
|
202
|
-
if (stored.type === initializationData.type) {
|
|
203
|
-
if (areInitializationValuesCompatible(stored.values, formattedVals)) {
|
|
204
|
-
return i;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return -1;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Format given initializationData's values so they are ready to be stored:
|
|
213
|
-
* - sort them by systemId, so they are faster to compare
|
|
214
|
-
* - add hash for each initialization data encountered.
|
|
215
|
-
* @param {Array.<Object>} initialValues
|
|
216
|
-
* @returns {Array.<Object>}
|
|
217
|
-
*/
|
|
218
|
-
private _formatValuesForStore(
|
|
219
|
-
initialValues : Array<{ systemId : string | undefined;
|
|
220
|
-
data : Uint8Array; }>
|
|
221
|
-
) : Array<{ systemId : string | undefined;
|
|
222
|
-
hash : number;
|
|
223
|
-
data : Uint8Array; }> {
|
|
224
|
-
return initialValues.slice()
|
|
225
|
-
.sort((a, b) => a.systemId === b.systemId ? 0 :
|
|
226
|
-
a.systemId === undefined ? 1 :
|
|
227
|
-
b.systemId === undefined ? -1 :
|
|
228
|
-
a.systemId < b.systemId ? -1 :
|
|
229
|
-
1)
|
|
230
|
-
.map(({ systemId, data }) => ({ systemId,
|
|
231
|
-
data,
|
|
232
|
-
hash: hashBuffer(data) }));
|
|
233
|
-
}
|
|
234
|
-
}
|