@amazon/vinyl 3.0.0 → 3.1.0

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