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,387 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
concat as observableConcat,
|
|
20
|
-
EMPTY,
|
|
21
|
-
filter,
|
|
22
|
-
ignoreElements,
|
|
23
|
-
map,
|
|
24
|
-
merge as observableMerge,
|
|
25
|
-
mergeMap,
|
|
26
|
-
Observable,
|
|
27
|
-
of as observableOf,
|
|
28
|
-
ReplaySubject,
|
|
29
|
-
shareReplay,
|
|
30
|
-
take,
|
|
31
|
-
tap,
|
|
32
|
-
throwError,
|
|
33
|
-
} from "rxjs";
|
|
34
|
-
import {
|
|
35
|
-
events,
|
|
36
|
-
generateKeyRequest,
|
|
37
|
-
getInitData,
|
|
38
|
-
ICustomMediaKeySystemAccess,
|
|
39
|
-
} from "../../compat/";
|
|
40
|
-
import config from "../../config";
|
|
41
|
-
import { EncryptedMediaError } from "../../errors";
|
|
42
|
-
import log from "../../log";
|
|
43
|
-
import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
|
|
44
|
-
import arrayIncludes from "../../utils/array_includes";
|
|
45
|
-
import assertUnreachable from "../../utils/assert_unreachable";
|
|
46
|
-
import { concat } from "../../utils/byte_parsing";
|
|
47
|
-
import filterMap from "../../utils/filter_map";
|
|
48
|
-
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
49
|
-
import cleanOldStoredPersistentInfo from "./clean_old_stored_persistent_info";
|
|
50
|
-
import getSession from "./get_session";
|
|
51
|
-
import initMediaKeys from "./init_media_keys";
|
|
52
|
-
import SessionEventsListener, {
|
|
53
|
-
BlacklistedSessionError,
|
|
54
|
-
} from "./session_events_listener";
|
|
55
|
-
import setServerCertificate from "./set_server_certificate";
|
|
56
|
-
import {
|
|
57
|
-
IAttachedMediaKeysEvent,
|
|
58
|
-
IContentProtection,
|
|
59
|
-
IEMEManagerEvent,
|
|
60
|
-
IInitializationDataInfo,
|
|
61
|
-
IKeySystemOption,
|
|
62
|
-
IKeyUpdateValue,
|
|
63
|
-
} from "./types";
|
|
64
|
-
import InitDataStore from "./utils/init_data_store";
|
|
65
|
-
|
|
66
|
-
const { EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS,
|
|
67
|
-
EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION } = config;
|
|
68
|
-
const { onEncrypted$ } = events;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* EME abstraction used to communicate with the Content Decryption Module (or
|
|
72
|
-
* CDM) to be able to decrypt contents.
|
|
73
|
-
*
|
|
74
|
-
* The `EMEManager` can be given one or multiple key systems. It will choose the
|
|
75
|
-
* appropriate one depending on user settings and browser support.
|
|
76
|
-
* @param {HTMLMediaElement} mediaElement - The MediaElement which will be
|
|
77
|
-
* associated to a MediaKeys object
|
|
78
|
-
* @param {Array.<Object>} keySystemsConfigs - key system configuration
|
|
79
|
-
* @param {Observable} contentProtections$ - Observable emitting external
|
|
80
|
-
* initialization data.
|
|
81
|
-
* @returns {Observable}
|
|
82
|
-
*/
|
|
83
|
-
export default function EMEManager(
|
|
84
|
-
mediaElement : HTMLMediaElement,
|
|
85
|
-
keySystemsConfigs: IKeySystemOption[],
|
|
86
|
-
contentProtections$ : Observable<IContentProtection>
|
|
87
|
-
) : Observable<IEMEManagerEvent> {
|
|
88
|
-
log.debug("EME: Starting EMEManager logic.");
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Keep track of all decryption keys handled by this instance of the
|
|
92
|
-
* `EMEManager`.
|
|
93
|
-
* This allows to avoid creating multiple MediaKeySessions handling the same
|
|
94
|
-
* decryption keys.
|
|
95
|
-
*/
|
|
96
|
-
const contentSessions = new InitDataStore<{
|
|
97
|
-
/** Initialization data which triggered the creation of this session. */
|
|
98
|
-
initializationData : IInitializationDataInfo;
|
|
99
|
-
/** Last key update event received for that session. */
|
|
100
|
-
lastKeyUpdate$ : ReplaySubject<IKeyUpdateValue>;
|
|
101
|
-
}>();
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Keep track of which initialization data have been blacklisted in the
|
|
105
|
-
* current instance of the `EMEManager`.
|
|
106
|
-
* If the same initialization data is encountered again, we can directly emit
|
|
107
|
-
* the same `BlacklistedSessionError`.
|
|
108
|
-
*/
|
|
109
|
-
const blacklistedInitData = new InitDataStore<BlacklistedSessionError>();
|
|
110
|
-
|
|
111
|
-
/** Emit the MediaKeys instance and its related information when ready. */
|
|
112
|
-
const mediaKeysInit$ = initMediaKeys(mediaElement, keySystemsConfigs)
|
|
113
|
-
.pipe(
|
|
114
|
-
mergeMap((mediaKeysEvt) => {
|
|
115
|
-
if (mediaKeysEvt.type !== "attached-media-keys") {
|
|
116
|
-
return observableOf(mediaKeysEvt);
|
|
117
|
-
}
|
|
118
|
-
const { mediaKeys, options } = mediaKeysEvt.value;
|
|
119
|
-
const { serverCertificate } = options;
|
|
120
|
-
if (isNullOrUndefined(serverCertificate)) {
|
|
121
|
-
return observableOf(mediaKeysEvt);
|
|
122
|
-
}
|
|
123
|
-
return observableConcat(setServerCertificate(mediaKeys, serverCertificate),
|
|
124
|
-
observableOf(mediaKeysEvt));
|
|
125
|
-
}),
|
|
126
|
-
shareReplay()); // Share side-effects and cache success
|
|
127
|
-
|
|
128
|
-
/** Emit when the MediaKeys instance has been attached the HTMLMediaElement. */
|
|
129
|
-
const attachedMediaKeys$ : Observable<IAttachedMediaKeysEvent> = mediaKeysInit$.pipe(
|
|
130
|
-
filter((evt) : evt is IAttachedMediaKeysEvent => {
|
|
131
|
-
return evt.type === "attached-media-keys";
|
|
132
|
-
}),
|
|
133
|
-
take(1));
|
|
134
|
-
|
|
135
|
-
/** Parsed `encrypted` events coming from the HTMLMediaElement. */
|
|
136
|
-
const mediaEncryptedEvents$ = onEncrypted$(mediaElement).pipe(
|
|
137
|
-
tap(() => {
|
|
138
|
-
log.debug("EME: Encrypted event received from media element.");
|
|
139
|
-
}),
|
|
140
|
-
filterMap<MediaEncryptedEvent, IInitializationDataInfo, null>(
|
|
141
|
-
(evt) => getInitData(evt), null),
|
|
142
|
-
shareReplay({ refCount: true })); // multiple Observables listen to that one
|
|
143
|
-
// as soon as the EMEManager is subscribed
|
|
144
|
-
|
|
145
|
-
/** Encryption events coming from the `contentProtections$` argument. */
|
|
146
|
-
const externalEvents$ = contentProtections$.pipe(
|
|
147
|
-
tap(() => { log.debug("EME: Encrypted event received from Player"); }));
|
|
148
|
-
|
|
149
|
-
/** Emit events signaling that an encryption initialization data is encountered. */
|
|
150
|
-
const initializationData$ = observableMerge(externalEvents$, mediaEncryptedEvents$);
|
|
151
|
-
|
|
152
|
-
/** Create MediaKeySessions and handle the corresponding events. */
|
|
153
|
-
const bindSession$ = initializationData$.pipe(
|
|
154
|
-
|
|
155
|
-
// Add attached MediaKeys info once available
|
|
156
|
-
mergeMap((initializationData) => attachedMediaKeys$.pipe(
|
|
157
|
-
map((mediaKeysEvt) : [IInitializationDataInfo, IAttachedMediaKeysEvent] =>
|
|
158
|
-
[ initializationData, mediaKeysEvt ]))),
|
|
159
|
-
|
|
160
|
-
/* Attach server certificate and create/reuse MediaKeySession */
|
|
161
|
-
mergeMap(([initializationData, mediaKeysEvent]) => {
|
|
162
|
-
const { mediaKeySystemAccess, stores, options } = mediaKeysEvent.value;
|
|
163
|
-
|
|
164
|
-
const blacklistError = blacklistedInitData.get(initializationData);
|
|
165
|
-
if (blacklistError !== undefined) {
|
|
166
|
-
if (initializationData.type === undefined) {
|
|
167
|
-
log.error("EME: The current session has already been blacklisted " +
|
|
168
|
-
"but the current content is not known. Throwing.");
|
|
169
|
-
const { sessionError } = blacklistError;
|
|
170
|
-
sessionError.fatal = true;
|
|
171
|
-
return throwError(() => sessionError);
|
|
172
|
-
}
|
|
173
|
-
log.warn("EME: The current session has already been blacklisted. " +
|
|
174
|
-
"Blacklisting content.");
|
|
175
|
-
return observableOf({ type: "blacklist-protection-data" as const,
|
|
176
|
-
value: initializationData });
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const lastKeyUpdate$ = new ReplaySubject<IKeyUpdateValue>(1);
|
|
180
|
-
|
|
181
|
-
// First, check that this initialization data is not already handled
|
|
182
|
-
if (options.singleLicensePer === "content" && !contentSessions.isEmpty()) {
|
|
183
|
-
const keyIds = initializationData.keyIds;
|
|
184
|
-
if (keyIds === undefined) {
|
|
185
|
-
log.warn("EME: Initialization data linked to unknown key id, we'll " +
|
|
186
|
-
"not able to fallback from it.");
|
|
187
|
-
return observableOf({ type: "init-data-ignored" as const,
|
|
188
|
-
value: { initializationData } });
|
|
189
|
-
}
|
|
190
|
-
const firstSession = contentSessions.getAll()[0];
|
|
191
|
-
return firstSession.lastKeyUpdate$.pipe(mergeMap((evt) => {
|
|
192
|
-
const hasAllNeededKeyIds = keyIds.every(keyId => {
|
|
193
|
-
for (let i = 0; i < evt.whitelistedKeyIds.length; i++) {
|
|
194
|
-
if (areArraysOfNumbersEqual(evt.whitelistedKeyIds[i], keyId)) {
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
if (!hasAllNeededKeyIds) {
|
|
201
|
-
// Not all keys are available in the current session, blacklist those
|
|
202
|
-
return observableOf({ type: "keys-update" as const,
|
|
203
|
-
value: { blacklistedKeyIDs: keyIds,
|
|
204
|
-
whitelistedKeyIds: [] } });
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Already handled by the current session.
|
|
208
|
-
// Move corresponding session on top of the cache if it exists
|
|
209
|
-
const { loadedSessionsStore } = mediaKeysEvent.value.stores;
|
|
210
|
-
loadedSessionsStore.reuse(firstSession.initializationData);
|
|
211
|
-
return observableOf({ type: "init-data-ignored" as const,
|
|
212
|
-
value: { initializationData } });
|
|
213
|
-
}));
|
|
214
|
-
} else if (!contentSessions.storeIfNone(initializationData, { initializationData,
|
|
215
|
-
lastKeyUpdate$ })) {
|
|
216
|
-
log.debug("EME: Init data already received. Skipping it.");
|
|
217
|
-
return observableOf({ type: "init-data-ignored" as const,
|
|
218
|
-
value: { initializationData } });
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
let wantedSessionType : MediaKeySessionType;
|
|
222
|
-
if (options.persistentLicense !== true) {
|
|
223
|
-
wantedSessionType = "temporary";
|
|
224
|
-
} else if (!canCreatePersistentSession(mediaKeySystemAccess)) {
|
|
225
|
-
log.warn("EME: Cannot create \"persistent-license\" session: not supported");
|
|
226
|
-
wantedSessionType = "temporary";
|
|
227
|
-
} else {
|
|
228
|
-
wantedSessionType = "persistent-license";
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const maxSessionCacheSize = typeof options.maxSessionCacheSize === "number" ?
|
|
232
|
-
options.maxSessionCacheSize :
|
|
233
|
-
EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS;
|
|
234
|
-
return getSession(initializationData,
|
|
235
|
-
stores,
|
|
236
|
-
wantedSessionType,
|
|
237
|
-
maxSessionCacheSize)
|
|
238
|
-
.pipe(mergeMap((sessionEvt) => {
|
|
239
|
-
switch (sessionEvt.type) {
|
|
240
|
-
case "cleaning-old-session":
|
|
241
|
-
contentSessions.remove(sessionEvt.value.initializationData);
|
|
242
|
-
return EMPTY;
|
|
243
|
-
|
|
244
|
-
case "cleaned-old-session":
|
|
245
|
-
return EMPTY;
|
|
246
|
-
|
|
247
|
-
case "created-session":
|
|
248
|
-
case "loaded-open-session":
|
|
249
|
-
case "loaded-persistent-session":
|
|
250
|
-
// Do nothing, just to check every possibility is taken
|
|
251
|
-
break;
|
|
252
|
-
|
|
253
|
-
default: // Use TypeScript to check if all possibilities have been checked
|
|
254
|
-
assertUnreachable(sessionEvt);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
const { mediaKeySession,
|
|
258
|
-
sessionType } = sessionEvt.value;
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* We only store persistent sessions once its keys are known.
|
|
262
|
-
* This boolean allows to know if this session has already been
|
|
263
|
-
* persisted or not.
|
|
264
|
-
*/
|
|
265
|
-
let isSessionPersisted = false;
|
|
266
|
-
|
|
267
|
-
// `generateKeyRequest` awaits a single Uint8Array containing all
|
|
268
|
-
// initialization data.
|
|
269
|
-
const concatInitData = concat(...initializationData.values.map(i => i.data));
|
|
270
|
-
|
|
271
|
-
const generateRequest$ = sessionEvt.type !== "created-session" ?
|
|
272
|
-
EMPTY :
|
|
273
|
-
generateKeyRequest(mediaKeySession,
|
|
274
|
-
initializationData.type,
|
|
275
|
-
concatInitData).pipe(
|
|
276
|
-
catchError((error: unknown) => {
|
|
277
|
-
throw new EncryptedMediaError(
|
|
278
|
-
"KEY_GENERATE_REQUEST_ERROR",
|
|
279
|
-
error instanceof Error ? error.toString() :
|
|
280
|
-
"Unknown error");
|
|
281
|
-
}),
|
|
282
|
-
ignoreElements());
|
|
283
|
-
|
|
284
|
-
return observableMerge(SessionEventsListener(mediaKeySession,
|
|
285
|
-
options,
|
|
286
|
-
mediaKeySystemAccess.keySystem,
|
|
287
|
-
initializationData),
|
|
288
|
-
generateRequest$)
|
|
289
|
-
.pipe(
|
|
290
|
-
map((evt) => {
|
|
291
|
-
if (evt.type !== "keys-update") {
|
|
292
|
-
return evt;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// We want to add the current key ids in the blacklist if it is
|
|
296
|
-
// not already there.
|
|
297
|
-
//
|
|
298
|
-
// We only do that when `singleLicensePer` is set to something
|
|
299
|
-
// else than the default `"init-data"` because this logic:
|
|
300
|
-
// 1. might result in a quality fallback, which is a v3.x.x
|
|
301
|
-
// breaking change if some APIs (like `singleLicensePer`)
|
|
302
|
-
// aren't used.
|
|
303
|
-
// 2. Rely on the EME spec regarding key statuses being well
|
|
304
|
-
// implemented on all supported devices, which we're not
|
|
305
|
-
// sure yet. Because in any other `singleLicensePer`, we
|
|
306
|
-
// need a good implementation anyway, it doesn't matter
|
|
307
|
-
// there.
|
|
308
|
-
const expectedKeyIds = initializationData.keyIds;
|
|
309
|
-
if (expectedKeyIds !== undefined &&
|
|
310
|
-
options.singleLicensePer !== "init-data")
|
|
311
|
-
{
|
|
312
|
-
const missingKeyIds = expectedKeyIds.filter(expected => {
|
|
313
|
-
return (
|
|
314
|
-
!evt.value.whitelistedKeyIds.some(whitelisted =>
|
|
315
|
-
areArraysOfNumbersEqual(whitelisted, expected)) &&
|
|
316
|
-
!evt.value.blacklistedKeyIDs.some(blacklisted =>
|
|
317
|
-
areArraysOfNumbersEqual(blacklisted, expected))
|
|
318
|
-
);
|
|
319
|
-
});
|
|
320
|
-
if (missingKeyIds.length > 0) {
|
|
321
|
-
evt.value.blacklistedKeyIDs.push(...missingKeyIds) ;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
lastKeyUpdate$.next(evt.value);
|
|
326
|
-
|
|
327
|
-
if ((evt.value.whitelistedKeyIds.length === 0 &&
|
|
328
|
-
evt.value.blacklistedKeyIDs.length === 0) ||
|
|
329
|
-
sessionType === "temporary" ||
|
|
330
|
-
stores.persistentSessionsStore === null ||
|
|
331
|
-
isSessionPersisted)
|
|
332
|
-
{
|
|
333
|
-
return evt;
|
|
334
|
-
}
|
|
335
|
-
const { persistentSessionsStore } = stores;
|
|
336
|
-
cleanOldStoredPersistentInfo(
|
|
337
|
-
persistentSessionsStore,
|
|
338
|
-
EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION - 1);
|
|
339
|
-
persistentSessionsStore.add(initializationData, mediaKeySession);
|
|
340
|
-
isSessionPersisted = true;
|
|
341
|
-
|
|
342
|
-
return evt;
|
|
343
|
-
}),
|
|
344
|
-
catchError(err => {
|
|
345
|
-
if (!(err instanceof BlacklistedSessionError)) {
|
|
346
|
-
throw err;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
blacklistedInitData.store(initializationData, err);
|
|
350
|
-
|
|
351
|
-
const { sessionError } = err;
|
|
352
|
-
if (initializationData.type === undefined) {
|
|
353
|
-
log.error("EME: Current session blacklisted and content not known. " +
|
|
354
|
-
"Throwing.");
|
|
355
|
-
sessionError.fatal = true;
|
|
356
|
-
throw sessionError;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
log.warn("EME: Current session blacklisted. Blacklisting content.");
|
|
360
|
-
return observableOf({ type: "warning" as const,
|
|
361
|
-
value: sessionError },
|
|
362
|
-
{ type: "blacklist-protection-data" as const,
|
|
363
|
-
value: initializationData });
|
|
364
|
-
}));
|
|
365
|
-
}));
|
|
366
|
-
}));
|
|
367
|
-
|
|
368
|
-
return observableMerge(mediaKeysInit$,
|
|
369
|
-
mediaEncryptedEvents$
|
|
370
|
-
.pipe(map(evt => ({ type: "encrypted-event-received" as const,
|
|
371
|
-
value: evt }))),
|
|
372
|
-
bindSession$);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Returns `true` if the given MediaKeySystemAccess can create
|
|
377
|
-
* "persistent-license" MediaKeySessions.
|
|
378
|
-
* @param {MediaKeySystemAccess} mediaKeySystemAccess
|
|
379
|
-
* @returns {Boolean}
|
|
380
|
-
*/
|
|
381
|
-
function canCreatePersistentSession(
|
|
382
|
-
mediaKeySystemAccess : MediaKeySystemAccess | ICustomMediaKeySystemAccess
|
|
383
|
-
) : boolean {
|
|
384
|
-
const { sessionTypes } = mediaKeySystemAccess.getConfiguration();
|
|
385
|
-
return sessionTypes !== undefined &&
|
|
386
|
-
arrayIncludes(sessionTypes, "persistent-license");
|
|
387
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
map,
|
|
20
|
-
mergeMap,
|
|
21
|
-
Observable,
|
|
22
|
-
of as observableOf,
|
|
23
|
-
} from "rxjs";
|
|
24
|
-
import {
|
|
25
|
-
ICustomMediaKeys,
|
|
26
|
-
ICustomMediaKeySystemAccess,
|
|
27
|
-
} from "../../compat";
|
|
28
|
-
import { EncryptedMediaError } from "../../errors";
|
|
29
|
-
import log from "../../log";
|
|
30
|
-
import castToObservable from "../../utils/cast_to_observable";
|
|
31
|
-
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
32
|
-
import tryCatch from "../../utils/rx-try_catch";
|
|
33
|
-
import getMediaKeySystemAccess from "./find_key_system";
|
|
34
|
-
import MediaKeysInfosStore from "./media_keys_infos_store";
|
|
35
|
-
import ServerCertificateStore from "./server_certificate_store";
|
|
36
|
-
import {
|
|
37
|
-
IKeySystemOption,
|
|
38
|
-
IMediaKeySessionStores,
|
|
39
|
-
} from "./types";
|
|
40
|
-
import LoadedSessionsStore from "./utils/loaded_sessions_store";
|
|
41
|
-
import PersistentSessionsStore from "./utils/persistent_sessions_store";
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* @throws {EncryptedMediaError}
|
|
45
|
-
* @param {Object} keySystemOptions
|
|
46
|
-
* @returns {Object|null}
|
|
47
|
-
*/
|
|
48
|
-
function createPersistentSessionsStorage(
|
|
49
|
-
keySystemOptions : IKeySystemOption
|
|
50
|
-
) : PersistentSessionsStore|null {
|
|
51
|
-
if (keySystemOptions.persistentLicense !== true) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const { licenseStorage } = keySystemOptions;
|
|
56
|
-
if (licenseStorage == null) {
|
|
57
|
-
throw new EncryptedMediaError("INVALID_KEY_SYSTEM",
|
|
58
|
-
"No license storage found for persistent license.");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
log.debug("EME: Set the given license storage");
|
|
62
|
-
return new PersistentSessionsStore(licenseStorage);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Object returned by `getMediaKeysInfos`. */
|
|
66
|
-
export interface IMediaKeysInfos {
|
|
67
|
-
/** The MediaKeySystemAccess which allowed to create the MediaKeys instance. */
|
|
68
|
-
mediaKeySystemAccess: MediaKeySystemAccess |
|
|
69
|
-
ICustomMediaKeySystemAccess;
|
|
70
|
-
/** The MediaKeys instance. */
|
|
71
|
-
mediaKeys : MediaKeys |
|
|
72
|
-
ICustomMediaKeys;
|
|
73
|
-
/** Stores allowing to create and retrieve MediaKeySessions. */
|
|
74
|
-
stores : IMediaKeySessionStores;
|
|
75
|
-
/** IKeySystemOption compatible to the created MediaKeys instance. */
|
|
76
|
-
options : IKeySystemOption;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @param {HTMLMediaElement} mediaElement
|
|
81
|
-
* @param {Array.<Object>} keySystemsConfigs
|
|
82
|
-
* @returns {Observable}
|
|
83
|
-
*/
|
|
84
|
-
export default function getMediaKeysInfos(
|
|
85
|
-
mediaElement : HTMLMediaElement,
|
|
86
|
-
keySystemsConfigs: IKeySystemOption[]
|
|
87
|
-
) : Observable<IMediaKeysInfos> {
|
|
88
|
-
return getMediaKeySystemAccess(mediaElement, keySystemsConfigs).pipe(
|
|
89
|
-
mergeMap((evt) => {
|
|
90
|
-
const { options, mediaKeySystemAccess } = evt.value;
|
|
91
|
-
const currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
92
|
-
const persistentSessionsStore = createPersistentSessionsStorage(options);
|
|
93
|
-
|
|
94
|
-
if (currentState !== null && evt.type === "reuse-media-key-system-access") {
|
|
95
|
-
const { mediaKeys, loadedSessionsStore } = currentState;
|
|
96
|
-
|
|
97
|
-
// We might just rely on the currently attached MediaKeys instance.
|
|
98
|
-
// First check if server certificate parameters are the same than in the
|
|
99
|
-
// current MediaKeys instance. If not, re-create MediaKeys from scratch.
|
|
100
|
-
if (ServerCertificateStore.hasOne(mediaKeys) === false ||
|
|
101
|
-
(!isNullOrUndefined(options.serverCertificate) &&
|
|
102
|
-
ServerCertificateStore.has(mediaKeys, options.serverCertificate)))
|
|
103
|
-
{
|
|
104
|
-
return observableOf({ mediaKeys,
|
|
105
|
-
mediaKeySystemAccess,
|
|
106
|
-
stores: { loadedSessionsStore, persistentSessionsStore },
|
|
107
|
-
options });
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return createMediaKeys(mediaKeySystemAccess).pipe(map((mediaKeys) => {
|
|
113
|
-
log.info("EME: MediaKeys created with success");
|
|
114
|
-
const loadedSessionsStore = new LoadedSessionsStore(mediaKeys);
|
|
115
|
-
return { mediaKeys,
|
|
116
|
-
mediaKeySystemAccess,
|
|
117
|
-
stores: { loadedSessionsStore, persistentSessionsStore },
|
|
118
|
-
options };
|
|
119
|
-
}));
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Create `MediaKeys` from the `MediaKeySystemAccess` given.
|
|
125
|
-
* Throws the right formatted error if it fails.
|
|
126
|
-
* @param {MediaKeySystemAccess} mediaKeySystemAccess
|
|
127
|
-
* @returns {Observable.<MediaKeys>}
|
|
128
|
-
*/
|
|
129
|
-
function createMediaKeys(
|
|
130
|
-
mediaKeySystemAccess : MediaKeySystemAccess | ICustomMediaKeySystemAccess
|
|
131
|
-
) : Observable<MediaKeys | ICustomMediaKeys> {
|
|
132
|
-
log.info("EME: Calling createMediaKeys on the MediaKeySystemAccess");
|
|
133
|
-
return tryCatch(() => castToObservable(mediaKeySystemAccess.createMediaKeys()),
|
|
134
|
-
undefined).pipe(
|
|
135
|
-
catchError((error : unknown) : never => {
|
|
136
|
-
const message = error instanceof Error ?
|
|
137
|
-
error.message :
|
|
138
|
-
"Unknown error when creating MediaKeys.";
|
|
139
|
-
throw new EncryptedMediaError("CREATE_MEDIA_KEYS_ERROR", message);
|
|
140
|
-
}));
|
|
141
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
concat as observableConcat,
|
|
19
|
-
defer as observableDefer,
|
|
20
|
-
map,
|
|
21
|
-
mergeMap,
|
|
22
|
-
Observable,
|
|
23
|
-
of as observableOf,
|
|
24
|
-
} from "rxjs";
|
|
25
|
-
import { ICustomMediaKeySession } from "../../compat";
|
|
26
|
-
import log from "../../log";
|
|
27
|
-
import cleanOldLoadedSessions, {
|
|
28
|
-
ICleanedOldSessionEvent,
|
|
29
|
-
ICleaningOldSessionEvent,
|
|
30
|
-
} from "./clean_old_loaded_sessions";
|
|
31
|
-
import createSession from "./create_session";
|
|
32
|
-
import {
|
|
33
|
-
IInitializationDataInfo,
|
|
34
|
-
IMediaKeySessionStores,
|
|
35
|
-
} from "./types";
|
|
36
|
-
import isSessionUsable from "./utils/is_session_usable";
|
|
37
|
-
|
|
38
|
-
/** Information concerning a MediaKeySession. */
|
|
39
|
-
export interface IMediaKeySessionContext {
|
|
40
|
-
/** The MediaKeySession itself. */
|
|
41
|
-
mediaKeySession : MediaKeySession |
|
|
42
|
-
ICustomMediaKeySession;
|
|
43
|
-
/** The type of MediaKeySession (e.g. "temporary"). */
|
|
44
|
-
sessionType : MediaKeySessionType;
|
|
45
|
-
/** Initialization data assiociated to this MediaKeySession. */
|
|
46
|
-
initializationData : IInitializationDataInfo;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/** Event emitted when a new MediaKeySession has been created. */
|
|
50
|
-
export interface ICreatedSession {
|
|
51
|
-
type : "created-session";
|
|
52
|
-
value : IMediaKeySessionContext;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** Event emitted when an already-loaded MediaKeySession is used. */
|
|
56
|
-
export interface ILoadedOpenSession {
|
|
57
|
-
type : "loaded-open-session";
|
|
58
|
-
value : IMediaKeySessionContext;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Event emitted when a persistent MediaKeySession has been loaded. */
|
|
62
|
-
export interface ILoadedPersistentSessionEvent {
|
|
63
|
-
type : "loaded-persistent-session";
|
|
64
|
-
value : IMediaKeySessionContext;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/** Every possible events sent by `getSession`. */
|
|
68
|
-
export type IGetSessionEvent = ICreatedSession |
|
|
69
|
-
ILoadedOpenSession |
|
|
70
|
-
ILoadedPersistentSessionEvent |
|
|
71
|
-
ICleaningOldSessionEvent |
|
|
72
|
-
ICleanedOldSessionEvent;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Handle MediaEncryptedEvents sent by a HTMLMediaElement:
|
|
76
|
-
* Either create a MediaKeySession, recuperate a previous MediaKeySession or
|
|
77
|
-
* load a persistent session.
|
|
78
|
-
*
|
|
79
|
-
* Some previously created MediaKeySession can be closed in this process to
|
|
80
|
-
* respect the maximum limit of concurrent MediaKeySession, as defined by the
|
|
81
|
-
* `EME_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS` config property.
|
|
82
|
-
*
|
|
83
|
-
* You can refer to the events emitted to know about the current situation.
|
|
84
|
-
* @param {Event} initializationDataInfo
|
|
85
|
-
* @param {Object} handledInitData
|
|
86
|
-
* @param {Object} mediaKeysInfos
|
|
87
|
-
* @returns {Observable}
|
|
88
|
-
*/
|
|
89
|
-
export default function getSession(
|
|
90
|
-
initializationData : IInitializationDataInfo,
|
|
91
|
-
stores : IMediaKeySessionStores,
|
|
92
|
-
wantedSessionType : MediaKeySessionType,
|
|
93
|
-
maxSessionCacheSize : number
|
|
94
|
-
) : Observable<IGetSessionEvent> {
|
|
95
|
-
return observableDefer(() : Observable<IGetSessionEvent> => {
|
|
96
|
-
/**
|
|
97
|
-
* Store previously-loaded MediaKeySession with the same initialization data, if one.
|
|
98
|
-
*/
|
|
99
|
-
let previousLoadedSession : MediaKeySession |
|
|
100
|
-
ICustomMediaKeySession |
|
|
101
|
-
null = null;
|
|
102
|
-
|
|
103
|
-
const { loadedSessionsStore, persistentSessionsStore } = stores;
|
|
104
|
-
const entry = loadedSessionsStore.getAndReuse(initializationData);
|
|
105
|
-
if (entry !== null) {
|
|
106
|
-
previousLoadedSession = entry.mediaKeySession;
|
|
107
|
-
if (isSessionUsable(previousLoadedSession)) {
|
|
108
|
-
log.info("EME: Reuse loaded session", previousLoadedSession.sessionId);
|
|
109
|
-
return observableOf({ type: "loaded-open-session" as const,
|
|
110
|
-
value: { mediaKeySession: previousLoadedSession,
|
|
111
|
-
sessionType: entry.sessionType,
|
|
112
|
-
initializationData } });
|
|
113
|
-
} else if (persistentSessionsStore !== null) {
|
|
114
|
-
// If the session is not usable anymore, we can also remove it from the
|
|
115
|
-
// PersistentSessionsStore.
|
|
116
|
-
// TODO Are we sure this is always what we want?
|
|
117
|
-
persistentSessionsStore.delete(initializationData);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return (previousLoadedSession != null ?
|
|
122
|
-
loadedSessionsStore.closeSession(initializationData) :
|
|
123
|
-
observableOf(null)
|
|
124
|
-
).pipe(mergeMap(() => {
|
|
125
|
-
return observableConcat(
|
|
126
|
-
cleanOldLoadedSessions(loadedSessionsStore, maxSessionCacheSize),
|
|
127
|
-
createSession(stores, initializationData, wantedSessionType)
|
|
128
|
-
.pipe(map((evt) => ({ type: evt.type,
|
|
129
|
-
value: { mediaKeySession: evt.value.mediaKeySession,
|
|
130
|
-
sessionType: evt.value.sessionType,
|
|
131
|
-
initializationData } })))
|
|
132
|
-
);
|
|
133
|
-
}));
|
|
134
|
-
});
|
|
135
|
-
}
|