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
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
ICustomMediaKeys,
|
|
19
|
+
ICustomMediaKeySystemAccess,
|
|
20
|
+
} from "../../compat";
|
|
21
|
+
import { EncryptedMediaError } from "../../errors";
|
|
22
|
+
import log from "../../log";
|
|
23
|
+
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
24
|
+
import { CancellationSignal } from "../../utils/task_canceller";
|
|
25
|
+
import getMediaKeySystemAccess from "./find_key_system";
|
|
26
|
+
import {
|
|
27
|
+
IKeySystemOption,
|
|
28
|
+
IMediaKeySessionStores,
|
|
29
|
+
} from "./types";
|
|
30
|
+
import LoadedSessionsStore from "./utils/loaded_sessions_store";
|
|
31
|
+
import MediaKeysInfosStore from "./utils/media_keys_infos_store";
|
|
32
|
+
import PersistentSessionsStore from "./utils/persistent_sessions_store";
|
|
33
|
+
import ServerCertificateStore from "./utils/server_certificate_store";
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @throws {EncryptedMediaError}
|
|
37
|
+
* @param {Object} keySystemOptions
|
|
38
|
+
* @returns {Object|null}
|
|
39
|
+
*/
|
|
40
|
+
function createPersistentSessionsStorage(
|
|
41
|
+
keySystemOptions : IKeySystemOption
|
|
42
|
+
) : PersistentSessionsStore|null {
|
|
43
|
+
if (keySystemOptions.persistentLicense !== true) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const { licenseStorage } = keySystemOptions;
|
|
48
|
+
if (licenseStorage == null) {
|
|
49
|
+
throw new EncryptedMediaError("INVALID_KEY_SYSTEM",
|
|
50
|
+
"No license storage found for persistent license.");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
log.debug("DRM: Set the given license storage");
|
|
54
|
+
return new PersistentSessionsStore(licenseStorage);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Object returned by `getMediaKeysInfos`. */
|
|
58
|
+
export interface IMediaKeysInfos {
|
|
59
|
+
/** The MediaKeySystemAccess which allowed to create the MediaKeys instance. */
|
|
60
|
+
mediaKeySystemAccess: MediaKeySystemAccess |
|
|
61
|
+
ICustomMediaKeySystemAccess;
|
|
62
|
+
/** The MediaKeys instance. */
|
|
63
|
+
mediaKeys : MediaKeys |
|
|
64
|
+
ICustomMediaKeys;
|
|
65
|
+
/** Stores allowing to create and retrieve MediaKeySessions. */
|
|
66
|
+
stores : IMediaKeySessionStores;
|
|
67
|
+
/** IKeySystemOption compatible to the created MediaKeys instance. */
|
|
68
|
+
options : IKeySystemOption;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Create a MediaKeys instance and associated structures (or just return the
|
|
73
|
+
* current ones if sufficient) based on a wanted configuration.
|
|
74
|
+
* @param {HTMLMediaElement} mediaElement - The HTMLMediaElement on which you
|
|
75
|
+
* will attach the MediaKeys instance.
|
|
76
|
+
* This Element is here only used to check if the current MediaKeys and
|
|
77
|
+
* MediaKeySystemAccess instances are sufficient
|
|
78
|
+
* @param {Array.<Object>} keySystemsConfigs - The key system configuration.
|
|
79
|
+
* Needed to ask the right MediaKeySystemAccess.
|
|
80
|
+
* @param {Object} cancelSignal - CancellationSignal allowing to cancel the
|
|
81
|
+
* creation of the MediaKeys instance while the task is still pending.
|
|
82
|
+
* @returns {Promise.<Object>}
|
|
83
|
+
*/
|
|
84
|
+
export default async function getMediaKeysInfos(
|
|
85
|
+
mediaElement : HTMLMediaElement,
|
|
86
|
+
keySystemsConfigs: IKeySystemOption[],
|
|
87
|
+
cancelSignal : CancellationSignal
|
|
88
|
+
) : Promise<IMediaKeysInfos> {
|
|
89
|
+
const evt = await getMediaKeySystemAccess(mediaElement,
|
|
90
|
+
keySystemsConfigs,
|
|
91
|
+
cancelSignal);
|
|
92
|
+
if (cancelSignal.cancellationError !== null) {
|
|
93
|
+
throw cancelSignal.cancellationError;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const { options, mediaKeySystemAccess } = evt.value;
|
|
97
|
+
const currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
98
|
+
const persistentSessionsStore = createPersistentSessionsStorage(options);
|
|
99
|
+
|
|
100
|
+
if (currentState !== null && evt.type === "reuse-media-key-system-access") {
|
|
101
|
+
const { mediaKeys, loadedSessionsStore } = currentState;
|
|
102
|
+
|
|
103
|
+
// We might just rely on the currently attached MediaKeys instance.
|
|
104
|
+
// First check if server certificate parameters are the same than in the
|
|
105
|
+
// current MediaKeys instance. If not, re-create MediaKeys from scratch.
|
|
106
|
+
if (ServerCertificateStore.hasOne(mediaKeys) === false ||
|
|
107
|
+
(!isNullOrUndefined(options.serverCertificate) &&
|
|
108
|
+
ServerCertificateStore.has(mediaKeys, options.serverCertificate)))
|
|
109
|
+
{
|
|
110
|
+
return { mediaKeys,
|
|
111
|
+
mediaKeySystemAccess,
|
|
112
|
+
stores: { loadedSessionsStore, persistentSessionsStore },
|
|
113
|
+
options };
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const mediaKeys = await createMediaKeys(mediaKeySystemAccess);
|
|
119
|
+
log.info("DRM: MediaKeys created with success");
|
|
120
|
+
const loadedSessionsStore = new LoadedSessionsStore(mediaKeys);
|
|
121
|
+
return { mediaKeys,
|
|
122
|
+
mediaKeySystemAccess,
|
|
123
|
+
stores: { loadedSessionsStore, persistentSessionsStore },
|
|
124
|
+
options };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Create `MediaKeys` from the `MediaKeySystemAccess` given.
|
|
129
|
+
* Throws the right formatted error if it fails.
|
|
130
|
+
* @param {MediaKeySystemAccess} mediaKeySystemAccess
|
|
131
|
+
* @returns {Observable.<MediaKeys>}
|
|
132
|
+
*/
|
|
133
|
+
async function createMediaKeys(
|
|
134
|
+
mediaKeySystemAccess : MediaKeySystemAccess | ICustomMediaKeySystemAccess
|
|
135
|
+
) : Promise<MediaKeys | ICustomMediaKeys> {
|
|
136
|
+
log.info("DRM: Calling createMediaKeys on the MediaKeySystemAccess");
|
|
137
|
+
try {
|
|
138
|
+
const mediaKeys = await mediaKeySystemAccess.createMediaKeys();
|
|
139
|
+
return mediaKeys;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
const message = error instanceof Error ? error.message :
|
|
142
|
+
"Unknown error when creating MediaKeys.";
|
|
143
|
+
throw new EncryptedMediaError("CREATE_MEDIA_KEYS_ERROR", message);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -19,17 +19,20 @@
|
|
|
19
19
|
* It always should be imported through the `features` object.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
-
|
|
22
|
+
import clearOnStop from "./clear_on_stop";
|
|
23
|
+
import ContentDecryptor, {
|
|
24
|
+
ContentDecryptorState,
|
|
25
|
+
IContentDecryptorEvent,
|
|
26
|
+
} from "./content_decryptor";
|
|
27
|
+
import disposeDecryptionResources from "./dispose_decryption_resources";
|
|
25
28
|
import getCurrentKeySystem from "./get_current_key_system";
|
|
26
|
-
import { IEMEManagerEvent } from "./types";
|
|
27
29
|
export * from "./types";
|
|
28
30
|
|
|
29
|
-
export default
|
|
31
|
+
export default ContentDecryptor;
|
|
30
32
|
export {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
clearOnStop,
|
|
34
|
+
ContentDecryptorState,
|
|
35
|
+
disposeDecryptionResources,
|
|
33
36
|
getCurrentKeySystem,
|
|
34
|
-
|
|
37
|
+
IContentDecryptorEvent,
|
|
35
38
|
};
|
|
@@ -0,0 +1,51 @@
|
|
|
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 log from "../../log";
|
|
18
|
+
import { CancellationSignal } from "../../utils/task_canceller";
|
|
19
|
+
import { disableMediaKeys } from "./attach_media_keys";
|
|
20
|
+
import getMediaKeysInfos, {
|
|
21
|
+
IMediaKeysInfos,
|
|
22
|
+
} from "./get_media_keys";
|
|
23
|
+
import { IKeySystemOption } from "./types";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get media keys infos from key system configs then attach media keys to media element.
|
|
27
|
+
* @param {HTMLMediaElement} mediaElement
|
|
28
|
+
* @param {Array.<Object>} keySystemsConfigs
|
|
29
|
+
* @param {Object} cancelSignal
|
|
30
|
+
* @returns {Promise.<Object>}
|
|
31
|
+
*/
|
|
32
|
+
export default async function initMediaKeys(
|
|
33
|
+
mediaElement: HTMLMediaElement,
|
|
34
|
+
keySystemsConfigs: IKeySystemOption[],
|
|
35
|
+
cancelSignal: CancellationSignal
|
|
36
|
+
): Promise<IMediaKeysInfos> {
|
|
37
|
+
const mediaKeysInfo =
|
|
38
|
+
await getMediaKeysInfos(mediaElement, keySystemsConfigs, cancelSignal);
|
|
39
|
+
|
|
40
|
+
const { mediaKeys } = mediaKeysInfo;
|
|
41
|
+
const shouldDisableOldMediaKeys =
|
|
42
|
+
mediaElement.mediaKeys !== null &&
|
|
43
|
+
mediaElement.mediaKeys !== undefined &&
|
|
44
|
+
mediaKeys !== mediaElement.mediaKeys;
|
|
45
|
+
|
|
46
|
+
if (shouldDisableOldMediaKeys) {
|
|
47
|
+
log.debug("DRM: Disabling old MediaKeys");
|
|
48
|
+
disableMediaKeys(mediaElement);
|
|
49
|
+
}
|
|
50
|
+
return mediaKeysInfo;
|
|
51
|
+
}
|
|
@@ -21,15 +21,15 @@ import {
|
|
|
21
21
|
defer as observableDefer,
|
|
22
22
|
EMPTY,
|
|
23
23
|
identity,
|
|
24
|
+
ignoreElements,
|
|
24
25
|
map,
|
|
25
26
|
merge as observableMerge,
|
|
26
27
|
mergeMap,
|
|
27
28
|
Observable,
|
|
28
29
|
of as observableOf,
|
|
29
|
-
startWith,
|
|
30
30
|
Subject,
|
|
31
|
-
takeUntil,
|
|
32
31
|
tap,
|
|
32
|
+
takeUntil,
|
|
33
33
|
timeout,
|
|
34
34
|
TimeoutError,
|
|
35
35
|
} from "rxjs";
|
|
@@ -49,20 +49,14 @@ import retryObsWithBackoff, {
|
|
|
49
49
|
IBackoffOptions,
|
|
50
50
|
} from "../../utils/rx-retry_with_backoff";
|
|
51
51
|
import tryCatch from "../../utils/rx-try_catch";
|
|
52
|
-
import checkKeyStatuses, {
|
|
53
|
-
IKeyStatusesCheckingOptions,
|
|
54
|
-
} from "./check_key_statuses";
|
|
55
52
|
import {
|
|
56
|
-
IInitializationDataInfo,
|
|
57
53
|
IEMEWarningEvent,
|
|
58
|
-
IKeyMessageHandledEvent,
|
|
59
|
-
IKeyStatusChangeHandledEvent,
|
|
60
54
|
IKeySystemOption,
|
|
61
|
-
|
|
62
|
-
INoUpdateEvent,
|
|
63
|
-
ISessionMessageEvent,
|
|
64
|
-
ISessionUpdatedEvent,
|
|
55
|
+
ILicense,
|
|
65
56
|
} from "./types";
|
|
57
|
+
import checkKeyStatuses, {
|
|
58
|
+
IKeyStatusesCheckingOptions,
|
|
59
|
+
} from "./utils/check_key_statuses";
|
|
66
60
|
|
|
67
61
|
const { onKeyError$,
|
|
68
62
|
onKeyMessage$,
|
|
@@ -91,27 +85,20 @@ export class BlacklistedSessionError extends Error {
|
|
|
91
85
|
* @param {MediaKeySession} session - The MediaKeySession concerned.
|
|
92
86
|
* @param {Object} keySystemOptions - The key system options.
|
|
93
87
|
* @param {String} keySystem - The configuration keySystem used for deciphering
|
|
94
|
-
* @param {Object} initializationData - The initialization data linked to that
|
|
95
|
-
* session.
|
|
96
88
|
* @returns {Observable}
|
|
97
89
|
*/
|
|
98
90
|
export default function SessionEventsListener(
|
|
99
91
|
session: MediaKeySession | ICustomMediaKeySession,
|
|
100
92
|
keySystemOptions: IKeySystemOption,
|
|
101
|
-
keySystem: string
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
ISessionMessageEvent |
|
|
105
|
-
INoUpdateEvent |
|
|
106
|
-
IKeysUpdateEvent |
|
|
107
|
-
ISessionUpdatedEvent>
|
|
108
|
-
{
|
|
109
|
-
log.info("EME: Binding session events", session.sessionId);
|
|
93
|
+
keySystem: string
|
|
94
|
+
) : Observable<IEMEWarningEvent | IKeysUpdateEvent> {
|
|
95
|
+
log.info("DRM: Binding session events", session.sessionId);
|
|
110
96
|
const sessionWarningSubject$ = new Subject<IEMEWarningEvent>();
|
|
111
97
|
const { getLicenseConfig = {} } = keySystemOptions;
|
|
112
98
|
|
|
113
|
-
const keyErrors
|
|
114
|
-
|
|
99
|
+
const keyErrors = onKeyError$(session).pipe(map((error) : never => {
|
|
100
|
+
throw new EncryptedMediaError("KEY_ERROR", error.type);
|
|
101
|
+
}));
|
|
115
102
|
|
|
116
103
|
const keyStatusesChange$ = onKeyStatusesChange$(session)
|
|
117
104
|
.pipe(mergeMap((keyStatusesEvent: Event) =>
|
|
@@ -121,7 +108,6 @@ export default function SessionEventsListener(
|
|
|
121
108
|
keyStatusesEvent)));
|
|
122
109
|
|
|
123
110
|
const keyMessages$ : Observable<IEMEWarningEvent |
|
|
124
|
-
ISessionMessageEvent |
|
|
125
111
|
IKeyMessageHandledEvent > =
|
|
126
112
|
onKeyMessage$(session).pipe(mergeMap((messageEvent: MediaKeyMessageEvent) => {
|
|
127
113
|
const message = new Uint8Array(messageEvent.message);
|
|
@@ -129,7 +115,7 @@ export default function SessionEventsListener(
|
|
|
129
115
|
messageEvent.messageType :
|
|
130
116
|
"license-request";
|
|
131
117
|
|
|
132
|
-
log.info(`
|
|
118
|
+
log.info(`DRM: Received message event, type ${messageType}`,
|
|
133
119
|
session.sessionId,
|
|
134
120
|
messageEvent);
|
|
135
121
|
const getLicense$ = observableDefer(() => {
|
|
@@ -156,36 +142,32 @@ export default function SessionEventsListener(
|
|
|
156
142
|
if (!isNullOrUndefined(err)) {
|
|
157
143
|
const { fallbackOnLastTry } = (err as { fallbackOnLastTry? : boolean });
|
|
158
144
|
if (fallbackOnLastTry === true) {
|
|
159
|
-
log.warn("
|
|
145
|
+
log.warn("DRM: Last `getLicense` attempt failed. " +
|
|
160
146
|
"Blacklisting the current session.");
|
|
161
147
|
throw new BlacklistedSessionError(formattedError);
|
|
162
148
|
}
|
|
163
149
|
}
|
|
164
150
|
throw formattedError;
|
|
165
|
-
})
|
|
166
|
-
startWith({ type: "session-message" as const,
|
|
167
|
-
value: { messageType, initializationData } })
|
|
168
|
-
);
|
|
151
|
+
}));
|
|
169
152
|
}));
|
|
170
153
|
|
|
171
154
|
const sessionUpdates = observableMerge(keyMessages$, keyStatusesChange$)
|
|
172
155
|
.pipe(concatMap((
|
|
173
156
|
evt : IEMEWarningEvent |
|
|
174
|
-
ISessionMessageEvent |
|
|
175
157
|
IKeyMessageHandledEvent |
|
|
176
158
|
IKeysUpdateEvent |
|
|
177
159
|
IKeyStatusChangeHandledEvent
|
|
178
160
|
) : Observable< IEMEWarningEvent |
|
|
179
|
-
ISessionMessageEvent |
|
|
180
|
-
INoUpdateEvent |
|
|
181
|
-
ISessionUpdatedEvent |
|
|
182
161
|
IKeysUpdateEvent > => {
|
|
183
162
|
switch (evt.type) {
|
|
184
163
|
case "key-message-handled":
|
|
185
164
|
case "key-status-change-handled":
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
165
|
+
if (isNullOrUndefined(evt.value.license)) {
|
|
166
|
+
log.info("DRM: No message given, skipping session.update");
|
|
167
|
+
return EMPTY;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return updateSessionWithMessage(session, evt.value.license);
|
|
189
171
|
default:
|
|
190
172
|
return observableOf(evt);
|
|
191
173
|
}
|
|
@@ -266,31 +248,26 @@ function formatGetLicenseError(error: unknown) : ICustomError {
|
|
|
266
248
|
* Returns the right event depending on the action taken.
|
|
267
249
|
* @param {MediaKeySession} session
|
|
268
250
|
* @param {ArrayBuffer|TypedArray|null} message
|
|
269
|
-
* @param {Object} initializationData
|
|
270
251
|
* @returns {Observable}
|
|
271
252
|
*/
|
|
272
253
|
function updateSessionWithMessage(
|
|
273
254
|
session : MediaKeySession | ICustomMediaKeySession,
|
|
274
|
-
message : BufferSource
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if (isNullOrUndefined(message)) {
|
|
278
|
-
log.info("EME: No message given, skipping session.update");
|
|
279
|
-
return observableOf({ type: "no-update" as const,
|
|
280
|
-
value: { initializationData } });
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
log.info("EME: Updating MediaKeySession with message");
|
|
255
|
+
message : BufferSource
|
|
256
|
+
) : Observable<never> {
|
|
257
|
+
log.info("DRM: Updating MediaKeySession with message");
|
|
284
258
|
return castToObservable(session.update(message)).pipe(
|
|
285
259
|
catchError((error: unknown) => {
|
|
286
260
|
const reason = error instanceof Error ? error.toString() :
|
|
287
261
|
"`session.update` failed";
|
|
288
262
|
throw new EncryptedMediaError("KEY_UPDATE_ERROR", reason);
|
|
289
263
|
}),
|
|
290
|
-
tap(() => { log.info("
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
264
|
+
tap(() => { log.info("DRM: MediaKeySession update succeeded."); }),
|
|
265
|
+
// NOTE As of now (RxJS 7.4.0), RxJS defines `ignoreElements` default
|
|
266
|
+
// first type parameter as `any` instead of the perfectly fine `unknown`,
|
|
267
|
+
// leading to linter issues, as it forbids the usage of `any`.
|
|
268
|
+
// This is why we're disabling the eslint rule.
|
|
269
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-argument */
|
|
270
|
+
ignoreElements());
|
|
294
271
|
}
|
|
295
272
|
|
|
296
273
|
/**
|
|
@@ -305,7 +282,7 @@ function handleKeyStatusesChangeEvent(
|
|
|
305
282
|
keySystem : string,
|
|
306
283
|
keyStatusesEvent : Event
|
|
307
284
|
) : Observable<IKeyStatusChangeHandledEvent | IKeysUpdateEvent | IEMEWarningEvent> {
|
|
308
|
-
log.info("
|
|
285
|
+
log.info("DRM: keystatuseschange event received", session.sessionId);
|
|
309
286
|
const callback$ = observableDefer(() => {
|
|
310
287
|
return tryCatch(() => {
|
|
311
288
|
if (typeof keySystemOptions.onKeyStatusesChange !== "function") {
|
|
@@ -356,3 +333,64 @@ function getLicenseBackoffOptions(
|
|
|
356
333
|
value: formatGetLicenseError(error) }),
|
|
357
334
|
};
|
|
358
335
|
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Some key ids have updated their status.
|
|
339
|
+
*
|
|
340
|
+
* We put them in two different list:
|
|
341
|
+
*
|
|
342
|
+
* - `blacklistedKeyIDs`: Those key ids won't be used for decryption and the
|
|
343
|
+
* corresponding media it decrypts should not be pushed to the buffer
|
|
344
|
+
* Note that a blacklisted key id can become whitelisted in the future.
|
|
345
|
+
*
|
|
346
|
+
* - `whitelistedKeyIds`: Those key ids were found and their corresponding
|
|
347
|
+
* keys are now being considered for decryption.
|
|
348
|
+
* Note that a whitelisted key id can become blacklisted in the future.
|
|
349
|
+
*
|
|
350
|
+
* Note that each `IKeysUpdateEvent` is independent of any other.
|
|
351
|
+
*
|
|
352
|
+
* A new `IKeysUpdateEvent` does not completely replace a previously emitted
|
|
353
|
+
* one, as it can for example be linked to a whole other decryption session.
|
|
354
|
+
*
|
|
355
|
+
* However, if a key id is encountered in both an older and a newer
|
|
356
|
+
* `IKeysUpdateEvent`, only the older status should be considered.
|
|
357
|
+
*/
|
|
358
|
+
export interface IKeysUpdateEvent {
|
|
359
|
+
type: "keys-update";
|
|
360
|
+
value: IKeyUpdateValue;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** Information on key ids linked to a MediaKeySession. */
|
|
364
|
+
export interface IKeyUpdateValue {
|
|
365
|
+
/**
|
|
366
|
+
* The list of key ids that are blacklisted.
|
|
367
|
+
* As such, their corresponding keys won't be used by that session, despite
|
|
368
|
+
* the fact that they were part of the pushed license.
|
|
369
|
+
*
|
|
370
|
+
* Reasons for blacklisting a keys depend on options, but mainly involve unmet
|
|
371
|
+
* output restrictions and CDM internal errors linked to that key id.
|
|
372
|
+
*/
|
|
373
|
+
blacklistedKeyIDs : Uint8Array[];
|
|
374
|
+
/*
|
|
375
|
+
* The list of key id linked to that session which are not blacklisted.
|
|
376
|
+
* Together with `blacklistedKeyIDs` it regroups all key ids linked to the
|
|
377
|
+
* session.
|
|
378
|
+
*/
|
|
379
|
+
whitelistedKeyIds : Uint8Array[];
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/** Emitted after the `onKeyStatusesChange` callback has been called. */
|
|
383
|
+
interface IKeyStatusChangeHandledEvent {
|
|
384
|
+
type: "key-status-change-handled";
|
|
385
|
+
value: { session: MediaKeySession |
|
|
386
|
+
ICustomMediaKeySession;
|
|
387
|
+
license: ILicense|null; };
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/** Emitted after the `getLicense` callback has been called */
|
|
391
|
+
interface IKeyMessageHandledEvent {
|
|
392
|
+
type: "key-message-handled";
|
|
393
|
+
value: { session: MediaKeySession |
|
|
394
|
+
ICustomMediaKeySession;
|
|
395
|
+
license: ILicense|null; };
|
|
396
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
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 { ICustomMediaKeys } from "../../compat";
|
|
18
|
+
import {
|
|
19
|
+
EncryptedMediaError,
|
|
20
|
+
ICustomError,
|
|
21
|
+
isKnownError,
|
|
22
|
+
} from "../../errors";
|
|
23
|
+
import log from "../../log";
|
|
24
|
+
import ServerCertificateStore from "./utils/server_certificate_store";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Call the setServerCertificate API with the given certificate.
|
|
28
|
+
* Resolves on success, rejects on failure.
|
|
29
|
+
*
|
|
30
|
+
* TODO Handle returned value?
|
|
31
|
+
* From the spec:
|
|
32
|
+
* - setServerCertificate resolves with true if everything worked
|
|
33
|
+
* - it resolves with false if the CDM does not support server
|
|
34
|
+
* certificates.
|
|
35
|
+
*
|
|
36
|
+
* @param {MediaKeys} mediaKeys
|
|
37
|
+
* @param {ArrayBuffer} serverCertificate
|
|
38
|
+
* @returns {Promise}
|
|
39
|
+
*/
|
|
40
|
+
async function setServerCertificate(
|
|
41
|
+
mediaKeys : ICustomMediaKeys|MediaKeys,
|
|
42
|
+
serverCertificate : BufferSource
|
|
43
|
+
) : Promise<unknown> {
|
|
44
|
+
try {
|
|
45
|
+
const res = await (mediaKeys as MediaKeys).setServerCertificate(serverCertificate);
|
|
46
|
+
// Note: Even if `setServerCertificate` technically should return a
|
|
47
|
+
// Promise.<boolean>, this is not technically always true.
|
|
48
|
+
// Thus we prefer to return unknown here.
|
|
49
|
+
return res;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
log.warn("DRM: mediaKeys.setServerCertificate returned an error", error);
|
|
52
|
+
const reason = error instanceof Error ? error.toString() :
|
|
53
|
+
"`setServerCertificate` error";
|
|
54
|
+
throw new EncryptedMediaError("LICENSE_SERVER_CERTIFICATE_ERROR", reason);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Call the setCertificate API. If it fails just emit the error as warning
|
|
60
|
+
* and complete.
|
|
61
|
+
* @param {MediaKeys} mediaKeys
|
|
62
|
+
* @param {ArrayBuffer} serverCertificate
|
|
63
|
+
* @returns {Observable}
|
|
64
|
+
*/
|
|
65
|
+
export default async function trySettingServerCertificate(
|
|
66
|
+
mediaKeys : ICustomMediaKeys|MediaKeys,
|
|
67
|
+
serverCertificate : BufferSource
|
|
68
|
+
) : Promise<{ type: "success"; value: unknown } |
|
|
69
|
+
{ type: "already-has-one" } |
|
|
70
|
+
{ type: "method-not-implemented" } |
|
|
71
|
+
{ type: "error"; value: ICustomError }> {
|
|
72
|
+
if (ServerCertificateStore.hasOne(mediaKeys) === true) {
|
|
73
|
+
log.info("DRM: The MediaKeys already has a server certificate, skipping...");
|
|
74
|
+
return { type: "already-has-one" };
|
|
75
|
+
}
|
|
76
|
+
if (typeof mediaKeys.setServerCertificate !== "function") {
|
|
77
|
+
log.warn("DRM: Could not set the server certificate." +
|
|
78
|
+
" mediaKeys.setServerCertificate is not a function");
|
|
79
|
+
return { type: "method-not-implemented" };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
log.info("DRM: Setting server certificate on the MediaKeys");
|
|
83
|
+
// Because of browser errors, or a user action that can lead to interrupting
|
|
84
|
+
// server certificate setting, we might be left in a status where we don't
|
|
85
|
+
// know if we attached the server certificate or not.
|
|
86
|
+
// Calling `prepare` allow to invalidate temporarily that status.
|
|
87
|
+
ServerCertificateStore.prepare(mediaKeys);
|
|
88
|
+
try {
|
|
89
|
+
const result = await setServerCertificate(mediaKeys, serverCertificate);
|
|
90
|
+
ServerCertificateStore.set(mediaKeys, serverCertificate);
|
|
91
|
+
return { type: "success", value: result };
|
|
92
|
+
} catch (error) {
|
|
93
|
+
const formattedErr = isKnownError(error) ?
|
|
94
|
+
error :
|
|
95
|
+
new EncryptedMediaError("LICENSE_SERVER_CERTIFICATE_ERROR",
|
|
96
|
+
"Unknown error when setting the server certificate.");
|
|
97
|
+
return { type: "error" as const, value: formattedErr };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export {
|
|
102
|
+
trySettingServerCertificate,
|
|
103
|
+
setServerCertificate,
|
|
104
|
+
};
|