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,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { defer as observableDefer, mergeMap, of as observableOf, } from "rxjs";
|
|
17
|
-
import { setMediaKeys } from "../../compat";
|
|
18
|
-
import log from "../../log";
|
|
19
|
-
import MediaKeysInfosStore from "./media_keys_infos_store";
|
|
20
|
-
/**
|
|
21
|
-
* @param {Object} mediaKeysInfos
|
|
22
|
-
* @returns {Observable}
|
|
23
|
-
*/
|
|
24
|
-
export default function disposeMediaKeys(mediaElement) {
|
|
25
|
-
return observableDefer(function () {
|
|
26
|
-
var currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
27
|
-
if (currentState === null) {
|
|
28
|
-
return observableOf(null);
|
|
29
|
-
}
|
|
30
|
-
log.info("EME: Disposing of the current MediaKeys");
|
|
31
|
-
var loadedSessionsStore = currentState.loadedSessionsStore;
|
|
32
|
-
MediaKeysInfosStore.clearState(mediaElement);
|
|
33
|
-
return loadedSessionsStore.closeAllSessions()
|
|
34
|
-
.pipe(mergeMap(function () { return setMediaKeys(mediaElement, null); }));
|
|
35
|
-
});
|
|
36
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { Observable } from "rxjs";
|
|
17
|
-
import { IContentProtection, IEMEManagerEvent, IKeySystemOption } from "./types";
|
|
18
|
-
/**
|
|
19
|
-
* EME abstraction used to communicate with the Content Decryption Module (or
|
|
20
|
-
* CDM) to be able to decrypt contents.
|
|
21
|
-
*
|
|
22
|
-
* The `EMEManager` can be given one or multiple key systems. It will choose the
|
|
23
|
-
* appropriate one depending on user settings and browser support.
|
|
24
|
-
* @param {HTMLMediaElement} mediaElement - The MediaElement which will be
|
|
25
|
-
* associated to a MediaKeys object
|
|
26
|
-
* @param {Array.<Object>} keySystemsConfigs - key system configuration
|
|
27
|
-
* @param {Observable} contentProtections$ - Observable emitting external
|
|
28
|
-
* initialization data.
|
|
29
|
-
* @returns {Observable}
|
|
30
|
-
*/
|
|
31
|
-
export default function EMEManager(mediaElement: HTMLMediaElement, keySystemsConfigs: IKeySystemOption[], contentProtections$: Observable<IContentProtection>): Observable<IEMEManagerEvent>;
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { catchError, concat as observableConcat, EMPTY, filter, ignoreElements, map, merge as observableMerge, mergeMap, of as observableOf, ReplaySubject, shareReplay, take, tap, throwError, } from "rxjs";
|
|
17
|
-
import { events, generateKeyRequest, getInitData, } from "../../compat/";
|
|
18
|
-
import config from "../../config";
|
|
19
|
-
import { EncryptedMediaError } from "../../errors";
|
|
20
|
-
import log from "../../log";
|
|
21
|
-
import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
|
|
22
|
-
import arrayIncludes from "../../utils/array_includes";
|
|
23
|
-
import assertUnreachable from "../../utils/assert_unreachable";
|
|
24
|
-
import { concat } from "../../utils/byte_parsing";
|
|
25
|
-
import filterMap from "../../utils/filter_map";
|
|
26
|
-
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
27
|
-
import cleanOldStoredPersistentInfo from "./clean_old_stored_persistent_info";
|
|
28
|
-
import getSession from "./get_session";
|
|
29
|
-
import initMediaKeys from "./init_media_keys";
|
|
30
|
-
import SessionEventsListener, { BlacklistedSessionError, } from "./session_events_listener";
|
|
31
|
-
import setServerCertificate from "./set_server_certificate";
|
|
32
|
-
import InitDataStore from "./utils/init_data_store";
|
|
33
|
-
var EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS = config.EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION = config.EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION;
|
|
34
|
-
var onEncrypted$ = events.onEncrypted$;
|
|
35
|
-
/**
|
|
36
|
-
* EME abstraction used to communicate with the Content Decryption Module (or
|
|
37
|
-
* CDM) to be able to decrypt contents.
|
|
38
|
-
*
|
|
39
|
-
* The `EMEManager` can be given one or multiple key systems. It will choose the
|
|
40
|
-
* appropriate one depending on user settings and browser support.
|
|
41
|
-
* @param {HTMLMediaElement} mediaElement - The MediaElement which will be
|
|
42
|
-
* associated to a MediaKeys object
|
|
43
|
-
* @param {Array.<Object>} keySystemsConfigs - key system configuration
|
|
44
|
-
* @param {Observable} contentProtections$ - Observable emitting external
|
|
45
|
-
* initialization data.
|
|
46
|
-
* @returns {Observable}
|
|
47
|
-
*/
|
|
48
|
-
export default function EMEManager(mediaElement, keySystemsConfigs, contentProtections$) {
|
|
49
|
-
log.debug("EME: Starting EMEManager logic.");
|
|
50
|
-
/**
|
|
51
|
-
* Keep track of all decryption keys handled by this instance of the
|
|
52
|
-
* `EMEManager`.
|
|
53
|
-
* This allows to avoid creating multiple MediaKeySessions handling the same
|
|
54
|
-
* decryption keys.
|
|
55
|
-
*/
|
|
56
|
-
var contentSessions = new InitDataStore();
|
|
57
|
-
/**
|
|
58
|
-
* Keep track of which initialization data have been blacklisted in the
|
|
59
|
-
* current instance of the `EMEManager`.
|
|
60
|
-
* If the same initialization data is encountered again, we can directly emit
|
|
61
|
-
* the same `BlacklistedSessionError`.
|
|
62
|
-
*/
|
|
63
|
-
var blacklistedInitData = new InitDataStore();
|
|
64
|
-
/** Emit the MediaKeys instance and its related information when ready. */
|
|
65
|
-
var mediaKeysInit$ = initMediaKeys(mediaElement, keySystemsConfigs)
|
|
66
|
-
.pipe(mergeMap(function (mediaKeysEvt) {
|
|
67
|
-
if (mediaKeysEvt.type !== "attached-media-keys") {
|
|
68
|
-
return observableOf(mediaKeysEvt);
|
|
69
|
-
}
|
|
70
|
-
var _a = mediaKeysEvt.value, mediaKeys = _a.mediaKeys, options = _a.options;
|
|
71
|
-
var serverCertificate = options.serverCertificate;
|
|
72
|
-
if (isNullOrUndefined(serverCertificate)) {
|
|
73
|
-
return observableOf(mediaKeysEvt);
|
|
74
|
-
}
|
|
75
|
-
return observableConcat(setServerCertificate(mediaKeys, serverCertificate), observableOf(mediaKeysEvt));
|
|
76
|
-
}), shareReplay()); // Share side-effects and cache success
|
|
77
|
-
/** Emit when the MediaKeys instance has been attached the HTMLMediaElement. */
|
|
78
|
-
var attachedMediaKeys$ = mediaKeysInit$.pipe(filter(function (evt) {
|
|
79
|
-
return evt.type === "attached-media-keys";
|
|
80
|
-
}), take(1));
|
|
81
|
-
/** Parsed `encrypted` events coming from the HTMLMediaElement. */
|
|
82
|
-
var mediaEncryptedEvents$ = onEncrypted$(mediaElement).pipe(tap(function () {
|
|
83
|
-
log.debug("EME: Encrypted event received from media element.");
|
|
84
|
-
}), filterMap(function (evt) { return getInitData(evt); }, null), shareReplay({ refCount: true })); // multiple Observables listen to that one
|
|
85
|
-
// as soon as the EMEManager is subscribed
|
|
86
|
-
/** Encryption events coming from the `contentProtections$` argument. */
|
|
87
|
-
var externalEvents$ = contentProtections$.pipe(tap(function () { log.debug("EME: Encrypted event received from Player"); }));
|
|
88
|
-
/** Emit events signaling that an encryption initialization data is encountered. */
|
|
89
|
-
var initializationData$ = observableMerge(externalEvents$, mediaEncryptedEvents$);
|
|
90
|
-
/** Create MediaKeySessions and handle the corresponding events. */
|
|
91
|
-
var bindSession$ = initializationData$.pipe(
|
|
92
|
-
// Add attached MediaKeys info once available
|
|
93
|
-
mergeMap(function (initializationData) { return attachedMediaKeys$.pipe(map(function (mediaKeysEvt) {
|
|
94
|
-
return [initializationData, mediaKeysEvt];
|
|
95
|
-
})); }),
|
|
96
|
-
/* Attach server certificate and create/reuse MediaKeySession */
|
|
97
|
-
mergeMap(function (_a) {
|
|
98
|
-
var initializationData = _a[0], mediaKeysEvent = _a[1];
|
|
99
|
-
var _b = mediaKeysEvent.value, mediaKeySystemAccess = _b.mediaKeySystemAccess, stores = _b.stores, options = _b.options;
|
|
100
|
-
var blacklistError = blacklistedInitData.get(initializationData);
|
|
101
|
-
if (blacklistError !== undefined) {
|
|
102
|
-
if (initializationData.type === undefined) {
|
|
103
|
-
log.error("EME: The current session has already been blacklisted " +
|
|
104
|
-
"but the current content is not known. Throwing.");
|
|
105
|
-
var sessionError_1 = blacklistError.sessionError;
|
|
106
|
-
sessionError_1.fatal = true;
|
|
107
|
-
return throwError(function () { return sessionError_1; });
|
|
108
|
-
}
|
|
109
|
-
log.warn("EME: The current session has already been blacklisted. " +
|
|
110
|
-
"Blacklisting content.");
|
|
111
|
-
return observableOf({ type: "blacklist-protection-data",
|
|
112
|
-
value: initializationData });
|
|
113
|
-
}
|
|
114
|
-
var lastKeyUpdate$ = new ReplaySubject(1);
|
|
115
|
-
// First, check that this initialization data is not already handled
|
|
116
|
-
if (options.singleLicensePer === "content" && !contentSessions.isEmpty()) {
|
|
117
|
-
var keyIds_1 = initializationData.keyIds;
|
|
118
|
-
if (keyIds_1 === undefined) {
|
|
119
|
-
log.warn("EME: Initialization data linked to unknown key id, we'll " +
|
|
120
|
-
"not able to fallback from it.");
|
|
121
|
-
return observableOf({ type: "init-data-ignored",
|
|
122
|
-
value: { initializationData: initializationData } });
|
|
123
|
-
}
|
|
124
|
-
var firstSession_1 = contentSessions.getAll()[0];
|
|
125
|
-
return firstSession_1.lastKeyUpdate$.pipe(mergeMap(function (evt) {
|
|
126
|
-
var hasAllNeededKeyIds = keyIds_1.every(function (keyId) {
|
|
127
|
-
for (var i = 0; i < evt.whitelistedKeyIds.length; i++) {
|
|
128
|
-
if (areArraysOfNumbersEqual(evt.whitelistedKeyIds[i], keyId)) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
if (!hasAllNeededKeyIds) {
|
|
134
|
-
// Not all keys are available in the current session, blacklist those
|
|
135
|
-
return observableOf({ type: "keys-update",
|
|
136
|
-
value: { blacklistedKeyIDs: keyIds_1,
|
|
137
|
-
whitelistedKeyIds: [] } });
|
|
138
|
-
}
|
|
139
|
-
// Already handled by the current session.
|
|
140
|
-
// Move corresponding session on top of the cache if it exists
|
|
141
|
-
var loadedSessionsStore = mediaKeysEvent.value.stores.loadedSessionsStore;
|
|
142
|
-
loadedSessionsStore.reuse(firstSession_1.initializationData);
|
|
143
|
-
return observableOf({ type: "init-data-ignored",
|
|
144
|
-
value: { initializationData: initializationData } });
|
|
145
|
-
}));
|
|
146
|
-
}
|
|
147
|
-
else if (!contentSessions.storeIfNone(initializationData, { initializationData: initializationData, lastKeyUpdate$: lastKeyUpdate$ })) {
|
|
148
|
-
log.debug("EME: Init data already received. Skipping it.");
|
|
149
|
-
return observableOf({ type: "init-data-ignored",
|
|
150
|
-
value: { initializationData: initializationData } });
|
|
151
|
-
}
|
|
152
|
-
var wantedSessionType;
|
|
153
|
-
if (options.persistentLicense !== true) {
|
|
154
|
-
wantedSessionType = "temporary";
|
|
155
|
-
}
|
|
156
|
-
else if (!canCreatePersistentSession(mediaKeySystemAccess)) {
|
|
157
|
-
log.warn("EME: Cannot create \"persistent-license\" session: not supported");
|
|
158
|
-
wantedSessionType = "temporary";
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
wantedSessionType = "persistent-license";
|
|
162
|
-
}
|
|
163
|
-
var maxSessionCacheSize = typeof options.maxSessionCacheSize === "number" ?
|
|
164
|
-
options.maxSessionCacheSize :
|
|
165
|
-
EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS;
|
|
166
|
-
return getSession(initializationData, stores, wantedSessionType, maxSessionCacheSize)
|
|
167
|
-
.pipe(mergeMap(function (sessionEvt) {
|
|
168
|
-
switch (sessionEvt.type) {
|
|
169
|
-
case "cleaning-old-session":
|
|
170
|
-
contentSessions.remove(sessionEvt.value.initializationData);
|
|
171
|
-
return EMPTY;
|
|
172
|
-
case "cleaned-old-session":
|
|
173
|
-
return EMPTY;
|
|
174
|
-
case "created-session":
|
|
175
|
-
case "loaded-open-session":
|
|
176
|
-
case "loaded-persistent-session":
|
|
177
|
-
// Do nothing, just to check every possibility is taken
|
|
178
|
-
break;
|
|
179
|
-
default: // Use TypeScript to check if all possibilities have been checked
|
|
180
|
-
assertUnreachable(sessionEvt);
|
|
181
|
-
}
|
|
182
|
-
var _a = sessionEvt.value, mediaKeySession = _a.mediaKeySession, sessionType = _a.sessionType;
|
|
183
|
-
/**
|
|
184
|
-
* We only store persistent sessions once its keys are known.
|
|
185
|
-
* This boolean allows to know if this session has already been
|
|
186
|
-
* persisted or not.
|
|
187
|
-
*/
|
|
188
|
-
var isSessionPersisted = false;
|
|
189
|
-
// `generateKeyRequest` awaits a single Uint8Array containing all
|
|
190
|
-
// initialization data.
|
|
191
|
-
var concatInitData = concat.apply(void 0, initializationData.values.map(function (i) { return i.data; }));
|
|
192
|
-
var generateRequest$ = sessionEvt.type !== "created-session" ?
|
|
193
|
-
EMPTY :
|
|
194
|
-
generateKeyRequest(mediaKeySession, initializationData.type, concatInitData).pipe(catchError(function (error) {
|
|
195
|
-
throw new EncryptedMediaError("KEY_GENERATE_REQUEST_ERROR", error instanceof Error ? error.toString() :
|
|
196
|
-
"Unknown error");
|
|
197
|
-
}), ignoreElements());
|
|
198
|
-
return observableMerge(SessionEventsListener(mediaKeySession, options, mediaKeySystemAccess.keySystem, initializationData), generateRequest$)
|
|
199
|
-
.pipe(map(function (evt) {
|
|
200
|
-
var _a;
|
|
201
|
-
if (evt.type !== "keys-update") {
|
|
202
|
-
return evt;
|
|
203
|
-
}
|
|
204
|
-
// We want to add the current key ids in the blacklist if it is
|
|
205
|
-
// not already there.
|
|
206
|
-
//
|
|
207
|
-
// We only do that when `singleLicensePer` is set to something
|
|
208
|
-
// else than the default `"init-data"` because this logic:
|
|
209
|
-
// 1. might result in a quality fallback, which is a v3.x.x
|
|
210
|
-
// breaking change if some APIs (like `singleLicensePer`)
|
|
211
|
-
// aren't used.
|
|
212
|
-
// 2. Rely on the EME spec regarding key statuses being well
|
|
213
|
-
// implemented on all supported devices, which we're not
|
|
214
|
-
// sure yet. Because in any other `singleLicensePer`, we
|
|
215
|
-
// need a good implementation anyway, it doesn't matter
|
|
216
|
-
// there.
|
|
217
|
-
var expectedKeyIds = initializationData.keyIds;
|
|
218
|
-
if (expectedKeyIds !== undefined &&
|
|
219
|
-
options.singleLicensePer !== "init-data") {
|
|
220
|
-
var missingKeyIds = expectedKeyIds.filter(function (expected) {
|
|
221
|
-
return (!evt.value.whitelistedKeyIds.some(function (whitelisted) {
|
|
222
|
-
return areArraysOfNumbersEqual(whitelisted, expected);
|
|
223
|
-
}) &&
|
|
224
|
-
!evt.value.blacklistedKeyIDs.some(function (blacklisted) {
|
|
225
|
-
return areArraysOfNumbersEqual(blacklisted, expected);
|
|
226
|
-
}));
|
|
227
|
-
});
|
|
228
|
-
if (missingKeyIds.length > 0) {
|
|
229
|
-
(_a = evt.value.blacklistedKeyIDs).push.apply(_a, missingKeyIds);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
lastKeyUpdate$.next(evt.value);
|
|
233
|
-
if ((evt.value.whitelistedKeyIds.length === 0 &&
|
|
234
|
-
evt.value.blacklistedKeyIDs.length === 0) ||
|
|
235
|
-
sessionType === "temporary" ||
|
|
236
|
-
stores.persistentSessionsStore === null ||
|
|
237
|
-
isSessionPersisted) {
|
|
238
|
-
return evt;
|
|
239
|
-
}
|
|
240
|
-
var persistentSessionsStore = stores.persistentSessionsStore;
|
|
241
|
-
cleanOldStoredPersistentInfo(persistentSessionsStore, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION - 1);
|
|
242
|
-
persistentSessionsStore.add(initializationData, mediaKeySession);
|
|
243
|
-
isSessionPersisted = true;
|
|
244
|
-
return evt;
|
|
245
|
-
}), catchError(function (err) {
|
|
246
|
-
if (!(err instanceof BlacklistedSessionError)) {
|
|
247
|
-
throw err;
|
|
248
|
-
}
|
|
249
|
-
blacklistedInitData.store(initializationData, err);
|
|
250
|
-
var sessionError = err.sessionError;
|
|
251
|
-
if (initializationData.type === undefined) {
|
|
252
|
-
log.error("EME: Current session blacklisted and content not known. " +
|
|
253
|
-
"Throwing.");
|
|
254
|
-
sessionError.fatal = true;
|
|
255
|
-
throw sessionError;
|
|
256
|
-
}
|
|
257
|
-
log.warn("EME: Current session blacklisted. Blacklisting content.");
|
|
258
|
-
return observableOf({ type: "warning",
|
|
259
|
-
value: sessionError }, { type: "blacklist-protection-data",
|
|
260
|
-
value: initializationData });
|
|
261
|
-
}));
|
|
262
|
-
}));
|
|
263
|
-
}));
|
|
264
|
-
return observableMerge(mediaKeysInit$, mediaEncryptedEvents$
|
|
265
|
-
.pipe(map(function (evt) { return ({ type: "encrypted-event-received",
|
|
266
|
-
value: evt }); })), bindSession$);
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Returns `true` if the given MediaKeySystemAccess can create
|
|
270
|
-
* "persistent-license" MediaKeySessions.
|
|
271
|
-
* @param {MediaKeySystemAccess} mediaKeySystemAccess
|
|
272
|
-
* @returns {Boolean}
|
|
273
|
-
*/
|
|
274
|
-
function canCreatePersistentSession(mediaKeySystemAccess) {
|
|
275
|
-
var sessionTypes = mediaKeySystemAccess.getConfiguration().sessionTypes;
|
|
276
|
-
return sessionTypes !== undefined &&
|
|
277
|
-
arrayIncludes(sessionTypes, "persistent-license");
|
|
278
|
-
}
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { catchError, defer as observableDefer, map, of as observableOf, throwError as observableThrow, } from "rxjs";
|
|
17
|
-
import { requestMediaKeySystemAccess, shouldRenewMediaKeys, } from "../../compat";
|
|
18
|
-
import config from "../../config";
|
|
19
|
-
import { EncryptedMediaError } from "../../errors";
|
|
20
|
-
import log from "../../log";
|
|
21
|
-
import arrayIncludes from "../../utils/array_includes";
|
|
22
|
-
import flatMap from "../../utils/flat_map";
|
|
23
|
-
import MediaKeysInfosStore from "./media_keys_infos_store";
|
|
24
|
-
var EME_DEFAULT_WIDEVINE_ROBUSTNESSES = config.EME_DEFAULT_WIDEVINE_ROBUSTNESSES, EME_KEY_SYSTEMS = config.EME_KEY_SYSTEMS;
|
|
25
|
-
/**
|
|
26
|
-
* @param {Array.<Object>} keySystems
|
|
27
|
-
* @param {MediaKeySystemAccess} currentKeySystemAccess
|
|
28
|
-
* @param {Object} currentKeySystemOptions
|
|
29
|
-
* @returns {null|Object}
|
|
30
|
-
*/
|
|
31
|
-
function checkCachedMediaKeySystemAccess(keySystems, currentKeySystemAccess, currentKeySystemOptions) {
|
|
32
|
-
var mksConfiguration = currentKeySystemAccess.getConfiguration();
|
|
33
|
-
if (shouldRenewMediaKeys() || mksConfiguration == null) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
var firstCompatibleOption = keySystems.filter(function (ks) {
|
|
37
|
-
// TODO Do it with MediaKeySystemAccess.prototype.keySystem instead
|
|
38
|
-
if (ks.type !== currentKeySystemOptions.type) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
if ((ks.persistentLicense === true || ks.persistentStateRequired === true) &&
|
|
42
|
-
mksConfiguration.persistentState !== "required") {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
if (ks.distinctiveIdentifierRequired === true &&
|
|
46
|
-
mksConfiguration.distinctiveIdentifier !== "required") {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
return true;
|
|
50
|
-
})[0];
|
|
51
|
-
if (firstCompatibleOption != null) {
|
|
52
|
-
return { keySystemOptions: firstCompatibleOption,
|
|
53
|
-
keySystemAccess: currentKeySystemAccess };
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Find key system canonical name from key system type.
|
|
59
|
-
* @param {string} ksType - Obtained via inversion
|
|
60
|
-
* @returns {string|undefined} - Either the canonical name, or undefined.
|
|
61
|
-
*/
|
|
62
|
-
function findKeySystemCanonicalName(ksType) {
|
|
63
|
-
for (var _i = 0, _a = Object.keys(EME_KEY_SYSTEMS); _i < _a.length; _i++) {
|
|
64
|
-
var ksName = _a[_i];
|
|
65
|
-
if (arrayIncludes(EME_KEY_SYSTEMS[ksName], ksType)) {
|
|
66
|
-
return ksName;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Build configuration for the requestMediaKeySystemAccess EME API, based
|
|
73
|
-
* on the current keySystem object.
|
|
74
|
-
* @param {string} [ksName] - Generic name for the key system. e.g. "clearkey",
|
|
75
|
-
* "widevine", "playready". Can be used to make exceptions depending on it.
|
|
76
|
-
* @param {Object} keySystem
|
|
77
|
-
* @returns {Array.<Object>} - Configuration to give to the
|
|
78
|
-
* requestMediaKeySystemAccess API.
|
|
79
|
-
*/
|
|
80
|
-
function buildKeySystemConfigurations(ksName, keySystem) {
|
|
81
|
-
var sessionTypes = ["temporary"];
|
|
82
|
-
var persistentState = "optional";
|
|
83
|
-
var distinctiveIdentifier = "optional";
|
|
84
|
-
if (keySystem.persistentLicense === true) {
|
|
85
|
-
persistentState = "required";
|
|
86
|
-
sessionTypes.push("persistent-license");
|
|
87
|
-
}
|
|
88
|
-
if (keySystem.persistentStateRequired === true) {
|
|
89
|
-
persistentState = "required";
|
|
90
|
-
}
|
|
91
|
-
if (keySystem.distinctiveIdentifierRequired === true) {
|
|
92
|
-
distinctiveIdentifier = "required";
|
|
93
|
-
}
|
|
94
|
-
// Set robustness, in order of consideration:
|
|
95
|
-
// 1. the user specified its own robustnesses
|
|
96
|
-
// 2. a "widevine" key system is used, in that case set the default widevine
|
|
97
|
-
// robustnesses as defined in the config
|
|
98
|
-
// 3. set an undefined robustness
|
|
99
|
-
var videoRobustnesses = keySystem.videoRobustnesses != null ?
|
|
100
|
-
keySystem.videoRobustnesses :
|
|
101
|
-
(ksName === "widevine" ? EME_DEFAULT_WIDEVINE_ROBUSTNESSES :
|
|
102
|
-
[]);
|
|
103
|
-
var audioRobustnesses = keySystem.audioRobustnesses != null ?
|
|
104
|
-
keySystem.audioRobustnesses :
|
|
105
|
-
(ksName === "widevine" ? EME_DEFAULT_WIDEVINE_ROBUSTNESSES :
|
|
106
|
-
[]);
|
|
107
|
-
if (videoRobustnesses.length === 0) {
|
|
108
|
-
videoRobustnesses.push(undefined);
|
|
109
|
-
}
|
|
110
|
-
if (audioRobustnesses.length === 0) {
|
|
111
|
-
audioRobustnesses.push(undefined);
|
|
112
|
-
}
|
|
113
|
-
// From the W3 EME spec, we have to provide videoCapabilities and
|
|
114
|
-
// audioCapabilities.
|
|
115
|
-
// These capabilities must specify a codec (even though you can use a
|
|
116
|
-
// completely different codec afterward).
|
|
117
|
-
// It is also strongly recommended to specify the required security
|
|
118
|
-
// robustness. As we do not want to forbide any security level, we specify
|
|
119
|
-
// every existing security level from highest to lowest so that the best
|
|
120
|
-
// security level is selected.
|
|
121
|
-
// More details here:
|
|
122
|
-
// https://storage.googleapis.com/wvdocs/Chrome_EME_Changes_and_Best_Practices.pdf
|
|
123
|
-
// https://www.w3.org/TR/encrypted-media/#get-supported-configuration-and-consent
|
|
124
|
-
var videoCapabilities = flatMap(videoRobustnesses, function (robustness) { return [{ contentType: "video/mp4;codecs=\"avc1.4d401e\"", robustness: robustness },
|
|
125
|
-
{ contentType: "video/mp4;codecs=\"avc1.42e01e\"", robustness: robustness },
|
|
126
|
-
{ contentType: "video/webm;codecs=\"vp8\"", robustness: robustness }]; });
|
|
127
|
-
var audioCapabilities = flatMap(audioRobustnesses, function (robustness) { return [{ contentType: "audio/mp4;codecs=\"mp4a.40.2\"", robustness: robustness },
|
|
128
|
-
{ contentType: "audio/webm;codecs=opus", robustness: robustness }]; });
|
|
129
|
-
// TODO Re-test with a set contentType but an undefined robustness on the
|
|
130
|
-
// STBs on which this problem was found.
|
|
131
|
-
//
|
|
132
|
-
// add another with no {audio,video}Capabilities for some legacy browsers.
|
|
133
|
-
// As of today's spec, this should return NotSupported but the first
|
|
134
|
-
// candidate configuration should be good, so we should have no downside
|
|
135
|
-
// doing that.
|
|
136
|
-
// initDataTypes: ["cenc"],
|
|
137
|
-
// videoCapabilities: undefined,
|
|
138
|
-
// audioCapabilities: undefined,
|
|
139
|
-
// distinctiveIdentifier,
|
|
140
|
-
// persistentState,
|
|
141
|
-
// sessionTypes,
|
|
142
|
-
return [{ initDataTypes: ["cenc"], videoCapabilities: videoCapabilities, audioCapabilities: audioCapabilities, distinctiveIdentifier: distinctiveIdentifier, persistentState: persistentState, sessionTypes: sessionTypes }];
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Try to find a compatible key system from the keySystems array given.
|
|
146
|
-
*
|
|
147
|
-
* Returns an Observable which, when subscribed to, will request a
|
|
148
|
-
* MediaKeySystemAccess based on the various keySystems provided. This
|
|
149
|
-
* Observable will:
|
|
150
|
-
* - emit the MediaKeySystemAccess and the keySystems as an object, when
|
|
151
|
-
* found. The object is under this form:
|
|
152
|
-
* {
|
|
153
|
-
* keySystemAccess {MediaKeySystemAccess}
|
|
154
|
-
* keySystem {Object}
|
|
155
|
-
* }
|
|
156
|
-
* - complete immediately after emitting.
|
|
157
|
-
* - throw if no compatible key system has been found.
|
|
158
|
-
*
|
|
159
|
-
* @param {HTMLMediaElement} mediaElement
|
|
160
|
-
* @param {Array.<Object>} keySystems - The keySystems you want to test.
|
|
161
|
-
* @returns {Observable}
|
|
162
|
-
*/
|
|
163
|
-
export default function getMediaKeySystemAccess(mediaElement, keySystemsConfigs) {
|
|
164
|
-
return observableDefer(function () {
|
|
165
|
-
log.info("EME: Searching for compatible MediaKeySystemAccess");
|
|
166
|
-
var currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
167
|
-
if (currentState != null) {
|
|
168
|
-
// Fast way to find a compatible keySystem if the currently loaded
|
|
169
|
-
// one as exactly the same compatibility options.
|
|
170
|
-
var cachedKeySystemAccess = checkCachedMediaKeySystemAccess(keySystemsConfigs, currentState.mediaKeySystemAccess, currentState.keySystemOptions);
|
|
171
|
-
if (cachedKeySystemAccess !== null) {
|
|
172
|
-
log.info("EME: Found cached compatible keySystem");
|
|
173
|
-
return observableOf({
|
|
174
|
-
type: "reuse-media-key-system-access",
|
|
175
|
-
value: { mediaKeySystemAccess: cachedKeySystemAccess.keySystemAccess,
|
|
176
|
-
options: cachedKeySystemAccess.keySystemOptions },
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Array of set keySystems for this content.
|
|
182
|
-
* Each item of this array is an object containing the following keys:
|
|
183
|
-
* - keyName {string}: keySystem canonical name (e.g. "widevine")
|
|
184
|
-
* - keyType {string}: keySystem type (e.g. "com.widevine.alpha")
|
|
185
|
-
* - keySystem {Object}: the original keySystem object
|
|
186
|
-
* @type {Array.<Object>}
|
|
187
|
-
*/
|
|
188
|
-
var keySystemsType = keySystemsConfigs.reduce(function (arr, keySystemOptions) {
|
|
189
|
-
var managedRDNs = EME_KEY_SYSTEMS[keySystemOptions.type];
|
|
190
|
-
var ksType;
|
|
191
|
-
if (managedRDNs != null) {
|
|
192
|
-
ksType = managedRDNs.map(function (keyType) {
|
|
193
|
-
var keyName = keySystemOptions.type;
|
|
194
|
-
return { keyName: keyName, keyType: keyType, keySystemOptions: keySystemOptions };
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
var keyName = findKeySystemCanonicalName(keySystemOptions.type);
|
|
199
|
-
var keyType = keySystemOptions.type;
|
|
200
|
-
ksType = [{ keyName: keyName, keyType: keyType, keySystemOptions: keySystemOptions }];
|
|
201
|
-
}
|
|
202
|
-
return arr.concat(ksType);
|
|
203
|
-
}, []);
|
|
204
|
-
return recursivelyTestKeySystems(0);
|
|
205
|
-
/**
|
|
206
|
-
* Test all key system configuration stored in `keySystemsType` one by one
|
|
207
|
-
* recursively.
|
|
208
|
-
* Returns an Observable which emit the MediaKeySystemAccess if one was
|
|
209
|
-
* found compatible with one of the configurations or just throws if none
|
|
210
|
-
* were found to be compatible.
|
|
211
|
-
* @param {Number} index - The index in `keySystemsType` to start from.
|
|
212
|
-
* Should be set to `0` when calling directly.
|
|
213
|
-
* @returns {Observable}
|
|
214
|
-
*/
|
|
215
|
-
function recursivelyTestKeySystems(index) {
|
|
216
|
-
// if we iterated over the whole keySystemsType Array, quit on error
|
|
217
|
-
if (index >= keySystemsType.length) {
|
|
218
|
-
var error_1 = new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS", "No key system compatible with your " +
|
|
219
|
-
"wanted configuration has been found " +
|
|
220
|
-
"in the current browser.");
|
|
221
|
-
return observableThrow(function () { return error_1; });
|
|
222
|
-
}
|
|
223
|
-
if (requestMediaKeySystemAccess == null) {
|
|
224
|
-
var error_2 = Error("requestMediaKeySystemAccess is not " +
|
|
225
|
-
"implemented in your browser.");
|
|
226
|
-
return observableThrow(function () { return error_2; });
|
|
227
|
-
}
|
|
228
|
-
var _a = keySystemsType[index], keyName = _a.keyName, keyType = _a.keyType, keySystemOptions = _a.keySystemOptions;
|
|
229
|
-
var keySystemConfigurations = buildKeySystemConfigurations(keyName, keySystemOptions);
|
|
230
|
-
log.debug("EME: Request keysystem access ".concat(keyType, ",") +
|
|
231
|
-
"".concat(index + 1, " of ").concat(keySystemsType.length), keySystemConfigurations);
|
|
232
|
-
return requestMediaKeySystemAccess(keyType, keySystemConfigurations).pipe(map(function (keySystemAccess) {
|
|
233
|
-
log.info("EME: Found compatible keysystem", keyType, keySystemConfigurations);
|
|
234
|
-
return { type: "create-media-key-system-access",
|
|
235
|
-
value: { options: keySystemOptions,
|
|
236
|
-
mediaKeySystemAccess: keySystemAccess } };
|
|
237
|
-
}), catchError(function () {
|
|
238
|
-
log.debug("EME: Rejected access to keysystem", keyType, keySystemConfigurations);
|
|
239
|
-
return recursivelyTestKeySystems(index + 1);
|
|
240
|
-
}));
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
}
|