rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.2022032100
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/.eslintrc.js +0 -4
- package/CHANGELOG.md +17 -2
- 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 +143 -36
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.d.ts +15 -0
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.js +1 -17
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +6 -7
- 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 +20 -22
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +58 -40
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +49 -48
- 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 +67 -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/network_analyzer.js +2 -1
- 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.js +2 -1
- package/dist/_esm5.processed/core/api/option_utils.d.ts +6 -3
- package/dist/_esm5.processed/core/api/option_utils.js +21 -7
- 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 +73 -35
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
- package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +103 -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 +40 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +865 -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 +173 -0
- package/dist/_esm5.processed/core/{eme/dispose_media_keys.d.ts → decrypt/dispose_decryption_resources.d.ts} +4 -4
- 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 +299 -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 +119 -241
- 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 +84 -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 +302 -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.js +3 -5
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
- 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 +2 -3
- package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +6 -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.js +2 -1
- package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
- 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.js +3 -1
- 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/index.d.ts +1 -0
- 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.d.ts +15 -11
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +6 -3
- package/dist/_esm5.processed/core/stream/period/index.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +5 -12
- package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
- 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/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.js +6 -7
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +2 -3
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +15 -0
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +3 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +3 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -2
- 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/manifest.d.ts +1 -14
- package/dist/_esm5.processed/manifest/manifest.js +10 -74
- package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +4 -5
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +4 -3
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +60 -11
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +3 -4
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -3
- 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/pipelines.js +2 -3
- package/dist/_esm5.processed/transports/smooth/pipelines.js +71 -14
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -4
- package/dist/_esm5.processed/transports/types.d.ts +22 -0
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -2
- package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -2
- package/dist/_esm5.processed/utils/cast_to_observable.js +1 -3
- 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.js +1 -2
- package/dist/_esm5.processed/utils/request/xhr.js +2 -3
- 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 +4936 -3340
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/utils/promise.d.ts → experimental/index.d.ts} +1 -2
- package/{dist/_esm5.processed/utils/promise.js → experimental/index.js} +1 -3
- package/package.json +32 -35
- package/{src/typings/pinkie.d.ts → scripts/build/templates/experimental/index.d.ts} +1 -4
- package/scripts/build/templates/experimental/index.js +16 -0
- package/scripts/update-version +2 -2
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/play.test.ts +2 -4
- 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 +89 -56
- package/src/compat/eme/custom_key_system_access.ts +1 -2
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +6 -7
- package/src/compat/eme/custom_media_keys/index.ts +20 -38
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +68 -52
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +57 -56
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +28 -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/bandwidth_estimator.ts +4 -4
- package/src/core/abr/network_analyzer.ts +5 -6
- package/src/core/api/__tests__/get_player_state.test.ts +3 -3
- package/src/core/api/__tests__/option_utils.test.ts +29 -17
- package/src/core/api/get_player_state.ts +1 -1
- package/src/core/api/index.ts +3 -0
- package/src/core/api/option_utils.ts +42 -23
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +152 -113
- 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 +31 -93
- package/src/core/{eme → decrypt}/attach_media_keys.ts +48 -56
- package/src/core/decrypt/clear_on_stop.ts +47 -0
- package/src/core/decrypt/content_decryptor.ts +1157 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +174 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +111 -122
- 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 +128 -258
- 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} +19 -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 +317 -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 +5 -7
- package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +2 -3
- 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 +17 -20
- package/src/core/init/initialize_media_source.ts +44 -106
- package/src/core/init/link_drm_and_content.ts +176 -0
- package/src/core/init/manifest_update_scheduler.ts +5 -3
- package/src/core/init/stall_avoider.ts +6 -5
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
- 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 +3 -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/index.ts +1 -0
- 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 +25 -15
- package/src/core/stream/period/index.ts +1 -0
- package/src/core/stream/period/period_stream.ts +10 -16
- package/src/core/stream/representation/force_garbage_collection.ts +2 -2
- 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/experimental/index.ts +5 -0
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +7 -7
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +9 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +2 -4
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +2 -3
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +3 -5
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +3 -5
- package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.ts +1 -2
- 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/manifest.ts +6 -76
- package/src/manifest/representation.ts +36 -3
- package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
- package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +4 -5
- package/src/parsers/manifest/smooth/create_parser.ts +1 -0
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
- package/src/public_types.ts +6 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +1 -2
- package/src/transports/dash/image_pipelines.ts +15 -14
- package/src/transports/dash/init_segment_loader.ts +1 -2
- package/src/transports/dash/manifest_parser.ts +2 -3
- package/src/transports/dash/segment_loader.ts +4 -5
- package/src/transports/dash/segment_parser.ts +5 -0
- package/src/transports/dash/text_loader.ts +2 -3
- package/src/transports/dash/text_parser.ts +8 -0
- package/src/transports/local/segment_loader.ts +2 -3
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/metaplaylist/pipelines.ts +2 -3
- package/src/transports/smooth/pipelines.ts +26 -14
- package/src/transports/smooth/segment_loader.ts +5 -6
- package/src/transports/types.ts +22 -0
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -2
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/cancellable_sleep.ts +1 -2
- package/src/utils/cast_to_observable.ts +0 -2
- package/src/utils/deep_merge.ts +46 -0
- package/src/utils/reference.ts +116 -23
- package/src/utils/request/fetch.ts +1 -2
- package/src/utils/request/xhr.ts +3 -3
- package/src/utils/rx-from_cancellable_promise.ts +7 -2
- package/src/utils/task_canceller.ts +6 -4
- package/tsconfig.json +0 -1
- package/tsconfig.modules.json +0 -1
- 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.d.ts +0 -19
- 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 -253
- 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/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
- package/src/utils/__tests__/promise.test.ts +0 -23
- package/src/utils/promise.ts +0 -20
|
@@ -0,0 +1,130 @@
|
|
|
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 { ICustomMediaKeySession } from "../../compat";
|
|
18
|
+
import log from "../../log";
|
|
19
|
+
import { CancellationSignal } from "../../utils/task_canceller";
|
|
20
|
+
import createSession from "./create_session";
|
|
21
|
+
import {
|
|
22
|
+
IProcessedProtectionData,
|
|
23
|
+
IMediaKeySessionStores,
|
|
24
|
+
MediaKeySessionLoadingType,
|
|
25
|
+
} from "./types";
|
|
26
|
+
import cleanOldLoadedSessions from "./utils/clean_old_loaded_sessions";
|
|
27
|
+
import isSessionUsable from "./utils/is_session_usable";
|
|
28
|
+
import KeySessionRecord from "./utils/key_session_record";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Handle MediaEncryptedEvents sent by a HTMLMediaElement:
|
|
32
|
+
* Either create a MediaKeySession, recuperate a previous MediaKeySession or
|
|
33
|
+
* load a persistent session.
|
|
34
|
+
*
|
|
35
|
+
* Some previously created MediaKeySession can be closed in this process to
|
|
36
|
+
* respect the maximum limit of concurrent MediaKeySession, as defined by the
|
|
37
|
+
* `EME_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS` config property.
|
|
38
|
+
*
|
|
39
|
+
* You can refer to the events emitted to know about the current situation.
|
|
40
|
+
* @param {Object} initializationData
|
|
41
|
+
* @param {Object} stores
|
|
42
|
+
* @param {string} wantedSessionType
|
|
43
|
+
* @param {number} maxSessionCacheSize
|
|
44
|
+
* @param {Object} cancelSignal
|
|
45
|
+
* @returns {Promise}
|
|
46
|
+
*/
|
|
47
|
+
export default async function createOrLoadSession(
|
|
48
|
+
initializationData : IProcessedProtectionData,
|
|
49
|
+
stores : IMediaKeySessionStores,
|
|
50
|
+
wantedSessionType : MediaKeySessionType,
|
|
51
|
+
maxSessionCacheSize : number,
|
|
52
|
+
cancelSignal : CancellationSignal
|
|
53
|
+
) : Promise<ICreateOrLoadSessionResult> {
|
|
54
|
+
/** Store previously-loaded compatible MediaKeySession, if one. */
|
|
55
|
+
let previousLoadedSession : MediaKeySession |
|
|
56
|
+
ICustomMediaKeySession |
|
|
57
|
+
null = null;
|
|
58
|
+
|
|
59
|
+
const { loadedSessionsStore, persistentSessionsStore } = stores;
|
|
60
|
+
const entry = loadedSessionsStore.reuse(initializationData);
|
|
61
|
+
if (entry !== null) {
|
|
62
|
+
previousLoadedSession = entry.mediaKeySession;
|
|
63
|
+
if (isSessionUsable(previousLoadedSession)) {
|
|
64
|
+
log.info("DRM: Reuse loaded session", previousLoadedSession.sessionId);
|
|
65
|
+
return { type: MediaKeySessionLoadingType.LoadedOpenSession,
|
|
66
|
+
value: { mediaKeySession: previousLoadedSession,
|
|
67
|
+
sessionType: entry.sessionType,
|
|
68
|
+
keySessionRecord: entry.keySessionRecord } };
|
|
69
|
+
} else if (persistentSessionsStore !== null) {
|
|
70
|
+
// If the session is not usable anymore, we can also remove it from the
|
|
71
|
+
// PersistentSessionsStore.
|
|
72
|
+
// TODO Are we sure this is always what we want?
|
|
73
|
+
if (entry.mediaKeySession.sessionId !== "") {
|
|
74
|
+
persistentSessionsStore.delete(entry.mediaKeySession.sessionId);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (previousLoadedSession !== null) {
|
|
80
|
+
await loadedSessionsStore.closeSession(previousLoadedSession);
|
|
81
|
+
if (cancelSignal.cancellationError !== null) {
|
|
82
|
+
throw cancelSignal.cancellationError; // stop here if cancelled since
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
await cleanOldLoadedSessions(loadedSessionsStore, maxSessionCacheSize);
|
|
87
|
+
if (cancelSignal.cancellationError !== null) {
|
|
88
|
+
throw cancelSignal.cancellationError; // stop here if cancelled since
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const evt = await createSession(stores, initializationData, wantedSessionType);
|
|
92
|
+
return { type: evt.type,
|
|
93
|
+
value: { mediaKeySession: evt.value.mediaKeySession,
|
|
94
|
+
sessionType: evt.value.sessionType,
|
|
95
|
+
keySessionRecord: evt.value.keySessionRecord } };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Information concerning a MediaKeySession. */
|
|
99
|
+
export interface IMediaKeySessionContext {
|
|
100
|
+
/** The MediaKeySession itself. */
|
|
101
|
+
mediaKeySession : MediaKeySession |
|
|
102
|
+
ICustomMediaKeySession;
|
|
103
|
+
/** The type of MediaKeySession (e.g. "temporary"). */
|
|
104
|
+
sessionType : MediaKeySessionType;
|
|
105
|
+
/** `KeySessionRecord` assiociated to this MediaKeySession. */
|
|
106
|
+
keySessionRecord : KeySessionRecord;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Event emitted when a new MediaKeySession has been created. */
|
|
110
|
+
export interface ICreatedSession {
|
|
111
|
+
type : MediaKeySessionLoadingType.Created;
|
|
112
|
+
value : IMediaKeySessionContext;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Event emitted when an already-loaded MediaKeySession is used. */
|
|
116
|
+
export interface ILoadedOpenSession {
|
|
117
|
+
type : MediaKeySessionLoadingType.LoadedOpenSession;
|
|
118
|
+
value : IMediaKeySessionContext;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Event emitted when a persistent MediaKeySession has been loaded. */
|
|
122
|
+
export interface ILoadedPersistentSessionEvent {
|
|
123
|
+
type : MediaKeySessionLoadingType.LoadedPersistentSession;
|
|
124
|
+
value : IMediaKeySessionContext;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Every possible result returned by `createOrLoadSession`. */
|
|
128
|
+
export type ICreateOrLoadSessionResult = ICreatedSession |
|
|
129
|
+
ILoadedOpenSession |
|
|
130
|
+
ILoadedPersistentSessionEvent;
|
|
@@ -0,0 +1,174 @@
|
|
|
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
|
+
ICustomMediaKeySession,
|
|
19
|
+
loadSession,
|
|
20
|
+
} from "../../compat";
|
|
21
|
+
import log from "../../log";
|
|
22
|
+
import {
|
|
23
|
+
IProcessedProtectionData,
|
|
24
|
+
IMediaKeySessionStores,
|
|
25
|
+
MediaKeySessionLoadingType,
|
|
26
|
+
} from "./types";
|
|
27
|
+
import isSessionUsable from "./utils/is_session_usable";
|
|
28
|
+
import KeySessionRecord from "./utils/key_session_record";
|
|
29
|
+
import LoadedSessionsStore from "./utils/loaded_sessions_store";
|
|
30
|
+
import PersistentSessionsStore from "./utils/persistent_sessions_store";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Create a new Session or load a persistent one on the given MediaKeys,
|
|
34
|
+
* according to wanted settings and what is currently stored.
|
|
35
|
+
*
|
|
36
|
+
* If session creating fails, remove the oldest MediaKeySession loaded and
|
|
37
|
+
* retry.
|
|
38
|
+
*
|
|
39
|
+
* /!\ This only creates new sessions.
|
|
40
|
+
* It will fail if loadedSessionsStore already has a MediaKeySession with
|
|
41
|
+
* the given initialization data.
|
|
42
|
+
* @param {Object} stores
|
|
43
|
+
* @param {Object} initData
|
|
44
|
+
* @param {string} wantedSessionType
|
|
45
|
+
* @returns {Promise}
|
|
46
|
+
*/
|
|
47
|
+
export default function createSession(
|
|
48
|
+
stores : IMediaKeySessionStores,
|
|
49
|
+
initData : IProcessedProtectionData,
|
|
50
|
+
wantedSessionType : MediaKeySessionType
|
|
51
|
+
) : Promise<ICreateSessionEvent> {
|
|
52
|
+
const { loadedSessionsStore,
|
|
53
|
+
persistentSessionsStore } = stores;
|
|
54
|
+
|
|
55
|
+
if (wantedSessionType === "temporary") {
|
|
56
|
+
return createTemporarySession(loadedSessionsStore, initData);
|
|
57
|
+
} else if (persistentSessionsStore === null) {
|
|
58
|
+
log.warn("DRM: Cannot create persistent MediaKeySession, " +
|
|
59
|
+
"PersistentSessionsStore not created.");
|
|
60
|
+
return createTemporarySession(loadedSessionsStore, initData);
|
|
61
|
+
}
|
|
62
|
+
return createAndTryToRetrievePersistentSession(loadedSessionsStore,
|
|
63
|
+
persistentSessionsStore,
|
|
64
|
+
initData);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create a new temporary MediaKeySession linked to the given initData and
|
|
69
|
+
* initDataType.
|
|
70
|
+
* @param {Object} loadedSessionsStore
|
|
71
|
+
* @param {Object} initData
|
|
72
|
+
* @returns {Promise}
|
|
73
|
+
*/
|
|
74
|
+
function createTemporarySession(
|
|
75
|
+
loadedSessionsStore : LoadedSessionsStore,
|
|
76
|
+
initData : IProcessedProtectionData
|
|
77
|
+
) : Promise<INewSessionCreatedEvent> {
|
|
78
|
+
log.info("DRM: Creating a new temporary session");
|
|
79
|
+
const entry = loadedSessionsStore.createSession(initData, "temporary");
|
|
80
|
+
return Promise.resolve({ type: MediaKeySessionLoadingType.Created,
|
|
81
|
+
value: entry });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Create a persistent MediaKeySession and try to load on it a previous
|
|
86
|
+
* MediaKeySession linked to the same initialization data.
|
|
87
|
+
* @param {Object} loadedSessionsStore
|
|
88
|
+
* @param {Object} persistentSessionsStore
|
|
89
|
+
* @param {Object} initData
|
|
90
|
+
* @returns {Promise}
|
|
91
|
+
*/
|
|
92
|
+
async function createAndTryToRetrievePersistentSession(
|
|
93
|
+
loadedSessionsStore : LoadedSessionsStore,
|
|
94
|
+
persistentSessionsStore : PersistentSessionsStore,
|
|
95
|
+
initData : IProcessedProtectionData
|
|
96
|
+
) : Promise<INewSessionCreatedEvent | IPersistentSessionRecoveryEvent> {
|
|
97
|
+
log.info("DRM: Creating persistent MediaKeySession");
|
|
98
|
+
|
|
99
|
+
const entry = loadedSessionsStore.createSession(initData, "persistent-license");
|
|
100
|
+
const storedEntry = persistentSessionsStore.getAndReuse(initData);
|
|
101
|
+
if (storedEntry === null) {
|
|
102
|
+
return { type: MediaKeySessionLoadingType.Created,
|
|
103
|
+
value: entry };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
const hasLoadedSession = await loadSession(entry.mediaKeySession,
|
|
108
|
+
storedEntry.sessionId);
|
|
109
|
+
if (!hasLoadedSession) {
|
|
110
|
+
log.warn("DRM: No data stored for the loaded session");
|
|
111
|
+
persistentSessionsStore.delete(storedEntry.sessionId);
|
|
112
|
+
return { type: MediaKeySessionLoadingType.Created,
|
|
113
|
+
value: entry };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (hasLoadedSession && isSessionUsable(entry.mediaKeySession)) {
|
|
117
|
+
persistentSessionsStore.add(initData, initData.keyIds, entry.mediaKeySession);
|
|
118
|
+
log.info("DRM: Succeeded to load persistent session.");
|
|
119
|
+
return { type: MediaKeySessionLoadingType.LoadedPersistentSession,
|
|
120
|
+
value: entry };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Unusable persistent session: recreate a new session from scratch.
|
|
124
|
+
log.warn("DRM: Previous persistent session not usable anymore.");
|
|
125
|
+
return recreatePersistentSession();
|
|
126
|
+
} catch (err) {
|
|
127
|
+
log.warn("DRM: Unable to load persistent session: " +
|
|
128
|
+
(err instanceof Error ? err.toString() :
|
|
129
|
+
"Unknown Error"));
|
|
130
|
+
return recreatePersistentSession();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Helper function to close and restart the current persistent session
|
|
135
|
+
* considered, and re-create it from scratch.
|
|
136
|
+
* @returns {Observable}
|
|
137
|
+
*/
|
|
138
|
+
async function recreatePersistentSession() : Promise<INewSessionCreatedEvent> {
|
|
139
|
+
log.info("DRM: Removing previous persistent session.");
|
|
140
|
+
const persistentEntry = persistentSessionsStore.get(initData);
|
|
141
|
+
if (persistentEntry !== null) {
|
|
142
|
+
persistentSessionsStore.delete(persistentEntry.sessionId);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
await loadedSessionsStore.closeSession(entry.mediaKeySession);
|
|
146
|
+
const newEntry = loadedSessionsStore.createSession(initData,
|
|
147
|
+
"persistent-license");
|
|
148
|
+
return { type: MediaKeySessionLoadingType.Created,
|
|
149
|
+
value: newEntry };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface INewSessionCreatedEvent {
|
|
154
|
+
type : MediaKeySessionLoadingType.Created;
|
|
155
|
+
value : {
|
|
156
|
+
mediaKeySession : MediaKeySession |
|
|
157
|
+
ICustomMediaKeySession;
|
|
158
|
+
sessionType : MediaKeySessionType;
|
|
159
|
+
keySessionRecord : KeySessionRecord;
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface IPersistentSessionRecoveryEvent {
|
|
164
|
+
type : MediaKeySessionLoadingType.LoadedPersistentSession;
|
|
165
|
+
value : {
|
|
166
|
+
mediaKeySession : MediaKeySession |
|
|
167
|
+
ICustomMediaKeySession;
|
|
168
|
+
sessionType : MediaKeySessionType;
|
|
169
|
+
keySessionRecord : KeySessionRecord;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export type ICreateSessionEvent = INewSessionCreatedEvent |
|
|
174
|
+
IPersistentSessionRecoveryEvent;
|
|
@@ -0,0 +1,39 @@
|
|
|
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 { setMediaKeys } from "../../compat";
|
|
18
|
+
import log from "../../log";
|
|
19
|
+
import MediaKeysInfosStore from "./utils/media_keys_infos_store";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Free up all ressources taken by the content decryption logic.
|
|
23
|
+
* @param {HTMLMediaElement} mediaElement
|
|
24
|
+
* @returns {Promise}
|
|
25
|
+
*/
|
|
26
|
+
export default async function disposeDecryptionResources(
|
|
27
|
+
mediaElement : HTMLMediaElement
|
|
28
|
+
) : Promise<void> {
|
|
29
|
+
const currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
30
|
+
if (currentState === null) {
|
|
31
|
+
return ;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
log.info("DRM: Disposing of the current MediaKeys");
|
|
35
|
+
const { loadedSessionsStore } = currentState;
|
|
36
|
+
MediaKeysInfosStore.clearState(mediaElement);
|
|
37
|
+
await loadedSessionsStore.closeAllSessions();
|
|
38
|
+
setMediaKeys(mediaElement, null);
|
|
39
|
+
}
|
|
@@ -14,14 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
defer as observableDefer,
|
|
20
|
-
map,
|
|
21
|
-
Observable,
|
|
22
|
-
of as observableOf,
|
|
23
|
-
throwError as observableThrow,
|
|
24
|
-
} from "rxjs";
|
|
25
17
|
import {
|
|
26
18
|
ICustomMediaKeySystemAccess,
|
|
27
19
|
requestMediaKeySystemAccess,
|
|
@@ -32,8 +24,9 @@ import { EncryptedMediaError } from "../../errors";
|
|
|
32
24
|
import log from "../../log";
|
|
33
25
|
import arrayIncludes from "../../utils/array_includes";
|
|
34
26
|
import flatMap from "../../utils/flat_map";
|
|
35
|
-
import
|
|
27
|
+
import { CancellationSignal } from "../../utils/task_canceller";
|
|
36
28
|
import { IKeySystemOption } from "./types";
|
|
29
|
+
import MediaKeysInfosStore from "./utils/media_keys_infos_store";
|
|
37
30
|
|
|
38
31
|
type MediaKeysRequirement = "optional" |
|
|
39
32
|
"required" |
|
|
@@ -65,8 +58,6 @@ interface IKeySystemType { keyName : string | undefined;
|
|
|
65
58
|
keyType : string;
|
|
66
59
|
keySystemOptions : IKeySystemOption; }
|
|
67
60
|
|
|
68
|
-
const { EME_DEFAULT_WIDEVINE_ROBUSTNESSES,
|
|
69
|
-
EME_KEY_SYSTEMS } = config;
|
|
70
61
|
|
|
71
62
|
/**
|
|
72
63
|
* @param {Array.<Object>} keySystems
|
|
@@ -121,6 +112,7 @@ function checkCachedMediaKeySystemAccess(
|
|
|
121
112
|
* @returns {string|undefined} - Either the canonical name, or undefined.
|
|
122
113
|
*/
|
|
123
114
|
function findKeySystemCanonicalName(ksType: string) : string | undefined {
|
|
115
|
+
const { EME_KEY_SYSTEMS } = config.getCurrent();
|
|
124
116
|
for (const ksName of Object.keys(EME_KEY_SYSTEMS)) {
|
|
125
117
|
if (arrayIncludes(EME_KEY_SYSTEMS[ksName] as string[], ksType)) {
|
|
126
118
|
return ksName;
|
|
@@ -158,6 +150,7 @@ function buildKeySystemConfigurations(
|
|
|
158
150
|
if (keySystem.distinctiveIdentifierRequired === true) {
|
|
159
151
|
distinctiveIdentifier = "required";
|
|
160
152
|
}
|
|
153
|
+
const { EME_DEFAULT_WIDEVINE_ROBUSTNESSES } = config.getCurrent();
|
|
161
154
|
|
|
162
155
|
// Set robustness, in order of consideration:
|
|
163
156
|
// 1. the user specified its own robustnesses
|
|
@@ -235,128 +228,124 @@ function buildKeySystemConfigurations(
|
|
|
235
228
|
/**
|
|
236
229
|
* Try to find a compatible key system from the keySystems array given.
|
|
237
230
|
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
* keySystem {Object}
|
|
246
|
-
* }
|
|
247
|
-
* - complete immediately after emitting.
|
|
248
|
-
* - throw if no compatible key system has been found.
|
|
231
|
+
* This function will request a MediaKeySystemAccess based on the various
|
|
232
|
+
* keySystems provided.
|
|
233
|
+
*
|
|
234
|
+
* This Promise might either:
|
|
235
|
+
* - resolves the MediaKeySystemAccess and the keySystems as an object, when
|
|
236
|
+
* found.
|
|
237
|
+
* - reject if no compatible key system has been found.
|
|
249
238
|
*
|
|
250
239
|
* @param {HTMLMediaElement} mediaElement
|
|
251
240
|
* @param {Array.<Object>} keySystems - The keySystems you want to test.
|
|
252
|
-
* @
|
|
241
|
+
* @param {Object} cancelSignal
|
|
242
|
+
* @returns {Promise.<Object>}
|
|
253
243
|
*/
|
|
254
244
|
export default function getMediaKeySystemAccess(
|
|
255
245
|
mediaElement : HTMLMediaElement,
|
|
256
|
-
keySystemsConfigs: IKeySystemOption[]
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
246
|
+
keySystemsConfigs: IKeySystemOption[],
|
|
247
|
+
cancelSignal : CancellationSignal
|
|
248
|
+
) : Promise<IFoundMediaKeySystemAccessEvent> {
|
|
249
|
+
log.info("DRM: Searching for compatible MediaKeySystemAccess");
|
|
250
|
+
const currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
251
|
+
if (currentState != null) {
|
|
252
|
+
// Fast way to find a compatible keySystem if the currently loaded
|
|
253
|
+
// one as exactly the same compatibility options.
|
|
254
|
+
const cachedKeySystemAccess =
|
|
255
|
+
checkCachedMediaKeySystemAccess(keySystemsConfigs,
|
|
256
|
+
currentState.mediaKeySystemAccess,
|
|
257
|
+
currentState.keySystemOptions);
|
|
258
|
+
if (cachedKeySystemAccess !== null) {
|
|
259
|
+
log.info("DRM: Found cached compatible keySystem");
|
|
260
|
+
return Promise.resolve({
|
|
261
|
+
type: "reuse-media-key-system-access" as const,
|
|
262
|
+
value: { mediaKeySystemAccess: cachedKeySystemAccess.keySystemAccess,
|
|
263
|
+
options: cachedKeySystemAccess.keySystemOptions },
|
|
264
|
+
});
|
|
276
265
|
}
|
|
266
|
+
}
|
|
277
267
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
const keyName = findKeySystemCanonicalName(keySystemOptions.type);
|
|
300
|
-
const keyType = keySystemOptions.type;
|
|
301
|
-
ksType = [{ keyName, keyType, keySystemOptions }];
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
return arr.concat(ksType);
|
|
268
|
+
/**
|
|
269
|
+
* Array of set keySystems for this content.
|
|
270
|
+
* Each item of this array is an object containing the following keys:
|
|
271
|
+
* - keyName {string}: keySystem canonical name (e.g. "widevine")
|
|
272
|
+
* - keyType {string}: keySystem type (e.g. "com.widevine.alpha")
|
|
273
|
+
* - keySystem {Object}: the original keySystem object
|
|
274
|
+
* @type {Array.<Object>}
|
|
275
|
+
*/
|
|
276
|
+
const keySystemsType: IKeySystemType[] = keySystemsConfigs.reduce(
|
|
277
|
+
(arr: IKeySystemType[], keySystemOptions) => {
|
|
278
|
+
|
|
279
|
+
const { EME_KEY_SYSTEMS } = config.getCurrent();
|
|
280
|
+
const managedRDNs = EME_KEY_SYSTEMS[keySystemOptions.type];
|
|
281
|
+
let ksType;
|
|
282
|
+
|
|
283
|
+
if (managedRDNs != null) {
|
|
284
|
+
ksType = managedRDNs.map((keyType) => {
|
|
285
|
+
const keyName = keySystemOptions.type;
|
|
286
|
+
return { keyName, keyType, keySystemOptions };
|
|
287
|
+
});
|
|
305
288
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* Test all key system configuration stored in `keySystemsType` one by one
|
|
312
|
-
* recursively.
|
|
313
|
-
* Returns an Observable which emit the MediaKeySystemAccess if one was
|
|
314
|
-
* found compatible with one of the configurations or just throws if none
|
|
315
|
-
* were found to be compatible.
|
|
316
|
-
* @param {Number} index - The index in `keySystemsType` to start from.
|
|
317
|
-
* Should be set to `0` when calling directly.
|
|
318
|
-
* @returns {Observable}
|
|
319
|
-
*/
|
|
320
|
-
function recursivelyTestKeySystems(
|
|
321
|
-
index : number
|
|
322
|
-
) : Observable<IFoundMediaKeySystemAccessEvent> {
|
|
323
|
-
// if we iterated over the whole keySystemsType Array, quit on error
|
|
324
|
-
if (index >= keySystemsType.length) {
|
|
325
|
-
const error = new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS",
|
|
326
|
-
"No key system compatible with your " +
|
|
327
|
-
"wanted configuration has been found " +
|
|
328
|
-
"in the current browser.");
|
|
329
|
-
return observableThrow(() => error);
|
|
289
|
+
else {
|
|
290
|
+
const keyName = findKeySystemCanonicalName(keySystemOptions.type);
|
|
291
|
+
const keyType = keySystemOptions.type;
|
|
292
|
+
ksType = [{ keyName, keyType, keySystemOptions }];
|
|
330
293
|
}
|
|
331
294
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
295
|
+
return arr.concat(ksType);
|
|
296
|
+
}
|
|
297
|
+
, []);
|
|
298
|
+
|
|
299
|
+
return recursivelyTestKeySystems(0);
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Test all key system configuration stored in `keySystemsType` one by one
|
|
303
|
+
* recursively.
|
|
304
|
+
* Returns a Promise which will emit the MediaKeySystemAccess if one was
|
|
305
|
+
* found compatible with one of the configurations or just reject if none
|
|
306
|
+
* were found to be compatible.
|
|
307
|
+
* @param {Number} index - The index in `keySystemsType` to start from.
|
|
308
|
+
* Should be set to `0` when calling directly.
|
|
309
|
+
* @returns {Promise.<Object>}
|
|
310
|
+
*/
|
|
311
|
+
async function recursivelyTestKeySystems(
|
|
312
|
+
index : number
|
|
313
|
+
) : Promise<IFoundMediaKeySystemAccessEvent> {
|
|
314
|
+
// if we iterated over the whole keySystemsType Array, quit on error
|
|
315
|
+
if (index >= keySystemsType.length) {
|
|
316
|
+
throw new EncryptedMediaError("INCOMPATIBLE_KEYSYSTEMS",
|
|
317
|
+
"No key system compatible with your wanted " +
|
|
318
|
+
"configuration has been found in the current " +
|
|
319
|
+
"browser.");
|
|
320
|
+
|
|
321
|
+
}
|
|
337
322
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
const keySystemConfigurations = buildKeySystemConfigurations(keyName,
|
|
341
|
-
keySystemOptions);
|
|
342
|
-
|
|
343
|
-
log.debug(`EME: Request keysystem access ${keyType},` +
|
|
344
|
-
`${index + 1} of ${keySystemsType.length}`,
|
|
345
|
-
keySystemConfigurations);
|
|
346
|
-
|
|
347
|
-
return requestMediaKeySystemAccess(keyType, keySystemConfigurations).pipe(
|
|
348
|
-
map((keySystemAccess) => {
|
|
349
|
-
log.info("EME: Found compatible keysystem", keyType, keySystemConfigurations);
|
|
350
|
-
return { type: "create-media-key-system-access" as const,
|
|
351
|
-
value: { options: keySystemOptions,
|
|
352
|
-
mediaKeySystemAccess: keySystemAccess } };
|
|
353
|
-
}),
|
|
354
|
-
catchError(() => {
|
|
355
|
-
log.debug("EME: Rejected access to keysystem",
|
|
356
|
-
keyType,
|
|
357
|
-
keySystemConfigurations);
|
|
358
|
-
return recursivelyTestKeySystems(index + 1);
|
|
359
|
-
}));
|
|
323
|
+
if (requestMediaKeySystemAccess == null) {
|
|
324
|
+
throw new Error("requestMediaKeySystemAccess is not implemented in your browser.");
|
|
360
325
|
}
|
|
361
|
-
|
|
326
|
+
|
|
327
|
+
const { keyName, keyType, keySystemOptions } = keySystemsType[index];
|
|
328
|
+
|
|
329
|
+
const keySystemConfigurations = buildKeySystemConfigurations(keyName,
|
|
330
|
+
keySystemOptions);
|
|
331
|
+
|
|
332
|
+
log.debug(`DRM: Request keysystem access ${keyType},` +
|
|
333
|
+
`${index + 1} of ${keySystemsType.length}`,
|
|
334
|
+
keySystemConfigurations);
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
const keySystemAccess = await requestMediaKeySystemAccess(keyType,
|
|
338
|
+
keySystemConfigurations);
|
|
339
|
+
log.info("DRM: Found compatible keysystem", keyType, keySystemConfigurations);
|
|
340
|
+
return { type: "create-media-key-system-access" as const,
|
|
341
|
+
value: { options: keySystemOptions,
|
|
342
|
+
mediaKeySystemAccess: keySystemAccess } };
|
|
343
|
+
} catch (_) {
|
|
344
|
+
log.debug("DRM: Rejected access to keysystem", keyType, keySystemConfigurations);
|
|
345
|
+
if (cancelSignal.cancellationError !== null) {
|
|
346
|
+
throw cancelSignal.cancellationError;
|
|
347
|
+
}
|
|
348
|
+
return recursivelyTestKeySystems(index + 1);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
362
351
|
}
|