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
package/dummy
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
This is an unnecessary file, just added to trigger the integration tests in a PR through GitHub actions.
|
|
@@ -13,7 +13,4 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
* Free up all ressources taken by the EME management.
|
|
18
|
-
*/
|
|
19
|
-
export default function disposeEME(mediaElement: HTMLMediaElement): void;
|
|
16
|
+
export * from "../dist/_esm5.processed/experimental/index";
|
|
@@ -13,9 +13,4 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @param {Object} mediaKeysInfos
|
|
19
|
-
* @returns {Observable}
|
|
20
|
-
*/
|
|
21
|
-
export default function disposeMediaKeys(mediaElement: HTMLMediaElement): Observable<unknown>;
|
|
16
|
+
export * from "../dist/_esm5.processed/experimental/index.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rx-player",
|
|
3
3
|
"author": "Canal+",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.27.0-dev.20220317",
|
|
5
5
|
"description": "Canal+ HTML5 Video Player",
|
|
6
6
|
"main": "./dist/rx-player.js",
|
|
7
7
|
"keywords": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"build:wasm:release": "cd ./src/parsers/manifest/dash/wasm-parser && cargo build --target wasm32-unknown-unknown --release && wasm-opt -O3 -o ../../../../../dist/mpd-parser.wasm target/wasm32-unknown-unknown/release/mpd_node_parser.wasm && cd ../../../../../ && npm run wasm-strip",
|
|
39
39
|
"certificate": "./scripts/generate_certificate",
|
|
40
40
|
"check": "npm run check:types && npm run lint",
|
|
41
|
-
"check:all": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test && npm run test:memory && node -r esm ./scripts/check_nodejs_import_compatibility.js",
|
|
41
|
+
"check:all": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test:unit && npm run test:integration && npm run test:memory && node -r esm ./scripts/check_nodejs_import_compatibility.js",
|
|
42
42
|
"check:appveyor": "npm run check:types && npm run lint && npm run lint:demo && npm run lint:tests && npm run test:appveyor",
|
|
43
43
|
"check:types": "tsc --noEmit --project .",
|
|
44
44
|
"check:types:watch": "tsc --noEmit --watch --project .",
|
|
@@ -80,42 +80,40 @@
|
|
|
80
80
|
"rxjs": "7.4.0"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
|
-
"@babel/core": "7.
|
|
84
|
-
"@babel/plugin-transform-runtime": "7.
|
|
85
|
-
"@babel/preset-env": "7.16.
|
|
83
|
+
"@babel/core": "7.17.7",
|
|
84
|
+
"@babel/plugin-transform-runtime": "7.17.0",
|
|
85
|
+
"@babel/preset-env": "7.16.11",
|
|
86
86
|
"@babel/preset-react": "7.16.7",
|
|
87
87
|
"@types/chai": "4.3.0",
|
|
88
|
-
"@types/jest": "27.4.
|
|
89
|
-
"@types/mocha": "9.
|
|
90
|
-
"@types/node": "17.0.
|
|
91
|
-
"@types/sinon": "10.0.
|
|
92
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
93
|
-
"@typescript-eslint/eslint-plugin-tslint": "5.
|
|
94
|
-
"@typescript-eslint/parser": "5.
|
|
88
|
+
"@types/jest": "27.4.1",
|
|
89
|
+
"@types/mocha": "9.1.0",
|
|
90
|
+
"@types/node": "17.0.21",
|
|
91
|
+
"@types/sinon": "10.0.11",
|
|
92
|
+
"@typescript-eslint/eslint-plugin": "5.15.0",
|
|
93
|
+
"@typescript-eslint/eslint-plugin-tslint": "5.15.0",
|
|
94
|
+
"@typescript-eslint/parser": "5.15.0",
|
|
95
95
|
"arraybuffer-loader": "1.0.8",
|
|
96
96
|
"babel-loader": "8.2.3",
|
|
97
|
-
"chai": "4.3.
|
|
97
|
+
"chai": "4.3.6",
|
|
98
98
|
"cheerio": "1.0.0-rc.10",
|
|
99
|
-
"core-js": "3.
|
|
100
|
-
"esbuild": "0.14.
|
|
101
|
-
"eslint": "8.
|
|
99
|
+
"core-js": "3.21.1",
|
|
100
|
+
"esbuild": "0.14.27",
|
|
101
|
+
"eslint": "8.11.0",
|
|
102
102
|
"eslint-plugin-import": "2.25.4",
|
|
103
|
-
"eslint-plugin-jsdoc": "
|
|
104
|
-
"eslint-plugin-react": "7.
|
|
103
|
+
"eslint-plugin-jsdoc": "38.0.4",
|
|
104
|
+
"eslint-plugin-react": "7.29.4",
|
|
105
105
|
"esm": "3.2.25",
|
|
106
|
-
"express": "4.17.
|
|
107
|
-
"highlight.js": "11.
|
|
106
|
+
"express": "4.17.3",
|
|
107
|
+
"highlight.js": "11.5.0",
|
|
108
108
|
"html-entities": "2.3.2",
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"karma": "
|
|
112
|
-
"karma-chrome-launcher": "3.1.0",
|
|
113
|
-
"karma-coverage-istanbul-reporter": "3.0.3",
|
|
109
|
+
"jest": "27.5.1",
|
|
110
|
+
"karma": "6.3.17",
|
|
111
|
+
"karma-chrome-launcher": "3.1.1",
|
|
114
112
|
"karma-firefox-launcher": "2.1.2",
|
|
115
113
|
"karma-mocha": "2.0.1",
|
|
116
114
|
"karma-webpack": "5.0.0",
|
|
117
|
-
"markdown-it": "12.3.
|
|
118
|
-
"mocha": "9.
|
|
115
|
+
"markdown-it": "12.3.2",
|
|
116
|
+
"mocha": "9.2.2",
|
|
119
117
|
"mocha-loader": "5.1.5",
|
|
120
118
|
"raw-loader": "4.0.2",
|
|
121
119
|
"react": "17.0.2",
|
|
@@ -123,15 +121,15 @@
|
|
|
123
121
|
"regenerator-runtime": "0.13.9",
|
|
124
122
|
"rimraf": "3.0.2",
|
|
125
123
|
"semver": "7.3.5",
|
|
126
|
-
"sinon": "
|
|
127
|
-
"terser-webpack-plugin": "5.3.
|
|
128
|
-
"ts-jest": "27.1.
|
|
129
|
-
"ts-loader": "9.2.
|
|
124
|
+
"sinon": "13.0.1",
|
|
125
|
+
"terser-webpack-plugin": "5.3.1",
|
|
126
|
+
"ts-jest": "27.1.3",
|
|
127
|
+
"ts-loader": "9.2.8",
|
|
130
128
|
"tslint": "6.1.3",
|
|
131
|
-
"typescript": "4.
|
|
132
|
-
"webpack": "5.
|
|
129
|
+
"typescript": "4.6.2",
|
|
130
|
+
"webpack": "5.70.0",
|
|
133
131
|
"webpack-bundle-analyzer": "4.5.0",
|
|
134
|
-
"webpack-cli": "4.9.
|
|
132
|
+
"webpack-cli": "4.9.2"
|
|
135
133
|
},
|
|
136
134
|
"scripts-list": {
|
|
137
135
|
"Build a demo page (e.g. to test a code change)": {
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
+
export * from "../__BUILD_DIR__/experimental/index";
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
+
export * from "../__BUILD_DIR__/experimental/index.js";
|
package/sonar-project.properties
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
sonar.projectKey=rx-player
|
|
2
2
|
sonar.organization=rx-player
|
|
3
3
|
sonar.projectName=rx-player
|
|
4
|
-
sonar.projectVersion=3.
|
|
4
|
+
sonar.projectVersion=3.27.0-dev.2022031700
|
|
5
5
|
sonar.sources=./src,./demo,./tests
|
|
6
6
|
sonar.exclusions=demo/full/bundle.js,demo/standalone/lib.js,demo/bundle.js
|
|
7
7
|
sonar.host.url=https://sonarcloud.io
|
package/src/README.md
CHANGED
|
@@ -33,12 +33,12 @@ To better understand the player's architecture, you can find below a
|
|
|
33
33
|
Facilitate track V ~ | ~ Abstract the streaming ^ ~
|
|
34
34
|
switching for +---------------+ | ~ protocol | ~
|
|
35
35
|
the API | | | V | ~
|
|
36
|
-
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
36
|
+
+----------------+ | | +--------------------------+ | ~
|
|
37
|
+
| Content | | Init | ------> | | | ~
|
|
38
|
+
| Decryptor | <---- | (./core/init) | <~~~~~~ | Manifest Fetcher | | ~
|
|
39
|
+
|(./core/decrypt)| ~~~~> | | |(./core/fetchers/manifest)| | ~
|
|
40
|
+
| | | | | | | ~
|
|
41
|
+
+----------------+ +---------------+ +--------------------------+ | ~
|
|
42
42
|
Negotiate content | ^ Initialize Load and refresh the Manifest | ~
|
|
43
43
|
decryption | ~ playback and | ~
|
|
44
44
|
| ~ create/connect | ~
|
|
@@ -40,27 +40,66 @@ describe("compat - shouldFavourSafariMediaKeys", () => {
|
|
|
40
40
|
it("should return false if we are not on Safari", () => {
|
|
41
41
|
jest.mock("../browser_detection", () => {
|
|
42
42
|
return { __esModule: true as const,
|
|
43
|
-
|
|
43
|
+
isSafariDesktop: false,
|
|
44
|
+
isSafariMobile: false };
|
|
44
45
|
});
|
|
45
46
|
const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
|
|
46
47
|
expect(shouldFavourCustomSafariEME.default()).toBe(false);
|
|
47
48
|
});
|
|
48
49
|
|
|
49
50
|
/* eslint-disable max-len */
|
|
50
|
-
it("should return false if we are on Safari but WekitMediaKeys is not available", () => {
|
|
51
|
+
it("should return false if we are on Safari Desktop but WekitMediaKeys is not available", () => {
|
|
51
52
|
/* eslint-enable max-len */
|
|
52
53
|
|
|
53
54
|
win.WebKitMediaKeys = undefined;
|
|
54
55
|
jest.mock("../browser_detection", () => {
|
|
55
56
|
return { __esModule: true as const,
|
|
56
|
-
|
|
57
|
+
isSafariDesktop: true,
|
|
58
|
+
isSafariMobile: false };
|
|
57
59
|
});
|
|
58
60
|
const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
|
|
59
61
|
expect(shouldFavourCustomSafariEME.default()).toBe(false);
|
|
60
62
|
});
|
|
61
63
|
|
|
62
64
|
/* eslint-disable max-len */
|
|
63
|
-
it("should return
|
|
65
|
+
it("should return false if we are on Safari Mobile but WekitMediaKeys is not available", () => {
|
|
66
|
+
/* eslint-enable max-len */
|
|
67
|
+
|
|
68
|
+
win.WebKitMediaKeys = undefined;
|
|
69
|
+
jest.mock("../browser_detection", () => {
|
|
70
|
+
return { __esModule: true as const,
|
|
71
|
+
isSafariDesktop: false,
|
|
72
|
+
isSafariMobile: true };
|
|
73
|
+
});
|
|
74
|
+
const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
|
|
75
|
+
expect(shouldFavourCustomSafariEME.default()).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
/* eslint-disable max-len */
|
|
79
|
+
it("should return true if we are on Safari Desktop and a WebKitMediaKeys implementation is available", () => {
|
|
80
|
+
/* eslint-enable max-len */
|
|
81
|
+
|
|
82
|
+
win.WebKitMediaKeys = {
|
|
83
|
+
isTypeSupported: () => ({}),
|
|
84
|
+
prototype: {
|
|
85
|
+
createSession: () => ({}),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
const proto = win.HTMLMediaElement.prototype as unknown as {
|
|
89
|
+
webkitSetMediaKeys : () => Record<string, never>;
|
|
90
|
+
};
|
|
91
|
+
proto.webkitSetMediaKeys = () => ({});
|
|
92
|
+
jest.mock("../browser_detection", () => {
|
|
93
|
+
return { __esModule: true as const,
|
|
94
|
+
isSafariDesktop: true,
|
|
95
|
+
isSafariMobile: false };
|
|
96
|
+
});
|
|
97
|
+
const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
|
|
98
|
+
expect(shouldFavourCustomSafariEME.default()).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
/* eslint-disable max-len */
|
|
102
|
+
it("should return true if we are on Safari Mobile and a WebKitMediaKeys implementation is available", () => {
|
|
64
103
|
/* eslint-enable max-len */
|
|
65
104
|
|
|
66
105
|
win.WebKitMediaKeys = {
|
|
@@ -75,7 +114,8 @@ describe("compat - shouldFavourSafariMediaKeys", () => {
|
|
|
75
114
|
proto.webkitSetMediaKeys = () => ({});
|
|
76
115
|
jest.mock("../browser_detection", () => {
|
|
77
116
|
return { __esModule: true as const,
|
|
78
|
-
|
|
117
|
+
isSafariDesktop: false,
|
|
118
|
+
isSafariMobile: true };
|
|
79
119
|
});
|
|
80
120
|
const shouldFavourCustomSafariEME = require("../should_favour_custom_safari_EME");
|
|
81
121
|
expect(shouldFavourCustomSafariEME.default()).toBe(true);
|
|
@@ -54,13 +54,15 @@ interface ISafariWindowObject extends Window {
|
|
|
54
54
|
safari? : { pushNotification? : { toString() : string } };
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
/** `true` on Safari on a PC platform (i.e. not iPhone / iPad etc.) */
|
|
58
|
+
const isSafariDesktop : boolean =
|
|
58
59
|
!isNode && (
|
|
59
60
|
Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor") >= 0 ||
|
|
60
61
|
(window as ISafariWindowObject).safari?.pushNotification?.toString() ===
|
|
61
62
|
"[object SafariRemoteNotification]"
|
|
62
63
|
);
|
|
63
64
|
|
|
65
|
+
/** `true` on Safari on an iPhone, iPad & iPod platform */
|
|
64
66
|
const isSafariMobile : boolean = !isNode &&
|
|
65
67
|
typeof navigator.platform === "string" &&
|
|
66
68
|
/iPad|iPhone|iPod/.test(navigator.platform);
|
|
@@ -70,7 +72,7 @@ export {
|
|
|
70
72
|
isIE11,
|
|
71
73
|
isIEOrEdge,
|
|
72
74
|
isFirefox,
|
|
73
|
-
|
|
75
|
+
isSafariDesktop,
|
|
74
76
|
isSafariMobile,
|
|
75
77
|
isSamsungBrowser,
|
|
76
78
|
isTizen,
|
|
@@ -14,65 +14,99 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
race as observableRace,
|
|
24
|
-
timer as observableTimer,
|
|
25
|
-
} from "rxjs";
|
|
26
|
-
import castToObservable from "../../utils/cast_to_observable";
|
|
17
|
+
import log from "../../log";
|
|
18
|
+
import cancellableSleep from "../../utils/cancellable_sleep";
|
|
19
|
+
import PPromise from "../../utils/promise";
|
|
20
|
+
import TaskCanceller, {
|
|
21
|
+
CancellationError,
|
|
22
|
+
} from "../../utils/task_canceller";
|
|
27
23
|
import { ICustomMediaKeySession } from "./custom_media_keys";
|
|
28
24
|
|
|
29
25
|
/**
|
|
30
|
-
* Close
|
|
31
|
-
*
|
|
26
|
+
* Close the given `MediaKeySession` and returns a Promise resolving when the
|
|
27
|
+
* session is closed.
|
|
28
|
+
* This promise does not reject, even if we're unable to close the
|
|
29
|
+
* `MediaKeySession`.
|
|
30
|
+
*
|
|
31
|
+
* Note that there is a lot of browser issues linked to the impossibility to
|
|
32
|
+
* either close a MediaKeySession or to know if a MediaKeySession was closed.
|
|
33
|
+
* Due to this, the returned Promise might take some time before resolving on
|
|
34
|
+
* some devices.
|
|
32
35
|
* @param {MediaKeySession|Object} session
|
|
33
|
-
* @returns {
|
|
36
|
+
* @returns {Promise.<undefined>}
|
|
34
37
|
*/
|
|
35
|
-
export default function closeSession
|
|
36
|
-
session: MediaKeySession|ICustomMediaKeySession
|
|
37
|
-
):
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
38
|
+
export default function closeSession(
|
|
39
|
+
session: MediaKeySession | ICustomMediaKeySession
|
|
40
|
+
): Promise<void> {
|
|
41
|
+
const timeoutCanceller = new TaskCanceller();
|
|
42
|
+
|
|
43
|
+
return PPromise.race([
|
|
44
|
+
session.close()
|
|
45
|
+
.then(() => { timeoutCanceller.cancel(); }),
|
|
46
|
+
// The `closed` promise may resolve, even if `close()` result has not
|
|
47
|
+
// (seen at some point on Firefox).
|
|
48
|
+
session.closed
|
|
49
|
+
.then(() => { timeoutCanceller.cancel(); }),
|
|
50
|
+
waitTimeoutAndCheck(),
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* If the session is not closed after 1000ms, try to communicate with the
|
|
55
|
+
* MediaKeySession and check if an error is returned.
|
|
56
|
+
* This is needed because on some browsers with poor EME implementation,
|
|
57
|
+
* knowing when a MediaKeySession is closed is actually a hard task.
|
|
58
|
+
*
|
|
59
|
+
* The returned Promise will never reject.
|
|
60
|
+
* @returns {Promise.<undefined>}
|
|
61
|
+
*/
|
|
62
|
+
async function waitTimeoutAndCheck() : Promise<void> {
|
|
63
|
+
try {
|
|
64
|
+
await cancellableSleep(1000, timeoutCanceller.signal);
|
|
65
|
+
await tryUpdatingSession();
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if (err instanceof CancellationError) { // cancelled == session closed
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const message = err instanceof Error ?
|
|
71
|
+
err.message :
|
|
72
|
+
"Unknown error made it impossible to close the session";
|
|
73
|
+
log.error(`DRM: ${message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Try to update `MediaKeySession` and check its error if it failed.
|
|
79
|
+
* If we still don't know whether it closed yet, wait a second
|
|
80
|
+
* timeout then quit.
|
|
81
|
+
*
|
|
82
|
+
* The returned Promise resolves if the `MediaKeySession` seems closed and
|
|
83
|
+
* rejects if we couldn't know or it doesn't.
|
|
84
|
+
* @returns {Promise.<undefined>}
|
|
85
|
+
*/
|
|
86
|
+
async function tryUpdatingSession() : Promise<void> {
|
|
87
|
+
try {
|
|
88
|
+
await session.update(new Uint8Array(1));
|
|
89
|
+
} catch (err) {
|
|
90
|
+
if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The caught error can tell if session is closed
|
|
95
|
+
// (Chrome may throw this error)
|
|
96
|
+
// I know... Checking the error message is not the best practice ever.
|
|
97
|
+
if (err instanceof Error &&
|
|
98
|
+
err.message === "The session is already closed."
|
|
99
|
+
) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
await cancellableSleep(1000, timeoutCanceller.signal);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (timeoutCanceller.isUsed) { // Reminder: cancelled == session closed
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
throw new Error("Compat: Couldn't know if session is closed");
|
|
111
|
+
}
|
|
78
112
|
}
|
|
@@ -14,15 +14,9 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import
|
|
18
|
-
defer as observableDefer,
|
|
19
|
-
Observable,
|
|
20
|
-
of as observableOf,
|
|
21
|
-
throwError as observableThrow,
|
|
22
|
-
} from "rxjs";
|
|
17
|
+
import PPromise from "pinkie";
|
|
23
18
|
import { MediaError } from "../../../errors";
|
|
24
19
|
import assert from "../../../utils/assert";
|
|
25
|
-
import castToObservable from "../../../utils/cast_to_observable";
|
|
26
20
|
import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
|
|
27
21
|
import { isIE11 } from "../../browser_detection";
|
|
28
22
|
import isNode from "../../is_node";
|
|
@@ -47,12 +41,18 @@ import { WebKitMediaKeysConstructor } from "./webkit_media_keys_constructor";
|
|
|
47
41
|
/** Generic implementation of the navigator.requestMediaKeySystemAccess API. */
|
|
48
42
|
type ICompatRequestMediaKeySystemAccessFn =
|
|
49
43
|
(keyType : string, config : MediaKeySystemConfiguration[]) =>
|
|
50
|
-
|
|
44
|
+
Promise<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
|
|
51
45
|
|
|
52
|
-
let requestMediaKeySystemAccess :
|
|
46
|
+
let requestMediaKeySystemAccess : ICompatRequestMediaKeySystemAccessFn | null = null;
|
|
53
47
|
|
|
54
|
-
|
|
55
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Set the given MediaKeys on the given HTMLMediaElement.
|
|
50
|
+
* Emits null when done then complete.
|
|
51
|
+
* @param {HTMLMediaElement} elt
|
|
52
|
+
* @param {Object} mediaKeys
|
|
53
|
+
*/
|
|
54
|
+
let setMediaKeys :
|
|
55
|
+
((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => unknown) =
|
|
56
56
|
function defaultSetMediaKeys(
|
|
57
57
|
mediaElement: HTMLMediaElement,
|
|
58
58
|
mediaKeys: MediaKeys | ICustomMediaKeys | null
|
|
@@ -92,11 +92,8 @@ let _setMediaKeys :
|
|
|
92
92
|
if (isNode ||
|
|
93
93
|
(navigator.requestMediaKeySystemAccess != null && !shouldFavourCustomSafariEME())
|
|
94
94
|
) {
|
|
95
|
-
requestMediaKeySystemAccess = (
|
|
96
|
-
|
|
97
|
-
b : MediaKeySystemConfiguration[]
|
|
98
|
-
) : Observable<MediaKeySystemAccess> =>
|
|
99
|
-
castToObservable(navigator.requestMediaKeySystemAccess(a, b));
|
|
95
|
+
requestMediaKeySystemAccess = (...args) =>
|
|
96
|
+
navigator.requestMediaKeySystemAccess(...args);
|
|
100
97
|
} else {
|
|
101
98
|
let isTypeSupported: (keyType: string) => boolean;
|
|
102
99
|
let createCustomMediaKeys: (keyType: string) => ICustomMediaKeys;
|
|
@@ -106,23 +103,23 @@ if (isNode ||
|
|
|
106
103
|
const callbacks = getOldKitWebKitMediaKeyCallbacks();
|
|
107
104
|
isTypeSupported = callbacks.isTypeSupported;
|
|
108
105
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
109
|
-
|
|
106
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
110
107
|
// This is for WebKit with prefixed EME api
|
|
111
108
|
} else if (WebKitMediaKeysConstructor !== undefined) {
|
|
112
109
|
const callbacks = getWebKitMediaKeysCallbacks();
|
|
113
110
|
isTypeSupported = callbacks.isTypeSupported;
|
|
114
111
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
115
|
-
|
|
112
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
116
113
|
} else if (isIE11 && MSMediaKeysConstructor !== undefined) {
|
|
117
114
|
const callbacks = getIE11MediaKeysCallbacks();
|
|
118
115
|
isTypeSupported = callbacks.isTypeSupported;
|
|
119
116
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
120
|
-
|
|
117
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
121
118
|
} else if (MozMediaKeysConstructor !== undefined) {
|
|
122
119
|
const callbacks = getMozMediaKeysCallbacks();
|
|
123
120
|
isTypeSupported = callbacks.isTypeSupported;
|
|
124
121
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
125
|
-
|
|
122
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
126
123
|
} else {
|
|
127
124
|
const MK = window.MediaKeys as unknown as typeof MediaKeys & {
|
|
128
125
|
isTypeSupported? : (keyType : string) => boolean;
|
|
@@ -155,9 +152,9 @@ if (isNode ||
|
|
|
155
152
|
requestMediaKeySystemAccess = function(
|
|
156
153
|
keyType : string,
|
|
157
154
|
keySystemConfigurations : MediaKeySystemConfiguration[]
|
|
158
|
-
) :
|
|
155
|
+
) : Promise<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
|
|
159
156
|
if (!isTypeSupported(keyType)) {
|
|
160
|
-
return
|
|
157
|
+
return PPromise.reject(new Error("Unsupported key type"));
|
|
161
158
|
}
|
|
162
159
|
|
|
163
160
|
for (let i = 0; i < keySystemConfigurations.length; i++) {
|
|
@@ -188,7 +185,7 @@ if (isNode ||
|
|
|
188
185
|
|
|
189
186
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
190
187
|
const customMediaKeys = createCustomMediaKeys(keyType);
|
|
191
|
-
return
|
|
188
|
+
return PPromise.resolve(
|
|
192
189
|
new CustomMediaKeySystemAccess(keyType,
|
|
193
190
|
customMediaKeys,
|
|
194
191
|
keySystemConfigurationResponse)
|
|
@@ -196,24 +193,10 @@ if (isNode ||
|
|
|
196
193
|
}
|
|
197
194
|
}
|
|
198
195
|
|
|
199
|
-
return
|
|
196
|
+
return PPromise.reject(new Error("Unsupported configuration"));
|
|
200
197
|
};
|
|
201
198
|
}
|
|
202
199
|
|
|
203
|
-
/**
|
|
204
|
-
* Set the given MediaKeys on the given HTMLMediaElement.
|
|
205
|
-
* Emits null when done then complete.
|
|
206
|
-
* @param {HTMLMediaElement} elt
|
|
207
|
-
* @param {Object} mediaKeys
|
|
208
|
-
* @returns {Observable}
|
|
209
|
-
*/
|
|
210
|
-
function setMediaKeys(
|
|
211
|
-
elt : HTMLMediaElement,
|
|
212
|
-
mediaKeys : MediaKeys|ICustomMediaKeys|null
|
|
213
|
-
) : Observable<unknown> {
|
|
214
|
-
return observableDefer(() => castToObservable(_setMediaKeys(elt, mediaKeys)));
|
|
215
|
-
}
|
|
216
|
-
|
|
217
200
|
export {
|
|
218
201
|
requestMediaKeySystemAccess,
|
|
219
202
|
setMediaKeys,
|