rx-player 3.33.0 → 3.33.1
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 +13 -0
- package/VERSION +1 -1
- package/dist/_esm5.processed/core/api/public_api.js +2 -2
- package/dist/_esm5.processed/manifest/manifest.js +1 -0
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.d.ts +11 -0
- package/dist/_esm5.processed/utils/retry_promise_with_backoff.js +18 -4
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.d.ts +1 -1
- package/dist/rx-player.js +24 -9
- package/dist/rx-player.min.d.ts +1 -1
- package/dist/rx-player.min.js +1 -1
- package/package.json +6 -6
- package/.editorconfig +0 -22
- package/.eslintrc.js +0 -406
- package/.github/workflows/checks.yml +0 -101
- package/.github/workflows/perfs.yml +0 -22
- package/.github/workflows/sonarcloud_analysis.yml +0 -20
- package/CONTRIBUTING.md +0 -272
- package/FILES.md +0 -283
- package/jest.config.js +0 -73
- package/manifest.mpd +0 -149
- package/scripts/README.md +0 -11
- package/scripts/build/constants.d.ts +0 -53
- package/scripts/build/generate_build.js +0 -190
- package/scripts/build/templates/experimental/features/index.d.ts +0 -16
- package/scripts/build/templates/experimental/features/index.js +0 -16
- package/scripts/build/templates/experimental/index.d.ts +0 -16
- package/scripts/build/templates/experimental/index.js +0 -16
- package/scripts/build/templates/experimental/tools/VideoThumbnailLoader/index.d.ts +0 -18
- package/scripts/build/templates/experimental/tools/VideoThumbnailLoader/index.js +0 -18
- package/scripts/build/templates/experimental/tools/index.d.ts +0 -16
- package/scripts/build/templates/experimental/tools/index.js +0 -16
- package/scripts/build/templates/features/index.d.ts +0 -16
- package/scripts/build/templates/features/index.js +0 -16
- package/scripts/build/templates/logger/index.d.ts +0 -17
- package/scripts/build/templates/logger/index.js +0 -17
- package/scripts/build/templates/minimal/index.d.ts +0 -17
- package/scripts/build/templates/minimal/index.js +0 -17
- package/scripts/build/templates/tools/TextTrackRenderer.d.ts +0 -18
- package/scripts/build/templates/tools/TextTrackRenderer.js +0 -18
- package/scripts/build/templates/tools/index.d.ts +0 -16
- package/scripts/build/templates/tools/index.js +0 -16
- package/scripts/build/templates/tools/string-utils.d.ts +0 -18
- package/scripts/build/templates/tools/string-utils.js +0 -18
- package/scripts/build/templates/types/index.d.ts +0 -16
- package/scripts/build/templates/types/index.js +0 -15
- package/scripts/canal-release.patch +0 -316
- package/scripts/check_nodejs_import_compatibility.js +0 -60
- package/scripts/deploy_new_demo +0 -123
- package/scripts/fast_demo_build.js +0 -129
- package/scripts/generate_certificate +0 -19
- package/scripts/generate_demo_list.js +0 -105
- package/scripts/generate_documentation_list.js +0 -109
- package/scripts/generate_full_demo.js +0 -201
- package/scripts/generate_standalone_demo.js +0 -82
- package/scripts/launch_static_server.js +0 -163
- package/scripts/list-npm-scripts.js +0 -207
- package/scripts/make-dev-releases +0 -90
- package/scripts/report_build_sizes +0 -96
- package/scripts/run_standalone_demo.js +0 -27
- package/scripts/start_demo_web_server.js +0 -44
- package/scripts/update-version +0 -48
- package/scripts/update_gh-pages_demo +0 -132
- package/scripts/update_gh-pages_doc +0 -106
- package/scripts/utils/display_webpack_errors.js +0 -33
- package/scripts/utils/get_human_readable_hours.js +0 -14
- package/scripts/wasm-strip.js +0 -359
- package/sonar-project.properties +0 -7
- package/src/README.md +0 -136
- package/src/compat/README.md +0 -29
- package/src/compat/__tests__/add_text_track.test.ts +0 -176
- package/src/compat/__tests__/browser_compatibility_types.test.ts +0 -152
- package/src/compat/__tests__/browser_version.test.ts +0 -84
- package/src/compat/__tests__/can_patch_isobmff.test.ts +0 -50
- package/src/compat/__tests__/can_rely_on_video_visibility_and_size.test.ts +0 -78
- package/src/compat/__tests__/can_reuse_media_keys.test.ts +0 -31
- package/src/compat/__tests__/change_source_buffer_type.test.ts +0 -60
- package/src/compat/__tests__/clear_element_src.test.ts +0 -252
- package/src/compat/__tests__/enable_audio_track.test.ts +0 -341
- package/src/compat/__tests__/fullscreen.test.ts +0 -286
- package/src/compat/__tests__/is_codec_supported.test.ts +0 -78
- package/src/compat/__tests__/is_offline.test.ts +0 -65
- package/src/compat/__tests__/is_seeking_approximate.test.ts +0 -48
- package/src/compat/__tests__/is_vtt_cue.test.ts +0 -71
- package/src/compat/__tests__/make_vtt_cue.test.ts +0 -97
- package/src/compat/__tests__/patch_webkit_source_buffer.test.ts +0 -144
- package/src/compat/__tests__/remove_cue.test.ts +0 -229
- package/src/compat/__tests__/should_favour_custom_safari_EME.test.ts +0 -128
- package/src/compat/__tests__/should_reload_media_source_on_decipherability_update.test.ts +0 -50
- package/src/compat/__tests__/should_renew_media_key_system_access.test.ts +0 -55
- package/src/compat/__tests__/should_unset_media_keys.test.ts +0 -53
- package/src/compat/__tests__/should_validate_metadata.test.ts +0 -53
- package/src/compat/__tests__/should_wait_for_data_before_loaded.test.ts +0 -121
- package/src/compat/__tests__/should_wait_for_have_enough_data.test.ts +0 -36
- package/src/compat/add_class_name.ts +0 -41
- package/src/compat/add_text_track.ts +0 -58
- package/src/compat/browser_compatibility_types.ts +0 -222
- package/src/compat/browser_detection.ts +0 -172
- package/src/compat/browser_version.ts +0 -44
- package/src/compat/can_patch_isobmff.ts +0 -30
- package/src/compat/can_rely_on_video_visibility_and_size.ts +0 -52
- package/src/compat/can_reuse_media_keys.ts +0 -20
- package/src/compat/change_source_buffer_type.ts +0 -66
- package/src/compat/clear_element_src.ts +0 -55
- package/src/compat/eme/close_session.ts +0 -111
- package/src/compat/eme/constants.ts +0 -21
- package/src/compat/eme/custom_key_system_access.ts +0 -67
- package/src/compat/eme/custom_media_keys/ie11_media_keys.ts +0 -186
- package/src/compat/eme/custom_media_keys/index.ts +0 -28
- package/src/compat/eme/custom_media_keys/moz_media_keys_constructor.ts +0 -88
- package/src/compat/eme/custom_media_keys/ms_media_keys_constructor.ts +0 -69
- package/src/compat/eme/custom_media_keys/old_webkit_media_keys.ts +0 -235
- package/src/compat/eme/custom_media_keys/types.ts +0 -67
- package/src/compat/eme/custom_media_keys/webkit_media_keys.ts +0 -308
- package/src/compat/eme/custom_media_keys/webkit_media_keys_constructor.ts +0 -50
- package/src/compat/eme/eme-api-implementation.ts +0 -318
- package/src/compat/eme/generate_key_request.ts +0 -162
- package/src/compat/eme/get_init_data.ts +0 -159
- package/src/compat/eme/get_uuid_kid_from_keystatus_kid.ts +0 -37
- package/src/compat/eme/get_webkit_fairplay_initdata.ts +0 -75
- package/src/compat/eme/index.ts +0 -47
- package/src/compat/eme/load_session.ts +0 -67
- package/src/compat/enable_audio_track.ts +0 -33
- package/src/compat/event_listeners.ts +0 -566
- package/src/compat/fullscreen.ts +0 -87
- package/src/compat/get_start_date.ts +0 -48
- package/src/compat/has_issues_with_high_media_source_duration.ts +0 -27
- package/src/compat/index.ts +0 -87
- package/src/compat/is_codec_supported.ts +0 -40
- package/src/compat/is_debug_mode_enabled.ts +0 -12
- package/src/compat/is_node.ts +0 -18
- package/src/compat/is_offline.ts +0 -44
- package/src/compat/is_seeking_approximate.ts +0 -32
- package/src/compat/is_vtt_cue.ts +0 -30
- package/src/compat/make_vtt_cue.ts +0 -51
- package/src/compat/on_height_width_change.ts +0 -119
- package/src/compat/patch_webkit_source_buffer.ts +0 -89
- package/src/compat/remove_cue.ts +0 -64
- package/src/compat/should_favour_custom_safari_EME.ts +0 -34
- package/src/compat/should_prevent_seeking_at_0_initially.ts +0 -19
- package/src/compat/should_reload_media_source_on_decipherability_update.ts +0 -32
- package/src/compat/should_renew_media_key_system_access.ts +0 -26
- package/src/compat/should_unset_media_keys.ts +0 -27
- package/src/compat/should_validate_metadata.ts +0 -27
- package/src/compat/should_wait_for_data_before_loaded.ts +0 -35
- package/src/compat/should_wait_for_have_enough_data.ts +0 -17
- package/src/config.ts +0 -32
- package/src/core/README.md +0 -56
- package/src/core/adaptive/README.md +0 -147
- package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +0 -548
- package/src/core/adaptive/adaptive_representation_selector.ts +0 -916
- package/src/core/adaptive/buffer_based_chooser.ts +0 -264
- package/src/core/adaptive/guess_based_chooser.ts +0 -309
- package/src/core/adaptive/index.ts +0 -45
- package/src/core/adaptive/network_analyzer.ts +0 -419
- package/src/core/adaptive/utils/__tests__/bandwith_estimator.test.ts +0 -134
- package/src/core/adaptive/utils/__tests__/ewma.test.ts +0 -79
- package/src/core/adaptive/utils/__tests__/filter_by_bitrate.test.ts +0 -56
- package/src/core/adaptive/utils/__tests__/filter_by_width.test.ts +0 -60
- package/src/core/adaptive/utils/__tests__/get_buffer_levels.test.ts +0 -48
- package/src/core/adaptive/utils/__tests__/select_optimal_representation.test.ts +0 -243
- package/src/core/adaptive/utils/bandwidth_estimator.ts +0 -88
- package/src/core/adaptive/utils/ewma.ts +0 -59
- package/src/core/adaptive/utils/filter_by_bitrate.ts +0 -46
- package/src/core/adaptive/utils/filter_by_width.ts +0 -49
- package/src/core/adaptive/utils/get_buffer_levels.ts +0 -50
- package/src/core/adaptive/utils/last_estimate_storage.ts +0 -79
- package/src/core/adaptive/utils/pending_requests_store.ts +0 -147
- package/src/core/adaptive/utils/representation_score_calculator.ts +0 -168
- package/src/core/adaptive/utils/select_optimal_representation.ts +0 -54
- package/src/core/api/README.md +0 -36
- package/src/core/api/__tests__/option_utils.test.ts +0 -1668
- package/src/core/api/__tests__/public_api.test.ts +0 -857
- package/src/core/api/__tests__/utils.test.ts +0 -195
- package/src/core/api/debug/buffer_graph.ts +0 -244
- package/src/core/api/debug/buffer_size_graph.ts +0 -130
- package/src/core/api/debug/constants.ts +0 -2
- package/src/core/api/debug/index.ts +0 -3
- package/src/core/api/debug/modules/general_info.ts +0 -213
- package/src/core/api/debug/modules/segment_buffer_content.ts +0 -155
- package/src/core/api/debug/modules/segment_buffer_size.ts +0 -48
- package/src/core/api/debug/render.ts +0 -40
- package/src/core/api/debug/utils.ts +0 -103
- package/src/core/api/index.ts +0 -27
- package/src/core/api/option_utils.ts +0 -700
- package/src/core/api/playback_observer.ts +0 -994
- package/src/core/api/public_api.ts +0 -3247
- package/src/core/api/tracks_management/__tests__/media_element_track_choice_manager.test.ts +0 -184
- package/src/core/api/tracks_management/media_element_track_choice_manager.ts +0 -975
- package/src/core/api/tracks_management/track_choice_manager.ts +0 -1280
- package/src/core/api/utils.ts +0 -216
- package/src/core/decrypt/README.md +0 -22
- package/src/core/decrypt/__tests__/__global__/get_license.test.ts +0 -422
- package/src/core/decrypt/__tests__/__global__/init_data.test.ts +0 -677
- package/src/core/decrypt/__tests__/__global__/media_key_system_access.test.ts +0 -528
- package/src/core/decrypt/__tests__/__global__/media_keys.test.ts +0 -343
- package/src/core/decrypt/__tests__/__global__/server_certificate.test.ts +0 -264
- package/src/core/decrypt/__tests__/__global__/utils.ts +0 -491
- package/src/core/decrypt/attach_media_keys.ts +0 -121
- package/src/core/decrypt/clear_on_stop.ts +0 -47
- package/src/core/decrypt/content_decryptor.ts +0 -1246
- package/src/core/decrypt/create_or_load_session.ts +0 -133
- package/src/core/decrypt/create_session.ts +0 -214
- package/src/core/decrypt/dispose_decryption_resources.ts +0 -54
- package/src/core/decrypt/find_key_system.ts +0 -376
- package/src/core/decrypt/get_key_system_configuration.ts +0 -51
- package/src/core/decrypt/get_media_keys.ts +0 -147
- package/src/core/decrypt/index.ts +0 -36
- package/src/core/decrypt/init_media_keys.ts +0 -60
- package/src/core/decrypt/session_events_listener.ts +0 -386
- package/src/core/decrypt/set_server_certificate.ts +0 -105
- package/src/core/decrypt/types.ts +0 -404
- package/src/core/decrypt/utils/__tests__/are_init_values_compatible.test.ts +0 -261
- package/src/core/decrypt/utils/__tests__/clean_old_loaded_sessions.test.ts +0 -158
- package/src/core/decrypt/utils/__tests__/clean_old_stored_persistent_info.test.ts +0 -133
- package/src/core/decrypt/utils/are_init_values_compatible.ts +0 -140
- package/src/core/decrypt/utils/check_key_statuses.ts +0 -193
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +0 -45
- package/src/core/decrypt/utils/clean_old_stored_persistent_info.ts +0 -48
- package/src/core/decrypt/utils/get_drm_system_id.ts +0 -42
- package/src/core/decrypt/utils/init_data_values_container.ts +0 -119
- package/src/core/decrypt/utils/is_session_usable.ts +0 -62
- package/src/core/decrypt/utils/key_id_comparison.ts +0 -57
- package/src/core/decrypt/utils/key_session_record.ts +0 -174
- package/src/core/decrypt/utils/loaded_sessions_store.ts +0 -505
- package/src/core/decrypt/utils/media_keys_infos_store.ts +0 -85
- package/src/core/decrypt/utils/persistent_sessions_store.ts +0 -358
- package/src/core/decrypt/utils/serializable_bytes.ts +0 -59
- package/src/core/decrypt/utils/server_certificate_store.ts +0 -133
- package/src/core/fetchers/README.md +0 -84
- package/src/core/fetchers/cdn_prioritizer.ts +0 -207
- package/src/core/fetchers/index.ts +0 -38
- package/src/core/fetchers/manifest/index.ts +0 -28
- package/src/core/fetchers/manifest/manifest_fetcher.ts +0 -798
- package/src/core/fetchers/segment/__tests__/task_prioritizer.test.ts +0 -763
- package/src/core/fetchers/segment/index.ts +0 -28
- package/src/core/fetchers/segment/prioritized_segment_fetcher.ts +0 -113
- package/src/core/fetchers/segment/segment_fetcher.ts +0 -482
- package/src/core/fetchers/segment/segment_fetcher_creator.ts +0 -129
- package/src/core/fetchers/segment/task_prioritizer.ts +0 -455
- package/src/core/fetchers/utils/error_selector.ts +0 -38
- package/src/core/fetchers/utils/schedule_request.ts +0 -493
- package/src/core/init/README.md +0 -81
- package/src/core/init/directfile_content_initializer.ts +0 -310
- package/src/core/init/index.ts +0 -22
- package/src/core/init/media_source_content_initializer.ts +0 -878
- package/src/core/init/types.ts +0 -266
- package/src/core/init/utils/__tests__/are_same_stream_events.test.ts +0 -84
- package/src/core/init/utils/__tests__/refresh_scheduled_events_list.test.ts +0 -94
- package/src/core/init/utils/content_time_boundaries_observer.ts +0 -646
- package/src/core/init/utils/create_media_source.ts +0 -139
- package/src/core/init/utils/create_stream_playback_observer.ts +0 -132
- package/src/core/init/utils/end_of_stream.ts +0 -108
- package/src/core/init/utils/get_initial_time.ts +0 -165
- package/src/core/init/utils/get_loaded_reference.ts +0 -82
- package/src/core/init/utils/initial_seek_and_play.ts +0 -237
- package/src/core/init/utils/initialize_content_decryption.ts +0 -172
- package/src/core/init/utils/media_source_duration_updater.ts +0 -349
- package/src/core/init/utils/rebuffering_controller.ts +0 -642
- package/src/core/init/utils/stream_events_emitter/are_same_stream_events.ts +0 -42
- package/src/core/init/utils/stream_events_emitter/index.ts +0 -22
- package/src/core/init/utils/stream_events_emitter/refresh_scheduled_events_list.ts +0 -74
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +0 -252
- package/src/core/init/utils/stream_events_emitter/types.ts +0 -46
- package/src/core/init/utils/throw_on_media_error.ts +0 -74
- package/src/core/segment_buffers/README.md +0 -219
- package/src/core/segment_buffers/garbage_collector.ts +0 -177
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +0 -650
- package/src/core/segment_buffers/implementations/audio_video/index.ts +0 -18
- package/src/core/segment_buffers/implementations/image/image_segment_buffer.ts +0 -152
- package/src/core/segment_buffers/implementations/image/index.ts +0 -18
- package/src/core/segment_buffers/implementations/index.ts +0 -20
- package/src/core/segment_buffers/implementations/text/html/__tests__/utils.test.ts +0 -343
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +0 -527
- package/src/core/segment_buffers/implementations/text/html/index.ts +0 -24
- package/src/core/segment_buffers/implementations/text/html/parsers.ts +0 -49
- package/src/core/segment_buffers/implementations/text/html/text_track_cues_store.ts +0 -391
- package/src/core/segment_buffers/implementations/text/html/types.ts +0 -23
- package/src/core/segment_buffers/implementations/text/html/update_proportional_elements.ts +0 -93
- package/src/core/segment_buffers/implementations/text/html/utils.ts +0 -139
- package/src/core/segment_buffers/implementations/text/native/index.ts +0 -19
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +0 -340
- package/src/core/segment_buffers/implementations/text/native/parsers.ts +0 -47
- package/src/core/segment_buffers/implementations/types.ts +0 -386
- package/src/core/segment_buffers/implementations/utils/manual_time_ranges.ts +0 -80
- package/src/core/segment_buffers/index.ts +0 -67
- package/src/core/segment_buffers/inventory/buffered_history.ts +0 -131
- package/src/core/segment_buffers/inventory/index.ts +0 -30
- package/src/core/segment_buffers/inventory/segment_inventory.ts +0 -1111
- package/src/core/segment_buffers/inventory/types.ts +0 -35
- package/src/core/segment_buffers/segment_buffers_store.ts +0 -383
- package/src/core/stream/README.md +0 -59
- package/src/core/stream/adaptation/adaptation_stream.ts +0 -378
- package/src/core/stream/adaptation/index.ts +0 -20
- package/src/core/stream/adaptation/types.ts +0 -199
- package/src/core/stream/adaptation/utils/create_representation_estimator.ts +0 -114
- package/src/core/stream/index.ts +0 -38
- package/src/core/stream/orchestrator/README.md +0 -349
- package/src/core/stream/orchestrator/get_time_ranges_for_content.ts +0 -70
- package/src/core/stream/orchestrator/index.ts +0 -30
- package/src/core/stream/orchestrator/stream_orchestrator.ts +0 -664
- package/src/core/stream/period/index.ts +0 -20
- package/src/core/stream/period/period_stream.ts +0 -469
- package/src/core/stream/period/types.ts +0 -132
- package/src/core/stream/period/utils/get_adaptation_switch_strategy.ts +0 -287
- package/src/core/stream/representation/README.md +0 -16
- package/src/core/stream/representation/index.ts +0 -20
- package/src/core/stream/representation/representation_stream.ts +0 -474
- package/src/core/stream/representation/types.ts +0 -292
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +0 -77
- package/src/core/stream/representation/utils/check_for_discontinuity.ts +0 -305
- package/src/core/stream/representation/utils/downloading_queue.ts +0 -603
- package/src/core/stream/representation/utils/force_garbage_collection.ts +0 -113
- package/src/core/stream/representation/utils/get_buffer_status.ts +0 -322
- package/src/core/stream/representation/utils/get_needed_segments.ts +0 -617
- package/src/core/stream/representation/utils/get_segment_priority.ts +0 -43
- package/src/core/stream/representation/utils/push_init_segment.ts +0 -85
- package/src/core/stream/representation/utils/push_media_segment.ts +0 -113
- package/src/default_config.ts +0 -1293
- package/src/errors/README.md +0 -6
- package/src/errors/__tests__/assertion_error.test.ts +0 -26
- package/src/errors/__tests__/encrypted_media_error.test.ts +0 -45
- package/src/errors/__tests__/error_message.test.ts +0 -23
- package/src/errors/__tests__/format_error.test.ts +0 -62
- package/src/errors/__tests__/is_known_error.test.ts +0 -65
- package/src/errors/__tests__/media_error.test.ts +0 -55
- package/src/errors/__tests__/network_error.test.ts +0 -84
- package/src/errors/__tests__/other_error.test.ts +0 -53
- package/src/errors/__tests__/request_error.test.ts +0 -45
- package/src/errors/assertion_error.ts +0 -40
- package/src/errors/custom_loader_error.ts +0 -57
- package/src/errors/encrypted_media_error.ts +0 -71
- package/src/errors/error_codes.ts +0 -149
- package/src/errors/error_message.ts +0 -30
- package/src/errors/format_error.ts +0 -39
- package/src/errors/index.ts +0 -52
- package/src/errors/is_known_error.ts +0 -35
- package/src/errors/media_error.ts +0 -118
- package/src/errors/network_error.ts +0 -74
- package/src/errors/other_error.ts +0 -50
- package/src/errors/request_error.ts +0 -76
- package/src/experimental/README.md +0 -16
- package/src/experimental/features/__tests__/dash_wasm.test.ts +0 -44
- package/src/experimental/features/__tests__/debug_element.test.ts +0 -12
- package/src/experimental/features/__tests__/index.test.ts +0 -19
- package/src/experimental/features/__tests__/local.test.ts +0 -35
- package/src/experimental/features/__tests__/metaplaylist.test.ts +0 -35
- package/src/experimental/features/dash_wasm.ts +0 -41
- package/src/experimental/features/debug_element.ts +0 -13
- package/src/experimental/features/index.ts +0 -20
- package/src/experimental/features/local.ts +0 -28
- package/src/experimental/features/metaplaylist.ts +0 -28
- package/src/experimental/index.ts +0 -5
- package/src/experimental/tools/VideoThumbnailLoader/features/dash.ts +0 -23
- package/src/experimental/tools/VideoThumbnailLoader/features/metaplaylist.ts +0 -23
- package/src/experimental/tools/VideoThumbnailLoader/index.ts +0 -25
- package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +0 -77
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +0 -75
- package/src/experimental/tools/VideoThumbnailLoader/remove_buffer_around_time.ts +0 -54
- package/src/experimental/tools/VideoThumbnailLoader/types.ts +0 -39
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +0 -423
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader_error.ts +0 -34
- package/src/experimental/tools/createMetaplaylist/get_duration_from_manifest.ts +0 -141
- package/src/experimental/tools/createMetaplaylist/index.ts +0 -72
- package/src/experimental/tools/index.ts +0 -27
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/capabilities.test.ts +0 -37
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/DRMInfos.test.ts +0 -140
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/HDCPPolicy.test.ts +0 -153
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/decodingInfos.test.ts +0 -405
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/defaultCodecFinder.test.ts +0 -136
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaContentType.test.ts +0 -294
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/probers/mediaDisplayInfos.test.ts +0 -189
- package/src/experimental/tools/mediaCapabilitiesProber/__tests__/utils.test.ts +0 -361
- package/src/experimental/tools/mediaCapabilitiesProber/api/index.ts +0 -184
- package/src/experimental/tools/mediaCapabilitiesProber/api/probeMediaConfiguration.ts +0 -136
- package/src/experimental/tools/mediaCapabilitiesProber/capabilities.ts +0 -169
- package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -18
- package/src/experimental/tools/mediaCapabilitiesProber/log.ts +0 -21
- package/src/experimental/tools/mediaCapabilitiesProber/probers/DRMInfos.ts +0 -67
- package/src/experimental/tools/mediaCapabilitiesProber/probers/HDCPPolicy.ts +0 -89
- package/src/experimental/tools/mediaCapabilitiesProber/probers/decodingInfo.ts +0 -100
- package/src/experimental/tools/mediaCapabilitiesProber/probers/defaultCodecsFinder.ts +0 -66
- package/src/experimental/tools/mediaCapabilitiesProber/probers/index.ts +0 -44
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentType.ts +0 -66
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/format.ts +0 -100
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaContentTypeWithFeatures/index.ts +0 -105
- package/src/experimental/tools/mediaCapabilitiesProber/probers/mediaDisplayInfos.ts +0 -54
- package/src/experimental/tools/mediaCapabilitiesProber/types.ts +0 -75
- package/src/experimental/tools/mediaCapabilitiesProber/utils.ts +0 -107
- package/src/experimental/tools/parseBIFThumbnails.ts +0 -39
- package/src/features/README.md +0 -11
- package/src/features/__tests__/add_features.test.ts +0 -69
- package/src/features/__tests__/initialize_features.test.ts +0 -674
- package/src/features/add_features.ts +0 -37
- package/src/features/features_object.ts +0 -37
- package/src/features/index.ts +0 -40
- package/src/features/initialize_features.ts +0 -136
- package/src/features/list/__tests__/bif_parser.test.ts +0 -30
- package/src/features/list/__tests__/dash.test.ts +0 -41
- package/src/features/list/__tests__/directfile.test.ts +0 -35
- package/src/features/list/__tests__/eme.test.ts +0 -28
- package/src/features/list/__tests__/html_sami_parser.test.ts +0 -33
- package/src/features/list/__tests__/html_srt_parser.test.ts +0 -33
- package/src/features/list/__tests__/html_text_buffer.test.ts +0 -29
- package/src/features/list/__tests__/html_ttml_parser.test.ts +0 -33
- package/src/features/list/__tests__/html_vtt_parser.test.ts +0 -33
- package/src/features/list/__tests__/image_buffer.test.ts +0 -28
- package/src/features/list/__tests__/index.test.ts +0 -55
- package/src/features/list/__tests__/native_sami_parser.test.ts +0 -33
- package/src/features/list/__tests__/native_srt_parser.test.ts +0 -33
- package/src/features/list/__tests__/native_text_buffer.test.ts +0 -29
- package/src/features/list/__tests__/native_ttml_parser.test.ts +0 -33
- package/src/features/list/__tests__/native_vtt_parser.test.ts +0 -33
- package/src/features/list/__tests__/smooth.test.ts +0 -36
- package/src/features/list/bif_parser.ts +0 -31
- package/src/features/list/dash.ts +0 -36
- package/src/features/list/directfile.ts +0 -35
- package/src/features/list/eme.ts +0 -29
- package/src/features/list/html_sami_parser.ts +0 -31
- package/src/features/list/html_srt_parser.ts +0 -31
- package/src/features/list/html_text_buffer.ts +0 -29
- package/src/features/list/html_ttml_parser.ts +0 -31
- package/src/features/list/html_vtt_parser.ts +0 -31
- package/src/features/list/image_buffer.ts +0 -29
- package/src/features/list/index.ts +0 -32
- package/src/features/list/native_sami_parser.ts +0 -32
- package/src/features/list/native_srt_parser.ts +0 -32
- package/src/features/list/native_text_buffer.ts +0 -30
- package/src/features/list/native_ttml_parser.ts +0 -32
- package/src/features/list/native_vtt_parser.ts +0 -32
- package/src/features/list/smooth.ts +0 -32
- package/src/features/types.ts +0 -183
- package/src/index.ts +0 -38
- package/src/log.ts +0 -22
- package/src/manifest/README.md +0 -55
- package/src/manifest/__tests__/adaptation.test.ts +0 -485
- package/src/manifest/__tests__/manifest.test.ts +0 -428
- package/src/manifest/__tests__/period.test.ts +0 -769
- package/src/manifest/__tests__/representation.test.ts +0 -297
- package/src/manifest/__tests__/update_period_in_place.test.ts +0 -1074
- package/src/manifest/__tests__/update_periods.test.ts +0 -845
- package/src/manifest/adaptation.ts +0 -294
- package/src/manifest/index.ts +0 -67
- package/src/manifest/manifest.ts +0 -811
- package/src/manifest/period.ts +0 -211
- package/src/manifest/representation.ts +0 -451
- package/src/manifest/representation_index/__tests__/static.test.ts +0 -74
- package/src/manifest/representation_index/index.ts +0 -31
- package/src/manifest/representation_index/static.ts +0 -158
- package/src/manifest/representation_index/types.ts +0 -433
- package/src/manifest/types.ts +0 -33
- package/src/manifest/update_period_in_place.ts +0 -142
- package/src/manifest/update_periods.ts +0 -201
- package/src/manifest/utils.ts +0 -60
- package/src/minimal.ts +0 -34
- package/src/parsers/README.md +0 -12
- package/src/parsers/containers/isobmff/constants.ts +0 -24
- package/src/parsers/containers/isobmff/create_box.ts +0 -81
- package/src/parsers/containers/isobmff/drm/index.ts +0 -17
- package/src/parsers/containers/isobmff/drm/playready.ts +0 -45
- package/src/parsers/containers/isobmff/get_box.ts +0 -278
- package/src/parsers/containers/isobmff/index.ts +0 -51
- package/src/parsers/containers/isobmff/read.ts +0 -105
- package/src/parsers/containers/isobmff/take_pssh_out.ts +0 -101
- package/src/parsers/containers/isobmff/utils.ts +0 -555
- package/src/parsers/containers/matroska/index.ts +0 -21
- package/src/parsers/containers/matroska/utils.ts +0 -313
- package/src/parsers/images/bif.ts +0 -128
- package/src/parsers/manifest/dash/common/__tests__/attach_trickmode_track.test.ts +0 -65
- package/src/parsers/manifest/dash/common/__tests__/convert_supplemental_codecs.test.ts +0 -37
- package/src/parsers/manifest/dash/common/__tests__/flatten_overlapping_period.test.ts +0 -162
- package/src/parsers/manifest/dash/common/__tests__/get_clock_offset.test.ts +0 -65
- package/src/parsers/manifest/dash/common/__tests__/get_http_utc-timing_url.test.ts +0 -165
- package/src/parsers/manifest/dash/common/__tests__/get_periods_time_infos.test.ts +0 -118
- package/src/parsers/manifest/dash/common/__tests__/manifest_bounds_calculator.test.ts +0 -290
- package/src/parsers/manifest/dash/common/__tests__/parse_availability_start_time.test.ts +0 -63
- package/src/parsers/manifest/dash/common/attach_trickmode_track.ts +0 -55
- package/src/parsers/manifest/dash/common/convert_supplemental_codecs.ts +0 -32
- package/src/parsers/manifest/dash/common/flatten_overlapping_periods.ts +0 -87
- package/src/parsers/manifest/dash/common/get_clock_offset.ts +0 -41
- package/src/parsers/manifest/dash/common/get_hdr_information.ts +0 -94
- package/src/parsers/manifest/dash/common/get_http_utc-timing_url.ts +0 -46
- package/src/parsers/manifest/dash/common/get_minimum_and_maximum_positions.ts +0 -39
- package/src/parsers/manifest/dash/common/get_periods_time_infos.ts +0 -91
- package/src/parsers/manifest/dash/common/index.ts +0 -40
- package/src/parsers/manifest/dash/common/indexes/__tests__/tokens.test.ts +0 -60
- package/src/parsers/manifest/dash/common/indexes/base.ts +0 -444
- package/src/parsers/manifest/dash/common/indexes/get_init_segment.ts +0 -55
- package/src/parsers/manifest/dash/common/indexes/get_segments_from_timeline.ts +0 -148
- package/src/parsers/manifest/dash/common/indexes/index.ts +0 -39
- package/src/parsers/manifest/dash/common/indexes/list.ts +0 -338
- package/src/parsers/manifest/dash/common/indexes/template.ts +0 -652
- package/src/parsers/manifest/dash/common/indexes/timeline/__tests__/parse_s_element.test.ts +0 -115
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_elements.ts +0 -54
- package/src/parsers/manifest/dash/common/indexes/timeline/construct_timeline_from_previous_timeline.ts +0 -102
- package/src/parsers/manifest/dash/common/indexes/timeline/convert_element_to_index_segment.ts +0 -66
- package/src/parsers/manifest/dash/common/indexes/timeline/find_first_common_start_time.ts +0 -153
- package/src/parsers/manifest/dash/common/indexes/timeline/index.ts +0 -21
- package/src/parsers/manifest/dash/common/indexes/timeline/parse_s_element.ts +0 -72
- package/src/parsers/manifest/dash/common/indexes/timeline/timeline_representation_index.ts +0 -1049
- package/src/parsers/manifest/dash/common/indexes/tokens.ts +0 -127
- package/src/parsers/manifest/dash/common/indexes/utils.ts +0 -32
- package/src/parsers/manifest/dash/common/infer_adaptation_type.ts +0 -142
- package/src/parsers/manifest/dash/common/manifest_bounds_calculator.ts +0 -165
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +0 -569
- package/src/parsers/manifest/dash/common/parse_availability_start_time.ts +0 -35
- package/src/parsers/manifest/dash/common/parse_mpd.ts +0 -399
- package/src/parsers/manifest/dash/common/parse_periods.ts +0 -363
- package/src/parsers/manifest/dash/common/parse_representation_index.ts +0 -199
- package/src/parsers/manifest/dash/common/parse_representations.ts +0 -352
- package/src/parsers/manifest/dash/common/resolve_base_urls.ts +0 -58
- package/src/parsers/manifest/dash/index.ts +0 -22
- package/src/parsers/manifest/dash/js-parser/__tests__/parse_from_document.test.ts +0 -45
- package/src/parsers/manifest/dash/js-parser/index.ts +0 -18
- package/src/parsers/manifest/dash/js-parser/node_parsers/AdaptationSet.ts +0 -381
- package/src/parsers/manifest/dash/js-parser/node_parsers/BaseURL.ts +0 -35
- package/src/parsers/manifest/dash/js-parser/node_parsers/ContentComponent.ts +0 -49
- package/src/parsers/manifest/dash/js-parser/node_parsers/ContentProtection.ts +0 -94
- package/src/parsers/manifest/dash/js-parser/node_parsers/EventStream.ts +0 -117
- package/src/parsers/manifest/dash/js-parser/node_parsers/Initialization.ts +0 -48
- package/src/parsers/manifest/dash/js-parser/node_parsers/MPD.ts +0 -180
- package/src/parsers/manifest/dash/js-parser/node_parsers/Period.ts +0 -152
- package/src/parsers/manifest/dash/js-parser/node_parsers/Representation.ts +0 -234
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentBase.ts +0 -112
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentList.ts +0 -50
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTemplate.ts +0 -98
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentTimeline.ts +0 -35
- package/src/parsers/manifest/dash/js-parser/node_parsers/SegmentURL.ts +0 -63
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/AdaptationSet.test.ts +0 -407
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/ContentComponent.test.ts +0 -67
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/ContentProtection.test.ts +0 -223
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/Initialization.test.ts +0 -139
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/SegmentTimeline.test.ts +0 -119
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/SegmentURL.test.ts +0 -205
- package/src/parsers/manifest/dash/js-parser/node_parsers/__tests__/utils.test.ts +0 -218
- package/src/parsers/manifest/dash/js-parser/node_parsers/utils.ts +0 -384
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +0 -129
- package/src/parsers/manifest/dash/node_parser_types.ts +0 -431
- package/src/parsers/manifest/dash/parsers_types.ts +0 -91
- package/src/parsers/manifest/dash/wasm-parser/Cargo.lock +0 -25
- package/src/parsers/manifest/dash/wasm-parser/Cargo.toml +0 -16
- package/src/parsers/manifest/dash/wasm-parser/README.md +0 -267
- package/src/parsers/manifest/dash/wasm-parser/index.ts +0 -21
- package/src/parsers/manifest/dash/wasm-parser/rs/errors.rs +0 -28
- package/src/parsers/manifest/dash/wasm-parser/rs/events.rs +0 -373
- package/src/parsers/manifest/dash/wasm-parser/rs/lib.rs +0 -85
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/attributes.rs +0 -414
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/mod.rs +0 -472
- package/src/parsers/manifest/dash/wasm-parser/rs/processor/s_element.rs +0 -72
- package/src/parsers/manifest/dash/wasm-parser/rs/reader.rs +0 -17
- package/src/parsers/manifest/dash/wasm-parser/rs/reportable.rs +0 -147
- package/src/parsers/manifest/dash/wasm-parser/rs/utils.rs +0 -217
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +0 -477
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/AdaptationSet.ts +0 -343
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/BaseURL.ts +0 -38
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/ContentComponent.ts +0 -53
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/ContentProtection.ts +0 -62
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/EventStream.ts +0 -144
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/MPD.ts +0 -183
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Period.ts +0 -180
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Representation.ts +0 -215
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/Scheme.ts +0 -44
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentBase.ts +0 -115
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentList.ts +0 -61
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentTemplate.ts +0 -133
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/SegmentUrl.ts +0 -70
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/XLink.ts +0 -66
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/index.ts +0 -17
- package/src/parsers/manifest/dash/wasm-parser/ts/generators/root.ts +0 -66
- package/src/parsers/manifest/dash/wasm-parser/ts/parsers_stack.ts +0 -80
- package/src/parsers/manifest/dash/wasm-parser/ts/types.ts +0 -298
- package/src/parsers/manifest/dash/wasm-parser/ts/utils.ts +0 -47
- package/src/parsers/manifest/index.ts +0 -17
- package/src/parsers/manifest/local/index.ts +0 -25
- package/src/parsers/manifest/local/parse_local_manifest.ts +0 -164
- package/src/parsers/manifest/local/representation_index.ts +0 -246
- package/src/parsers/manifest/local/types.ts +0 -291
- package/src/parsers/manifest/metaplaylist/index.ts +0 -28
- package/src/parsers/manifest/metaplaylist/metaplaylist_parser.ts +0 -335
- package/src/parsers/manifest/metaplaylist/representation_index.ts +0 -251
- package/src/parsers/manifest/smooth/create_parser.ts +0 -699
- package/src/parsers/manifest/smooth/get_codecs.ts +0 -55
- package/src/parsers/manifest/smooth/index.ts +0 -26
- package/src/parsers/manifest/smooth/parse_C_nodes.ts +0 -69
- package/src/parsers/manifest/smooth/parse_protection_node.ts +0 -72
- package/src/parsers/manifest/smooth/representation_index.ts +0 -704
- package/src/parsers/manifest/smooth/utils/add_segment_infos.ts +0 -77
- package/src/parsers/manifest/smooth/utils/parseBoolean.ts +0 -31
- package/src/parsers/manifest/smooth/utils/reduceChildren.ts +0 -36
- package/src/parsers/manifest/smooth/utils/tokens.ts +0 -46
- package/src/parsers/manifest/types.ts +0 -395
- package/src/parsers/manifest/utils/__tests__/get_first_time_from_adaptations.test.ts +0 -161
- package/src/parsers/manifest/utils/__tests__/get_last_time_from_adaptation.test.ts +0 -161
- package/src/parsers/manifest/utils/__tests__/index_helpers.test.ts +0 -55
- package/src/parsers/manifest/utils/__tests__/update_segment_timeline.test.ts +0 -546
- package/src/parsers/manifest/utils/check_manifest_ids.ts +0 -83
- package/src/parsers/manifest/utils/clear_timeline_from_position.ts +0 -74
- package/src/parsers/manifest/utils/get_first_time_from_adaptation.ts +0 -48
- package/src/parsers/manifest/utils/get_last_time_from_adaptation.ts +0 -50
- package/src/parsers/manifest/utils/get_maximum_positions.ts +0 -87
- package/src/parsers/manifest/utils/get_minimum_position.ts +0 -80
- package/src/parsers/manifest/utils/index_helpers.ts +0 -204
- package/src/parsers/manifest/utils/update_segment_timeline.ts +0 -141
- package/src/parsers/texttracks/index.ts +0 -21
- package/src/parsers/texttracks/sami/html.ts +0 -219
- package/src/parsers/texttracks/sami/native.ts +0 -192
- package/src/parsers/texttracks/srt/__tests__/find_end_of_cue_block.test.ts +0 -99
- package/src/parsers/texttracks/srt/__tests__/get_cue_blocks.test.ts +0 -119
- package/src/parsers/texttracks/srt/__tests__/parse_cue.test.ts +0 -123
- package/src/parsers/texttracks/srt/__tests__/parse_timestamp.test.ts +0 -36
- package/src/parsers/texttracks/srt/find_end_of_cue_block.ts +0 -46
- package/src/parsers/texttracks/srt/get_cue_blocks.ts +0 -49
- package/src/parsers/texttracks/srt/html.ts +0 -182
- package/src/parsers/texttracks/srt/native.ts +0 -74
- package/src/parsers/texttracks/srt/parse_cue.ts +0 -76
- package/src/parsers/texttracks/srt/parse_timestamp.ts +0 -37
- package/src/parsers/texttracks/ttml/__tests__/resolve_styles_inheritance.test.ts +0 -248
- package/src/parsers/texttracks/ttml/get_parameters.ts +0 -106
- package/src/parsers/texttracks/ttml/get_styling.ts +0 -146
- package/src/parsers/texttracks/ttml/get_time_delimiters.ts +0 -49
- package/src/parsers/texttracks/ttml/html/__tests__/__global__/html_ttml_parser.test.test.ts +0 -190
- package/src/parsers/texttracks/ttml/html/__tests__/generate_css_test_outline.test.ts +0 -32
- package/src/parsers/texttracks/ttml/html/__tests__/ttml_color_to_css_color.test.ts +0 -62
- package/src/parsers/texttracks/ttml/html/apply_default_ttml_paragraph_style.ts +0 -67
- package/src/parsers/texttracks/ttml/html/apply_extent.ts +0 -65
- package/src/parsers/texttracks/ttml/html/apply_font_size.ts +0 -62
- package/src/parsers/texttracks/ttml/html/apply_line_height.ts +0 -50
- package/src/parsers/texttracks/ttml/html/apply_origin.ts +0 -64
- package/src/parsers/texttracks/ttml/html/apply_padding.ts +0 -141
- package/src/parsers/texttracks/ttml/html/create_element.ts +0 -549
- package/src/parsers/texttracks/ttml/html/generate_css_test_outline.ts +0 -46
- package/src/parsers/texttracks/ttml/html/index.ts +0 -23
- package/src/parsers/texttracks/ttml/html/parse_cue.ts +0 -65
- package/src/parsers/texttracks/ttml/html/parse_ttml_to_div.ts +0 -58
- package/src/parsers/texttracks/ttml/html/ttml_color_to_css_color.ts +0 -68
- package/src/parsers/texttracks/ttml/native/index.ts +0 -23
- package/src/parsers/texttracks/ttml/native/parse_cue.ts +0 -245
- package/src/parsers/texttracks/ttml/native/parse_ttml_to_vtt.ts +0 -39
- package/src/parsers/texttracks/ttml/parse_ttml.ts +0 -206
- package/src/parsers/texttracks/ttml/regexps.ts +0 -65
- package/src/parsers/texttracks/ttml/resolve_styles_inheritance.ts +0 -84
- package/src/parsers/texttracks/ttml/time_parsing.ts +0 -156
- package/src/parsers/texttracks/ttml/xml_utils.ts +0 -166
- package/src/parsers/texttracks/types.ts +0 -34
- package/src/parsers/texttracks/webvtt/__tests__/get_cue_blocks.test.ts +0 -218
- package/src/parsers/texttracks/webvtt/__tests__/get_style_blocks.test.ts +0 -65
- package/src/parsers/texttracks/webvtt/__tests__/parse_cue_block.test.ts +0 -249
- package/src/parsers/texttracks/webvtt/__tests__/parse_timestamp.test.ts +0 -39
- package/src/parsers/texttracks/webvtt/__tests__/utils.test.ts +0 -401
- package/src/parsers/texttracks/webvtt/get_cue_blocks.ts +0 -51
- package/src/parsers/texttracks/webvtt/get_style_blocks.ts +0 -56
- package/src/parsers/texttracks/webvtt/html/__tests__/convert_payload_to_html.test.ts +0 -106
- package/src/parsers/texttracks/webvtt/html/__tests__/create_default_style_elements.test.ts +0 -44
- package/src/parsers/texttracks/webvtt/html/__tests__/create_style_attribute.test.ts +0 -139
- package/src/parsers/texttracks/webvtt/html/__tests__/create_styled_element.test.ts +0 -140
- package/src/parsers/texttracks/webvtt/html/__tests__/parse_style_block.test.ts +0 -345
- package/src/parsers/texttracks/webvtt/html/__tests__/parse_webvtt_to_div.test.ts +0 -181
- package/src/parsers/texttracks/webvtt/html/__tests__/to_html.test.ts +0 -234
- package/src/parsers/texttracks/webvtt/html/convert_payload_to_html.ts +0 -46
- package/src/parsers/texttracks/webvtt/html/create_default_style_elements.ts +0 -26
- package/src/parsers/texttracks/webvtt/html/create_style_attribute.ts +0 -222
- package/src/parsers/texttracks/webvtt/html/create_styled_element.ts +0 -95
- package/src/parsers/texttracks/webvtt/html/index.ts +0 -25
- package/src/parsers/texttracks/webvtt/html/parse_style_block.ts +0 -76
- package/src/parsers/texttracks/webvtt/html/parse_webvtt_to_div.ts +0 -67
- package/src/parsers/texttracks/webvtt/html/to_html.ts +0 -96
- package/src/parsers/texttracks/webvtt/native/index.ts +0 -23
- package/src/parsers/texttracks/webvtt/native/parse_vtt_to_cues.ts +0 -70
- package/src/parsers/texttracks/webvtt/native/set_settings_on_cue.ts +0 -95
- package/src/parsers/texttracks/webvtt/native/to_native_cue.ts +0 -34
- package/src/parsers/texttracks/webvtt/parse_cue_block.ts +0 -128
- package/src/parsers/texttracks/webvtt/parse_timestamp.ts +0 -40
- package/src/parsers/texttracks/webvtt/utils.ts +0 -135
- package/src/public_types.ts +0 -846
- package/src/tools/README.md +0 -4
- package/src/tools/TextTrackRenderer/index.ts +0 -28
- package/src/tools/TextTrackRenderer/text_track_renderer.ts +0 -107
- package/src/tools/index.ts +0 -20
- package/src/tools/string_utils.ts +0 -24
- package/src/transports/README.md +0 -276
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +0 -98
- package/src/transports/dash/construct_segment_url.ts +0 -28
- package/src/transports/dash/extract_complete_chunks.ts +0 -66
- package/src/transports/dash/get_events_out_of_emsgs.ts +0 -105
- package/src/transports/dash/image_pipelines.ts +0 -122
- package/src/transports/dash/index.ts +0 -23
- package/src/transports/dash/init_segment_loader.ts +0 -114
- package/src/transports/dash/low_latency_segment_loader.ts +0 -87
- package/src/transports/dash/manifest_parser.ts +0 -325
- package/src/transports/dash/pipelines.ts +0 -72
- package/src/transports/dash/segment_loader.ts +0 -249
- package/src/transports/dash/segment_parser.ts +0 -194
- package/src/transports/dash/text_loader.ts +0 -120
- package/src/transports/dash/text_parser.ts +0 -234
- package/src/transports/index.ts +0 -17
- package/src/transports/local/index.ts +0 -18
- package/src/transports/local/pipelines.ts +0 -100
- package/src/transports/local/segment_loader.ts +0 -198
- package/src/transports/local/segment_parser.ts +0 -101
- package/src/transports/local/text_parser.ts +0 -185
- package/src/transports/metaplaylist/README.md +0 -94
- package/src/transports/metaplaylist/index.ts +0 -23
- package/src/transports/metaplaylist/manifest_loader.ts +0 -62
- package/src/transports/metaplaylist/pipelines.ts +0 -425
- package/src/transports/smooth/extract_timings_infos.ts +0 -142
- package/src/transports/smooth/index.ts +0 -23
- package/src/transports/smooth/isobmff/__tests__/create_boxes.test.ts +0 -231
- package/src/transports/smooth/isobmff/create_audio_init_segment.ts +0 -84
- package/src/transports/smooth/isobmff/create_boxes.ts +0 -481
- package/src/transports/smooth/isobmff/create_init_segment.ts +0 -100
- package/src/transports/smooth/isobmff/create_traf_box.ts +0 -40
- package/src/transports/smooth/isobmff/create_video_init_segment.ts +0 -78
- package/src/transports/smooth/isobmff/get_aaces_header.ts +0 -62
- package/src/transports/smooth/isobmff/index.ts +0 -32
- package/src/transports/smooth/isobmff/parse_tfrf.ts +0 -57
- package/src/transports/smooth/isobmff/parse_tfxd.ts +0 -38
- package/src/transports/smooth/isobmff/patch_segment.ts +0 -171
- package/src/transports/smooth/pipelines.ts +0 -533
- package/src/transports/smooth/segment_loader.ts +0 -288
- package/src/transports/smooth/utils.ts +0 -106
- package/src/transports/types.ts +0 -809
- package/src/transports/utils/__tests__/byte_range.test.ts +0 -35
- package/src/transports/utils/__tests__/check_isobmff_integrity.test.ts +0 -148
- package/src/transports/utils/__tests__/find_complete_box.test.ts +0 -138
- package/src/transports/utils/__tests__/infer_segment_container.test.ts +0 -227
- package/src/transports/utils/byte_range.ts +0 -25
- package/src/transports/utils/call_custom_manifest_loader.ts +0 -147
- package/src/transports/utils/check_isobmff_integrity.ts +0 -50
- package/src/transports/utils/find_complete_box.ts +0 -63
- package/src/transports/utils/generate_manifest_loader.ts +0 -97
- package/src/transports/utils/get_isobmff_timing_infos.ts +0 -86
- package/src/transports/utils/infer_segment_container.ts +0 -56
- package/src/transports/utils/parse_text_track.ts +0 -176
- package/src/typings/README.md +0 -7
- package/src/typings/globals.d.ts +0 -83
- package/src/typings/next-tick.d.ts +0 -23
- package/src/utils/README.md +0 -5
- package/src/utils/__tests__/are_arrays_of_numbers_equal.test.ts +0 -86
- package/src/utils/__tests__/are_codecs_compatible.test.ts +0 -88
- package/src/utils/__tests__/array_find.test.ts +0 -113
- package/src/utils/__tests__/array_find_index.test.ts +0 -113
- package/src/utils/__tests__/array_includes.test.ts +0 -151
- package/src/utils/__tests__/assert.test.ts +0 -237
- package/src/utils/__tests__/assert_unreachable.test.ts +0 -40
- package/src/utils/__tests__/base64.test.ts +0 -147
- package/src/utils/__tests__/byte_parsing.test.ts +0 -267
- package/src/utils/__tests__/deep_merge.test.ts +0 -48
- package/src/utils/__tests__/event_emitter.test.ts +0 -579
- package/src/utils/__tests__/flat_map.test.ts +0 -71
- package/src/utils/__tests__/get_fuzzed_delay.test.ts +0 -32
- package/src/utils/__tests__/hash_buffer.test.ts +0 -105
- package/src/utils/__tests__/id_generator.test.ts +0 -80
- package/src/utils/__tests__/initialization_segment_cache.test.ts +0 -245
- package/src/utils/__tests__/is_non_empty_string.test.ts +0 -41
- package/src/utils/__tests__/is_null_or_undefined.test.ts +0 -33
- package/src/utils/__tests__/list_to_map.test.ts +0 -46
- package/src/utils/__tests__/logger.test.ts +0 -214
- package/src/utils/__tests__/noop.test.ts +0 -23
- package/src/utils/__tests__/object_assign.test.ts +0 -56
- package/src/utils/__tests__/object_values.test.ts +0 -26
- package/src/utils/__tests__/ranges.test.ts +0 -907
- package/src/utils/__tests__/resolve_url.test.ts +0 -100
- package/src/utils/__tests__/simple_set.test.ts +0 -57
- package/src/utils/__tests__/sorted_list.test.ts +0 -335
- package/src/utils/__tests__/starts_with.test.ts +0 -65
- package/src/utils/__tests__/string_parsing.test.ts +0 -267
- package/src/utils/__tests__/uniq.test.ts +0 -134
- package/src/utils/__tests__/warn_once.test.ts +0 -38
- package/src/utils/__tests__/weak_map_memory.test.ts +0 -188
- package/src/utils/are_arrays_of_numbers_equal.ts +0 -39
- package/src/utils/are_codecs_compatible.ts +0 -51
- package/src/utils/array_find.ts +0 -55
- package/src/utils/array_find_index.ts +0 -54
- package/src/utils/array_includes.ts +0 -93
- package/src/utils/assert.ts +0 -65
- package/src/utils/assert_unreachable.ts +0 -45
- package/src/utils/base64.ts +0 -153
- package/src/utils/byte_parsing.ts +0 -256
- package/src/utils/cancellable_sleep.ts +0 -41
- package/src/utils/create_cancellable_promise.ts +0 -69
- package/src/utils/deep_merge.ts +0 -49
- package/src/utils/event_emitter.ts +0 -147
- package/src/utils/flat_map.ts +0 -50
- package/src/utils/get_fuzzed_delay.ts +0 -27
- package/src/utils/hash_buffer.ts +0 -42
- package/src/utils/id_generator.ts +0 -35
- package/src/utils/initialization_segment_cache.ts +0 -68
- package/src/utils/is_non_empty_string.ts +0 -23
- package/src/utils/is_null_or_undefined.ts +0 -27
- package/src/utils/languages/ISO_639-1_to_ISO_639-3.ts +0 -207
- package/src/utils/languages/ISO_639-2_to_ISO_639-3.ts +0 -43
- package/src/utils/languages/__tests__/normalize.test.ts +0 -290
- package/src/utils/languages/index.ts +0 -29
- package/src/utils/languages/normalize.ts +0 -152
- package/src/utils/list_to_map.ts +0 -32
- package/src/utils/logger.ts +0 -100
- package/src/utils/noop.ts +0 -26
- package/src/utils/object_assign.ts +0 -60
- package/src/utils/object_values.ts +0 -31
- package/src/utils/ranges.ts +0 -499
- package/src/utils/reference.ts +0 -390
- package/src/utils/request/fetch.ts +0 -250
- package/src/utils/request/index.ts +0 -38
- package/src/utils/request/xhr.ts +0 -287
- package/src/utils/resolve_url.ts +0 -126
- package/src/utils/retry_promise_with_backoff.ts +0 -95
- package/src/utils/simple_set.ts +0 -67
- package/src/utils/sleep.ts +0 -14
- package/src/utils/slice_uint8array.ts +0 -53
- package/src/utils/sorted_list.ts +0 -240
- package/src/utils/starts_with.ts +0 -42
- package/src/utils/string_parsing.ts +0 -414
- package/src/utils/task_canceller.ts +0 -367
- package/src/utils/uniq.ts +0 -49
- package/src/utils/warn_once.ts +0 -34
- package/src/utils/weak_map_memory.ts +0 -89
- package/src/utils/wrapInPromise.ts +0 -24
- package/tsconfig.json +0 -28
- package/tsconfig.modules.json +0 -36
|
@@ -1,1246 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright 2015 CANAL+ Group
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import eme, {
|
|
18
|
-
getInitData,
|
|
19
|
-
ICustomMediaKeys,
|
|
20
|
-
ICustomMediaKeySystemAccess,
|
|
21
|
-
} from "../../compat/eme";
|
|
22
|
-
import config from "../../config";
|
|
23
|
-
import {
|
|
24
|
-
EncryptedMediaError,
|
|
25
|
-
OtherError,
|
|
26
|
-
} from "../../errors";
|
|
27
|
-
import log from "../../log";
|
|
28
|
-
import Manifest, {
|
|
29
|
-
Period,
|
|
30
|
-
} from "../../manifest";
|
|
31
|
-
import {
|
|
32
|
-
IKeySystemOption,
|
|
33
|
-
IPlayerError,
|
|
34
|
-
} from "../../public_types";
|
|
35
|
-
import areArraysOfNumbersEqual from "../../utils/are_arrays_of_numbers_equal";
|
|
36
|
-
import arrayFind from "../../utils/array_find";
|
|
37
|
-
import arrayIncludes from "../../utils/array_includes";
|
|
38
|
-
import EventEmitter from "../../utils/event_emitter";
|
|
39
|
-
import isNullOrUndefined from "../../utils/is_null_or_undefined";
|
|
40
|
-
import { bytesToHex } from "../../utils/string_parsing";
|
|
41
|
-
import TaskCanceller from "../../utils/task_canceller";
|
|
42
|
-
import attachMediaKeys from "./attach_media_keys";
|
|
43
|
-
import createOrLoadSession from "./create_or_load_session";
|
|
44
|
-
import { IMediaKeysInfos } from "./get_media_keys";
|
|
45
|
-
import initMediaKeys from "./init_media_keys";
|
|
46
|
-
import SessionEventsListener, {
|
|
47
|
-
BlacklistedSessionError, IKeyUpdateValue,
|
|
48
|
-
} from "./session_events_listener";
|
|
49
|
-
import setServerCertificate from "./set_server_certificate";
|
|
50
|
-
import {
|
|
51
|
-
IProtectionData,
|
|
52
|
-
IMediaKeySessionStores,
|
|
53
|
-
MediaKeySessionLoadingType,
|
|
54
|
-
IProcessedProtectionData,
|
|
55
|
-
ContentDecryptorState,
|
|
56
|
-
IContentDecryptorEvent,
|
|
57
|
-
} from "./types";
|
|
58
|
-
import { DecommissionedSessionError } from "./utils/check_key_statuses";
|
|
59
|
-
import cleanOldStoredPersistentInfo from "./utils/clean_old_stored_persistent_info";
|
|
60
|
-
import getDrmSystemId from "./utils/get_drm_system_id";
|
|
61
|
-
import InitDataValuesContainer from "./utils/init_data_values_container";
|
|
62
|
-
import {
|
|
63
|
-
areAllKeyIdsContainedIn,
|
|
64
|
-
areSomeKeyIdsContainedIn,
|
|
65
|
-
} from "./utils/key_id_comparison";
|
|
66
|
-
import KeySessionRecord from "./utils/key_session_record";
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Module communicating with the Content Decryption Module (or CDM) to be able
|
|
70
|
-
* to decrypt contents.
|
|
71
|
-
*
|
|
72
|
-
* The `ContentDecryptor` starts communicating with the CDM, to initialize the
|
|
73
|
-
* key system, as soon as it is created.
|
|
74
|
-
*
|
|
75
|
-
* You can be notified of various events, such as fatal errors, by registering
|
|
76
|
-
* to one of its multiple events (@see IContentDecryptorEvent).
|
|
77
|
-
*
|
|
78
|
-
* @class ContentDecryptor
|
|
79
|
-
*/
|
|
80
|
-
export default class ContentDecryptor extends EventEmitter<IContentDecryptorEvent> {
|
|
81
|
-
/**
|
|
82
|
-
* Hexadecimal id identifying the currently-chosen key system.
|
|
83
|
-
* `undefined` if not known or if the key system hasn't been initialized yet.
|
|
84
|
-
*
|
|
85
|
-
* When providing protection initialization data to the ContentDecryptor, you
|
|
86
|
-
* may only provide those linked to that system id. You can also provide all
|
|
87
|
-
* available protection initialization data, in which case it will be
|
|
88
|
-
* automatically filtered.
|
|
89
|
-
*
|
|
90
|
-
* This `systemId` may only be known once the `ReadyForContent` state (@see
|
|
91
|
-
* ContentDecryptorState) is reached, and even then, it may still be unknown,
|
|
92
|
-
* in which case it will stay to `undefined`.
|
|
93
|
-
*/
|
|
94
|
-
public systemId : string | undefined;
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Set only if the `ContentDecryptor` failed on an error.
|
|
98
|
-
* The corresponding Error.
|
|
99
|
-
*/
|
|
100
|
-
public error : Error | null;
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* State of the ContentDecryptor (@see ContentDecryptorState) and associated
|
|
104
|
-
* data.
|
|
105
|
-
*
|
|
106
|
-
* The ContentDecryptor goes into a series of steps as it is initializing.
|
|
107
|
-
* This private property stores the current state and the potentially linked
|
|
108
|
-
* data.
|
|
109
|
-
*/
|
|
110
|
-
private _stateData : IContentDecryptorStateData;
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Contains information about all key sessions loaded for this current
|
|
114
|
-
* content.
|
|
115
|
-
* This object is most notably used to check which keys are already obtained,
|
|
116
|
-
* thus avoiding to perform new unnecessary license requests and CDM interactions.
|
|
117
|
-
*/
|
|
118
|
-
private _currentSessions : IActiveSessionInfo[];
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Allows to dispose the resources taken by the current instance of the
|
|
122
|
-
* ContentDecryptor.
|
|
123
|
-
*/
|
|
124
|
-
private _canceller : TaskCanceller;
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* This queue stores initialization data which hasn't been processed yet,
|
|
128
|
-
* probably because the "queue is locked" for now. (@see _stateData private
|
|
129
|
-
* property).
|
|
130
|
-
*
|
|
131
|
-
* For example, this queue stores initialization data communicated while
|
|
132
|
-
* initializing so it can be processed when the initialization is done.
|
|
133
|
-
*/
|
|
134
|
-
private _initDataQueue : IProtectionData[];
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* `true` if the EME API are available on the current platform according to
|
|
138
|
-
* the default EME implementation used.
|
|
139
|
-
* `false` otherwise.
|
|
140
|
-
* @returns {boolean}
|
|
141
|
-
*/
|
|
142
|
-
public static hasEmeApis() : boolean {
|
|
143
|
-
return !isNullOrUndefined(eme.requestMediaKeySystemAccess);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Create a new `ContentDecryptor`, and initialize its decryption capabilities
|
|
148
|
-
* right away.
|
|
149
|
-
* Goes into the `WaitingForAttachment` state once that initialization is
|
|
150
|
-
* done, after which you should call the `attach` method when you're ready for
|
|
151
|
-
* those decryption capabilities to be attached to the HTMLMediaElement.
|
|
152
|
-
*
|
|
153
|
-
* @param {HTMLMediaElement} mediaElement - The MediaElement which will be
|
|
154
|
-
* associated to a MediaKeys object
|
|
155
|
-
* @param {Array.<Object>} ksOptions - key system configuration.
|
|
156
|
-
* The `ContentDecryptor` can be given one or multiple key system
|
|
157
|
-
* configurations. It will choose the appropriate one depending on user
|
|
158
|
-
* settings and browser support.
|
|
159
|
-
*/
|
|
160
|
-
constructor(mediaElement : HTMLMediaElement, ksOptions : IKeySystemOption[]) {
|
|
161
|
-
super();
|
|
162
|
-
|
|
163
|
-
log.debug("DRM: Starting ContentDecryptor logic.");
|
|
164
|
-
|
|
165
|
-
const canceller = new TaskCanceller();
|
|
166
|
-
this._currentSessions = [];
|
|
167
|
-
this._canceller = canceller;
|
|
168
|
-
this._initDataQueue = [];
|
|
169
|
-
this._stateData = { state: ContentDecryptorState.Initializing,
|
|
170
|
-
isMediaKeysAttached: MediaKeyAttachmentStatus.NotAttached,
|
|
171
|
-
isInitDataQueueLocked: true,
|
|
172
|
-
data: null };
|
|
173
|
-
this.error = null;
|
|
174
|
-
|
|
175
|
-
eme.onEncrypted(mediaElement, evt => {
|
|
176
|
-
log.debug("DRM: Encrypted event received from media element.");
|
|
177
|
-
const initData = getInitData(evt as MediaEncryptedEvent);
|
|
178
|
-
if (initData !== null) {
|
|
179
|
-
this.onInitializationData(initData);
|
|
180
|
-
}
|
|
181
|
-
}, canceller.signal);
|
|
182
|
-
|
|
183
|
-
initMediaKeys(mediaElement, ksOptions, canceller.signal)
|
|
184
|
-
.then((mediaKeysInfo) => {
|
|
185
|
-
const { options, mediaKeySystemAccess } = mediaKeysInfo;
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* String identifying the key system, allowing the rest of the code to
|
|
189
|
-
* only advertise the required initialization data for license requests.
|
|
190
|
-
*
|
|
191
|
-
* Note that we only set this value if retro-compatibility to older
|
|
192
|
-
* persistent logic in the RxPlayer is not important, as the
|
|
193
|
-
* optimizations this property unlocks can break the loading of
|
|
194
|
-
* MediaKeySessions persisted in older RxPlayer's versions.
|
|
195
|
-
*/
|
|
196
|
-
let systemId : string | undefined;
|
|
197
|
-
if (isNullOrUndefined(options.licenseStorage) ||
|
|
198
|
-
options.licenseStorage.disableRetroCompatibility === true)
|
|
199
|
-
{
|
|
200
|
-
systemId = getDrmSystemId(mediaKeySystemAccess.keySystem);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
this.systemId = systemId;
|
|
204
|
-
if (this._stateData.state === ContentDecryptorState.Initializing) {
|
|
205
|
-
this._stateData = { state: ContentDecryptorState.WaitingForAttachment,
|
|
206
|
-
isInitDataQueueLocked: true,
|
|
207
|
-
isMediaKeysAttached: MediaKeyAttachmentStatus.NotAttached,
|
|
208
|
-
data: { mediaKeysInfo,
|
|
209
|
-
mediaElement } };
|
|
210
|
-
|
|
211
|
-
this.trigger("stateChange", this._stateData.state);
|
|
212
|
-
}
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
.catch((err) => {
|
|
216
|
-
this._onFatalError(err);
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Returns the current state of the ContentDecryptor.
|
|
222
|
-
* @see ContentDecryptorState
|
|
223
|
-
* @returns {Object}
|
|
224
|
-
*/
|
|
225
|
-
public getState() : ContentDecryptorState {
|
|
226
|
-
return this._stateData.state;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Attach the current decryption capabilities to the HTMLMediaElement.
|
|
231
|
-
* This method should only be called once the `ContentDecryptor` is in the
|
|
232
|
-
* `WaitingForAttachment` state.
|
|
233
|
-
*
|
|
234
|
-
* You might want to first set the HTMLMediaElement's `src` attribute before
|
|
235
|
-
* calling this method, and only push data to it once the `ReadyForContent`
|
|
236
|
-
* state is reached, for compatibility reasons.
|
|
237
|
-
*/
|
|
238
|
-
public attach() : void {
|
|
239
|
-
if (this._stateData.state !== ContentDecryptorState.WaitingForAttachment) {
|
|
240
|
-
throw new Error("`attach` should only be called when " +
|
|
241
|
-
"in the WaitingForAttachment state");
|
|
242
|
-
} else if (
|
|
243
|
-
this._stateData.isMediaKeysAttached !== MediaKeyAttachmentStatus.NotAttached
|
|
244
|
-
) {
|
|
245
|
-
log.warn("DRM: ContentDecryptor's `attach` method called more than once.");
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const { mediaElement, mediaKeysInfo } = this._stateData.data;
|
|
250
|
-
const { options, mediaKeys, mediaKeySystemAccess, stores } = mediaKeysInfo;
|
|
251
|
-
const shouldDisableLock = options.disableMediaKeysAttachmentLock === true;
|
|
252
|
-
|
|
253
|
-
if (shouldDisableLock) {
|
|
254
|
-
this._stateData = { state: ContentDecryptorState.ReadyForContent,
|
|
255
|
-
isInitDataQueueLocked: true,
|
|
256
|
-
isMediaKeysAttached: MediaKeyAttachmentStatus.Pending,
|
|
257
|
-
data: { mediaKeysInfo, mediaElement } };
|
|
258
|
-
this.trigger("stateChange", this._stateData.state);
|
|
259
|
-
|
|
260
|
-
// previous trigger might have lead to disposal
|
|
261
|
-
if (this._isStopped()) {
|
|
262
|
-
return ;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
this._stateData.isMediaKeysAttached = MediaKeyAttachmentStatus.Pending;
|
|
267
|
-
const stateToAttach = { emeImplementation: eme,
|
|
268
|
-
loadedSessionsStore: stores.loadedSessionsStore,
|
|
269
|
-
mediaKeySystemAccess,
|
|
270
|
-
mediaKeys,
|
|
271
|
-
keySystemOptions: options };
|
|
272
|
-
|
|
273
|
-
log.debug("DRM: Attaching current MediaKeys");
|
|
274
|
-
attachMediaKeys(mediaElement, stateToAttach, this._canceller.signal)
|
|
275
|
-
.then(async () => {
|
|
276
|
-
this._stateData.isMediaKeysAttached = MediaKeyAttachmentStatus.Attached;
|
|
277
|
-
|
|
278
|
-
const { serverCertificate } = options;
|
|
279
|
-
if (!isNullOrUndefined(serverCertificate)) {
|
|
280
|
-
const resSsc = await setServerCertificate(mediaKeys, serverCertificate);
|
|
281
|
-
if (resSsc.type === "error") {
|
|
282
|
-
this.trigger("warning", resSsc.value);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (this._isStopped()) { // We might be stopped since then
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
const prevState = this._stateData.state;
|
|
291
|
-
this._stateData = { state: ContentDecryptorState.ReadyForContent,
|
|
292
|
-
isMediaKeysAttached: MediaKeyAttachmentStatus.Attached,
|
|
293
|
-
isInitDataQueueLocked: false,
|
|
294
|
-
data: { mediaKeysData: mediaKeysInfo } };
|
|
295
|
-
if (prevState !== ContentDecryptorState.ReadyForContent) {
|
|
296
|
-
this.trigger("stateChange", ContentDecryptorState.ReadyForContent);
|
|
297
|
-
}
|
|
298
|
-
if (!this._isStopped()) {
|
|
299
|
-
this._processCurrentInitDataQueue();
|
|
300
|
-
}
|
|
301
|
-
})
|
|
302
|
-
|
|
303
|
-
.catch((err) => {
|
|
304
|
-
this._onFatalError(err);
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Stop this `ContentDecryptor` instance:
|
|
310
|
-
* - stop listening and reacting to the various event listeners
|
|
311
|
-
* - abort all operations.
|
|
312
|
-
*
|
|
313
|
-
* Once disposed, a `ContentDecryptor` cannot be used anymore.
|
|
314
|
-
*/
|
|
315
|
-
public dispose() {
|
|
316
|
-
this.removeEventListener();
|
|
317
|
-
this._stateData = { state: ContentDecryptorState.Disposed,
|
|
318
|
-
isMediaKeysAttached: undefined,
|
|
319
|
-
isInitDataQueueLocked: undefined,
|
|
320
|
-
data: null };
|
|
321
|
-
this._canceller.cancel();
|
|
322
|
-
this.trigger("stateChange", this._stateData.state);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Method to call when new protection initialization data is encounted on the
|
|
327
|
-
* content.
|
|
328
|
-
*
|
|
329
|
-
* When called, the `ContentDecryptor` will try to obtain the decryption key
|
|
330
|
-
* if not already obtained.
|
|
331
|
-
*
|
|
332
|
-
* @param {Object} initializationData
|
|
333
|
-
*/
|
|
334
|
-
public onInitializationData(
|
|
335
|
-
initializationData : IProtectionData
|
|
336
|
-
) : void {
|
|
337
|
-
if (this._stateData.isInitDataQueueLocked !== false) {
|
|
338
|
-
if (this._isStopped()) {
|
|
339
|
-
throw new Error("ContentDecryptor either disposed or stopped.");
|
|
340
|
-
}
|
|
341
|
-
this._initDataQueue.push(initializationData);
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const { mediaKeysData } = this._stateData.data;
|
|
346
|
-
const processedInitializationData = {
|
|
347
|
-
...initializationData,
|
|
348
|
-
values: new InitDataValuesContainer(initializationData.values),
|
|
349
|
-
};
|
|
350
|
-
this._processInitializationData(processedInitializationData, mediaKeysData)
|
|
351
|
-
.catch(err => { this._onFatalError(err); });
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Async logic run each time new initialization data has to be processed.
|
|
356
|
-
* The promise return may reject, in which case a fatal error should be linked
|
|
357
|
-
* the current `ContentDecryptor`.
|
|
358
|
-
*
|
|
359
|
-
* The Promise's resolution however provides no semantic value.
|
|
360
|
-
* @param {Object} initializationData
|
|
361
|
-
* @returns {Promise.<void>}
|
|
362
|
-
*/
|
|
363
|
-
private async _processInitializationData(
|
|
364
|
-
initializationData: IProcessedProtectionData,
|
|
365
|
-
mediaKeysData: IAttachedMediaKeysData
|
|
366
|
-
) : Promise<void> {
|
|
367
|
-
const { mediaKeySystemAccess, stores, options } = mediaKeysData;
|
|
368
|
-
|
|
369
|
-
if (this._tryToUseAlreadyCreatedSession(initializationData, mediaKeysData) ||
|
|
370
|
-
this._isStopped()) // _isStopped is voluntarly checked after here
|
|
371
|
-
{
|
|
372
|
-
return;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
if (options.singleLicensePer === "content") {
|
|
376
|
-
const firstCreatedSession = arrayFind(this._currentSessions, (x) =>
|
|
377
|
-
x.source === MediaKeySessionLoadingType.Created);
|
|
378
|
-
|
|
379
|
-
if (firstCreatedSession !== undefined) {
|
|
380
|
-
// We already fetched a `singleLicensePer: "content"` license, yet we
|
|
381
|
-
// could not use the already-created MediaKeySession with it.
|
|
382
|
-
// It means that we'll never handle it and we should thus blacklist it.
|
|
383
|
-
const keyIds = initializationData.keyIds;
|
|
384
|
-
if (keyIds === undefined) {
|
|
385
|
-
if (initializationData.content === undefined) {
|
|
386
|
-
log.warn("DRM: Unable to fallback from a non-decipherable quality.");
|
|
387
|
-
} else {
|
|
388
|
-
blackListProtectionData(initializationData.content.manifest,
|
|
389
|
-
initializationData);
|
|
390
|
-
}
|
|
391
|
-
return ;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
firstCreatedSession.record.associateKeyIds(keyIds);
|
|
395
|
-
if (initializationData.content !== undefined) {
|
|
396
|
-
if (log.hasLevel("DEBUG")) {
|
|
397
|
-
const hexKids = keyIds
|
|
398
|
-
.reduce((acc, kid) => `${acc}, ${bytesToHex(kid)}`, "");
|
|
399
|
-
log.debug("DRM: Blacklisting new key ids", hexKids);
|
|
400
|
-
}
|
|
401
|
-
updateDecipherability(initializationData.content.manifest, [], keyIds, []);
|
|
402
|
-
}
|
|
403
|
-
return ;
|
|
404
|
-
}
|
|
405
|
-
} else if (options.singleLicensePer === "periods" &&
|
|
406
|
-
initializationData.content !== undefined)
|
|
407
|
-
{
|
|
408
|
-
const { period } = initializationData.content;
|
|
409
|
-
const createdSessions = this._currentSessions
|
|
410
|
-
.filter(x => x.source === MediaKeySessionLoadingType.Created);
|
|
411
|
-
const periodKeys = new Set<Uint8Array>();
|
|
412
|
-
addKeyIdsFromPeriod(periodKeys, period);
|
|
413
|
-
for (const createdSess of createdSessions) {
|
|
414
|
-
const periodKeysArr = Array.from(periodKeys);
|
|
415
|
-
for (const kid of periodKeysArr) {
|
|
416
|
-
if (createdSess.record.isAssociatedWithKeyId(kid)) {
|
|
417
|
-
createdSess.record.associateKeyIds(periodKeys.values());
|
|
418
|
-
|
|
419
|
-
// Re-loop through the Period's key ids to blacklist ones that are missing
|
|
420
|
-
// from `createdSess`'s `keyStatuses` and to update the content's
|
|
421
|
-
// decipherability.
|
|
422
|
-
for (const innerKid of periodKeysArr) {
|
|
423
|
-
if (
|
|
424
|
-
!createdSess.keyStatuses.whitelisted
|
|
425
|
-
.some(k => areArraysOfNumbersEqual(k, innerKid)) &&
|
|
426
|
-
!createdSess.keyStatuses.blacklisted
|
|
427
|
-
.some(k => areArraysOfNumbersEqual(k, innerKid))
|
|
428
|
-
) {
|
|
429
|
-
createdSess.keyStatuses.blacklisted.push(innerKid);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
updateDecipherability(initializationData.content.manifest,
|
|
433
|
-
createdSess.keyStatuses.whitelisted,
|
|
434
|
-
createdSess.keyStatuses.blacklisted,
|
|
435
|
-
[]);
|
|
436
|
-
return;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// /!\ Do not forget to unlock when done
|
|
443
|
-
// TODO this is error-prone and can lead to performance issue when loading
|
|
444
|
-
// persistent sessions.
|
|
445
|
-
// Can we find a better strategy?
|
|
446
|
-
this._lockInitDataQueue();
|
|
447
|
-
|
|
448
|
-
let wantedSessionType : MediaKeySessionType;
|
|
449
|
-
if (options.persistentLicense !== true) {
|
|
450
|
-
wantedSessionType = "temporary";
|
|
451
|
-
} else if (!canCreatePersistentSession(mediaKeySystemAccess)) {
|
|
452
|
-
log.warn("DRM: Cannot create \"persistent-license\" session: not supported");
|
|
453
|
-
wantedSessionType = "temporary";
|
|
454
|
-
} else {
|
|
455
|
-
wantedSessionType = "persistent-license";
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
const { EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS,
|
|
459
|
-
EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION } = config.getCurrent();
|
|
460
|
-
|
|
461
|
-
const maxSessionCacheSize = typeof options.maxSessionCacheSize === "number" ?
|
|
462
|
-
options.maxSessionCacheSize :
|
|
463
|
-
EME_DEFAULT_MAX_SIMULTANEOUS_MEDIA_KEY_SESSIONS;
|
|
464
|
-
|
|
465
|
-
const sessionRes = await createOrLoadSession(initializationData,
|
|
466
|
-
stores,
|
|
467
|
-
wantedSessionType,
|
|
468
|
-
maxSessionCacheSize,
|
|
469
|
-
this._canceller.signal);
|
|
470
|
-
if (this._isStopped()) {
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
const sessionInfo : IActiveSessionInfo = {
|
|
475
|
-
record: sessionRes.value.keySessionRecord,
|
|
476
|
-
source: sessionRes.type,
|
|
477
|
-
keyStatuses: { whitelisted: [], blacklisted: [] },
|
|
478
|
-
blacklistedSessionError: null,
|
|
479
|
-
};
|
|
480
|
-
this._currentSessions.push(sessionInfo);
|
|
481
|
-
|
|
482
|
-
const { mediaKeySession, sessionType } = sessionRes.value;
|
|
483
|
-
|
|
484
|
-
/**
|
|
485
|
-
* We only store persistent sessions once its keys are known.
|
|
486
|
-
* This boolean allows to know if this session has already been
|
|
487
|
-
* persisted or not.
|
|
488
|
-
*/
|
|
489
|
-
let isSessionPersisted = false;
|
|
490
|
-
|
|
491
|
-
SessionEventsListener(
|
|
492
|
-
mediaKeySession,
|
|
493
|
-
options,
|
|
494
|
-
mediaKeySystemAccess.keySystem,
|
|
495
|
-
{
|
|
496
|
-
onKeyUpdate: (value : IKeyUpdateValue) : void => {
|
|
497
|
-
const linkedKeys = getKeyIdsLinkedToSession(
|
|
498
|
-
initializationData,
|
|
499
|
-
sessionInfo.record,
|
|
500
|
-
options.singleLicensePer,
|
|
501
|
-
sessionInfo.source === MediaKeySessionLoadingType.Created,
|
|
502
|
-
value.whitelistedKeyIds,
|
|
503
|
-
value.blacklistedKeyIds);
|
|
504
|
-
|
|
505
|
-
sessionInfo.record.associateKeyIds(linkedKeys.whitelisted);
|
|
506
|
-
sessionInfo.record.associateKeyIds(linkedKeys.blacklisted);
|
|
507
|
-
sessionInfo.keyStatuses = { whitelisted: linkedKeys.whitelisted,
|
|
508
|
-
blacklisted: linkedKeys.blacklisted };
|
|
509
|
-
|
|
510
|
-
if (sessionInfo.record.getAssociatedKeyIds().length !== 0 &&
|
|
511
|
-
sessionType === "persistent-license" &&
|
|
512
|
-
stores.persistentSessionsStore !== null &&
|
|
513
|
-
!isSessionPersisted)
|
|
514
|
-
{
|
|
515
|
-
const { persistentSessionsStore } = stores;
|
|
516
|
-
cleanOldStoredPersistentInfo(
|
|
517
|
-
persistentSessionsStore,
|
|
518
|
-
EME_MAX_STORED_PERSISTENT_SESSION_INFORMATION - 1);
|
|
519
|
-
persistentSessionsStore.add(initializationData,
|
|
520
|
-
sessionInfo.record.getAssociatedKeyIds(),
|
|
521
|
-
mediaKeySession);
|
|
522
|
-
isSessionPersisted = true;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
if (initializationData.content !== undefined) {
|
|
526
|
-
updateDecipherability(initializationData.content.manifest,
|
|
527
|
-
linkedKeys.whitelisted,
|
|
528
|
-
linkedKeys.blacklisted,
|
|
529
|
-
[]);
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
this._unlockInitDataQueue();
|
|
533
|
-
},
|
|
534
|
-
onWarning: (value : IPlayerError) : void => {
|
|
535
|
-
this.trigger("warning", value);
|
|
536
|
-
},
|
|
537
|
-
onError: (err : unknown) : void => {
|
|
538
|
-
if (err instanceof DecommissionedSessionError) {
|
|
539
|
-
log.warn("DRM: A session's closing condition has been triggered");
|
|
540
|
-
this._lockInitDataQueue();
|
|
541
|
-
const indexOf = this._currentSessions.indexOf(sessionInfo);
|
|
542
|
-
if (indexOf >= 0) {
|
|
543
|
-
this._currentSessions.splice(indexOf);
|
|
544
|
-
}
|
|
545
|
-
if (initializationData.content !== undefined) {
|
|
546
|
-
updateDecipherability(initializationData.content.manifest,
|
|
547
|
-
[],
|
|
548
|
-
[],
|
|
549
|
-
sessionInfo.record.getAssociatedKeyIds());
|
|
550
|
-
}
|
|
551
|
-
stores.persistentSessionsStore?.delete(mediaKeySession.sessionId);
|
|
552
|
-
stores.loadedSessionsStore.closeSession(mediaKeySession)
|
|
553
|
-
.catch(e => {
|
|
554
|
-
const closeError = e instanceof Error ? e :
|
|
555
|
-
"unknown error";
|
|
556
|
-
log.warn("DRM: failed to close expired session", closeError);
|
|
557
|
-
})
|
|
558
|
-
.then(() => this._unlockInitDataQueue())
|
|
559
|
-
.catch((retryError) => this._onFatalError(retryError));
|
|
560
|
-
|
|
561
|
-
if (!this._isStopped()) {
|
|
562
|
-
this.trigger("warning", err.reason);
|
|
563
|
-
}
|
|
564
|
-
return;
|
|
565
|
-
}
|
|
566
|
-
if (!(err instanceof BlacklistedSessionError)) {
|
|
567
|
-
this._onFatalError(err);
|
|
568
|
-
return ;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
sessionInfo.blacklistedSessionError = err;
|
|
572
|
-
|
|
573
|
-
if (initializationData.content !== undefined) {
|
|
574
|
-
const { manifest } = initializationData.content;
|
|
575
|
-
log.info("DRM: blacklisting Representations based on " +
|
|
576
|
-
"protection data.");
|
|
577
|
-
blackListProtectionData(manifest, initializationData);
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
this._unlockInitDataQueue();
|
|
581
|
-
|
|
582
|
-
// TODO warning for blacklisted session?
|
|
583
|
-
},
|
|
584
|
-
},
|
|
585
|
-
this._canceller.signal);
|
|
586
|
-
|
|
587
|
-
if (options.singleLicensePer === undefined ||
|
|
588
|
-
options.singleLicensePer === "init-data")
|
|
589
|
-
{
|
|
590
|
-
this._unlockInitDataQueue();
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
if (sessionRes.type === MediaKeySessionLoadingType.Created) {
|
|
594
|
-
const requestData = initializationData.values.constructRequestData();
|
|
595
|
-
try {
|
|
596
|
-
await stores.loadedSessionsStore.generateLicenseRequest(
|
|
597
|
-
mediaKeySession,
|
|
598
|
-
initializationData.type,
|
|
599
|
-
requestData);
|
|
600
|
-
} catch (error) {
|
|
601
|
-
// First check that the error was not due to the MediaKeySession closing
|
|
602
|
-
// or being closed
|
|
603
|
-
const entry = stores.loadedSessionsStore.getEntryForSession(mediaKeySession);
|
|
604
|
-
if (entry === null || entry.closingStatus.type !== "none") {
|
|
605
|
-
// MediaKeySession closing/closed: Just remove from handled list and abort.
|
|
606
|
-
const indexInCurrent = this._currentSessions.indexOf(sessionInfo);
|
|
607
|
-
if (indexInCurrent >= 0) {
|
|
608
|
-
this._currentSessions.splice(indexInCurrent, 1);
|
|
609
|
-
}
|
|
610
|
-
return Promise.resolve();
|
|
611
|
-
}
|
|
612
|
-
throw new EncryptedMediaError("KEY_GENERATE_REQUEST_ERROR",
|
|
613
|
-
error instanceof Error ? error.toString() :
|
|
614
|
-
"Unknown error");
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
return Promise.resolve();
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
private _tryToUseAlreadyCreatedSession(
|
|
622
|
-
initializationData : IProcessedProtectionData,
|
|
623
|
-
mediaKeysData : IAttachedMediaKeysData
|
|
624
|
-
) : boolean {
|
|
625
|
-
const { stores, options } = mediaKeysData;
|
|
626
|
-
|
|
627
|
-
/**
|
|
628
|
-
* If set, a currently-used key session is already compatible to this
|
|
629
|
-
* initialization data.
|
|
630
|
-
*/
|
|
631
|
-
const compatibleSessionInfo = arrayFind(
|
|
632
|
-
this._currentSessions,
|
|
633
|
-
(x) => x.record.isCompatibleWith(initializationData));
|
|
634
|
-
|
|
635
|
-
if (compatibleSessionInfo === undefined) {
|
|
636
|
-
return false;
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
// Check if the compatible session is blacklisted
|
|
640
|
-
const blacklistedSessionError = compatibleSessionInfo.blacklistedSessionError;
|
|
641
|
-
if (!isNullOrUndefined(blacklistedSessionError)) {
|
|
642
|
-
if (initializationData.type === undefined ||
|
|
643
|
-
initializationData.content === undefined)
|
|
644
|
-
{
|
|
645
|
-
log.error("DRM: This initialization data has already been blacklisted " +
|
|
646
|
-
"but the current content is not known.");
|
|
647
|
-
return true;
|
|
648
|
-
} else {
|
|
649
|
-
log.info("DRM: This initialization data has already been blacklisted. " +
|
|
650
|
-
"Blacklisting the related content.");
|
|
651
|
-
const { manifest } = initializationData.content;
|
|
652
|
-
blackListProtectionData(manifest, initializationData);
|
|
653
|
-
return true;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// Check if the current key id(s) has been blacklisted by this session
|
|
658
|
-
if (initializationData.keyIds !== undefined) {
|
|
659
|
-
/**
|
|
660
|
-
* If set to `true`, the Representation(s) linked to this
|
|
661
|
-
* initialization data's key id should be marked as "not decipherable".
|
|
662
|
-
*/
|
|
663
|
-
let isUndecipherable : boolean;
|
|
664
|
-
|
|
665
|
-
if (options.singleLicensePer === undefined ||
|
|
666
|
-
options.singleLicensePer === "init-data")
|
|
667
|
-
{
|
|
668
|
-
// Note: In the default "init-data" mode, we only avoid a
|
|
669
|
-
// Representation if the key id was originally explicitely
|
|
670
|
-
// blacklisted (and not e.g. if its key was just not present in
|
|
671
|
-
// the license).
|
|
672
|
-
//
|
|
673
|
-
// This is to enforce v3.x.x retro-compatibility: we cannot
|
|
674
|
-
// fallback from a Representation unless some RxPlayer option
|
|
675
|
-
// documentating this behavior has been set.
|
|
676
|
-
const { blacklisted } = compatibleSessionInfo.keyStatuses;
|
|
677
|
-
isUndecipherable = areSomeKeyIdsContainedIn(initializationData.keyIds,
|
|
678
|
-
blacklisted);
|
|
679
|
-
} else {
|
|
680
|
-
// In any other mode, as soon as not all of this initialization
|
|
681
|
-
// data's linked key ids are explicitely whitelisted, we can mark
|
|
682
|
-
// the corresponding Representation as "not decipherable".
|
|
683
|
-
// This is because we've no such retro-compatibility guarantee to
|
|
684
|
-
// make there.
|
|
685
|
-
const { whitelisted } = compatibleSessionInfo.keyStatuses;
|
|
686
|
-
isUndecipherable = !areAllKeyIdsContainedIn(initializationData.keyIds,
|
|
687
|
-
whitelisted);
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
if (isUndecipherable) {
|
|
691
|
-
if (initializationData.content === undefined) {
|
|
692
|
-
log.error("DRM: Cannot forbid key id, the content is unknown.");
|
|
693
|
-
return true;
|
|
694
|
-
}
|
|
695
|
-
log.info("DRM: Current initialization data is linked to blacklisted keys. " +
|
|
696
|
-
"Marking Representations as not decipherable");
|
|
697
|
-
updateDecipherability(initializationData.content.manifest,
|
|
698
|
-
[],
|
|
699
|
-
initializationData.keyIds,
|
|
700
|
-
[]);
|
|
701
|
-
return true;
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
// If we reached here, it means that this initialization data is not
|
|
706
|
-
// blacklisted in any way.
|
|
707
|
-
// Search loaded session and put it on top of the cache if it exists.
|
|
708
|
-
const entry = stores.loadedSessionsStore.reuse(initializationData);
|
|
709
|
-
if (entry !== null) {
|
|
710
|
-
// TODO update decipherability to `true` if not?
|
|
711
|
-
log.debug("DRM: Init data already processed. Skipping it.");
|
|
712
|
-
return true;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
// Session not found in `loadedSessionsStore`, it might have been closed
|
|
716
|
-
// since.
|
|
717
|
-
// Remove from `this._currentSessions` and start again.
|
|
718
|
-
const indexOf = this._currentSessions.indexOf(compatibleSessionInfo);
|
|
719
|
-
if (indexOf === -1) {
|
|
720
|
-
log.error("DRM: Unable to remove processed init data: not found.");
|
|
721
|
-
} else {
|
|
722
|
-
log.debug("DRM: A session from a processed init data is not available " +
|
|
723
|
-
"anymore. Re-processing it.");
|
|
724
|
-
this._currentSessions.splice(indexOf, 1);
|
|
725
|
-
}
|
|
726
|
-
return false;
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
/**
|
|
730
|
-
* Callback that should be called if an error that made the current
|
|
731
|
-
* `ContentDecryptor` instance unusable arised.
|
|
732
|
-
* This callbacks takes care of resetting state and sending the right events.
|
|
733
|
-
*
|
|
734
|
-
* Once called, no further actions should be taken.
|
|
735
|
-
*
|
|
736
|
-
* @param {*} err - The error object which describes the issue. Will be
|
|
737
|
-
* formatted and sent in an "error" event.
|
|
738
|
-
*/
|
|
739
|
-
private _onFatalError(err : unknown) : void {
|
|
740
|
-
if (this._canceller.isUsed()) {
|
|
741
|
-
return;
|
|
742
|
-
}
|
|
743
|
-
const formattedErr = err instanceof Error ?
|
|
744
|
-
err :
|
|
745
|
-
new OtherError("NONE", "Unknown decryption error");
|
|
746
|
-
this.error = formattedErr;
|
|
747
|
-
this._initDataQueue.length = 0;
|
|
748
|
-
this._stateData = { state: ContentDecryptorState.Error,
|
|
749
|
-
isMediaKeysAttached: undefined,
|
|
750
|
-
isInitDataQueueLocked: undefined,
|
|
751
|
-
data: null };
|
|
752
|
-
this._canceller.cancel();
|
|
753
|
-
this.trigger("error", formattedErr);
|
|
754
|
-
|
|
755
|
-
// The previous trigger might have lead to a disposal of the `ContentDecryptor`.
|
|
756
|
-
if (this._stateData.state === ContentDecryptorState.Error) {
|
|
757
|
-
this.trigger("stateChange", this._stateData.state);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
/**
|
|
762
|
-
* Return `true` if the `ContentDecryptor` has either been disposed or
|
|
763
|
-
* encountered a fatal error which made it stop.
|
|
764
|
-
* @returns {boolean}
|
|
765
|
-
*/
|
|
766
|
-
private _isStopped() : boolean {
|
|
767
|
-
return this._stateData.state === ContentDecryptorState.Disposed ||
|
|
768
|
-
this._stateData.state === ContentDecryptorState.Error;
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
/**
|
|
772
|
-
* Start processing the next initialization data of the `_initDataQueue` if it
|
|
773
|
-
* isn't lock.
|
|
774
|
-
*/
|
|
775
|
-
private _processCurrentInitDataQueue() : void {
|
|
776
|
-
while (this._stateData.isInitDataQueueLocked === false) {
|
|
777
|
-
const initData = this._initDataQueue.shift();
|
|
778
|
-
if (initData === undefined) {
|
|
779
|
-
return;
|
|
780
|
-
}
|
|
781
|
-
this.onInitializationData(initData);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
/**
|
|
786
|
-
* Lock new initialization data (from the `_initDataQueue`) from being
|
|
787
|
-
* processed until `_unlockInitDataQueue` is called.
|
|
788
|
-
*
|
|
789
|
-
* You may want to call this method when performing operations which may have
|
|
790
|
-
* an impact on the handling of other initialization data.
|
|
791
|
-
*/
|
|
792
|
-
private _lockInitDataQueue() : void {
|
|
793
|
-
if (this._stateData.isInitDataQueueLocked === false) {
|
|
794
|
-
this._stateData.isInitDataQueueLocked = true;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
/**
|
|
799
|
-
* Unlock `_initDataQueue` and start processing the first element.
|
|
800
|
-
*
|
|
801
|
-
* Should have no effect if the `_initDataQueue` was not locked.
|
|
802
|
-
*/
|
|
803
|
-
private _unlockInitDataQueue() : void {
|
|
804
|
-
if (this._stateData.isMediaKeysAttached !== MediaKeyAttachmentStatus.Attached) {
|
|
805
|
-
log.error("DRM: Trying to unlock in the wrong state");
|
|
806
|
-
return;
|
|
807
|
-
}
|
|
808
|
-
this._stateData.isInitDataQueueLocked = false;
|
|
809
|
-
this._processCurrentInitDataQueue();
|
|
810
|
-
}
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
/**
|
|
814
|
-
* Returns `true` if the given MediaKeySystemAccess can create
|
|
815
|
-
* "persistent-license" MediaKeySessions.
|
|
816
|
-
* @param {MediaKeySystemAccess} mediaKeySystemAccess
|
|
817
|
-
* @returns {Boolean}
|
|
818
|
-
*/
|
|
819
|
-
function canCreatePersistentSession(
|
|
820
|
-
mediaKeySystemAccess : MediaKeySystemAccess | ICustomMediaKeySystemAccess
|
|
821
|
-
) : boolean {
|
|
822
|
-
const { sessionTypes } = mediaKeySystemAccess.getConfiguration();
|
|
823
|
-
return sessionTypes !== undefined &&
|
|
824
|
-
arrayIncludes(sessionTypes, "persistent-license");
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
/**
|
|
828
|
-
* Change the decipherability of Representations which have their key id in one
|
|
829
|
-
* of the given Arrays:
|
|
830
|
-
*
|
|
831
|
-
* - Those who have a key id listed in `whitelistedKeyIds` will have their
|
|
832
|
-
* decipherability updated to `true`
|
|
833
|
-
*
|
|
834
|
-
* - Those who have a key id listed in `blacklistedKeyIds` will have their
|
|
835
|
-
* decipherability updated to `false`
|
|
836
|
-
*
|
|
837
|
-
* - Those who have a key id listed in `delistedKeyIds` will have their
|
|
838
|
-
* decipherability updated to `undefined`.
|
|
839
|
-
*
|
|
840
|
-
* @param {Object} manifest
|
|
841
|
-
* @param {Array.<Uint8Array>} whitelistedKeyIds
|
|
842
|
-
* @param {Array.<Uint8Array>} blacklistedKeyIds
|
|
843
|
-
* @param {Array.<Uint8Array>} delistedKeyIds
|
|
844
|
-
*/
|
|
845
|
-
function updateDecipherability(
|
|
846
|
-
manifest : Manifest,
|
|
847
|
-
whitelistedKeyIds : Uint8Array[],
|
|
848
|
-
blacklistedKeyIds : Uint8Array[],
|
|
849
|
-
delistedKeyIds : Uint8Array[]
|
|
850
|
-
) : void {
|
|
851
|
-
manifest.updateRepresentationsDeciperability((representation) => {
|
|
852
|
-
if (representation.contentProtections === undefined) {
|
|
853
|
-
return representation.decipherable;
|
|
854
|
-
}
|
|
855
|
-
const contentKIDs = representation.contentProtections.keyIds;
|
|
856
|
-
if (contentKIDs !== undefined) {
|
|
857
|
-
for (const elt of contentKIDs) {
|
|
858
|
-
for (const blacklistedKeyId of blacklistedKeyIds) {
|
|
859
|
-
if (areArraysOfNumbersEqual(blacklistedKeyId, elt.keyId)) {
|
|
860
|
-
return false;
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
for (const whitelistedKeyId of whitelistedKeyIds) {
|
|
864
|
-
if (areArraysOfNumbersEqual(whitelistedKeyId, elt.keyId)) {
|
|
865
|
-
return true;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
for (const delistedKeyId of delistedKeyIds) {
|
|
869
|
-
if (areArraysOfNumbersEqual(delistedKeyId, elt.keyId)) {
|
|
870
|
-
return undefined;
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
}
|
|
875
|
-
return representation.decipherable;
|
|
876
|
-
});
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
/**
|
|
880
|
-
* Update decipherability to `false` to any Representation which is linked to
|
|
881
|
-
* the given initialization data.
|
|
882
|
-
* @param {Object} manifest
|
|
883
|
-
* @param {Object} initData
|
|
884
|
-
*/
|
|
885
|
-
function blackListProtectionData(
|
|
886
|
-
manifest : Manifest,
|
|
887
|
-
initData : IProcessedProtectionData
|
|
888
|
-
) : void {
|
|
889
|
-
manifest.updateRepresentationsDeciperability((representation) => {
|
|
890
|
-
if (representation.decipherable === false) {
|
|
891
|
-
return false;
|
|
892
|
-
}
|
|
893
|
-
const segmentProtections = representation.contentProtections?.initData ?? [];
|
|
894
|
-
for (const protection of segmentProtections) {
|
|
895
|
-
if (initData.type === undefined ||
|
|
896
|
-
protection.type === initData.type)
|
|
897
|
-
{
|
|
898
|
-
const containedInitData = initData.values.getFormattedValues()
|
|
899
|
-
.every(undecipherableVal => {
|
|
900
|
-
return protection.values.some(currVal => {
|
|
901
|
-
return (undecipherableVal.systemId === undefined ||
|
|
902
|
-
currVal.systemId === undecipherableVal.systemId) &&
|
|
903
|
-
areArraysOfNumbersEqual(currVal.data,
|
|
904
|
-
undecipherableVal.data);
|
|
905
|
-
});
|
|
906
|
-
});
|
|
907
|
-
if (containedInitData) {
|
|
908
|
-
return false;
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
return representation.decipherable;
|
|
913
|
-
});
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
/**
|
|
917
|
-
* Returns set of all usable and unusable keys - explicit or implicit - that are
|
|
918
|
-
* linked to a `MediaKeySession`.
|
|
919
|
-
*
|
|
920
|
-
* In the RxPlayer, there is a concept of "explicit" key ids, which are key ids
|
|
921
|
-
* found in a license whose status can be known through the `keyStatuses`
|
|
922
|
-
* property from a `MediaKeySession`, and of "implicit" key ids, which are key
|
|
923
|
-
* ids which were expected to be in a fetched license, but apparently weren't.
|
|
924
|
-
*
|
|
925
|
-
* @param {Object} initializationData - Initialization data object used to make
|
|
926
|
-
* the request for the current license.
|
|
927
|
-
* @param {Object} keySessionRecord - The `KeySessionRecord` associated with the
|
|
928
|
-
* session that has been loaded. It might give supplementary information on
|
|
929
|
-
* keys implicitly linked to the license.
|
|
930
|
-
* @param {string|undefined} singleLicensePer - Setting allowing to indicate the
|
|
931
|
-
* scope a given license should have.
|
|
932
|
-
* @param {boolean} isCurrentLicense - If `true` the license has been fetched
|
|
933
|
-
* especially for the current content.
|
|
934
|
-
*
|
|
935
|
-
* Knowing this allows to determine that if decryption keys that should have
|
|
936
|
-
* been referenced in the fetched license (according to the `singleLicensePer`
|
|
937
|
-
* setting) are missing, then the keys surely must have been voluntarly
|
|
938
|
-
* removed from the license.
|
|
939
|
-
*
|
|
940
|
-
* If it is however set to `false`, it means that the license is an older
|
|
941
|
-
* license that might have been linked to another content, thus we cannot make
|
|
942
|
-
* that assumption.
|
|
943
|
-
* @param {Array.<Uint8Array>} usableKeyIds - Key ids that are present in the
|
|
944
|
-
* license and can be used.
|
|
945
|
-
* @param {Array.<Uint8Array>} unusableKeyIds - Key ids that are present in the
|
|
946
|
-
* license yet cannot be used.
|
|
947
|
-
* @returns {Object} - Returns an object with the following properties:
|
|
948
|
-
* - `whitelisted`: Array of key ids for keys that are known to be usable
|
|
949
|
-
* - `blacklisted`: Array of key ids for keys that are considered unusable.
|
|
950
|
-
* The qualities linked to those keys should not be played.
|
|
951
|
-
*/
|
|
952
|
-
function getKeyIdsLinkedToSession(
|
|
953
|
-
initializationData : IProcessedProtectionData,
|
|
954
|
-
keySessionRecord : KeySessionRecord,
|
|
955
|
-
singleLicensePer : undefined | "init-data" | "content" | "periods",
|
|
956
|
-
isCurrentLicense : boolean,
|
|
957
|
-
usableKeyIds : Uint8Array[],
|
|
958
|
-
unusableKeyIds : Uint8Array[]
|
|
959
|
-
) : { whitelisted : Uint8Array[];
|
|
960
|
-
blacklisted : Uint8Array[]; }
|
|
961
|
-
{
|
|
962
|
-
/**
|
|
963
|
-
* Every key id associated with the MediaKeySession, starting with
|
|
964
|
-
* whitelisted ones.
|
|
965
|
-
*/
|
|
966
|
-
const associatedKeyIds = [...usableKeyIds,
|
|
967
|
-
...unusableKeyIds];
|
|
968
|
-
|
|
969
|
-
// Add all key ids associated to the `KeySessionRecord` yet not in
|
|
970
|
-
// `usableKeyIds` nor in `unusableKeyIds`
|
|
971
|
-
const allKnownKeyIds = keySessionRecord.getAssociatedKeyIds();
|
|
972
|
-
for (const kid of allKnownKeyIds) {
|
|
973
|
-
if (!associatedKeyIds.some(ak => areArraysOfNumbersEqual(ak, kid))) {
|
|
974
|
-
if (log.hasLevel("DEBUG")) {
|
|
975
|
-
log.debug("DRM: KeySessionRecord's key missing in the license, blacklisting it",
|
|
976
|
-
bytesToHex(kid));
|
|
977
|
-
}
|
|
978
|
-
associatedKeyIds.push(kid);
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
if (singleLicensePer !== undefined && singleLicensePer !== "init-data") {
|
|
983
|
-
// We want to add the current key ids in the blacklist if it is
|
|
984
|
-
// not already there.
|
|
985
|
-
//
|
|
986
|
-
// We only do that when `singleLicensePer` is set to something
|
|
987
|
-
// else than the default `"init-data"` because this logic:
|
|
988
|
-
// 1. might result in a quality fallback, which is a v3.x.x
|
|
989
|
-
// breaking change if some APIs (like `singleLicensePer`)
|
|
990
|
-
// aren't used.
|
|
991
|
-
// 2. Rely on the EME spec regarding key statuses being well
|
|
992
|
-
// implemented on all supported devices, which we're not
|
|
993
|
-
// sure yet. Because in any other `singleLicensePer`, we
|
|
994
|
-
// need a good implementation anyway, it doesn't matter
|
|
995
|
-
// there.
|
|
996
|
-
const { keyIds: expectedKeyIds,
|
|
997
|
-
content } = initializationData;
|
|
998
|
-
if (expectedKeyIds !== undefined) {
|
|
999
|
-
const missingKeyIds = expectedKeyIds.filter(expected => {
|
|
1000
|
-
return !associatedKeyIds.some(k => areArraysOfNumbersEqual(k, expected));
|
|
1001
|
-
});
|
|
1002
|
-
if (missingKeyIds.length > 0) {
|
|
1003
|
-
if (log.hasLevel("DEBUG")) {
|
|
1004
|
-
log.debug("DRM: init data keys missing in the license, blacklisting them",
|
|
1005
|
-
missingKeyIds.map(m => bytesToHex(m)).join(", "));
|
|
1006
|
-
}
|
|
1007
|
-
associatedKeyIds.push(...missingKeyIds) ;
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
if (isCurrentLicense && content !== undefined) {
|
|
1012
|
-
if (singleLicensePer === "content") {
|
|
1013
|
-
// Put it in a Set to automatically filter out duplicates (by ref)
|
|
1014
|
-
const contentKeys = new Set<Uint8Array>();
|
|
1015
|
-
const { manifest } = content;
|
|
1016
|
-
for (const period of manifest.periods) {
|
|
1017
|
-
addKeyIdsFromPeriod(contentKeys, period);
|
|
1018
|
-
}
|
|
1019
|
-
mergeKeyIdSetIntoArray(contentKeys, associatedKeyIds);
|
|
1020
|
-
} else if (singleLicensePer === "periods") {
|
|
1021
|
-
const { manifest } = content;
|
|
1022
|
-
for (const period of manifest.periods) {
|
|
1023
|
-
const periodKeys = new Set<Uint8Array>();
|
|
1024
|
-
addKeyIdsFromPeriod(periodKeys, period);
|
|
1025
|
-
if (initializationData.content?.period.id === period.id) {
|
|
1026
|
-
mergeKeyIdSetIntoArray(periodKeys, associatedKeyIds);
|
|
1027
|
-
} else {
|
|
1028
|
-
const periodKeysArr = Array.from(periodKeys);
|
|
1029
|
-
for (const kid of periodKeysArr) {
|
|
1030
|
-
const isFound = associatedKeyIds.some(k => areArraysOfNumbersEqual(k, kid));
|
|
1031
|
-
if (isFound) {
|
|
1032
|
-
mergeKeyIdSetIntoArray(periodKeys, associatedKeyIds);
|
|
1033
|
-
break;
|
|
1034
|
-
}
|
|
1035
|
-
}
|
|
1036
|
-
}
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
return { whitelisted: usableKeyIds,
|
|
1042
|
-
/** associatedKeyIds starts with the whitelisted one. */
|
|
1043
|
-
blacklisted: associatedKeyIds.slice(usableKeyIds.length) };
|
|
1044
|
-
}
|
|
1045
|
-
|
|
1046
|
-
/**
|
|
1047
|
-
* Push all kei ids in the given `set` and add it to the `arr` Array only if it
|
|
1048
|
-
* isn't already present in it.
|
|
1049
|
-
* @param {Set.<Uint8Array>} set
|
|
1050
|
-
* @param {Array.<Uint8Array>} arr
|
|
1051
|
-
*/
|
|
1052
|
-
function mergeKeyIdSetIntoArray(
|
|
1053
|
-
set : Set<Uint8Array>,
|
|
1054
|
-
arr : Uint8Array[]
|
|
1055
|
-
) {
|
|
1056
|
-
const setArr = Array.from(set.values());
|
|
1057
|
-
for (const kid of setArr) {
|
|
1058
|
-
const isFound = arr.some(k => areArraysOfNumbersEqual(k, kid));
|
|
1059
|
-
if (!isFound) {
|
|
1060
|
-
arr.push(kid);
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
/**
|
|
1066
|
-
* Add to the given `set` all key ids found in the given `Period`.
|
|
1067
|
-
* @param {Set.<Uint8Array>} set
|
|
1068
|
-
* @param {Object} period
|
|
1069
|
-
*/
|
|
1070
|
-
function addKeyIdsFromPeriod(
|
|
1071
|
-
set : Set<Uint8Array>,
|
|
1072
|
-
period : Period
|
|
1073
|
-
) {
|
|
1074
|
-
for (const adaptation of period.getAdaptations()) {
|
|
1075
|
-
for (const representation of adaptation.representations) {
|
|
1076
|
-
if (representation.contentProtections !== undefined &&
|
|
1077
|
-
representation.contentProtections.keyIds !== undefined)
|
|
1078
|
-
{
|
|
1079
|
-
for (const kidInf of representation.contentProtections.keyIds) {
|
|
1080
|
-
set.add(kidInf.keyId);
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
/** Possible states the ContentDecryptor is in and associated data for each one. */
|
|
1088
|
-
type IContentDecryptorStateData = IInitializingStateData |
|
|
1089
|
-
IWaitingForAttachmentStateData |
|
|
1090
|
-
IReadyForContentStateDataUnattached |
|
|
1091
|
-
IReadyForContentStateDataAttached |
|
|
1092
|
-
IDisposeStateData |
|
|
1093
|
-
IErrorStateData;
|
|
1094
|
-
|
|
1095
|
-
/** Skeleton that all variants of `IContentDecryptorStateData` use. */
|
|
1096
|
-
interface IContentDecryptorStateBase<
|
|
1097
|
-
TStateName extends ContentDecryptorState,
|
|
1098
|
-
TIsQueueLocked extends boolean | undefined,
|
|
1099
|
-
TIsMediaKeyAttached extends MediaKeyAttachmentStatus | undefined,
|
|
1100
|
-
TData
|
|
1101
|
-
> {
|
|
1102
|
-
/** Identify the ContentDecryptor's state. */
|
|
1103
|
-
state: TStateName;
|
|
1104
|
-
/**
|
|
1105
|
-
* If `true`, the `ContentDecryptor` will wait before processing
|
|
1106
|
-
* newly-received initialization data.
|
|
1107
|
-
* If `false`, it will process them right away.
|
|
1108
|
-
* Set to undefined when it won't ever process them like for example in a
|
|
1109
|
-
* disposed or errored state.
|
|
1110
|
-
*/
|
|
1111
|
-
isInitDataQueueLocked: TIsQueueLocked;
|
|
1112
|
-
/**
|
|
1113
|
-
* If `true`, the `MediaKeys` instance has been attached to the HTMLMediaElement.
|
|
1114
|
-
* If `false`, it hasn't happened yet.
|
|
1115
|
-
* If uncertain or unimportant (for example if the `ContentDecryptor` is an
|
|
1116
|
-
* disposed/errored state, set to `undefined`).
|
|
1117
|
-
*/
|
|
1118
|
-
isMediaKeysAttached: TIsMediaKeyAttached;
|
|
1119
|
-
/** Data stored relative to that state. */
|
|
1120
|
-
data: TData;
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
const enum MediaKeyAttachmentStatus {
|
|
1124
|
-
NotAttached,
|
|
1125
|
-
Pending,
|
|
1126
|
-
Attached,
|
|
1127
|
-
}
|
|
1128
|
-
|
|
1129
|
-
/** ContentDecryptor's internal data when in the `Initializing` state. */
|
|
1130
|
-
type IInitializingStateData = IContentDecryptorStateBase<
|
|
1131
|
-
ContentDecryptorState.Initializing,
|
|
1132
|
-
true, // isInitDataQueueLocked
|
|
1133
|
-
MediaKeyAttachmentStatus.NotAttached, // isMediaKeysAttached
|
|
1134
|
-
null // data
|
|
1135
|
-
>;
|
|
1136
|
-
|
|
1137
|
-
/** ContentDecryptor's internal data when in the `WaitingForAttachment` state. */
|
|
1138
|
-
type IWaitingForAttachmentStateData = IContentDecryptorStateBase<
|
|
1139
|
-
ContentDecryptorState.WaitingForAttachment,
|
|
1140
|
-
true, // isInitDataQueueLocked
|
|
1141
|
-
MediaKeyAttachmentStatus.NotAttached, // isMediaKeysAttached
|
|
1142
|
-
// data
|
|
1143
|
-
{ mediaKeysInfo : IMediaKeysInfos;
|
|
1144
|
-
mediaElement : HTMLMediaElement; }
|
|
1145
|
-
>;
|
|
1146
|
-
|
|
1147
|
-
/**
|
|
1148
|
-
* ContentDecryptor's internal data when in the `ReadyForContent` state before
|
|
1149
|
-
* it has attached the `MediaKeys` to the media element.
|
|
1150
|
-
*/
|
|
1151
|
-
type IReadyForContentStateDataUnattached = IContentDecryptorStateBase<
|
|
1152
|
-
ContentDecryptorState.ReadyForContent,
|
|
1153
|
-
true, // isInitDataQueueLocked
|
|
1154
|
-
MediaKeyAttachmentStatus.NotAttached |
|
|
1155
|
-
MediaKeyAttachmentStatus.Pending, // isMediaKeysAttached
|
|
1156
|
-
{ mediaKeysInfo : IMediaKeysInfos;
|
|
1157
|
-
mediaElement : HTMLMediaElement; } // data
|
|
1158
|
-
>;
|
|
1159
|
-
|
|
1160
|
-
/**
|
|
1161
|
-
* ContentDecryptor's internal data when in the `ReadyForContent` state once
|
|
1162
|
-
* it has attached the `MediaKeys` to the media element.
|
|
1163
|
-
*/
|
|
1164
|
-
type IReadyForContentStateDataAttached = IContentDecryptorStateBase<
|
|
1165
|
-
ContentDecryptorState.ReadyForContent,
|
|
1166
|
-
boolean, // isInitDataQueueLocked
|
|
1167
|
-
MediaKeyAttachmentStatus.Attached, // isMediaKeysAttached
|
|
1168
|
-
{
|
|
1169
|
-
/**
|
|
1170
|
-
* MediaKeys-related information linked to this instance of the
|
|
1171
|
-
* `ContentDecryptor`.
|
|
1172
|
-
* Set to `null` until it is known.
|
|
1173
|
-
* Should be always set when the `ContentDecryptor` has reached the
|
|
1174
|
-
* Initialized state (@see ContentDecryptorState).
|
|
1175
|
-
*/
|
|
1176
|
-
mediaKeysData : IAttachedMediaKeysData;
|
|
1177
|
-
}
|
|
1178
|
-
>;
|
|
1179
|
-
|
|
1180
|
-
/** ContentDecryptor's internal data when in the `Disposed` state. */
|
|
1181
|
-
type IDisposeStateData = IContentDecryptorStateBase<
|
|
1182
|
-
ContentDecryptorState.Disposed,
|
|
1183
|
-
undefined, // isInitDataQueueLocked
|
|
1184
|
-
undefined, // isMediaKeysAttached
|
|
1185
|
-
null // data
|
|
1186
|
-
>;
|
|
1187
|
-
|
|
1188
|
-
/** ContentDecryptor's internal data when in the `Error` state. */
|
|
1189
|
-
type IErrorStateData = IContentDecryptorStateBase<
|
|
1190
|
-
ContentDecryptorState.Error,
|
|
1191
|
-
undefined, // isInitDataQueueLocked
|
|
1192
|
-
undefined, // isMediaKeysAttached
|
|
1193
|
-
null // data
|
|
1194
|
-
>;
|
|
1195
|
-
|
|
1196
|
-
/** Information linked to a session created by the `ContentDecryptor`. */
|
|
1197
|
-
interface IActiveSessionInfo {
|
|
1198
|
-
/**
|
|
1199
|
-
* Record associated to the session.
|
|
1200
|
-
* Most notably, it allows both to identify the session as well as to
|
|
1201
|
-
* anounce and find out which key ids are already handled.
|
|
1202
|
-
*/
|
|
1203
|
-
record : KeySessionRecord;
|
|
1204
|
-
|
|
1205
|
-
/** Current keys' statuses linked that session. */
|
|
1206
|
-
keyStatuses : {
|
|
1207
|
-
/** Key ids linked to keys that are "usable". */
|
|
1208
|
-
whitelisted : Uint8Array[];
|
|
1209
|
-
/**
|
|
1210
|
-
* Key ids linked to keys that are not considered "usable".
|
|
1211
|
-
* Content linked to those keys are not decipherable and may thus be
|
|
1212
|
-
* fallbacked from.
|
|
1213
|
-
*/
|
|
1214
|
-
blacklisted : Uint8Array[];
|
|
1215
|
-
};
|
|
1216
|
-
|
|
1217
|
-
/** Source of the MediaKeySession linked to that record. */
|
|
1218
|
-
source : MediaKeySessionLoadingType;
|
|
1219
|
-
|
|
1220
|
-
/**
|
|
1221
|
-
* If different than `null`, all initialization data compatible with this
|
|
1222
|
-
* processed initialization data has been blacklisted with this corresponding
|
|
1223
|
-
* error.
|
|
1224
|
-
*/
|
|
1225
|
-
blacklistedSessionError : BlacklistedSessionError | null;
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
/**
|
|
1229
|
-
* Sent when the created (or already created) MediaKeys is attached to the
|
|
1230
|
-
* current HTMLMediaElement element.
|
|
1231
|
-
* On some peculiar devices, we have to wait for that step before the first
|
|
1232
|
-
* media segments are to be pushed to avoid issues.
|
|
1233
|
-
* Because this event is sent after a MediaKeys is created, you will always have
|
|
1234
|
-
* a "created-media-keys" event before an "attached-media-keys" event.
|
|
1235
|
-
*/
|
|
1236
|
-
interface IAttachedMediaKeysData {
|
|
1237
|
-
/** The MediaKeySystemAccess which allowed to create the MediaKeys instance. */
|
|
1238
|
-
mediaKeySystemAccess: MediaKeySystemAccess |
|
|
1239
|
-
ICustomMediaKeySystemAccess;
|
|
1240
|
-
/** The MediaKeys instance. */
|
|
1241
|
-
mediaKeys : MediaKeys |
|
|
1242
|
-
ICustomMediaKeys;
|
|
1243
|
-
stores : IMediaKeySessionStores;
|
|
1244
|
-
options : IKeySystemOption;
|
|
1245
|
-
}
|
|
1246
|
-
|