rx-player 3.26.3-dev.2022021400 → 3.27.0-dev.2022032100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +0 -4
- package/CHANGELOG.md +17 -2
- package/FILES.md +5 -4
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +4 -2
- package/dist/_esm5.processed/compat/browser_detection.js +4 -2
- package/dist/_esm5.processed/compat/eme/close_session.d.ts +11 -5
- package/dist/_esm5.processed/compat/eme/close_session.js +143 -36
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.d.ts +15 -0
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.js +1 -17
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +6 -7
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.d.ts +3 -5
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +20 -22
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +58 -40
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +49 -48
- package/dist/_esm5.processed/compat/eme/generate_key_request.d.ts +2 -3
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +22 -26
- package/dist/_esm5.processed/compat/eme/load_session.d.ts +1 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +67 -17
- package/dist/_esm5.processed/compat/event_listeners.js +2 -1
- package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +2 -2
- package/dist/_esm5.processed/config.d.ts +166 -1080
- package/dist/_esm5.processed/config.js +17 -1119
- package/dist/_esm5.processed/core/abr/bandwidth_estimator.js +4 -1
- package/dist/_esm5.processed/core/abr/network_analyzer.js +2 -1
- package/dist/_esm5.processed/core/api/get_player_state.js +1 -1
- package/dist/_esm5.processed/core/api/index.d.ts +2 -1
- package/dist/_esm5.processed/core/api/media_element_track_choice_manager.js +2 -1
- package/dist/_esm5.processed/core/api/option_utils.d.ts +6 -3
- package/dist/_esm5.processed/core/api/option_utils.js +21 -7
- package/dist/_esm5.processed/core/api/playback_observer.js +5 -1
- package/dist/_esm5.processed/core/api/public_api.d.ts +82 -71
- package/dist/_esm5.processed/core/api/public_api.js +73 -35
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.d.ts +7 -49
- package/dist/_esm5.processed/core/{eme → decrypt}/__tests__/__global__/utils.js +25 -65
- package/dist/_esm5.processed/core/{eme → decrypt}/attach_media_keys.d.ts +12 -12
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +103 -0
- package/dist/_esm5.processed/core/{eme/clear_eme_session.d.ts → decrypt/clear_on_stop.d.ts} +3 -4
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +40 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.d.ts +216 -0
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +865 -0
- package/dist/_esm5.processed/core/{eme/get_session.d.ts → decrypt/create_or_load_session.d.ts} +28 -26
- package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +124 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/create_session.d.ts +22 -19
- package/dist/_esm5.processed/core/decrypt/create_session.js +173 -0
- package/dist/_esm5.processed/core/{eme/dispose_media_keys.d.ts → decrypt/dispose_decryption_resources.d.ts} +4 -4
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +81 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/find_key_system.d.ts +11 -14
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +299 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/get_current_key_system.js +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/get_media_keys.d.ts +13 -5
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +153 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/index.d.ts +5 -6
- package/dist/_esm5.processed/core/{eme → decrypt}/index.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt}/init_media_keys.d.ts +6 -4
- package/dist/_esm5.processed/core/decrypt/init_media_keys.js +82 -0
- package/dist/_esm5.processed/core/decrypt/session_events_listener.d.ts +77 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/session_events_listener.js +25 -24
- package/dist/_esm5.processed/core/{eme → decrypt}/set_server_certificate.d.ts +15 -6
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +141 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/types.d.ts +119 -241
- package/dist/_esm5.processed/core/{eme → decrypt}/types.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.d.ts +3 -3
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/are_init_values_compatible.js +5 -5
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.d.ts +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/check_key_statuses.js +4 -3
- package/dist/_esm5.processed/core/{eme/utils/close_session.d.ts → decrypt/utils/clean_old_loaded_sessions.d.ts} +8 -7
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +84 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.js +2 -2
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.d.ts +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/get_drm_system_id.js +1 -1
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.d.ts +69 -0
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +99 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.d.ts +0 -1
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/is_session_usable.js +4 -5
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.d.ts +44 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +77 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.d.ts +104 -0
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +155 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.d.ts +108 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +302 -0
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.d.ts +4 -4
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/media_keys_infos_store.js +0 -0
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.d.ts +8 -18
- package/dist/_esm5.processed/core/{eme → decrypt}/utils/persistent_sessions_store.js +119 -97
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.d.ts → decrypt/utils/serializable_bytes.d.ts} +8 -5
- package/dist/_esm5.processed/core/{eme/utils/init_data_container.js → decrypt/utils/serializable_bytes.js} +9 -9
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.d.ts +1 -1
- package/dist/_esm5.processed/core/{eme → decrypt/utils}/server_certificate_store.js +1 -1
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +3 -5
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +1 -1
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +1 -1
- package/dist/_esm5.processed/core/fetchers/utils/try_urls_with_backoff.js +2 -3
- package/dist/_esm5.processed/core/init/get_initial_time.js +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.d.ts +1 -1
- package/dist/_esm5.processed/core/init/initialize_directfile.js +11 -17
- package/dist/_esm5.processed/core/init/initialize_media_source.d.ts +6 -3
- package/dist/_esm5.processed/core/init/initialize_media_source.js +18 -69
- package/dist/_esm5.processed/core/init/link_drm_and_content.d.ts +61 -0
- package/dist/_esm5.processed/core/init/link_drm_and_content.js +94 -0
- package/dist/_esm5.processed/core/init/manifest_update_scheduler.js +2 -1
- package/dist/_esm5.processed/core/init/stall_avoider.js +1 -1
- package/dist/_esm5.processed/core/init/stream_events_emitter/stream_events_emitter.js +1 -1
- package/dist/_esm5.processed/core/init/types.d.ts +2 -4
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +3 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.d.ts +17 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +22 -5
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.d.ts +2 -1
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +6 -3
- package/dist/_esm5.processed/core/stream/events_generators.d.ts +8 -3
- package/dist/_esm5.processed/core/stream/events_generators.js +3 -2
- package/dist/_esm5.processed/core/stream/index.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +3 -3
- package/dist/_esm5.processed/core/stream/period/create_empty_adaptation_stream.js +2 -1
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.d.ts +15 -11
- package/dist/_esm5.processed/core/stream/period/get_adaptation_switch_strategy.js +6 -3
- package/dist/_esm5.processed/core/stream/period/index.d.ts +1 -0
- package/dist/_esm5.processed/core/stream/period/period_stream.d.ts +5 -12
- package/dist/_esm5.processed/core/stream/period/period_stream.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/force_garbage_collection.js +2 -2
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.d.ts +6 -1
- package/dist/_esm5.processed/core/stream/representation/get_buffer_status.js +12 -9
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.d.ts +19 -14
- package/dist/_esm5.processed/core/stream/representation/get_needed_segments.js +86 -10
- package/dist/_esm5.processed/core/stream/representation/get_segment_priority.js +1 -1
- package/dist/_esm5.processed/core/stream/representation/push_media_segment.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/representation_stream.d.ts +6 -0
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +19 -8
- package/dist/_esm5.processed/core/stream/types.d.ts +1 -1
- package/dist/_esm5.processed/default_config.d.ts +1114 -0
- package/dist/_esm5.processed/default_config.js +1145 -0
- package/dist/_esm5.processed/experimental/index.d.ts +2 -0
- package/dist/_esm5.processed/experimental/index.js +2 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/push_data.d.ts +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/thumbnail_loader.js +6 -7
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +2 -3
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.d.ts +15 -0
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +3 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +3 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +1 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +1 -2
- package/dist/_esm5.processed/features/features_object.js +1 -1
- package/dist/_esm5.processed/features/initialize_features.js +1 -1
- package/dist/_esm5.processed/features/list/eme.d.ts +3 -3
- package/dist/_esm5.processed/features/list/eme.js +5 -5
- package/dist/_esm5.processed/features/types.d.ts +3 -3
- package/dist/_esm5.processed/manifest/manifest.d.ts +1 -14
- package/dist/_esm5.processed/manifest/manifest.js +10 -74
- package/dist/_esm5.processed/manifest/representation.d.ts +35 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/is_period_fulfilled.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +87 -75
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +1 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +4 -5
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +3 -2
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/image_pipelines.d.ts +4 -3
- package/dist/_esm5.processed/transports/dash/image_pipelines.js +60 -11
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +2 -3
- package/dist/_esm5.processed/transports/dash/segment_loader.d.ts +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +3 -4
- package/dist/_esm5.processed/transports/dash/segment_parser.js +6 -3
- package/dist/_esm5.processed/transports/dash/text_loader.js +1 -2
- package/dist/_esm5.processed/transports/dash/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/local/segment_loader.js +2 -3
- package/dist/_esm5.processed/transports/local/segment_parser.js +4 -1
- package/dist/_esm5.processed/transports/local/text_parser.js +8 -2
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +2 -3
- package/dist/_esm5.processed/transports/smooth/pipelines.js +71 -14
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +3 -4
- package/dist/_esm5.processed/transports/types.d.ts +22 -0
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +1 -2
- package/dist/_esm5.processed/utils/cancellable_sleep.js +1 -2
- package/dist/_esm5.processed/utils/cast_to_observable.js +1 -3
- package/dist/_esm5.processed/utils/deep_merge.d.ts +12 -0
- package/dist/_esm5.processed/utils/deep_merge.js +53 -0
- package/dist/_esm5.processed/utils/reference.d.ts +29 -0
- package/dist/_esm5.processed/utils/reference.js +72 -24
- package/dist/_esm5.processed/utils/request/fetch.js +1 -2
- package/dist/_esm5.processed/utils/request/xhr.js +2 -3
- package/dist/_esm5.processed/utils/rx-from_cancellable_promise.js +7 -2
- package/dist/_esm5.processed/utils/task_canceller.d.ts +5 -3
- package/dist/_esm5.processed/utils/task_canceller.js +3 -3
- package/dist/rx-player.js +4936 -3340
- package/dist/rx-player.min.js +1 -1
- package/dummy +1 -0
- package/{dist/_esm5.processed/utils/promise.d.ts → experimental/index.d.ts} +1 -2
- package/{dist/_esm5.processed/utils/promise.js → experimental/index.js} +1 -3
- package/package.json +32 -35
- package/{src/typings/pinkie.d.ts → scripts/build/templates/experimental/index.d.ts} +1 -4
- package/scripts/build/templates/experimental/index.js +16 -0
- package/scripts/update-version +2 -2
- package/sonar-project.properties +1 -1
- package/src/README.md +6 -6
- package/src/compat/__tests__/play.test.ts +2 -4
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +45 -5
- package/src/compat/browser_detection.ts +4 -2
- package/src/compat/eme/close_session.ts +89 -56
- package/src/compat/eme/custom_key_system_access.ts +1 -2
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +6 -7
- package/src/compat/eme/custom_media_keys/index.ts +20 -38
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +68 -52
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +57 -56
- package/src/compat/eme/generate_key_request.ts +25 -33
- package/src/compat/eme/load_session.ts +28 -31
- package/src/compat/event_listeners.ts +2 -1
- package/src/compat/should_favour_custom_safari_EME.ts +5 -2
- package/src/config.ts +17 -1210
- package/src/core/README.md +1 -1
- package/src/core/abr/bandwidth_estimator.ts +4 -4
- package/src/core/abr/network_analyzer.ts +5 -6
- package/src/core/api/__tests__/get_player_state.test.ts +3 -3
- package/src/core/api/__tests__/option_utils.test.ts +29 -17
- package/src/core/api/get_player_state.ts +1 -1
- package/src/core/api/index.ts +3 -0
- package/src/core/api/option_utils.ts +42 -23
- package/src/core/api/playback_observer.ts +12 -8
- package/src/core/api/public_api.ts +152 -113
- package/src/core/decrypt/README.md +22 -0
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +418 -0
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +675 -0
- package/src/core/{eme → decrypt}/__tests__/__global__/media_key_system_access.test.ts +99 -92
- package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +156 -0
- package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +262 -0
- package/src/core/{eme → decrypt}/__tests__/__global__/utils.ts +31 -93
- package/src/core/{eme → decrypt}/attach_media_keys.ts +48 -56
- package/src/core/decrypt/clear_on_stop.ts +47 -0
- package/src/core/decrypt/content_decryptor.ts +1157 -0
- package/src/core/decrypt/create_or_load_session.ts +130 -0
- package/src/core/decrypt/create_session.ts +174 -0
- package/src/core/decrypt/dispose_decryption_resources.ts +39 -0
- package/src/core/{eme → decrypt}/find_key_system.ts +111 -122
- package/src/core/{eme → decrypt}/get_current_key_system.ts +1 -1
- package/src/core/decrypt/get_media_keys.ts +145 -0
- package/src/core/{eme → decrypt}/index.ts +11 -8
- package/src/core/decrypt/init_media_keys.ts +51 -0
- package/src/core/{eme → decrypt}/session_events_listener.ts +93 -55
- package/src/core/decrypt/set_server_certificate.ts +104 -0
- package/src/core/{eme → decrypt}/types.ts +128 -258
- package/src/core/{eme → decrypt}/utils/__tests__/are_init_values_compatible.test.ts +1 -1
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_loaded_sessions.test.ts +29 -71
- package/src/core/{eme → decrypt/utils}/__tests__/clean_old_stored_persistent_info.test.ts +6 -6
- package/src/core/{eme → decrypt}/utils/are_init_values_compatible.ts +9 -9
- package/src/core/{eme → decrypt/utils}/check_key_statuses.ts +6 -5
- package/{dist/_esm5.processed/core/eme/clean_old_loaded_sessions.js → src/core/decrypt/utils/clean_old_loaded_sessions.ts} +19 -20
- package/src/core/{eme → decrypt/utils}/clean_old_stored_persistent_info.ts +3 -3
- package/src/core/{eme → decrypt/utils}/get_drm_system_id.ts +1 -1
- package/src/core/decrypt/utils/init_data_values_container.ts +119 -0
- package/src/core/{eme → decrypt}/utils/is_session_usable.ts +4 -5
- package/src/core/decrypt/utils/key_id_comparison.ts +82 -0
- package/src/core/decrypt/utils/key_session_record.ts +175 -0
- package/src/core/decrypt/utils/loaded_sessions_store.ts +317 -0
- package/src/core/{eme → decrypt/utils}/media_keys_infos_store.ts +4 -4
- package/src/core/{eme → decrypt}/utils/persistent_sessions_store.ts +122 -104
- package/src/core/{eme/utils/init_data_container.ts → decrypt/utils/serializable_bytes.ts} +8 -5
- package/src/core/{eme → decrypt/utils}/server_certificate_store.ts +2 -2
- package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -7
- package/src/core/fetchers/segment/segment_fetcher.ts +4 -4
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +2 -2
- package/src/core/fetchers/utils/try_urls_with_backoff.ts +2 -3
- package/src/core/init/.initialize_media_source.ts.un~ +0 -0
- package/src/core/init/get_initial_time.ts +2 -1
- package/src/core/init/initialize_directfile.ts +17 -20
- package/src/core/init/initialize_media_source.ts +44 -106
- package/src/core/init/link_drm_and_content.ts +176 -0
- package/src/core/init/manifest_update_scheduler.ts +5 -3
- package/src/core/init/stall_avoider.ts +6 -5
- package/src/core/init/stream_events_emitter/stream_events_emitter.ts +2 -1
- package/src/core/init/types.ts +1 -39
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +2 -1
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +3 -4
- package/src/core/segment_buffers/inventory/segment_inventory.ts +42 -8
- package/src/core/stream/adaptation/adaptation_stream.ts +7 -1
- package/src/core/stream/events_generators.ts +9 -4
- package/src/core/stream/index.ts +1 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +9 -4
- package/src/core/stream/period/create_empty_adaptation_stream.ts +2 -1
- package/src/core/stream/period/get_adaptation_switch_strategy.ts +25 -15
- package/src/core/stream/period/index.ts +1 -0
- package/src/core/stream/period/period_stream.ts +10 -16
- package/src/core/stream/representation/force_garbage_collection.ts +2 -2
- package/src/core/stream/representation/get_buffer_status.ts +28 -16
- package/src/core/stream/representation/get_needed_segments.ts +124 -28
- package/src/core/stream/representation/get_segment_priority.ts +1 -2
- package/src/core/stream/representation/push_media_segment.ts +3 -2
- package/src/core/stream/representation/representation_stream.ts +30 -7
- package/src/core/stream/types.ts +1 -1
- package/src/default_config.ts +1241 -0
- package/src/experimental/index.ts +5 -0
- package/src/experimental/tools/VideoThumbnailLoader/push_data.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/thumbnail_loader.ts +7 -7
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +3 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +9 -10
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +2 -4
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +2 -3
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +3 -5
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +3 -5
- package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +1 -2
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.ts +1 -2
- package/src/features/__tests__/initialize_features.test.ts +2 -2
- package/src/features/features_object.ts +1 -1
- package/src/features/initialize_features.ts +1 -1
- package/src/features/list/__tests__/eme.test.ts +5 -5
- package/src/features/list/eme.ts +5 -5
- package/src/features/types.ts +3 -10
- package/src/manifest/manifest.ts +6 -76
- package/src/manifest/representation.ts +36 -3
- package/src/parsers/manifest/dash/common/indexes/is_period_fulfilled.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/template.ts +1 -2
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +1 -1
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +109 -64
- package/src/parsers/manifest/dash/common/parse_mpd.ts +1 -2
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +4 -5
- package/src/parsers/manifest/smooth/create_parser.ts +1 -0
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +1 -0
- package/src/public_types.ts +6 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +1 -2
- package/src/transports/dash/image_pipelines.ts +15 -14
- package/src/transports/dash/init_segment_loader.ts +1 -2
- package/src/transports/dash/manifest_parser.ts +2 -3
- package/src/transports/dash/segment_loader.ts +4 -5
- package/src/transports/dash/segment_parser.ts +5 -0
- package/src/transports/dash/text_loader.ts +2 -3
- package/src/transports/dash/text_parser.ts +8 -0
- package/src/transports/local/segment_loader.ts +2 -3
- package/src/transports/local/segment_parser.ts +4 -0
- package/src/transports/local/text_parser.ts +8 -0
- package/src/transports/metaplaylist/pipelines.ts +2 -3
- package/src/transports/smooth/pipelines.ts +26 -14
- package/src/transports/smooth/segment_loader.ts +5 -6
- package/src/transports/types.ts +22 -0
- package/src/transports/utils/call_custom_manifest_loader.ts +1 -2
- package/src/utils/__tests__/deep_merge.test.ts +48 -0
- package/src/utils/cancellable_sleep.ts +1 -2
- package/src/utils/cast_to_observable.ts +0 -2
- package/src/utils/deep_merge.ts +46 -0
- package/src/utils/reference.ts +116 -23
- package/src/utils/request/fetch.ts +1 -2
- package/src/utils/request/xhr.ts +3 -3
- package/src/utils/rx-from_cancellable_promise.ts +7 -2
- package/src/utils/task_canceller.ts +6 -4
- package/tsconfig.json +0 -1
- package/tsconfig.modules.json +0 -1
- package/dist/_esm5.processed/core/eme/attach_media_keys.js +0 -57
- package/dist/_esm5.processed/core/eme/clean_old_loaded_sessions.d.ts +0 -59
- package/dist/_esm5.processed/core/eme/clear_eme_session.js +0 -50
- package/dist/_esm5.processed/core/eme/create_session.js +0 -126
- package/dist/_esm5.processed/core/eme/dispose_eme.d.ts +0 -19
- package/dist/_esm5.processed/core/eme/dispose_eme.js +0 -23
- package/dist/_esm5.processed/core/eme/dispose_media_keys.js +0 -36
- package/dist/_esm5.processed/core/eme/eme_manager.d.ts +0 -31
- package/dist/_esm5.processed/core/eme/eme_manager.js +0 -278
- package/dist/_esm5.processed/core/eme/find_key_system.js +0 -253
- package/dist/_esm5.processed/core/eme/get_media_keys.js +0 -85
- package/dist/_esm5.processed/core/eme/get_session.js +0 -68
- package/dist/_esm5.processed/core/eme/init_media_keys.js +0 -66
- package/dist/_esm5.processed/core/eme/session_events_listener.d.ts +0 -41
- package/dist/_esm5.processed/core/eme/set_server_certificate.js +0 -85
- package/dist/_esm5.processed/core/eme/utils/close_session.js +0 -81
- package/dist/_esm5.processed/core/eme/utils/init_data_store.d.ts +0 -115
- package/dist/_esm5.processed/core/eme/utils/init_data_store.js +0 -181
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.d.ts +0 -123
- package/dist/_esm5.processed/core/eme/utils/loaded_sessions_store.js +0 -173
- package/dist/_esm5.processed/core/init/create_eme_manager.d.ts +0 -34
- package/dist/_esm5.processed/core/init/create_eme_manager.js +0 -52
- package/src/core/eme/README.md +0 -26
- package/src/core/eme/__tests__/__global__/get_license.test.ts +0 -414
- package/src/core/eme/__tests__/__global__/init_data.test.ts +0 -908
- package/src/core/eme/__tests__/__global__/media_keys.test.ts +0 -266
- package/src/core/eme/__tests__/__global__/server_certificate.test.ts +0 -364
- package/src/core/eme/__tests__/init_media_keys.test.ts +0 -182
- package/src/core/eme/clean_old_loaded_sessions.ts +0 -96
- package/src/core/eme/clear_eme_session.ts +0 -62
- package/src/core/eme/create_session.ts +0 -187
- package/src/core/eme/dispose_eme.ts +0 -25
- package/src/core/eme/dispose_media_keys.ts +0 -46
- package/src/core/eme/eme_manager.ts +0 -387
- package/src/core/eme/get_media_keys.ts +0 -141
- package/src/core/eme/get_session.ts +0 -135
- package/src/core/eme/init_media_keys.ts +0 -106
- package/src/core/eme/set_server_certificate.ts +0 -115
- package/src/core/eme/utils/close_session.ts +0 -113
- package/src/core/eme/utils/init_data_store.ts +0 -234
- package/src/core/eme/utils/loaded_sessions_store.ts +0 -235
- package/src/core/init/create_eme_manager.ts +0 -95
- package/src/utils/__tests__/promise.test.ts +0 -23
- package/src/utils/promise.ts +0 -20
|
@@ -14,15 +14,8 @@
|
|
|
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";
|
|
23
17
|
import { MediaError } from "../../../errors";
|
|
24
18
|
import assert from "../../../utils/assert";
|
|
25
|
-
import castToObservable from "../../../utils/cast_to_observable";
|
|
26
19
|
import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
|
|
27
20
|
import { isIE11 } from "../../browser_detection";
|
|
28
21
|
import isNode from "../../is_node";
|
|
@@ -47,12 +40,18 @@ import { WebKitMediaKeysConstructor } from "./webkit_media_keys_constructor";
|
|
|
47
40
|
/** Generic implementation of the navigator.requestMediaKeySystemAccess API. */
|
|
48
41
|
type ICompatRequestMediaKeySystemAccessFn =
|
|
49
42
|
(keyType : string, config : MediaKeySystemConfiguration[]) =>
|
|
50
|
-
|
|
43
|
+
Promise<MediaKeySystemAccess | CustomMediaKeySystemAccess>;
|
|
51
44
|
|
|
52
|
-
let requestMediaKeySystemAccess :
|
|
45
|
+
let requestMediaKeySystemAccess : ICompatRequestMediaKeySystemAccessFn | null = null;
|
|
53
46
|
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Set the given MediaKeys on the given HTMLMediaElement.
|
|
49
|
+
* Emits null when done then complete.
|
|
50
|
+
* @param {HTMLMediaElement} elt
|
|
51
|
+
* @param {Object} mediaKeys
|
|
52
|
+
*/
|
|
53
|
+
let setMediaKeys :
|
|
54
|
+
((elt: HTMLMediaElement, mediaKeys: MediaKeys | ICustomMediaKeys | null) => unknown) =
|
|
56
55
|
function defaultSetMediaKeys(
|
|
57
56
|
mediaElement: HTMLMediaElement,
|
|
58
57
|
mediaKeys: MediaKeys | ICustomMediaKeys | null
|
|
@@ -92,11 +91,8 @@ let _setMediaKeys :
|
|
|
92
91
|
if (isNode ||
|
|
93
92
|
(navigator.requestMediaKeySystemAccess != null && !shouldFavourCustomSafariEME())
|
|
94
93
|
) {
|
|
95
|
-
requestMediaKeySystemAccess = (
|
|
96
|
-
|
|
97
|
-
b : MediaKeySystemConfiguration[]
|
|
98
|
-
) : Observable<MediaKeySystemAccess> =>
|
|
99
|
-
castToObservable(navigator.requestMediaKeySystemAccess(a, b));
|
|
94
|
+
requestMediaKeySystemAccess = (...args) =>
|
|
95
|
+
navigator.requestMediaKeySystemAccess(...args);
|
|
100
96
|
} else {
|
|
101
97
|
let isTypeSupported: (keyType: string) => boolean;
|
|
102
98
|
let createCustomMediaKeys: (keyType: string) => ICustomMediaKeys;
|
|
@@ -106,23 +102,23 @@ if (isNode ||
|
|
|
106
102
|
const callbacks = getOldKitWebKitMediaKeyCallbacks();
|
|
107
103
|
isTypeSupported = callbacks.isTypeSupported;
|
|
108
104
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
109
|
-
|
|
105
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
110
106
|
// This is for WebKit with prefixed EME api
|
|
111
107
|
} else if (WebKitMediaKeysConstructor !== undefined) {
|
|
112
108
|
const callbacks = getWebKitMediaKeysCallbacks();
|
|
113
109
|
isTypeSupported = callbacks.isTypeSupported;
|
|
114
110
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
115
|
-
|
|
111
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
116
112
|
} else if (isIE11 && MSMediaKeysConstructor !== undefined) {
|
|
117
113
|
const callbacks = getIE11MediaKeysCallbacks();
|
|
118
114
|
isTypeSupported = callbacks.isTypeSupported;
|
|
119
115
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
120
|
-
|
|
116
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
121
117
|
} else if (MozMediaKeysConstructor !== undefined) {
|
|
122
118
|
const callbacks = getMozMediaKeysCallbacks();
|
|
123
119
|
isTypeSupported = callbacks.isTypeSupported;
|
|
124
120
|
createCustomMediaKeys = callbacks.createCustomMediaKeys;
|
|
125
|
-
|
|
121
|
+
setMediaKeys = callbacks.setMediaKeys;
|
|
126
122
|
} else {
|
|
127
123
|
const MK = window.MediaKeys as unknown as typeof MediaKeys & {
|
|
128
124
|
isTypeSupported? : (keyType : string) => boolean;
|
|
@@ -155,9 +151,9 @@ if (isNode ||
|
|
|
155
151
|
requestMediaKeySystemAccess = function(
|
|
156
152
|
keyType : string,
|
|
157
153
|
keySystemConfigurations : MediaKeySystemConfiguration[]
|
|
158
|
-
) :
|
|
154
|
+
) : Promise<MediaKeySystemAccess|CustomMediaKeySystemAccess> {
|
|
159
155
|
if (!isTypeSupported(keyType)) {
|
|
160
|
-
return
|
|
156
|
+
return Promise.reject(new Error("Unsupported key type"));
|
|
161
157
|
}
|
|
162
158
|
|
|
163
159
|
for (let i = 0; i < keySystemConfigurations.length; i++) {
|
|
@@ -188,7 +184,7 @@ if (isNode ||
|
|
|
188
184
|
|
|
189
185
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
190
186
|
const customMediaKeys = createCustomMediaKeys(keyType);
|
|
191
|
-
return
|
|
187
|
+
return Promise.resolve(
|
|
192
188
|
new CustomMediaKeySystemAccess(keyType,
|
|
193
189
|
customMediaKeys,
|
|
194
190
|
keySystemConfigurationResponse)
|
|
@@ -196,24 +192,10 @@ if (isNode ||
|
|
|
196
192
|
}
|
|
197
193
|
}
|
|
198
194
|
|
|
199
|
-
return
|
|
195
|
+
return Promise.reject(new Error("Unsupported configuration"));
|
|
200
196
|
};
|
|
201
197
|
}
|
|
202
198
|
|
|
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
199
|
export {
|
|
218
200
|
requestMediaKeySystemAccess,
|
|
219
201
|
setMediaKeys,
|
|
@@ -14,16 +14,10 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
merge as observableMerge,
|
|
19
|
-
Subject,
|
|
20
|
-
takeUntil,
|
|
21
|
-
} from "rxjs";
|
|
22
17
|
import { base64ToBytes } from "../../../utils/base64";
|
|
23
18
|
import EventEmitter from "../../../utils/event_emitter";
|
|
24
|
-
import
|
|
19
|
+
import noop from "../../../utils/noop";
|
|
25
20
|
import { utf8ToStr } from "../../../utils/string_parsing";
|
|
26
|
-
import * as events from "../../event_listeners";
|
|
27
21
|
import {
|
|
28
22
|
ICustomMediaKeys,
|
|
29
23
|
ICustomMediaKeySession,
|
|
@@ -54,11 +48,16 @@ export function isOldWebkitMediaElement(
|
|
|
54
48
|
.webkitGenerateKeyRequest === "function";
|
|
55
49
|
}
|
|
56
50
|
|
|
51
|
+
/**
|
|
52
|
+
* MediaKeySession implementation for older versions of WebKit relying on APIs
|
|
53
|
+
* such as `webkitGenerateKeyRequest` `webkitAddKey` to be called on the
|
|
54
|
+
* HTMLMediaElement.
|
|
55
|
+
* @class OldWebkitMediaKeySession
|
|
56
|
+
*/
|
|
57
57
|
class OldWebkitMediaKeySession
|
|
58
58
|
extends EventEmitter<IMediaKeySessionEvents>
|
|
59
59
|
implements ICustomMediaKeySession
|
|
60
60
|
{
|
|
61
|
-
public readonly update: (license: Uint8Array) => Promise<void>;
|
|
62
61
|
public readonly closed: Promise<void>;
|
|
63
62
|
public expiration: number;
|
|
64
63
|
public keyStatuses: ICustomMediaKeyStatusMap;
|
|
@@ -66,75 +65,92 @@ class OldWebkitMediaKeySession
|
|
|
66
65
|
|
|
67
66
|
private readonly _vid: IOldWebkitHTMLMediaElement;
|
|
68
67
|
private readonly _key: string;
|
|
69
|
-
|
|
68
|
+
|
|
69
|
+
private readonly _onSessionRelatedEvent : (evt : Event) => void;
|
|
70
|
+
private _closeSession : () => void;
|
|
70
71
|
|
|
71
72
|
constructor(mediaElement: IOldWebkitHTMLMediaElement, keySystem: string) {
|
|
72
73
|
super();
|
|
73
|
-
this._closeSession$ = new Subject();
|
|
74
74
|
this._vid = mediaElement;
|
|
75
75
|
this._key = keySystem;
|
|
76
76
|
|
|
77
77
|
this.sessionId = "";
|
|
78
|
-
this.
|
|
79
|
-
|
|
78
|
+
this._closeSession = noop; // Just here to make TypeScript happy
|
|
79
|
+
this.closed = new Promise((resolve) => {
|
|
80
|
+
this._closeSession = resolve;
|
|
80
81
|
});
|
|
81
82
|
this.keyStatuses = new Map();
|
|
82
83
|
this.expiration = NaN;
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
events.onKeyError$(mediaElement))
|
|
87
|
-
.pipe(takeUntil(this._closeSession$))
|
|
88
|
-
.subscribe((evt: Event) => this.trigger(evt.type, evt));
|
|
89
|
-
|
|
90
|
-
this.update = (license: Uint8Array) => {
|
|
91
|
-
return new PPromise((resolve, reject) => {
|
|
92
|
-
try {
|
|
93
|
-
if (this._key.indexOf("clearkey") >= 0) {
|
|
94
|
-
const licenseTypedArray =
|
|
95
|
-
license instanceof ArrayBuffer ? new Uint8Array(license) :
|
|
96
|
-
license;
|
|
97
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
98
|
-
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
99
|
-
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
100
|
-
const json = JSON.parse(utf8ToStr(licenseTypedArray));
|
|
101
|
-
const key = base64ToBytes(json.keys[0].k);
|
|
102
|
-
const kid = base64ToBytes(json.keys[0].kid);
|
|
103
|
-
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
104
|
-
/* eslint-enable @typescript-eslint/no-unsafe-argument */
|
|
105
|
-
/* eslint-enable @typescript-eslint/no-unsafe-assignment */
|
|
106
|
-
resolve(this._vid.webkitAddKey(this._key, key, kid, /* sessionId */ ""));
|
|
107
|
-
} else {
|
|
108
|
-
resolve(this._vid.webkitAddKey(this._key, license, null, /* sessionId */ ""));
|
|
109
|
-
}
|
|
110
|
-
} catch (err) {
|
|
111
|
-
reject(err);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
85
|
+
this._onSessionRelatedEvent = (evt : Event) => {
|
|
86
|
+
this.trigger(evt.type, evt);
|
|
114
87
|
};
|
|
88
|
+
|
|
89
|
+
["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
|
|
90
|
+
.forEach(evt => mediaElement.addEventListener(evt, this._onSessionRelatedEvent));
|
|
115
91
|
}
|
|
116
92
|
|
|
117
|
-
|
|
118
|
-
return new
|
|
93
|
+
public update(license: Uint8Array) : Promise<void> {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
try {
|
|
96
|
+
if (this._key.indexOf("clearkey") >= 0) {
|
|
97
|
+
const licenseTypedArray =
|
|
98
|
+
license instanceof ArrayBuffer ? new Uint8Array(license) :
|
|
99
|
+
license;
|
|
100
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
101
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
102
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
103
|
+
const json = JSON.parse(utf8ToStr(licenseTypedArray));
|
|
104
|
+
const key = base64ToBytes(json.keys[0].k);
|
|
105
|
+
const kid = base64ToBytes(json.keys[0].kid);
|
|
106
|
+
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
107
|
+
/* eslint-enable @typescript-eslint/no-unsafe-argument */
|
|
108
|
+
/* eslint-enable @typescript-eslint/no-unsafe-assignment */
|
|
109
|
+
resolve(this._vid.webkitAddKey(this._key, key, kid, /* sessionId */ ""));
|
|
110
|
+
} else {
|
|
111
|
+
resolve(this._vid.webkitAddKey(this._key, license, null, /* sessionId */ ""));
|
|
112
|
+
}
|
|
113
|
+
} catch (err) {
|
|
114
|
+
reject(err);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public generateRequest(
|
|
120
|
+
_initDataType: string,
|
|
121
|
+
initData: ArrayBuffer
|
|
122
|
+
): Promise<void> {
|
|
123
|
+
return new Promise((resolve) => {
|
|
119
124
|
this._vid.webkitGenerateKeyRequest(this._key, initData);
|
|
120
125
|
resolve();
|
|
121
126
|
});
|
|
122
127
|
}
|
|
123
128
|
|
|
124
|
-
close(): Promise<void> {
|
|
125
|
-
return new
|
|
126
|
-
this.
|
|
127
|
-
this._closeSession
|
|
129
|
+
public close(): Promise<void> {
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
this._unbindSession();
|
|
132
|
+
this._closeSession();
|
|
128
133
|
resolve();
|
|
129
134
|
});
|
|
130
135
|
}
|
|
131
136
|
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Load a Persistent MediaKeySession.
|
|
139
|
+
* Do nothing here because this implementation doesn't handle them.
|
|
140
|
+
* @returns {Promise.<boolean>}
|
|
141
|
+
*/
|
|
142
|
+
public load(): Promise<boolean> {
|
|
143
|
+
// Not implemented. Always return false as in "no session with that id".
|
|
144
|
+
return Promise.resolve(false);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public remove(): Promise<void> {
|
|
148
|
+
return Promise.resolve();
|
|
134
149
|
}
|
|
135
150
|
|
|
136
|
-
|
|
137
|
-
|
|
151
|
+
private _unbindSession() {
|
|
152
|
+
["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
|
|
153
|
+
.forEach(evt => this._vid.removeEventListener(evt, this._onSessionRelatedEvent));
|
|
138
154
|
}
|
|
139
155
|
}
|
|
140
156
|
|
|
@@ -14,15 +14,9 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
merge as observableMerge,
|
|
19
|
-
Subject,
|
|
20
|
-
takeUntil,
|
|
21
|
-
} from "rxjs";
|
|
22
17
|
import EventEmitter from "../../../utils/event_emitter";
|
|
23
|
-
import
|
|
18
|
+
import noop from "../../../utils/noop";
|
|
24
19
|
import { ICompatHTMLMediaElement } from "../../browser_compatibility_types";
|
|
25
|
-
import * as events from "../../event_listeners";
|
|
26
20
|
import getWebKitFairplayInitData from "../get_webkit_fairplay_initdata";
|
|
27
21
|
import {
|
|
28
22
|
ICustomMediaKeys,
|
|
@@ -80,17 +74,19 @@ class WebkitMediaKeySession
|
|
|
80
74
|
extends EventEmitter<IMediaKeySessionEvents>
|
|
81
75
|
implements ICustomMediaKeySession
|
|
82
76
|
{
|
|
83
|
-
public readonly update: (license: Uint8Array) => Promise<void>;
|
|
84
77
|
public readonly closed: Promise<void>;
|
|
85
78
|
public expiration: number;
|
|
86
79
|
public keyStatuses: ICustomMediaKeyStatusMap;
|
|
87
80
|
|
|
88
81
|
private readonly _videoElement: HTMLMediaElement;
|
|
89
|
-
private readonly _closeSession$: Subject<void>;
|
|
90
82
|
private readonly _keyType: string;
|
|
91
83
|
private _nativeSession: undefined | MediaKeySession;
|
|
92
84
|
private _serverCertificate: Uint8Array | undefined;
|
|
93
85
|
|
|
86
|
+
private readonly _onEvent : (evt : Event) => void;
|
|
87
|
+
private _closeSession : () => void;
|
|
88
|
+
private _unbindSession : () => void;
|
|
89
|
+
|
|
94
90
|
/**
|
|
95
91
|
* @param {HTMLMediaElement} mediaElement
|
|
96
92
|
* @param {string} keyType
|
|
@@ -103,60 +99,47 @@ class WebkitMediaKeySession
|
|
|
103
99
|
) {
|
|
104
100
|
super();
|
|
105
101
|
this._serverCertificate = serverCertificate;
|
|
106
|
-
this._closeSession$ = new Subject();
|
|
107
102
|
this._videoElement = mediaElement;
|
|
108
103
|
this._keyType = keyType;
|
|
109
104
|
|
|
110
|
-
this.
|
|
111
|
-
|
|
105
|
+
this._unbindSession = noop;
|
|
106
|
+
this._closeSession = noop; // Just here to make TypeScript happy
|
|
107
|
+
this.closed = new Promise((resolve) => {
|
|
108
|
+
this._closeSession = resolve;
|
|
112
109
|
});
|
|
113
110
|
this.keyStatuses = new Map();
|
|
114
111
|
this.expiration = NaN;
|
|
115
112
|
|
|
116
|
-
this.
|
|
117
|
-
|
|
118
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
119
|
-
if (this._nativeSession === undefined ||
|
|
120
|
-
this._nativeSession.update === undefined ||
|
|
121
|
-
typeof this._nativeSession.update !== "function") {
|
|
122
|
-
return reject("Unavailable WebKit key session.");
|
|
123
|
-
}
|
|
124
|
-
try {
|
|
125
|
-
let uInt8Arraylicense: Uint8Array;
|
|
126
|
-
if (license instanceof ArrayBuffer) {
|
|
127
|
-
uInt8Arraylicense = new Uint8Array(license);
|
|
128
|
-
} else if (license instanceof Uint8Array) {
|
|
129
|
-
uInt8Arraylicense = license;
|
|
130
|
-
} else {
|
|
131
|
-
uInt8Arraylicense = new Uint8Array(license.buffer);
|
|
132
|
-
}
|
|
133
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
134
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
135
|
-
resolve(this._nativeSession.update(uInt8Arraylicense));
|
|
136
|
-
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
137
|
-
} catch (err) {
|
|
138
|
-
reject(err);
|
|
139
|
-
}
|
|
140
|
-
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
141
|
-
});
|
|
113
|
+
this._onEvent = (evt : Event) => {
|
|
114
|
+
this.trigger(evt.type, evt);
|
|
142
115
|
};
|
|
143
116
|
}
|
|
144
117
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
118
|
+
public update(license: BufferSource) : Promise<void> {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
121
|
+
if (this._nativeSession === undefined ||
|
|
122
|
+
this._nativeSession.update === undefined ||
|
|
123
|
+
typeof this._nativeSession.update !== "function") {
|
|
124
|
+
return reject("Unavailable WebKit key session.");
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
129
|
+
resolve(this._nativeSession.update(license));
|
|
130
|
+
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
131
|
+
} catch (err) {
|
|
132
|
+
reject(err);
|
|
133
|
+
}
|
|
134
|
+
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
135
|
+
});
|
|
153
136
|
}
|
|
154
137
|
|
|
155
|
-
generateRequest(
|
|
138
|
+
public generateRequest(
|
|
156
139
|
_initDataType: string,
|
|
157
140
|
initData: ArrayBuffer
|
|
158
141
|
): Promise<void> {
|
|
159
|
-
return new
|
|
142
|
+
return new Promise((resolve) => {
|
|
160
143
|
const elt = this._videoElement as ICompatHTMLMediaElement;
|
|
161
144
|
if (elt.webkitKeys?.createSession === undefined) {
|
|
162
145
|
throw new Error("No WebKitMediaKeys API.");
|
|
@@ -178,17 +161,17 @@ class WebkitMediaKeySession
|
|
|
178
161
|
if (keySession === undefined || keySession === null) {
|
|
179
162
|
throw new Error("Impossible to get the key sessions");
|
|
180
163
|
}
|
|
181
|
-
this.
|
|
164
|
+
this._listenEvent(keySession);
|
|
182
165
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
183
166
|
this._nativeSession = keySession;
|
|
184
167
|
resolve();
|
|
185
168
|
});
|
|
186
169
|
}
|
|
187
170
|
|
|
188
|
-
close(): Promise<void> {
|
|
189
|
-
return new
|
|
190
|
-
this.
|
|
191
|
-
this._closeSession
|
|
171
|
+
public close(): Promise<void> {
|
|
172
|
+
return new Promise((resolve, reject) => {
|
|
173
|
+
this._unbindSession();
|
|
174
|
+
this._closeSession();
|
|
192
175
|
if (this._nativeSession === undefined) {
|
|
193
176
|
reject("No session to close.");
|
|
194
177
|
return;
|
|
@@ -201,11 +184,11 @@ class WebkitMediaKeySession
|
|
|
201
184
|
}
|
|
202
185
|
|
|
203
186
|
load(): Promise<boolean> {
|
|
204
|
-
return
|
|
187
|
+
return Promise.resolve(false);
|
|
205
188
|
}
|
|
206
189
|
|
|
207
190
|
remove(): Promise<void> {
|
|
208
|
-
return
|
|
191
|
+
return Promise.resolve();
|
|
209
192
|
}
|
|
210
193
|
|
|
211
194
|
get sessionId(): string {
|
|
@@ -215,6 +198,24 @@ class WebkitMediaKeySession
|
|
|
215
198
|
/* eslint-enable @typescript-eslint/no-unsafe-member-access */
|
|
216
199
|
/* eslint-enable @typescript-eslint/no-unsafe-return */
|
|
217
200
|
}
|
|
201
|
+
|
|
202
|
+
private _listenEvent(session: MediaKeySession) : void {
|
|
203
|
+
this._unbindSession(); // If previous session was linked
|
|
204
|
+
|
|
205
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
206
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
207
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
208
|
+
["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
|
|
209
|
+
.forEach(evt => session.addEventListener(evt, this._onEvent));
|
|
210
|
+
|
|
211
|
+
this._unbindSession = () => {
|
|
212
|
+
["keymessage", "message", "keyadded", "ready", "keyerror", "error"]
|
|
213
|
+
.forEach(evt => session.removeEventListener(evt, this._onEvent));
|
|
214
|
+
};
|
|
215
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
216
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
217
|
+
/* eslint-enable @typescript-eslint/no-unsafe-call */
|
|
218
|
+
}
|
|
218
219
|
}
|
|
219
220
|
|
|
220
221
|
class WebKitCustomMediaKeys implements ICustomWebKitMediaKeys {
|
|
@@ -251,7 +252,7 @@ class WebKitCustomMediaKeys implements ICustomWebKitMediaKeys {
|
|
|
251
252
|
|
|
252
253
|
setServerCertificate(serverCertificate: Uint8Array): Promise<void> {
|
|
253
254
|
this._serverCertificate = serverCertificate;
|
|
254
|
-
return
|
|
255
|
+
return Promise.resolve();
|
|
255
256
|
}
|
|
256
257
|
}
|
|
257
258
|
|
|
@@ -14,18 +14,12 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
catchError,
|
|
19
|
-
defer as observableDefer,
|
|
20
|
-
Observable,
|
|
21
|
-
} from "rxjs";
|
|
22
17
|
import log from "../../log";
|
|
23
18
|
import { getNextBoxOffsets } from "../../parsers/containers/isobmff";
|
|
24
19
|
import {
|
|
25
20
|
be4toi,
|
|
26
21
|
concat,
|
|
27
22
|
} from "../../utils/byte_parsing";
|
|
28
|
-
import castToObservable from "../../utils/cast_to_observable";
|
|
29
23
|
import { PSSH_TO_INTEGER } from "./constants";
|
|
30
24
|
import { ICustomMediaKeySession } from "./custom_media_keys";
|
|
31
25
|
|
|
@@ -136,37 +130,35 @@ export function patchInitData(initData : Uint8Array) : Uint8Array {
|
|
|
136
130
|
* "encrypted" event for the corresponding request.
|
|
137
131
|
* @param {string} sessionType - Type of session you want to generate. Consult
|
|
138
132
|
* EME Specification for more information on session types.
|
|
139
|
-
* @returns {
|
|
133
|
+
* @returns {Promise} - Emit when done. Errors if fails.
|
|
140
134
|
*/
|
|
141
135
|
export default function generateKeyRequest(
|
|
142
136
|
session: MediaKeySession|ICustomMediaKeySession,
|
|
143
137
|
initializationDataType : string | undefined,
|
|
144
138
|
initializationData : Uint8Array
|
|
145
|
-
) :
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
139
|
+
) : Promise<unknown> {
|
|
140
|
+
log.debug("Compat: Calling generateRequest on the MediaKeySession");
|
|
141
|
+
let patchedInit : Uint8Array;
|
|
142
|
+
try {
|
|
143
|
+
patchedInit = patchInitData(initializationData);
|
|
144
|
+
} catch (_e) {
|
|
145
|
+
patchedInit = initializationData;
|
|
146
|
+
}
|
|
147
|
+
const initDataType = initializationDataType ?? "";
|
|
148
|
+
return session.generateRequest(initDataType, patchedInit)
|
|
149
|
+
.catch((error) => {
|
|
150
|
+
if (initDataType !== "" || !(error instanceof TypeError)) {
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
160
153
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
});
|
|
154
|
+
// On newer EME versions of the specification, the initialization data
|
|
155
|
+
// type given to generateRequest cannot be an empty string (it returns
|
|
156
|
+
// a rejected promise with a TypeError in that case).
|
|
157
|
+
// Retry with a default "cenc" value for initialization data type if
|
|
158
|
+
// we're in that condition.
|
|
159
|
+
log.warn("Compat: error while calling `generateRequest` with an empty " +
|
|
160
|
+
"initialization data type. Retrying with a default \"cenc\" value.",
|
|
161
|
+
error);
|
|
162
|
+
return session.generateRequest("cenc", patchedInit);
|
|
163
|
+
});
|
|
172
164
|
}
|
|
@@ -14,20 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
defer as observableDefer,
|
|
19
|
-
map,
|
|
20
|
-
mergeMap,
|
|
21
|
-
Observable,
|
|
22
|
-
of as observableOf,
|
|
23
|
-
race as observableRace,
|
|
24
|
-
take,
|
|
25
|
-
timer as observableTimer,
|
|
26
|
-
} from "rxjs";
|
|
27
17
|
import log from "../../log";
|
|
28
|
-
import castToObservable from "../../utils/cast_to_observable";
|
|
29
|
-
import tryCatch from "../../utils/rx-try_catch";
|
|
30
|
-
import { onKeyStatusesChange$ } from "../event_listeners";
|
|
31
18
|
import { ICustomMediaKeySession } from "./custom_media_keys";
|
|
32
19
|
|
|
33
20
|
const EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
|
|
@@ -46,26 +33,36 @@ const EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES = 100;
|
|
|
46
33
|
* @param {string} sessionId
|
|
47
34
|
* @returns {Observable}
|
|
48
35
|
*/
|
|
49
|
-
export default function loadSession(
|
|
36
|
+
export default async function loadSession(
|
|
50
37
|
session : MediaKeySession | ICustomMediaKeySession,
|
|
51
38
|
sessionId : string
|
|
52
|
-
) :
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
39
|
+
) : Promise<boolean> {
|
|
40
|
+
log.info("Compat/DRM: Load persisted session", sessionId);
|
|
41
|
+
const isLoaded = await session.load(sessionId);
|
|
42
|
+
|
|
43
|
+
if (!isLoaded || session.keyStatuses.size > 0) {
|
|
44
|
+
return isLoaded;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// A browser race condition can exist, seen for example in some
|
|
48
|
+
// Chromium/Chrome versions where the `keyStatuses` property from a loaded
|
|
49
|
+
// MediaKeySession would not be populated directly as the load answer but
|
|
50
|
+
// asynchronously after.
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
(session as MediaKeySession).addEventListener("keystatuseschange",
|
|
53
|
+
resolveWithLoadedStatus);
|
|
54
|
+
const timeout = setTimeout(resolveWithLoadedStatus,
|
|
55
|
+
EME_WAITING_DELAY_LOADED_SESSION_EMPTY_KEYSTATUSES);
|
|
56
|
+
|
|
57
|
+
function resolveWithLoadedStatus() {
|
|
58
|
+
cleanUp();
|
|
59
|
+
resolve(isLoaded);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
onKeyStatusesChange$(session)
|
|
69
|
-
).pipe(take(1), map(() => isLoaded));
|
|
70
|
-
}));
|
|
62
|
+
function cleanUp() {
|
|
63
|
+
clearTimeout(timeout);
|
|
64
|
+
(session as MediaKeySession).removeEventListener("keystatuseschange",
|
|
65
|
+
resolveWithLoadedStatus);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
71
68
|
}
|