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,262 @@
|
|
|
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
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
18
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
19
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
20
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
21
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
22
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
23
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
24
|
+
/* eslint-disable no-restricted-properties */
|
|
25
|
+
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
|
26
|
+
|
|
27
|
+
import {
|
|
28
|
+
MediaKeysImpl,
|
|
29
|
+
MediaKeySystemAccessImpl,
|
|
30
|
+
mockCompat,
|
|
31
|
+
} from "./utils";
|
|
32
|
+
|
|
33
|
+
describe("core - decrypt - global tests - server certificate", () => {
|
|
34
|
+
|
|
35
|
+
const getLicenseSpy = jest.fn(() => {
|
|
36
|
+
return new Promise(() => { /* noop */ });
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/** Default video element used in our tests. */
|
|
40
|
+
const videoElt = document.createElement("video");
|
|
41
|
+
|
|
42
|
+
const serverCertificate = [1, 2, 3];
|
|
43
|
+
|
|
44
|
+
/** Default keySystems configuration used in our tests. */
|
|
45
|
+
const ksConfigCert = [{ type: "com.widevine.alpha",
|
|
46
|
+
getLicense: getLicenseSpy,
|
|
47
|
+
serverCertificate }];
|
|
48
|
+
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
jest.resetModules();
|
|
51
|
+
jest.restoreAllMocks();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should set the serverCertificate only after the MediaKeys is attached", (done) => {
|
|
55
|
+
const { setMediaKeysSpy } = mockCompat();
|
|
56
|
+
setMediaKeysSpy.mockImplementation(() => {
|
|
57
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
58
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
|
|
61
|
+
const serverCertificateSpy =
|
|
62
|
+
jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
|
|
63
|
+
.mockImplementation((_serverCertificate : BufferSource) => {
|
|
64
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
65
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
66
|
+
return Promise.resolve(true);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const { ContentDecryptorState } = require("../../content_decryptor");
|
|
70
|
+
const ContentDecryptor = require("../../content_decryptor").default;
|
|
71
|
+
const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
|
|
72
|
+
|
|
73
|
+
contentDecryptor.addEventListener("stateChange", (state: any) => {
|
|
74
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
75
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
expect(setMediaKeysSpy).not.toHaveBeenCalled();
|
|
78
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
79
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
80
|
+
contentDecryptor.attach();
|
|
81
|
+
}, 5);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
setTimeout(() => {
|
|
85
|
+
contentDecryptor.dispose();
|
|
86
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
87
|
+
expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
|
|
88
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
89
|
+
done();
|
|
90
|
+
}, 10);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should not call serverCertificate multiple times on init data", (done) => {
|
|
94
|
+
const { setMediaKeysSpy } = mockCompat();
|
|
95
|
+
setMediaKeysSpy.mockImplementation(() => {
|
|
96
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
97
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
|
|
100
|
+
const serverCertificateSpy =
|
|
101
|
+
jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
|
|
102
|
+
.mockImplementation((_serverCertificate : BufferSource) => {
|
|
103
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
104
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
105
|
+
return Promise.resolve(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const { ContentDecryptorState } = require("../../content_decryptor");
|
|
109
|
+
const ContentDecryptor = require("../../content_decryptor").default;
|
|
110
|
+
const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
|
|
111
|
+
|
|
112
|
+
contentDecryptor.addEventListener("stateChange", (state: any) => {
|
|
113
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
114
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
115
|
+
setTimeout(() => {
|
|
116
|
+
expect(setMediaKeysSpy).not.toHaveBeenCalled();
|
|
117
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
118
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
119
|
+
const initData = new Uint8Array([54, 55, 75]);
|
|
120
|
+
contentDecryptor.onInitializationData({
|
|
121
|
+
type: "cenc2",
|
|
122
|
+
values: [ { systemId: "15", data: initData } ],
|
|
123
|
+
});
|
|
124
|
+
contentDecryptor.attach();
|
|
125
|
+
}, 5);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
setTimeout(() => {
|
|
129
|
+
contentDecryptor.dispose();
|
|
130
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
131
|
+
expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
|
|
132
|
+
expect(createSessionSpy).toHaveBeenCalledTimes(1);
|
|
133
|
+
done();
|
|
134
|
+
}, 10);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
/* eslint-disable max-len */
|
|
138
|
+
it("should emit warning if serverCertificate call rejects but still continue", (done) => {
|
|
139
|
+
/* eslint-enable max-len */
|
|
140
|
+
|
|
141
|
+
const { setMediaKeysSpy } = mockCompat();
|
|
142
|
+
const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
|
|
143
|
+
const serverCertificateSpy =
|
|
144
|
+
jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
|
|
145
|
+
.mockImplementation((_serverCertificate : BufferSource) => {
|
|
146
|
+
throw new Error("some error");
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const { ContentDecryptorState } = require("../../content_decryptor");
|
|
150
|
+
const ContentDecryptor = require("../../content_decryptor").default;
|
|
151
|
+
const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
|
|
152
|
+
|
|
153
|
+
contentDecryptor.addEventListener("stateChange", (state: any) => {
|
|
154
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
155
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
156
|
+
contentDecryptor.attach();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
let warningsReceived = 0;
|
|
161
|
+
contentDecryptor.addEventListener("warning", (w: any) => {
|
|
162
|
+
expect(w.code).toEqual("LICENSE_SERVER_CERTIFICATE_ERROR");
|
|
163
|
+
expect(w.type).toEqual("ENCRYPTED_MEDIA_ERROR");
|
|
164
|
+
warningsReceived++;
|
|
165
|
+
});
|
|
166
|
+
setTimeout(() => {
|
|
167
|
+
contentDecryptor.dispose();
|
|
168
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
169
|
+
expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
|
|
170
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
171
|
+
expect(warningsReceived).toEqual(1);
|
|
172
|
+
done();
|
|
173
|
+
}, 10);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
/* eslint-disable max-len */
|
|
177
|
+
it("should emit warning if serverCertificate call throws but still continue", (done) => {
|
|
178
|
+
/* eslint-enable max-len */
|
|
179
|
+
|
|
180
|
+
const { setMediaKeysSpy } = mockCompat();
|
|
181
|
+
const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
|
|
182
|
+
const serverCertificateSpy =
|
|
183
|
+
jest.spyOn(MediaKeysImpl.prototype, "setServerCertificate")
|
|
184
|
+
.mockImplementation((_serverCertificate : BufferSource) => {
|
|
185
|
+
return Promise.reject(new Error("some error"));
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const { ContentDecryptorState } = require("../../content_decryptor");
|
|
189
|
+
const ContentDecryptor = require("../../content_decryptor").default;
|
|
190
|
+
const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
|
|
191
|
+
|
|
192
|
+
contentDecryptor.addEventListener("stateChange", (state: any) => {
|
|
193
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
194
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
195
|
+
contentDecryptor.attach();
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
let warningsReceived = 0;
|
|
200
|
+
contentDecryptor.addEventListener("warning", (w: any) => {
|
|
201
|
+
expect(w.code).toEqual("LICENSE_SERVER_CERTIFICATE_ERROR");
|
|
202
|
+
expect(w.type).toEqual("ENCRYPTED_MEDIA_ERROR");
|
|
203
|
+
warningsReceived++;
|
|
204
|
+
});
|
|
205
|
+
setTimeout(() => {
|
|
206
|
+
contentDecryptor.dispose();
|
|
207
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
208
|
+
expect(serverCertificateSpy).toHaveBeenCalledTimes(1);
|
|
209
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
210
|
+
expect(warningsReceived).toEqual(1);
|
|
211
|
+
done();
|
|
212
|
+
}, 10);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
/* eslint-disable max-len */
|
|
216
|
+
it("should just continue if setServerCertificate is undefined", (done) => {
|
|
217
|
+
/* eslint-enable max-len */
|
|
218
|
+
const { setMediaKeysSpy } = mockCompat();
|
|
219
|
+
jest.spyOn(MediaKeySystemAccessImpl.prototype, "createMediaKeys")
|
|
220
|
+
.mockImplementation(() => {
|
|
221
|
+
const mediaKeys = new MediaKeysImpl();
|
|
222
|
+
(mediaKeys as { setServerCertificate? : unknown })
|
|
223
|
+
.setServerCertificate = undefined;
|
|
224
|
+
return Promise.resolve(mediaKeys);
|
|
225
|
+
});
|
|
226
|
+
setMediaKeysSpy.mockImplementation(() => {
|
|
227
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
228
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
229
|
+
});
|
|
230
|
+
const createSessionSpy = jest.spyOn(MediaKeysImpl.prototype, "createSession");
|
|
231
|
+
const serverCertificateSpy = jest.spyOn(MediaKeysImpl.prototype,
|
|
232
|
+
"setServerCertificate");
|
|
233
|
+
const { ContentDecryptorState } = require("../../content_decryptor");
|
|
234
|
+
const ContentDecryptor = require("../../content_decryptor").default;
|
|
235
|
+
const contentDecryptor = new ContentDecryptor(videoElt, ksConfigCert);
|
|
236
|
+
|
|
237
|
+
contentDecryptor.addEventListener("stateChange", (state: any) => {
|
|
238
|
+
if (state === ContentDecryptorState.WaitingForAttachment) {
|
|
239
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
240
|
+
setTimeout(() => {
|
|
241
|
+
expect(setMediaKeysSpy).not.toHaveBeenCalled();
|
|
242
|
+
expect(createSessionSpy).not.toHaveBeenCalled();
|
|
243
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
244
|
+
const initData = new Uint8Array([54, 55, 75]);
|
|
245
|
+
contentDecryptor.onInitializationData({
|
|
246
|
+
type: "cenc2",
|
|
247
|
+
values: [ { systemId: "15", data: initData } ],
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
contentDecryptor.attach();
|
|
251
|
+
}, 5);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
setTimeout(() => {
|
|
255
|
+
contentDecryptor.dispose();
|
|
256
|
+
expect(setMediaKeysSpy).toHaveBeenCalledTimes(1);
|
|
257
|
+
expect(serverCertificateSpy).not.toHaveBeenCalled();
|
|
258
|
+
expect(createSessionSpy).toHaveBeenCalledTimes(1);
|
|
259
|
+
done();
|
|
260
|
+
}, 10);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
@@ -21,20 +21,17 @@
|
|
|
21
21
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
22
22
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
23
23
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
24
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
25
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
26
|
+
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
24
27
|
/* eslint-disable no-restricted-properties */
|
|
25
28
|
|
|
26
|
-
import {
|
|
27
|
-
defer as observableDefer,
|
|
28
|
-
Observable,
|
|
29
|
-
of as observableOf,
|
|
30
|
-
Subject,
|
|
31
|
-
} from "rxjs";
|
|
29
|
+
import { Subject } from "rxjs";
|
|
32
30
|
import { IEncryptedEventData } from "../../../../compat/eme";
|
|
33
31
|
import {
|
|
34
32
|
base64ToBytes,
|
|
35
33
|
bytesToBase64,
|
|
36
34
|
} from "../../../../utils/base64";
|
|
37
|
-
import castToObservable from "../../../../utils/cast_to_observable";
|
|
38
35
|
import EventEmitter, { fromEvent } from "../../../../utils/event_emitter";
|
|
39
36
|
import flatMap from "../../../../utils/flat_map";
|
|
40
37
|
import {
|
|
@@ -170,15 +167,17 @@ export class MediaKeySessionImpl extends EventEmitter<Record<string, unknown>> {
|
|
|
170
167
|
|
|
171
168
|
public generateRequest(initDataType: string, initData: BufferSource) : Promise<void> {
|
|
172
169
|
const msg = formatFakeChallengeFromInitData(initData, initDataType);
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
this.onmessage
|
|
181
|
-
|
|
170
|
+
setTimeout(() => {
|
|
171
|
+
const event : MediaKeyMessageEvent =
|
|
172
|
+
Object.assign(new CustomEvent("message"),
|
|
173
|
+
{ message: msg.buffer,
|
|
174
|
+
messageType: "license-request" as const });
|
|
175
|
+
|
|
176
|
+
this.trigger("message", event);
|
|
177
|
+
if (this.onmessage !== null && this.onmessage !== undefined) {
|
|
178
|
+
this.onmessage(event);
|
|
179
|
+
}
|
|
180
|
+
}, 5);
|
|
182
181
|
return Promise.resolve();
|
|
183
182
|
}
|
|
184
183
|
|
|
@@ -240,8 +239,8 @@ export class MediaKeySystemAccessImpl {
|
|
|
240
239
|
export function requestMediaKeySystemAccessImpl(
|
|
241
240
|
keySystem : string,
|
|
242
241
|
config : MediaKeySystemConfiguration[]
|
|
243
|
-
) :
|
|
244
|
-
return
|
|
242
|
+
) : Promise<MediaKeySystemAccessImpl> {
|
|
243
|
+
return Promise.resolve(new MediaKeySystemAccessImpl(keySystem, config));
|
|
245
244
|
}
|
|
246
245
|
|
|
247
246
|
/**
|
|
@@ -267,16 +266,14 @@ export function mockCompat(exportedFunctions = {}) {
|
|
|
267
266
|
};
|
|
268
267
|
|
|
269
268
|
const rmksaSpy = jest.fn(requestMediaKeySystemAccessImpl);
|
|
270
|
-
const setMediaKeysSpy = jest.fn(
|
|
269
|
+
const setMediaKeysSpy = jest.fn();
|
|
271
270
|
const generateKeyRequestSpy = jest.fn((
|
|
272
271
|
mks : MediaKeySessionImpl,
|
|
273
272
|
initializationDataType,
|
|
274
273
|
initializationData
|
|
275
274
|
) => {
|
|
276
|
-
return
|
|
277
|
-
|
|
278
|
-
initializationData));
|
|
279
|
-
});
|
|
275
|
+
return mks.generateRequest(initializationDataType,
|
|
276
|
+
initializationData);
|
|
280
277
|
});
|
|
281
278
|
|
|
282
279
|
const getInitDataSpy = jest.fn((encryptedEvent : IEncryptedEventData) => {
|
|
@@ -303,9 +300,7 @@ export function mockCompat(exportedFunctions = {}) {
|
|
|
303
300
|
}
|
|
304
301
|
|
|
305
302
|
/**
|
|
306
|
-
* Check that the
|
|
307
|
-
* directly without any event emitted.
|
|
308
|
-
*
|
|
303
|
+
* Check that the ContentDecryptor, when called with those arguments, throws.
|
|
309
304
|
* If that's the case, resolve with the corresponding error.
|
|
310
305
|
* Else, reject.
|
|
311
306
|
* @param {HTMLMediaElement} mediaElement
|
|
@@ -313,79 +308,22 @@ export function mockCompat(exportedFunctions = {}) {
|
|
|
313
308
|
* @param {Observable} contentProtections$
|
|
314
309
|
* @returns {Promise}
|
|
315
310
|
*/
|
|
316
|
-
export function
|
|
317
|
-
|
|
318
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
319
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
320
|
-
EMEManager : any,
|
|
321
|
-
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
322
|
-
/* eslint-enable @typescript-eslint/naming-convention */
|
|
311
|
+
export function testContentDecryptorError(
|
|
312
|
+
ContentDecryptor : any,
|
|
323
313
|
mediaElement : HTMLMediaElement,
|
|
324
|
-
keySystemsConfigs : unknown[]
|
|
325
|
-
contentProtections$ : Observable<unknown>
|
|
314
|
+
keySystemsConfigs : unknown[]
|
|
326
315
|
) : Promise<unknown> {
|
|
327
316
|
return new Promise((res, rej) => {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
(err : unknown) => { res(err); },
|
|
336
|
-
() => rej(new Error("EMEManager completed."))
|
|
337
|
-
);
|
|
317
|
+
const contentDecryptor = new ContentDecryptor(mediaElement, keySystemsConfigs);
|
|
318
|
+
contentDecryptor.addEventListener("error", (error: any) => {
|
|
319
|
+
res(error);
|
|
320
|
+
});
|
|
321
|
+
setTimeout(() => {
|
|
322
|
+
rej(new Error("Timeout exceeded"));
|
|
323
|
+
}, 10);
|
|
338
324
|
});
|
|
339
325
|
}
|
|
340
326
|
|
|
341
|
-
/**
|
|
342
|
-
* Check that the event received corresponds to the session-message event for a
|
|
343
|
-
* license request.
|
|
344
|
-
* @param {Object} evt
|
|
345
|
-
* @param {Object} initDataVal
|
|
346
|
-
*/
|
|
347
|
-
export function expectLicenseRequestMessage(
|
|
348
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
349
|
-
evt : { type : string; value : any },
|
|
350
|
-
initDataVal : { type : string | undefined;
|
|
351
|
-
values : Array<{ systemId : string | unknown;
|
|
352
|
-
data : Uint8Array; }>; }
|
|
353
|
-
) : void {
|
|
354
|
-
expect(evt.type).toEqual("session-message");
|
|
355
|
-
expect(evt.value.messageType).toEqual("license-request");
|
|
356
|
-
expect(evt.value.initializationData).toEqual(initDataVal);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* @param {Object} evt
|
|
361
|
-
* @param {Uint8Array} initData
|
|
362
|
-
* @param {string|undefined} initDataType
|
|
363
|
-
*/
|
|
364
|
-
export function expectInitDataIgnored(
|
|
365
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
366
|
-
evt : { type : string; value : any },
|
|
367
|
-
initDataVal : { type : string | undefined;
|
|
368
|
-
values : Array<{ systemId : string | undefined;
|
|
369
|
-
data : Uint8Array; }>; }
|
|
370
|
-
) : void {
|
|
371
|
-
expect(evt.type).toEqual("init-data-ignored");
|
|
372
|
-
expect(evt.value.initializationData).toEqual(initDataVal);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* @param {Object} evt
|
|
377
|
-
* @param {Uint8Array} initData
|
|
378
|
-
* @param {string|undefined} initDataType
|
|
379
|
-
*/
|
|
380
|
-
export function expectEncryptedEventReceived(
|
|
381
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
382
|
-
evt : { type : string; value : any },
|
|
383
|
-
initData : IEncryptedEventData
|
|
384
|
-
) : void {
|
|
385
|
-
expect(evt.type).toEqual("encrypted-event-received");
|
|
386
|
-
expect(evt.value).toEqual(initData);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
327
|
/**
|
|
390
328
|
* Does the reverse operation than what `formatFakeChallengeFromInitData` does:
|
|
391
329
|
* Retrieve initialization data from a fake challenge done in our tests
|
|
@@ -14,51 +14,27 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
defer as observableDefer,
|
|
19
|
-
mergeMap,
|
|
20
|
-
tap,
|
|
21
|
-
Observable,
|
|
22
|
-
of as observableOf,
|
|
23
|
-
} from "rxjs";
|
|
24
17
|
import {
|
|
25
18
|
ICustomMediaKeys,
|
|
26
19
|
ICustomMediaKeySystemAccess,
|
|
27
20
|
setMediaKeys,
|
|
28
21
|
} from "../../compat";
|
|
29
22
|
import log from "../../log";
|
|
30
|
-
import
|
|
23
|
+
import { CancellationSignal } from "../../utils/task_canceller";
|
|
31
24
|
import {
|
|
32
25
|
IKeySystemOption,
|
|
33
26
|
} from "./types";
|
|
34
27
|
import LoadedSessionsStore from "./utils/loaded_sessions_store";
|
|
28
|
+
import MediaKeysInfosStore from "./utils/media_keys_infos_store";
|
|
35
29
|
|
|
36
30
|
/**
|
|
37
|
-
* Dispose the
|
|
31
|
+
* Dispose of the MediaKeys instance attached to the given media element, if
|
|
32
|
+
* one.
|
|
38
33
|
* @param {Object} mediaElement
|
|
39
|
-
* @returns {Observable}
|
|
40
34
|
*/
|
|
41
|
-
export function disableMediaKeys(
|
|
42
|
-
mediaElement
|
|
43
|
-
)
|
|
44
|
-
return observableDefer(() => {
|
|
45
|
-
MediaKeysInfosStore.setState(mediaElement, null);
|
|
46
|
-
return setMediaKeys(mediaElement, null);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** MediaKeys and associated state attached to a media element. */
|
|
51
|
-
export interface IMediaKeysState {
|
|
52
|
-
/** Options set when the MediaKeys has been attached. */
|
|
53
|
-
keySystemOptions : IKeySystemOption;
|
|
54
|
-
/** LoadedSessionsStore associated to the MediaKeys instance. */
|
|
55
|
-
loadedSessionsStore : LoadedSessionsStore;
|
|
56
|
-
/** The MediaKeySystemAccess allowing to create MediaKeys instances. */
|
|
57
|
-
mediaKeySystemAccess: MediaKeySystemAccess |
|
|
58
|
-
ICustomMediaKeySystemAccess;
|
|
59
|
-
/** The MediaKeys instance to attach to the media element. */
|
|
60
|
-
mediaKeys : MediaKeys |
|
|
61
|
-
ICustomMediaKeys;
|
|
35
|
+
export function disableMediaKeys(mediaElement : HTMLMediaElement): void {
|
|
36
|
+
MediaKeysInfosStore.setState(mediaElement, null);
|
|
37
|
+
setMediaKeys(mediaElement, null);
|
|
62
38
|
}
|
|
63
39
|
|
|
64
40
|
/**
|
|
@@ -69,34 +45,50 @@ export interface IMediaKeysState {
|
|
|
69
45
|
* @param {HTMLMediaElement} mediaElement
|
|
70
46
|
* @returns {Observable}
|
|
71
47
|
*/
|
|
72
|
-
export default function attachMediaKeys(
|
|
48
|
+
export default async function attachMediaKeys(
|
|
73
49
|
mediaElement : HTMLMediaElement,
|
|
74
50
|
{ keySystemOptions,
|
|
75
51
|
loadedSessionsStore,
|
|
76
52
|
mediaKeySystemAccess,
|
|
77
|
-
mediaKeys } : IMediaKeysState
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
53
|
+
mediaKeys } : IMediaKeysState,
|
|
54
|
+
cancelSignal : CancellationSignal
|
|
55
|
+
) : Promise<void> {
|
|
56
|
+
const previousState = MediaKeysInfosStore.getState(mediaElement);
|
|
57
|
+
const closeAllSessions = previousState !== null &&
|
|
58
|
+
previousState.loadedSessionsStore !== loadedSessionsStore ?
|
|
59
|
+
previousState.loadedSessionsStore.closeAllSessions() :
|
|
60
|
+
Promise.resolve();
|
|
85
61
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
62
|
+
await closeAllSessions;
|
|
63
|
+
|
|
64
|
+
// If this task has been cancelled while we were closing previous sessions,
|
|
65
|
+
// stop now (and thus avoid setting the new media keys);
|
|
66
|
+
if (cancelSignal.isCancelled) {
|
|
67
|
+
throw cancelSignal.cancellationError;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
MediaKeysInfosStore.setState(mediaElement, { keySystemOptions,
|
|
71
|
+
mediaKeySystemAccess,
|
|
72
|
+
mediaKeys,
|
|
73
|
+
loadedSessionsStore });
|
|
74
|
+
if (mediaElement.mediaKeys === mediaKeys) {
|
|
75
|
+
return ;
|
|
76
|
+
}
|
|
77
|
+
log.info("DRM: Attaching MediaKeys to the media element");
|
|
78
|
+
setMediaKeys(mediaElement, mediaKeys);
|
|
79
|
+
log.info("DRM: MediaKeys attached with success");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** MediaKeys and associated state attached to a media element. */
|
|
83
|
+
export interface IMediaKeysState {
|
|
84
|
+
/** Options set when the MediaKeys has been attached. */
|
|
85
|
+
keySystemOptions : IKeySystemOption;
|
|
86
|
+
/** LoadedSessionsStore associated to the MediaKeys instance. */
|
|
87
|
+
loadedSessionsStore : LoadedSessionsStore;
|
|
88
|
+
/** The MediaKeySystemAccess allowing to create MediaKeys instances. */
|
|
89
|
+
mediaKeySystemAccess: MediaKeySystemAccess |
|
|
90
|
+
ICustomMediaKeySystemAccess;
|
|
91
|
+
/** The MediaKeys instance to attach to the media element. */
|
|
92
|
+
mediaKeys : MediaKeys |
|
|
93
|
+
ICustomMediaKeys;
|
|
102
94
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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 { shouldUnsetMediaKeys } from "../../compat/";
|
|
18
|
+
import log from "../../log";
|
|
19
|
+
import disposeDecryptionResources from "./dispose_decryption_resources";
|
|
20
|
+
import MediaKeysInfosStore from "./utils/media_keys_infos_store";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Clear DRM-related resources that should be cleared when the current content
|
|
24
|
+
* stops its playback.
|
|
25
|
+
* @param {HTMLMediaElement} mediaElement
|
|
26
|
+
* @returns {Observable}
|
|
27
|
+
*/
|
|
28
|
+
export default function clearOnStop(
|
|
29
|
+
mediaElement : HTMLMediaElement
|
|
30
|
+
) : Promise<void> {
|
|
31
|
+
log.info("DRM: Clearing-up DRM session.");
|
|
32
|
+
if (shouldUnsetMediaKeys()) {
|
|
33
|
+
log.info("DRM: disposing current MediaKeys.");
|
|
34
|
+
return disposeDecryptionResources(mediaElement);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const currentState = MediaKeysInfosStore.getState(mediaElement);
|
|
38
|
+
if (currentState !== null &&
|
|
39
|
+
currentState.keySystemOptions.closeSessionsOnStop === true)
|
|
40
|
+
{
|
|
41
|
+
log.info("DRM: closing all current sessions.");
|
|
42
|
+
return currentState.loadedSessionsStore.closeAllSessions();
|
|
43
|
+
}
|
|
44
|
+
log.info("DRM: Nothing to clear. Returning right away. No state =",
|
|
45
|
+
currentState === null);
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
}
|