@amazon/vinyl 3.0.1 → 3.2.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 +1103 -1042
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +810 -739
- package/dist/index.js.map +4 -4
- package/dist/test/benchmark.js.map +2 -2
- package/dist/test/integ.es5.js +394 -388
- package/dist/test/integ.js +2626 -2032
- 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 +19 -1
- package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.js +101 -58
- 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 +15 -1
- 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/streaming/mediaTimelineFilter.d.ts +4 -2
- package/dist/types/current/streaming/mediaTimelineFilter.d.ts.map +1 -1
- package/dist/types/current/streaming/mediaTimelineFilter.js +23 -8
- 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 +8 -2
- 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 +25 -7
- package/dist/types/current/track/filters/sampleRateFilter.d.ts.map +1 -1
- package/dist/types/current/track/filters/sampleRateFilter.js +52 -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 +0 -17
- package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
- package/dist/types/current/track/mse/MseTrack.js +1 -45
- 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/VinylPlayer.d.ts +5 -0
- package/dist/types/current/vinyl/VinylPlayer.d.ts.map +1 -1
- package/dist/types/current/vinyl/VinylPlayer.js +23 -1
- 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 +19 -1
- 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/LoadMetric.d.ts +15 -1
- 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/streaming/mediaTimelineFilter.d.ts +4 -2
- 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 +25 -7
- package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts3.7/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts3.7/vinyl/VinylPlayer.d.ts +5 -0
- package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +19 -1
- 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/LoadMetric.d.ts +15 -1
- 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/streaming/mediaTimelineFilter.d.ts +4 -2
- 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 +25 -7
- package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.1/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.1/vinyl/VinylPlayer.d.ts +5 -0
- package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +19 -1
- 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/LoadMetric.d.ts +15 -1
- 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/streaming/mediaTimelineFilter.d.ts +4 -2
- 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 +25 -7
- package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.7/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.7/vinyl/VinylPlayer.d.ts +5 -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 +146 -9
- 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 +49 -73
- 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/streaming/mediaTimelineFilter.test.js +60 -54
- package/dist/unit/types/current/track/TrackController.test.js +61 -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 +211 -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/VinylPlayer.test.js +33 -2
- 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
|
@@ -10,7 +10,7 @@ import { nextEventAsPromise } from '@amazon/vinyl-util';
|
|
|
10
10
|
* @param playbackController The playbackController reference. Can be the player.
|
|
11
11
|
* @param timeout The timeout (in seconds) before the promise will reject with a timeout.
|
|
12
12
|
*/
|
|
13
|
-
export async function onPlaying(playbackController, timeout =
|
|
13
|
+
export async function onPlaying(playbackController, timeout = 30) {
|
|
14
14
|
if (playbackController.playing)
|
|
15
15
|
return Promise.resolve();
|
|
16
16
|
return nextEventAsPromise(playbackController, 'playing', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expectTrackCanSeek.d.ts","sourceRoot":"","sources":["../../../../../../test/vinylTestUtil/util/playback/expectTrackCanSeek.ts"],"names":[],"mappings":"AAKA,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAe7E,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"expectTrackCanSeek.d.ts","sourceRoot":"","sources":["../../../../../../test/vinylTestUtil/util/playback/expectTrackCanSeek.ts"],"names":[],"mappings":"AAKA,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAe7E,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAwE3E"}
|
|
@@ -17,6 +17,13 @@ export async function expectTrackCanSeekTo(player, time) {
|
|
|
17
17
|
const playedSpy = add(createEventSpy(player, 'played'));
|
|
18
18
|
const seekingSpy = add(createEventSpy(player, 'seeking'));
|
|
19
19
|
const seekedSpy = add(createEventSpy(player, 'seeked'));
|
|
20
|
+
// A seek can be re-issued (WebKit sometimes lands the play head off
|
|
21
|
+
// target), producing several seeking/seeked pairs. Track order so we can
|
|
22
|
+
// assert a seeking preceded the first seeked without requiring a single,
|
|
23
|
+
// non-interleaved pair.
|
|
24
|
+
const eventOrder = [];
|
|
25
|
+
add(player.on('seeking', () => eventOrder.push('seeking')));
|
|
26
|
+
add(player.on('seeked', () => eventOrder.push('seeked')));
|
|
20
27
|
const wasPaused = player.paused;
|
|
21
28
|
if (player.playing) {
|
|
22
29
|
seekingSpy
|
|
@@ -52,7 +59,8 @@ export async function expectTrackCanSeekTo(player, time) {
|
|
|
52
59
|
// Event expectations:
|
|
53
60
|
// If playing before seekTo: played, seeking, seeked
|
|
54
61
|
// If paused: seeking, seeked.
|
|
55
|
-
|
|
62
|
+
// A seeking must precede the first seeked (re-issued seeks allowed).
|
|
63
|
+
expect(eventOrder[0]).withContext('first seek event').toBe('seeking');
|
|
56
64
|
expect(player.paused).withContext('paused').toBe(wasPaused);
|
|
57
65
|
if (wasPaused) {
|
|
58
66
|
expectPausedState(player);
|
|
@@ -24,6 +24,7 @@ export declare const vinylTestAssets: {
|
|
|
24
24
|
readonly dash: {
|
|
25
25
|
readonly live_static_aac_opus_flac_60s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_aac_opus_flac_60s_segmentTemplate/manifest.mpd";
|
|
26
26
|
readonly live_static_aac_opus_flac_60s_segmentBase: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_aac_opus_flac_60s_segmentBase/manifest.mpd";
|
|
27
|
+
readonly live_static_webm_vp9_opus_60s_segmentBase: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_webm_vp9_opus_60s_segmentBase/manifest.mpd";
|
|
27
28
|
readonly live_static_video_audio_60s_2s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_2s_segmentTemplate/manifest.mpd";
|
|
28
29
|
readonly live_static_video_audio_60s_4s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_4s_segmentTemplate/manifest.mpd";
|
|
29
30
|
readonly live_static_video_audio_60s_2s_segmentTemplate_widevine_cl10: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_2s_segmentTemplate_widevine_cl10/manifest.mpd";
|
|
@@ -9,7 +9,6 @@ export declare class MockContentStream extends MockEventHost<StreamingEventMap>
|
|
|
9
9
|
playbackQuality: MediaQualityMetadata | null;
|
|
10
10
|
streamingQuality: MediaQualityMetadata | null;
|
|
11
11
|
bufferingEnded: boolean;
|
|
12
|
-
hasData: boolean;
|
|
13
12
|
clearPrefetch: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
|
14
13
|
activate: import("@amazon/vinyl-util/browserTestUtil").Spy2<(options: import("@amazon/vinyl-util").Maybe<import("@amazon/vinyl").ContentStreamActivateOptions>) => void>;
|
|
15
14
|
deactivate: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockBufferingController.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export declare class MockBufferingController extends MockEventHost<BufferingCont
|
|
|
4
4
|
error: Error | null;
|
|
5
5
|
active: boolean;
|
|
6
6
|
bufferingEnded: boolean;
|
|
7
|
-
hasData: boolean;
|
|
8
7
|
playbackQuality: MediaQualityMetadata | null;
|
|
9
8
|
bufferingQuality: MediaQualityMetadata | null;
|
|
10
9
|
activate: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
|
@@ -24,6 +24,7 @@ export declare const vinylTestAssets: {
|
|
|
24
24
|
readonly dash: {
|
|
25
25
|
readonly live_static_aac_opus_flac_60s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_aac_opus_flac_60s_segmentTemplate/manifest.mpd";
|
|
26
26
|
readonly live_static_aac_opus_flac_60s_segmentBase: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_aac_opus_flac_60s_segmentBase/manifest.mpd";
|
|
27
|
+
readonly live_static_webm_vp9_opus_60s_segmentBase: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_webm_vp9_opus_60s_segmentBase/manifest.mpd";
|
|
27
28
|
readonly live_static_video_audio_60s_2s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_2s_segmentTemplate/manifest.mpd";
|
|
28
29
|
readonly live_static_video_audio_60s_4s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_4s_segmentTemplate/manifest.mpd";
|
|
29
30
|
readonly live_static_video_audio_60s_2s_segmentTemplate_widevine_cl10: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_2s_segmentTemplate_widevine_cl10/manifest.mpd";
|
|
@@ -9,7 +9,6 @@ export declare class MockContentStream extends MockEventHost<StreamingEventMap>
|
|
|
9
9
|
playbackQuality: MediaQualityMetadata | null;
|
|
10
10
|
streamingQuality: MediaQualityMetadata | null;
|
|
11
11
|
bufferingEnded: boolean;
|
|
12
|
-
hasData: boolean;
|
|
13
12
|
clearPrefetch: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
|
14
13
|
activate: import("@amazon/vinyl-util/browserTestUtil").Spy2<(options: import("@amazon/vinyl-util").Maybe<import("@amazon/vinyl").ContentStreamActivateOptions>) => void>;
|
|
15
14
|
deactivate: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockBufferingController.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export declare class MockBufferingController extends MockEventHost<BufferingCont
|
|
|
4
4
|
error: Error | null;
|
|
5
5
|
active: boolean;
|
|
6
6
|
bufferingEnded: boolean;
|
|
7
|
-
hasData: boolean;
|
|
8
7
|
playbackQuality: MediaQualityMetadata | null;
|
|
9
8
|
bufferingQuality: MediaQualityMetadata | null;
|
|
10
9
|
activate: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
|
@@ -24,6 +24,7 @@ export declare const vinylTestAssets: {
|
|
|
24
24
|
readonly dash: {
|
|
25
25
|
readonly live_static_aac_opus_flac_60s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_aac_opus_flac_60s_segmentTemplate/manifest.mpd";
|
|
26
26
|
readonly live_static_aac_opus_flac_60s_segmentBase: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_aac_opus_flac_60s_segmentBase/manifest.mpd";
|
|
27
|
+
readonly live_static_webm_vp9_opus_60s_segmentBase: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_webm_vp9_opus_60s_segmentBase/manifest.mpd";
|
|
27
28
|
readonly live_static_video_audio_60s_2s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_2s_segmentTemplate/manifest.mpd";
|
|
28
29
|
readonly live_static_video_audio_60s_4s_segmentTemplate: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_4s_segmentTemplate/manifest.mpd";
|
|
29
30
|
readonly live_static_video_audio_60s_2s_segmentTemplate_widevine_cl10: "https://assets.dev.vinyl.music.amazon.dev/dash/live_static_video_audio_60s_2s_segmentTemplate_widevine_cl10/manifest.mpd";
|
|
@@ -9,7 +9,6 @@ export declare class MockContentStream extends MockEventHost<StreamingEventMap>
|
|
|
9
9
|
playbackQuality: MediaQualityMetadata | null;
|
|
10
10
|
streamingQuality: MediaQualityMetadata | null;
|
|
11
11
|
bufferingEnded: boolean;
|
|
12
|
-
hasData: boolean;
|
|
13
12
|
clearPrefetch: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
|
14
13
|
activate: import("@amazon/vinyl-util/browserTestUtil").Spy2<(options: import("@amazon/vinyl-util").Maybe<import("@amazon/vinyl").ContentStreamActivateOptions>) => void>;
|
|
15
14
|
deactivate: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockBufferingController.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export declare class MockBufferingController extends MockEventHost<BufferingCont
|
|
|
4
4
|
error: Error | null;
|
|
5
5
|
active: boolean;
|
|
6
6
|
bufferingEnded: boolean;
|
|
7
|
-
hasData: boolean;
|
|
8
7
|
playbackQuality: MediaQualityMetadata | null;
|
|
9
8
|
bufferingQuality: MediaQualityMetadata | null;
|
|
10
9
|
activate: import("@amazon/vinyl-util/browserTestUtil").Spy2<() => void>;
|
package/docs/USAGE.md
CHANGED
|
@@ -113,6 +113,12 @@ Dash track default behavior is to treat the `uri` as the Dash MPD location. This
|
|
|
113
113
|
can be overridden with a custom manifest provider, which is returns a parsed
|
|
114
114
|
dash manifest.
|
|
115
115
|
|
|
116
|
+
DASH streams may use ISO-BMFF (MP4/fMP4) or WebM containers, with
|
|
117
|
+
`SegmentTemplate`, `SegmentList`, or `SegmentBase` addressing. `SegmentBase`
|
|
118
|
+
streams are indexed from their ISO-BMFF `sidx` box or WebM `Cues` element as
|
|
119
|
+
appropriate. Codec support (e.g. AVC/HEVC/VP9 video, AAC/Opus/FLAC audio) is
|
|
120
|
+
gated by the browser's Media Source Extensions support.
|
|
121
|
+
|
|
116
122
|
```typescript
|
|
117
123
|
player.load({
|
|
118
124
|
type: 'dash',
|
|
@@ -322,6 +328,29 @@ Read the API Docs on `PlaybackControllerEventMap` for the full list of playback
|
|
|
322
328
|
events. Most events are directly from the media element, but there are
|
|
323
329
|
additional second-order events such as 'played', 'waited', or 'mutedChange'.
|
|
324
330
|
|
|
331
|
+
### Stall Detection
|
|
332
|
+
|
|
333
|
+
Vinyl detects when the play head freezes during playback (no `timeUpdate` for
|
|
334
|
+
longer than a threshold) and reports it as a `stallEntered`/`stallEnded` pair.
|
|
335
|
+
Unlike the media's `waiting`/`waited` events, a stall is only reported once
|
|
336
|
+
playback has actually been observed — never during initial loading or while
|
|
337
|
+
awaiting a seek — and `stallEnded` carries the full frozen duration.
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
player.on('stallEntered', () => {
|
|
341
|
+
// The play head has frozen mid-playback; e.g. show a buffering spinner.
|
|
342
|
+
})
|
|
343
|
+
player.on('stallEnded', (event) => {
|
|
344
|
+
// event.reason is one of 'playing' (resumed), 'pause', 'seeking', 'emptied'.
|
|
345
|
+
// event.duration is the number of seconds the play head was frozen,
|
|
346
|
+
// measured from the last timeUpdate before the freeze.
|
|
347
|
+
console.log(`stalled for ${event.duration}s, ended by ${event.reason}`)
|
|
348
|
+
})
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
The freeze threshold defaults to 1 second and is configurable via the
|
|
352
|
+
`stallThreshold` playback option.
|
|
353
|
+
|
|
325
354
|
### Buffer Status
|
|
326
355
|
|
|
327
356
|
There are two concepts to understand when talking about how much data is
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amazon/vinyl",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "An HTML5 streaming media player",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -90,17 +90,18 @@
|
|
|
90
90
|
"oxlint:write": "oxlint --type-aware --fix"
|
|
91
91
|
},
|
|
92
92
|
"devDependencies": {
|
|
93
|
-
"@amazon/vinyl-
|
|
94
|
-
"
|
|
93
|
+
"@amazon/vinyl-browserstack": "^3.2.0",
|
|
94
|
+
"@amazon/vinyl-build-utils": "^3.2.0",
|
|
95
|
+
"commander": "^15.0.0"
|
|
95
96
|
},
|
|
96
97
|
"dependencies": {
|
|
97
|
-
"@amazon/vinyl-di": "^3.0
|
|
98
|
-
"@amazon/vinyl-hls-parser": "^3.0
|
|
99
|
-
"@amazon/vinyl-mpd-parser": "^3.0
|
|
100
|
-
"@amazon/vinyl-observable": "^3.0
|
|
101
|
-
"@amazon/vinyl-transmux": "^3.0
|
|
102
|
-
"@amazon/vinyl-util": "^3.0
|
|
103
|
-
"@amazon/vinyl-validation": "^3.0
|
|
98
|
+
"@amazon/vinyl-di": "^3.2.0",
|
|
99
|
+
"@amazon/vinyl-hls-parser": "^3.2.0",
|
|
100
|
+
"@amazon/vinyl-mpd-parser": "^3.2.0",
|
|
101
|
+
"@amazon/vinyl-observable": "^3.2.0",
|
|
102
|
+
"@amazon/vinyl-transmux": "^3.2.0",
|
|
103
|
+
"@amazon/vinyl-util": "^3.2.0",
|
|
104
|
+
"@amazon/vinyl-validation": "^3.2.0"
|
|
104
105
|
},
|
|
105
106
|
"publishConfig": {
|
|
106
107
|
"access": "public"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HtmlMediaElementPatch.d.ts","sourceRoot":"","sources":["../../../../../src/patch/media/HtmlMediaElementPatch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE/C,MAAM,MAAM,qBAAqB,GAAG,KAAK,CACrC,gBAAgB,EAChB,wBAAwB,CAC3B,CAAA"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export interface MediaElementPatchOptions {
|
|
2
|
-
/**
|
|
3
|
-
* Playback events 'playing' and 'waiting' are unreliable after seeking.
|
|
4
|
-
*
|
|
5
|
-
* Risks for false positive: LOW. Timing of emitted playing events may be subtly
|
|
6
|
-
* different, but they will not be duplicated.
|
|
7
|
-
* Risks for false negative: MEDIUM. Certain playback events on affected platforms will be missed.
|
|
8
|
-
*/
|
|
9
|
-
readonly unreliablePlaybackEvents?: boolean;
|
|
10
|
-
/**
|
|
11
|
-
* The affected user agent gets into a state where playback can become stalled and needs help getting unstuck.
|
|
12
|
-
*/
|
|
13
|
-
readonly preventStalls?: boolean;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Aggregates flags for toggling patches.
|
|
17
|
-
*/
|
|
18
|
-
export declare const defaultMediaElementPatchOptions: import("@amazon/vinyl-util").Lazy<Required<MediaElementPatchOptions>>;
|
|
19
|
-
//# sourceMappingURL=MediaElementPatchOptions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MediaElementPatchOptions.d.ts","sourceRoot":"","sources":["../../../../../src/patch/media/MediaElementPatchOptions.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,wBAAwB;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAE3C;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACnC;AAED;;GAEG;AACH,eAAO,MAAM,+BAA+B,uEAO1C,CAAA"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
import { lazy } from '@amazon/vinyl-util';
|
|
6
|
-
import { requiresUnreliablePlaybackEventsPatch } from './patches/createUnreliablePlaybackEventsPatch';
|
|
7
|
-
import { requiresPreventStallsPatch } from './patches/createPreventStallsPatch';
|
|
8
|
-
/**
|
|
9
|
-
* Aggregates flags for toggling patches.
|
|
10
|
-
*/
|
|
11
|
-
export const defaultMediaElementPatchOptions = lazy(() => {
|
|
12
|
-
return {
|
|
13
|
-
unreliablePlaybackEvents: requiresUnreliablePlaybackEventsPatch(),
|
|
14
|
-
preventStalls: requiresPreventStallsPatch(),
|
|
15
|
-
};
|
|
16
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type PatchedRef } from '@amazon/vinyl-util';
|
|
2
|
-
import type { MediaElementPatchOptions } from './MediaElementPatchOptions';
|
|
3
|
-
/**
|
|
4
|
-
* Applies patches corresponding to the patch flags on the given media element.
|
|
5
|
-
*
|
|
6
|
-
* Adds logging for fabricated or squelched events.
|
|
7
|
-
*/
|
|
8
|
-
export declare function patchMediaElement<T extends HTMLMediaElement = HTMLMediaElement>(media: T, options: MediaElementPatchOptions): PatchedRef<T>;
|
|
9
|
-
//# sourceMappingURL=patchMediaElement.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"patchMediaElement.d.ts","sourceRoot":"","sources":["../../../../../src/patch/media/patchMediaElement.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,oBAAoB,CAAA;AAC1E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAI1E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC7B,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,EAC/C,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,GAAG,UAAU,CAAC,CAAC,CAAC,CAO5D"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
import { patchTargetFromFlags } from '@amazon/vinyl-util';
|
|
6
|
-
import { createUnreliablePlaybackEventsPatch } from './patches/createUnreliablePlaybackEventsPatch';
|
|
7
|
-
import { createPreventStallsPatch } from './patches/createPreventStallsPatch';
|
|
8
|
-
/**
|
|
9
|
-
* Applies patches corresponding to the patch flags on the given media element.
|
|
10
|
-
*
|
|
11
|
-
* Adds logging for fabricated or squelched events.
|
|
12
|
-
*/
|
|
13
|
-
export function patchMediaElement(media, options) {
|
|
14
|
-
return patchTargetFromFlags(media, options, ['unreliablePlaybackEvents', createUnreliablePlaybackEventsPatch], ['preventStalls', createPreventStallsPatch]);
|
|
15
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { HtmlMediaElementPatch } from '../HtmlMediaElementPatch';
|
|
2
|
-
/**
|
|
3
|
-
* The number of timeupdate events stuck at the same position before attempting to jiggle the playhead.
|
|
4
|
-
* @private
|
|
5
|
-
*/
|
|
6
|
-
export declare const MAX_UNCHANGED_COUNT = 10;
|
|
7
|
-
/**
|
|
8
|
-
* On affected UAs, playback can become stuck. timeupdate events are observed but playback position is never changing.
|
|
9
|
-
* This patch applies a workaround which will pause and play again after max number of timeupdate events with no
|
|
10
|
-
* actual time progression.
|
|
11
|
-
*/
|
|
12
|
-
export declare function createPreventStallsPatch(media: HTMLMediaElement): HtmlMediaElementPatch;
|
|
13
|
-
/**
|
|
14
|
-
* Returns true if stall detection should be enabled for the current user agent.
|
|
15
|
-
*/
|
|
16
|
-
export declare function requiresPreventStallsPatch(): boolean;
|
|
17
|
-
//# sourceMappingURL=createPreventStallsPatch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createPreventStallsPatch.d.ts","sourceRoot":"","sources":["../../../../../../src/patch/media/patches/createPreventStallsPatch.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAErE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC;;;;GAIG;AACH,wBAAgB,wBAAwB,CACpC,KAAK,EAAE,gBAAgB,GACxB,qBAAqB,CAmCvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
import { Browser, closeTo, createDisposer, createLogPrefix, DomEventHost, hasBrowser, logInfo, logWarn, noop, } from '@amazon/vinyl-util';
|
|
6
|
-
/**
|
|
7
|
-
* The number of timeupdate events stuck at the same position before attempting to jiggle the playhead.
|
|
8
|
-
* @private
|
|
9
|
-
*/
|
|
10
|
-
export const MAX_UNCHANGED_COUNT = 10;
|
|
11
|
-
/**
|
|
12
|
-
* On affected UAs, playback can become stuck. timeupdate events are observed but playback position is never changing.
|
|
13
|
-
* This patch applies a workaround which will pause and play again after max number of timeupdate events with no
|
|
14
|
-
* actual time progression.
|
|
15
|
-
*/
|
|
16
|
-
export function createPreventStallsPatch(media) {
|
|
17
|
-
const { add, dispose } = createDisposer();
|
|
18
|
-
const domEvents = add(new DomEventHost(media));
|
|
19
|
-
const pathTarget = {
|
|
20
|
-
logPrefix: createLogPrefix('createPreventStallsPatch'),
|
|
21
|
-
};
|
|
22
|
-
let unchangedCount = 0;
|
|
23
|
-
let attemptedFix = false;
|
|
24
|
-
let previousTime = media.currentTime;
|
|
25
|
-
domEvents.on('timeupdate', () => {
|
|
26
|
-
if (media.paused)
|
|
27
|
-
return;
|
|
28
|
-
if (closeTo(media.currentTime, previousTime, 0.01)) {
|
|
29
|
-
if (++unchangedCount >= MAX_UNCHANGED_COUNT && !attemptedFix) {
|
|
30
|
-
logWarn(pathTarget, `Detected stall at time ${media.currentTime}, attempting fix`);
|
|
31
|
-
attemptedFix = true;
|
|
32
|
-
unchangedCount = 0;
|
|
33
|
-
media.pause();
|
|
34
|
-
media.play().catch(noop);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
if (attemptedFix) {
|
|
39
|
-
logInfo(pathTarget, 'stall ended');
|
|
40
|
-
attemptedFix = false;
|
|
41
|
-
} // Unstuck
|
|
42
|
-
unchangedCount = 0;
|
|
43
|
-
previousTime = media.currentTime;
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
return {
|
|
47
|
-
dispose,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Returns true if stall detection should be enabled for the current user agent.
|
|
52
|
-
*/
|
|
53
|
-
export function requiresPreventStallsPatch() {
|
|
54
|
-
return hasBrowser(Browser.EDGE_LEGACY);
|
|
55
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { HtmlMediaElementPatch } from '../HtmlMediaElementPatch';
|
|
2
|
-
/**
|
|
3
|
-
* The interval (in seconds) to poll for time progress in a media element.
|
|
4
|
-
*
|
|
5
|
-
* @private
|
|
6
|
-
*/
|
|
7
|
-
export declare const UNRELIABLE_EVENTS_POLL_INTERVAL = 0.2;
|
|
8
|
-
/**
|
|
9
|
-
* Minimum amount of time playback must be stalled before fabricating a waiting event.
|
|
10
|
-
*/
|
|
11
|
-
export declare const MIN_STALLED_BEFORE_FAB = 0.8;
|
|
12
|
-
/**
|
|
13
|
-
* Minimum amount of time playback must be progressing before fabricating a playing event.
|
|
14
|
-
*/
|
|
15
|
-
export declare const MIN_PLAYING_BEFORE_FAB = 0.4;
|
|
16
|
-
/**
|
|
17
|
-
* Playback events such as playing, canPlay, and waiting are unreliable on this platform.
|
|
18
|
-
* Watch playback state and fabricate events when necessary.
|
|
19
|
-
*/
|
|
20
|
-
export declare function createUnreliablePlaybackEventsPatch(media: HTMLMediaElement): HtmlMediaElementPatch;
|
|
21
|
-
/**
|
|
22
|
-
* Chrome <= 53 has unreliable waiting events.
|
|
23
|
-
* Safari, and Edge Legacy miss playing events after seeking.
|
|
24
|
-
*/
|
|
25
|
-
export declare function requiresUnreliablePlaybackEventsPatch(): boolean;
|
|
26
|
-
//# sourceMappingURL=createUnreliablePlaybackEventsPatch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createUnreliablePlaybackEventsPatch.d.ts","sourceRoot":"","sources":["../../../../../../src/patch/media/patches/createUnreliablePlaybackEventsPatch.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAErE;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAElD;;GAEG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC;;GAEG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AA6BzC;;;GAGG;AACH,wBAAgB,mCAAmC,CAC/C,KAAK,EAAE,gBAAgB,GACxB,qBAAqB,CAyMvB;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,IAAI,OAAO,CAM/D"}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
import { Browser, hasBrowser } from '@amazon/vinyl-util';
|
|
6
|
-
import { closeTo, createDisposer, DomEventHost, onAny, SignalImpl, } from '@amazon/vinyl-util';
|
|
7
|
-
/**
|
|
8
|
-
* The interval (in seconds) to poll for time progress in a media element.
|
|
9
|
-
*
|
|
10
|
-
* @private
|
|
11
|
-
*/
|
|
12
|
-
export const UNRELIABLE_EVENTS_POLL_INTERVAL = 0.2;
|
|
13
|
-
/**
|
|
14
|
-
* Minimum amount of time playback must be stalled before fabricating a waiting event.
|
|
15
|
-
*/
|
|
16
|
-
export const MIN_STALLED_BEFORE_FAB = 0.8;
|
|
17
|
-
/**
|
|
18
|
-
* Minimum amount of time playback must be progressing before fabricating a playing event.
|
|
19
|
-
*/
|
|
20
|
-
export const MIN_PLAYING_BEFORE_FAB = 0.4;
|
|
21
|
-
/**
|
|
22
|
-
* If currentTime does not change larger than this value, it will be considered to be stalled.
|
|
23
|
-
*/
|
|
24
|
-
const MIN_PLAYING_DELTA = 0.05;
|
|
25
|
-
/**
|
|
26
|
-
* If currentTime changes beyond this tolerance the apparent state will be considered to be seeking.
|
|
27
|
-
*/
|
|
28
|
-
const MIN_SEEKING_DELTA = 0.5;
|
|
29
|
-
var PlayHeadState;
|
|
30
|
-
(function (PlayHeadState) {
|
|
31
|
-
/**
|
|
32
|
-
* The last time update was an increment from the previous.
|
|
33
|
-
*/
|
|
34
|
-
PlayHeadState[PlayHeadState["PLAYING"] = 0] = "PLAYING";
|
|
35
|
-
/**
|
|
36
|
-
* The last time update was close to the previous.
|
|
37
|
-
*/
|
|
38
|
-
PlayHeadState[PlayHeadState["STOPPED"] = 1] = "STOPPED";
|
|
39
|
-
/**
|
|
40
|
-
* The last time update was a non-incremental change.
|
|
41
|
-
*/
|
|
42
|
-
PlayHeadState[PlayHeadState["SEEKING"] = 2] = "SEEKING";
|
|
43
|
-
})(PlayHeadState || (PlayHeadState = {}));
|
|
44
|
-
/**
|
|
45
|
-
* Playback events such as playing, canPlay, and waiting are unreliable on this platform.
|
|
46
|
-
* Watch playback state and fabricate events when necessary.
|
|
47
|
-
*/
|
|
48
|
-
export function createUnreliablePlaybackEventsPatch(media) {
|
|
49
|
-
const { add, dispose } = createDisposer();
|
|
50
|
-
const domEvents = add(new DomEventHost(media));
|
|
51
|
-
const eventFabricated = add(new SignalImpl());
|
|
52
|
-
// The timestamp of the last change.
|
|
53
|
-
let stateChangedAt = Date.now();
|
|
54
|
-
// The current observed state based on the play head progress.
|
|
55
|
-
let currentApparentState = PlayHeadState.STOPPED;
|
|
56
|
-
/**
|
|
57
|
-
* @param state The new apparent state.
|
|
58
|
-
* @param changedAt The timestamp the apparent state was changed.
|
|
59
|
-
*/
|
|
60
|
-
function setApparentState(state, changedAt = Date.now()) {
|
|
61
|
-
if (currentApparentState !== state) {
|
|
62
|
-
currentApparentState = state;
|
|
63
|
-
stateChangedAt = changedAt;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Returns the number of seconds since the last state change.
|
|
68
|
-
*/
|
|
69
|
-
function elapsedStateTime() {
|
|
70
|
-
return (Date.now() - stateChangedAt) / 1000;
|
|
71
|
-
}
|
|
72
|
-
let lastTimestamp = Date.now();
|
|
73
|
-
let lastTime = media.currentTime;
|
|
74
|
-
let waiting = false;
|
|
75
|
-
let seeking = false;
|
|
76
|
-
onAny(domEvents, ['emptied', 'ended', 'pause', 'playing', 'seeking'], () => {
|
|
77
|
-
waiting = false;
|
|
78
|
-
});
|
|
79
|
-
let playing = false;
|
|
80
|
-
onAny(domEvents, ['emptied', 'ended', 'pause', 'seeking', 'waiting'], () => {
|
|
81
|
-
playing = false;
|
|
82
|
-
});
|
|
83
|
-
domEvents.on('seeking', () => {
|
|
84
|
-
seeking = true;
|
|
85
|
-
});
|
|
86
|
-
domEvents.on('seeked', () => {
|
|
87
|
-
seeking = false;
|
|
88
|
-
setApparentState(PlayHeadState.SEEKING);
|
|
89
|
-
});
|
|
90
|
-
domEvents.on('play', () => {
|
|
91
|
-
// Resets the timer so that the !paused state does not immediately trigger a 'waiting' event.
|
|
92
|
-
stateChangedAt = Date.now();
|
|
93
|
-
});
|
|
94
|
-
// All events that can affect the ready state.
|
|
95
|
-
// canplay and canplaythrough are handled in the overridden events map.
|
|
96
|
-
const readyStateEvents = [
|
|
97
|
-
'emptied',
|
|
98
|
-
'loadeddata',
|
|
99
|
-
'loadedmetadata',
|
|
100
|
-
'waiting',
|
|
101
|
-
];
|
|
102
|
-
let lastReadyStateEvent = 'emptied';
|
|
103
|
-
add(onAny(domEvents, readyStateEvents, (_, type) => {
|
|
104
|
-
lastReadyStateEvent = type;
|
|
105
|
-
}));
|
|
106
|
-
const checkApparentState = () => {
|
|
107
|
-
const progressed = (media.currentTime - lastTime) / media.playbackRate;
|
|
108
|
-
const now = Date.now();
|
|
109
|
-
if (Math.abs(progressed) > MIN_SEEKING_DELTA) {
|
|
110
|
-
setApparentState(PlayHeadState.SEEKING, lastTimestamp);
|
|
111
|
-
}
|
|
112
|
-
else if (progressed >= MIN_PLAYING_DELTA) {
|
|
113
|
-
setApparentState(PlayHeadState.PLAYING, lastTimestamp);
|
|
114
|
-
}
|
|
115
|
-
else if (closeTo(progressed, 0, MIN_PLAYING_DELTA)) {
|
|
116
|
-
setApparentState(PlayHeadState.STOPPED, lastTimestamp);
|
|
117
|
-
}
|
|
118
|
-
lastTime = media.currentTime;
|
|
119
|
-
lastTimestamp = now;
|
|
120
|
-
if (!playing &&
|
|
121
|
-
!seeking &&
|
|
122
|
-
!media.paused &&
|
|
123
|
-
!media.ended &&
|
|
124
|
-
media.readyState >= media.HAVE_FUTURE_DATA &&
|
|
125
|
-
currentApparentState === PlayHeadState.PLAYING &&
|
|
126
|
-
elapsedStateTime() >= MIN_PLAYING_BEFORE_FAB) {
|
|
127
|
-
// The play head is progressing but a playing event was never observed.
|
|
128
|
-
waiting = false;
|
|
129
|
-
playing = true;
|
|
130
|
-
if (lastReadyStateEvent !== 'canplay' &&
|
|
131
|
-
lastReadyStateEvent !== 'canplaythrough') {
|
|
132
|
-
lastReadyStateEvent = 'canplay';
|
|
133
|
-
eventFabricated.dispatch(new CustomEvent('canplay'));
|
|
134
|
-
}
|
|
135
|
-
if (media.readyState >= media.HAVE_ENOUGH_DATA) {
|
|
136
|
-
if (lastReadyStateEvent !== 'canplaythrough') {
|
|
137
|
-
lastReadyStateEvent = 'canplaythrough';
|
|
138
|
-
eventFabricated.dispatch(new CustomEvent('canplaythrough'));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
eventFabricated.dispatch(new CustomEvent('playing'));
|
|
142
|
-
}
|
|
143
|
-
if (!waiting &&
|
|
144
|
-
!media.paused &&
|
|
145
|
-
!media.ended &&
|
|
146
|
-
currentApparentState === PlayHeadState.STOPPED &&
|
|
147
|
-
elapsedStateTime() >= MIN_STALLED_BEFORE_FAB) {
|
|
148
|
-
waiting = true;
|
|
149
|
-
playing = false;
|
|
150
|
-
// currentTime is not changing; playback has stopped but no 'waiting' event
|
|
151
|
-
// was observed.
|
|
152
|
-
eventFabricated.dispatch(new CustomEvent('waiting'));
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
const playbackWatchIntervalId = setInterval(checkApparentState, UNRELIABLE_EVENTS_POLL_INTERVAL * 1000);
|
|
156
|
-
add(() => {
|
|
157
|
-
clearInterval(playbackWatchIntervalId);
|
|
158
|
-
});
|
|
159
|
-
return {
|
|
160
|
-
eventFabricated,
|
|
161
|
-
properties: {
|
|
162
|
-
/**
|
|
163
|
-
* Platforms that have unreliable waiting events, also have unreliable ready state
|
|
164
|
-
* when the end of buffered data has been reached. If the media is in a waiting state,
|
|
165
|
-
* the highest ready state that is possible is HAVE_METADATA.
|
|
166
|
-
*/
|
|
167
|
-
readyState: {
|
|
168
|
-
get() {
|
|
169
|
-
return waiting
|
|
170
|
-
? Math.min(media.readyState, media.HAVE_METADATA)
|
|
171
|
-
: media.readyState;
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
events: {
|
|
176
|
-
canplay(event) {
|
|
177
|
-
// Do not emit the canplay event if one was fabricated.
|
|
178
|
-
const eventOrNull = lastReadyStateEvent === 'canplay' ? null : event;
|
|
179
|
-
lastReadyStateEvent = 'canplay';
|
|
180
|
-
return eventOrNull;
|
|
181
|
-
},
|
|
182
|
-
canplaythrough(event) {
|
|
183
|
-
// Do not emit the canplaythrough event if one was fabricated.
|
|
184
|
-
const eventOrNull = lastReadyStateEvent === 'canplaythrough' ? null : event;
|
|
185
|
-
lastReadyStateEvent = 'canplaythrough';
|
|
186
|
-
return eventOrNull;
|
|
187
|
-
},
|
|
188
|
-
playing(event) {
|
|
189
|
-
if (playing) {
|
|
190
|
-
// Do not emit the playing event if one was fabricated.
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
setApparentState(PlayHeadState.PLAYING);
|
|
194
|
-
playing = true;
|
|
195
|
-
return event;
|
|
196
|
-
},
|
|
197
|
-
waiting(event) {
|
|
198
|
-
if (waiting) {
|
|
199
|
-
// Do not emit the waiting event if one was fabricated.
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
waiting = true;
|
|
203
|
-
setApparentState(PlayHeadState.STOPPED);
|
|
204
|
-
return event;
|
|
205
|
-
},
|
|
206
|
-
},
|
|
207
|
-
dispose,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Chrome <= 53 has unreliable waiting events.
|
|
212
|
-
* Safari, and Edge Legacy miss playing events after seeking.
|
|
213
|
-
*/
|
|
214
|
-
export function requiresUnreliablePlaybackEventsPatch() {
|
|
215
|
-
return (hasBrowser(Browser.SAFARI) ||
|
|
216
|
-
hasBrowser(Browser.EDGE_LEGACY) ||
|
|
217
|
-
hasBrowser(Browser.CHROMIUM, null, '53'));
|
|
218
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { MediaElementPatchOptions } from '../patch/media/MediaElementPatchOptions';
|
|
2
|
-
/**
|
|
3
|
-
* Flags for applying patches.
|
|
4
|
-
* Default flags will be applied based on user agent, but may be overridden during player creation.
|
|
5
|
-
*/
|
|
6
|
-
export interface VinylPatchOptions {
|
|
7
|
-
readonly media: MediaElementPatchOptions;
|
|
8
|
-
}
|
|
9
|
-
export declare const defaultPatchOptions: import("@amazon/vinyl-util").Lazy<VinylPatchOptions>;
|
|
10
|
-
//# sourceMappingURL=VinylPatchOptions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VinylPatchOptions.d.ts","sourceRoot":"","sources":["../../../../src/vinyl/VinylPatchOptions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAIvF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAA;CAC3C;AAED,eAAO,MAAM,mBAAmB,sDAI9B,CAAA"}
|