@amazon/vinyl 3.0.1 → 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.
Files changed (250) hide show
  1. package/dist/index.cjs +972 -954
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/index.js +646 -619
  4. package/dist/index.js.map +4 -4
  5. package/dist/test/benchmark.js.map +2 -2
  6. package/dist/test/integ.es5.js +357 -353
  7. package/dist/test/integ.js +2251 -1852
  8. package/dist/test/integ.js.map +4 -4
  9. package/dist/test/jasmine.css +50 -3
  10. package/dist/test/jasmineHtml.es5.js +195 -155
  11. package/dist/test/jasmineHtml.js +2938 -1833
  12. package/dist/test/jasmineHtml.js.map +3 -3
  13. package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
  14. package/dist/types/current/ad/AdControllerImpl.js +4 -1
  15. package/dist/types/current/ad/discoverHlsInterstitials.d.ts.map +1 -1
  16. package/dist/types/current/ad/discoverHlsInterstitials.js +2 -2
  17. package/dist/types/current/drm/DrmControllerImpl.d.ts +2 -0
  18. package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
  19. package/dist/types/current/drm/DrmControllerImpl.js +56 -48
  20. package/dist/types/current/drm/licenseProvider/defaultLicenseProvider.d.ts.map +1 -1
  21. package/dist/types/current/drm/licenseProvider/defaultLicenseProvider.js +2 -2
  22. package/dist/types/current/index.d.ts +3 -6
  23. package/dist/types/current/index.d.ts.map +1 -1
  24. package/dist/types/current/index.js +3 -6
  25. package/dist/types/current/playback/PlaybackControllerImpl.d.ts +15 -0
  26. package/dist/types/current/playback/PlaybackControllerImpl.d.ts.map +1 -1
  27. package/dist/types/current/playback/PlaybackControllerImpl.js +100 -9
  28. package/dist/types/current/playback/ReadonlyPlaybackController.d.ts +27 -1
  29. package/dist/types/current/playback/ReadonlyPlaybackController.d.ts.map +1 -1
  30. package/dist/types/current/playback/ReadonlyPlaybackController.js +16 -0
  31. package/dist/types/current/playback/createStallDetector.d.ts +43 -0
  32. package/dist/types/current/playback/createStallDetector.d.ts.map +1 -0
  33. package/dist/types/current/playback/createStallDetector.js +101 -0
  34. package/dist/types/current/playback/createStallMonitor.d.ts +45 -0
  35. package/dist/types/current/playback/createStallMonitor.d.ts.map +1 -0
  36. package/dist/types/current/playback/createStallMonitor.js +94 -0
  37. package/dist/types/current/streaming/AudioOptions.d.ts +27 -0
  38. package/dist/types/current/streaming/AudioOptions.d.ts.map +1 -1
  39. package/dist/types/current/streaming/AudioOptions.js +5 -1
  40. package/dist/types/current/streaming/ContentStream.d.ts +0 -5
  41. package/dist/types/current/streaming/ContentStream.d.ts.map +1 -1
  42. package/dist/types/current/streaming/ContentStream.js +0 -4
  43. package/dist/types/current/streaming/LoadMetric.d.ts.map +1 -1
  44. package/dist/types/current/streaming/StreamingEventMap.d.ts +1 -5
  45. package/dist/types/current/streaming/StreamingEventMap.d.ts.map +1 -1
  46. package/dist/types/current/streaming/StreamingEventMap.js +0 -1
  47. package/dist/types/current/streaming/buffering/BufferingController.d.ts +0 -11
  48. package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
  49. package/dist/types/current/streaming/buffering/BufferingController.js +0 -13
  50. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts.map +1 -1
  51. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.js +13 -4
  52. package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -1
  53. package/dist/types/current/text/SidecarTextTrackLoader.js +4 -4
  54. package/dist/types/current/text/TextTrack.d.ts.map +1 -1
  55. package/dist/types/current/track/TrackController.d.ts.map +1 -1
  56. package/dist/types/current/track/TrackController.js +8 -2
  57. package/dist/types/current/track/createSegmentDataProvider.d.ts.map +1 -1
  58. package/dist/types/current/track/createSegmentDataProvider.js +6 -3
  59. package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
  60. package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts.map +1 -1
  61. package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.js +13 -8
  62. package/dist/types/current/track/dash/createDashFactories.d.ts +1 -1
  63. package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.d.ts.map +1 -1
  64. package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.js +71 -3
  65. package/dist/types/current/track/dash/urlDashManifestProvider.js +2 -2
  66. package/dist/types/current/track/dash/util/mpd.d.ts +6 -0
  67. package/dist/types/current/track/dash/util/mpd.d.ts.map +1 -1
  68. package/dist/types/current/track/dash/util/mpd.js +24 -3
  69. package/dist/types/current/track/filters/resourceTypeFilter.d.ts +4 -0
  70. package/dist/types/current/track/filters/resourceTypeFilter.d.ts.map +1 -1
  71. package/dist/types/current/track/filters/resourceTypeFilter.js +4 -0
  72. package/dist/types/current/track/filters/sampleRateFilter.d.ts +21 -7
  73. package/dist/types/current/track/filters/sampleRateFilter.d.ts.map +1 -1
  74. package/dist/types/current/track/filters/sampleRateFilter.js +42 -24
  75. package/dist/types/current/track/hls/createHlsFactories.d.ts +1 -1
  76. package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
  77. package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +3 -3
  78. package/dist/types/current/track/mse/MseTrack.d.ts +9 -17
  79. package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
  80. package/dist/types/current/track/mse/MseTrack.js +29 -46
  81. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  82. package/dist/types/current/util/media/mimeType.d.ts +8 -0
  83. package/dist/types/current/util/media/mimeType.d.ts.map +1 -0
  84. package/dist/types/current/util/media/mimeType.js +13 -0
  85. package/dist/types/current/vinyl/createVinylFactories.d.ts +7 -16
  86. package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
  87. package/dist/types/current/vinyl/createVinylFactories.js +2 -12
  88. package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +2 -0
  89. package/dist/types/ts3.7/index.d.ts +3 -6
  90. package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +15 -0
  91. package/dist/types/ts3.7/playback/ReadonlyPlaybackController.d.ts +28 -0
  92. package/dist/types/ts3.7/playback/createStallDetector.d.ts +43 -0
  93. package/dist/types/ts3.7/playback/createStallMonitor.d.ts +45 -0
  94. package/dist/types/ts3.7/streaming/AudioOptions.d.ts +27 -0
  95. package/dist/types/ts3.7/streaming/ContentStream.d.ts +0 -5
  96. package/dist/types/ts3.7/streaming/StreamingEventMap.d.ts +0 -5
  97. package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +0 -11
  98. package/dist/types/ts3.7/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
  99. package/dist/types/ts3.7/track/dash/createDashFactories.d.ts +1 -1
  100. package/dist/types/ts3.7/track/dash/util/mpd.d.ts +6 -0
  101. package/dist/types/ts3.7/track/filters/resourceTypeFilter.d.ts +4 -0
  102. package/dist/types/ts3.7/track/filters/sampleRateFilter.d.ts +21 -7
  103. package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +1 -1
  104. package/dist/types/ts3.7/track/mse/MseTrack.d.ts +9 -17
  105. package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
  106. package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +7 -16
  107. package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +2 -0
  108. package/dist/types/ts4.1/index.d.ts +3 -6
  109. package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +15 -0
  110. package/dist/types/ts4.1/playback/ReadonlyPlaybackController.d.ts +28 -0
  111. package/dist/types/ts4.1/playback/createStallDetector.d.ts +43 -0
  112. package/dist/types/ts4.1/playback/createStallMonitor.d.ts +45 -0
  113. package/dist/types/ts4.1/streaming/AudioOptions.d.ts +27 -0
  114. package/dist/types/ts4.1/streaming/ContentStream.d.ts +0 -5
  115. package/dist/types/ts4.1/streaming/StreamingEventMap.d.ts +0 -5
  116. package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +0 -11
  117. package/dist/types/ts4.1/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
  118. package/dist/types/ts4.1/track/dash/createDashFactories.d.ts +1 -1
  119. package/dist/types/ts4.1/track/dash/util/mpd.d.ts +6 -0
  120. package/dist/types/ts4.1/track/filters/resourceTypeFilter.d.ts +4 -0
  121. package/dist/types/ts4.1/track/filters/sampleRateFilter.d.ts +21 -7
  122. package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +1 -1
  123. package/dist/types/ts4.1/track/mse/MseTrack.d.ts +9 -17
  124. package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
  125. package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +7 -16
  126. package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +2 -0
  127. package/dist/types/ts4.7/index.d.ts +3 -6
  128. package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +15 -0
  129. package/dist/types/ts4.7/playback/ReadonlyPlaybackController.d.ts +28 -0
  130. package/dist/types/ts4.7/playback/createStallDetector.d.ts +43 -0
  131. package/dist/types/ts4.7/playback/createStallMonitor.d.ts +45 -0
  132. package/dist/types/ts4.7/streaming/AudioOptions.d.ts +27 -0
  133. package/dist/types/ts4.7/streaming/ContentStream.d.ts +0 -5
  134. package/dist/types/ts4.7/streaming/StreamingEventMap.d.ts +0 -5
  135. package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +0 -11
  136. package/dist/types/ts4.7/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
  137. package/dist/types/ts4.7/track/dash/createDashFactories.d.ts +1 -1
  138. package/dist/types/ts4.7/track/dash/util/mpd.d.ts +6 -0
  139. package/dist/types/ts4.7/track/filters/resourceTypeFilter.d.ts +4 -0
  140. package/dist/types/ts4.7/track/filters/sampleRateFilter.d.ts +21 -7
  141. package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +1 -1
  142. package/dist/types/ts4.7/track/mse/MseTrack.d.ts +9 -17
  143. package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -0
  144. package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +7 -16
  145. package/dist/unit/types/current/ad/AdControllerImpl.test.js +27 -1
  146. package/dist/unit/types/current/drm/DrmControllerImpl.test.js +93 -0
  147. package/dist/unit/types/current/index.d.ts +3 -4
  148. package/dist/unit/types/current/index.d.ts.map +1 -1
  149. package/dist/unit/types/current/index.js +3 -4
  150. package/dist/unit/types/current/playback/PlaybackControllerImpl.test.js +165 -0
  151. package/dist/unit/types/current/playback/createStallDetector.test.d.ts +2 -0
  152. package/dist/unit/types/current/playback/createStallDetector.test.d.ts.map +1 -0
  153. package/dist/unit/types/current/playback/createStallDetector.test.js +163 -0
  154. package/dist/unit/types/current/playback/createStallMonitor.test.d.ts +2 -0
  155. package/dist/unit/types/current/playback/createStallMonitor.test.d.ts.map +1 -0
  156. package/dist/unit/types/current/playback/createStallMonitor.test.js +125 -0
  157. package/dist/unit/types/current/streaming/ContentStream.test.js +0 -11
  158. package/dist/unit/types/current/streaming/MseTrack.test.js +47 -74
  159. package/dist/unit/types/current/streaming/abr/QualitySelectorImpl.test.js +1 -1
  160. package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +0 -21
  161. package/dist/unit/types/current/streaming/createDefaultMediaTimelineTransformer.test.js +133 -0
  162. package/dist/unit/types/current/track/TrackController.test.js +61 -1
  163. package/dist/unit/types/current/track/createSegmentDataProvider.test.js +18 -0
  164. package/dist/unit/types/current/track/dash/DashMediaQualityMetadataResolver.test.js +46 -14
  165. package/dist/unit/types/current/track/dash/createSegmentControllerFactory.test.js +1 -0
  166. package/dist/unit/types/current/track/dash/timeline/DashRepresentationSegmentProvider.test.js +114 -0
  167. package/dist/unit/types/current/track/dash/util/mpd.test.js +37 -0
  168. package/dist/unit/types/current/track/filters/resourceTypeFilter.test.js +7 -0
  169. package/dist/unit/types/current/track/filters/sampleRateFilter.test.js +136 -34
  170. package/dist/unit/types/current/track/source/SourceObjectTrack.test.js +1 -1
  171. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  172. package/dist/unit/types/current/util/media/mimeType.test.d.ts +2 -0
  173. package/dist/unit/types/current/util/media/mimeType.test.d.ts.map +1 -0
  174. package/dist/unit/types/current/util/media/mimeType.test.js +22 -0
  175. package/dist/unit/types/current/vinyl/createVinylFactories.test.js +2 -36
  176. package/dist/vinylTestUtil/index.js +6 -4
  177. package/dist/vinylTestUtil/index.js.map +2 -2
  178. package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts +1 -0
  179. package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts.map +1 -1
  180. package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.js +1 -0
  181. package/dist/vinylTestUtil/types/current/media/FrequencyAnalyzer.d.ts.map +1 -1
  182. package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts +0 -1
  183. package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts.map +1 -1
  184. package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.js +0 -1
  185. package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
  186. package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts.map +1 -1
  187. package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.js +0 -1
  188. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  189. package/dist/vinylTestUtil/types/current/util/playback/eventPromises.js +1 -1
  190. package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.d.ts.map +1 -1
  191. package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.js +9 -1
  192. package/dist/vinylTestUtil/types/ts3.7/assets/vinylTestAssets.d.ts +1 -0
  193. package/dist/vinylTestUtil/types/ts3.7/mock/streaming/MockContentStream.d.ts +0 -1
  194. package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
  195. package/dist/vinylTestUtil/types/ts4.1/assets/vinylTestAssets.d.ts +1 -0
  196. package/dist/vinylTestUtil/types/ts4.1/mock/streaming/MockContentStream.d.ts +0 -1
  197. package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
  198. package/dist/vinylTestUtil/types/ts4.7/assets/vinylTestAssets.d.ts +1 -0
  199. package/dist/vinylTestUtil/types/ts4.7/mock/streaming/MockContentStream.d.ts +0 -1
  200. package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
  201. package/docs/USAGE.md +29 -0
  202. package/package.json +11 -10
  203. package/dist/types/current/patch/media/HtmlMediaElementPatch.d.ts +0 -3
  204. package/dist/types/current/patch/media/HtmlMediaElementPatch.d.ts.map +0 -1
  205. package/dist/types/current/patch/media/HtmlMediaElementPatch.js +0 -5
  206. package/dist/types/current/patch/media/MediaElementPatchOptions.d.ts +0 -19
  207. package/dist/types/current/patch/media/MediaElementPatchOptions.d.ts.map +0 -1
  208. package/dist/types/current/patch/media/MediaElementPatchOptions.js +0 -16
  209. package/dist/types/current/patch/media/patchMediaElement.d.ts +0 -9
  210. package/dist/types/current/patch/media/patchMediaElement.d.ts.map +0 -1
  211. package/dist/types/current/patch/media/patchMediaElement.js +0 -15
  212. package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
  213. package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts.map +0 -1
  214. package/dist/types/current/patch/media/patches/createPreventStallsPatch.js +0 -55
  215. package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
  216. package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts.map +0 -1
  217. package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.js +0 -218
  218. package/dist/types/current/vinyl/VinylPatchOptions.d.ts +0 -10
  219. package/dist/types/current/vinyl/VinylPatchOptions.d.ts.map +0 -1
  220. package/dist/types/current/vinyl/VinylPatchOptions.js +0 -11
  221. package/dist/types/ts3.7/patch/media/HtmlMediaElementPatch.d.ts +0 -3
  222. package/dist/types/ts3.7/patch/media/MediaElementPatchOptions.d.ts +0 -19
  223. package/dist/types/ts3.7/patch/media/patchMediaElement.d.ts +0 -9
  224. package/dist/types/ts3.7/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
  225. package/dist/types/ts3.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
  226. package/dist/types/ts3.7/vinyl/VinylPatchOptions.d.ts +0 -10
  227. package/dist/types/ts4.1/patch/media/HtmlMediaElementPatch.d.ts +0 -3
  228. package/dist/types/ts4.1/patch/media/MediaElementPatchOptions.d.ts +0 -19
  229. package/dist/types/ts4.1/patch/media/patchMediaElement.d.ts +0 -9
  230. package/dist/types/ts4.1/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
  231. package/dist/types/ts4.1/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
  232. package/dist/types/ts4.1/vinyl/VinylPatchOptions.d.ts +0 -10
  233. package/dist/types/ts4.7/patch/media/HtmlMediaElementPatch.d.ts +0 -3
  234. package/dist/types/ts4.7/patch/media/MediaElementPatchOptions.d.ts +0 -19
  235. package/dist/types/ts4.7/patch/media/patchMediaElement.d.ts +0 -9
  236. package/dist/types/ts4.7/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
  237. package/dist/types/ts4.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
  238. package/dist/types/ts4.7/vinyl/VinylPatchOptions.d.ts +0 -10
  239. package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.d.ts +0 -2
  240. package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.d.ts.map +0 -1
  241. package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.js +0 -17
  242. package/dist/unit/types/current/patch/media/patchMediaElement.test.d.ts +0 -2
  243. package/dist/unit/types/current/patch/media/patchMediaElement.test.d.ts.map +0 -1
  244. package/dist/unit/types/current/patch/media/patchMediaElement.test.js +0 -36
  245. package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.d.ts +0 -2
  246. package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.d.ts.map +0 -1
  247. package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.js +0 -93
  248. package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.d.ts +0 -2
  249. package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.d.ts.map +0 -1
  250. 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 = 10) {
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,iBAgE3E"}
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
- expect(seekingSpy).toHaveBeenCalledBefore(seekedSpy);
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>;
@@ -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>;
@@ -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>;
@@ -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.1",
3
+ "version": "3.1.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-build-utils": "^3.0.1",
94
- "commander": "^9.5.0"
93
+ "@amazon/vinyl-browserstack": "^3.1.0",
94
+ "@amazon/vinyl-build-utils": "^3.1.0",
95
+ "commander": "^15.0.0"
95
96
  },
96
97
  "dependencies": {
97
- "@amazon/vinyl-di": "^3.0.1",
98
- "@amazon/vinyl-hls-parser": "^3.0.1",
99
- "@amazon/vinyl-mpd-parser": "^3.0.1",
100
- "@amazon/vinyl-observable": "^3.0.1",
101
- "@amazon/vinyl-transmux": "^3.0.1",
102
- "@amazon/vinyl-util": "^3.0.1",
103
- "@amazon/vinyl-validation": "^3.0.1"
98
+ "@amazon/vinyl-di": "^3.1.0",
99
+ "@amazon/vinyl-hls-parser": "^3.1.0",
100
+ "@amazon/vinyl-mpd-parser": "^3.1.0",
101
+ "@amazon/vinyl-observable": "^3.1.0",
102
+ "@amazon/vinyl-transmux": "^3.1.0",
103
+ "@amazon/vinyl-util": "^3.1.0",
104
+ "@amazon/vinyl-validation": "^3.1.0"
104
105
  },
105
106
  "publishConfig": {
106
107
  "access": "public"
@@ -1,3 +0,0 @@
1
- import type { Patch } from '@amazon/vinyl-util';
2
- export type HtmlMediaElementPatch = Patch<HTMLMediaElement, HTMLMediaElementEventMap>;
3
- //# sourceMappingURL=HtmlMediaElementPatch.d.ts.map
@@ -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,5 +0,0 @@
1
- /*
2
- * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
- * SPDX-License-Identifier: Apache-2.0
4
- */
5
- export {};
@@ -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"}