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,318 @@
|
|
|
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 PPromise from "pinkie";
|
|
18
|
+
import { Subscription } from "rxjs";
|
|
19
|
+
import {
|
|
20
|
+
closeSession,
|
|
21
|
+
ICustomMediaKeys,
|
|
22
|
+
ICustomMediaKeySession,
|
|
23
|
+
} from "../../../compat";
|
|
24
|
+
import {
|
|
25
|
+
onKeyMessage$,
|
|
26
|
+
onKeyStatusesChange$,
|
|
27
|
+
} from "../../../compat/event_listeners";
|
|
28
|
+
import config from "../../../config";
|
|
29
|
+
import log from "../../../log";
|
|
30
|
+
import isNullOrUndefined from "../../../utils/is_null_or_undefined";
|
|
31
|
+
import { IProcessedProtectionData } from "../types";
|
|
32
|
+
import KeySessionRecord from "./key_session_record";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create and store MediaKeySessions linked to a single MediaKeys
|
|
36
|
+
* instance.
|
|
37
|
+
*
|
|
38
|
+
* Keep track of sessionTypes and of the initialization data each
|
|
39
|
+
* MediaKeySession is created for.
|
|
40
|
+
* @class LoadedSessionsStore
|
|
41
|
+
*/
|
|
42
|
+
export default class LoadedSessionsStore {
|
|
43
|
+
/** MediaKeys instance on which the MediaKeySessions are created. */
|
|
44
|
+
private readonly _mediaKeys : MediaKeys|ICustomMediaKeys;
|
|
45
|
+
|
|
46
|
+
/** Store unique MediaKeySession information per initialization data. */
|
|
47
|
+
private _storage : IStoredSessionEntry[];
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Create a new LoadedSessionsStore, which will store information about
|
|
51
|
+
* loaded MediaKeySessions on the given MediaKeys instance.
|
|
52
|
+
* @param {MediaKeys} mediaKeys
|
|
53
|
+
*/
|
|
54
|
+
constructor(mediaKeys : MediaKeys|ICustomMediaKeys) {
|
|
55
|
+
this._mediaKeys = mediaKeys;
|
|
56
|
+
this._storage = [];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Create a new MediaKeySession and store it in this store.
|
|
61
|
+
* @param {Object} initializationData
|
|
62
|
+
* @param {string} sessionType
|
|
63
|
+
* @returns {Object}
|
|
64
|
+
*/
|
|
65
|
+
public createSession(
|
|
66
|
+
initData : IProcessedProtectionData,
|
|
67
|
+
sessionType : MediaKeySessionType
|
|
68
|
+
) : IStoredSessionEntry {
|
|
69
|
+
const keySessionRecord = new KeySessionRecord(initData);
|
|
70
|
+
const mediaKeySession = this._mediaKeys.createSession(sessionType);
|
|
71
|
+
const entry = { mediaKeySession, sessionType, keySessionRecord };
|
|
72
|
+
if (!isNullOrUndefined(mediaKeySession.closed)) {
|
|
73
|
+
mediaKeySession.closed
|
|
74
|
+
.then(() => {
|
|
75
|
+
const index = this.getIndex(keySessionRecord);
|
|
76
|
+
if (index >= 0 &&
|
|
77
|
+
this._storage[index].mediaKeySession === mediaKeySession)
|
|
78
|
+
{
|
|
79
|
+
this._storage.splice(index, 1);
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
.catch((e : unknown) => {
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
84
|
+
log.warn(`DRM-LSS: MediaKeySession.closed rejected: ${e}`);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
log.debug("DRM-LSS: Add MediaKeySession", entry.sessionType);
|
|
89
|
+
this._storage.push({ keySessionRecord, mediaKeySession, sessionType });
|
|
90
|
+
return entry;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Find a stored entry compatible with the initialization data given and moves
|
|
95
|
+
* this entry at the end of the `LoadedSessionsStore`''s storage, returned by
|
|
96
|
+
* its `getAll` method.
|
|
97
|
+
*
|
|
98
|
+
* This can be used for example to tell when a previously-stored
|
|
99
|
+
* entry is re-used to then be able to implement a caching replacement
|
|
100
|
+
* algorithm based on the least-recently-used values by just evicting the first
|
|
101
|
+
* values returned by `getAll`.
|
|
102
|
+
* @param {Object} initializationData
|
|
103
|
+
* @returns {Object|null}
|
|
104
|
+
*/
|
|
105
|
+
public reuse(
|
|
106
|
+
initializationData : IProcessedProtectionData
|
|
107
|
+
) : IStoredSessionEntry | null {
|
|
108
|
+
for (let i = this._storage.length - 1; i >= 0; i--) {
|
|
109
|
+
const stored = this._storage[i];
|
|
110
|
+
if (stored.keySessionRecord.isCompatibleWith(initializationData)) {
|
|
111
|
+
this._storage.splice(i, 1);
|
|
112
|
+
this._storage.push(stored);
|
|
113
|
+
return { keySessionRecord: stored.keySessionRecord,
|
|
114
|
+
mediaKeySession: stored.mediaKeySession,
|
|
115
|
+
sessionType: stored.sessionType };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Close a MediaKeySession and remove its related stored information from the
|
|
123
|
+
* `LoadedSessionsStore`.
|
|
124
|
+
* Emit when done.
|
|
125
|
+
* @param {Object} mediaKeySession
|
|
126
|
+
* @returns {Promise}
|
|
127
|
+
*/
|
|
128
|
+
public async closeSession(
|
|
129
|
+
mediaKeySession : MediaKeySession | ICustomMediaKeySession
|
|
130
|
+
) : Promise<boolean> {
|
|
131
|
+
let entry;
|
|
132
|
+
for (const stored of this._storage) {
|
|
133
|
+
if (stored.mediaKeySession === mediaKeySession) {
|
|
134
|
+
entry = stored;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (entry === undefined) {
|
|
139
|
+
log.warn("DRM-LSS: No MediaKeySession found with " +
|
|
140
|
+
"the given initData and initDataType");
|
|
141
|
+
return PPromise.resolve(false);
|
|
142
|
+
}
|
|
143
|
+
await safelyCloseMediaKeySession(entry.mediaKeySession);
|
|
144
|
+
return PPromise.resolve(true);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Returns the number of stored MediaKeySessions in this LoadedSessionsStore.
|
|
149
|
+
* @returns {number}
|
|
150
|
+
*/
|
|
151
|
+
public getLength() : number {
|
|
152
|
+
return this._storage.length;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Returns information about all stored MediaKeySession, in the order in which
|
|
157
|
+
* the MediaKeySession have been created.
|
|
158
|
+
* @returns {Array.<Object>}
|
|
159
|
+
*/
|
|
160
|
+
public getAll() : IStoredSessionEntry[] {
|
|
161
|
+
return this._storage;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Close all sessions in this store.
|
|
166
|
+
* Emit `null` when done.
|
|
167
|
+
* @returns {Promise}
|
|
168
|
+
*/
|
|
169
|
+
public async closeAllSessions() : Promise<void> {
|
|
170
|
+
const allEntries = this._storage;
|
|
171
|
+
log.debug("DRM-LSS: Closing all current MediaKeySessions", allEntries.length);
|
|
172
|
+
|
|
173
|
+
// re-initialize the storage, so that new interactions with the
|
|
174
|
+
// `LoadedSessionsStore` do not rely on MediaKeySessions we're in the
|
|
175
|
+
// process of removing
|
|
176
|
+
this._storage = [];
|
|
177
|
+
|
|
178
|
+
const closingProms = allEntries
|
|
179
|
+
.map((entry) => safelyCloseMediaKeySession(entry.mediaKeySession));
|
|
180
|
+
await PPromise.all(closingProms);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
private getIndex(record : KeySessionRecord) : number {
|
|
184
|
+
for (let i = 0; i < this._storage.length; i++) {
|
|
185
|
+
const stored = this._storage[i];
|
|
186
|
+
if (stored.keySessionRecord === record) {
|
|
187
|
+
return i;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return -1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Information linked to a `MediaKeySession` created by the `LoadedSessionsStore`. */
|
|
195
|
+
export interface IStoredSessionEntry {
|
|
196
|
+
/**
|
|
197
|
+
* The `KeySessionRecord` linked to the MediaKeySession.
|
|
198
|
+
* It keeps track of all key ids that are currently known to be associated to
|
|
199
|
+
* the MediaKeySession.
|
|
200
|
+
*
|
|
201
|
+
* Initially only assiociated with the initialization data given, you may want
|
|
202
|
+
* to add to it other key ids if you find out that there are also linked to
|
|
203
|
+
* that session.
|
|
204
|
+
*
|
|
205
|
+
* Regrouping all those key ids into the `KeySessionRecord` in that way allows
|
|
206
|
+
* the `LoadedSessionsStore` to perform compatibility checks when future
|
|
207
|
+
* initialization data is encountered.
|
|
208
|
+
*/
|
|
209
|
+
keySessionRecord : KeySessionRecord;
|
|
210
|
+
|
|
211
|
+
/** The MediaKeySession created. */
|
|
212
|
+
mediaKeySession : MediaKeySession |
|
|
213
|
+
ICustomMediaKeySession;
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* The MediaKeySessionType (e.g. "temporary" or "persistent-license") with
|
|
217
|
+
* which the MediaKeySession was created.
|
|
218
|
+
*/
|
|
219
|
+
sessionType : MediaKeySessionType;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Close a MediaKeySession with multiple attempts if needed and do not throw if
|
|
224
|
+
* this action throws an error.
|
|
225
|
+
* Emits then complete when done.
|
|
226
|
+
* @param {MediaKeySession} mediaKeySession
|
|
227
|
+
* @returns {Observable}
|
|
228
|
+
*/
|
|
229
|
+
function safelyCloseMediaKeySession(
|
|
230
|
+
mediaKeySession : MediaKeySession | ICustomMediaKeySession
|
|
231
|
+
) : Promise<unknown> {
|
|
232
|
+
return recursivelyTryToCloseMediaKeySession(0);
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Perform a new attempt at closing the MediaKeySession.
|
|
236
|
+
* If this operation fails due to a not-"callable" (an EME term)
|
|
237
|
+
* MediaKeySession, retry based on either a timer or on MediaKeySession
|
|
238
|
+
* events, whichever comes first.
|
|
239
|
+
* Emits then complete when done.
|
|
240
|
+
* @param {number} retryNb - The attempt number starting at 0.
|
|
241
|
+
* @returns {Observable}
|
|
242
|
+
*/
|
|
243
|
+
async function recursivelyTryToCloseMediaKeySession(
|
|
244
|
+
retryNb : number
|
|
245
|
+
) : Promise<unknown> {
|
|
246
|
+
log.debug("DRM: Trying to close a MediaKeySession",
|
|
247
|
+
mediaKeySession.sessionId,
|
|
248
|
+
retryNb);
|
|
249
|
+
try {
|
|
250
|
+
await closeSession(mediaKeySession);
|
|
251
|
+
log.debug("DRM: Succeeded to close MediaKeySession");
|
|
252
|
+
return undefined;
|
|
253
|
+
} catch (err : unknown) {
|
|
254
|
+
// Unitialized MediaKeySession may not close properly until their
|
|
255
|
+
// corresponding `generateRequest` or `load` call are handled by the
|
|
256
|
+
// browser.
|
|
257
|
+
// In that case the EME specification tells us that the browser is
|
|
258
|
+
// supposed to reject the `close` call with an InvalidStateError.
|
|
259
|
+
if (!(err instanceof Error) || err.name !== "InvalidStateError" ||
|
|
260
|
+
mediaKeySession.sessionId !== "")
|
|
261
|
+
{
|
|
262
|
+
return failToCloseSession(err);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const { EME_SESSION_CLOSING_MAX_RETRY,
|
|
266
|
+
EME_SESSION_CLOSING_INITIAL_DELAY,
|
|
267
|
+
EME_SESSION_CLOSING_MAX_DELAY } = config.getCurrent();
|
|
268
|
+
|
|
269
|
+
// We will retry either:
|
|
270
|
+
// - when an event indicates that the MediaKeySession is
|
|
271
|
+
// initialized (`callable` is the proper EME term here)
|
|
272
|
+
// - after a delay, raising exponentially
|
|
273
|
+
const nextRetryNb = retryNb + 1;
|
|
274
|
+
if (nextRetryNb > EME_SESSION_CLOSING_MAX_RETRY) {
|
|
275
|
+
return failToCloseSession(err);
|
|
276
|
+
}
|
|
277
|
+
const delay = Math.min(Math.pow(2, retryNb) * EME_SESSION_CLOSING_INITIAL_DELAY,
|
|
278
|
+
EME_SESSION_CLOSING_MAX_DELAY);
|
|
279
|
+
log.warn("DRM: attempt to close a mediaKeySession failed, " +
|
|
280
|
+
"scheduling retry...", delay);
|
|
281
|
+
|
|
282
|
+
let ksChangeSub : undefined | Subscription;
|
|
283
|
+
const ksChangeProm = new Promise((res) => {
|
|
284
|
+
ksChangeSub = onKeyStatusesChange$(mediaKeySession).subscribe(res);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
let ksMsgSub : undefined | Subscription;
|
|
288
|
+
const ksMsgProm = new Promise((res) => {
|
|
289
|
+
ksMsgSub = onKeyMessage$(mediaKeySession).subscribe(res);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
let sleepTimer : undefined | number;
|
|
293
|
+
const sleepProm = new Promise((res) => {
|
|
294
|
+
sleepTimer = window.setTimeout(res, delay);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
await PPromise.race([ksChangeProm, ksMsgProm, sleepProm]);
|
|
298
|
+
ksChangeSub?.unsubscribe();
|
|
299
|
+
ksMsgSub?.unsubscribe();
|
|
300
|
+
clearTimeout(sleepTimer);
|
|
301
|
+
|
|
302
|
+
return recursivelyTryToCloseMediaKeySession(nextRetryNb);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Log error anouncing that we could not close the MediaKeySession and emits
|
|
308
|
+
* then complete through Observable.
|
|
309
|
+
* TODO Emit warning?
|
|
310
|
+
* @returns {Observable}
|
|
311
|
+
*/
|
|
312
|
+
function failToCloseSession(err : unknown) : Promise<null> {
|
|
313
|
+
log.error("DRM: Could not close MediaKeySession: " +
|
|
314
|
+
(err instanceof Error ? err.toString() :
|
|
315
|
+
"Unknown error"));
|
|
316
|
+
return PPromise.resolve(null);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
import {
|
|
18
18
|
ICustomMediaKeys,
|
|
19
19
|
ICustomMediaKeySystemAccess,
|
|
20
|
-
} from "
|
|
21
|
-
import { IKeySystemOption } from "
|
|
22
|
-
import LoadedSessionsStore from "./
|
|
20
|
+
} from "../../../compat";
|
|
21
|
+
import { IKeySystemOption } from "../types";
|
|
22
|
+
import LoadedSessionsStore from "./loaded_sessions_store";
|
|
23
23
|
|
|
24
|
-
/**
|
|
24
|
+
/** DRM-related state that can be associated to a single HTMLMediaElement. */
|
|
25
25
|
export interface IMediaElementMediaKeysInfos {
|
|
26
26
|
/** Last keySystemOptions used with that HTMLMediaElement. */
|
|
27
27
|
keySystemOptions : IKeySystemOption;
|