@amazon/vinyl 1.2.0 → 2.0.4
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/dist/index.cjs +9225 -6633
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +9080 -6435
- package/dist/index.js.map +4 -4
- package/dist/test/benchmark.es5.js +266 -253
- package/dist/test/benchmark.js +3256 -3190
- package/dist/test/benchmark.js.map +4 -4
- package/dist/test/integ.es5.js +1404 -1093
- package/dist/test/integ.js +45924 -33873
- package/dist/test/integ.js.map +4 -4
- package/dist/types/current/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/current/ad/AdBreakInfo.d.ts.map +1 -0
- package/dist/types/current/ad/AdController.d.ts +229 -0
- package/dist/types/current/ad/AdController.d.ts.map +1 -0
- package/dist/types/current/ad/AdController.js +19 -0
- package/dist/types/current/ad/AdControllerImpl.d.ts +146 -0
- package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -0
- package/dist/types/current/ad/AdControllerImpl.js +705 -0
- package/dist/types/current/ad/AdError.d.ts +6 -0
- package/dist/types/current/ad/AdError.d.ts.map +1 -0
- package/dist/types/current/ad/AdError.js +14 -0
- package/dist/types/current/ad/AdsProvider.d.ts +28 -0
- package/dist/types/current/ad/AdsProvider.d.ts.map +1 -0
- package/dist/types/current/ad/AdsProvider.js +5 -0
- package/dist/types/current/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/current/ad/defaultAdLoadOptionsResolver.d.ts.map +1 -0
- package/dist/types/current/ad/defaultAdLoadOptionsResolver.js +26 -0
- package/dist/types/current/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/current/ad/discoverHlsInterstitials.d.ts.map +1 -0
- package/dist/types/current/ad/discoverHlsInterstitials.js +246 -0
- package/dist/types/current/drm/DrmController.d.ts +29 -4
- package/dist/types/current/drm/DrmController.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.d.ts +13 -4
- package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.js +85 -14
- package/dist/types/current/drm/util/unpackPlayReadyChallenge.d.ts +5 -0
- package/dist/types/current/drm/util/unpackPlayReadyChallenge.d.ts.map +1 -1
- package/dist/types/current/drm/util/unpackPlayReadyChallenge.js +5 -0
- package/dist/types/current/index.d.ts +151 -126
- package/dist/types/current/index.d.ts.map +1 -1
- package/dist/types/current/index.js +151 -126
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -0
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts.map +1 -1
- package/dist/types/current/playback/PlaybackControllerImpl.js +44 -5
- package/dist/types/current/playback/PlaybackSource.d.ts +1 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.d.ts +6 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.d.ts.map +1 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.js +1 -0
- package/dist/types/current/streaming/ContentStream.d.ts +8 -1
- package/dist/types/current/streaming/ContentStream.d.ts.map +1 -1
- package/dist/types/current/streaming/ContentStream.js +19 -2
- package/dist/types/current/streaming/LoadMetric.d.ts +58 -0
- package/dist/types/current/streaming/LoadMetric.d.ts.map +1 -0
- package/dist/types/current/streaming/LoadMetric.js +5 -0
- package/dist/types/current/streaming/ManifestController.d.ts +16 -1
- package/dist/types/current/streaming/ManifestController.d.ts.map +1 -1
- package/dist/types/current/streaming/ManifestControllerImpl.d.ts +43 -0
- package/dist/types/current/streaming/ManifestControllerImpl.d.ts.map +1 -0
- package/dist/types/current/streaming/ManifestControllerImpl.js +104 -0
- package/dist/types/current/streaming/MediaQualityMetadata.d.ts +16 -0
- package/dist/types/current/streaming/MediaQualityMetadata.d.ts.map +1 -1
- package/dist/types/current/streaming/MediaQualityMetadata.js +6 -0
- package/dist/types/current/streaming/MediaTimeline.d.ts +6 -0
- package/dist/types/current/streaming/MediaTimeline.d.ts.map +1 -1
- package/dist/types/current/streaming/SegmentController.d.ts +5 -0
- package/dist/types/current/streaming/SegmentController.d.ts.map +1 -1
- package/dist/types/current/streaming/SegmentControllerImpl.d.ts +12 -0
- package/dist/types/current/streaming/SegmentControllerImpl.d.ts.map +1 -1
- package/dist/types/current/streaming/SegmentControllerImpl.js +67 -10
- package/dist/types/current/streaming/StreamingEventMap.d.ts +38 -1
- package/dist/types/current/streaming/StreamingEventMap.d.ts.map +1 -1
- package/dist/types/current/streaming/StreamingEventMap.js +4 -0
- package/dist/types/current/streaming/abr/QualitySelectorImpl.d.ts +28 -0
- package/dist/types/current/streaming/abr/QualitySelectorImpl.d.ts.map +1 -1
- package/dist/types/current/streaming/abr/QualitySelectorImpl.js +39 -4
- package/dist/types/current/streaming/buffering/BufferingController.d.ts +37 -0
- package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/BufferingController.js +79 -3
- package/dist/types/current/streaming/buffering/MediaSourceController.d.ts +16 -11
- package/dist/types/current/streaming/buffering/MediaSourceController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/MediaSourceController.js +76 -51
- package/dist/types/current/streaming/buffering/SourceBufferController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/SourceBufferController.js +5 -2
- package/dist/types/current/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/current/streaming/buffering/codecDenylist.d.ts.map +1 -0
- package/dist/types/current/streaming/buffering/codecDenylist.js +62 -0
- package/dist/types/current/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/current/streaming/createAllowedContentTypesValue.d.ts.map +1 -0
- package/dist/types/current/streaming/createAllowedContentTypesValue.js +43 -0
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts +4 -1
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts.map +1 -1
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.js +32 -1
- package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.d.ts.map +1 -0
- package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.js +75 -0
- package/dist/types/current/streaming/mediaTimelineLanguageFilter.d.ts +24 -6
- package/dist/types/current/streaming/mediaTimelineLanguageFilter.d.ts.map +1 -1
- package/dist/types/current/streaming/mediaTimelineLanguageFilter.js +61 -16
- package/dist/types/current/text/SidecarTextTrackController.d.ts +91 -0
- package/dist/types/current/text/SidecarTextTrackController.d.ts.map +1 -0
- package/dist/types/current/text/SidecarTextTrackController.js +237 -0
- package/dist/types/current/text/SidecarTextTrackLoader.d.ts +60 -0
- package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -0
- package/dist/types/current/text/SidecarTextTrackLoader.js +144 -0
- package/dist/types/current/text/TextTrack.d.ts +125 -0
- package/dist/types/current/text/TextTrack.d.ts.map +1 -0
- package/dist/types/current/text/TextTrack.js +9 -0
- package/dist/types/current/text/VttCueStyle.d.ts +41 -0
- package/dist/types/current/text/VttCueStyle.d.ts.map +1 -0
- package/dist/types/current/text/VttCueStyle.js +45 -0
- package/dist/types/current/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/current/text/discoverDashTextTracks.d.ts.map +1 -0
- package/dist/types/current/text/discoverDashTextTracks.js +109 -0
- package/dist/types/current/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/current/text/discoverHlsTextTracks.d.ts.map +1 -0
- package/dist/types/current/text/discoverHlsTextTracks.js +49 -0
- package/dist/types/current/text/parseWebVtt.d.ts +46 -0
- package/dist/types/current/text/parseWebVtt.d.ts.map +1 -0
- package/dist/types/current/text/parseWebVtt.js +120 -0
- package/dist/types/current/text/pickPreferredTextTrack.d.ts +14 -0
- package/dist/types/current/text/pickPreferredTextTrack.d.ts.map +1 -0
- package/dist/types/current/text/pickPreferredTextTrack.js +68 -0
- package/dist/types/current/track/SeekRange.d.ts +9 -0
- package/dist/types/current/track/SeekRange.d.ts.map +1 -0
- package/dist/types/current/track/SeekRange.js +5 -0
- package/dist/types/current/track/Track.d.ts +50 -7
- package/dist/types/current/track/Track.d.ts.map +1 -1
- package/dist/types/current/track/TrackBase.d.ts +30 -29
- package/dist/types/current/track/TrackBase.d.ts.map +1 -1
- package/dist/types/current/track/TrackBase.js +68 -16
- package/dist/types/current/track/TrackController.d.ts +100 -36
- package/dist/types/current/track/TrackController.d.ts.map +1 -1
- package/dist/types/current/track/TrackController.js +368 -115
- package/dist/types/current/track/TrackFactory.d.ts +23 -3
- package/dist/types/current/track/TrackFactory.d.ts.map +1 -1
- package/dist/types/current/track/TrackFactory.js +9 -3
- package/dist/types/current/track/dash/DashManifestController.d.ts +1 -40
- package/dist/types/current/track/dash/DashManifestController.d.ts.map +1 -1
- package/dist/types/current/track/dash/DashManifestController.js +1 -79
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts.map +1 -1
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.js +13 -0
- package/dist/types/current/track/dash/DashTrack.d.ts +4 -5
- package/dist/types/current/track/dash/DashTrack.d.ts.map +1 -1
- package/dist/types/current/track/dash/DashTrack.js +3 -5
- package/dist/types/current/track/dash/buildDashMediaTimeline.d.ts.map +1 -1
- package/dist/types/current/track/dash/buildDashMediaTimeline.js +3 -2
- package/dist/types/current/track/dash/createDashContentTypesValue.js +2 -2
- package/dist/types/current/track/dash/createDashFactories.d.ts +39 -12
- package/dist/types/current/track/dash/createDashFactories.d.ts.map +1 -1
- package/dist/types/current/track/dash/createDashFactories.js +33 -5
- package/dist/types/current/track/dash/createSegmentControllerFactory.d.ts +0 -5
- package/dist/types/current/track/dash/createSegmentControllerFactory.d.ts.map +1 -1
- package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.d.ts.map +1 -1
- package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.js +2 -1
- package/dist/types/current/track/dash/util/mpd.d.ts +10 -0
- package/dist/types/current/track/dash/util/mpd.d.ts.map +1 -1
- package/dist/types/current/track/dash/util/mpd.js +16 -0
- package/dist/types/current/track/hls/HlsManifestController.d.ts +1 -25
- package/dist/types/current/track/hls/HlsManifestController.d.ts.map +1 -1
- package/dist/types/current/track/hls/HlsManifestController.js +1 -68
- package/dist/types/{ts3.7/track/hls/HlsManifestProvider.d.ts → current/track/hls/HlsManifestData.d.ts} +4 -6
- package/dist/types/current/track/hls/HlsManifestData.d.ts.map +1 -0
- package/dist/types/current/track/hls/HlsManifestData.js +5 -0
- package/dist/types/current/track/hls/HlsMediaQualityMetadataResolver.js +9 -6
- package/dist/types/current/track/hls/HlsTrack.d.ts +5 -6
- package/dist/types/current/track/hls/HlsTrack.d.ts.map +1 -1
- package/dist/types/current/track/hls/HlsTrack.js +3 -5
- package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts +8 -1
- package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts.map +1 -1
- package/dist/types/current/track/hls/buildHlsMediaTimeline.js +134 -67
- package/dist/types/current/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
- package/dist/types/current/track/hls/createDefaultHlsManifestTransformer.d.ts.map +1 -1
- package/dist/types/current/track/hls/createHlsContentTypesValue.d.ts +1 -1
- package/dist/types/current/track/hls/createHlsContentTypesValue.d.ts.map +1 -1
- package/dist/types/current/track/hls/createHlsFactories.d.ts +40 -13
- package/dist/types/current/track/hls/createHlsFactories.d.ts.map +1 -1
- package/dist/types/current/track/hls/createHlsFactories.js +35 -6
- package/dist/types/current/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/current/track/hls/createHlsManifestProvider.d.ts.map +1 -0
- package/dist/types/current/track/hls/createHlsManifestProvider.js +9 -0
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts +4 -4
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +22 -3
- package/dist/types/current/track/hls/index.d.ts +1 -1
- package/dist/types/current/track/hls/index.d.ts.map +1 -1
- package/dist/types/current/track/hls/index.js +1 -1
- package/dist/types/current/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/current/track/inferLoadOptionsFromUri.d.ts.map +1 -0
- package/dist/types/current/track/inferLoadOptionsFromUri.js +55 -0
- package/dist/types/current/track/mse/MseTrack.d.ts +66 -8
- package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
- package/dist/types/current/track/mse/MseTrack.js +216 -52
- package/dist/types/current/track/source/SourceObjectTrack.d.ts +2 -2
- package/dist/types/current/track/source/SourceObjectTrack.d.ts.map +1 -1
- package/dist/types/current/track/source/SourceTrack.d.ts +2 -2
- package/dist/types/current/track/source/SourceTrack.d.ts.map +1 -1
- package/dist/types/current/track/source/SourceTrack.js +1 -2
- package/dist/types/current/track/source/SourceTrackBase.d.ts +7 -5
- package/dist/types/current/track/source/SourceTrackBase.d.ts.map +1 -1
- package/dist/types/current/track/source/SourceTrackBase.js +26 -9
- package/dist/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/types/current/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/current/util/media/codecOverrides.d.ts.map +1 -0
- package/dist/types/current/util/media/codecOverrides.js +37 -0
- package/dist/types/current/util/media/codecSupport.d.ts +6 -0
- package/dist/types/current/util/media/codecSupport.d.ts.map +1 -0
- package/dist/types/current/util/media/codecSupport.js +17 -0
- package/dist/types/current/util/media/mediaSource.d.ts +5 -0
- package/dist/types/current/util/media/mediaSource.d.ts.map +1 -1
- package/dist/types/current/util/media/mediaSource.js +6 -1
- package/dist/types/current/vinyl/ReadonlyPlaybackStreamingState.d.ts +9 -2
- package/dist/types/current/vinyl/ReadonlyPlaybackStreamingState.d.ts.map +1 -1
- package/dist/types/current/vinyl/VinylDeps.d.ts +5 -0
- package/dist/types/current/vinyl/VinylDeps.d.ts.map +1 -1
- package/dist/types/current/vinyl/VinylOptions.d.ts +68 -4
- package/dist/types/current/vinyl/VinylOptions.d.ts.map +1 -1
- package/dist/types/current/vinyl/VinylOptions.js +17 -2
- package/dist/types/current/vinyl/VinylPlayer.d.ts +63 -4
- package/dist/types/current/vinyl/VinylPlayer.d.ts.map +1 -1
- package/dist/types/current/vinyl/VinylPlayer.js +216 -36
- package/dist/types/current/vinyl/createVinylFactories.d.ts +55 -12
- package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
- package/dist/types/current/vinyl/createVinylFactories.js +4 -0
- package/dist/types/ts3.7/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/ts3.7/ad/AdController.d.ts +243 -0
- package/dist/types/ts3.7/ad/AdControllerImpl.d.ts +146 -0
- package/dist/types/ts3.7/ad/AdError.d.ts +6 -0
- package/dist/types/ts3.7/ad/AdsProvider.d.ts +28 -0
- package/dist/types/ts3.7/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/ts3.7/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/ts3.7/drm/DrmController.d.ts +29 -4
- package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +13 -4
- package/dist/types/ts3.7/drm/util/unpackPlayReadyChallenge.d.ts +5 -0
- package/dist/types/ts3.7/index.d.ts +151 -126
- package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -0
- package/dist/types/ts3.7/playback/PlaybackSource.d.ts +1 -1
- package/dist/types/ts3.7/playback/ReadonlyPlaybackController.d.ts +6 -0
- package/dist/types/ts3.7/streaming/ContentStream.d.ts +8 -1
- package/dist/types/ts3.7/streaming/LoadMetric.d.ts +58 -0
- package/dist/types/ts3.7/streaming/ManifestController.d.ts +16 -1
- package/dist/types/ts3.7/streaming/ManifestControllerImpl.d.ts +40 -0
- package/dist/types/ts3.7/streaming/MediaQualityMetadata.d.ts +19 -0
- package/dist/types/ts3.7/streaming/MediaTimeline.d.ts +6 -0
- package/dist/types/ts3.7/streaming/SegmentController.d.ts +5 -0
- package/dist/types/ts3.7/streaming/SegmentControllerImpl.d.ts +12 -0
- package/dist/types/ts3.7/streaming/StreamingEventMap.d.ts +42 -1
- package/dist/types/ts3.7/streaming/abr/QualitySelectorImpl.d.ts +28 -0
- package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +37 -0
- package/dist/types/ts3.7/streaming/buffering/MediaSourceController.d.ts +16 -11
- package/dist/types/ts3.7/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/ts3.7/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/ts3.7/streaming/createDefaultMediaTimelineTransformer.d.ts +4 -1
- package/dist/types/ts3.7/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/ts3.7/streaming/mediaTimelineLanguageFilter.d.ts +24 -6
- package/dist/types/ts3.7/text/SidecarTextTrackController.d.ts +91 -0
- package/dist/types/ts3.7/text/SidecarTextTrackLoader.d.ts +60 -0
- package/dist/types/ts3.7/text/TextTrack.d.ts +129 -0
- package/dist/types/ts3.7/text/VttCueStyle.d.ts +41 -0
- package/dist/types/ts3.7/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/ts3.7/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/ts3.7/text/parseWebVtt.d.ts +46 -0
- package/dist/types/ts3.7/text/pickPreferredTextTrack.d.ts +14 -0
- package/dist/types/ts3.7/track/SeekRange.d.ts +9 -0
- package/dist/types/ts3.7/track/Track.d.ts +50 -7
- package/dist/types/ts3.7/track/TrackBase.d.ts +21 -29
- package/dist/types/ts3.7/track/TrackController.d.ts +102 -37
- package/dist/types/ts3.7/track/TrackFactory.d.ts +22 -2
- package/dist/types/ts3.7/track/dash/DashManifestController.d.ts +1 -36
- package/dist/types/ts3.7/track/dash/DashTrack.d.ts +4 -5
- package/dist/types/ts3.7/track/dash/createDashFactories.d.ts +39 -12
- package/dist/types/ts3.7/track/dash/createSegmentControllerFactory.d.ts +0 -5
- package/dist/types/ts3.7/track/dash/util/mpd.d.ts +10 -0
- package/dist/types/ts3.7/track/hls/HlsManifestController.d.ts +1 -22
- package/dist/types/{current/track/hls/HlsManifestProvider.d.ts → ts3.7/track/hls/HlsManifestData.d.ts} +4 -6
- package/dist/types/ts3.7/track/hls/HlsTrack.d.ts +5 -6
- package/dist/types/ts3.7/track/hls/buildHlsMediaTimeline.d.ts +8 -1
- package/dist/types/ts3.7/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
- package/dist/types/ts3.7/track/hls/createHlsContentTypesValue.d.ts +1 -1
- package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +40 -13
- package/dist/types/ts3.7/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/ts3.7/track/hls/createUrlHlsManifestProvider.d.ts +4 -4
- package/dist/types/ts3.7/track/hls/index.d.ts +1 -1
- package/dist/types/ts3.7/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/ts3.7/track/mse/MseTrack.d.ts +65 -7
- package/dist/types/ts3.7/track/source/SourceObjectTrack.d.ts +2 -2
- package/dist/types/ts3.7/track/source/SourceTrack.d.ts +2 -2
- package/dist/types/ts3.7/track/source/SourceTrackBase.d.ts +7 -5
- package/dist/types/ts3.7/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/ts3.7/util/media/codecSupport.d.ts +6 -0
- package/dist/types/ts3.7/util/media/mediaSource.d.ts +5 -0
- package/dist/types/ts3.7/vinyl/ReadonlyPlaybackStreamingState.d.ts +9 -2
- package/dist/types/ts3.7/vinyl/VinylDeps.d.ts +5 -0
- package/dist/types/ts3.7/vinyl/VinylOptions.d.ts +68 -4
- package/dist/types/ts3.7/vinyl/VinylPlayer.d.ts +33 -4
- package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +55 -12
- package/dist/types/ts4.1/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/ts4.1/ad/AdController.d.ts +243 -0
- package/dist/types/ts4.1/ad/AdControllerImpl.d.ts +146 -0
- package/dist/types/ts4.1/ad/AdError.d.ts +6 -0
- package/dist/types/ts4.1/ad/AdsProvider.d.ts +28 -0
- package/dist/types/ts4.1/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/ts4.1/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/ts4.1/drm/DrmController.d.ts +29 -4
- package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +13 -4
- package/dist/types/ts4.1/drm/util/unpackPlayReadyChallenge.d.ts +5 -0
- package/dist/types/ts4.1/index.d.ts +151 -126
- package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -0
- package/dist/types/ts4.1/playback/PlaybackSource.d.ts +1 -1
- package/dist/types/ts4.1/playback/ReadonlyPlaybackController.d.ts +6 -0
- package/dist/types/ts4.1/streaming/ContentStream.d.ts +8 -1
- package/dist/types/ts4.1/streaming/LoadMetric.d.ts +58 -0
- package/dist/types/ts4.1/streaming/ManifestController.d.ts +16 -1
- package/dist/types/ts4.1/streaming/ManifestControllerImpl.d.ts +40 -0
- package/dist/types/ts4.1/streaming/MediaQualityMetadata.d.ts +19 -0
- package/dist/types/ts4.1/streaming/MediaTimeline.d.ts +6 -0
- package/dist/types/ts4.1/streaming/SegmentController.d.ts +5 -0
- package/dist/types/ts4.1/streaming/SegmentControllerImpl.d.ts +12 -0
- package/dist/types/ts4.1/streaming/StreamingEventMap.d.ts +42 -1
- package/dist/types/ts4.1/streaming/abr/QualitySelectorImpl.d.ts +28 -0
- package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +37 -0
- package/dist/types/ts4.1/streaming/buffering/MediaSourceController.d.ts +16 -11
- package/dist/types/ts4.1/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/ts4.1/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/ts4.1/streaming/createDefaultMediaTimelineTransformer.d.ts +4 -1
- package/dist/types/ts4.1/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/ts4.1/streaming/mediaTimelineLanguageFilter.d.ts +24 -6
- package/dist/types/ts4.1/text/SidecarTextTrackController.d.ts +92 -0
- package/dist/types/ts4.1/text/SidecarTextTrackLoader.d.ts +60 -0
- package/dist/types/ts4.1/text/TextTrack.d.ts +129 -0
- package/dist/types/ts4.1/text/VttCueStyle.d.ts +41 -0
- package/dist/types/ts4.1/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/ts4.1/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/ts4.1/text/parseWebVtt.d.ts +46 -0
- package/dist/types/ts4.1/text/pickPreferredTextTrack.d.ts +14 -0
- package/dist/types/ts4.1/track/SeekRange.d.ts +9 -0
- package/dist/types/ts4.1/track/Track.d.ts +50 -7
- package/dist/types/ts4.1/track/TrackBase.d.ts +21 -29
- package/dist/types/ts4.1/track/TrackController.d.ts +102 -37
- package/dist/types/ts4.1/track/TrackFactory.d.ts +22 -2
- package/dist/types/ts4.1/track/dash/DashManifestController.d.ts +1 -36
- package/dist/types/ts4.1/track/dash/DashTrack.d.ts +4 -5
- package/dist/types/ts4.1/track/dash/createDashFactories.d.ts +39 -12
- package/dist/types/ts4.1/track/dash/createSegmentControllerFactory.d.ts +0 -5
- package/dist/types/ts4.1/track/dash/util/mpd.d.ts +10 -0
- package/dist/types/ts4.1/track/hls/HlsManifestController.d.ts +1 -22
- package/dist/types/ts4.1/track/hls/{HlsManifestProvider.d.ts → HlsManifestData.d.ts} +4 -6
- package/dist/types/ts4.1/track/hls/HlsTrack.d.ts +5 -6
- package/dist/types/ts4.1/track/hls/buildHlsMediaTimeline.d.ts +8 -1
- package/dist/types/ts4.1/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
- package/dist/types/ts4.1/track/hls/createHlsContentTypesValue.d.ts +1 -1
- package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +41 -13
- package/dist/types/ts4.1/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/ts4.1/track/hls/createUrlHlsManifestProvider.d.ts +4 -4
- package/dist/types/ts4.1/track/hls/index.d.ts +1 -1
- package/dist/types/ts4.1/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/ts4.1/track/mse/MseTrack.d.ts +65 -7
- package/dist/types/ts4.1/track/source/SourceObjectTrack.d.ts +2 -2
- package/dist/types/ts4.1/track/source/SourceTrack.d.ts +2 -2
- package/dist/types/ts4.1/track/source/SourceTrackBase.d.ts +7 -5
- package/dist/types/ts4.1/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/ts4.1/util/media/codecSupport.d.ts +6 -0
- package/dist/types/ts4.1/util/media/mediaSource.d.ts +5 -0
- package/dist/types/ts4.1/vinyl/ReadonlyPlaybackStreamingState.d.ts +9 -2
- package/dist/types/ts4.1/vinyl/VinylDeps.d.ts +5 -0
- package/dist/types/ts4.1/vinyl/VinylOptions.d.ts +68 -4
- package/dist/types/ts4.1/vinyl/VinylPlayer.d.ts +33 -4
- package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +56 -12
- package/dist/types/ts4.7/ad/AdBreakInfo.d.ts +160 -0
- package/dist/types/ts4.7/ad/AdController.d.ts +243 -0
- package/dist/types/ts4.7/ad/AdControllerImpl.d.ts +146 -0
- package/dist/types/ts4.7/ad/AdError.d.ts +6 -0
- package/dist/types/ts4.7/ad/AdsProvider.d.ts +28 -0
- package/dist/types/ts4.7/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
- package/dist/types/ts4.7/ad/discoverHlsInterstitials.d.ts +22 -0
- package/dist/types/ts4.7/drm/DrmController.d.ts +29 -4
- package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +13 -4
- package/dist/types/ts4.7/drm/util/unpackPlayReadyChallenge.d.ts +5 -0
- package/dist/types/ts4.7/index.d.ts +151 -126
- package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -0
- package/dist/types/ts4.7/playback/PlaybackSource.d.ts +1 -1
- package/dist/types/ts4.7/playback/ReadonlyPlaybackController.d.ts +6 -0
- package/dist/types/ts4.7/streaming/ContentStream.d.ts +8 -1
- package/dist/types/ts4.7/streaming/LoadMetric.d.ts +58 -0
- package/dist/types/ts4.7/streaming/ManifestController.d.ts +16 -1
- package/dist/types/ts4.7/streaming/ManifestControllerImpl.d.ts +43 -0
- package/dist/types/ts4.7/streaming/MediaQualityMetadata.d.ts +19 -0
- package/dist/types/ts4.7/streaming/MediaTimeline.d.ts +6 -0
- package/dist/types/ts4.7/streaming/SegmentController.d.ts +5 -0
- package/dist/types/ts4.7/streaming/SegmentControllerImpl.d.ts +12 -0
- package/dist/types/ts4.7/streaming/StreamingEventMap.d.ts +42 -1
- package/dist/types/ts4.7/streaming/abr/QualitySelectorImpl.d.ts +28 -0
- package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +37 -0
- package/dist/types/ts4.7/streaming/buffering/MediaSourceController.d.ts +16 -11
- package/dist/types/ts4.7/streaming/buffering/codecDenylist.d.ts +23 -0
- package/dist/types/ts4.7/streaming/createAllowedContentTypesValue.d.ts +30 -0
- package/dist/types/ts4.7/streaming/createDefaultMediaTimelineTransformer.d.ts +4 -1
- package/dist/types/ts4.7/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
- package/dist/types/ts4.7/streaming/mediaTimelineLanguageFilter.d.ts +24 -6
- package/dist/types/ts4.7/text/SidecarTextTrackController.d.ts +91 -0
- package/dist/types/ts4.7/text/SidecarTextTrackLoader.d.ts +60 -0
- package/dist/types/ts4.7/text/TextTrack.d.ts +129 -0
- package/dist/types/ts4.7/text/VttCueStyle.d.ts +41 -0
- package/dist/types/ts4.7/text/discoverDashTextTracks.d.ts +24 -0
- package/dist/types/ts4.7/text/discoverHlsTextTracks.d.ts +19 -0
- package/dist/types/ts4.7/text/parseWebVtt.d.ts +46 -0
- package/dist/types/ts4.7/text/pickPreferredTextTrack.d.ts +14 -0
- package/dist/types/ts4.7/track/SeekRange.d.ts +9 -0
- package/dist/types/ts4.7/track/Track.d.ts +50 -7
- package/dist/types/ts4.7/track/TrackBase.d.ts +30 -29
- package/dist/types/ts4.7/track/TrackController.d.ts +102 -37
- package/dist/types/ts4.7/track/TrackFactory.d.ts +23 -3
- package/dist/types/ts4.7/track/dash/DashManifestController.d.ts +1 -40
- package/dist/types/ts4.7/track/dash/DashTrack.d.ts +4 -5
- package/dist/types/ts4.7/track/dash/createDashFactories.d.ts +39 -12
- package/dist/types/ts4.7/track/dash/createSegmentControllerFactory.d.ts +0 -5
- package/dist/types/ts4.7/track/dash/util/mpd.d.ts +10 -0
- package/dist/types/ts4.7/track/hls/HlsManifestController.d.ts +1 -25
- package/dist/types/ts4.7/track/hls/{HlsManifestProvider.d.ts → HlsManifestData.d.ts} +4 -6
- package/dist/types/ts4.7/track/hls/HlsTrack.d.ts +5 -6
- package/dist/types/ts4.7/track/hls/buildHlsMediaTimeline.d.ts +8 -1
- package/dist/types/ts4.7/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
- package/dist/types/ts4.7/track/hls/createHlsContentTypesValue.d.ts +1 -1
- package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +40 -13
- package/dist/types/ts4.7/track/hls/createHlsManifestProvider.d.ts +6 -0
- package/dist/types/ts4.7/track/hls/createUrlHlsManifestProvider.d.ts +4 -4
- package/dist/types/ts4.7/track/hls/index.d.ts +1 -1
- package/dist/types/ts4.7/track/inferLoadOptionsFromUri.d.ts +15 -0
- package/dist/types/ts4.7/track/mse/MseTrack.d.ts +66 -8
- package/dist/types/ts4.7/track/source/SourceObjectTrack.d.ts +2 -2
- package/dist/types/ts4.7/track/source/SourceTrack.d.ts +2 -2
- package/dist/types/ts4.7/track/source/SourceTrackBase.d.ts +7 -5
- package/dist/types/ts4.7/util/media/codecOverrides.d.ts +33 -0
- package/dist/types/ts4.7/util/media/codecSupport.d.ts +6 -0
- package/dist/types/ts4.7/util/media/mediaSource.d.ts +5 -0
- package/dist/types/ts4.7/vinyl/ReadonlyPlaybackStreamingState.d.ts +9 -2
- package/dist/types/ts4.7/vinyl/VinylDeps.d.ts +5 -0
- package/dist/types/ts4.7/vinyl/VinylOptions.d.ts +68 -4
- package/dist/types/ts4.7/vinyl/VinylPlayer.d.ts +63 -4
- package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +55 -12
- package/dist/unit/types/current/ad/AdController.test.d.ts +2 -0
- package/dist/unit/types/current/ad/AdController.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/AdController.test.js +10 -0
- package/dist/unit/types/current/ad/AdControllerImpl.test.d.ts +2 -0
- package/dist/unit/types/current/ad/AdControllerImpl.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/AdControllerImpl.test.js +1456 -0
- package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.d.ts +2 -0
- package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.js +56 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.d.ts +2 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.d.ts.map +1 -0
- package/dist/unit/types/current/ad/discoverHlsInterstitials.test.js +756 -0
- package/dist/unit/types/current/drm/DrmControllerImpl.test.js +205 -4
- package/dist/unit/types/current/index.d.ts +117 -98
- package/dist/unit/types/current/index.d.ts.map +1 -1
- package/dist/unit/types/current/index.js +117 -98
- package/dist/unit/types/current/playback/PlaybackControllerImpl.test.js +92 -3
- package/dist/unit/types/current/streaming/ContentStream.test.js +11 -0
- package/dist/unit/types/current/streaming/ManifestControllerImpl.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/ManifestControllerImpl.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/ManifestControllerImpl.test.js +197 -0
- package/dist/unit/types/current/streaming/MediaTimeline.test.js +2 -0
- package/dist/unit/types/current/streaming/MseTrack.test.js +478 -14
- package/dist/unit/types/current/streaming/SegmentControllerImpl.test.js +66 -0
- package/dist/unit/types/current/streaming/StreamingEventMap.test.js +2 -2
- package/dist/unit/types/current/streaming/abr/QualitySelectorImpl.test.js +110 -0
- package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +123 -21
- package/dist/unit/types/current/streaming/buffering/MediaSourceController.test.js +37 -10
- package/dist/unit/types/current/streaming/buffering/SourceBufferController.test.js +4 -0
- package/dist/unit/types/current/streaming/buffering/codecDenylist.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/buffering/codecDenylist.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/buffering/codecDenylist.test.js +56 -0
- package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.js +77 -0
- package/dist/unit/types/current/streaming/createDefaultMediaTimelineTransformer.test.js +144 -2
- package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.d.ts +2 -0
- package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.d.ts.map +1 -0
- package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.js +99 -0
- package/dist/unit/types/current/streaming/mediaTimelineFilter.test.js +9 -0
- package/dist/unit/types/current/streaming/mediaTimelineLanguageFilter.test.js +92 -3
- package/dist/unit/types/current/text/SidecarTextTrackController.test.d.ts +2 -0
- package/dist/unit/types/current/text/SidecarTextTrackController.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/SidecarTextTrackController.test.js +587 -0
- package/dist/unit/types/current/text/SidecarTextTrackLoader.test.d.ts +2 -0
- package/dist/unit/types/current/text/SidecarTextTrackLoader.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/SidecarTextTrackLoader.test.js +336 -0
- package/dist/unit/types/current/text/VttCueStyle.test.d.ts +2 -0
- package/dist/unit/types/current/text/VttCueStyle.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/VttCueStyle.test.js +76 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.d.ts +2 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/discoverDashTextTracks.test.js +199 -0
- package/dist/unit/types/current/text/discoverHlsTextTracks.test.d.ts +2 -0
- package/dist/unit/types/current/text/discoverHlsTextTracks.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/discoverHlsTextTracks.test.js +177 -0
- package/dist/unit/types/current/text/parseWebVtt.test.d.ts +2 -0
- package/dist/unit/types/current/text/parseWebVtt.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/parseWebVtt.test.js +212 -0
- package/dist/unit/types/current/text/pickPreferredTextTrack.test.d.ts +2 -0
- package/dist/unit/types/current/text/pickPreferredTextTrack.test.d.ts.map +1 -0
- package/dist/unit/types/current/text/pickPreferredTextTrack.test.js +67 -0
- package/dist/unit/types/current/track/TrackBase.test.js +50 -5
- package/dist/unit/types/current/track/TrackController.test.js +712 -109
- package/dist/unit/types/current/track/TrackFactory.test.js +13 -25
- package/dist/unit/types/current/track/dash/createDashContentStreamFactories.test.js +1 -0
- package/dist/unit/types/current/track/dash/createDashFactories.test.js +63 -2
- package/dist/unit/types/current/track/dash/createSegmentControllerFactory.test.js +1 -0
- package/dist/unit/types/current/track/dash/util/mpd.test.js +24 -1
- package/dist/unit/types/current/track/hls/HlsManifestController.test.js +4 -4
- package/dist/unit/types/current/track/hls/HlsMediaQualityMetadataResolver.test.js +4 -2
- package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +260 -14
- package/dist/unit/types/current/track/hls/createHlsContentStreamFactories.test.js +1 -0
- package/dist/unit/types/current/track/hls/createHlsFactories.test.js +182 -4
- package/dist/unit/types/current/track/hls/createUrlHlsManifestProvider.test.js +19 -0
- package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.d.ts +2 -0
- package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.d.ts.map +1 -0
- package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.js +165 -0
- package/dist/unit/types/current/track/source/SourceTrack.test.js +5 -0
- package/dist/unit/types/current/track/source/SourceTrackBase.test.js +24 -3
- package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/unit/types/current/util/media/codecOverrides.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/codecOverrides.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/codecOverrides.test.js +42 -0
- package/dist/unit/types/current/util/media/codecSupport.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/codecSupport.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/codecSupport.test.js +26 -0
- package/dist/unit/types/current/util/media/mediaSource.test.js +6 -0
- package/dist/unit/types/current/vinyl/VinylPlayer.test.js +177 -75
- package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.d.ts +2 -0
- package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.d.ts.map +1 -0
- package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.js +142 -0
- package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.d.ts +2 -0
- package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.d.ts.map +1 -0
- package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.js +263 -0
- package/dist/vinylTestUtil/index.js +2393 -2232
- package/dist/vinylTestUtil/index.js.map +4 -4
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts +14 -0
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.js +49 -30
- package/dist/vinylTestUtil/types/current/index.d.ts +53 -51
- package/dist/vinylTestUtil/types/current/index.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/index.js +53 -51
- package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.d.ts.map +1 -0
- package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.js +26 -0
- package/dist/vinylTestUtil/types/current/mock/dash/MockDashManifestController.d.ts +8 -1
- package/dist/vinylTestUtil/types/current/mock/dash/MockDashManifestController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/dash/MockDashManifestController.js +15 -0
- package/dist/vinylTestUtil/types/current/mock/dash/mockDashManifest.d.ts +12 -12
- package/dist/vinylTestUtil/types/current/mock/drm/MockDrmController.d.ts +2 -2
- package/dist/vinylTestUtil/types/current/mock/drm/MockDrmController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/hls/MockHlsManifestController.d.ts +7 -1
- package/dist/vinylTestUtil/types/current/mock/hls/MockHlsManifestController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/hls/MockHlsManifestController.js +12 -0
- package/dist/vinylTestUtil/types/current/mock/hls/mockHlsManifest.d.ts +3 -3
- package/dist/vinylTestUtil/types/current/mock/hls/mockHlsManifest.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/hls/mockHlsManifest.js +1 -0
- package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.d.ts +8 -0
- package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.js +17 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts +2 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.js +1 -0
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts +1 -0
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.js +1 -0
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockMediaSourceController.d.ts +2 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockMediaSourceController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockMediaSourceController.js +2 -1
- package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts.map +1 -0
- package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.js +14 -0
- package/dist/vinylTestUtil/types/current/mock/track/MockTrack.d.ts +13 -4
- package/dist/vinylTestUtil/types/current/mock/track/MockTrack.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/track/MockTrack.js +11 -0
- package/dist/vinylTestUtil/types/current/mock/track/MockTrackController.d.ts +3 -2
- package/dist/vinylTestUtil/types/current/mock/track/MockTrackController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/track/MockTrackController.js +2 -1
- package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.d.ts +6 -0
- package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.js +8 -1
- package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.d.ts +4 -0
- package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.js +6 -1
- package/dist/vinylTestUtil/types/current/player/createVinylSuite.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/player/createVinylSuite.js +18 -7
- package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/eventPromises.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/eventPromises.js +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.js +5 -2
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackPlays.js +3 -3
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackPlaysUntil.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackPlaysUntil.js +11 -7
- package/dist/vinylTestUtil/types/ts3.7/assets/vinylTestAssets.d.ts +14 -0
- package/dist/vinylTestUtil/types/ts3.7/index.d.ts +53 -51
- package/dist/vinylTestUtil/types/ts3.7/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/dash/MockDashManifestController.d.ts +8 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/dash/mockDashManifest.d.ts +12 -12
- package/dist/vinylTestUtil/types/ts3.7/mock/drm/MockDrmController.d.ts +2 -2
- package/dist/vinylTestUtil/types/ts3.7/mock/hls/MockHlsManifestController.d.ts +7 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/hls/mockHlsManifest.d.ts +3 -3
- package/dist/vinylTestUtil/types/ts3.7/mock/player/MockVinylPlayerDependencies.d.ts +8 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/MockContentStream.d.ts +2 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockBufferingController.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockMediaSourceController.d.ts +2 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/track/MockTrack.d.ts +13 -4
- package/dist/vinylTestUtil/types/ts3.7/mock/track/MockTrackController.d.ts +3 -2
- package/dist/vinylTestUtil/types/ts3.7/mock/track/dash/createMockDashDependencies.d.ts +6 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/track/hls/createMockHlsDependencies.d.ts +4 -0
- package/dist/vinylTestUtil/types/ts4.1/assets/vinylTestAssets.d.ts +14 -0
- package/dist/vinylTestUtil/types/ts4.1/index.d.ts +53 -51
- package/dist/vinylTestUtil/types/ts4.1/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/dash/MockDashManifestController.d.ts +8 -1
- package/dist/vinylTestUtil/types/ts4.1/mock/dash/mockDashManifest.d.ts +12 -12
- package/dist/vinylTestUtil/types/ts4.1/mock/drm/MockDrmController.d.ts +2 -2
- package/dist/vinylTestUtil/types/ts4.1/mock/hls/MockHlsManifestController.d.ts +7 -1
- package/dist/vinylTestUtil/types/ts4.1/mock/hls/mockHlsManifest.d.ts +3 -3
- package/dist/vinylTestUtil/types/ts4.1/mock/player/MockVinylPlayerDependencies.d.ts +8 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/MockContentStream.d.ts +2 -1
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockBufferingController.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockMediaSourceController.d.ts +2 -1
- package/dist/vinylTestUtil/types/ts4.1/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/track/MockTrack.d.ts +13 -4
- package/dist/vinylTestUtil/types/ts4.1/mock/track/MockTrackController.d.ts +3 -2
- package/dist/vinylTestUtil/types/ts4.1/mock/track/dash/createMockDashDependencies.d.ts +6 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/track/hls/createMockHlsDependencies.d.ts +4 -0
- package/dist/vinylTestUtil/types/ts4.7/assets/vinylTestAssets.d.ts +14 -0
- package/dist/vinylTestUtil/types/ts4.7/index.d.ts +53 -51
- package/dist/vinylTestUtil/types/ts4.7/mock/ad/MockAdController.d.ts +15 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/dash/MockDashManifestController.d.ts +8 -1
- package/dist/vinylTestUtil/types/ts4.7/mock/dash/mockDashManifest.d.ts +12 -12
- package/dist/vinylTestUtil/types/ts4.7/mock/drm/MockDrmController.d.ts +2 -2
- package/dist/vinylTestUtil/types/ts4.7/mock/hls/MockHlsManifestController.d.ts +7 -1
- package/dist/vinylTestUtil/types/ts4.7/mock/hls/mockHlsManifest.d.ts +3 -3
- package/dist/vinylTestUtil/types/ts4.7/mock/player/MockVinylPlayerDependencies.d.ts +8 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/MockContentStream.d.ts +2 -1
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockBufferingController.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockMediaSourceController.d.ts +2 -1
- package/dist/vinylTestUtil/types/ts4.7/mock/text/MockTextTrackController.d.ts +10 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/track/MockTrack.d.ts +13 -4
- package/dist/vinylTestUtil/types/ts4.7/mock/track/MockTrackController.d.ts +3 -2
- package/dist/vinylTestUtil/types/ts4.7/mock/track/dash/createMockDashDependencies.d.ts +6 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/track/hls/createMockHlsDependencies.d.ts +4 -0
- package/docs/ADS.md +264 -0
- package/docs/USAGE.md +142 -9
- package/package.json +18 -18
- package/dist/types/current/track/hls/HlsManifestProvider.d.ts.map +0 -1
- package/dist/unit/types/current/track/dash/DashManifestController.test.d.ts +0 -2
- package/dist/unit/types/current/track/dash/DashManifestController.test.d.ts.map +0 -1
- package/dist/unit/types/current/track/dash/DashManifestController.test.js +0 -186
- /package/dist/types/current/{track/hls/HlsManifestProvider.js → ad/AdBreakInfo.js} +0 -0
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import { TrackControllerImpl, trackPriority, } from '@amazon/vinyl';
|
|
6
|
-
import { createShortUid, DisposedError, } from '@amazon/vinyl-util';
|
|
7
|
-
import { MockPlaybackController, MockTrack, MockTrackFactory, } from '@amazon/vinyl/vinylTestUtil';
|
|
6
|
+
import { clone, createShortUid, DisposedError, } from '@amazon/vinyl-util';
|
|
7
|
+
import { MockAdController, MockPlaybackController, MockTrack, MockTrackFactory, } from '@amazon/vinyl/vinylTestUtil';
|
|
8
8
|
import { createEventSpy } from '@amazon/vinyl-util/testUtil';
|
|
9
9
|
import { expectIterableEquals, expectTypeStrictlyEquals, useMockTime, } from '@amazon/vinyl-util/browserTestUtil';
|
|
10
10
|
var objectContaining = jasmine.objectContaining;
|
|
11
11
|
var any = jasmine.any;
|
|
12
|
-
var createSpy = jasmine.createSpy;
|
|
13
12
|
describe('TrackControllerImpl', () => {
|
|
14
13
|
let deps;
|
|
15
14
|
let trackController;
|
|
@@ -22,6 +21,10 @@ describe('TrackControllerImpl', () => {
|
|
|
22
21
|
deps = {
|
|
23
22
|
playbackController: new MockPlaybackController(),
|
|
24
23
|
trackFactory: new MockTrackFactory(),
|
|
24
|
+
adController: new MockAdController(),
|
|
25
|
+
adTrackLoadOptionsProvider: (ad) => ad.uri === 'unresolvable'
|
|
26
|
+
? Promise.reject(new Error('cannot resolve ad'))
|
|
27
|
+
: Promise.resolve({ uri: ad.uri ?? 'ad', type: '' }),
|
|
25
28
|
};
|
|
26
29
|
trackCount = 0;
|
|
27
30
|
deps.trackFactory.createTrack.and.callFake((options) => {
|
|
@@ -29,6 +32,9 @@ describe('TrackControllerImpl', () => {
|
|
|
29
32
|
trackCount++;
|
|
30
33
|
track.implementActivateFakes();
|
|
31
34
|
track.uri = options.uri;
|
|
35
|
+
// A non-null (empty) ads value marks the track's ads as resolved so
|
|
36
|
+
// the controller activates it. `null` means "ads still loading".
|
|
37
|
+
track.ads = { trackUri: options.uri, adBreaks: [] };
|
|
32
38
|
track.dispose.and.callFake(() => {
|
|
33
39
|
if (track.disposed)
|
|
34
40
|
throw new DisposedError();
|
|
@@ -82,7 +88,6 @@ describe('TrackControllerImpl', () => {
|
|
|
82
88
|
});
|
|
83
89
|
expect(trackController.options).toEqual({
|
|
84
90
|
trackPrefetchCount: 2,
|
|
85
|
-
loadTimeout: 60,
|
|
86
91
|
preloadCapacity: 2,
|
|
87
92
|
});
|
|
88
93
|
trackController.dispose();
|
|
@@ -95,16 +100,13 @@ describe('TrackControllerImpl', () => {
|
|
|
95
100
|
});
|
|
96
101
|
expect(trackController.options).toEqual({
|
|
97
102
|
trackPrefetchCount: 7,
|
|
98
|
-
loadTimeout: 60,
|
|
99
103
|
preloadCapacity: 2,
|
|
100
104
|
});
|
|
101
105
|
trackController.configure({
|
|
102
|
-
loadTimeout: 20,
|
|
103
106
|
preloadCapacity: 3,
|
|
104
107
|
});
|
|
105
108
|
expect(trackController.options).toEqual({
|
|
106
109
|
trackPrefetchCount: 7,
|
|
107
|
-
loadTimeout: 20,
|
|
108
110
|
preloadCapacity: 3,
|
|
109
111
|
});
|
|
110
112
|
});
|
|
@@ -188,19 +190,22 @@ describe('TrackControllerImpl', () => {
|
|
|
188
190
|
trackController.load(...loadOptionsList);
|
|
189
191
|
expect(trackController.queue).toEqual(loadOptionsList.slice(1));
|
|
190
192
|
});
|
|
191
|
-
it('activates the first track', () => {
|
|
193
|
+
it('activates the first track', async () => {
|
|
192
194
|
const loadOptions1 = createLoadOptionsList(2);
|
|
193
195
|
trackController.load(...loadOptions1);
|
|
194
|
-
|
|
195
|
-
|
|
196
|
+
// Content activation is deferred behind the async enterPreroll check.
|
|
197
|
+
await clock.tick();
|
|
198
|
+
expect(trackController.activeTrack?.uri).toBe(loadOptions1[0].uri);
|
|
199
|
+
const track1 = trackController.activeTrack;
|
|
196
200
|
expect(track1.activate).toHaveBeenCalledWith({});
|
|
197
201
|
const loadOptions2 = createLoadOptionsList(2);
|
|
198
202
|
const config1 = { extra: 3 };
|
|
199
203
|
loadOptions2[0].config = config1;
|
|
200
204
|
trackController.load(...loadOptions2);
|
|
201
|
-
|
|
202
|
-
expect(trackController.
|
|
203
|
-
|
|
205
|
+
await clock.tick();
|
|
206
|
+
expect(trackController.activeTrack?.uri).not.toBe(loadOptions1[0].uri);
|
|
207
|
+
expect(trackController.activeTrack?.uri).toBe(loadOptions2[0].uri);
|
|
208
|
+
const track2 = trackController.activeTrack;
|
|
204
209
|
expect(track1.deactivate).toHaveBeenCalledWith();
|
|
205
210
|
expect(track2.activate).toHaveBeenCalledWith(config1);
|
|
206
211
|
});
|
|
@@ -246,39 +251,49 @@ describe('TrackControllerImpl', () => {
|
|
|
246
251
|
expect(getTrackPriority(tracks2[2])).toBeGreaterThan(getTrackPriority(tracks1[2]));
|
|
247
252
|
});
|
|
248
253
|
describe('if the first track is already active', () => {
|
|
249
|
-
it('deactivates then re-activates the track', () => {
|
|
254
|
+
it('deactivates then re-activates the track', async () => {
|
|
250
255
|
const loadOptionsList = createLoadOptionsList(3);
|
|
251
256
|
trackController.load(...loadOptionsList);
|
|
252
|
-
|
|
257
|
+
// Content activation is deferred behind the async enterPreroll.
|
|
258
|
+
await clock.tick();
|
|
259
|
+
const track = trackController.activeTrack;
|
|
253
260
|
expect(track.activate).toHaveBeenCalledWith({});
|
|
254
261
|
expect(track.deactivate).not.toHaveBeenCalled();
|
|
255
262
|
track.activate.calls.reset();
|
|
256
263
|
track.deactivate.calls.reset();
|
|
257
|
-
|
|
264
|
+
// Re-load with fresh option objects for the same URIs (as a
|
|
265
|
+
// real caller would); the already-cached track restarts.
|
|
266
|
+
trackController.load(...clone(loadOptionsList));
|
|
267
|
+
await clock.tick();
|
|
258
268
|
expect(track.deactivate).toHaveBeenCalled();
|
|
259
269
|
expect(track.activate).toHaveBeenCalledWith({});
|
|
260
270
|
expect(track.deactivate).toHaveBeenCalledBefore(track.activate);
|
|
261
271
|
});
|
|
262
272
|
});
|
|
263
|
-
it('deactivates and reactivates current track if unchanged', () => {
|
|
273
|
+
it('deactivates and reactivates current track if unchanged', async () => {
|
|
264
274
|
const loadOptionsList = createLoadOptionsList(3);
|
|
265
275
|
trackController.load(...loadOptionsList);
|
|
266
|
-
|
|
276
|
+
// Content activation is deferred behind the async enterPreroll.
|
|
277
|
+
await clock.tick();
|
|
278
|
+
const currentTrack = trackController.activeTrack;
|
|
267
279
|
expect(currentTrack.activate).toHaveBeenCalledOnceWith({});
|
|
268
280
|
currentTrack.activate.calls.reset();
|
|
269
|
-
trackController.load(loadOptionsList[0]);
|
|
281
|
+
trackController.load({ ...loadOptionsList[0] });
|
|
282
|
+
await clock.tick();
|
|
270
283
|
expect(currentTrack.deactivate).toHaveBeenCalled();
|
|
271
284
|
expect(currentTrack.activate).toHaveBeenCalled();
|
|
272
285
|
});
|
|
273
|
-
it('reuses currentTrack', () => {
|
|
286
|
+
it('reuses currentTrack', async () => {
|
|
274
287
|
const trackController = new TrackControllerImpl(deps, {
|
|
275
288
|
trackPrefetchCount: 0, // Only the current track is cached
|
|
276
289
|
});
|
|
277
290
|
const loadOptionsList = createLoadOptionsList(3);
|
|
278
291
|
trackController.load(...loadOptionsList);
|
|
279
|
-
|
|
292
|
+
await clock.tick(); // let the deferred activation complete
|
|
293
|
+
const currentTrack = trackController.activeTrack;
|
|
280
294
|
trackController.load(...loadOptionsList);
|
|
281
|
-
|
|
295
|
+
await clock.tick();
|
|
296
|
+
expect(trackController.activeTrack).toBe(currentTrack);
|
|
282
297
|
trackController.dispose();
|
|
283
298
|
});
|
|
284
299
|
it('prefetches trackPrefetchCount tracks ahead', () => {
|
|
@@ -315,11 +330,11 @@ describe('TrackControllerImpl', () => {
|
|
|
315
330
|
deps.playbackController.dispatch('ended', {});
|
|
316
331
|
trackController.load(...loadOptionsList);
|
|
317
332
|
await clock.tick();
|
|
318
|
-
expect(trackController.
|
|
333
|
+
expect(trackController.activeTrack?.uri).toEqual(loadOptionsList[0].uri);
|
|
319
334
|
// Does not prevent subsequent ended events from progressing queue.
|
|
320
335
|
deps.playbackController.dispatch('ended', {});
|
|
321
336
|
await clock.tick();
|
|
322
|
-
expect(trackController.
|
|
337
|
+
expect(trackController.activeTrack?.uri).toEqual(loadOptionsList[1].uri);
|
|
323
338
|
});
|
|
324
339
|
});
|
|
325
340
|
it('validates all tracks', () => {
|
|
@@ -332,15 +347,16 @@ describe('TrackControllerImpl', () => {
|
|
|
332
347
|
});
|
|
333
348
|
});
|
|
334
349
|
describe('enqueue', () => {
|
|
335
|
-
it('appends the given track load options to the current queue', () => {
|
|
350
|
+
it('appends the given track load options to the current queue', async () => {
|
|
336
351
|
trackController.enqueue();
|
|
337
352
|
expect(trackController.queue).toEqual([]);
|
|
338
353
|
const tracks1 = createLoadOptionsList(1);
|
|
339
354
|
const tracks2 = createLoadOptionsList(2);
|
|
340
355
|
const tracks3 = createLoadOptionsList(3);
|
|
341
356
|
trackController.enqueue(...tracks1);
|
|
357
|
+
await clock.tick(); // let the deferred activation complete
|
|
342
358
|
expect(trackController.queue).toEqual([]);
|
|
343
|
-
expect(trackController.
|
|
359
|
+
expect(trackController.activeTrack?.uri).toBe(tracks1[0].uri);
|
|
344
360
|
trackController.enqueue(...tracks2);
|
|
345
361
|
expect(trackController.queue).toEqual(tracks2);
|
|
346
362
|
trackController.enqueue(...tracks3);
|
|
@@ -362,18 +378,20 @@ describe('TrackControllerImpl', () => {
|
|
|
362
378
|
});
|
|
363
379
|
});
|
|
364
380
|
describe('next', () => {
|
|
365
|
-
it('shifts the queue, activating the next track', () => {
|
|
381
|
+
it('shifts the queue, activating the next track', async () => {
|
|
366
382
|
trackController.configure({ preloadCapacity: 0 });
|
|
367
383
|
trackController.next();
|
|
368
|
-
expect(trackController.
|
|
384
|
+
expect(trackController.activeTrack).toBeNull();
|
|
369
385
|
const tracks = createLoadOptionsList(5);
|
|
370
386
|
trackController.load(...tracks);
|
|
387
|
+
await clock.tick(); // let the deferred activation complete
|
|
371
388
|
let currentIndex = 0;
|
|
372
|
-
function testNext() {
|
|
389
|
+
async function testNext() {
|
|
373
390
|
++currentIndex;
|
|
374
391
|
trackController.next();
|
|
392
|
+
await clock.tick(); // let the deferred activation complete
|
|
375
393
|
expect(trackController.queue[0]).toEqual(tracks[currentIndex + 1]);
|
|
376
|
-
expect(trackController.
|
|
394
|
+
expect(trackController.activeTrack?.uri)
|
|
377
395
|
.withContext(`currentTrack ${currentIndex}`)
|
|
378
396
|
.toBe(tracks[currentIndex].uri);
|
|
379
397
|
// Expect next tracks until trackPrefetchCount are prefetched.
|
|
@@ -382,14 +400,15 @@ describe('TrackControllerImpl', () => {
|
|
|
382
400
|
trackController.options.trackPrefetchCount);
|
|
383
401
|
}
|
|
384
402
|
}
|
|
385
|
-
testNext(); // 1
|
|
386
|
-
testNext(); // 2
|
|
387
|
-
testNext(); // 3
|
|
388
|
-
testNext(); // 4, last track
|
|
403
|
+
await testNext(); // 1
|
|
404
|
+
await testNext(); // 2
|
|
405
|
+
await testNext(); // 3
|
|
406
|
+
await testNext(); // 4, last track
|
|
389
407
|
// Reached the end
|
|
390
408
|
trackController.next();
|
|
409
|
+
await clock.tick();
|
|
391
410
|
expect(trackController.queue).toEqual([]);
|
|
392
|
-
expect(trackController.
|
|
411
|
+
expect(trackController.activeTrack).toBeNull();
|
|
393
412
|
expect(trackCount).toBe(trackController.options.trackPrefetchCount + 1);
|
|
394
413
|
});
|
|
395
414
|
describe('when the current track is ended or not paused', () => {
|
|
@@ -429,86 +448,33 @@ describe('TrackControllerImpl', () => {
|
|
|
429
448
|
deps.playbackController.dispatch('ended', {});
|
|
430
449
|
trackController.next();
|
|
431
450
|
await clock.tick();
|
|
432
|
-
expect(trackController.
|
|
451
|
+
expect(trackController.activeTrack?.uri).toEqual(loadOptionsList[1].uri);
|
|
433
452
|
// Does not prevent subsequent ended events from progressing queue.
|
|
434
453
|
deps.playbackController.dispatch('ended', {});
|
|
435
454
|
await clock.tick();
|
|
436
|
-
expect(trackController.
|
|
437
|
-
});
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
describe('currentTrackChanging event', () => {
|
|
441
|
-
it('is emitted when the track changes, before the current track is deactivated', () => {
|
|
442
|
-
const trackChangingSpy = createSpy('trackChanging').and.callFake((event) => {
|
|
443
|
-
// Ensure that changing happens before the previous track is deactivated
|
|
444
|
-
if (event.previous)
|
|
445
|
-
expect(event.previous.active).toBeTrue();
|
|
446
|
-
if (event.current)
|
|
447
|
-
expect(event.current.active).toBeFalse();
|
|
448
|
-
});
|
|
449
|
-
trackController.on('currentTrackChanging', trackChangingSpy);
|
|
450
|
-
const trackChangeSpy = createSpy('trackChange').and.callFake(
|
|
451
|
-
// Ensure that change happens after the new track is activated
|
|
452
|
-
(event) => {
|
|
453
|
-
if (event.previous)
|
|
454
|
-
expect(event.previous.active).toBeFalse();
|
|
455
|
-
if (event.current)
|
|
456
|
-
expect(event.current.active).toBeTrue();
|
|
457
|
-
});
|
|
458
|
-
trackController.on('currentTrackChange', trackChangeSpy);
|
|
459
|
-
trackController.load({
|
|
460
|
-
type: '',
|
|
461
|
-
uri: `test_0`,
|
|
462
|
-
}, {
|
|
463
|
-
type: '',
|
|
464
|
-
uri: `test_1`,
|
|
465
|
-
}, {
|
|
466
|
-
type: '',
|
|
467
|
-
uri: `test_2`,
|
|
468
|
-
});
|
|
469
|
-
expect(trackChangingSpy.calls.count()).toBe(1);
|
|
470
|
-
expect(trackChangeSpy.calls.count()).toBe(1);
|
|
471
|
-
trackChangingSpy.calls.reset();
|
|
472
|
-
trackChangeSpy.calls.reset();
|
|
473
|
-
trackController.next();
|
|
474
|
-
expect(trackChangingSpy.calls.count()).toBe(1);
|
|
475
|
-
expect(trackChangeSpy.calls.count()).toBe(1);
|
|
476
|
-
expect(trackChangingSpy).toHaveBeenCalledBefore(trackChangeSpy);
|
|
477
|
-
const changingEvent = trackChangingSpy.calls.mostRecent().args[0];
|
|
478
|
-
expect(changingEvent).toEqual({
|
|
479
|
-
previous: objectContaining({
|
|
480
|
-
uri: `test_0`,
|
|
481
|
-
}),
|
|
482
|
-
current: objectContaining({
|
|
483
|
-
uri: `test_1`,
|
|
484
|
-
}),
|
|
455
|
+
expect(trackController.activeTrack?.uri).toEqual(loadOptionsList[2].uri);
|
|
485
456
|
});
|
|
486
457
|
});
|
|
487
458
|
});
|
|
488
459
|
describe('when the current track ends', () => {
|
|
489
460
|
it('moves to the next track', async () => {
|
|
490
461
|
const loadOptionsList = createLoadOptionsList(3);
|
|
491
|
-
const
|
|
462
|
+
const activatedSpy = createEventSpy(trackController, 'trackActivated');
|
|
492
463
|
trackController.load(...loadOptionsList);
|
|
493
|
-
|
|
464
|
+
await clock.tick(); // flush the first track's deferred activation
|
|
465
|
+
let nextActivated = activatedSpy.next();
|
|
494
466
|
deps.playbackController.dispatch('ended', {});
|
|
495
467
|
await clock.tick();
|
|
496
|
-
await expectAsync(
|
|
497
|
-
|
|
498
|
-
uri: loadOptionsList[0].uri,
|
|
499
|
-
}),
|
|
500
|
-
current: objectContaining({
|
|
468
|
+
await expectAsync(nextActivated).toBeResolvedTo({
|
|
469
|
+
track: objectContaining({
|
|
501
470
|
uri: loadOptionsList[1].uri,
|
|
502
471
|
}),
|
|
503
472
|
});
|
|
504
|
-
|
|
473
|
+
nextActivated = activatedSpy.next();
|
|
505
474
|
deps.playbackController.dispatch('ended', {});
|
|
506
475
|
await clock.tick();
|
|
507
|
-
await expectAsync(
|
|
508
|
-
|
|
509
|
-
uri: loadOptionsList[1].uri,
|
|
510
|
-
}),
|
|
511
|
-
current: objectContaining({
|
|
476
|
+
await expectAsync(nextActivated).toBeResolvedTo({
|
|
477
|
+
track: objectContaining({
|
|
512
478
|
uri: loadOptionsList[2].uri,
|
|
513
479
|
}),
|
|
514
480
|
});
|
|
@@ -519,13 +485,14 @@ describe('TrackControllerImpl', () => {
|
|
|
519
485
|
trackController.load(...createLoadOptionsList(3));
|
|
520
486
|
trackController.unload();
|
|
521
487
|
expect(trackController.queue).toEqual([]);
|
|
522
|
-
expect(trackController.
|
|
488
|
+
expect(trackController.activeTrack).toBeNull();
|
|
523
489
|
});
|
|
524
490
|
});
|
|
525
491
|
describe('clearTrackCache', () => {
|
|
526
492
|
const loadOptionsList = createLoadOptionsList(3);
|
|
527
|
-
beforeEach(() => {
|
|
493
|
+
beforeEach(async () => {
|
|
528
494
|
trackController.load(...loadOptionsList);
|
|
495
|
+
await clock.tick(); // let the deferred activation complete
|
|
529
496
|
});
|
|
530
497
|
it('clears the cache', () => {
|
|
531
498
|
expect(trackController.isTrackCached(loadOptionsList[0].uri)).toBeTrue();
|
|
@@ -533,10 +500,10 @@ describe('TrackControllerImpl', () => {
|
|
|
533
500
|
expect(trackController.isTrackCached(loadOptionsList[0].uri)).toBeFalse();
|
|
534
501
|
});
|
|
535
502
|
it('deactivates the current track', () => {
|
|
536
|
-
const track = trackController.
|
|
503
|
+
const track = trackController.activeTrack;
|
|
537
504
|
expect(track).not.toBeNull();
|
|
538
505
|
trackController.clearTrackCache();
|
|
539
|
-
expect(trackController.
|
|
506
|
+
expect(trackController.activeTrack).toBeNull();
|
|
540
507
|
expect(track.active).toBeFalse();
|
|
541
508
|
});
|
|
542
509
|
it('clears the queue', () => {
|
|
@@ -550,7 +517,7 @@ describe('TrackControllerImpl', () => {
|
|
|
550
517
|
deps.playbackController.dispatch('ended', {});
|
|
551
518
|
trackController.clearTrackCache();
|
|
552
519
|
await clock.tick();
|
|
553
|
-
expect(trackController.
|
|
520
|
+
expect(trackController.activeTrack).toBeNull();
|
|
554
521
|
});
|
|
555
522
|
});
|
|
556
523
|
it('resets the auto preload capacity', () => {
|
|
@@ -570,14 +537,58 @@ describe('TrackControllerImpl', () => {
|
|
|
570
537
|
expect(track.clearPrefetch).toHaveBeenCalledTimes(1);
|
|
571
538
|
}
|
|
572
539
|
});
|
|
540
|
+
it('also clears prefetch on preloaded ad tracks', async () => {
|
|
541
|
+
pending('REVIEW: the refactor no longer proactively preloads ad tracks ' +
|
|
542
|
+
'discovered on the current track (ad tracks are created on ' +
|
|
543
|
+
'adEntered only). Decide: intended removal (delete this spec) ' +
|
|
544
|
+
'or regression (restore discovery-time ad preloading).');
|
|
545
|
+
const [main] = createLoadOptionsList(1);
|
|
546
|
+
trackController.load(main);
|
|
547
|
+
const track = trackController.activeTrack;
|
|
548
|
+
const ads = {
|
|
549
|
+
trackUri: main.uri,
|
|
550
|
+
adBreaks: [
|
|
551
|
+
{
|
|
552
|
+
id: 'b1',
|
|
553
|
+
startTime: 5,
|
|
554
|
+
duration: 10,
|
|
555
|
+
placement: 'midroll',
|
|
556
|
+
restrict: {},
|
|
557
|
+
once: false,
|
|
558
|
+
resumeOffset: null,
|
|
559
|
+
playoutLimit: null,
|
|
560
|
+
resolutionTimeOffset: null,
|
|
561
|
+
skipControl: () => null,
|
|
562
|
+
ads: () => Promise.resolve([
|
|
563
|
+
{
|
|
564
|
+
id: 'a1',
|
|
565
|
+
startTime: 5,
|
|
566
|
+
duration: 10,
|
|
567
|
+
uri: 'https://ads/a.m3u8',
|
|
568
|
+
},
|
|
569
|
+
]),
|
|
570
|
+
},
|
|
571
|
+
],
|
|
572
|
+
};
|
|
573
|
+
track.ads = ads;
|
|
574
|
+
track.dispatch('adsChange', { previous: null, current: ads });
|
|
575
|
+
// Ad resolution runs on microtasks.
|
|
576
|
+
await Promise.resolve();
|
|
577
|
+
await Promise.resolve();
|
|
578
|
+
await Promise.resolve();
|
|
579
|
+
const adTrack = trackController.getCachedTrack('https://ads/a.m3u8');
|
|
580
|
+
trackController.clearPrefetch();
|
|
581
|
+
expect(adTrack.clearPrefetch).toHaveBeenCalled();
|
|
582
|
+
});
|
|
573
583
|
});
|
|
574
584
|
describe('clearQueue', () => {
|
|
575
|
-
it('clears the queue without unloading the current track', () => {
|
|
585
|
+
it('clears the queue without unloading the current track', async () => {
|
|
576
586
|
const tracks = createLoadOptionsList(3);
|
|
577
587
|
trackController.load(...tracks);
|
|
588
|
+
await clock.tick(); // let the deferred activation complete
|
|
578
589
|
trackController.clearQueue();
|
|
579
590
|
expect(trackController.queue).toEqual([]);
|
|
580
|
-
expect(trackController.
|
|
591
|
+
expect(trackController.activeTrack?.uri).toBe(tracks[0].uri);
|
|
581
592
|
});
|
|
582
593
|
});
|
|
583
594
|
describe('isTrackCached', () => {
|
|
@@ -643,6 +654,18 @@ describe('TrackControllerImpl', () => {
|
|
|
643
654
|
});
|
|
644
655
|
});
|
|
645
656
|
describe('when last track in the queue ends', () => {
|
|
657
|
+
it('dispatches trackEnded for each track as the queue advances', async () => {
|
|
658
|
+
const trackEnded = createEventSpy(trackController, 'trackEnded');
|
|
659
|
+
trackController.load(...createLoadOptionsList(2));
|
|
660
|
+
// First track ends (no postroll): trackEnded, then advance.
|
|
661
|
+
deps.playbackController.dispatch('ended', {});
|
|
662
|
+
await clock.tick();
|
|
663
|
+
expect(trackEnded).toHaveBeenCalledTimes(1);
|
|
664
|
+
// Last track ends: trackEnded again (queueEnded also fires).
|
|
665
|
+
deps.playbackController.dispatch('ended', {});
|
|
666
|
+
await clock.tick();
|
|
667
|
+
expect(trackEnded).toHaveBeenCalledTimes(2);
|
|
668
|
+
});
|
|
646
669
|
it('dispatches a queueEnded event', async () => {
|
|
647
670
|
const queueEndedSpy = createEventSpy(trackController, 'queueEnded');
|
|
648
671
|
trackController.load(...createLoadOptionsList(1));
|
|
@@ -779,9 +802,10 @@ describe('TrackControllerImpl', () => {
|
|
|
779
802
|
});
|
|
780
803
|
});
|
|
781
804
|
describe('reset', () => {
|
|
782
|
-
it('resets current track', () => {
|
|
805
|
+
it('resets current track', async () => {
|
|
783
806
|
trackController.load(...createLoadOptionsList(1));
|
|
784
|
-
|
|
807
|
+
await clock.tick();
|
|
808
|
+
const track = trackController.activeTrack;
|
|
785
809
|
trackController.reset();
|
|
786
810
|
expect(track.reset).toHaveBeenCalled();
|
|
787
811
|
});
|
|
@@ -789,6 +813,584 @@ describe('TrackControllerImpl', () => {
|
|
|
789
813
|
expect(() => trackController.reset()).not.toThrow();
|
|
790
814
|
});
|
|
791
815
|
});
|
|
816
|
+
describe('reset', () => {
|
|
817
|
+
it('delegates a hard reset to the current track', async () => {
|
|
818
|
+
trackController.load(...createLoadOptionsList(1));
|
|
819
|
+
await clock.tick();
|
|
820
|
+
const track = trackController.activeTrack;
|
|
821
|
+
trackController.reset(/* hard */ true);
|
|
822
|
+
expect(track.reset).toHaveBeenCalledWith(true);
|
|
823
|
+
});
|
|
824
|
+
it('delegates a soft reset to the current track', async () => {
|
|
825
|
+
trackController.load(...createLoadOptionsList(1));
|
|
826
|
+
await clock.tick();
|
|
827
|
+
const track = trackController.activeTrack;
|
|
828
|
+
trackController.reset();
|
|
829
|
+
expect(track.reset).toHaveBeenCalled();
|
|
830
|
+
});
|
|
831
|
+
it('does nothing when there is no current track', () => {
|
|
832
|
+
expect(() => trackController.reset(true)).not.toThrow();
|
|
833
|
+
});
|
|
834
|
+
});
|
|
835
|
+
describe('ad preloading', () => {
|
|
836
|
+
async function flushAds() {
|
|
837
|
+
for (let i = 0; i < 8; i++)
|
|
838
|
+
await Promise.resolve();
|
|
839
|
+
}
|
|
840
|
+
// Records every track the factory creates (keyed by URI) and gives the
|
|
841
|
+
// named content URI a single ad break of `placement` resolving the
|
|
842
|
+
// given ad URIs. Preloaded ad tracks live in the controller's private
|
|
843
|
+
// per-parent store (not the content cache), so tests reach them through
|
|
844
|
+
// this record rather than isTrackCached()/getCachedTrack().
|
|
845
|
+
const created = new Map();
|
|
846
|
+
beforeEach(() => created.clear());
|
|
847
|
+
function factoryGivingBreak(contentUri, adUris, placement = 'preroll') {
|
|
848
|
+
deps.trackFactory.createTrack.and.callFake((options) => {
|
|
849
|
+
const track = new MockTrack();
|
|
850
|
+
trackCount++;
|
|
851
|
+
track.implementActivateFakes();
|
|
852
|
+
track.uri = options.uri;
|
|
853
|
+
track.ads =
|
|
854
|
+
options.uri === contentUri
|
|
855
|
+
? {
|
|
856
|
+
trackUri: contentUri,
|
|
857
|
+
adBreaks: [
|
|
858
|
+
{
|
|
859
|
+
id: 'brk',
|
|
860
|
+
startTime: 0,
|
|
861
|
+
duration: 10,
|
|
862
|
+
placement,
|
|
863
|
+
restrict: {},
|
|
864
|
+
once: true,
|
|
865
|
+
resumeOffset: null,
|
|
866
|
+
playoutLimit: null,
|
|
867
|
+
resolutionTimeOffset: null,
|
|
868
|
+
skipControl: () => null,
|
|
869
|
+
ads: () => Promise.resolve(adUris.map((uri, i) => ({
|
|
870
|
+
id: `pa${i}`,
|
|
871
|
+
startTime: 0,
|
|
872
|
+
duration: 10,
|
|
873
|
+
uri,
|
|
874
|
+
}))),
|
|
875
|
+
},
|
|
876
|
+
],
|
|
877
|
+
}
|
|
878
|
+
: { trackUri: options.uri, adBreaks: [] };
|
|
879
|
+
track.dispose.and.callFake(() => {
|
|
880
|
+
if (track.disposed)
|
|
881
|
+
throw new DisposedError();
|
|
882
|
+
track.disposed = true;
|
|
883
|
+
trackCount--;
|
|
884
|
+
});
|
|
885
|
+
created.set(options.uri, track);
|
|
886
|
+
return track;
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
it('preloads a preroll ad track when its parent track is preloaded', async () => {
|
|
890
|
+
const [main] = createLoadOptionsList(1);
|
|
891
|
+
factoryGivingBreak(main.uri, ['https://ads/pre.m3u8']);
|
|
892
|
+
trackController.load(main);
|
|
893
|
+
await flushAds();
|
|
894
|
+
const adTrack = created.get('https://ads/pre.m3u8');
|
|
895
|
+
expect(adTrack)
|
|
896
|
+
.withContext('preroll ad track created')
|
|
897
|
+
.toBeDefined();
|
|
898
|
+
expect(adTrack.preload).toHaveBeenCalled();
|
|
899
|
+
});
|
|
900
|
+
it('gives the preroll ad track a higher prefetch priority than its parent', async () => {
|
|
901
|
+
const [main] = createLoadOptionsList(1);
|
|
902
|
+
factoryGivingBreak(main.uri, ['https://ads/pre.m3u8']);
|
|
903
|
+
trackController.load(main);
|
|
904
|
+
await flushAds();
|
|
905
|
+
const parentPriority = created
|
|
906
|
+
.get(main.uri)
|
|
907
|
+
.preload.calls.mostRecent().args[0].prefetchPriority;
|
|
908
|
+
const adPriority = created
|
|
909
|
+
.get('https://ads/pre.m3u8')
|
|
910
|
+
.preload.calls.mostRecent().args[0].prefetchPriority;
|
|
911
|
+
expect(adPriority).toBeGreaterThan(parentPriority);
|
|
912
|
+
});
|
|
913
|
+
it('preloads only preroll breaks, not midroll or postroll', async () => {
|
|
914
|
+
const [main] = createLoadOptionsList(1);
|
|
915
|
+
factoryGivingBreak(main.uri, ['https://ads/mid.m3u8'], 'midroll');
|
|
916
|
+
trackController.load(main);
|
|
917
|
+
await flushAds();
|
|
918
|
+
expect(created.has('https://ads/mid.m3u8')).toBeFalse();
|
|
919
|
+
});
|
|
920
|
+
it('creates a preroll ad track only once across repeated preloads', async () => {
|
|
921
|
+
const [main, next] = createLoadOptionsList(2);
|
|
922
|
+
factoryGivingBreak(main.uri, ['https://ads/pre.m3u8']);
|
|
923
|
+
trackController.load(main);
|
|
924
|
+
await flushAds();
|
|
925
|
+
// Enqueue re-runs _preload over the prefetch window (which includes
|
|
926
|
+
// the current track), so the same preroll ad must be reused.
|
|
927
|
+
trackController.enqueue(next);
|
|
928
|
+
await flushAds();
|
|
929
|
+
const adCreates = deps.trackFactory.createTrack.calls
|
|
930
|
+
.allArgs()
|
|
931
|
+
.filter((a) => a[0].uri === 'https://ads/pre.m3u8').length;
|
|
932
|
+
expect(adCreates).toBe(1);
|
|
933
|
+
});
|
|
934
|
+
it('does not inflate the content preload capacity to hold ad tracks', async () => {
|
|
935
|
+
const before = trackController.preloadCapacity;
|
|
936
|
+
const [main] = createLoadOptionsList(1);
|
|
937
|
+
factoryGivingBreak(main.uri, ['https://ads/pre.m3u8']);
|
|
938
|
+
trackController.load(main);
|
|
939
|
+
await flushAds();
|
|
940
|
+
expect(trackController.preloadCapacity).toBe(before);
|
|
941
|
+
});
|
|
942
|
+
it('disposes a preloaded preroll ad track when its parent content track is evicted', async () => {
|
|
943
|
+
// Cache holds one content track (capacity = preload 0 + prefetch 0 + 1).
|
|
944
|
+
trackController.configure({
|
|
945
|
+
preloadCapacity: 0,
|
|
946
|
+
trackPrefetchCount: 0,
|
|
947
|
+
});
|
|
948
|
+
const [a, b] = createLoadOptionsList(2);
|
|
949
|
+
factoryGivingBreak(a.uri, ['https://ads/a-pre.m3u8']);
|
|
950
|
+
trackController.load(a);
|
|
951
|
+
await flushAds();
|
|
952
|
+
const adTrack = created.get('https://ads/a-pre.m3u8');
|
|
953
|
+
expect(adTrack).withContext('ad track created for A').toBeDefined();
|
|
954
|
+
// Loading B evicts A; A's pegged preroll ad track must go with it.
|
|
955
|
+
trackController.load(b);
|
|
956
|
+
await flushAds();
|
|
957
|
+
expect(trackController.isTrackCached(a.uri)).toBeFalse();
|
|
958
|
+
expect(adTrack.dispose).toHaveBeenCalled();
|
|
959
|
+
});
|
|
960
|
+
it('disposes preloaded preroll ad tracks on clearTrackCache', async () => {
|
|
961
|
+
const [main] = createLoadOptionsList(1);
|
|
962
|
+
factoryGivingBreak(main.uri, ['https://ads/pre.m3u8']);
|
|
963
|
+
trackController.load(main);
|
|
964
|
+
await flushAds();
|
|
965
|
+
const adTrack = created.get('https://ads/pre.m3u8');
|
|
966
|
+
trackController.clearTrackCache();
|
|
967
|
+
expect(adTrack.dispose).toHaveBeenCalled();
|
|
968
|
+
});
|
|
969
|
+
it('does not preload the ad track if the parent is disposed before its options resolve', async () => {
|
|
970
|
+
let resolveOptions = () => { };
|
|
971
|
+
const tc = new TrackControllerImpl({
|
|
972
|
+
...deps,
|
|
973
|
+
adTrackLoadOptionsProvider: () => new Promise((resolve) => {
|
|
974
|
+
resolveOptions = resolve;
|
|
975
|
+
}),
|
|
976
|
+
});
|
|
977
|
+
const [main] = createLoadOptionsList(1);
|
|
978
|
+
factoryGivingBreak(main.uri, ['https://ads/late.m3u8']);
|
|
979
|
+
tc.load(main);
|
|
980
|
+
await flushAds(); // preloadAd is awaiting the options provider
|
|
981
|
+
tc.dispose(); // disposes the parent track
|
|
982
|
+
resolveOptions({ uri: 'https://ads/late.m3u8', type: '' });
|
|
983
|
+
await flushAds();
|
|
984
|
+
// The disposed-parent guard skipped creating/preloading the ad track.
|
|
985
|
+
expect(created.has('https://ads/late.m3u8')).toBeFalse();
|
|
986
|
+
});
|
|
987
|
+
it('does not throw when a preroll ad options provider rejects', async () => {
|
|
988
|
+
const tc = new TrackControllerImpl({
|
|
989
|
+
...deps,
|
|
990
|
+
adTrackLoadOptionsProvider: () => Promise.reject(new Error('boom')),
|
|
991
|
+
});
|
|
992
|
+
const [main] = createLoadOptionsList(1);
|
|
993
|
+
factoryGivingBreak(main.uri, ['https://ads/x.m3u8']);
|
|
994
|
+
expect(() => tc.load(main)).not.toThrow();
|
|
995
|
+
await flushAds();
|
|
996
|
+
expect(created.has('https://ads/x.m3u8')).toBeFalse();
|
|
997
|
+
tc.dispose();
|
|
998
|
+
});
|
|
999
|
+
it("does not throw when a preroll break's ad list fails to resolve", async () => {
|
|
1000
|
+
deps.trackFactory.createTrack.and.callFake((options) => {
|
|
1001
|
+
const track = new MockTrack();
|
|
1002
|
+
trackCount++;
|
|
1003
|
+
track.implementActivateFakes();
|
|
1004
|
+
track.uri = options.uri;
|
|
1005
|
+
track.ads = {
|
|
1006
|
+
trackUri: options.uri,
|
|
1007
|
+
adBreaks: [
|
|
1008
|
+
{
|
|
1009
|
+
id: 'brk',
|
|
1010
|
+
startTime: 0,
|
|
1011
|
+
duration: 10,
|
|
1012
|
+
placement: 'preroll',
|
|
1013
|
+
restrict: {},
|
|
1014
|
+
once: true,
|
|
1015
|
+
resumeOffset: null,
|
|
1016
|
+
playoutLimit: null,
|
|
1017
|
+
resolutionTimeOffset: null,
|
|
1018
|
+
skipControl: () => null,
|
|
1019
|
+
ads: () => Promise.reject(new Error('ad list down')),
|
|
1020
|
+
},
|
|
1021
|
+
],
|
|
1022
|
+
};
|
|
1023
|
+
track.dispose.and.callFake(() => {
|
|
1024
|
+
if (track.disposed)
|
|
1025
|
+
throw new DisposedError();
|
|
1026
|
+
track.disposed = true;
|
|
1027
|
+
trackCount--;
|
|
1028
|
+
});
|
|
1029
|
+
return track;
|
|
1030
|
+
});
|
|
1031
|
+
const [main] = createLoadOptionsList(1);
|
|
1032
|
+
expect(() => trackController.load(main)).not.toThrow();
|
|
1033
|
+
await flushAds();
|
|
1034
|
+
expect(trackController.activeTrack?.uri).toBe(main.uri);
|
|
1035
|
+
});
|
|
1036
|
+
// ── adPreload (midroll/postroll warming) ──────────────────────────
|
|
1037
|
+
function midrollBreak(adUri) {
|
|
1038
|
+
return {
|
|
1039
|
+
id: 'mid',
|
|
1040
|
+
startTime: 30,
|
|
1041
|
+
duration: 5,
|
|
1042
|
+
placement: 'midroll',
|
|
1043
|
+
restrict: {},
|
|
1044
|
+
once: false,
|
|
1045
|
+
resumeOffset: null,
|
|
1046
|
+
playoutLimit: null,
|
|
1047
|
+
resolutionTimeOffset: null,
|
|
1048
|
+
skipControl: () => null,
|
|
1049
|
+
ads: () => Promise.resolve([
|
|
1050
|
+
{ id: 'ma', startTime: 30, duration: 5, uri: adUri },
|
|
1051
|
+
]),
|
|
1052
|
+
};
|
|
1053
|
+
}
|
|
1054
|
+
it("preloads a break's ad tracks when adPreload fires", async () => {
|
|
1055
|
+
const [main] = createLoadOptionsList(1);
|
|
1056
|
+
factoryGivingBreak(main.uri, []); // records created tracks; no preroll
|
|
1057
|
+
trackController.load(main); // establishes the parent content track
|
|
1058
|
+
await flushAds();
|
|
1059
|
+
deps.adController.dispatch('adPreload', {
|
|
1060
|
+
adBreak: midrollBreak('https://ads/mid.m3u8'),
|
|
1061
|
+
});
|
|
1062
|
+
await flushAds();
|
|
1063
|
+
const adTrack = created.get('https://ads/mid.m3u8');
|
|
1064
|
+
expect(adTrack).withContext('midroll ad track warmed').toBeDefined();
|
|
1065
|
+
expect(adTrack.preload).toHaveBeenCalled();
|
|
1066
|
+
});
|
|
1067
|
+
it('ignores adPreload when there is no parent track', () => {
|
|
1068
|
+
expect(() => deps.adController.dispatch('adPreload', {
|
|
1069
|
+
adBreak: midrollBreak('https://ads/mid.m3u8'),
|
|
1070
|
+
})).not.toThrow();
|
|
1071
|
+
});
|
|
1072
|
+
it("does not throw when an adPreload break's ad list rejects", async () => {
|
|
1073
|
+
const [main] = createLoadOptionsList(1);
|
|
1074
|
+
trackController.load(main);
|
|
1075
|
+
await flushAds();
|
|
1076
|
+
const adBreak = {
|
|
1077
|
+
...midrollBreak('https://ads/mid.m3u8'),
|
|
1078
|
+
ads: () => Promise.reject(new Error('ad list down')),
|
|
1079
|
+
};
|
|
1080
|
+
expect(() => deps.adController.dispatch('adPreload', { adBreak })).not.toThrow();
|
|
1081
|
+
await flushAds();
|
|
1082
|
+
expect(trackController.activeTrack?.uri).toBe(main.uri);
|
|
1083
|
+
});
|
|
1084
|
+
});
|
|
1085
|
+
describe('ad track lifecycle', () => {
|
|
1086
|
+
function adBreak(placement) {
|
|
1087
|
+
return {
|
|
1088
|
+
id: 'b1',
|
|
1089
|
+
startTime: 0,
|
|
1090
|
+
duration: 10,
|
|
1091
|
+
placement,
|
|
1092
|
+
restrict: {},
|
|
1093
|
+
once: false,
|
|
1094
|
+
resumeOffset: null,
|
|
1095
|
+
playoutLimit: null,
|
|
1096
|
+
resolutionTimeOffset: null,
|
|
1097
|
+
skipControl: () => null,
|
|
1098
|
+
ads: () => Promise.resolve([]),
|
|
1099
|
+
};
|
|
1100
|
+
}
|
|
1101
|
+
const ad = {
|
|
1102
|
+
id: 'a1',
|
|
1103
|
+
startTime: 0,
|
|
1104
|
+
duration: 5,
|
|
1105
|
+
uri: 'https://ads/x.m3u8',
|
|
1106
|
+
};
|
|
1107
|
+
async function flushAds() {
|
|
1108
|
+
await Promise.resolve();
|
|
1109
|
+
await Promise.resolve();
|
|
1110
|
+
await Promise.resolve();
|
|
1111
|
+
}
|
|
1112
|
+
it('loads an ad track when an ad is entered', async () => {
|
|
1113
|
+
trackController.load(...createLoadOptionsList(1));
|
|
1114
|
+
deps.adController.currentAd = ad;
|
|
1115
|
+
deps.adController.dispatch('adEntered', {
|
|
1116
|
+
ad,
|
|
1117
|
+
index: 0,
|
|
1118
|
+
totalAds: 1,
|
|
1119
|
+
});
|
|
1120
|
+
await flushAds();
|
|
1121
|
+
expect(trackController.activeTrack?.uri).toBe('https://ads/x.m3u8');
|
|
1122
|
+
});
|
|
1123
|
+
it('does not re-activate the current track when its ads change again', async () => {
|
|
1124
|
+
const [main] = createLoadOptionsList(1);
|
|
1125
|
+
trackController.load(main);
|
|
1126
|
+
await clock.tick(); // let the deferred activation complete
|
|
1127
|
+
const track = trackController.activeTrack;
|
|
1128
|
+
track.activate.calls.reset();
|
|
1129
|
+
// A later ads update re-runs the refresh; the already-active track
|
|
1130
|
+
// must not be activated again.
|
|
1131
|
+
track.dispatch('adsChange', {
|
|
1132
|
+
previous: track.ads,
|
|
1133
|
+
current: { trackUri: main.uri, adBreaks: [] },
|
|
1134
|
+
});
|
|
1135
|
+
expect(track.activate).not.toHaveBeenCalled();
|
|
1136
|
+
});
|
|
1137
|
+
it('fails the ad when its track cannot be resolved', async () => {
|
|
1138
|
+
trackController.load(...createLoadOptionsList(1));
|
|
1139
|
+
const badAd = { ...ad, uri: 'unresolvable' };
|
|
1140
|
+
deps.adController.currentAd = badAd;
|
|
1141
|
+
deps.adController.dispatch('adEntered', {
|
|
1142
|
+
ad: badAd,
|
|
1143
|
+
index: 0,
|
|
1144
|
+
totalAds: 1,
|
|
1145
|
+
});
|
|
1146
|
+
await flushAds();
|
|
1147
|
+
expect(deps.adController.failAd).toHaveBeenCalled();
|
|
1148
|
+
});
|
|
1149
|
+
it('does nothing when an ad break completes with no parent track', () => {
|
|
1150
|
+
expect(() => deps.adController.dispatch('adBreakCompleted', {
|
|
1151
|
+
adBreak: adBreak('midroll'),
|
|
1152
|
+
resumePosition: 0,
|
|
1153
|
+
})).not.toThrow();
|
|
1154
|
+
expect(trackController.activeTrack).toBeNull();
|
|
1155
|
+
});
|
|
1156
|
+
it('ignores adEntered when there is no parent track', () => {
|
|
1157
|
+
expect(() => deps.adController.dispatch('adEntered', {
|
|
1158
|
+
ad: { id: 'a1', startTime: 0, duration: 5, uri: 'ad' },
|
|
1159
|
+
index: 0,
|
|
1160
|
+
totalAds: 1,
|
|
1161
|
+
})).not.toThrow();
|
|
1162
|
+
expect(trackController.activeTrack).toBeNull();
|
|
1163
|
+
});
|
|
1164
|
+
it('waits for the next break when another is still active on adBreakCompleted', () => {
|
|
1165
|
+
const [main] = createLoadOptionsList(1);
|
|
1166
|
+
trackController.load(main);
|
|
1167
|
+
const before = trackController.activeTrack;
|
|
1168
|
+
// Another break is still active — the completed one must not resume content.
|
|
1169
|
+
deps.adController.currentAdBreak = adBreak('midroll');
|
|
1170
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1171
|
+
adBreak: adBreak('midroll'),
|
|
1172
|
+
resumePosition: 5,
|
|
1173
|
+
});
|
|
1174
|
+
expect(trackController.activeTrack).toBe(before);
|
|
1175
|
+
});
|
|
1176
|
+
it('does not resume content on adBreakCompleted for a break that played no ad', async () => {
|
|
1177
|
+
const [main] = createLoadOptionsList(1);
|
|
1178
|
+
trackController.load(main);
|
|
1179
|
+
await clock.tick(); // content activates (adParent stays active)
|
|
1180
|
+
const track = trackController.activeTrack;
|
|
1181
|
+
track.activate.calls.reset();
|
|
1182
|
+
// No ad displaced the element (no-fill): content is still active.
|
|
1183
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1184
|
+
adBreak: adBreak('midroll'),
|
|
1185
|
+
resumePosition: 5,
|
|
1186
|
+
});
|
|
1187
|
+
expect(track.activate).not.toHaveBeenCalled();
|
|
1188
|
+
});
|
|
1189
|
+
it('ignores an ended event when there is no current track', () => {
|
|
1190
|
+
expect(() => deps.playbackController.dispatch('ended', {
|
|
1191
|
+
previous: false,
|
|
1192
|
+
current: true,
|
|
1193
|
+
})).not.toThrow();
|
|
1194
|
+
});
|
|
1195
|
+
it('logs and does not throw when enterPostroll rejects on track end', async () => {
|
|
1196
|
+
const [main] = createLoadOptionsList(1);
|
|
1197
|
+
trackController.load(main);
|
|
1198
|
+
await clock.tick();
|
|
1199
|
+
deps.adController.enterPostroll.and.rejectWith(new Error('boom'));
|
|
1200
|
+
expect(() => deps.playbackController.dispatch('ended', {
|
|
1201
|
+
previous: false,
|
|
1202
|
+
current: true,
|
|
1203
|
+
})).not.toThrow();
|
|
1204
|
+
await clock.tick();
|
|
1205
|
+
});
|
|
1206
|
+
it('activates content when enterPreroll rejects', async () => {
|
|
1207
|
+
const [main] = createLoadOptionsList(1);
|
|
1208
|
+
deps.adController.enterPreroll.and.rejectWith(new Error('boom'));
|
|
1209
|
+
trackController.load(main);
|
|
1210
|
+
await clock.tick();
|
|
1211
|
+
const track = trackController.activeTrack;
|
|
1212
|
+
expect(track.activate).toHaveBeenCalled();
|
|
1213
|
+
});
|
|
1214
|
+
it('does not activate content while a preroll is entered', async () => {
|
|
1215
|
+
const [main] = createLoadOptionsList(1);
|
|
1216
|
+
deps.adController.enterPreroll.and.resolveTo(adBreak('preroll'));
|
|
1217
|
+
trackController.load(main);
|
|
1218
|
+
await clock.tick();
|
|
1219
|
+
// The content never activates while the preroll is entered, so it is
|
|
1220
|
+
// not the active track — reach it via the cache to assert on it.
|
|
1221
|
+
expect(trackController.activeTrack).toBeNull();
|
|
1222
|
+
const track = trackController.getCachedTrack(main.uri);
|
|
1223
|
+
// The preroll plays first; content activates later on adBreakCompleted.
|
|
1224
|
+
expect(track.activate).not.toHaveBeenCalled();
|
|
1225
|
+
});
|
|
1226
|
+
it('resumes the parent track at the resume position after a midroll ad', async () => {
|
|
1227
|
+
const [main] = createLoadOptionsList(1);
|
|
1228
|
+
trackController.load(main);
|
|
1229
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1230
|
+
adBreak: adBreak('midroll'),
|
|
1231
|
+
resumePosition: 7,
|
|
1232
|
+
});
|
|
1233
|
+
await clock.tick();
|
|
1234
|
+
const track = trackController.activeTrack;
|
|
1235
|
+
expect(track.uri).toBe(main.uri);
|
|
1236
|
+
expect(track.activate).toHaveBeenCalledWith(objectContaining({ startTime: 7 }));
|
|
1237
|
+
});
|
|
1238
|
+
it('resumes the parent at its configured start time after a preroll ad', async () => {
|
|
1239
|
+
const [main] = createLoadOptionsList(1);
|
|
1240
|
+
main.config = { startTime: 3 };
|
|
1241
|
+
trackController.load(main);
|
|
1242
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1243
|
+
adBreak: adBreak('preroll'),
|
|
1244
|
+
resumePosition: 99,
|
|
1245
|
+
});
|
|
1246
|
+
await clock.tick();
|
|
1247
|
+
const track = trackController.activeTrack;
|
|
1248
|
+
expect(track.activate).toHaveBeenCalledWith(objectContaining({ startTime: 3 }));
|
|
1249
|
+
});
|
|
1250
|
+
it('skips the deferred resume if interrupted before the frame', async () => {
|
|
1251
|
+
pending('REVIEW: content resume on adBreakCompleted is now synchronous ' +
|
|
1252
|
+
'(no deferred/interruptible frame), so this interruption ' +
|
|
1253
|
+
'guard no longer applies. Decide: intended or restore deferral.');
|
|
1254
|
+
const [main] = createLoadOptionsList(1);
|
|
1255
|
+
trackController.load(main);
|
|
1256
|
+
const changeSpy = createEventSpy(trackController, 'trackActivated');
|
|
1257
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1258
|
+
adBreak: adBreak('midroll'),
|
|
1259
|
+
resumePosition: 5,
|
|
1260
|
+
});
|
|
1261
|
+
// Interrupt: a new ad becomes current before the deferred resume runs.
|
|
1262
|
+
deps.adController.currentAd = { ...ad, id: 'other' };
|
|
1263
|
+
await clock.tick();
|
|
1264
|
+
// The deferred setQueue was skipped; no track change occurred.
|
|
1265
|
+
expect(changeSpy).not.toHaveBeenCalled();
|
|
1266
|
+
});
|
|
1267
|
+
it('advances to the next track after a postroll ad when one exists', async () => {
|
|
1268
|
+
const list = createLoadOptionsList(2);
|
|
1269
|
+
trackController.load(...list);
|
|
1270
|
+
const trackEnded = createEventSpy(trackController, 'trackEnded');
|
|
1271
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1272
|
+
adBreak: adBreak('postroll'),
|
|
1273
|
+
resumePosition: 0,
|
|
1274
|
+
});
|
|
1275
|
+
await clock.tick();
|
|
1276
|
+
expect(trackController.activeTrack?.uri).toBe(list[1].uri);
|
|
1277
|
+
// The completed postroll ends the whole track.
|
|
1278
|
+
expect(trackEnded).toHaveBeenCalledWith(objectContaining({ track: any(Object) }));
|
|
1279
|
+
});
|
|
1280
|
+
it('ends the queue after a postroll ad when there is no next track', async () => {
|
|
1281
|
+
const [main] = createLoadOptionsList(1);
|
|
1282
|
+
trackController.load(main);
|
|
1283
|
+
await clock.tick(); // let the content activate and play
|
|
1284
|
+
// A postroll ad takes over, deactivating the content track.
|
|
1285
|
+
deps.adController.currentAd = ad;
|
|
1286
|
+
deps.adController.dispatch('adEntered', {
|
|
1287
|
+
ad,
|
|
1288
|
+
index: 0,
|
|
1289
|
+
totalAds: 1,
|
|
1290
|
+
});
|
|
1291
|
+
await flushAds();
|
|
1292
|
+
expect(trackController.activeTrack?.uri).toBe('https://ads/x.m3u8');
|
|
1293
|
+
const queueEnded = createEventSpy(trackController, 'queueEnded');
|
|
1294
|
+
const trackEnded = createEventSpy(trackController, 'trackEnded');
|
|
1295
|
+
const trackActivated = createEventSpy(trackController, 'trackActivated');
|
|
1296
|
+
deps.adController.currentAd = null;
|
|
1297
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1298
|
+
adBreak: adBreak('postroll'),
|
|
1299
|
+
resumePosition: 0,
|
|
1300
|
+
});
|
|
1301
|
+
await clock.tick();
|
|
1302
|
+
expect(trackEnded).toHaveBeenCalledWith(objectContaining({ track: any(Object) }));
|
|
1303
|
+
expect(queueEnded).toHaveBeenCalled();
|
|
1304
|
+
// With no next track the content is re-activated (kept current)
|
|
1305
|
+
// rather than left on the ad, and that trackActivated precedes
|
|
1306
|
+
// queueEnded.
|
|
1307
|
+
expect(trackController.activeTrack?.uri).toBe(main.uri);
|
|
1308
|
+
expect(trackActivated).toHaveBeenCalledWith(objectContaining({ track: objectContaining({ uri: main.uri }) }));
|
|
1309
|
+
expect(trackActivated).toHaveBeenCalledBefore(queueEnded);
|
|
1310
|
+
});
|
|
1311
|
+
it('does not treat a completed midroll ad as the track ending', async () => {
|
|
1312
|
+
trackController.load(...createLoadOptionsList(1));
|
|
1313
|
+
const trackEnded = createEventSpy(trackController, 'trackEnded');
|
|
1314
|
+
deps.adController.dispatch('adBreakCompleted', {
|
|
1315
|
+
adBreak: adBreak('midroll'),
|
|
1316
|
+
resumePosition: 5,
|
|
1317
|
+
});
|
|
1318
|
+
await clock.tick();
|
|
1319
|
+
expect(trackEnded).not.toHaveBeenCalled();
|
|
1320
|
+
});
|
|
1321
|
+
it('does not advance the queue when a postroll is pending on track end', async () => {
|
|
1322
|
+
const [main] = createLoadOptionsList(2);
|
|
1323
|
+
trackController.load(main);
|
|
1324
|
+
// onEnded resumes/advances based on enterPostroll()'s resolved
|
|
1325
|
+
// value: a pending postroll break means the queue must not advance.
|
|
1326
|
+
deps.adController.enterPostroll.and.resolveTo(adBreak('postroll'));
|
|
1327
|
+
const queueEnded = createEventSpy(trackController, 'queueEnded');
|
|
1328
|
+
deps.playbackController.dispatch('ended', {});
|
|
1329
|
+
await clock.tick();
|
|
1330
|
+
expect(deps.adController.enterPostroll).toHaveBeenCalled();
|
|
1331
|
+
expect(queueEnded).not.toHaveBeenCalled();
|
|
1332
|
+
expect(trackController.activeTrack?.uri).toBe(main.uri);
|
|
1333
|
+
});
|
|
1334
|
+
it('ignores an ended event fired while an ad track is playing', async () => {
|
|
1335
|
+
trackController.load(...createLoadOptionsList(1));
|
|
1336
|
+
deps.adController.currentAd = ad;
|
|
1337
|
+
deps.adController.dispatch('adEntered', {
|
|
1338
|
+
ad,
|
|
1339
|
+
index: 0,
|
|
1340
|
+
totalAds: 1,
|
|
1341
|
+
});
|
|
1342
|
+
await flushAds();
|
|
1343
|
+
// The ad track is now current over its parent content track.
|
|
1344
|
+
expect(trackController.activeTrack?.uri).toBe('https://ads/x.m3u8');
|
|
1345
|
+
const trackEnded = createEventSpy(trackController, 'trackEnded');
|
|
1346
|
+
const queueEnded = createEventSpy(trackController, 'queueEnded');
|
|
1347
|
+
// `ended` fires for the ad track too; the ad's end is the
|
|
1348
|
+
// AdController's concern, so the content must not be advanced.
|
|
1349
|
+
deps.playbackController.dispatch('ended', {});
|
|
1350
|
+
await clock.tick();
|
|
1351
|
+
expect(deps.adController.enterPostroll).not.toHaveBeenCalled();
|
|
1352
|
+
expect(trackEnded).not.toHaveBeenCalled();
|
|
1353
|
+
expect(queueEnded).not.toHaveBeenCalled();
|
|
1354
|
+
});
|
|
1355
|
+
it('fails the ad when the current track errors', async () => {
|
|
1356
|
+
trackController.load(...createLoadOptionsList(1));
|
|
1357
|
+
await clock.tick(); // let the deferred activation complete
|
|
1358
|
+
const track = trackController.activeTrack;
|
|
1359
|
+
const error = new Error('boom');
|
|
1360
|
+
track.dispatch('error', { target: track, error });
|
|
1361
|
+
expect(deps.adController.failAd).toHaveBeenCalledWith(error);
|
|
1362
|
+
});
|
|
1363
|
+
});
|
|
1364
|
+
describe('re-entrant queue changes', () => {
|
|
1365
|
+
it('throws if a trackDeactivated handler mutates the queue', async () => {
|
|
1366
|
+
// trackDeactivated is dispatched synchronously within setQueue (as
|
|
1367
|
+
// the previous track is torn down), so mutating the queue from it
|
|
1368
|
+
// trips setQueue's guard. (trackActivated is dispatched from the
|
|
1369
|
+
// deferred activate(), outside setQueue, so it is not guarded here.)
|
|
1370
|
+
trackController.load(...createLoadOptionsList(1));
|
|
1371
|
+
await clock.tick(); // activate the first track so it can deactivate
|
|
1372
|
+
let reentered = false;
|
|
1373
|
+
trackController.on('trackDeactivated', () => {
|
|
1374
|
+
if (!reentered) {
|
|
1375
|
+
reentered = true;
|
|
1376
|
+
trackController.clearQueue();
|
|
1377
|
+
}
|
|
1378
|
+
});
|
|
1379
|
+
expect(() => trackController.load(...createLoadOptionsList(2))).toThrowError(/queue/);
|
|
1380
|
+
});
|
|
1381
|
+
it('throws if a queueChange handler mutates the queue', () => {
|
|
1382
|
+
let reentered = false;
|
|
1383
|
+
trackController.on('queueChange', () => {
|
|
1384
|
+
// Mutating the queue from within a queueChange handler is
|
|
1385
|
+
// illegal; guard against infinite recursion in the test.
|
|
1386
|
+
if (!reentered) {
|
|
1387
|
+
reentered = true;
|
|
1388
|
+
trackController.enqueue(...createLoadOptionsList(1));
|
|
1389
|
+
}
|
|
1390
|
+
});
|
|
1391
|
+
expect(() => trackController.load(...createLoadOptionsList(2))).toThrowError(/queueChange/);
|
|
1392
|
+
});
|
|
1393
|
+
});
|
|
792
1394
|
describe('dispose', () => {
|
|
793
1395
|
afterEach(() => {
|
|
794
1396
|
disposed = true;
|
|
@@ -797,9 +1399,10 @@ describe('TrackControllerImpl', () => {
|
|
|
797
1399
|
trackController.dispose();
|
|
798
1400
|
expect(deps.playbackController.hasAnyListeners()).toBeFalse();
|
|
799
1401
|
});
|
|
800
|
-
it('disposes current track', () => {
|
|
1402
|
+
it('disposes current track', async () => {
|
|
801
1403
|
trackController.load(...createLoadOptionsList(1));
|
|
802
|
-
|
|
1404
|
+
await clock.tick(); // let the deferred activation complete
|
|
1405
|
+
const track = trackController.activeTrack;
|
|
803
1406
|
trackController.dispose();
|
|
804
1407
|
expect(track.dispose).toHaveBeenCalledOnceWith();
|
|
805
1408
|
});
|