rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.20220317
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -1
- package/FILES.md +5 -4
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
- package/dist/_esm5.processed/compat/browser_detection.js +4 -2
- package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
- package/dist/_esm5.processed/compat/eme/close_session.js +144 -36
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +21 -22
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +53 -34
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +43 -41
- package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
- package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +68 -17
- package/dist/_esm5.processed/compat/event_listeners.js +2 -1
- package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
- package/dist/_esm5.processed/config.d.ts +166 -1080
- package/dist/_esm5.processed/config.js +17 -1119
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
- package/dist/_esm5.processed/core/abr/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 +3 -1
- package/dist/_esm5.processed/core/api/option_utils.js +19 -6
- package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
- package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
- package/dist/_esm5.processed/core/api/public_api.js +72 -33
- package/dist/_esm5.processed/core/{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 +104 -0
- package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +41 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +866 -0
- package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
- package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
- package/dist/_esm5.processed/core/decrypt/create_session.js +174 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.d.ts +21 -0
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +300 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
- package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
- package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +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 +85 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +303 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +2 -2
- 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/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 +4 -2
- 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/orchestrator/stream_orchestrator.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +1 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +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 +1 -1
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +1 -2
- package/dist/_esm5.processed/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/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +2 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +3 -0
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- 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/smooth/pipelines.js +68 -10
- package/dist/_esm5.processed/transports/types.d.ts +22 -0
- 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 +1 -1
- 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 +5002 -3033
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/core/eme/dispose_eme.d.ts → experimental/index.d.ts} +1 -4
- package/{dist/_esm5.processed/core/eme/dispose_media_keys.d.ts → experimental/index.js} +1 -6
- package/package.json +32 -34
- package/scripts/build/templates/experimental/index.d.ts +16 -0
- package/scripts/build/templates/experimental/index.js +16 -0
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
- package/src/compat/browser_detection.ts +4 -2
- package/src/compat/eme/close_session.ts +90 -56
- package/src/compat/eme/custom_media_keys/index.ts +21 -38
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +63 -46
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +51 -49
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +29 -31
- package/src/compat/event_listeners.ts +2 -1
- package/src/compat/should_favour_custom_safari_EME.ts +5 -2
- package/src/config.ts +17 -1210
- package/src/core/README.md +1 -1
- package/src/core/abr/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 +17 -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 +37 -20
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +151 -111
- 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 +49 -56
- package/src/core/decrypt/clear_on_stop.ts +48 -0
- package/src/core/decrypt/content_decryptor.ts +1158 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +175 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +112 -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} +20 -20
- package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
- package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
- package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
- package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
- package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
- package/src/core/decrypt/utils/key_session_record.ts +175 -0
- package/src/core/decrypt/utils/loaded_sessions_store.ts +318 -0
- package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
- package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
- package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
- package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +4 -4
- package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- 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 +42 -105
- 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/orchestrator/stream_orchestrator.ts +9 -4
- package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
- package/src/core/stream/period/get_adaptation_switch_strategy.ts +1 -1
- package/src/core/stream/period/period_stream.ts +5 -2
- package/src/core/stream/representation/force_garbage_collection.ts +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 +2 -1
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +4 -4
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.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/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 +5 -1
- package/src/transports/dash/image_pipelines.ts +3 -0
- package/src/transports/dash/segment_parser.ts +5 -0
- package/src/transports/dash/text_parser.ts +8 -0
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/smooth/pipelines.ts +22 -9
- package/src/transports/types.ts +22 -0
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- 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 +2 -1
- package/src/utils/rx-from_cancellable_promise.ts +7 -2
- package/src/utils/task_canceller.ts +6 -4
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
- package/dist/_esm5.processed/core/eme/create_session.js +0 -126
- package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
- package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
- package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
- package/dist/_esm5.processed/core/eme/find_key_system.js +0 -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
|
@@ -0,0 +1,418 @@
|
|
|
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/restrict-template-expressions */
|
|
24
|
+
/* eslint-disable no-restricted-properties */
|
|
25
|
+
|
|
26
|
+
import { ICustomError } from "../../../../errors";
|
|
27
|
+
import { concat } from "../../../../utils/byte_parsing";
|
|
28
|
+
import {
|
|
29
|
+
formatFakeChallengeFromInitData,
|
|
30
|
+
MediaKeySessionImpl,
|
|
31
|
+
MediaKeysImpl,
|
|
32
|
+
mockCompat,
|
|
33
|
+
} from "./utils";
|
|
34
|
+
|
|
35
|
+
/** Default video element used in our tests. */
|
|
36
|
+
const videoElt = document.createElement("video");
|
|
37
|
+
|
|
38
|
+
/* eslint-disable max-len */
|
|
39
|
+
describe("core - decrypt - global tests - getLicense", () => {
|
|
40
|
+
|
|
41
|
+
beforeEach(() => {
|
|
42
|
+
jest.resetModules();
|
|
43
|
+
jest.restoreAllMocks();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should update the session after getLicense resolves with a license", async () => {
|
|
47
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
48
|
+
configuredRetries: undefined,
|
|
49
|
+
configuredTimeout: undefined,
|
|
50
|
+
getTimeout: () => undefined,
|
|
51
|
+
nbRetries: 0,
|
|
52
|
+
ignoreLicenseRequests: false });
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should update the session after getLicense returns a license directly", async () => {
|
|
56
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
57
|
+
configuredRetries: undefined,
|
|
58
|
+
configuredTimeout: undefined,
|
|
59
|
+
getTimeout: () => undefined,
|
|
60
|
+
nbRetries: 0,
|
|
61
|
+
ignoreLicenseRequests: false });
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("should not update the session after getLicense resolves with null", async () => {
|
|
65
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
66
|
+
configuredRetries: undefined,
|
|
67
|
+
configuredTimeout: undefined,
|
|
68
|
+
getTimeout: () => undefined,
|
|
69
|
+
nbRetries: 0,
|
|
70
|
+
ignoreLicenseRequests: true });
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should not update the session after getLicense returns null directly", async () => {
|
|
74
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
75
|
+
configuredRetries: undefined,
|
|
76
|
+
configuredTimeout: undefined,
|
|
77
|
+
getTimeout: () => undefined,
|
|
78
|
+
nbRetries: 0,
|
|
79
|
+
ignoreLicenseRequests: true });
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should be able to retry maximum two times and fail after 3 tries with a rejected promise", async () => {
|
|
83
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
84
|
+
configuredRetries: undefined,
|
|
85
|
+
configuredTimeout: undefined,
|
|
86
|
+
getTimeout: () => undefined,
|
|
87
|
+
nbRetries: 3,
|
|
88
|
+
ignoreLicenseRequests: false });
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should be able to retry maximum two times and fail after 3 tries with a thrown error", async () => {
|
|
92
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
93
|
+
configuredRetries: undefined,
|
|
94
|
+
configuredTimeout: undefined,
|
|
95
|
+
getTimeout: () => undefined,
|
|
96
|
+
nbRetries: 3,
|
|
97
|
+
ignoreLicenseRequests: true });
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should be able to retry two times and succeed after a time with a resolved license", async () => {
|
|
101
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
102
|
+
configuredRetries: undefined,
|
|
103
|
+
configuredTimeout: undefined,
|
|
104
|
+
getTimeout: () => undefined,
|
|
105
|
+
nbRetries: 2,
|
|
106
|
+
ignoreLicenseRequests: false });
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("should be able to retry two times and succeed after a time with a returned license", async () => {
|
|
110
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
111
|
+
configuredRetries: undefined,
|
|
112
|
+
configuredTimeout: undefined,
|
|
113
|
+
getTimeout: () => undefined,
|
|
114
|
+
nbRetries: 2,
|
|
115
|
+
ignoreLicenseRequests: false });
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("should be able to retry two times and succeed after a time with a resolved null", async () => {
|
|
119
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
120
|
+
configuredRetries: undefined,
|
|
121
|
+
configuredTimeout: undefined,
|
|
122
|
+
getTimeout: () => undefined,
|
|
123
|
+
nbRetries: 2,
|
|
124
|
+
ignoreLicenseRequests: true });
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("should be able to retry two times and succeed after a time with a returned null", async () => {
|
|
128
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
129
|
+
configuredRetries: undefined,
|
|
130
|
+
configuredTimeout: undefined,
|
|
131
|
+
getTimeout: () => undefined,
|
|
132
|
+
nbRetries: 2,
|
|
133
|
+
ignoreLicenseRequests: true });
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("should be able to retry one time and succeed after a time with a resolved license", async () => {
|
|
137
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
138
|
+
configuredRetries: undefined,
|
|
139
|
+
configuredTimeout: undefined,
|
|
140
|
+
getTimeout: () => undefined,
|
|
141
|
+
nbRetries: 1,
|
|
142
|
+
ignoreLicenseRequests: false });
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("should be able to retry one time and succeed after a time with a returned license", async () => {
|
|
146
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
147
|
+
configuredRetries: undefined,
|
|
148
|
+
configuredTimeout: undefined,
|
|
149
|
+
getTimeout: () => undefined,
|
|
150
|
+
nbRetries: 1,
|
|
151
|
+
ignoreLicenseRequests: false });
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("should be able to retry two times and succeed after a time with a resolved null", async () => {
|
|
155
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
156
|
+
configuredRetries: undefined,
|
|
157
|
+
configuredTimeout: undefined,
|
|
158
|
+
getTimeout: () => undefined,
|
|
159
|
+
nbRetries: 1,
|
|
160
|
+
ignoreLicenseRequests: true });
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("should be able to retry two times and succeed after a time with a returned null", async () => {
|
|
164
|
+
await checkGetLicense({ isGetLicensePromiseBased: false,
|
|
165
|
+
configuredRetries: undefined,
|
|
166
|
+
configuredTimeout: undefined,
|
|
167
|
+
getTimeout: () => undefined,
|
|
168
|
+
nbRetries: 1,
|
|
169
|
+
ignoreLicenseRequests: true });
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("should be able to fetch a license directly even when getLicenseConfig.retry is set to `0`", async () => {
|
|
173
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
174
|
+
configuredRetries: 0,
|
|
175
|
+
configuredTimeout: undefined,
|
|
176
|
+
getTimeout: () => undefined,
|
|
177
|
+
nbRetries: 0,
|
|
178
|
+
ignoreLicenseRequests: false });
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("should fail after first failure when getLicenseConfig.retry is set to `0`", async () => {
|
|
182
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
183
|
+
configuredRetries: 1,
|
|
184
|
+
configuredTimeout: undefined,
|
|
185
|
+
getTimeout: () => undefined,
|
|
186
|
+
nbRetries: 0,
|
|
187
|
+
ignoreLicenseRequests: false });
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("should fail after two failures when getLicenseConfig.retry is set to `1`", async () => {
|
|
191
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
192
|
+
configuredRetries: 2,
|
|
193
|
+
configuredTimeout: undefined,
|
|
194
|
+
getTimeout: () => undefined,
|
|
195
|
+
nbRetries: 2,
|
|
196
|
+
ignoreLicenseRequests: false });
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("should not fail after one failure when getLicenseConfig.retry is set to `1`", async () => {
|
|
200
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
201
|
+
configuredRetries: 2,
|
|
202
|
+
configuredTimeout: undefined,
|
|
203
|
+
getTimeout: () => undefined,
|
|
204
|
+
nbRetries: 1,
|
|
205
|
+
ignoreLicenseRequests: false });
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("should not fail after 5 failures when getLicenseConfig.retry is set to `6`", async () => {
|
|
209
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
210
|
+
configuredRetries: 6,
|
|
211
|
+
configuredTimeout: undefined,
|
|
212
|
+
getTimeout: () => undefined,
|
|
213
|
+
nbRetries: 5,
|
|
214
|
+
ignoreLicenseRequests: false });
|
|
215
|
+
}, 15000);
|
|
216
|
+
|
|
217
|
+
it("should fail after 6 failures when getLicenseConfig.retry is set to `6`", async () => {
|
|
218
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
219
|
+
configuredRetries: 6,
|
|
220
|
+
configuredTimeout: undefined,
|
|
221
|
+
getTimeout: () => undefined,
|
|
222
|
+
nbRetries: 6,
|
|
223
|
+
ignoreLicenseRequests: false });
|
|
224
|
+
}, 15000);
|
|
225
|
+
|
|
226
|
+
it("should not fail after 5 failures when getLicenseConfig.retry is set to `Infinity`", async () => {
|
|
227
|
+
await checkGetLicense({ isGetLicensePromiseBased: true,
|
|
228
|
+
configuredRetries: Infinity,
|
|
229
|
+
configuredTimeout: undefined,
|
|
230
|
+
getTimeout: () => undefined,
|
|
231
|
+
nbRetries: 5,
|
|
232
|
+
ignoreLicenseRequests: false });
|
|
233
|
+
}, 15000);
|
|
234
|
+
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* HUGE function to check most getLicense scenarios.
|
|
239
|
+
* @param {Object} opts
|
|
240
|
+
*/
|
|
241
|
+
function checkGetLicense(
|
|
242
|
+
{ isGetLicensePromiseBased,
|
|
243
|
+
configuredRetries,
|
|
244
|
+
configuredTimeout,
|
|
245
|
+
getTimeout,
|
|
246
|
+
nbRetries,
|
|
247
|
+
ignoreLicenseRequests } : {
|
|
248
|
+
/**
|
|
249
|
+
* Set it to false if you want to return directly a value from
|
|
250
|
+
* `getLicense` (i.e. not wrapped in a Promise).
|
|
251
|
+
* This is valable both for success, and errors (which will be either
|
|
252
|
+
* thrown directly or wrapped in a rejecting Promise).
|
|
253
|
+
*
|
|
254
|
+
* This value will be forced to `true` if the `getTimeout` call for the
|
|
255
|
+
* corresponding `getLicense` returns something other than `undefined`.
|
|
256
|
+
*/
|
|
257
|
+
isGetLicensePromiseBased : boolean;
|
|
258
|
+
/** Maximum amount of retries: value of getLicenseConfig.retry. */
|
|
259
|
+
configuredRetries : number | undefined;
|
|
260
|
+
/**
|
|
261
|
+
* Return getLicense timeout after which the response will be emitted, in
|
|
262
|
+
* milliseconds.
|
|
263
|
+
* Put to `undefined` for no timeout at all (synchronous).
|
|
264
|
+
* Note that if a timeout is given, getLicense will return a Promise.
|
|
265
|
+
* As such, `isGetLicensePromiseBased` will be ignored.
|
|
266
|
+
*/
|
|
267
|
+
getTimeout : (callIdx : number) => number | undefined;
|
|
268
|
+
/** Maximum configured timeout: value of getLicenseConfig.timeout. */
|
|
269
|
+
configuredTimeout : number | undefined;
|
|
270
|
+
/**
|
|
271
|
+
* Nb of times getLicense should fail in a row.
|
|
272
|
+
* If put at a higher value or equal to `configuredRetries`, no license
|
|
273
|
+
* will be obtained.
|
|
274
|
+
*/
|
|
275
|
+
nbRetries : number;
|
|
276
|
+
/**
|
|
277
|
+
* If `true`, getLicense will return `null` - to ignore a request - when
|
|
278
|
+
* it succeed.
|
|
279
|
+
*/
|
|
280
|
+
ignoreLicenseRequests : boolean; }
|
|
281
|
+
) : Promise<void> {
|
|
282
|
+
return new Promise((res, rej) => {
|
|
283
|
+
// == mocks ==
|
|
284
|
+
mockCompat();
|
|
285
|
+
const mediaKeySession = new MediaKeySessionImpl();
|
|
286
|
+
jest.spyOn(MediaKeysImpl.prototype, "createSession").mockReturnValue(mediaKeySession);
|
|
287
|
+
const updateSpy = jest.spyOn(mediaKeySession, "update");
|
|
288
|
+
let remainingRetries = nbRetries;
|
|
289
|
+
const getLicenseSpy = jest.fn(() => {
|
|
290
|
+
const callIdx = nbRetries - remainingRetries;
|
|
291
|
+
const timeout = getTimeout(callIdx);
|
|
292
|
+
if (remainingRetries === 0) {
|
|
293
|
+
const challengeU8 = new Uint8Array(challenge);
|
|
294
|
+
const result = ignoreLicenseRequests ? null :
|
|
295
|
+
concat(challengeU8, challengeU8);
|
|
296
|
+
if (timeout !== undefined) {
|
|
297
|
+
return new Promise(resolve => {
|
|
298
|
+
setTimeout(() => resolve(result), timeout);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
return isGetLicensePromiseBased ? Promise.resolve(result) :
|
|
302
|
+
result;
|
|
303
|
+
}
|
|
304
|
+
remainingRetries--;
|
|
305
|
+
if (timeout !== undefined) {
|
|
306
|
+
return new Promise((_, reject) => {
|
|
307
|
+
setTimeout(() => {
|
|
308
|
+
reject("AAAA");
|
|
309
|
+
}, timeout);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (!isGetLicensePromiseBased) {
|
|
313
|
+
throw new Error("AAAA");
|
|
314
|
+
}
|
|
315
|
+
return Promise.reject(new Error("AAAA"));
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// == vars ==
|
|
319
|
+
/** Default keySystems configuration used in our tests. */
|
|
320
|
+
const maxRetries = configuredRetries === undefined ? 3 :
|
|
321
|
+
configuredRetries;
|
|
322
|
+
const shouldFail = nbRetries >= maxRetries;
|
|
323
|
+
let warningsLeft = nbRetries;
|
|
324
|
+
const ksConfig = [{ type: "com.widevine.alpha",
|
|
325
|
+
getLicense: getLicenseSpy,
|
|
326
|
+
getLicenseConfig: configuredRetries !== undefined ||
|
|
327
|
+
configuredTimeout !== undefined ?
|
|
328
|
+
{ retry: configuredRetries,
|
|
329
|
+
timeout: configuredTimeout } :
|
|
330
|
+
undefined }];
|
|
331
|
+
const initData = new Uint8Array([54, 55, 75]);
|
|
332
|
+
const initDataEvent = { type: "cenc", values: [ { systemId: "15", data: initData } ] };
|
|
333
|
+
const challenge = formatFakeChallengeFromInitData(initData, "cenc");
|
|
334
|
+
function checkKeyLoadError(error : unknown) {
|
|
335
|
+
try {
|
|
336
|
+
expect(error).toBeInstanceOf(Error);
|
|
337
|
+
expect((error as ICustomError).name).toEqual("EncryptedMediaError");
|
|
338
|
+
expect((error as ICustomError).type).toEqual("ENCRYPTED_MEDIA_ERROR");
|
|
339
|
+
expect((error as ICustomError).code).toEqual("KEY_LOAD_ERROR");
|
|
340
|
+
expect((error as ICustomError).message).toEqual("AAAA");
|
|
341
|
+
} catch (e) {
|
|
342
|
+
rej(e);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// == test ==
|
|
347
|
+
const { ContentDecryptorState } = require("../../content_decryptor");
|
|
348
|
+
const ContentDecryptor = require("../../content_decryptor").default;
|
|
349
|
+
const contentDecryptor = new ContentDecryptor(videoElt, ksConfig);
|
|
350
|
+
|
|
351
|
+
contentDecryptor.addEventListener("stateChange", (newState: number) => {
|
|
352
|
+
if (newState !== ContentDecryptorState.WaitingForAttachment) {
|
|
353
|
+
rej(new Error(`Unexpected state: ${newState}`));
|
|
354
|
+
}
|
|
355
|
+
contentDecryptor.removeEventListener("stateChange");
|
|
356
|
+
contentDecryptor.attach();
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
contentDecryptor.addEventListener("error", (error: unknown) => {
|
|
360
|
+
if (shouldFail) {
|
|
361
|
+
try {
|
|
362
|
+
checkKeyLoadError(error);
|
|
363
|
+
expect(getLicenseSpy).toHaveBeenCalledTimes(maxRetries);
|
|
364
|
+
expect(getLicenseSpy).toHaveBeenNthCalledWith(maxRetries, challenge, "license-request");
|
|
365
|
+
expect(updateSpy).toHaveBeenCalledTimes(0);
|
|
366
|
+
res();
|
|
367
|
+
} catch (e) {
|
|
368
|
+
rej(e);
|
|
369
|
+
}
|
|
370
|
+
} else {
|
|
371
|
+
rej(new Error(`Unexpected error: ${error}`));
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
contentDecryptor.addEventListener("warning", (warning: Error) => {
|
|
376
|
+
if (warningsLeft-- > 0) {
|
|
377
|
+
try {
|
|
378
|
+
checkKeyLoadError(warning);
|
|
379
|
+
const requestIdx = nbRetries - remainingRetries;
|
|
380
|
+
expect(getLicenseSpy).toHaveBeenCalledTimes(requestIdx);
|
|
381
|
+
expect(getLicenseSpy).toHaveBeenNthCalledWith(requestIdx, challenge, "license-request");
|
|
382
|
+
} catch (e) {
|
|
383
|
+
rej(e);
|
|
384
|
+
}
|
|
385
|
+
} else {
|
|
386
|
+
rej(new Error(`Unexpected warning: ${warning}`));
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
contentDecryptor.onInitializationData(initDataEvent);
|
|
391
|
+
|
|
392
|
+
const timeout = nbRetries === 0 ? 100 :
|
|
393
|
+
nbRetries === 1 ? 300 :
|
|
394
|
+
nbRetries === 2 ? 800 :
|
|
395
|
+
nbRetries === 3 ? 1200 :
|
|
396
|
+
nbRetries === 4 ? 3000 :
|
|
397
|
+
10000;
|
|
398
|
+
setTimeout(() => {
|
|
399
|
+
try {
|
|
400
|
+
if (ignoreLicenseRequests) {
|
|
401
|
+
expect(updateSpy).toHaveBeenCalledTimes(0);
|
|
402
|
+
} else {
|
|
403
|
+
const license = concat(challenge, challenge);
|
|
404
|
+
expect(updateSpy).toHaveBeenCalledTimes(1);
|
|
405
|
+
expect(updateSpy).toHaveBeenCalledWith(license);
|
|
406
|
+
}
|
|
407
|
+
expect(getLicenseSpy).toHaveBeenCalledTimes(nbRetries + 1);
|
|
408
|
+
for (let i = 1; i <= nbRetries + 1; i++) {
|
|
409
|
+
expect(getLicenseSpy).toHaveBeenNthCalledWith(i, challenge, "license-request");
|
|
410
|
+
}
|
|
411
|
+
contentDecryptor.dispose();
|
|
412
|
+
res();
|
|
413
|
+
} catch (e) {
|
|
414
|
+
rej(e);
|
|
415
|
+
}
|
|
416
|
+
}, timeout);
|
|
417
|
+
});
|
|
418
|
+
}
|