rx-player 4.0.0-dev.2023092900 → 4.0.0-dev.2023102700
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 +221 -12
- package/FILES.md +0 -4
- package/MAINTAINERS.md +1 -0
- package/README.md +0 -21
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/add_class_name.js +6 -3
- package/dist/_esm5.processed/compat/add_text_track.js +11 -8
- package/dist/_esm5.processed/compat/browser_compatibility_types.js +13 -9
- package/dist/_esm5.processed/compat/browser_detection.js +49 -34
- package/dist/_esm5.processed/compat/browser_version.js +11 -8
- package/dist/_esm5.processed/compat/can_patch_isobmff.js +6 -3
- package/dist/_esm5.processed/compat/can_rely_on_video_visibility_and_size.js +9 -6
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +6 -3
- package/dist/_esm5.processed/compat/change_source_buffer_type.js +6 -3
- package/dist/_esm5.processed/compat/clear_element_src.js +12 -9
- package/dist/_esm5.processed/compat/eme/close_session.js +45 -106
- package/dist/_esm5.processed/compat/eme/constants.js +6 -3
- package/dist/_esm5.processed/compat/eme/custom_key_system_access.js +18 -22
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ie11_media_keys.js +78 -102
- package/dist/_esm5.processed/compat/eme/custom_media_keys/index.js +16 -6
- package/dist/_esm5.processed/compat/eme/custom_media_keys/moz_media_keys_constructor.js +18 -15
- package/dist/_esm5.processed/compat/eme/custom_media_keys/ms_media_keys_constructor.js +7 -5
- package/dist/_esm5.processed/compat/eme/custom_media_keys/old_webkit_media_keys.js +70 -88
- package/dist/_esm5.processed/compat/eme/custom_media_keys/types.js +2 -1
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys.js +91 -117
- package/dist/_esm5.processed/compat/eme/custom_media_keys/webkit_media_keys_constructor.js +7 -7
- package/dist/_esm5.processed/compat/eme/eme-api-implementation.js +82 -83
- package/dist/_esm5.processed/compat/eme/generate_key_request.js +36 -31
- package/dist/_esm5.processed/compat/eme/get_init_data.js +28 -25
- package/dist/_esm5.processed/compat/eme/get_uuid_kid_from_keystatus_kid.js +8 -5
- package/dist/_esm5.processed/compat/eme/get_webkit_fairplay_initdata.js +17 -14
- package/dist/_esm5.processed/compat/eme/index.js +13 -7
- package/dist/_esm5.processed/compat/eme/load_session.js +26 -69
- package/dist/_esm5.processed/compat/enable_audio_track.js +7 -4
- package/dist/_esm5.processed/compat/event_listeners.js +130 -102
- package/dist/_esm5.processed/compat/get_start_date.js +7 -4
- package/dist/_esm5.processed/compat/global_scope.js +7 -5
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +6 -3
- package/dist/_esm5.processed/compat/index.js +47 -24
- package/dist/_esm5.processed/compat/is_codec_supported.js +8 -5
- package/dist/_esm5.processed/compat/is_debug_mode_enabled.js +4 -1
- package/dist/_esm5.processed/compat/is_node.js +5 -3
- package/dist/_esm5.processed/compat/is_seeking_approximate.js +5 -3
- package/dist/_esm5.processed/compat/is_vtt_cue.js +6 -3
- package/dist/_esm5.processed/compat/is_worker.js +3 -1
- package/dist/_esm5.processed/compat/make_vtt_cue.js +10 -7
- package/dist/_esm5.processed/compat/on_height_width_change.js +25 -22
- package/dist/_esm5.processed/compat/patch_webkit_source_buffer.js +19 -17
- package/dist/_esm5.processed/compat/remove_cue.js +12 -9
- package/dist/_esm5.processed/compat/should_favour_custom_safari_EME.js +7 -4
- package/dist/_esm5.processed/compat/should_reload_media_source_on_decipherability_update.js +4 -1
- package/dist/_esm5.processed/compat/should_renew_media_key_system_access.js +6 -3
- package/dist/_esm5.processed/compat/should_unset_media_keys.js +6 -3
- package/dist/_esm5.processed/compat/should_validate_metadata.js +6 -3
- package/dist/_esm5.processed/compat/should_wait_for_data_before_loaded.js +6 -3
- package/dist/_esm5.processed/compat/should_wait_for_have_enough_data.js +6 -3
- package/dist/_esm5.processed/config.js +15 -14
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +123 -94
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +43 -42
- package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +37 -44
- package/dist/_esm5.processed/core/adaptive/index.js +4 -2
- package/dist/_esm5.processed/core/adaptive/network_analyzer.js +75 -74
- package/dist/_esm5.processed/core/adaptive/utils/bandwidth_estimator.js +24 -23
- package/dist/_esm5.processed/core/adaptive/utils/ewma.js +13 -12
- package/dist/_esm5.processed/core/adaptive/utils/filter_by_bitrate.js +9 -6
- package/dist/_esm5.processed/core/adaptive/utils/filter_by_resolution.js +18 -19
- package/dist/_esm5.processed/core/adaptive/utils/get_buffer_levels.js +10 -7
- package/dist/_esm5.processed/core/adaptive/utils/last_estimate_storage.js +8 -7
- package/dist/_esm5.processed/core/adaptive/utils/pending_requests_store.js +26 -23
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +25 -23
- package/dist/_esm5.processed/core/adaptive/utils/select_optimal_representation.js +6 -3
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +41 -40
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +31 -30
- package/dist/_esm5.processed/core/api/debug/constants.js +4 -1
- package/dist/_esm5.processed/core/api/debug/index.js +4 -2
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +64 -72
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +49 -46
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +15 -12
- package/dist/_esm5.processed/core/api/debug/render.js +16 -13
- package/dist/_esm5.processed/core/api/debug/utils.js +18 -13
- package/dist/_esm5.processed/core/api/index.js +7 -4
- package/dist/_esm5.processed/core/api/option_utils.js +85 -58
- package/dist/_esm5.processed/core/api/playback_observer.js +135 -124
- package/dist/_esm5.processed/core/api/public_api.js +610 -684
- package/dist/_esm5.processed/core/api/track_management/index.js +19 -3
- package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +233 -247
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +45 -58
- package/dist/_esm5.processed/core/api/track_management/tracks_store.js +300 -324
- package/dist/_esm5.processed/core/api/utils.js +32 -24
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +155 -185
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +42 -81
- package/dist/_esm5.processed/core/decrypt/clear_on_stop.js +15 -12
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +392 -510
- package/dist/_esm5.processed/core/decrypt/create_or_load_session.js +44 -90
- package/dist/_esm5.processed/core/decrypt/create_session.js +90 -149
- package/dist/_esm5.processed/core/decrypt/dispose_decryption_resources.js +24 -67
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +94 -155
- package/dist/_esm5.processed/core/decrypt/get_key_system_configuration.js +6 -3
- package/dist/_esm5.processed/core/decrypt/get_media_keys.js +59 -109
- package/dist/_esm5.processed/core/decrypt/index.js +26 -7
- package/dist/_esm5.processed/core/decrypt/init_media_keys.js +17 -59
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +84 -155
- package/dist/_esm5.processed/core/decrypt/set_server_certificate.js +50 -103
- package/dist/_esm5.processed/core/decrypt/types.js +5 -2
- package/dist/_esm5.processed/core/decrypt/utils/are_init_values_compatible.js +22 -19
- package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +40 -61
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +17 -61
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_stored_persistent_info.js +8 -5
- package/dist/_esm5.processed/core/decrypt/utils/get_drm_system_id.js +8 -5
- package/dist/_esm5.processed/core/decrypt/utils/init_data_values_container.js +23 -23
- package/dist/_esm5.processed/core/decrypt/utils/is_session_usable.js +15 -12
- package/dist/_esm5.processed/core/decrypt/utils/key_id_comparison.js +14 -21
- package/dist/_esm5.processed/core/decrypt/utils/key_session_record.js +26 -27
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +206 -310
- package/dist/_esm5.processed/core/decrypt/utils/media_keys_infos_store.js +8 -6
- package/dist/_esm5.processed/core/decrypt/utils/persistent_sessions_store.js +103 -102
- package/dist/_esm5.processed/core/decrypt/utils/serializable_bytes.js +13 -12
- package/dist/_esm5.processed/core/decrypt/utils/server_certificate_store.js +18 -16
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +37 -56
- package/dist/_esm5.processed/core/fetchers/index.js +7 -3
- package/dist/_esm5.processed/core/fetchers/manifest/index.js +4 -2
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +233 -313
- package/dist/_esm5.processed/core/fetchers/segment/index.js +4 -2
- package/dist/_esm5.processed/core/fetchers/segment/prioritized_segment_fetcher.js +12 -9
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +218 -234
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher_creator.js +20 -19
- package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +73 -74
- package/dist/_esm5.processed/core/fetchers/utils/error_selector.js +8 -5
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +210 -261
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +73 -99
- package/dist/_esm5.processed/core/init/index.js +5 -1
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +256 -320
- package/dist/_esm5.processed/core/init/types.js +7 -24
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +109 -135
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +35 -30
- package/dist/_esm5.processed/core/init/utils/create_stream_playback_observer.js +12 -10
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +30 -26
- package/dist/_esm5.processed/core/init/utils/get_initial_time.js +41 -38
- package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +13 -10
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +29 -26
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +30 -27
- package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.js +58 -60
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +140 -161
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/are_same_stream_events.js +3 -1
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/index.js +4 -2
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/refresh_scheduled_events_list.js +28 -30
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +71 -90
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/types.js +2 -1
- package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +16 -13
- package/dist/_esm5.processed/core/segment_buffers/garbage_collector.js +75 -126
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +130 -147
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/index.js +4 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/index.js +20 -3
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +106 -125
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/index.js +4 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/parsers.js +11 -8
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/text_track_cues_store.js +48 -47
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/types.js +2 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/update_proportional_elements.js +18 -15
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/utils.js +22 -15
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/index.js +4 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +65 -82
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/parsers.js +11 -8
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.js +19 -17
- package/dist/_esm5.processed/core/segment_buffers/implementations/utils/manual_time_ranges.js +23 -22
- package/dist/_esm5.processed/core/segment_buffers/index.js +13 -6
- package/dist/_esm5.processed/core/segment_buffers/inventory/buffered_history.js +24 -22
- package/dist/_esm5.processed/core/segment_buffers/inventory/index.js +8 -3
- package/dist/_esm5.processed/core/segment_buffers/inventory/segment_inventory.js +151 -150
- package/dist/_esm5.processed/core/segment_buffers/inventory/types.js +2 -1
- package/dist/_esm5.processed/core/segment_buffers/inventory/utils.js +9 -4
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +82 -89
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +118 -166
- package/dist/_esm5.processed/core/stream/adaptation/get_representations_switch_strategy.js +31 -28
- package/dist/_esm5.processed/core/stream/adaptation/index.js +19 -3
- package/dist/_esm5.processed/core/stream/adaptation/types.js +2 -1
- package/dist/_esm5.processed/core/stream/index.js +4 -2
- package/dist/_esm5.processed/core/stream/orchestrator/get_time_ranges_for_content.js +14 -16
- package/dist/_esm5.processed/core/stream/orchestrator/index.js +4 -2
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +175 -222
- package/dist/_esm5.processed/core/stream/period/index.js +19 -3
- package/dist/_esm5.processed/core/stream/period/period_stream.js +172 -216
- package/dist/_esm5.processed/core/stream/period/types.js +2 -1
- package/dist/_esm5.processed/core/stream/period/utils/get_adaptation_switch_strategy.js +34 -33
- package/dist/_esm5.processed/core/stream/representation/index.js +19 -3
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +80 -68
- package/dist/_esm5.processed/core/stream/representation/types.js +2 -1
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +33 -84
- package/dist/_esm5.processed/core/stream/representation/utils/check_for_discontinuity.js +32 -29
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +126 -145
- package/dist/_esm5.processed/core/stream/representation/utils/force_garbage_collection.js +32 -88
- package/dist/_esm5.processed/core/stream/representation/utils/get_buffer_status.js +61 -48
- package/dist/_esm5.processed/core/stream/representation/utils/get_needed_segments.js +71 -69
- package/dist/_esm5.processed/core/stream/representation/utils/get_segment_priority.js +8 -5
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +22 -63
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +49 -86
- package/dist/_esm5.processed/default_config.js +4 -2
- package/dist/_esm5.processed/errors/assertion_error.js +10 -26
- package/dist/_esm5.processed/errors/custom_loader_error.js +12 -28
- package/dist/_esm5.processed/errors/encrypted_media_error.js +16 -32
- package/dist/_esm5.processed/errors/error_codes.js +9 -4
- package/dist/_esm5.processed/errors/error_message.js +5 -2
- package/dist/_esm5.processed/errors/format_error.js +9 -7
- package/dist/_esm5.processed/errors/index.js +25 -11
- package/dist/_esm5.processed/errors/is_known_error.js +14 -11
- package/dist/_esm5.processed/errors/media_error.js +17 -33
- package/dist/_esm5.processed/errors/network_error.js +21 -37
- package/dist/_esm5.processed/errors/other_error.js +15 -31
- package/dist/_esm5.processed/errors/request_error.js +17 -33
- package/dist/_esm5.processed/experimental/features/dash_wasm.js +14 -11
- package/dist/_esm5.processed/experimental/features/debug_element.js +7 -4
- package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
- package/dist/_esm5.processed/experimental/features/index.js +11 -3
- package/dist/_esm5.processed/experimental/features/local.js +9 -6
- package/dist/_esm5.processed/experimental/features/metaplaylist.js +9 -6
- package/dist/_esm5.processed/experimental/index.js +5 -2
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/features/dash.js +6 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/features/metaplaylist.js +6 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/index.js +7 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +22 -16
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +22 -19
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.js +6 -3
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/types.js +2 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +125 -186
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader_error.js +11 -27
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/get_duration_from_manifest.js +76 -119
- package/dist/_esm5.processed/experimental/tools/createMetaplaylist/index.js +24 -15
- package/dist/_esm5.processed/experimental/tools/index.js +11 -5
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/index.js +38 -43
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.js +31 -34
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/capabilities.js +21 -18
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +4 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/log.js +5 -3
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.js +20 -17
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.js +21 -18
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.js +13 -10
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/defaultCodecsFinder.js +16 -13
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/index.js +16 -14
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.js +14 -11
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/format.js +14 -11
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.js +19 -16
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.js +11 -8
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/types.js +5 -2
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/utils.js +25 -22
- package/dist/_esm5.processed/experimental/tools/parseBIFThumbnails.js +7 -4
- package/dist/_esm5.processed/features/add_features.js +11 -8
- package/dist/_esm5.processed/features/features_object.js +4 -2
- package/dist/_esm5.processed/features/index.js +7 -4
- package/dist/_esm5.processed/features/list/dash.js +11 -8
- package/dist/_esm5.processed/features/list/directfile.js +9 -5
- package/dist/_esm5.processed/features/list/eme.js +7 -4
- package/dist/_esm5.processed/features/list/html_sami_parser.js +9 -6
- package/dist/_esm5.processed/features/list/html_srt_parser.js +9 -6
- package/dist/_esm5.processed/features/list/html_text_buffer.js +7 -4
- package/dist/_esm5.processed/features/list/html_ttml_parser.js +9 -6
- package/dist/_esm5.processed/features/list/html_vtt_parser.js +9 -6
- package/dist/_esm5.processed/features/list/index.js +31 -14
- package/dist/_esm5.processed/features/list/native_sami_parser.js +9 -6
- package/dist/_esm5.processed/features/list/native_srt_parser.js +9 -6
- package/dist/_esm5.processed/features/list/native_text_buffer.js +7 -4
- package/dist/_esm5.processed/features/list/native_ttml_parser.js +9 -6
- package/dist/_esm5.processed/features/list/native_vtt_parser.js +9 -6
- package/dist/_esm5.processed/features/list/smooth.js +9 -6
- package/dist/_esm5.processed/features/types.js +2 -1
- package/dist/_esm5.processed/index.js +24 -9
- package/dist/_esm5.processed/log.js +5 -3
- package/dist/_esm5.processed/manifest/adaptation.js +52 -55
- package/dist/_esm5.processed/manifest/index.js +32 -13
- package/dist/_esm5.processed/manifest/manifest.js +112 -134
- package/dist/_esm5.processed/manifest/period.js +38 -42
- package/dist/_esm5.processed/manifest/representation.js +78 -61
- package/dist/_esm5.processed/manifest/representation_index/index.js +5 -2
- package/dist/_esm5.processed/manifest/representation_index/static.js +43 -42
- package/dist/_esm5.processed/manifest/representation_index/types.js +2 -1
- package/dist/_esm5.processed/manifest/types.js +5 -2
- package/dist/_esm5.processed/manifest/update_period_in_place.js +38 -48
- package/dist/_esm5.processed/manifest/update_periods.js +59 -69
- package/dist/_esm5.processed/manifest/utils.js +14 -9
- package/dist/_esm5.processed/minimal.js +9 -7
- package/dist/_esm5.processed/parsers/containers/isobmff/constants.js +4 -1
- package/dist/_esm5.processed/parsers/containers/isobmff/create_box.js +14 -10
- package/dist/_esm5.processed/parsers/containers/isobmff/drm/index.js +5 -1
- package/dist/_esm5.processed/parsers/containers/isobmff/drm/playready.js +15 -11
- package/dist/_esm5.processed/parsers/containers/isobmff/get_box.js +48 -40
- package/dist/_esm5.processed/parsers/containers/isobmff/index.js +27 -6
- package/dist/_esm5.processed/parsers/containers/isobmff/read.js +20 -14
- package/dist/_esm5.processed/parsers/containers/isobmff/take_pssh_out.js +25 -20
- package/dist/_esm5.processed/parsers/containers/isobmff/utils.js +130 -112
- package/dist/_esm5.processed/parsers/containers/matroska/index.js +6 -1
- package/dist/_esm5.processed/parsers/containers/matroska/utils.js +67 -63
- package/dist/_esm5.processed/parsers/images/bif.js +40 -29
- package/dist/_esm5.processed/parsers/manifest/dash/common/attach_trickmode_track.js +10 -12
- package/dist/_esm5.processed/parsers/manifest/dash/common/flatten_overlapping_periods.js +10 -7
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_clock_offset.js +8 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_hdr_information.js +10 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_http_utc-timing_url.js +7 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_minimum_and_maximum_positions.js +10 -6
- package/dist/_esm5.processed/parsers/manifest/dash/common/get_periods_time_infos.js +14 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/index.js +10 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/base.js +73 -67
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_init_segment.js +9 -4
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/get_segments_from_timeline.js +32 -25
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/index.js +11 -5
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/list.js +81 -70
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/template.js +130 -123
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.js +15 -12
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_previous_timeline.js +35 -32
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.js +14 -9
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/find_first_common_start_time.js +30 -22
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/parse_s_element.js +14 -11
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.js +131 -129
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/tokens.js +16 -10
- package/dist/_esm5.processed/parsers/manifest/dash/common/indexes/utils.js +7 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/infer_adaptation_type.js +19 -18
- package/dist/_esm5.processed/parsers/manifest/dash/common/manifest_bounds_calculator.js +18 -17
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +111 -111
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_availability_start_time.js +4 -1
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_mpd.js +86 -85
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_periods.js +97 -82
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representation_index.js +39 -37
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +61 -69
- package/dist/_esm5.processed/parsers/manifest/dash/common/resolve_base_urls.js +12 -9
- package/dist/_esm5.processed/parsers/manifest/dash/index.js +8 -1
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.js +66 -62
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/BaseURL.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/ContentComponent.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/ContentProtection.js +22 -19
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/EventStream.js +22 -19
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Initialization.js +11 -8
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/MPD.js +38 -34
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Period.js +34 -30
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/Representation.js +44 -40
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.js +24 -21
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentList.js +15 -12
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.js +21 -18
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentTimeline.js +6 -3
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/SegmentURL.js +12 -9
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/node_parsers/utils.js +60 -64
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +33 -27
- package/dist/_esm5.processed/parsers/manifest/dash/node_parser_types.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/parsers_types.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +192 -238
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.js +67 -62
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.js +8 -4
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/ContentComponent.js +11 -7
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/ContentProtection.js +17 -13
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.js +29 -24
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/MPD.js +38 -33
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Period.js +37 -32
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Representation.js +43 -38
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/Scheme.js +9 -5
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.js +16 -12
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.js +11 -7
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.js +20 -16
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/SegmentUrl.js +11 -7
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/XLink.js +11 -7
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/index.js +5 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/generators/root.js +10 -6
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/parsers_stack.js +22 -20
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/types.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/utils.js +6 -2
- package/dist/_esm5.processed/parsers/manifest/index.js +17 -1
- package/dist/_esm5.processed/parsers/manifest/local/index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/local/parse_local_manifest.js +30 -27
- package/dist/_esm5.processed/parsers/manifest/local/representation_index.js +71 -84
- package/dist/_esm5.processed/parsers/manifest/local/types.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/index.js +4 -2
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/metaplaylist_parser.js +75 -72
- package/dist/_esm5.processed/parsers/manifest/metaplaylist/representation_index.js +52 -52
- package/dist/_esm5.processed/parsers/manifest/smooth/create_parser.js +200 -176
- package/dist/_esm5.processed/parsers/manifest/smooth/get_codecs.js +13 -8
- package/dist/_esm5.processed/parsers/manifest/smooth/index.js +7 -4
- package/dist/_esm5.processed/parsers/manifest/smooth/parse_C_nodes.js +17 -14
- package/dist/_esm5.processed/parsers/manifest/smooth/parse_protection_node.js +17 -15
- package/dist/_esm5.processed/parsers/manifest/smooth/representation_index.js +102 -98
- package/dist/_esm5.processed/parsers/manifest/smooth/shared_smooth_segment_timeline.js +49 -48
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/add_segment_infos.js +10 -7
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/parseBoolean.js +4 -1
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/reduceChildren.js +6 -3
- package/dist/_esm5.processed/parsers/manifest/smooth/utils/tokens.js +5 -1
- package/dist/_esm5.processed/parsers/manifest/types.js +2 -1
- package/dist/_esm5.processed/parsers/manifest/utils/check_manifest_ids.js +27 -24
- package/dist/_esm5.processed/parsers/manifest/utils/clear_timeline_from_position.js +10 -7
- package/dist/_esm5.processed/parsers/manifest/utils/get_first_time_from_adaptation.js +8 -5
- package/dist/_esm5.processed/parsers/manifest/utils/get_last_time_from_adaptation.js +8 -5
- package/dist/_esm5.processed/parsers/manifest/utils/get_maximum_positions.js +15 -12
- package/dist/_esm5.processed/parsers/manifest/utils/get_minimum_position.js +15 -12
- package/dist/_esm5.processed/parsers/manifest/utils/index_helpers.js +31 -22
- package/dist/_esm5.processed/parsers/manifest/utils/is_segment_still_available.js +9 -6
- package/dist/_esm5.processed/parsers/manifest/utils/update_segment_timeline.js +38 -45
- package/dist/_esm5.processed/parsers/texttracks/index.js +2 -1
- package/dist/_esm5.processed/parsers/texttracks/sami/html.js +45 -43
- package/dist/_esm5.processed/parsers/texttracks/sami/native.js +41 -39
- package/dist/_esm5.processed/parsers/texttracks/srt/find_end_of_cue_block.js +7 -4
- package/dist/_esm5.processed/parsers/texttracks/srt/get_cue_blocks.js +11 -8
- package/dist/_esm5.processed/parsers/texttracks/srt/html.js +32 -29
- package/dist/_esm5.processed/parsers/texttracks/srt/native.js +16 -13
- package/dist/_esm5.processed/parsers/texttracks/srt/parse_cue.js +21 -18
- package/dist/_esm5.processed/parsers/texttracks/srt/parse_timestamp.js +10 -7
- package/dist/_esm5.processed/parsers/texttracks/ttml/get_parameters.js +37 -30
- package/dist/_esm5.processed/parsers/texttracks/ttml/get_styling.js +48 -48
- package/dist/_esm5.processed/parsers/texttracks/ttml/get_time_delimiters.js +14 -11
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_default_ttml_paragraph_style.js +7 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_extent.js +15 -12
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_font_size.js +15 -12
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_line_height.js +11 -8
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_origin.js +15 -12
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/apply_padding.js +25 -22
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/create_element.js +117 -124
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/generate_css_test_outline.js +11 -8
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/index.js +4 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/parse_cue.js +12 -8
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/parse_ttml_to_div.js +14 -11
- package/dist/_esm5.processed/parsers/texttracks/ttml/html/ttml_color_to_css_color.js +10 -7
- package/dist/_esm5.processed/parsers/texttracks/ttml/native/index.js +4 -2
- package/dist/_esm5.processed/parsers/texttracks/ttml/native/parse_cue.js +38 -35
- package/dist/_esm5.processed/parsers/texttracks/ttml/native/parse_ttml_to_vtt.js +11 -8
- package/dist/_esm5.processed/parsers/texttracks/ttml/parse_ttml.js +58 -58
- package/dist/_esm5.processed/parsers/texttracks/ttml/regexps.js +27 -13
- package/dist/_esm5.processed/parsers/texttracks/ttml/resolve_styles_inheritance.js +18 -18
- package/dist/_esm5.processed/parsers/texttracks/ttml/time_parsing.js +28 -26
- package/dist/_esm5.processed/parsers/texttracks/ttml/xml_utils.js +37 -25
- package/dist/_esm5.processed/parsers/texttracks/types.js +2 -1
- package/dist/_esm5.processed/parsers/texttracks/webvtt/get_cue_blocks.js +12 -9
- package/dist/_esm5.processed/parsers/texttracks/webvtt/get_style_blocks.js +14 -11
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/convert_payload_to_html.js +11 -8
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_default_style_elements.js +8 -5
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_style_attribute.js +60 -60
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/create_styled_element.js +30 -27
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/index.js +4 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/parse_style_block.js +23 -26
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/parse_webvtt_to_div.js +20 -17
- package/dist/_esm5.processed/parsers/texttracks/webvtt/html/to_html.js +23 -18
- package/dist/_esm5.processed/parsers/texttracks/webvtt/native/index.js +4 -2
- package/dist/_esm5.processed/parsers/texttracks/webvtt/native/parse_vtt_to_cues.js +19 -16
- package/dist/_esm5.processed/parsers/texttracks/webvtt/native/set_settings_on_cue.js +20 -17
- package/dist/_esm5.processed/parsers/texttracks/webvtt/native/to_native_cue.js +8 -5
- package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_cue_block.js +26 -18
- package/dist/_esm5.processed/parsers/texttracks/webvtt/parse_timestamp.js +10 -7
- package/dist/_esm5.processed/parsers/texttracks/webvtt/utils.js +15 -7
- package/dist/_esm5.processed/public_types.js +2 -1
- package/dist/_esm5.processed/tools/TextTrackRenderer/index.js +13 -6
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +26 -24
- package/dist/_esm5.processed/tools/index.js +6 -4
- package/dist/_esm5.processed/tools/string_utils.js +10 -1
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +16 -24
- package/dist/_esm5.processed/transports/dash/construct_segment_url.js +6 -3
- package/dist/_esm5.processed/transports/dash/extract_complete_chunks.js +17 -14
- package/dist/_esm5.processed/transports/dash/get_events_out_of_emsgs.js +19 -16
- package/dist/_esm5.processed/transports/dash/index.js +4 -2
- package/dist/_esm5.processed/transports/dash/init_segment_loader.js +47 -27
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +23 -16
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +68 -60
- package/dist/_esm5.processed/transports/dash/pipelines.js +20 -17
- package/dist/_esm5.processed/transports/dash/segment_loader.js +49 -39
- package/dist/_esm5.processed/transports/dash/segment_parser.js +58 -39
- package/dist/_esm5.processed/transports/dash/text_loader.js +36 -30
- package/dist/_esm5.processed/transports/dash/text_parser.js +39 -29
- package/dist/_esm5.processed/transports/index.js +17 -1
- package/dist/_esm5.processed/transports/local/index.js +4 -2
- package/dist/_esm5.processed/transports/local/pipelines.js +26 -23
- package/dist/_esm5.processed/transports/local/segment_loader.js +26 -23
- package/dist/_esm5.processed/transports/local/segment_parser.js +36 -25
- package/dist/_esm5.processed/transports/local/text_parser.js +42 -27
- package/dist/_esm5.processed/transports/metaplaylist/index.js +4 -2
- package/dist/_esm5.processed/transports/metaplaylist/manifest_loader.js +11 -7
- package/dist/_esm5.processed/transports/metaplaylist/pipelines.js +91 -96
- package/dist/_esm5.processed/transports/smooth/extract_timings_infos.js +26 -20
- package/dist/_esm5.processed/transports/smooth/index.js +4 -2
- package/dist/_esm5.processed/transports/smooth/is_mp4_embedded_track.js +4 -1
- package/dist/_esm5.processed/transports/smooth/isobmff/create_audio_init_segment.js +22 -19
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +92 -67
- package/dist/_esm5.processed/transports/smooth/isobmff/create_init_segment.js +29 -26
- package/dist/_esm5.processed/transports/smooth/isobmff/create_traf_box.js +9 -6
- package/dist/_esm5.processed/transports/smooth/isobmff/create_video_init_segment.js +23 -20
- package/dist/_esm5.processed/transports/smooth/isobmff/get_aaces_header.js +10 -7
- package/dist/_esm5.processed/transports/smooth/isobmff/index.js +13 -6
- package/dist/_esm5.processed/transports/smooth/isobmff/parse_tfrf.js +19 -16
- package/dist/_esm5.processed/transports/smooth/isobmff/parse_tfxd.js +9 -6
- package/dist/_esm5.processed/transports/smooth/isobmff/patch_segment.js +41 -38
- package/dist/_esm5.processed/transports/smooth/pipelines.js +106 -96
- package/dist/_esm5.processed/transports/smooth/segment_loader.d.ts +2 -2
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +149 -153
- package/dist/_esm5.processed/transports/smooth/utils.js +7 -3
- package/dist/_esm5.processed/transports/types.js +2 -1
- package/dist/_esm5.processed/transports/utils/byte_range.js +6 -4
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +23 -18
- package/dist/_esm5.processed/transports/utils/check_isobmff_integrity.js +14 -11
- package/dist/_esm5.processed/transports/utils/find_complete_box.js +11 -8
- package/dist/_esm5.processed/transports/utils/generate_manifest_loader.js +22 -14
- package/dist/_esm5.processed/transports/utils/get_isobmff_timing_infos.js +13 -10
- package/dist/_esm5.processed/transports/utils/infer_segment_container.js +4 -1
- package/dist/_esm5.processed/transports/utils/parse_text_track.js +40 -26
- package/dist/_esm5.processed/utils/are_arrays_of_numbers_equal.js +5 -2
- package/dist/_esm5.processed/utils/are_codecs_compatible.js +11 -9
- package/dist/_esm5.processed/utils/array_find.js +7 -4
- package/dist/_esm5.processed/utils/array_find_index.js +6 -3
- package/dist/_esm5.processed/utils/array_includes.js +12 -11
- package/dist/_esm5.processed/utils/assert.js +13 -9
- package/dist/_esm5.processed/utils/assert_unreachable.js +6 -3
- package/dist/_esm5.processed/utils/base64.js +23 -18
- package/dist/_esm5.processed/utils/byte_parsing.js +30 -17
- package/dist/_esm5.processed/utils/cancellable_sleep.js +8 -5
- package/dist/_esm5.processed/utils/create_cancellable_promise.js +7 -4
- package/dist/_esm5.processed/utils/deep_merge.js +10 -21
- package/dist/_esm5.processed/utils/event_emitter.js +24 -24
- package/dist/_esm5.processed/utils/flat_map.js +7 -4
- package/dist/_esm5.processed/utils/get_fuzzed_delay.js +6 -3
- package/dist/_esm5.processed/utils/hash_buffer.js +7 -4
- package/dist/_esm5.processed/utils/id_generator.js +6 -3
- package/dist/_esm5.processed/utils/initialization_segment_cache.js +11 -12
- package/dist/_esm5.processed/utils/is_non_empty_string.js +4 -1
- package/dist/_esm5.processed/utils/is_null_or_undefined.js +4 -1
- package/dist/_esm5.processed/utils/languages/ISO_639-1_to_ISO_639-3.js +4 -2
- package/dist/_esm5.processed/utils/languages/ISO_639-2_to_ISO_639-3.js +4 -2
- package/dist/_esm5.processed/utils/languages/index.js +7 -3
- package/dist/_esm5.processed/utils/languages/normalize.js +26 -20
- package/dist/_esm5.processed/utils/logger.js +24 -23
- package/dist/_esm5.processed/utils/monotonic_timestamp.js +4 -1
- package/dist/_esm5.processed/utils/noop.js +4 -1
- package/dist/_esm5.processed/utils/object_assign.js +8 -10
- package/dist/_esm5.processed/utils/object_values.js +6 -3
- package/dist/_esm5.processed/utils/ranges.js +94 -71
- package/dist/_esm5.processed/utils/reference.js +48 -52
- package/dist/_esm5.processed/utils/request/fetch.js +79 -109
- package/dist/_esm5.processed/utils/request/index.js +9 -4
- package/dist/_esm5.processed/utils/request/xhr.js +49 -37
- package/dist/_esm5.processed/utils/resolve_url.js +18 -18
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +34 -81
- package/dist/_esm5.processed/utils/sleep.js +5 -2
- package/dist/_esm5.processed/utils/slice_uint8array.js +3 -1
- package/dist/_esm5.processed/utils/sorted_list.js +37 -40
- package/dist/_esm5.processed/utils/starts_with.js +5 -2
- package/dist/_esm5.processed/utils/string_parsing.js +84 -73
- package/dist/_esm5.processed/utils/take_first_set.js +9 -10
- package/dist/_esm5.processed/utils/task_canceller.js +51 -71
- package/dist/_esm5.processed/utils/warn_once.js +7 -4
- package/dist/_esm5.processed/utils/weak_map_memory.js +12 -11
- package/dist/_esm5.processed/utils/wrapInPromise.js +5 -2
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +43758 -45493
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +1 -22
- package/package.json +22 -23
- package/scripts/build/constants.d.ts +1 -23
- package/scripts/build/generate_build.js +1 -1
- package/scripts/check_nodejs_import_compatibility.js +1 -1
- package/scripts/update-version +1 -4
- package/sonar-project.properties +1 -1
- package/src/compat/event_listeners.ts +8 -8
- package/src/compat/global_scope.ts +2 -0
- package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +3 -3
- package/src/core/adaptive/adaptive_representation_selector.ts +27 -9
- package/src/core/adaptive/buffer_based_chooser.ts +1 -1
- package/src/core/adaptive/network_analyzer.ts +5 -4
- package/src/core/api/public_api.ts +2 -2
- package/src/core/api/track_management/track_dispatcher.ts +2 -1
- package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +1 -1
- package/src/core/fetchers/cdn_prioritizer.ts +1 -1
- package/src/experimental/features/__tests__/index.test.ts +19 -0
- package/src/experimental/features/index.ts +1 -0
- package/src/features/list/__tests__/index.test.ts +49 -0
- package/src/index.ts +28 -3
- package/src/transports/smooth/segment_loader.ts +4 -4
- package/src/typings/globals.d.ts +0 -42
- package/src/utils/request/fetch.ts +1 -1
- package/src/utils/request/xhr.ts +1 -1
- package/tsconfig.json +1 -1
- package/tsconfig.modules.json +3 -3
- package/dist/_esm5.processed/features/initialize_features.d.ts +0 -19
- package/dist/_esm5.processed/features/initialize_features.js +0 -108
- package/src/features/__tests__/initialize_features.test.ts +0 -657
- package/src/features/initialize_features.ts +0 -129
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Copyright 2015 CANAL+ Group
|
|
3
4
|
*
|
|
@@ -13,99 +14,29 @@
|
|
|
13
14
|
* See the License for the specific language governing permissions and
|
|
14
15
|
* limitations under the License.
|
|
15
16
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
};
|
|
40
|
-
return __assign.apply(this, arguments);
|
|
41
|
-
};
|
|
42
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
43
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
44
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
45
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
46
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
47
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
48
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
52
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
53
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
54
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
55
|
-
function step(op) {
|
|
56
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
57
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
58
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
59
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
60
|
-
switch (op[0]) {
|
|
61
|
-
case 0: case 1: t = op; break;
|
|
62
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
63
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
64
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
65
|
-
default:
|
|
66
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
67
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
68
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
69
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
70
|
-
if (t[2]) _.ops.pop();
|
|
71
|
-
_.trys.pop(); continue;
|
|
72
|
-
}
|
|
73
|
-
op = body.call(thisArg, _);
|
|
74
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
75
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
79
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
80
|
-
if (ar || !(i in from)) {
|
|
81
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
82
|
-
ar[i] = from[i];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
86
|
-
};
|
|
87
|
-
import eme, { getInitData, } from "../../compat/eme";
|
|
88
|
-
import config from "../../config";
|
|
89
|
-
import { EncryptedMediaError, OtherError, } from "../../errors";
|
|
90
|
-
import log from "../../log";
|
|
91
|
-
import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
|
|
92
|
-
import arrayFind from "../../utils/array_find";
|
|
93
|
-
import arrayIncludes from "../../utils/array_includes";
|
|
94
|
-
import EventEmitter from "../../utils/event_emitter";
|
|
95
|
-
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
96
|
-
import { bytesToHex } from "../../utils/string_parsing";
|
|
97
|
-
import TaskCanceller from "../../utils/task_canceller";
|
|
98
|
-
import attachMediaKeys from "./attach_media_keys";
|
|
99
|
-
import createOrLoadSession from "./create_or_load_session";
|
|
100
|
-
import initMediaKeys from "./init_media_keys";
|
|
101
|
-
import SessionEventsListener, { BlacklistedSessionError, } from "./session_events_listener";
|
|
102
|
-
import setServerCertificate from "./set_server_certificate";
|
|
103
|
-
import { ContentDecryptorState, } from "./types";
|
|
104
|
-
import { DecommissionedSessionError } from "./utils/check_key_statuses";
|
|
105
|
-
import cleanOldStoredPersistentInfo from "./utils/clean_old_stored_persistent_info";
|
|
106
|
-
import getDrmSystemId from "./utils/get_drm_system_id";
|
|
107
|
-
import InitDataValuesContainer from "./utils/init_data_values_container";
|
|
108
|
-
import { areAllKeyIdsContainedIn, areSomeKeyIdsContainedIn, } from "./utils/key_id_comparison";
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const eme_1 = require("../../compat/eme");
|
|
19
|
+
const config_1 = require("../../config");
|
|
20
|
+
const errors_1 = require("../../errors");
|
|
21
|
+
const log_1 = require("../../log");
|
|
22
|
+
const are_arrays_of_numbers_equal_1 = require("../../utils/are_arrays_of_numbers_equal");
|
|
23
|
+
const array_find_1 = require("../../utils/array_find");
|
|
24
|
+
const array_includes_1 = require("../../utils/array_includes");
|
|
25
|
+
const event_emitter_1 = require("../../utils/event_emitter");
|
|
26
|
+
const is_null_or_undefined_1 = require("../../utils/is_null_or_undefined");
|
|
27
|
+
const string_parsing_1 = require("../../utils/string_parsing");
|
|
28
|
+
const task_canceller_1 = require("../../utils/task_canceller");
|
|
29
|
+
const attach_media_keys_1 = require("./attach_media_keys");
|
|
30
|
+
const create_or_load_session_1 = require("./create_or_load_session");
|
|
31
|
+
const init_media_keys_1 = require("./init_media_keys");
|
|
32
|
+
const session_events_listener_1 = require("./session_events_listener");
|
|
33
|
+
const set_server_certificate_1 = require("./set_server_certificate");
|
|
34
|
+
const types_1 = require("./types");
|
|
35
|
+
const check_key_statuses_1 = require("./utils/check_key_statuses");
|
|
36
|
+
const clean_old_stored_persistent_info_1 = require("./utils/clean_old_stored_persistent_info");
|
|
37
|
+
const get_drm_system_id_1 = require("./utils/get_drm_system_id");
|
|
38
|
+
const init_data_values_container_1 = require("./utils/init_data_values_container");
|
|
39
|
+
const key_id_comparison_1 = require("./utils/key_id_comparison");
|
|
109
40
|
/**
|
|
110
41
|
* Module communicating with the Content Decryption Module (or CDM) to be able
|
|
111
42
|
* to decrypt contents.
|
|
@@ -118,8 +49,16 @@ import { areAllKeyIdsContainedIn, areSomeKeyIdsContainedIn, } from "./utils/key_
|
|
|
118
49
|
*
|
|
119
50
|
* @class ContentDecryptor
|
|
120
51
|
*/
|
|
121
|
-
|
|
122
|
-
|
|
52
|
+
class ContentDecryptor extends event_emitter_1.default {
|
|
53
|
+
/**
|
|
54
|
+
* `true` if the EME API are available on the current platform according to
|
|
55
|
+
* the default EME implementation used.
|
|
56
|
+
* `false` otherwise.
|
|
57
|
+
* @returns {boolean}
|
|
58
|
+
*/
|
|
59
|
+
static hasEmeApis() {
|
|
60
|
+
return !(0, is_null_or_undefined_1.default)(eme_1.default.requestMediaKeySystemAccess);
|
|
61
|
+
}
|
|
123
62
|
/**
|
|
124
63
|
* Create a new `ContentDecryptor`, and initialize its decryption capabilities
|
|
125
64
|
* right away.
|
|
@@ -134,28 +73,28 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
134
73
|
* configurations. It will choose the appropriate one depending on user
|
|
135
74
|
* settings and browser support.
|
|
136
75
|
*/
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
76
|
+
constructor(mediaElement, ksOptions) {
|
|
77
|
+
super();
|
|
78
|
+
log_1.default.debug("DRM: Starting ContentDecryptor logic.");
|
|
79
|
+
const canceller = new task_canceller_1.default();
|
|
80
|
+
this._currentSessions = [];
|
|
81
|
+
this._canceller = canceller;
|
|
82
|
+
this._initDataQueue = [];
|
|
83
|
+
this._stateData = { state: types_1.ContentDecryptorState.Initializing,
|
|
145
84
|
isMediaKeysAttached: 0 /* MediaKeyAttachmentStatus.NotAttached */,
|
|
146
85
|
isInitDataQueueLocked: true,
|
|
147
86
|
data: null };
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
87
|
+
this.error = null;
|
|
88
|
+
eme_1.default.onEncrypted(mediaElement, evt => {
|
|
89
|
+
log_1.default.debug("DRM: Encrypted event received from media element.");
|
|
90
|
+
const initData = (0, eme_1.getInitData)(evt);
|
|
152
91
|
if (initData !== null) {
|
|
153
|
-
|
|
92
|
+
this.onInitializationData(initData);
|
|
154
93
|
}
|
|
155
94
|
}, canceller.signal);
|
|
156
|
-
|
|
157
|
-
.then(
|
|
158
|
-
|
|
95
|
+
(0, init_media_keys_1.default)(mediaElement, ksOptions, canceller.signal)
|
|
96
|
+
.then((mediaKeysInfo) => {
|
|
97
|
+
const { options, mediaKeySystemAccess } = mediaKeysInfo;
|
|
159
98
|
/**
|
|
160
99
|
* String identifying the key system, allowing the rest of the code to
|
|
161
100
|
* only advertise the required initialization data for license requests.
|
|
@@ -165,42 +104,33 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
165
104
|
* optimizations this property unlocks can break the loading of
|
|
166
105
|
* MediaKeySessions persisted in older RxPlayer's versions.
|
|
167
106
|
*/
|
|
168
|
-
|
|
169
|
-
if (
|
|
107
|
+
let systemId;
|
|
108
|
+
if ((0, is_null_or_undefined_1.default)(options.persistentLicenseConfig) ||
|
|
170
109
|
options.persistentLicenseConfig.disableRetroCompatibility === true) {
|
|
171
|
-
systemId =
|
|
110
|
+
systemId = (0, get_drm_system_id_1.default)(mediaKeySystemAccess.keySystem);
|
|
172
111
|
}
|
|
173
|
-
|
|
174
|
-
if (
|
|
175
|
-
|
|
112
|
+
this.systemId = systemId;
|
|
113
|
+
if (this._stateData.state === types_1.ContentDecryptorState.Initializing) {
|
|
114
|
+
this._stateData = { state: types_1.ContentDecryptorState.WaitingForAttachment,
|
|
176
115
|
isInitDataQueueLocked: true,
|
|
177
116
|
isMediaKeysAttached: 0 /* MediaKeyAttachmentStatus.NotAttached */,
|
|
178
|
-
data: { mediaKeysInfo
|
|
179
|
-
|
|
117
|
+
data: { mediaKeysInfo,
|
|
118
|
+
mediaElement } };
|
|
119
|
+
this.trigger("stateChange", this._stateData.state);
|
|
180
120
|
}
|
|
181
121
|
})
|
|
182
|
-
.catch(
|
|
183
|
-
|
|
122
|
+
.catch((err) => {
|
|
123
|
+
this._onFatalError(err);
|
|
184
124
|
});
|
|
185
|
-
return _this;
|
|
186
125
|
}
|
|
187
|
-
/**
|
|
188
|
-
* `true` if the EME API are available on the current platform according to
|
|
189
|
-
* the default EME implementation used.
|
|
190
|
-
* `false` otherwise.
|
|
191
|
-
* @returns {boolean}
|
|
192
|
-
*/
|
|
193
|
-
ContentDecryptor.hasEmeApis = function () {
|
|
194
|
-
return !isNullOrUndefined(eme.requestMediaKeySystemAccess);
|
|
195
|
-
};
|
|
196
126
|
/**
|
|
197
127
|
* Returns the current state of the ContentDecryptor.
|
|
198
128
|
* @see ContentDecryptorState
|
|
199
129
|
* @returns {Object}
|
|
200
130
|
*/
|
|
201
|
-
|
|
131
|
+
getState() {
|
|
202
132
|
return this._stateData.state;
|
|
203
|
-
}
|
|
133
|
+
}
|
|
204
134
|
/**
|
|
205
135
|
* Attach the current decryption capabilities to the HTMLMediaElement.
|
|
206
136
|
* This method should only be called once the `ContentDecryptor` is in the
|
|
@@ -210,24 +140,23 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
210
140
|
* calling this method, and only push data to it once the `ReadyForContent`
|
|
211
141
|
* state is reached, for compatibility reasons.
|
|
212
142
|
*/
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (this._stateData.state !== ContentDecryptorState.WaitingForAttachment) {
|
|
143
|
+
attach() {
|
|
144
|
+
if (this._stateData.state !== types_1.ContentDecryptorState.WaitingForAttachment) {
|
|
216
145
|
throw new Error("`attach` should only be called when " +
|
|
217
146
|
"in the WaitingForAttachment state");
|
|
218
147
|
}
|
|
219
148
|
else if (this._stateData.isMediaKeysAttached !== 0 /* MediaKeyAttachmentStatus.NotAttached */) {
|
|
220
|
-
|
|
149
|
+
log_1.default.warn("DRM: ContentDecryptor's `attach` method called more than once.");
|
|
221
150
|
return;
|
|
222
151
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
152
|
+
const { mediaElement, mediaKeysInfo } = this._stateData.data;
|
|
153
|
+
const { options, mediaKeys, mediaKeySystemAccess, stores } = mediaKeysInfo;
|
|
154
|
+
const shouldDisableLock = options.disableMediaKeysAttachmentLock === true;
|
|
226
155
|
if (shouldDisableLock) {
|
|
227
|
-
this._stateData = { state: ContentDecryptorState.ReadyForContent,
|
|
156
|
+
this._stateData = { state: types_1.ContentDecryptorState.ReadyForContent,
|
|
228
157
|
isInitDataQueueLocked: true,
|
|
229
158
|
isMediaKeysAttached: 1 /* MediaKeyAttachmentStatus.Pending */,
|
|
230
|
-
data: { mediaKeysInfo
|
|
159
|
+
data: { mediaKeysInfo, mediaElement } };
|
|
231
160
|
this.trigger("stateChange", this._stateData.state);
|
|
232
161
|
// previous trigger might have lead to disposal
|
|
233
162
|
if (this._isStopped()) {
|
|
@@ -235,48 +164,41 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
235
164
|
}
|
|
236
165
|
}
|
|
237
166
|
this._stateData.isMediaKeysAttached = 1 /* MediaKeyAttachmentStatus.Pending */;
|
|
238
|
-
|
|
239
|
-
loadedSessionsStore: stores.loadedSessionsStore,
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
resSsc = _a.sent();
|
|
253
|
-
if (resSsc.type === "error") {
|
|
254
|
-
this.trigger("warning", resSsc.value);
|
|
255
|
-
}
|
|
256
|
-
_a.label = 2;
|
|
257
|
-
case 2:
|
|
258
|
-
if (this._isStopped()) { // We might be stopped since then
|
|
259
|
-
return [2 /*return*/];
|
|
260
|
-
}
|
|
261
|
-
prevState = this._stateData.state;
|
|
262
|
-
this._stateData = { state: ContentDecryptorState.ReadyForContent,
|
|
263
|
-
isMediaKeysAttached: 2 /* MediaKeyAttachmentStatus.Attached */,
|
|
264
|
-
isInitDataQueueLocked: false,
|
|
265
|
-
data: { mediaKeysData: mediaKeysInfo } };
|
|
266
|
-
if (prevState !== ContentDecryptorState.ReadyForContent) {
|
|
267
|
-
this.trigger("stateChange", ContentDecryptorState.ReadyForContent);
|
|
268
|
-
}
|
|
269
|
-
if (!this._isStopped()) {
|
|
270
|
-
this._processCurrentInitDataQueue();
|
|
271
|
-
}
|
|
272
|
-
return [2 /*return*/];
|
|
167
|
+
const stateToAttach = { emeImplementation: eme_1.default,
|
|
168
|
+
loadedSessionsStore: stores.loadedSessionsStore,
|
|
169
|
+
mediaKeySystemAccess,
|
|
170
|
+
mediaKeys,
|
|
171
|
+
keySystemOptions: options };
|
|
172
|
+
log_1.default.debug("DRM: Attaching current MediaKeys");
|
|
173
|
+
(0, attach_media_keys_1.default)(mediaElement, stateToAttach, this._canceller.signal)
|
|
174
|
+
.then(async () => {
|
|
175
|
+
this._stateData.isMediaKeysAttached = 2 /* MediaKeyAttachmentStatus.Attached */;
|
|
176
|
+
const { serverCertificate } = options;
|
|
177
|
+
if (!(0, is_null_or_undefined_1.default)(serverCertificate)) {
|
|
178
|
+
const resSsc = await (0, set_server_certificate_1.default)(mediaKeys, serverCertificate);
|
|
179
|
+
if (resSsc.type === "error") {
|
|
180
|
+
this.trigger("warning", resSsc.value);
|
|
273
181
|
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
182
|
+
}
|
|
183
|
+
if (this._isStopped()) { // We might be stopped since then
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const prevState = this._stateData.state;
|
|
187
|
+
this._stateData = { state: types_1.ContentDecryptorState.ReadyForContent,
|
|
188
|
+
isMediaKeysAttached: 2 /* MediaKeyAttachmentStatus.Attached */,
|
|
189
|
+
isInitDataQueueLocked: false,
|
|
190
|
+
data: { mediaKeysData: mediaKeysInfo } };
|
|
191
|
+
if (prevState !== types_1.ContentDecryptorState.ReadyForContent) {
|
|
192
|
+
this.trigger("stateChange", types_1.ContentDecryptorState.ReadyForContent);
|
|
193
|
+
}
|
|
194
|
+
if (!this._isStopped()) {
|
|
195
|
+
this._processCurrentInitDataQueue();
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
.catch((err) => {
|
|
199
|
+
this._onFatalError(err);
|
|
278
200
|
});
|
|
279
|
-
}
|
|
201
|
+
}
|
|
280
202
|
/**
|
|
281
203
|
* Stop this `ContentDecryptor` instance:
|
|
282
204
|
* - stop listening and reacting to the various event listeners
|
|
@@ -284,15 +206,15 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
284
206
|
*
|
|
285
207
|
* Once disposed, a `ContentDecryptor` cannot be used anymore.
|
|
286
208
|
*/
|
|
287
|
-
|
|
209
|
+
dispose() {
|
|
288
210
|
this.removeEventListener();
|
|
289
|
-
this._stateData = { state: ContentDecryptorState.Disposed,
|
|
211
|
+
this._stateData = { state: types_1.ContentDecryptorState.Disposed,
|
|
290
212
|
isMediaKeysAttached: undefined,
|
|
291
213
|
isInitDataQueueLocked: undefined,
|
|
292
214
|
data: null };
|
|
293
215
|
this._canceller.cancel();
|
|
294
216
|
this.trigger("stateChange", this._stateData.state);
|
|
295
|
-
}
|
|
217
|
+
}
|
|
296
218
|
/**
|
|
297
219
|
* Method to call when new protection initialization data is encounted on the
|
|
298
220
|
* content.
|
|
@@ -302,8 +224,7 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
302
224
|
*
|
|
303
225
|
* @param {Object} initializationData
|
|
304
226
|
*/
|
|
305
|
-
|
|
306
|
-
var _this = this;
|
|
227
|
+
onInitializationData(initializationData) {
|
|
307
228
|
if (this._stateData.isInitDataQueueLocked !== false) {
|
|
308
229
|
if (this._isStopped()) {
|
|
309
230
|
throw new Error("ContentDecryptor either disposed or stopped.");
|
|
@@ -311,11 +232,11 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
311
232
|
this._initDataQueue.push(initializationData);
|
|
312
233
|
return;
|
|
313
234
|
}
|
|
314
|
-
|
|
315
|
-
|
|
235
|
+
const { mediaKeysData } = this._stateData.data;
|
|
236
|
+
const processedInitializationData = Object.assign(Object.assign({}, initializationData), { values: new init_data_values_container_1.default(initializationData.values) });
|
|
316
237
|
this._processInitializationData(processedInitializationData, mediaKeysData)
|
|
317
|
-
.catch(
|
|
318
|
-
}
|
|
238
|
+
.catch(err => { this._onFatalError(err); });
|
|
239
|
+
}
|
|
319
240
|
/**
|
|
320
241
|
* Async logic run each time new initialization data has to be processed.
|
|
321
242
|
* The promise return may reject, in which case a fatal error should be linked
|
|
@@ -325,233 +246,223 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
325
246
|
* @param {Object} initializationData
|
|
326
247
|
* @returns {Promise.<void>}
|
|
327
248
|
*/
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
.some(function (k) { return areArraysOfNumbersEqual(k, innerKid); }) &&
|
|
385
|
-
!createdSess.keyStatuses.blacklisted
|
|
386
|
-
.some(function (k) { return areArraysOfNumbersEqual(k, innerKid); })) {
|
|
387
|
-
createdSess.keyStatuses.blacklisted.push(innerKid);
|
|
388
|
-
}
|
|
389
|
-
};
|
|
390
|
-
// Re-loop through the Period's key ids to blacklist ones that are missing
|
|
391
|
-
// from `createdSess`'s `keyStatuses` and to update the content's
|
|
392
|
-
// decipherability.
|
|
393
|
-
for (_b = 0, periodKeysArr_2 = periodKeysArr; _b < periodKeysArr_2.length; _b++) {
|
|
394
|
-
innerKid = periodKeysArr_2[_b];
|
|
395
|
-
_loop_1(innerKid);
|
|
396
|
-
}
|
|
397
|
-
updateDecipherability(initializationData.content.manifest, createdSess.keyStatuses.whitelisted, createdSess.keyStatuses.blacklisted, []);
|
|
398
|
-
return [2 /*return*/];
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
// /!\ Do not forget to unlock when done
|
|
404
|
-
// TODO this is error-prone and can lead to performance issue when loading
|
|
405
|
-
// persistent sessions.
|
|
406
|
-
// Can we find a better strategy?
|
|
407
|
-
this._lockInitDataQueue();
|
|
408
|
-
if (isNullOrUndefined(options.persistentLicenseConfig)) {
|
|
409
|
-
wantedSessionType = "temporary";
|
|
410
|
-
}
|
|
411
|
-
else if (!canCreatePersistentSession(mediaKeySystemAccess)) {
|
|
412
|
-
log.warn("DRM: Cannot create \"persistent-license\" session: not supported");
|
|
413
|
-
wantedSessionType = "temporary";
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
wantedSessionType = "persistent-license";
|
|
417
|
-
}
|
|
418
|
-
_c = config.getCurrent(), EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS = _c.EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION = _c.EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION;
|
|
419
|
-
maxSessionCacheSize = typeof options.maxSessionCacheSize === "number" ?
|
|
420
|
-
options.maxSessionCacheSize :
|
|
421
|
-
EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS;
|
|
422
|
-
return [4 /*yield*/, createOrLoadSession(initializationData, stores, wantedSessionType, maxSessionCacheSize, this._canceller.signal)];
|
|
423
|
-
case 1:
|
|
424
|
-
sessionRes = _e.sent();
|
|
425
|
-
if (this._isStopped()) {
|
|
426
|
-
return [2 /*return*/];
|
|
427
|
-
}
|
|
428
|
-
sessionInfo = {
|
|
429
|
-
record: sessionRes.value.keySessionRecord,
|
|
430
|
-
source: sessionRes.type,
|
|
431
|
-
keyStatuses: { whitelisted: [], blacklisted: [] },
|
|
432
|
-
blacklistedSessionError: null,
|
|
433
|
-
};
|
|
434
|
-
this._currentSessions.push(sessionInfo);
|
|
435
|
-
_d = sessionRes.value, mediaKeySession = _d.mediaKeySession, sessionType = _d.sessionType;
|
|
436
|
-
isSessionPersisted = false;
|
|
437
|
-
SessionEventsListener(mediaKeySession, options, mediaKeySystemAccess.keySystem, {
|
|
438
|
-
onKeyUpdate: function (value) {
|
|
439
|
-
var linkedKeys = getKeyIdsLinkedToSession(initializationData, sessionInfo.record, options.singleLicensePer, sessionInfo.source === "created-session" /* MediaKeySessionLoadingType.Created */, value.whitelistedKeyIds, value.blacklistedKeyIds);
|
|
440
|
-
sessionInfo.record.associateKeyIds(linkedKeys.whitelisted);
|
|
441
|
-
sessionInfo.record.associateKeyIds(linkedKeys.blacklisted);
|
|
442
|
-
sessionInfo.keyStatuses = { whitelisted: linkedKeys.whitelisted,
|
|
443
|
-
blacklisted: linkedKeys.blacklisted };
|
|
444
|
-
if (sessionInfo.record.getAssociatedKeyIds().length !== 0 &&
|
|
445
|
-
sessionType === "persistent-license" &&
|
|
446
|
-
stores.persistentSessionsStore !== null &&
|
|
447
|
-
!isSessionPersisted) {
|
|
448
|
-
var persistentSessionsStore = stores.persistentSessionsStore;
|
|
449
|
-
cleanOldStoredPersistentInfo(persistentSessionsStore, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION - 1);
|
|
450
|
-
persistentSessionsStore.add(initializationData, sessionInfo.record.getAssociatedKeyIds(), mediaKeySession);
|
|
451
|
-
isSessionPersisted = true;
|
|
452
|
-
}
|
|
453
|
-
if (initializationData.content !== undefined) {
|
|
454
|
-
updateDecipherability(initializationData.content.manifest, linkedKeys.whitelisted, linkedKeys.blacklisted, []);
|
|
455
|
-
}
|
|
456
|
-
_this._unlockInitDataQueue();
|
|
457
|
-
},
|
|
458
|
-
onWarning: function (value) {
|
|
459
|
-
_this.trigger("warning", value);
|
|
460
|
-
},
|
|
461
|
-
onError: function (err) {
|
|
462
|
-
var _a;
|
|
463
|
-
if (err instanceof DecommissionedSessionError) {
|
|
464
|
-
log.warn("DRM: A session's closing condition has been triggered");
|
|
465
|
-
_this._lockInitDataQueue();
|
|
466
|
-
var indexOf = _this._currentSessions.indexOf(sessionInfo);
|
|
467
|
-
if (indexOf >= 0) {
|
|
468
|
-
_this._currentSessions.splice(indexOf);
|
|
469
|
-
}
|
|
470
|
-
if (initializationData.content !== undefined) {
|
|
471
|
-
updateDecipherability(initializationData.content.manifest, [], [], sessionInfo.record.getAssociatedKeyIds());
|
|
472
|
-
}
|
|
473
|
-
(_a = stores.persistentSessionsStore) === null || _a === void 0 ? void 0 : _a.delete(mediaKeySession.sessionId);
|
|
474
|
-
stores.loadedSessionsStore.closeSession(mediaKeySession)
|
|
475
|
-
.catch(function (e) {
|
|
476
|
-
var closeError = e instanceof Error ? e :
|
|
477
|
-
"unknown error";
|
|
478
|
-
log.warn("DRM: failed to close expired session", closeError);
|
|
479
|
-
})
|
|
480
|
-
.then(function () { return _this._unlockInitDataQueue(); })
|
|
481
|
-
.catch(function (retryError) { return _this._onFatalError(retryError); });
|
|
482
|
-
if (!_this._isStopped()) {
|
|
483
|
-
_this.trigger("warning", err.reason);
|
|
484
|
-
}
|
|
485
|
-
return;
|
|
486
|
-
}
|
|
487
|
-
if (!(err instanceof BlacklistedSessionError)) {
|
|
488
|
-
_this._onFatalError(err);
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
sessionInfo.blacklistedSessionError = err;
|
|
492
|
-
if (initializationData.content !== undefined) {
|
|
493
|
-
var manifest = initializationData.content.manifest;
|
|
494
|
-
log.info("DRM: blacklisting Representations based on " +
|
|
495
|
-
"protection data.");
|
|
496
|
-
blackListProtectionData(manifest, initializationData);
|
|
497
|
-
}
|
|
498
|
-
_this._unlockInitDataQueue();
|
|
499
|
-
// TODO warning for blacklisted session?
|
|
500
|
-
},
|
|
501
|
-
}, this._canceller.signal);
|
|
502
|
-
if (options.singleLicensePer === undefined ||
|
|
503
|
-
options.singleLicensePer === "init-data") {
|
|
504
|
-
this._unlockInitDataQueue();
|
|
505
|
-
}
|
|
506
|
-
if (!(sessionRes.type === "created-session" /* MediaKeySessionLoadingType.Created */)) return [3 /*break*/, 5];
|
|
507
|
-
requestData = initializationData.values.constructRequestData();
|
|
508
|
-
_e.label = 2;
|
|
509
|
-
case 2:
|
|
510
|
-
_e.trys.push([2, 4, , 5]);
|
|
511
|
-
return [4 /*yield*/, stores.loadedSessionsStore.generateLicenseRequest(mediaKeySession, initializationData.type, requestData)];
|
|
512
|
-
case 3:
|
|
513
|
-
_e.sent();
|
|
514
|
-
return [3 /*break*/, 5];
|
|
515
|
-
case 4:
|
|
516
|
-
error_1 = _e.sent();
|
|
517
|
-
entry = stores.loadedSessionsStore.getEntryForSession(mediaKeySession);
|
|
518
|
-
if (entry === null || entry.closingStatus.type !== "none") {
|
|
519
|
-
indexInCurrent = this._currentSessions.indexOf(sessionInfo);
|
|
520
|
-
if (indexInCurrent >= 0) {
|
|
521
|
-
this._currentSessions.splice(indexInCurrent, 1);
|
|
249
|
+
async _processInitializationData(initializationData, mediaKeysData) {
|
|
250
|
+
const { mediaKeySystemAccess, stores, options } = mediaKeysData;
|
|
251
|
+
if (this._tryToUseAlreadyCreatedSession(initializationData, mediaKeysData) ||
|
|
252
|
+
this._isStopped()) // _isStopped is voluntarly checked after here
|
|
253
|
+
{
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (options.singleLicensePer === "content") {
|
|
257
|
+
const firstCreatedSession = (0, array_find_1.default)(this._currentSessions, (x) => x.source === "created-session" /* MediaKeySessionLoadingType.Created */);
|
|
258
|
+
if (firstCreatedSession !== undefined) {
|
|
259
|
+
// We already fetched a `singleLicensePer: "content"` license, yet we
|
|
260
|
+
// could not use the already-created MediaKeySession with it.
|
|
261
|
+
// It means that we'll never handle it and we should thus blacklist it.
|
|
262
|
+
const keyIds = initializationData.keyIds;
|
|
263
|
+
if (keyIds === undefined) {
|
|
264
|
+
if (initializationData.content === undefined) {
|
|
265
|
+
log_1.default.warn("DRM: Unable to fallback from a non-decipherable quality.");
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
blackListProtectionData(initializationData.content.manifest, initializationData);
|
|
269
|
+
}
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
firstCreatedSession.record.associateKeyIds(keyIds);
|
|
273
|
+
if (initializationData.content !== undefined) {
|
|
274
|
+
if (log_1.default.hasLevel("DEBUG")) {
|
|
275
|
+
const hexKids = keyIds
|
|
276
|
+
.reduce((acc, kid) => `${acc}, ${(0, string_parsing_1.bytesToHex)(kid)}`, "");
|
|
277
|
+
log_1.default.debug("DRM: Blacklisting new key ids", hexKids);
|
|
278
|
+
}
|
|
279
|
+
updateDecipherability(initializationData.content.manifest, [], keyIds, []);
|
|
280
|
+
}
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (options.singleLicensePer === "periods" &&
|
|
285
|
+
initializationData.content !== undefined) {
|
|
286
|
+
const { period } = initializationData.content;
|
|
287
|
+
const createdSessions = this._currentSessions
|
|
288
|
+
.filter(x => x.source === "created-session" /* MediaKeySessionLoadingType.Created */);
|
|
289
|
+
const periodKeys = new Set();
|
|
290
|
+
addKeyIdsFromPeriod(periodKeys, period);
|
|
291
|
+
for (const createdSess of createdSessions) {
|
|
292
|
+
const periodKeysArr = Array.from(periodKeys);
|
|
293
|
+
for (const kid of periodKeysArr) {
|
|
294
|
+
if (createdSess.record.isAssociatedWithKeyId(kid)) {
|
|
295
|
+
createdSess.record.associateKeyIds(periodKeys.values());
|
|
296
|
+
// Re-loop through the Period's key ids to blacklist ones that are missing
|
|
297
|
+
// from `createdSess`'s `keyStatuses` and to update the content's
|
|
298
|
+
// decipherability.
|
|
299
|
+
for (const innerKid of periodKeysArr) {
|
|
300
|
+
if (!createdSess.keyStatuses.whitelisted
|
|
301
|
+
.some(k => (0, are_arrays_of_numbers_equal_1.default)(k, innerKid)) &&
|
|
302
|
+
!createdSess.keyStatuses.blacklisted
|
|
303
|
+
.some(k => (0, are_arrays_of_numbers_equal_1.default)(k, innerKid))) {
|
|
304
|
+
createdSess.keyStatuses.blacklisted.push(innerKid);
|
|
522
305
|
}
|
|
523
|
-
return [2 /*return*/, Promise.resolve()];
|
|
524
306
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
307
|
+
updateDecipherability(initializationData.content.manifest, createdSess.keyStatuses.whitelisted, createdSess.keyStatuses.blacklisted, []);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
528
310
|
}
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// /!\ Do not forget to unlock when done
|
|
314
|
+
// TODO this is error-prone and can lead to performance issue when loading
|
|
315
|
+
// persistent sessions.
|
|
316
|
+
// Can we find a better strategy?
|
|
317
|
+
this._lockInitDataQueue();
|
|
318
|
+
let wantedSessionType;
|
|
319
|
+
if ((0, is_null_or_undefined_1.default)(options.persistentLicenseConfig)) {
|
|
320
|
+
wantedSessionType = "temporary";
|
|
321
|
+
}
|
|
322
|
+
else if (!canCreatePersistentSession(mediaKeySystemAccess)) {
|
|
323
|
+
log_1.default.warn("DRM: Cannot create \"persistent-license\" session: not supported");
|
|
324
|
+
wantedSessionType = "temporary";
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
wantedSessionType = "persistent-license";
|
|
328
|
+
}
|
|
329
|
+
const { EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION } = config_1.default.getCurrent();
|
|
330
|
+
const maxSessionCacheSize = typeof options.maxSessionCacheSize === "number" ?
|
|
331
|
+
options.maxSessionCacheSize :
|
|
332
|
+
EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS;
|
|
333
|
+
const sessionRes = await (0, create_or_load_session_1.default)(initializationData, stores, wantedSessionType, maxSessionCacheSize, this._canceller.signal);
|
|
334
|
+
if (this._isStopped()) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const sessionInfo = {
|
|
338
|
+
record: sessionRes.value.keySessionRecord,
|
|
339
|
+
source: sessionRes.type,
|
|
340
|
+
keyStatuses: { whitelisted: [], blacklisted: [] },
|
|
341
|
+
blacklistedSessionError: null,
|
|
342
|
+
};
|
|
343
|
+
this._currentSessions.push(sessionInfo);
|
|
344
|
+
const { mediaKeySession, sessionType } = sessionRes.value;
|
|
345
|
+
/**
|
|
346
|
+
* We only store persistent sessions once its keys are known.
|
|
347
|
+
* This boolean allows to know if this session has already been
|
|
348
|
+
* persisted or not.
|
|
349
|
+
*/
|
|
350
|
+
let isSessionPersisted = false;
|
|
351
|
+
(0, session_events_listener_1.default)(mediaKeySession, options, mediaKeySystemAccess.keySystem, {
|
|
352
|
+
onKeyUpdate: (value) => {
|
|
353
|
+
const linkedKeys = getKeyIdsLinkedToSession(initializationData, sessionInfo.record, options.singleLicensePer, sessionInfo.source === "created-session" /* MediaKeySessionLoadingType.Created */, value.whitelistedKeyIds, value.blacklistedKeyIds);
|
|
354
|
+
sessionInfo.record.associateKeyIds(linkedKeys.whitelisted);
|
|
355
|
+
sessionInfo.record.associateKeyIds(linkedKeys.blacklisted);
|
|
356
|
+
sessionInfo.keyStatuses = { whitelisted: linkedKeys.whitelisted,
|
|
357
|
+
blacklisted: linkedKeys.blacklisted };
|
|
358
|
+
if (sessionInfo.record.getAssociatedKeyIds().length !== 0 &&
|
|
359
|
+
sessionType === "persistent-license" &&
|
|
360
|
+
stores.persistentSessionsStore !== null &&
|
|
361
|
+
!isSessionPersisted) {
|
|
362
|
+
const { persistentSessionsStore } = stores;
|
|
363
|
+
(0, clean_old_stored_persistent_info_1.default)(persistentSessionsStore, EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION - 1);
|
|
364
|
+
persistentSessionsStore.add(initializationData, sessionInfo.record.getAssociatedKeyIds(), mediaKeySession);
|
|
365
|
+
isSessionPersisted = true;
|
|
366
|
+
}
|
|
367
|
+
if (initializationData.content !== undefined) {
|
|
368
|
+
updateDecipherability(initializationData.content.manifest, linkedKeys.whitelisted, linkedKeys.blacklisted, []);
|
|
369
|
+
}
|
|
370
|
+
this._unlockInitDataQueue();
|
|
371
|
+
},
|
|
372
|
+
onWarning: (value) => {
|
|
373
|
+
this.trigger("warning", value);
|
|
374
|
+
},
|
|
375
|
+
onError: (err) => {
|
|
376
|
+
var _a;
|
|
377
|
+
if (err instanceof check_key_statuses_1.DecommissionedSessionError) {
|
|
378
|
+
log_1.default.warn("DRM: A session's closing condition has been triggered");
|
|
379
|
+
this._lockInitDataQueue();
|
|
380
|
+
const indexOf = this._currentSessions.indexOf(sessionInfo);
|
|
381
|
+
if (indexOf >= 0) {
|
|
382
|
+
this._currentSessions.splice(indexOf);
|
|
383
|
+
}
|
|
384
|
+
if (initializationData.content !== undefined) {
|
|
385
|
+
updateDecipherability(initializationData.content.manifest, [], [], sessionInfo.record.getAssociatedKeyIds());
|
|
386
|
+
}
|
|
387
|
+
(_a = stores.persistentSessionsStore) === null || _a === void 0 ? void 0 : _a.delete(mediaKeySession.sessionId);
|
|
388
|
+
stores.loadedSessionsStore.closeSession(mediaKeySession)
|
|
389
|
+
.catch(e => {
|
|
390
|
+
const closeError = e instanceof Error ? e :
|
|
391
|
+
"unknown error";
|
|
392
|
+
log_1.default.warn("DRM: failed to close expired session", closeError);
|
|
393
|
+
})
|
|
394
|
+
.then(() => this._unlockInitDataQueue())
|
|
395
|
+
.catch((retryError) => this._onFatalError(retryError));
|
|
396
|
+
if (!this._isStopped()) {
|
|
397
|
+
this.trigger("warning", err.reason);
|
|
398
|
+
}
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (!(err instanceof session_events_listener_1.BlacklistedSessionError)) {
|
|
402
|
+
this._onFatalError(err);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
sessionInfo.blacklistedSessionError = err;
|
|
406
|
+
if (initializationData.content !== undefined) {
|
|
407
|
+
const { manifest } = initializationData.content;
|
|
408
|
+
log_1.default.info("DRM: blacklisting Representations based on " +
|
|
409
|
+
"protection data.");
|
|
410
|
+
blackListProtectionData(manifest, initializationData);
|
|
411
|
+
}
|
|
412
|
+
this._unlockInitDataQueue();
|
|
413
|
+
// TODO warning for blacklisted session?
|
|
414
|
+
},
|
|
415
|
+
}, this._canceller.signal);
|
|
416
|
+
if (options.singleLicensePer === undefined ||
|
|
417
|
+
options.singleLicensePer === "init-data") {
|
|
418
|
+
this._unlockInitDataQueue();
|
|
419
|
+
}
|
|
420
|
+
if (sessionRes.type === "created-session" /* MediaKeySessionLoadingType.Created */) {
|
|
421
|
+
const requestData = initializationData.values.constructRequestData();
|
|
422
|
+
try {
|
|
423
|
+
await stores.loadedSessionsStore.generateLicenseRequest(mediaKeySession, initializationData.type, requestData);
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
// First check that the error was not due to the MediaKeySession closing
|
|
427
|
+
// or being closed
|
|
428
|
+
const entry = stores.loadedSessionsStore.getEntryForSession(mediaKeySession);
|
|
429
|
+
if (entry === null || entry.closingStatus.type !== "none") {
|
|
430
|
+
// MediaKeySession closing/closed: Just remove from handled list and abort.
|
|
431
|
+
const indexInCurrent = this._currentSessions.indexOf(sessionInfo);
|
|
432
|
+
if (indexInCurrent >= 0) {
|
|
433
|
+
this._currentSessions.splice(indexInCurrent, 1);
|
|
434
|
+
}
|
|
435
|
+
return Promise.resolve();
|
|
436
|
+
}
|
|
437
|
+
throw new errors_1.EncryptedMediaError("KEY_GENERATE_REQUEST_ERROR", error instanceof Error ? error.toString() :
|
|
438
|
+
"Unknown error");
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return Promise.resolve();
|
|
442
|
+
}
|
|
443
|
+
_tryToUseAlreadyCreatedSession(initializationData, mediaKeysData) {
|
|
444
|
+
const { stores, options } = mediaKeysData;
|
|
534
445
|
/**
|
|
535
446
|
* If set, a currently-used key session is already compatible to this
|
|
536
447
|
* initialization data.
|
|
537
448
|
*/
|
|
538
|
-
|
|
449
|
+
const compatibleSessionInfo = (0, array_find_1.default)(this._currentSessions, (x) => x.record.isCompatibleWith(initializationData));
|
|
539
450
|
if (compatibleSessionInfo === undefined) {
|
|
540
451
|
return false;
|
|
541
452
|
}
|
|
542
453
|
// Check if the compatible session is blacklisted
|
|
543
|
-
|
|
544
|
-
if (!
|
|
454
|
+
const blacklistedSessionError = compatibleSessionInfo.blacklistedSessionError;
|
|
455
|
+
if (!(0, is_null_or_undefined_1.default)(blacklistedSessionError)) {
|
|
545
456
|
if (initializationData.type === undefined ||
|
|
546
457
|
initializationData.content === undefined) {
|
|
547
|
-
|
|
458
|
+
log_1.default.error("DRM: This initialization data has already been blacklisted " +
|
|
548
459
|
"but the current content is not known.");
|
|
549
460
|
return true;
|
|
550
461
|
}
|
|
551
462
|
else {
|
|
552
|
-
|
|
463
|
+
log_1.default.info("DRM: This initialization data has already been blacklisted. " +
|
|
553
464
|
"Blacklisting the related content.");
|
|
554
|
-
|
|
465
|
+
const { manifest } = initializationData.content;
|
|
555
466
|
blackListProtectionData(manifest, initializationData);
|
|
556
467
|
return true;
|
|
557
468
|
}
|
|
@@ -562,7 +473,7 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
562
473
|
* If set to `true`, the Representation(s) linked to this
|
|
563
474
|
* initialization data's key id should be marked as "not decipherable".
|
|
564
475
|
*/
|
|
565
|
-
|
|
476
|
+
let isUndecipherable;
|
|
566
477
|
if (options.singleLicensePer === undefined ||
|
|
567
478
|
options.singleLicensePer === "init-data") {
|
|
568
479
|
// Note: In the default "init-data" mode, we only avoid a
|
|
@@ -573,8 +484,8 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
573
484
|
// This is to enforce v3.x.x retro-compatibility: we cannot
|
|
574
485
|
// fallback from a Representation unless some RxPlayer option
|
|
575
486
|
// documentating this behavior has been set.
|
|
576
|
-
|
|
577
|
-
isUndecipherable = areSomeKeyIdsContainedIn(initializationData.keyIds, blacklisted);
|
|
487
|
+
const { blacklisted } = compatibleSessionInfo.keyStatuses;
|
|
488
|
+
isUndecipherable = (0, key_id_comparison_1.areSomeKeyIdsContainedIn)(initializationData.keyIds, blacklisted);
|
|
578
489
|
}
|
|
579
490
|
else {
|
|
580
491
|
// In any other mode, as soon as not all of this initialization
|
|
@@ -582,15 +493,15 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
582
493
|
// the corresponding Representation as "not decipherable".
|
|
583
494
|
// This is because we've no such retro-compatibility guarantee to
|
|
584
495
|
// make there.
|
|
585
|
-
|
|
586
|
-
isUndecipherable = !areAllKeyIdsContainedIn(initializationData.keyIds, whitelisted);
|
|
496
|
+
const { whitelisted } = compatibleSessionInfo.keyStatuses;
|
|
497
|
+
isUndecipherable = !(0, key_id_comparison_1.areAllKeyIdsContainedIn)(initializationData.keyIds, whitelisted);
|
|
587
498
|
}
|
|
588
499
|
if (isUndecipherable) {
|
|
589
500
|
if (initializationData.content === undefined) {
|
|
590
|
-
|
|
501
|
+
log_1.default.error("DRM: Cannot forbid key id, the content is unknown.");
|
|
591
502
|
return true;
|
|
592
503
|
}
|
|
593
|
-
|
|
504
|
+
log_1.default.info("DRM: Current initialization data is linked to blacklisted keys. " +
|
|
594
505
|
"Marking Representations as not decipherable");
|
|
595
506
|
updateDecipherability(initializationData.content.manifest, [], initializationData.keyIds, []);
|
|
596
507
|
return true;
|
|
@@ -599,26 +510,26 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
599
510
|
// If we reached here, it means that this initialization data is not
|
|
600
511
|
// blacklisted in any way.
|
|
601
512
|
// Search loaded session and put it on top of the cache if it exists.
|
|
602
|
-
|
|
513
|
+
const entry = stores.loadedSessionsStore.reuse(initializationData);
|
|
603
514
|
if (entry !== null) {
|
|
604
515
|
// TODO update decipherability to `true` if not?
|
|
605
|
-
|
|
516
|
+
log_1.default.debug("DRM: Init data already processed. Skipping it.");
|
|
606
517
|
return true;
|
|
607
518
|
}
|
|
608
519
|
// Session not found in `loadedSessionsStore`, it might have been closed
|
|
609
520
|
// since.
|
|
610
521
|
// Remove from `this._currentSessions` and start again.
|
|
611
|
-
|
|
522
|
+
const indexOf = this._currentSessions.indexOf(compatibleSessionInfo);
|
|
612
523
|
if (indexOf === -1) {
|
|
613
|
-
|
|
524
|
+
log_1.default.error("DRM: Unable to remove processed init data: not found.");
|
|
614
525
|
}
|
|
615
526
|
else {
|
|
616
|
-
|
|
527
|
+
log_1.default.debug("DRM: A session from a processed init data is not available " +
|
|
617
528
|
"anymore. Re-processing it.");
|
|
618
529
|
this._currentSessions.splice(indexOf, 1);
|
|
619
530
|
}
|
|
620
531
|
return false;
|
|
621
|
-
}
|
|
532
|
+
}
|
|
622
533
|
/**
|
|
623
534
|
* Callback that should be called if an error that made the current
|
|
624
535
|
* `ContentDecryptor` instance unusable arised.
|
|
@@ -629,48 +540,48 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
629
540
|
* @param {*} err - The error object which describes the issue. Will be
|
|
630
541
|
* formatted and sent in an "error" event.
|
|
631
542
|
*/
|
|
632
|
-
|
|
543
|
+
_onFatalError(err) {
|
|
633
544
|
if (this._canceller.isUsed()) {
|
|
634
545
|
return;
|
|
635
546
|
}
|
|
636
|
-
|
|
547
|
+
const formattedErr = err instanceof Error ?
|
|
637
548
|
err :
|
|
638
|
-
new OtherError("NONE", "Unknown decryption error");
|
|
549
|
+
new errors_1.OtherError("NONE", "Unknown decryption error");
|
|
639
550
|
this.error = formattedErr;
|
|
640
551
|
this._initDataQueue.length = 0;
|
|
641
|
-
this._stateData = { state: ContentDecryptorState.Error,
|
|
552
|
+
this._stateData = { state: types_1.ContentDecryptorState.Error,
|
|
642
553
|
isMediaKeysAttached: undefined,
|
|
643
554
|
isInitDataQueueLocked: undefined,
|
|
644
555
|
data: null };
|
|
645
556
|
this._canceller.cancel();
|
|
646
557
|
this.trigger("error", formattedErr);
|
|
647
558
|
// The previous trigger might have lead to a disposal of the `ContentDecryptor`.
|
|
648
|
-
if (this._stateData.state === ContentDecryptorState.Error) {
|
|
559
|
+
if (this._stateData.state === types_1.ContentDecryptorState.Error) {
|
|
649
560
|
this.trigger("stateChange", this._stateData.state);
|
|
650
561
|
}
|
|
651
|
-
}
|
|
562
|
+
}
|
|
652
563
|
/**
|
|
653
564
|
* Return `true` if the `ContentDecryptor` has either been disposed or
|
|
654
565
|
* encountered a fatal error which made it stop.
|
|
655
566
|
* @returns {boolean}
|
|
656
567
|
*/
|
|
657
|
-
|
|
658
|
-
return this._stateData.state === ContentDecryptorState.Disposed ||
|
|
659
|
-
this._stateData.state === ContentDecryptorState.Error;
|
|
660
|
-
}
|
|
568
|
+
_isStopped() {
|
|
569
|
+
return this._stateData.state === types_1.ContentDecryptorState.Disposed ||
|
|
570
|
+
this._stateData.state === types_1.ContentDecryptorState.Error;
|
|
571
|
+
}
|
|
661
572
|
/**
|
|
662
573
|
* Start processing the next initialization data of the `_initDataQueue` if it
|
|
663
574
|
* isn't lock.
|
|
664
575
|
*/
|
|
665
|
-
|
|
576
|
+
_processCurrentInitDataQueue() {
|
|
666
577
|
while (this._stateData.isInitDataQueueLocked === false) {
|
|
667
|
-
|
|
578
|
+
const initData = this._initDataQueue.shift();
|
|
668
579
|
if (initData === undefined) {
|
|
669
580
|
return;
|
|
670
581
|
}
|
|
671
582
|
this.onInitializationData(initData);
|
|
672
583
|
}
|
|
673
|
-
}
|
|
584
|
+
}
|
|
674
585
|
/**
|
|
675
586
|
* Lock new initialization data (from the `_initDataQueue`) from being
|
|
676
587
|
* processed until `_unlockInitDataQueue` is called.
|
|
@@ -678,27 +589,26 @@ var ContentDecryptor = /** @class */ (function (_super) {
|
|
|
678
589
|
* You may want to call this method when performing operations which may have
|
|
679
590
|
* an impact on the handling of other initialization data.
|
|
680
591
|
*/
|
|
681
|
-
|
|
592
|
+
_lockInitDataQueue() {
|
|
682
593
|
if (this._stateData.isInitDataQueueLocked === false) {
|
|
683
594
|
this._stateData.isInitDataQueueLocked = true;
|
|
684
595
|
}
|
|
685
|
-
}
|
|
596
|
+
}
|
|
686
597
|
/**
|
|
687
598
|
* Unlock `_initDataQueue` and start processing the first element.
|
|
688
599
|
*
|
|
689
600
|
* Should have no effect if the `_initDataQueue` was not locked.
|
|
690
601
|
*/
|
|
691
|
-
|
|
602
|
+
_unlockInitDataQueue() {
|
|
692
603
|
if (this._stateData.isMediaKeysAttached !== 2 /* MediaKeyAttachmentStatus.Attached */) {
|
|
693
|
-
|
|
604
|
+
log_1.default.error("DRM: Trying to unlock in the wrong state");
|
|
694
605
|
return;
|
|
695
606
|
}
|
|
696
607
|
this._stateData.isInitDataQueueLocked = false;
|
|
697
608
|
this._processCurrentInitDataQueue();
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
export default ContentDecryptor;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
exports.default = ContentDecryptor;
|
|
702
612
|
/**
|
|
703
613
|
* Returns `true` if the given MediaKeySystemAccess can create
|
|
704
614
|
* "persistent-license" MediaKeySessions.
|
|
@@ -706,9 +616,9 @@ export default ContentDecryptor;
|
|
|
706
616
|
* @returns {Boolean}
|
|
707
617
|
*/
|
|
708
618
|
function canCreatePersistentSession(mediaKeySystemAccess) {
|
|
709
|
-
|
|
619
|
+
const { sessionTypes } = mediaKeySystemAccess.getConfiguration();
|
|
710
620
|
return sessionTypes !== undefined &&
|
|
711
|
-
|
|
621
|
+
(0, array_includes_1.default)(sessionTypes, "persistent-license");
|
|
712
622
|
}
|
|
713
623
|
/**
|
|
714
624
|
* Change the decipherability of Representations which have their key id in one
|
|
@@ -729,29 +639,25 @@ function canCreatePersistentSession(mediaKeySystemAccess) {
|
|
|
729
639
|
* @param {Array.<Uint8Array>} delistedKeyIds
|
|
730
640
|
*/
|
|
731
641
|
function updateDecipherability(manifest, whitelistedKeyIds, blacklistedKeyIds, delistedKeyIds) {
|
|
732
|
-
manifest.updateRepresentationsDeciperability(
|
|
642
|
+
manifest.updateRepresentationsDeciperability((representation) => {
|
|
733
643
|
if (representation.contentProtections === undefined) {
|
|
734
644
|
return representation.decipherable;
|
|
735
645
|
}
|
|
736
|
-
|
|
646
|
+
const contentKIDs = representation.contentProtections.keyIds;
|
|
737
647
|
if (contentKIDs !== undefined) {
|
|
738
|
-
for (
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
var blacklistedKeyId = blacklistedKeyIds_1[_a];
|
|
742
|
-
if (areArraysOfNumbersEqual(blacklistedKeyId, elt.keyId)) {
|
|
648
|
+
for (const elt of contentKIDs) {
|
|
649
|
+
for (const blacklistedKeyId of blacklistedKeyIds) {
|
|
650
|
+
if ((0, are_arrays_of_numbers_equal_1.default)(blacklistedKeyId, elt.keyId)) {
|
|
743
651
|
return false;
|
|
744
652
|
}
|
|
745
653
|
}
|
|
746
|
-
for (
|
|
747
|
-
|
|
748
|
-
if (areArraysOfNumbersEqual(whitelistedKeyId, elt.keyId)) {
|
|
654
|
+
for (const whitelistedKeyId of whitelistedKeyIds) {
|
|
655
|
+
if ((0, are_arrays_of_numbers_equal_1.default)(whitelistedKeyId, elt.keyId)) {
|
|
749
656
|
return true;
|
|
750
657
|
}
|
|
751
658
|
}
|
|
752
|
-
for (
|
|
753
|
-
|
|
754
|
-
if (areArraysOfNumbersEqual(delistedKeyId, elt.keyId)) {
|
|
659
|
+
for (const delistedKeyId of delistedKeyIds) {
|
|
660
|
+
if ((0, are_arrays_of_numbers_equal_1.default)(delistedKeyId, elt.keyId)) {
|
|
755
661
|
return undefined;
|
|
756
662
|
}
|
|
757
663
|
}
|
|
@@ -767,33 +673,27 @@ function updateDecipherability(manifest, whitelistedKeyIds, blacklistedKeyIds, d
|
|
|
767
673
|
* @param {Object} initData
|
|
768
674
|
*/
|
|
769
675
|
function blackListProtectionData(manifest, initData) {
|
|
770
|
-
manifest.updateRepresentationsDeciperability(
|
|
676
|
+
manifest.updateRepresentationsDeciperability((representation) => {
|
|
771
677
|
var _a, _b;
|
|
772
678
|
if (representation.decipherable === false) {
|
|
773
679
|
return false;
|
|
774
680
|
}
|
|
775
|
-
|
|
776
|
-
|
|
681
|
+
const segmentProtections = (_b = (_a = representation.contentProtections) === null || _a === void 0 ? void 0 : _a.initData) !== null && _b !== void 0 ? _b : [];
|
|
682
|
+
for (const protection of segmentProtections) {
|
|
777
683
|
if (initData.type === undefined ||
|
|
778
684
|
protection.type === initData.type) {
|
|
779
|
-
|
|
780
|
-
.every(
|
|
781
|
-
return protection.values.some(
|
|
685
|
+
const containedInitData = initData.values.getFormattedValues()
|
|
686
|
+
.every(undecipherableVal => {
|
|
687
|
+
return protection.values.some(currVal => {
|
|
782
688
|
return (undecipherableVal.systemId === undefined ||
|
|
783
689
|
currVal.systemId === undecipherableVal.systemId) &&
|
|
784
|
-
|
|
690
|
+
(0, are_arrays_of_numbers_equal_1.default)(currVal.data, undecipherableVal.data);
|
|
785
691
|
});
|
|
786
692
|
});
|
|
787
693
|
if (containedInitData) {
|
|
788
|
-
return
|
|
694
|
+
return false;
|
|
789
695
|
}
|
|
790
696
|
}
|
|
791
|
-
};
|
|
792
|
-
for (var _i = 0, segmentProtections_1 = segmentProtections; _i < segmentProtections_1.length; _i++) {
|
|
793
|
-
var protection = segmentProtections_1[_i];
|
|
794
|
-
var state_1 = _loop_2(protection);
|
|
795
|
-
if (typeof state_1 === "object")
|
|
796
|
-
return state_1.value;
|
|
797
697
|
}
|
|
798
698
|
return representation.decipherable;
|
|
799
699
|
});
|
|
@@ -840,21 +740,18 @@ function getKeyIdsLinkedToSession(initializationData, keySessionRecord, singleLi
|
|
|
840
740
|
* Every key id associated with the MediaKeySession, starting with
|
|
841
741
|
* whitelisted ones.
|
|
842
742
|
*/
|
|
843
|
-
|
|
743
|
+
const associatedKeyIds = [...usableKeyIds,
|
|
744
|
+
...unusableKeyIds];
|
|
844
745
|
// Add all key ids associated to the `KeySessionRecord` yet not in
|
|
845
746
|
// `usableKeyIds` nor in `unusableKeyIds`
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
if (!associatedKeyIds.some(
|
|
849
|
-
if (
|
|
850
|
-
|
|
747
|
+
const allKnownKeyIds = keySessionRecord.getAssociatedKeyIds();
|
|
748
|
+
for (const kid of allKnownKeyIds) {
|
|
749
|
+
if (!associatedKeyIds.some(ak => (0, are_arrays_of_numbers_equal_1.default)(ak, kid))) {
|
|
750
|
+
if (log_1.default.hasLevel("DEBUG")) {
|
|
751
|
+
log_1.default.debug("DRM: KeySessionRecord's key missing in the license, blacklisting it", (0, string_parsing_1.bytesToHex)(kid));
|
|
851
752
|
}
|
|
852
753
|
associatedKeyIds.push(kid);
|
|
853
754
|
}
|
|
854
|
-
};
|
|
855
|
-
for (var _i = 0, allKnownKeyIds_1 = allKnownKeyIds; _i < allKnownKeyIds_1.length; _i++) {
|
|
856
|
-
var kid = allKnownKeyIds_1[_i];
|
|
857
|
-
_loop_3(kid);
|
|
858
755
|
}
|
|
859
756
|
if (singleLicensePer !== undefined && singleLicensePer !== "init-data") {
|
|
860
757
|
// We want to add the current key ids in the blacklist if it is
|
|
@@ -870,52 +767,44 @@ function getKeyIdsLinkedToSession(initializationData, keySessionRecord, singleLi
|
|
|
870
767
|
// sure yet. Because in any other `singleLicensePer`, we
|
|
871
768
|
// need a good implementation anyway, it doesn't matter
|
|
872
769
|
// there.
|
|
873
|
-
|
|
770
|
+
const { keyIds: expectedKeyIds, content } = initializationData;
|
|
874
771
|
if (expectedKeyIds !== undefined) {
|
|
875
|
-
|
|
876
|
-
return !associatedKeyIds.some(
|
|
772
|
+
const missingKeyIds = expectedKeyIds.filter(expected => {
|
|
773
|
+
return !associatedKeyIds.some(k => (0, are_arrays_of_numbers_equal_1.default)(k, expected));
|
|
877
774
|
});
|
|
878
775
|
if (missingKeyIds.length > 0) {
|
|
879
|
-
if (
|
|
880
|
-
|
|
776
|
+
if (log_1.default.hasLevel("DEBUG")) {
|
|
777
|
+
log_1.default.debug("DRM: init data keys missing in the license, blacklisting them", missingKeyIds.map(m => (0, string_parsing_1.bytesToHex)(m)).join(", "));
|
|
881
778
|
}
|
|
882
|
-
associatedKeyIds.push
|
|
779
|
+
associatedKeyIds.push(...missingKeyIds);
|
|
883
780
|
}
|
|
884
781
|
}
|
|
885
782
|
if (isCurrentLicense && content !== undefined) {
|
|
886
783
|
if (singleLicensePer === "content") {
|
|
887
784
|
// Put it in a Set to automatically filter out duplicates (by ref)
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
for (
|
|
891
|
-
var period = _c[_b];
|
|
785
|
+
const contentKeys = new Set();
|
|
786
|
+
const { manifest } = content;
|
|
787
|
+
for (const period of manifest.periods) {
|
|
892
788
|
addKeyIdsFromPeriod(contentKeys, period);
|
|
893
789
|
}
|
|
894
790
|
mergeKeyIdSetIntoArray(contentKeys, associatedKeyIds);
|
|
895
791
|
}
|
|
896
792
|
else if (singleLicensePer === "periods") {
|
|
897
|
-
|
|
898
|
-
for (
|
|
899
|
-
|
|
900
|
-
var periodKeys = new Set();
|
|
793
|
+
const { manifest } = content;
|
|
794
|
+
for (const period of manifest.periods) {
|
|
795
|
+
const periodKeys = new Set();
|
|
901
796
|
addKeyIdsFromPeriod(periodKeys, period);
|
|
902
797
|
if (((_a = initializationData.content) === null || _a === void 0 ? void 0 : _a.period.id) === period.id) {
|
|
903
798
|
mergeKeyIdSetIntoArray(periodKeys, associatedKeyIds);
|
|
904
799
|
}
|
|
905
800
|
else {
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
801
|
+
const periodKeysArr = Array.from(periodKeys);
|
|
802
|
+
for (const kid of periodKeysArr) {
|
|
803
|
+
const isFound = associatedKeyIds.some(k => (0, are_arrays_of_numbers_equal_1.default)(k, kid));
|
|
909
804
|
if (isFound) {
|
|
910
805
|
mergeKeyIdSetIntoArray(periodKeys, associatedKeyIds);
|
|
911
|
-
return "break";
|
|
912
|
-
}
|
|
913
|
-
};
|
|
914
|
-
for (var _f = 0, periodKeysArr_3 = periodKeysArr; _f < periodKeysArr_3.length; _f++) {
|
|
915
|
-
var kid = periodKeysArr_3[_f];
|
|
916
|
-
var state_2 = _loop_4(kid);
|
|
917
|
-
if (state_2 === "break")
|
|
918
806
|
break;
|
|
807
|
+
}
|
|
919
808
|
}
|
|
920
809
|
}
|
|
921
810
|
}
|
|
@@ -933,16 +822,12 @@ function getKeyIdsLinkedToSession(initializationData, keySessionRecord, singleLi
|
|
|
933
822
|
* @param {Array.<Uint8Array>} arr
|
|
934
823
|
*/
|
|
935
824
|
function mergeKeyIdSetIntoArray(set, arr) {
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
825
|
+
const setArr = Array.from(set.values());
|
|
826
|
+
for (const kid of setArr) {
|
|
827
|
+
const isFound = arr.some(k => (0, are_arrays_of_numbers_equal_1.default)(k, kid));
|
|
939
828
|
if (!isFound) {
|
|
940
829
|
arr.push(kid);
|
|
941
830
|
}
|
|
942
|
-
};
|
|
943
|
-
for (var _i = 0, setArr_1 = setArr; _i < setArr_1.length; _i++) {
|
|
944
|
-
var kid = setArr_1[_i];
|
|
945
|
-
_loop_5(kid);
|
|
946
831
|
}
|
|
947
832
|
}
|
|
948
833
|
/**
|
|
@@ -951,14 +836,11 @@ function mergeKeyIdSetIntoArray(set, arr) {
|
|
|
951
836
|
* @param {Object} period
|
|
952
837
|
*/
|
|
953
838
|
function addKeyIdsFromPeriod(set, period) {
|
|
954
|
-
for (
|
|
955
|
-
|
|
956
|
-
for (var _b = 0, _c = adaptation.representations; _b < _c.length; _b++) {
|
|
957
|
-
var representation = _c[_b];
|
|
839
|
+
for (const adaptation of period.getAdaptations()) {
|
|
840
|
+
for (const representation of adaptation.representations) {
|
|
958
841
|
if (representation.contentProtections !== undefined &&
|
|
959
842
|
representation.contentProtections.keyIds !== undefined) {
|
|
960
|
-
for (
|
|
961
|
-
var kidInf = _e[_d];
|
|
843
|
+
for (const kidInf of representation.contentProtections.keyIds) {
|
|
962
844
|
set.add(kidInf.keyId);
|
|
963
845
|
}
|
|
964
846
|
}
|