@amazon/vinyl 3.0.0 → 3.1.0
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 +987 -969
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +665 -638
- package/dist/index.js.map +4 -4
- package/dist/test/benchmark.js.map +2 -2
- package/dist/test/integ.es5.js +357 -353
- package/dist/test/integ.js +2361 -1870
- package/dist/test/integ.js.map +4 -4
- package/dist/test/jasmine.css +50 -3
- package/dist/test/jasmineHtml.es5.js +195 -155
- package/dist/test/jasmineHtml.js +2938 -1833
- package/dist/test/jasmineHtml.js.map +3 -3
- package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
- package/dist/types/current/ad/AdControllerImpl.js +4 -1
- package/dist/types/current/ad/discoverHlsInterstitials.d.ts.map +1 -1
- package/dist/types/current/ad/discoverHlsInterstitials.js +2 -2
- package/dist/types/current/drm/DrmControllerImpl.d.ts +2 -0
- package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.js +56 -48
- package/dist/types/current/drm/licenseProvider/defaultLicenseProvider.d.ts.map +1 -1
- package/dist/types/current/drm/licenseProvider/defaultLicenseProvider.js +2 -2
- package/dist/types/current/index.d.ts +3 -6
- package/dist/types/current/index.d.ts.map +1 -1
- package/dist/types/current/index.js +3 -6
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts.map +1 -1
- package/dist/types/current/playback/PlaybackControllerImpl.js +100 -9
- package/dist/types/current/playback/ReadonlyPlaybackController.d.ts +27 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.d.ts.map +1 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.js +16 -0
- package/dist/types/current/playback/createStallDetector.d.ts +43 -0
- package/dist/types/current/playback/createStallDetector.d.ts.map +1 -0
- package/dist/types/current/playback/createStallDetector.js +101 -0
- package/dist/types/current/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/current/playback/createStallMonitor.d.ts.map +1 -0
- package/dist/types/current/playback/createStallMonitor.js +94 -0
- package/dist/types/current/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/current/streaming/AudioOptions.d.ts.map +1 -1
- package/dist/types/current/streaming/AudioOptions.js +5 -1
- package/dist/types/current/streaming/ContentStream.d.ts +0 -5
- package/dist/types/current/streaming/ContentStream.d.ts.map +1 -1
- package/dist/types/current/streaming/ContentStream.js +0 -4
- package/dist/types/current/streaming/LoadMetric.d.ts.map +1 -1
- package/dist/types/current/streaming/StreamingEventMap.d.ts +1 -5
- package/dist/types/current/streaming/StreamingEventMap.d.ts.map +1 -1
- package/dist/types/current/streaming/StreamingEventMap.js +0 -1
- package/dist/types/current/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/BufferingController.js +0 -13
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts.map +1 -1
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.js +13 -4
- package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -1
- package/dist/types/current/text/SidecarTextTrackLoader.js +4 -4
- package/dist/types/current/text/TextTrack.d.ts.map +1 -1
- package/dist/types/current/track/TrackController.d.ts.map +1 -1
- package/dist/types/current/track/TrackController.js +38 -32
- package/dist/types/current/track/createSegmentDataProvider.d.ts.map +1 -1
- package/dist/types/current/track/createSegmentDataProvider.js +6 -3
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts.map +1 -1
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.js +13 -8
- package/dist/types/current/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.d.ts.map +1 -1
- package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.js +71 -3
- package/dist/types/current/track/dash/urlDashManifestProvider.js +2 -2
- package/dist/types/current/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/current/track/dash/util/mpd.d.ts.map +1 -1
- package/dist/types/current/track/dash/util/mpd.js +24 -3
- package/dist/types/current/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/current/track/filters/resourceTypeFilter.d.ts.map +1 -1
- package/dist/types/current/track/filters/resourceTypeFilter.js +4 -0
- package/dist/types/current/track/filters/sampleRateFilter.d.ts +21 -7
- package/dist/types/current/track/filters/sampleRateFilter.d.ts.map +1 -1
- package/dist/types/current/track/filters/sampleRateFilter.js +42 -24
- package/dist/types/current/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +3 -3
- package/dist/types/current/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
- package/dist/types/current/track/mse/MseTrack.js +29 -46
- package/dist/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/types/current/util/media/mimeType.d.ts +8 -0
- package/dist/types/current/util/media/mimeType.d.ts.map +1 -0
- package/dist/types/current/util/media/mimeType.js +13 -0
- package/dist/types/current/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
- package/dist/types/current/vinyl/createVinylFactories.js +2 -12
- package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +2 -0
- package/dist/types/ts3.7/index.d.ts +3 -6
- package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/ts3.7/playback/ReadonlyPlaybackController.d.ts +28 -0
- package/dist/types/ts3.7/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts3.7/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts3.7/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/ts3.7/streaming/ContentStream.d.ts +0 -5
- package/dist/types/ts3.7/streaming/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/ts3.7/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/ts3.7/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/ts3.7/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/ts3.7/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/ts3.7/track/filters/sampleRateFilter.d.ts +21 -7
- package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts3.7/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +2 -0
- package/dist/types/ts4.1/index.d.ts +3 -6
- package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/ts4.1/playback/ReadonlyPlaybackController.d.ts +28 -0
- package/dist/types/ts4.1/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts4.1/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts4.1/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/ts4.1/streaming/ContentStream.d.ts +0 -5
- package/dist/types/ts4.1/streaming/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/ts4.1/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/ts4.1/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/ts4.1/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/ts4.1/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/ts4.1/track/filters/sampleRateFilter.d.ts +21 -7
- package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.1/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +2 -0
- package/dist/types/ts4.7/index.d.ts +3 -6
- package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/ts4.7/playback/ReadonlyPlaybackController.d.ts +28 -0
- package/dist/types/ts4.7/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts4.7/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts4.7/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/ts4.7/streaming/ContentStream.d.ts +0 -5
- package/dist/types/ts4.7/streaming/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/ts4.7/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/ts4.7/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/ts4.7/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/ts4.7/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/ts4.7/track/filters/sampleRateFilter.d.ts +21 -7
- package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.7/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/unit/types/current/ad/AdControllerImpl.test.js +27 -1
- package/dist/unit/types/current/drm/DrmControllerImpl.test.js +93 -0
- package/dist/unit/types/current/index.d.ts +3 -4
- package/dist/unit/types/current/index.d.ts.map +1 -1
- package/dist/unit/types/current/index.js +3 -4
- package/dist/unit/types/current/playback/PlaybackControllerImpl.test.js +165 -0
- package/dist/unit/types/current/playback/createStallDetector.test.d.ts +2 -0
- package/dist/unit/types/current/playback/createStallDetector.test.d.ts.map +1 -0
- package/dist/unit/types/current/playback/createStallDetector.test.js +163 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.d.ts +2 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.d.ts.map +1 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.js +125 -0
- package/dist/unit/types/current/streaming/ContentStream.test.js +0 -11
- package/dist/unit/types/current/streaming/MseTrack.test.js +47 -74
- package/dist/unit/types/current/streaming/abr/QualitySelectorImpl.test.js +1 -1
- package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +0 -21
- package/dist/unit/types/current/streaming/createDefaultMediaTimelineTransformer.test.js +133 -0
- package/dist/unit/types/current/track/TrackController.test.js +97 -1
- package/dist/unit/types/current/track/createSegmentDataProvider.test.js +18 -0
- package/dist/unit/types/current/track/dash/DashMediaQualityMetadataResolver.test.js +46 -14
- package/dist/unit/types/current/track/dash/createSegmentControllerFactory.test.js +1 -0
- package/dist/unit/types/current/track/dash/timeline/DashRepresentationSegmentProvider.test.js +114 -0
- package/dist/unit/types/current/track/dash/util/mpd.test.js +37 -0
- package/dist/unit/types/current/track/filters/resourceTypeFilter.test.js +7 -0
- package/dist/unit/types/current/track/filters/sampleRateFilter.test.js +136 -34
- package/dist/unit/types/current/track/source/SourceObjectTrack.test.js +1 -1
- package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/unit/types/current/util/media/mimeType.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/mimeType.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/mimeType.test.js +22 -0
- package/dist/unit/types/current/vinyl/createVinylFactories.test.js +2 -36
- package/dist/vinylTestUtil/index.js +6 -4
- package/dist/vinylTestUtil/index.js.map +2 -2
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.js +1 -0
- package/dist/vinylTestUtil/types/current/media/FrequencyAnalyzer.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.js +0 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.js +0 -1
- package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +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 +9 -1
- package/dist/vinylTestUtil/types/ts3.7/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.1/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.7/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/docs/USAGE.md +29 -0
- package/package.json +11 -10
- package/dist/types/current/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/current/patch/media/HtmlMediaElementPatch.d.ts.map +0 -1
- package/dist/types/current/patch/media/HtmlMediaElementPatch.js +0 -5
- package/dist/types/current/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/current/patch/media/MediaElementPatchOptions.d.ts.map +0 -1
- package/dist/types/current/patch/media/MediaElementPatchOptions.js +0 -16
- package/dist/types/current/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/current/patch/media/patchMediaElement.d.ts.map +0 -1
- package/dist/types/current/patch/media/patchMediaElement.js +0 -15
- package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts.map +0 -1
- package/dist/types/current/patch/media/patches/createPreventStallsPatch.js +0 -55
- package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts.map +0 -1
- package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.js +0 -218
- package/dist/types/current/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/types/current/vinyl/VinylPatchOptions.d.ts.map +0 -1
- package/dist/types/current/vinyl/VinylPatchOptions.js +0 -11
- package/dist/types/ts3.7/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/ts3.7/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/ts3.7/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/ts3.7/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/ts3.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/ts3.7/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/types/ts4.1/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/ts4.1/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/ts4.1/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/ts4.1/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/ts4.1/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/ts4.1/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/types/ts4.7/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/ts4.7/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/ts4.7/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/ts4.7/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/ts4.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/ts4.7/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.js +0 -17
- package/dist/unit/types/current/patch/media/patchMediaElement.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/patchMediaElement.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/patchMediaElement.test.js +0 -36
- package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.js +0 -93
- package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.js +0 -423
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/ad/AdControllerImpl.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AdControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/ad/AdControllerImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -173,7 +173,7 @@ export class AdControllerImpl extends EventHostImpl {
|
|
|
173
173
|
*/
|
|
174
174
|
providerInterrupted() {
|
|
175
175
|
const provider = this.adsProvider;
|
|
176
|
-
return () => provider !== this.adsProvider;
|
|
176
|
+
return () => this.disposed || provider !== this.adsProvider;
|
|
177
177
|
}
|
|
178
178
|
setAdsProvider(provider) {
|
|
179
179
|
if (this.adsProvider === provider)
|
|
@@ -623,6 +623,9 @@ export class AdControllerImpl extends EventHostImpl {
|
|
|
623
623
|
*/
|
|
624
624
|
dispose() {
|
|
625
625
|
super.dispose();
|
|
626
|
+
// Tear down the ads-provider subscription so a late adsChange can't
|
|
627
|
+
// re-run ad discovery (and log) after dispose.
|
|
628
|
+
this.adsProviderSub?.();
|
|
626
629
|
this.disposer.dispose();
|
|
627
630
|
// Detach any active break so currentAd/currentAdBreak read null after
|
|
628
631
|
// dispose, even if a break's ad list resolves late (startAd is already
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discoverHlsInterstitials.d.ts","sourceRoot":"","sources":["../../../../src/ad/discoverHlsInterstitials.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"discoverHlsInterstitials.d.ts","sourceRoot":"","sources":["../../../../src/ad/discoverHlsInterstitials.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAU9E,OAAO,KAAK,EAER,WAAW,EAMd,MAAM,eAAe,CAAA;AActB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAChC,OAAO,CAAC,WAAW,CAAC,CAmDtB"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import { HLS_INTERSTITIAL_CLASS } from '@amazon/vinyl-hls-parser';
|
|
6
|
-
import { memoize, requestWithRetry, resolveUrl, } from '@amazon/vinyl-util';
|
|
6
|
+
import { memoize, readResponseBody, requestWithRetry, resolveUrl, } from '@amazon/vinyl-util';
|
|
7
7
|
/**
|
|
8
8
|
* How close to the start or end of content a break must be to be classified as
|
|
9
9
|
* a pre-roll or post-roll rather than a mid-roll, in seconds.
|
|
@@ -215,7 +215,7 @@ function resolveHlsAssetContent({ range, startTime, duration, baseUrl, }) {
|
|
|
215
215
|
async function resolveHlsAssetList({ assetListUrl, rangeId, startTime, baseUrl, }) {
|
|
216
216
|
const url = resolveUrl(assetListUrl, baseUrl);
|
|
217
217
|
const response = await requestWithRetry(url);
|
|
218
|
-
const json = await response
|
|
218
|
+
const json = await readResponseBody(response, 'json');
|
|
219
219
|
const assets = json.ASSETS ?? [];
|
|
220
220
|
const ads = assets.map((asset, i) => {
|
|
221
221
|
return {
|
|
@@ -65,6 +65,8 @@ export declare class DrmControllerImpl extends EventHostImpl<DrmControllerEventM
|
|
|
65
65
|
*/
|
|
66
66
|
private maybeCreateSession;
|
|
67
67
|
initializeForPlayback(drmInfo: MediaFormatMetadata | null, options?: DrmPlaybackOptions): void;
|
|
68
|
+
/** True when the manifest carried pssh (sessions come from it, not events). */
|
|
69
|
+
private manifestProvidesInitData;
|
|
68
70
|
setBufferingDrmInfo(drmInfo: MediaFormatMetadata | null, options?: DrmPlaybackOptions): void;
|
|
69
71
|
/**
|
|
70
72
|
* If the drm metadata contains initialization data for the current key system, create a new session.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrmControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/drm/DrmControllerImpl.ts"],"names":[],"mappings":"AAKA,OAAO,EAUH,aAAa,EAMb,KAAK,KAAK,EASb,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAEH,KAAK,UAAU,EAGlB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EACR,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACR,SAAS,EAET,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,EAExB,MAAM,uBAAuB,CAAA;AAK9B,OAAO,KAAK,EAER,mBAAmB,EACtB,MAAM,mCAAmC,CAAA;AAS1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,KAAK,CAAA;AAGjC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAA;IACvC,QAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAA;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;CACrC;
|
|
1
|
+
{"version":3,"file":"DrmControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/drm/DrmControllerImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,6 +93,12 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
93
93
|
handleEncryptedEvent = (event) => {
|
|
94
94
|
if (this.disposed)
|
|
95
95
|
return;
|
|
96
|
+
// Manifest pssh drives sessions; ignore redundant in-band events.
|
|
97
|
+
if (this.manifestProvidesInitData()) {
|
|
98
|
+
logDebug(this, 'ignoring encrypted event; manifest provides pssh');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
;
|
|
96
102
|
(async () => {
|
|
97
103
|
const { initData, initDataType } = event;
|
|
98
104
|
if (!initData) {
|
|
@@ -162,35 +168,41 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
162
168
|
const licenseServerOptionsProvider = keySystemOptions?.licenseServer;
|
|
163
169
|
const licenseServerOptions = await resolveValueProvider(licenseServerOptionsProvider ?? {});
|
|
164
170
|
this.abortIfDisposed();
|
|
165
|
-
const
|
|
171
|
+
const certBytes = toCertBytes(licenseServerOptions.serverCertificate);
|
|
172
|
+
if (certBytes) {
|
|
173
|
+
await mediaKeys.setServerCertificate(certBytes);
|
|
174
|
+
this.abortIfDisposed();
|
|
175
|
+
}
|
|
176
|
+
// Transform before matching/creating so the reuse check compares the
|
|
177
|
+
// same (transformed) bytes the CDM gets. Identity except FairPlay.
|
|
178
|
+
const transform = keySystemOptions?.initDataTransformer ??
|
|
179
|
+
defaultInitDataTransformer(mediaKeys.keySystem, certBytes);
|
|
180
|
+
const transformedInitData = transform(bufferToByteArray(initData), initDataType, drmInfo);
|
|
181
|
+
const existingSession = this.getSessionByInitData(transformedInitData);
|
|
166
182
|
if (existingSession) {
|
|
167
183
|
logDebug(this, 'reusing session');
|
|
168
184
|
return existingSession;
|
|
169
185
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
this.closeSession(newSession);
|
|
191
|
-
});
|
|
192
|
-
return newSession;
|
|
193
|
-
}
|
|
186
|
+
const newSession = this.createNewSession({
|
|
187
|
+
mediaKeys,
|
|
188
|
+
initData: transformedInitData,
|
|
189
|
+
initDataType,
|
|
190
|
+
drmInfo,
|
|
191
|
+
trackUri,
|
|
192
|
+
});
|
|
193
|
+
this.sessions.push(newSession);
|
|
194
|
+
this.dispatch('sessionCreate', {
|
|
195
|
+
initDataType: newSession.initDataType,
|
|
196
|
+
mimeType: newSession.mimeType,
|
|
197
|
+
});
|
|
198
|
+
newSession.on('closed', () => this.closeSession(newSession));
|
|
199
|
+
abort?.onAborted(() => {
|
|
200
|
+
if (this.disposed)
|
|
201
|
+
return;
|
|
202
|
+
logDebug(this, 'abort session');
|
|
203
|
+
this.closeSession(newSession);
|
|
204
|
+
});
|
|
205
|
+
return newSession;
|
|
194
206
|
}
|
|
195
207
|
initializeForPlayback(drmInfo, options) {
|
|
196
208
|
logDebug(this, 'initializeForPlayback', drmInfo);
|
|
@@ -198,6 +210,11 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
198
210
|
this.createSessionFromInitData(drmInfo, options?.trackUri ?? null, options?.abort).catch(this.handleError);
|
|
199
211
|
}
|
|
200
212
|
}
|
|
213
|
+
/** True when the manifest carried pssh (sessions come from it, not events). */
|
|
214
|
+
manifestProvidesInitData() {
|
|
215
|
+
return (this.drmInfo?.contentProtections.some((cP) => cP.pssh != null) ??
|
|
216
|
+
false);
|
|
217
|
+
}
|
|
201
218
|
setBufferingDrmInfo(drmInfo, options) {
|
|
202
219
|
logDebug(this, 'setBufferingDrmInfo', drmInfo);
|
|
203
220
|
// Reset 'encrypted' error reporting
|
|
@@ -325,26 +342,10 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
325
342
|
/**
|
|
326
343
|
* Creates a new key session and adds a message handler.
|
|
327
344
|
*/
|
|
328
|
-
|
|
329
|
-
const {
|
|
330
|
-
let initData = options.initData;
|
|
331
|
-
const certBytes = serverCertificate
|
|
332
|
-
? typeof serverCertificate === 'string'
|
|
333
|
-
? base64ToByteArray(serverCertificate)
|
|
334
|
-
: bufferToByteArray(serverCertificate)
|
|
335
|
-
: null;
|
|
336
|
-
if (certBytes) {
|
|
337
|
-
await mediaKeys.setServerCertificate(certBytes);
|
|
338
|
-
}
|
|
339
|
-
// Default initDataTransformer handles FAIR_PLAY_1_0 by packing the
|
|
340
|
-
// skd init data with the content ID and server certificate.
|
|
341
|
-
// FAIR_PLAY_1_0 always uses initDataType 'skd', so the default
|
|
342
|
-
// does not need to explicitly check initDataType.
|
|
343
|
-
const transform = initDataTransformer ??
|
|
344
|
-
defaultInitDataTransformer(mediaKeys.keySystem, certBytes);
|
|
345
|
-
initData = transform(bufferToByteArray(initData), initDataType, drmInfo);
|
|
345
|
+
createNewSession(options) {
|
|
346
|
+
const { mediaKeys, initData, initDataType, drmInfo, trackUri } = options;
|
|
346
347
|
this.abortIfDisposed();
|
|
347
|
-
logDebug(this, 'createSession', drmInfo.mimeType, initDataType);
|
|
348
|
+
logDebug(this, 'createSession', drmInfo.mimeType, initDataType, drmInfo);
|
|
348
349
|
const session = mediaKeys.createSession(drmInfo.mimeType, initDataType, initData);
|
|
349
350
|
session.on('message', (event) => {
|
|
350
351
|
withTimeout(this.messageHandler({
|
|
@@ -371,7 +372,7 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
371
372
|
this.pendingMessageProps = messageProps;
|
|
372
373
|
const keySystem = mediaKeys.keySystem;
|
|
373
374
|
logDebug(this, 'message', keySystem, event.message.byteLength);
|
|
374
|
-
const keySystemOptions = this.options.keySystems[keySystem];
|
|
375
|
+
const keySystemOptions = this.options.keySystems[keySystem] ?? this.options.keySystems['*'];
|
|
375
376
|
const licenseServerOptionsProvider = keySystemOptions?.licenseServer;
|
|
376
377
|
// Get the license server configuration for the current key system.
|
|
377
378
|
const licenseServerOptions = clone(await resolveValueProvider(licenseServerOptionsProvider)) ??
|
|
@@ -390,6 +391,8 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
390
391
|
}
|
|
391
392
|
const licenseSpanStart = Date.now();
|
|
392
393
|
const key = await this.licenseProvider(keySystem, licenseServerOptions, challenge);
|
|
394
|
+
if (this.disposed)
|
|
395
|
+
return;
|
|
393
396
|
this.dispatch('loadSpanMeasured', {
|
|
394
397
|
kind: 'license',
|
|
395
398
|
startTime: licenseSpanStart,
|
|
@@ -498,9 +501,7 @@ export class DrmControllerImpl extends EventHostImpl {
|
|
|
498
501
|
this.disposer.dispose();
|
|
499
502
|
}
|
|
500
503
|
getSessionByInitData(initData) {
|
|
501
|
-
return (this.sessions.find((session) =>
|
|
502
|
-
return buffersEqual(session.initData, initData);
|
|
503
|
-
}) ?? null);
|
|
504
|
+
return (this.sessions.find((session) => buffersEqual(session.initData, initData)) ?? null);
|
|
504
505
|
}
|
|
505
506
|
/**
|
|
506
507
|
* Sort the key systems first by their priority, then by the presence of a license uri.
|
|
@@ -519,6 +520,13 @@ const messageEventValidator = object({
|
|
|
519
520
|
function hasMimeType(drmInfo) {
|
|
520
521
|
return drmInfo.mimeType != null;
|
|
521
522
|
}
|
|
523
|
+
function toCertBytes(serverCertificate) {
|
|
524
|
+
if (!serverCertificate)
|
|
525
|
+
return null;
|
|
526
|
+
return typeof serverCertificate === 'string'
|
|
527
|
+
? base64ToByteArray(serverCertificate)
|
|
528
|
+
: bufferToByteArray(serverCertificate);
|
|
529
|
+
}
|
|
522
530
|
/**
|
|
523
531
|
* Default initDataTransformer. For FAIR_PLAY_1_0, packs the skd init data
|
|
524
532
|
* with the extracted content ID and server certificate into the format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultLicenseProvider.d.ts","sourceRoot":"","sources":["../../../../../src/drm/licenseProvider/defaultLicenseProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaultLicenseProvider.d.ts","sourceRoot":"","sources":["../../../../../src/drm/licenseProvider/defaultLicenseProvider.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,mBAAmB,CAAA;AAE9E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAqBpC,CAAA"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import { requestWithRetry, ValidationError } from '@amazon/vinyl-util';
|
|
5
|
+
import { readResponseBody, requestWithRetry, ValidationError, } from '@amazon/vinyl-util';
|
|
6
6
|
/**
|
|
7
7
|
* A basic LicenseProvider which uses the configuration set for the current key system,
|
|
8
8
|
* transmits a challenge as the body, and returns an array buffer.
|
|
@@ -24,5 +24,5 @@ export const defaultLicenseProvider = async (keySystem, serverOptions, challenge
|
|
|
24
24
|
...serverOptions.init,
|
|
25
25
|
body: challenge,
|
|
26
26
|
}, { abort });
|
|
27
|
-
return await res
|
|
27
|
+
return await readResponseBody(res, 'arrayBuffer');
|
|
28
28
|
};
|
|
@@ -38,11 +38,8 @@ export * from './global/environment';
|
|
|
38
38
|
export * from './global/globalRef';
|
|
39
39
|
export * from './global/initializeVinylGlobal';
|
|
40
40
|
export * from './global/PlayerRegistry';
|
|
41
|
-
export * from './
|
|
42
|
-
export * from './
|
|
43
|
-
export * from './patch/media/patches/createPreventStallsPatch';
|
|
44
|
-
export * from './patch/media/patches/createUnreliablePlaybackEventsPatch';
|
|
45
|
-
export * from './patch/media/patchMediaElement';
|
|
41
|
+
export * from './playback/createStallDetector';
|
|
42
|
+
export * from './playback/createStallMonitor';
|
|
46
43
|
export * from './playback/error/InvalidSeekError';
|
|
47
44
|
export * from './playback/error/ReportableMediaError';
|
|
48
45
|
export * from './playback/logging/mediaErrorToJson';
|
|
@@ -150,12 +147,12 @@ export * from './util/media/codecOverrides';
|
|
|
150
147
|
export * from './util/media/codecSupport';
|
|
151
148
|
export * from './util/media/getAudioContext';
|
|
152
149
|
export * from './util/media/mediaSource';
|
|
150
|
+
export * from './util/media/mimeType';
|
|
153
151
|
export * from './util/media/sourceBuffer';
|
|
154
152
|
export * from './vinyl/createVinylFactories';
|
|
155
153
|
export * from './vinyl/playerConfigFactory';
|
|
156
154
|
export * from './vinyl/ReadonlyPlaybackStreamingState';
|
|
157
155
|
export * from './vinyl/VinylDeps';
|
|
158
156
|
export * from './vinyl/VinylOptions';
|
|
159
|
-
export * from './vinyl/VinylPatchOptions';
|
|
160
157
|
export * from './vinyl/VinylPlayer';
|
|
161
158
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA;AACjD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,kCAAkC,CAAA;AAChD,cAAc,uCAAuC,CAAA;AACrD,cAAc,mCAAmC,CAAA;AACjD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,mCAAmC,CAAA;AACjD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8CAA8C,CAAA;AAC5D,cAAc,uCAAuC,CAAA;AACrD,cAAc,0CAA0C,CAAA;AACxD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,qCAAqC,CAAA;AACnD,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,yBAAyB,CAAA;AACvC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,11 +38,8 @@ export * from './global/environment';
|
|
|
38
38
|
export * from './global/globalRef';
|
|
39
39
|
export * from './global/initializeVinylGlobal';
|
|
40
40
|
export * from './global/PlayerRegistry';
|
|
41
|
-
export * from './
|
|
42
|
-
export * from './
|
|
43
|
-
export * from './patch/media/patches/createPreventStallsPatch';
|
|
44
|
-
export * from './patch/media/patches/createUnreliablePlaybackEventsPatch';
|
|
45
|
-
export * from './patch/media/patchMediaElement';
|
|
41
|
+
export * from './playback/createStallDetector';
|
|
42
|
+
export * from './playback/createStallMonitor';
|
|
46
43
|
export * from './playback/error/InvalidSeekError';
|
|
47
44
|
export * from './playback/error/ReportableMediaError';
|
|
48
45
|
export * from './playback/logging/mediaErrorToJson';
|
|
@@ -150,11 +147,11 @@ export * from './util/media/codecOverrides';
|
|
|
150
147
|
export * from './util/media/codecSupport';
|
|
151
148
|
export * from './util/media/getAudioContext';
|
|
152
149
|
export * from './util/media/mediaSource';
|
|
150
|
+
export * from './util/media/mimeType';
|
|
153
151
|
export * from './util/media/sourceBuffer';
|
|
154
152
|
export * from './vinyl/createVinylFactories';
|
|
155
153
|
export * from './vinyl/playerConfigFactory';
|
|
156
154
|
export * from './vinyl/ReadonlyPlaybackStreamingState';
|
|
157
155
|
export * from './vinyl/VinylDeps';
|
|
158
156
|
export * from './vinyl/VinylOptions';
|
|
159
|
-
export * from './vinyl/VinylPatchOptions';
|
|
160
157
|
export * from './vinyl/VinylPlayer';
|
|
@@ -29,12 +29,19 @@ export interface PlaybackControllerImplOptions {
|
|
|
29
29
|
* Default: 30
|
|
30
30
|
*/
|
|
31
31
|
readonly seekTimeout: number;
|
|
32
|
+
/**
|
|
33
|
+
* The number of seconds the play head must be frozen while playing before a stall is reported
|
|
34
|
+
* via the `stallEntered`/`stallEnded` events.
|
|
35
|
+
* Default: 1
|
|
36
|
+
*/
|
|
37
|
+
readonly stallThreshold: number;
|
|
32
38
|
}
|
|
33
39
|
export declare const defaultPlaybackControllerImplOptions: {
|
|
34
40
|
readonly loopTimeAffordance: 2;
|
|
35
41
|
readonly minSeekableBuffer: -1;
|
|
36
42
|
readonly playTimeout: 30;
|
|
37
43
|
readonly seekTimeout: 30;
|
|
44
|
+
readonly stallThreshold: 1;
|
|
38
45
|
};
|
|
39
46
|
/**
|
|
40
47
|
* Safari and Edge Legacy cannot reliably seek close to the end of a seekable range.
|
|
@@ -57,6 +64,7 @@ export declare class PlaybackControllerImpl extends EventHostImpl<PlaybackContro
|
|
|
57
64
|
private _seeking;
|
|
58
65
|
private _waiting;
|
|
59
66
|
private _seekId;
|
|
67
|
+
private stopStallDetection;
|
|
60
68
|
private userVolume;
|
|
61
69
|
private _pendingPlay;
|
|
62
70
|
private playAbort;
|
|
@@ -153,6 +161,13 @@ export declare class PlaybackControllerImpl extends EventHostImpl<PlaybackContro
|
|
|
153
161
|
pause(): void;
|
|
154
162
|
private get pendingPlay();
|
|
155
163
|
private set pendingPlay(value);
|
|
164
|
+
/**
|
|
165
|
+
* Starts (or restarts) the stall detector: recovers a play head that stays frozen when it
|
|
166
|
+
* should be advancing — some WebKit versions never resume after a seek or a play, e.g. after a
|
|
167
|
+
* buffer-flushing seek. Superseded by the next seek/play and stopped on dispose.
|
|
168
|
+
* @private
|
|
169
|
+
*/
|
|
170
|
+
private startStallDetection;
|
|
156
171
|
play(): Promise<void>;
|
|
157
172
|
get canPlay(): boolean;
|
|
158
173
|
get canPlayThrough(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaybackControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/playback/PlaybackControllerImpl.ts"],"names":[],"mappings":"AAKA,OAAO,EAWH,aAAa,EAUb,KAAK,cAAc,EAKtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EACH,KAAK,0BAA0B,EAC/B,kBAAkB,EAGrB,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"PlaybackControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/playback/PlaybackControllerImpl.ts"],"names":[],"mappings":"AAKA,OAAO,EAWH,aAAa,EAUb,KAAK,cAAc,EAKtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EACH,KAAK,0BAA0B,EAC/B,kBAAkB,EAGrB,MAAM,8BAA8B,CAAA;AAOrC,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAA;AAGjG,MAAM,WAAW,6BAA6B;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IAEnC;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAElC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAE5B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAClC;AAED,eAAO,MAAM,oCAAoC;;;;;;CAMC,CAAA;AAElD;;;;GAIG;AACH,wBAAgB,2BAA2B,UAE1C;AAiBD,MAAM,WAAW,0BAA0B;IACvC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;IAChC,QAAQ,CAAC,+BAA+B,EAAE,+BAA+B,CAAA;CAC5E;AAED,qBAAa,sBACT,SAAQ,aAAa,CAAC,0BAA0B,CAChD,YAAW,kBAAkB;IAE7B,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAiC;IACjF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;IAED,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAQ;IAGxB,OAAO,CAAC,OAAO,CAAI;IAGnB,OAAO,CAAC,kBAAkB,CAA4B;IAGtD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAc;IAElC,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAA;gBAG3C,IAAI,EAAE,0BAA0B,EAChC,OAAO,CAAC,EAAE,OAAO,CAAC,6BAA6B,CAAC;IAiEpD;;;OAGG;IACH,OAAO,CAAC,aAAa;IAWrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAyDjC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,cAAc;IAiCtB;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAoB7B,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAGpC;IAED,IAAI,QAAQ,IAAI,MAAM,CAIrB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAExB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAGtB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAGvB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAG7B;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,EAGhC;IAED,IAAI,UAAU,IAAI,kBAAkB,CAEnC;IAED,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAIvB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,KAAK,IAAI,IAAI;IAWb,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,WAAW,QAMtB;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAU3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCrB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAEK,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6H1D;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IAyBvC,KAAK;IAUL;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,OAAO;CAGV;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,GAAG,GACZ,MAAM,IAAI;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAEvC"}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import { Abort, AbortError, Browser, clamp, closeTo, createDisposer, createTimeRangesReader, DomEventHost, ErrorLevel, ErrorOrigin, EventHostImpl,
|
|
5
|
+
import { Abort, AbortError, Browser, clamp, closeTo, createDisposer, createTimeRangesReader, DomEventHost, ErrorLevel, ErrorOrigin, EventHostImpl, hasBrowser, logDebug, logInfo, logWarn, nextEventAsPromise, noop, onAny, ownKeys, TimeoutSlot, toLowerCase, withAbort, withTimeout, } from '@amazon/vinyl-util';
|
|
6
6
|
import { LIVE_DURATION } from './PlaybackController';
|
|
7
7
|
import { PlaybackReadyState, playedReasons, waitedReasons, } from './ReadonlyPlaybackController';
|
|
8
|
+
import { createStallDetector } from './createStallDetector';
|
|
9
|
+
import { createStallMonitor } from './createStallMonitor';
|
|
8
10
|
import { InvalidSeekError } from './error/InvalidSeekError';
|
|
9
11
|
import { playbackStateLoggingHandler } from './logging/playbackStateLoggingHandler';
|
|
10
12
|
import { createChangeEventTrigger } from '../event/ChangeEvent';
|
|
@@ -15,6 +17,7 @@ export const defaultPlaybackControllerImplOptions = {
|
|
|
15
17
|
minSeekableBuffer: -1, // Default comes from getMinSeekableBufferDefault()
|
|
16
18
|
playTimeout: 30,
|
|
17
19
|
seekTimeout: 30,
|
|
20
|
+
stallThreshold: 1,
|
|
18
21
|
};
|
|
19
22
|
/**
|
|
20
23
|
* Safari and Edge Legacy cannot reliably seek close to the end of a seekable range.
|
|
@@ -24,6 +27,19 @@ export const defaultPlaybackControllerImplOptions = {
|
|
|
24
27
|
export function getMinSeekableBufferDefault() {
|
|
25
28
|
return !hasBrowser(Browser.CHROMIUM) ? 5 : 2;
|
|
26
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Re-issue a seek up to this many times when it lands outside tolerance of the target (some WebKit
|
|
32
|
+
* versions report `seeked` at the pre-seek position) or when it never completes (see
|
|
33
|
+
* {@link SEEK_ATTEMPT_TIMEOUT}).
|
|
34
|
+
*/
|
|
35
|
+
const SEEK_RETRY_LIMIT = 2;
|
|
36
|
+
/**
|
|
37
|
+
* Seconds to wait for `seeked` before treating a seek attempt as stuck. WebKit can leave a seek on
|
|
38
|
+
* a freshly-attached, never-decoded source pending forever (observed on iOS Safari); on a stuck
|
|
39
|
+
* attempt the decoder is warmed with play() and the seek re-issued. Comfortably above a normal
|
|
40
|
+
* seek's completion time so a slow-but-valid seek isn't cut short.
|
|
41
|
+
*/
|
|
42
|
+
const SEEK_ATTEMPT_TIMEOUT = 4;
|
|
27
43
|
export class PlaybackControllerImpl extends EventHostImpl {
|
|
28
44
|
loudnessNormalizationController;
|
|
29
45
|
get [Symbol.toStringTag]() {
|
|
@@ -38,6 +54,8 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
38
54
|
_waiting = false;
|
|
39
55
|
// Monotonic counter identifying the most recent seekTo call.
|
|
40
56
|
_seekId = 0;
|
|
57
|
+
// Stops the stall detector started after the last seek, if any.
|
|
58
|
+
stopStallDetection = null;
|
|
41
59
|
// default user volume (0.0 to 1.0 scale)
|
|
42
60
|
userVolume = 1.0;
|
|
43
61
|
_pendingPlay = null;
|
|
@@ -59,6 +77,7 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
59
77
|
add(() => {
|
|
60
78
|
this.disposeAbort.abort();
|
|
61
79
|
this.disposeAbort.dispose();
|
|
80
|
+
this.stopStallDetection?.();
|
|
62
81
|
});
|
|
63
82
|
this.domEvents = add(new DomEventHost(deps.media));
|
|
64
83
|
// Log media events.
|
|
@@ -78,6 +97,12 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
78
97
|
});
|
|
79
98
|
});
|
|
80
99
|
this.initializeEvents();
|
|
100
|
+
// Detect and report play-head stalls (frozen while playing) via
|
|
101
|
+
// stallEntered/stallEnded, independent of the recovery stall detector.
|
|
102
|
+
add(createStallMonitor(this, {
|
|
103
|
+
onStallEntered: () => this.dispatch('stallEntered', {}),
|
|
104
|
+
onStallEnded: (info) => this.dispatch('stallEnded', info),
|
|
105
|
+
}, { stallThreshold: this.options.stallThreshold }));
|
|
81
106
|
// Listen for loudness normalization changes
|
|
82
107
|
add(this.loudnessNormalizationController.on('change', () => {
|
|
83
108
|
this.refreshVolume();
|
|
@@ -278,7 +303,7 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
278
303
|
!this.paused &&
|
|
279
304
|
this.currentTime <= this.options.loopTimeAffordance &&
|
|
280
305
|
lastTime >= this.duration - this.options.loopTimeAffordance) {
|
|
281
|
-
if (
|
|
306
|
+
if (hasBrowser(Browser.FIREFOX)) {
|
|
282
307
|
// Firefox does not emit a 'playing' event after a loop, fabricate one.
|
|
283
308
|
logDebug(this, 'fabricating Firefox playing event on loop');
|
|
284
309
|
this.dispatch('playing', {});
|
|
@@ -388,8 +413,27 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
388
413
|
current: value != null,
|
|
389
414
|
});
|
|
390
415
|
}
|
|
416
|
+
/**
|
|
417
|
+
* Starts (or restarts) the stall detector: recovers a play head that stays frozen when it
|
|
418
|
+
* should be advancing — some WebKit versions never resume after a seek or a play, e.g. after a
|
|
419
|
+
* buffer-flushing seek. Superseded by the next seek/play and stopped on dispose.
|
|
420
|
+
* @private
|
|
421
|
+
*/
|
|
422
|
+
startStallDetection() {
|
|
423
|
+
this.stopStallDetection?.();
|
|
424
|
+
this.stopStallDetection = createStallDetector(this.media, {
|
|
425
|
+
fabricatePlaying: () => this.dispatch('playing', {}),
|
|
426
|
+
// Safari/iOS can leave a seek on a freshly-attached source pending
|
|
427
|
+
// with a stale empty `buffered`; re-issue the seek to un-stick it.
|
|
428
|
+
nudgeUnbuffered: hasBrowser(Browser.WEBKIT),
|
|
429
|
+
});
|
|
430
|
+
}
|
|
391
431
|
play() {
|
|
392
432
|
logDebug(this, 'play');
|
|
433
|
+
// Recover a play that never starts progressing (stuck WebKit) — start
|
|
434
|
+
// even when a prior play() is still pending, e.g. a resume that stalled
|
|
435
|
+
// after a buffer-flushing seek, whose play() promise this call returns.
|
|
436
|
+
this.startStallDetection();
|
|
393
437
|
if (!this.pendingPlay) {
|
|
394
438
|
const playAbort = new Abort();
|
|
395
439
|
this.playAbort = playAbort;
|
|
@@ -430,15 +474,18 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
430
474
|
// Claim this seek as the newest. A seek that parks on an await (e.g. waiting for loadedMetadata) can resume
|
|
431
475
|
// AFTER a later-issued seek has already applied its target.
|
|
432
476
|
const seekId = ++this._seekId;
|
|
477
|
+
// A new seek supersedes any stall watch from the previous one.
|
|
478
|
+
this.stopStallDetection?.();
|
|
479
|
+
this.stopStallDetection = null;
|
|
433
480
|
const superseded = () => {
|
|
434
481
|
if (this._seekId === seekId)
|
|
435
482
|
return false;
|
|
436
483
|
logDebug(this, `seekTo: ${time} superseded by a newer seek`);
|
|
437
484
|
return true;
|
|
438
485
|
};
|
|
439
|
-
const nextEvent = (type) => {
|
|
486
|
+
const nextEvent = (type, options) => {
|
|
440
487
|
return nextEventAsPromise(this, type, {
|
|
441
|
-
timeout: this.options.seekTimeout,
|
|
488
|
+
timeout: options?.timeout ?? this.options.seekTimeout,
|
|
442
489
|
timeoutMessage: `seek timed out on ${type} event after {time}s`,
|
|
443
490
|
timeoutOrigin: ErrorOrigin.INTERNAL,
|
|
444
491
|
timeoutLevel: ErrorLevel.WARN,
|
|
@@ -471,14 +518,58 @@ export class PlaybackControllerImpl extends EventHostImpl {
|
|
|
471
518
|
logDebug(this, `seekTo: requested: ${time}, actual: ${clampedTime} no-op`);
|
|
472
519
|
}
|
|
473
520
|
else {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
521
|
+
// A dispose rejects the seek; a timeout means the attempt is stuck.
|
|
522
|
+
const nullIfStuck = (error) => {
|
|
523
|
+
if (this.disposeAbort.aborted())
|
|
524
|
+
throw error;
|
|
525
|
+
return null;
|
|
526
|
+
};
|
|
527
|
+
// Issues one seek attempt. Returns the seeked event, or null if it
|
|
528
|
+
// didn't complete within SEEK_ATTEMPT_TIMEOUT. Observed on WebKit/iOS
|
|
529
|
+
// Safari: seeking a freshly-attached source that has never decoded a
|
|
530
|
+
// frame hangs — the seek never completes and playback stalls in
|
|
531
|
+
// `waiting`. The initial attempt keeps the full seekTimeout on
|
|
532
|
+
// `seeking` (a media that never starts seeking is a real timeout); a
|
|
533
|
+
// re-seek to the current position emits no fresh `seeking` on WebKit,
|
|
534
|
+
// so bound that wait and fall through to the stall detector.
|
|
535
|
+
const seekOnce = async (reSeeking) => {
|
|
536
|
+
const seeking = reSeeking
|
|
537
|
+
? nextEvent('seeking', {
|
|
538
|
+
timeout: SEEK_ATTEMPT_TIMEOUT,
|
|
539
|
+
}).catch(nullIfStuck)
|
|
540
|
+
: nextEvent('seeking');
|
|
541
|
+
this.media.currentTime = clampedTime;
|
|
542
|
+
if ((await seeking) === null)
|
|
543
|
+
return null;
|
|
544
|
+
return nextEvent('seeked', {
|
|
545
|
+
timeout: SEEK_ATTEMPT_TIMEOUT,
|
|
546
|
+
}).catch(nullIfStuck);
|
|
547
|
+
};
|
|
548
|
+
let seekedEvent = await seekOnce(false);
|
|
549
|
+
// Re-issue the seek when it never completed (kick the decoder with
|
|
550
|
+
// play() first — decoding a frame unsticks WebKit) or when it landed
|
|
551
|
+
// outside tolerance of the target. Bounded, and not fighting a newer
|
|
552
|
+
// seek. The play() kick is fire-and-forget: a wedged seek can leave
|
|
553
|
+
// its promise unsettled forever, which would stall the retry loop.
|
|
554
|
+
for (let attempt = 0; !superseded() &&
|
|
555
|
+
attempt < SEEK_RETRY_LIMIT &&
|
|
556
|
+
(seekedEvent === null ||
|
|
557
|
+
(seekedEvent.reason === 'seeked' &&
|
|
558
|
+
!closeTo(clampedTime, this.currentTime, tolerance))); attempt++) {
|
|
559
|
+
if (seekedEvent === null)
|
|
560
|
+
void this.media.play().catch(noop);
|
|
561
|
+
logDebug(this, `seekTo: re-seeking to ${clampedTime}`);
|
|
562
|
+
seekedEvent = await seekOnce(true);
|
|
563
|
+
}
|
|
564
|
+
if (seekedEvent?.reason === 'emptied') {
|
|
479
565
|
// Seek finished due to track unloading. Abort any pending seek.
|
|
480
566
|
throw new AbortError();
|
|
481
567
|
}
|
|
568
|
+
// Some WebKit versions don't resume after seeking. Watch for that:
|
|
569
|
+
// nudge/kick playback back to life, and fabricate a playing event
|
|
570
|
+
// if it resumes without emitting one.
|
|
571
|
+
if (!this.paused)
|
|
572
|
+
this.startStallDetection();
|
|
482
573
|
}
|
|
483
574
|
}
|
|
484
575
|
/**
|
|
@@ -188,6 +188,19 @@ export interface PlaybackControllerEventMap {
|
|
|
188
188
|
* true and the media is seeking a new position.
|
|
189
189
|
*/
|
|
190
190
|
readonly seeking: AnyRecord;
|
|
191
|
+
/**
|
|
192
|
+
* Fired when the play head has been detected as frozen while playing — i.e. no `timeUpdate`
|
|
193
|
+
* was observed for longer than the stall threshold. Only emitted once playback has actually
|
|
194
|
+
* been observed (a `playing` event), so it is not emitted during initial loading or while
|
|
195
|
+
* awaiting a seek. Each stall is bracketed by a `stallEntered`/{@link stallEnded} pair.
|
|
196
|
+
*/
|
|
197
|
+
readonly stallEntered: AnyRecord;
|
|
198
|
+
/**
|
|
199
|
+
* Fired when a stall (see {@link stallEntered}) has ended, for any reason. `started` is the
|
|
200
|
+
* time of the last `timeUpdate` observed before the play head froze, and `duration` is the
|
|
201
|
+
* total number of seconds the play head was frozen.
|
|
202
|
+
*/
|
|
203
|
+
readonly stallEnded: OperationCompletedEvent<StallEndedReason>;
|
|
191
204
|
/**
|
|
192
205
|
* Fired when the time indicated by the currentTime attribute has been updated.
|
|
193
206
|
*/
|
|
@@ -230,7 +243,20 @@ export declare enum WaitedReason {
|
|
|
230
243
|
* A list of all events that cause the 2nd-order 'waited' event.
|
|
231
244
|
*/
|
|
232
245
|
export declare const waitedReasons: readonly [WaitedReason.PLAYING, WaitedReason.PAUSE, WaitedReason.EMPTIED, WaitedReason.SEEKING];
|
|
233
|
-
|
|
246
|
+
/**
|
|
247
|
+
* Reasons a stall (see {@link PlaybackControllerEventMap.stallEntered}) has ended.
|
|
248
|
+
*/
|
|
249
|
+
export declare enum StallEndedReason {
|
|
250
|
+
/** The play head advanced again — playback resumed. */
|
|
251
|
+
PLAYING = "playing",
|
|
252
|
+
/** Playback was paused. */
|
|
253
|
+
PAUSE = "pause",
|
|
254
|
+
/** A seek started. */
|
|
255
|
+
SEEKING = "seeking",
|
|
256
|
+
/** The media was emptied (e.g. unloaded/reloaded). */
|
|
257
|
+
EMPTIED = "emptied"
|
|
258
|
+
}
|
|
259
|
+
export declare const ALL_PLAYBACK_STATE_EVENTS: readonly ["abort", "canPlay", "canPlayThrough", "durationChange", "emptied", "ended", "error", "playIsPendingChange", "loadedData", "loadedMetadata", "loadStart", "looped", "mutedChange", "pause", "play", "playRejected", "played", "playing", "progress", "rateChange", "readyStateChange", "reset", "resize", "seeked", "seeking", "stallEntered", "stallEnded", "timeUpdate", "volumeChange", "waited", "waiting", "waitingForKey"];
|
|
234
260
|
export declare enum PlaybackReadyState {
|
|
235
261
|
/**
|
|
236
262
|
* No information is available about the media resource.
|