@amazon/vinyl 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/dist/index.cjs +276 -200
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/index.js +280 -203
  4. package/dist/index.js.map +4 -4
  5. package/dist/test/benchmark.es5.js +169 -232
  6. package/dist/test/benchmark.js +1475 -1933
  7. package/dist/test/benchmark.js.map +4 -4
  8. package/dist/test/integ.es5.js +771 -394
  9. package/dist/test/integ.js +6063 -5273
  10. package/dist/test/integ.js.map +4 -4
  11. package/dist/test/jasmineHtml.es5.js +8 -8
  12. package/dist/test/jasmineHtml.js +8 -4
  13. package/dist/test/jasmineHtml.js.map +3 -3
  14. package/dist/types/current/client/Capabilities.d.ts.map +1 -1
  15. package/dist/types/current/client/CapabilitiesImpl.d.ts.map +1 -1
  16. package/dist/types/current/drm/DrmController.d.ts +2 -2
  17. package/dist/types/current/drm/DrmController.d.ts.map +1 -1
  18. package/dist/types/current/drm/DrmControllerImpl.d.ts +3 -3
  19. package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
  20. package/dist/types/current/drm/DrmControllerImpl.js +7 -7
  21. package/dist/types/current/drm/DrmKeySystemResolver.d.ts +1 -1
  22. package/dist/types/current/drm/DrmKeySystemResolver.d.ts.map +1 -1
  23. package/dist/types/current/drm/DrmKeySystemResolver.js +1 -1
  24. package/dist/types/current/drm/DrmOptions.d.ts +1 -1
  25. package/dist/types/current/drm/DrmOptions.d.ts.map +1 -1
  26. package/dist/types/current/drm/DrmOptions.js +1 -1
  27. package/dist/types/current/drm/commonEme/CommonEme.d.ts +2 -2
  28. package/dist/types/current/drm/commonEme/CommonEme.d.ts.map +1 -1
  29. package/dist/types/current/drm/commonEme/CommonEmeFactory.d.ts +1 -1
  30. package/dist/types/current/drm/commonEme/CommonEmeFactory.d.ts.map +1 -1
  31. package/dist/types/current/drm/commonEme/MsCommonEme.d.ts +1 -1
  32. package/dist/types/current/drm/commonEme/MsCommonEme.d.ts.map +1 -1
  33. package/dist/types/current/drm/commonEme/MsCommonEme.js +1 -1
  34. package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts +1 -1
  35. package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts.map +1 -1
  36. package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts +2 -2
  37. package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts.map +1 -1
  38. package/dist/types/current/drm/commonEme/WebKitCommonEme.js +1 -1
  39. package/dist/types/current/drm/commonEme/createDrmErrorHandler.js +1 -1
  40. package/dist/types/current/drm/licenseProvider/LicenseProvider.d.ts +1 -1
  41. package/dist/types/current/drm/licenseProvider/LicenseProvider.d.ts.map +1 -1
  42. package/dist/types/current/global/environment.d.ts +6 -2
  43. package/dist/types/current/global/environment.d.ts.map +1 -1
  44. package/dist/types/current/global/environment.js +4 -3
  45. package/dist/types/current/global/initializeVinylGlobal.js +1 -1
  46. package/dist/types/current/patch/media/MediaElementPatchOptions.js +1 -1
  47. package/dist/types/current/patch/media/patchMediaElement.js +1 -1
  48. package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts +1 -1
  49. package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts.map +1 -1
  50. package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +1 -1
  51. package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts.map +1 -1
  52. package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -1
  53. package/dist/types/current/playback/PlaybackControllerImpl.d.ts.map +1 -1
  54. package/dist/types/current/playback/PlaybackControllerImpl.js +4 -4
  55. package/dist/types/current/playback/ReadonlyPlaybackController.d.ts.map +1 -1
  56. package/dist/types/current/playback/error/ReportableMediaError.js +1 -1
  57. package/dist/types/current/playback/logging/playbackStateLoggingHandler.d.ts +1 -1
  58. package/dist/types/current/playback/logging/playbackStateLoggingHandler.d.ts.map +1 -1
  59. package/dist/types/current/playback/logging/playbackStateLoggingHandler.js +1 -1
  60. package/dist/types/current/playback/nextHasMetadata.d.ts +1 -1
  61. package/dist/types/current/playback/nextHasMetadata.d.ts.map +1 -1
  62. package/dist/types/current/streaming/ContentStream.d.ts +4 -4
  63. package/dist/types/current/streaming/ContentStream.d.ts.map +1 -1
  64. package/dist/types/current/streaming/ContentStreamingOptions.d.ts +2 -2
  65. package/dist/types/current/streaming/ContentStreamingOptions.d.ts.map +1 -1
  66. package/dist/types/current/streaming/MediaQualityMetadata.d.ts +2 -2
  67. package/dist/types/current/streaming/MediaQualityMetadata.d.ts.map +1 -1
  68. package/dist/types/current/streaming/MediaQualityMetadata.js +1 -1
  69. package/dist/types/current/streaming/MediaTimeline.d.ts +6 -5
  70. package/dist/types/current/streaming/MediaTimeline.d.ts.map +1 -1
  71. package/dist/types/current/streaming/SegmentController.d.ts +2 -7
  72. package/dist/types/current/streaming/SegmentController.d.ts.map +1 -1
  73. package/dist/types/current/streaming/SegmentControllerImpl.d.ts +5 -6
  74. package/dist/types/current/streaming/SegmentControllerImpl.d.ts.map +1 -1
  75. package/dist/types/current/streaming/SegmentControllerImpl.js +5 -15
  76. package/dist/types/current/streaming/SegmentReference.d.ts +1 -1
  77. package/dist/types/current/streaming/SegmentReference.d.ts.map +1 -1
  78. package/dist/types/current/streaming/StreamingEventMap.d.ts +1 -1
  79. package/dist/types/current/streaming/StreamingEventMap.d.ts.map +1 -1
  80. package/dist/types/current/streaming/abr/QualitySelector.d.ts +1 -1
  81. package/dist/types/current/streaming/abr/QualitySelector.d.ts.map +1 -1
  82. package/dist/types/current/streaming/abr/QualitySelectorImpl.d.ts +18 -3
  83. package/dist/types/current/streaming/abr/QualitySelectorImpl.d.ts.map +1 -1
  84. package/dist/types/current/streaming/abr/QualitySelectorImpl.js +8 -2
  85. package/dist/types/current/streaming/buffering/BufferingController.d.ts +3 -13
  86. package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
  87. package/dist/types/current/streaming/buffering/BufferingController.js +1 -24
  88. package/dist/types/current/streaming/buffering/MediaSourceController.d.ts +41 -15
  89. package/dist/types/current/streaming/buffering/MediaSourceController.d.ts.map +1 -1
  90. package/dist/types/current/streaming/buffering/MediaSourceController.js +74 -17
  91. package/dist/types/current/streaming/buffering/SourceBufferController.d.ts +1 -1
  92. package/dist/types/current/streaming/buffering/SourceBufferController.d.ts.map +1 -1
  93. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts +1 -1
  94. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts.map +1 -1
  95. package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.js +2 -2
  96. package/dist/types/current/streaming/mediaTimelineFilter.d.ts +3 -3
  97. package/dist/types/current/streaming/mediaTimelineFilter.d.ts.map +1 -1
  98. package/dist/types/current/streaming/mediaTimelineFilter.js +1 -1
  99. package/dist/types/current/streaming/mediaTimelineLanguageFilter.d.ts +1 -1
  100. package/dist/types/current/streaming/mediaTimelineLanguageFilter.d.ts.map +1 -1
  101. package/dist/types/current/streaming/util/segment.d.ts +1 -1
  102. package/dist/types/current/streaming/util/segment.d.ts.map +1 -1
  103. package/dist/types/current/track/AutoResetController.d.ts +37 -12
  104. package/dist/types/current/track/AutoResetController.d.ts.map +1 -1
  105. package/dist/types/current/track/AutoResetController.js +38 -28
  106. package/dist/types/current/track/Track.d.ts.map +1 -1
  107. package/dist/types/current/track/TrackBase.d.ts.map +1 -1
  108. package/dist/types/current/track/TrackController.d.ts +2 -2
  109. package/dist/types/current/track/TrackController.d.ts.map +1 -1
  110. package/dist/types/current/track/TrackFactory.d.ts +1 -1
  111. package/dist/types/current/track/TrackFactory.d.ts.map +1 -1
  112. package/dist/types/current/track/createSegmentDataProvider.d.ts.map +1 -1
  113. package/dist/types/current/track/createVinylTrackFactories.d.ts +5 -5
  114. package/dist/types/current/track/createVinylTrackFactories.d.ts.map +1 -1
  115. package/dist/types/current/track/createVinylTrackFactories.js +4 -4
  116. package/dist/types/current/track/dash/DashManifestController.d.ts +1 -1
  117. package/dist/types/current/track/dash/DashManifestController.d.ts.map +1 -1
  118. package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts.map +1 -1
  119. package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.js +1 -1
  120. package/dist/types/current/track/dash/DashTrack.d.ts +4 -4
  121. package/dist/types/current/track/dash/DashTrack.d.ts.map +1 -1
  122. package/dist/types/current/track/dash/DashTrack.js +2 -2
  123. package/dist/types/current/track/dash/buildDashMediaTimeline.d.ts +2 -2
  124. package/dist/types/current/track/dash/buildDashMediaTimeline.d.ts.map +1 -1
  125. package/dist/types/current/track/dash/buildDashMediaTimeline.js +2 -2
  126. package/dist/types/current/track/dash/createDashContentStreamFactories.d.ts.map +1 -1
  127. package/dist/types/current/track/dash/createDashContentTypesValue.d.ts +2 -2
  128. package/dist/types/current/track/dash/createDashContentTypesValue.d.ts.map +1 -1
  129. package/dist/types/current/track/dash/createDashContentTypesValue.js +1 -1
  130. package/dist/types/current/track/dash/createDashFactories.d.ts +12 -12
  131. package/dist/types/current/track/dash/createDashFactories.d.ts.map +1 -1
  132. package/dist/types/current/track/dash/createDashFactories.js +8 -8
  133. package/dist/types/current/track/dash/createDashManifestProvider.d.ts +1 -1
  134. package/dist/types/current/track/dash/createDashManifestProvider.d.ts.map +1 -1
  135. package/dist/types/current/track/dash/createDashManifestProvider.js +1 -1
  136. package/dist/types/current/track/dash/createDefaultDashManifestTransformer.d.ts +1 -1
  137. package/dist/types/current/track/dash/createDefaultDashManifestTransformer.d.ts.map +1 -1
  138. package/dist/types/current/track/dash/createDefaultDashManifestTransformer.js +1 -1
  139. package/dist/types/current/track/dash/createSegmentControllerFactory.d.ts.map +1 -1
  140. package/dist/types/current/track/dash/manifestTransformUtils.d.ts +1 -1
  141. package/dist/types/current/track/dash/manifestTransformUtils.d.ts.map +1 -1
  142. package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.d.ts +3 -3
  143. package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.d.ts.map +1 -1
  144. package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.js +3 -3
  145. package/dist/types/current/track/dash/urlDashManifestProvider.d.ts +1 -1
  146. package/dist/types/current/track/dash/urlDashManifestProvider.d.ts.map +1 -1
  147. package/dist/types/current/track/dash/util/mimeType.d.ts.map +1 -1
  148. package/dist/types/current/track/dash/util/mimeType.js +1 -1
  149. package/dist/types/current/track/dash/util/mpd.d.ts +3 -2
  150. package/dist/types/current/track/dash/util/mpd.d.ts.map +1 -1
  151. package/dist/types/current/track/dash/util/mpd.js +13 -3
  152. package/dist/types/current/track/dash/util/uriResolution.js +1 -1
  153. package/dist/types/current/track/filters/keySystemFilter.d.ts.map +1 -1
  154. package/dist/types/current/track/filters/resourceTypeFilter.d.ts.map +1 -1
  155. package/dist/types/current/track/filters/sampleRateFilter.d.ts.map +1 -1
  156. package/dist/types/current/track/hls/HlsTrack.d.ts.map +1 -1
  157. package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts +3 -3
  158. package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts.map +1 -1
  159. package/dist/types/current/track/hls/buildHlsMediaTimeline.js +16 -14
  160. package/dist/types/current/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
  161. package/dist/types/current/track/hls/createDefaultHlsManifestTransformer.d.ts.map +1 -1
  162. package/dist/types/current/track/hls/createHlsContentStreamFactories.d.ts.map +1 -1
  163. package/dist/types/current/track/hls/util/hlsSegmentTime.d.ts +1 -1
  164. package/dist/types/current/track/hls/util/hlsSegmentTime.d.ts.map +1 -1
  165. package/dist/types/current/track/hls/util/hlsSegmentTime.js +1 -1
  166. package/dist/types/current/track/mse/MseTrack.d.ts +2 -2
  167. package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
  168. package/dist/types/current/track/mse/MseTrack.js +2 -1
  169. package/dist/types/current/track/mse/codec.d.ts.map +1 -1
  170. package/dist/types/current/track/source/FixedPlaybackQuality.d.ts +1 -1
  171. package/dist/types/current/track/source/FixedPlaybackQuality.d.ts.map +1 -1
  172. package/dist/types/current/track/source/SourceObjectTrack.d.ts +4 -4
  173. package/dist/types/current/track/source/SourceObjectTrack.d.ts.map +1 -1
  174. package/dist/types/current/track/source/SourceObjectTrack.js +2 -2
  175. package/dist/types/current/track/source/SourceTrack.d.ts +4 -4
  176. package/dist/types/current/track/source/SourceTrack.d.ts.map +1 -1
  177. package/dist/types/current/track/source/SourceTrack.js +2 -2
  178. package/dist/types/current/track/source/SourceTrackBase.d.ts +2 -2
  179. package/dist/types/current/track/source/SourceTrackBase.d.ts.map +1 -1
  180. package/dist/types/current/track/source/SourceTrackBase.js +2 -2
  181. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  182. package/dist/types/current/vinyl/ReadonlyPlaybackStreamingState.d.ts.map +1 -1
  183. package/dist/types/current/vinyl/VinylDeps.d.ts +1 -1
  184. package/dist/types/current/vinyl/VinylDeps.d.ts.map +1 -1
  185. package/dist/types/current/vinyl/VinylOptions.d.ts.map +1 -1
  186. package/dist/types/current/vinyl/VinylPatchOptions.d.ts.map +1 -1
  187. package/dist/types/current/vinyl/VinylPlayer.d.ts +26 -2
  188. package/dist/types/current/vinyl/VinylPlayer.d.ts.map +1 -1
  189. package/dist/types/current/vinyl/VinylPlayer.js +18 -3
  190. package/dist/types/current/vinyl/createVinylFactories.d.ts +9 -11
  191. package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
  192. package/dist/types/current/vinyl/createVinylFactories.js +2 -2
  193. package/dist/types/ts3.7/drm/DrmController.d.ts +2 -2
  194. package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +3 -3
  195. package/dist/types/ts3.7/drm/DrmKeySystemResolver.d.ts +1 -1
  196. package/dist/types/ts3.7/drm/DrmOptions.d.ts +1 -1
  197. package/dist/types/ts3.7/drm/commonEme/CommonEme.d.ts +2 -2
  198. package/dist/types/ts3.7/drm/commonEme/CommonEmeFactory.d.ts +1 -1
  199. package/dist/types/ts3.7/drm/commonEme/MsCommonEme.d.ts +1 -1
  200. package/dist/types/ts3.7/drm/commonEme/StandardCommonEme.d.ts +1 -1
  201. package/dist/types/ts3.7/drm/commonEme/WebKitCommonEme.d.ts +2 -2
  202. package/dist/types/ts3.7/drm/licenseProvider/LicenseProvider.d.ts +1 -1
  203. package/dist/types/ts3.7/global/environment.d.ts +6 -2
  204. package/dist/types/ts3.7/patch/media/patches/createPreventStallsPatch.d.ts +1 -1
  205. package/dist/types/ts3.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +1 -1
  206. package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -1
  207. package/dist/types/ts3.7/playback/logging/playbackStateLoggingHandler.d.ts +1 -1
  208. package/dist/types/ts3.7/playback/nextHasMetadata.d.ts +1 -1
  209. package/dist/types/ts3.7/streaming/ContentStream.d.ts +4 -4
  210. package/dist/types/ts3.7/streaming/ContentStreamingOptions.d.ts +2 -2
  211. package/dist/types/ts3.7/streaming/MediaQualityMetadata.d.ts +2 -2
  212. package/dist/types/ts3.7/streaming/MediaTimeline.d.ts +6 -5
  213. package/dist/types/ts3.7/streaming/SegmentController.d.ts +2 -7
  214. package/dist/types/ts3.7/streaming/SegmentControllerImpl.d.ts +5 -6
  215. package/dist/types/ts3.7/streaming/SegmentReference.d.ts +1 -1
  216. package/dist/types/ts3.7/streaming/StreamingEventMap.d.ts +1 -1
  217. package/dist/types/ts3.7/streaming/abr/QualitySelector.d.ts +1 -1
  218. package/dist/types/ts3.7/streaming/abr/QualitySelectorImpl.d.ts +18 -3
  219. package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +3 -13
  220. package/dist/types/ts3.7/streaming/buffering/MediaSourceController.d.ts +41 -15
  221. package/dist/types/ts3.7/streaming/buffering/SourceBufferController.d.ts +1 -1
  222. package/dist/types/ts3.7/streaming/createDefaultMediaTimelineTransformer.d.ts +1 -1
  223. package/dist/types/ts3.7/streaming/mediaTimelineFilter.d.ts +3 -3
  224. package/dist/types/ts3.7/streaming/mediaTimelineLanguageFilter.d.ts +1 -1
  225. package/dist/types/ts3.7/streaming/util/segment.d.ts +1 -1
  226. package/dist/types/ts3.7/track/AutoResetController.d.ts +37 -12
  227. package/dist/types/ts3.7/track/TrackController.d.ts +2 -2
  228. package/dist/types/ts3.7/track/TrackFactory.d.ts +1 -1
  229. package/dist/types/ts3.7/track/createVinylTrackFactories.d.ts +5 -5
  230. package/dist/types/ts3.7/track/dash/DashManifestController.d.ts +1 -1
  231. package/dist/types/ts3.7/track/dash/DashTrack.d.ts +4 -4
  232. package/dist/types/ts3.7/track/dash/buildDashMediaTimeline.d.ts +2 -2
  233. package/dist/types/ts3.7/track/dash/createDashContentTypesValue.d.ts +2 -2
  234. package/dist/types/ts3.7/track/dash/createDashFactories.d.ts +12 -12
  235. package/dist/types/ts3.7/track/dash/createDashManifestProvider.d.ts +1 -1
  236. package/dist/types/ts3.7/track/dash/createDefaultDashManifestTransformer.d.ts +1 -1
  237. package/dist/types/ts3.7/track/dash/manifestTransformUtils.d.ts +1 -1
  238. package/dist/types/ts3.7/track/dash/timeline/DashRepresentationSegmentProvider.d.ts +3 -3
  239. package/dist/types/ts3.7/track/dash/urlDashManifestProvider.d.ts +1 -1
  240. package/dist/types/ts3.7/track/dash/util/mpd.d.ts +3 -2
  241. package/dist/types/ts3.7/track/hls/buildHlsMediaTimeline.d.ts +3 -3
  242. package/dist/types/ts3.7/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
  243. package/dist/types/ts3.7/track/hls/util/hlsSegmentTime.d.ts +1 -1
  244. package/dist/types/ts3.7/track/mse/MseTrack.d.ts +2 -2
  245. package/dist/types/ts3.7/track/source/FixedPlaybackQuality.d.ts +1 -1
  246. package/dist/types/ts3.7/track/source/SourceObjectTrack.d.ts +4 -4
  247. package/dist/types/ts3.7/track/source/SourceTrack.d.ts +4 -4
  248. package/dist/types/ts3.7/track/source/SourceTrackBase.d.ts +2 -2
  249. package/dist/types/ts3.7/vinyl/VinylDeps.d.ts +1 -1
  250. package/dist/types/ts3.7/vinyl/VinylPlayer.d.ts +18 -2
  251. package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +9 -11
  252. package/dist/types/ts4.1/drm/DrmController.d.ts +2 -2
  253. package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +3 -3
  254. package/dist/types/ts4.1/drm/DrmKeySystemResolver.d.ts +1 -1
  255. package/dist/types/ts4.1/drm/DrmOptions.d.ts +1 -1
  256. package/dist/types/ts4.1/drm/commonEme/CommonEme.d.ts +2 -2
  257. package/dist/types/ts4.1/drm/commonEme/CommonEmeFactory.d.ts +1 -1
  258. package/dist/types/ts4.1/drm/commonEme/MsCommonEme.d.ts +1 -1
  259. package/dist/types/ts4.1/drm/commonEme/StandardCommonEme.d.ts +1 -1
  260. package/dist/types/ts4.1/drm/commonEme/WebKitCommonEme.d.ts +2 -2
  261. package/dist/types/ts4.1/drm/licenseProvider/LicenseProvider.d.ts +1 -1
  262. package/dist/types/ts4.1/global/environment.d.ts +6 -2
  263. package/dist/types/ts4.1/patch/media/patches/createPreventStallsPatch.d.ts +1 -1
  264. package/dist/types/ts4.1/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +1 -1
  265. package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -1
  266. package/dist/types/ts4.1/playback/logging/playbackStateLoggingHandler.d.ts +1 -1
  267. package/dist/types/ts4.1/playback/nextHasMetadata.d.ts +1 -1
  268. package/dist/types/ts4.1/streaming/ContentStream.d.ts +4 -4
  269. package/dist/types/ts4.1/streaming/ContentStreamingOptions.d.ts +2 -2
  270. package/dist/types/ts4.1/streaming/MediaQualityMetadata.d.ts +2 -2
  271. package/dist/types/ts4.1/streaming/MediaTimeline.d.ts +6 -5
  272. package/dist/types/ts4.1/streaming/SegmentController.d.ts +2 -7
  273. package/dist/types/ts4.1/streaming/SegmentControllerImpl.d.ts +5 -6
  274. package/dist/types/ts4.1/streaming/SegmentReference.d.ts +1 -1
  275. package/dist/types/ts4.1/streaming/StreamingEventMap.d.ts +1 -1
  276. package/dist/types/ts4.1/streaming/abr/QualitySelector.d.ts +1 -1
  277. package/dist/types/ts4.1/streaming/abr/QualitySelectorImpl.d.ts +18 -3
  278. package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +3 -13
  279. package/dist/types/ts4.1/streaming/buffering/MediaSourceController.d.ts +41 -15
  280. package/dist/types/ts4.1/streaming/buffering/SourceBufferController.d.ts +1 -1
  281. package/dist/types/ts4.1/streaming/createDefaultMediaTimelineTransformer.d.ts +1 -1
  282. package/dist/types/ts4.1/streaming/mediaTimelineFilter.d.ts +3 -3
  283. package/dist/types/ts4.1/streaming/mediaTimelineLanguageFilter.d.ts +1 -1
  284. package/dist/types/ts4.1/streaming/util/segment.d.ts +1 -1
  285. package/dist/types/ts4.1/track/AutoResetController.d.ts +37 -12
  286. package/dist/types/ts4.1/track/TrackController.d.ts +2 -2
  287. package/dist/types/ts4.1/track/TrackFactory.d.ts +1 -1
  288. package/dist/types/ts4.1/track/createVinylTrackFactories.d.ts +5 -5
  289. package/dist/types/ts4.1/track/dash/DashManifestController.d.ts +1 -1
  290. package/dist/types/ts4.1/track/dash/DashTrack.d.ts +4 -4
  291. package/dist/types/ts4.1/track/dash/buildDashMediaTimeline.d.ts +2 -2
  292. package/dist/types/ts4.1/track/dash/createDashContentTypesValue.d.ts +2 -2
  293. package/dist/types/ts4.1/track/dash/createDashFactories.d.ts +12 -12
  294. package/dist/types/ts4.1/track/dash/createDashManifestProvider.d.ts +1 -1
  295. package/dist/types/ts4.1/track/dash/createDefaultDashManifestTransformer.d.ts +1 -1
  296. package/dist/types/ts4.1/track/dash/manifestTransformUtils.d.ts +1 -1
  297. package/dist/types/ts4.1/track/dash/timeline/DashRepresentationSegmentProvider.d.ts +3 -3
  298. package/dist/types/ts4.1/track/dash/urlDashManifestProvider.d.ts +1 -1
  299. package/dist/types/ts4.1/track/dash/util/mpd.d.ts +3 -2
  300. package/dist/types/ts4.1/track/hls/buildHlsMediaTimeline.d.ts +3 -3
  301. package/dist/types/ts4.1/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
  302. package/dist/types/ts4.1/track/hls/util/hlsSegmentTime.d.ts +1 -1
  303. package/dist/types/ts4.1/track/mse/MseTrack.d.ts +3 -3
  304. package/dist/types/ts4.1/track/source/FixedPlaybackQuality.d.ts +1 -1
  305. package/dist/types/ts4.1/track/source/SourceObjectTrack.d.ts +5 -5
  306. package/dist/types/ts4.1/track/source/SourceTrack.d.ts +5 -5
  307. package/dist/types/ts4.1/track/source/SourceTrackBase.d.ts +3 -3
  308. package/dist/types/ts4.1/vinyl/VinylDeps.d.ts +1 -1
  309. package/dist/types/ts4.1/vinyl/VinylPlayer.d.ts +18 -2
  310. package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +9 -11
  311. package/dist/types/ts4.7/drm/DrmController.d.ts +2 -2
  312. package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +3 -3
  313. package/dist/types/ts4.7/drm/DrmKeySystemResolver.d.ts +1 -1
  314. package/dist/types/ts4.7/drm/DrmOptions.d.ts +1 -1
  315. package/dist/types/ts4.7/drm/commonEme/CommonEme.d.ts +2 -2
  316. package/dist/types/ts4.7/drm/commonEme/CommonEmeFactory.d.ts +1 -1
  317. package/dist/types/ts4.7/drm/commonEme/MsCommonEme.d.ts +1 -1
  318. package/dist/types/ts4.7/drm/commonEme/StandardCommonEme.d.ts +1 -1
  319. package/dist/types/ts4.7/drm/commonEme/WebKitCommonEme.d.ts +2 -2
  320. package/dist/types/ts4.7/drm/licenseProvider/LicenseProvider.d.ts +1 -1
  321. package/dist/types/ts4.7/global/environment.d.ts +6 -2
  322. package/dist/types/ts4.7/patch/media/patches/createPreventStallsPatch.d.ts +1 -1
  323. package/dist/types/ts4.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +1 -1
  324. package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -1
  325. package/dist/types/ts4.7/playback/logging/playbackStateLoggingHandler.d.ts +1 -1
  326. package/dist/types/ts4.7/playback/nextHasMetadata.d.ts +1 -1
  327. package/dist/types/ts4.7/streaming/ContentStream.d.ts +4 -4
  328. package/dist/types/ts4.7/streaming/ContentStreamingOptions.d.ts +2 -2
  329. package/dist/types/ts4.7/streaming/MediaQualityMetadata.d.ts +2 -2
  330. package/dist/types/ts4.7/streaming/MediaTimeline.d.ts +6 -5
  331. package/dist/types/ts4.7/streaming/SegmentController.d.ts +2 -7
  332. package/dist/types/ts4.7/streaming/SegmentControllerImpl.d.ts +5 -6
  333. package/dist/types/ts4.7/streaming/SegmentReference.d.ts +1 -1
  334. package/dist/types/ts4.7/streaming/StreamingEventMap.d.ts +1 -1
  335. package/dist/types/ts4.7/streaming/abr/QualitySelector.d.ts +1 -1
  336. package/dist/types/ts4.7/streaming/abr/QualitySelectorImpl.d.ts +18 -3
  337. package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +3 -13
  338. package/dist/types/ts4.7/streaming/buffering/MediaSourceController.d.ts +41 -15
  339. package/dist/types/ts4.7/streaming/buffering/SourceBufferController.d.ts +1 -1
  340. package/dist/types/ts4.7/streaming/createDefaultMediaTimelineTransformer.d.ts +1 -1
  341. package/dist/types/ts4.7/streaming/mediaTimelineFilter.d.ts +3 -3
  342. package/dist/types/ts4.7/streaming/mediaTimelineLanguageFilter.d.ts +1 -1
  343. package/dist/types/ts4.7/streaming/util/segment.d.ts +1 -1
  344. package/dist/types/ts4.7/track/AutoResetController.d.ts +37 -12
  345. package/dist/types/ts4.7/track/TrackController.d.ts +2 -2
  346. package/dist/types/ts4.7/track/TrackFactory.d.ts +1 -1
  347. package/dist/types/ts4.7/track/createVinylTrackFactories.d.ts +5 -5
  348. package/dist/types/ts4.7/track/dash/DashManifestController.d.ts +1 -1
  349. package/dist/types/ts4.7/track/dash/DashTrack.d.ts +4 -4
  350. package/dist/types/ts4.7/track/dash/buildDashMediaTimeline.d.ts +2 -2
  351. package/dist/types/ts4.7/track/dash/createDashContentTypesValue.d.ts +2 -2
  352. package/dist/types/ts4.7/track/dash/createDashFactories.d.ts +12 -12
  353. package/dist/types/ts4.7/track/dash/createDashManifestProvider.d.ts +1 -1
  354. package/dist/types/ts4.7/track/dash/createDefaultDashManifestTransformer.d.ts +1 -1
  355. package/dist/types/ts4.7/track/dash/manifestTransformUtils.d.ts +1 -1
  356. package/dist/types/ts4.7/track/dash/timeline/DashRepresentationSegmentProvider.d.ts +3 -3
  357. package/dist/types/ts4.7/track/dash/urlDashManifestProvider.d.ts +1 -1
  358. package/dist/types/ts4.7/track/dash/util/mpd.d.ts +3 -2
  359. package/dist/types/ts4.7/track/hls/buildHlsMediaTimeline.d.ts +3 -3
  360. package/dist/types/ts4.7/track/hls/createDefaultHlsManifestTransformer.d.ts +1 -1
  361. package/dist/types/ts4.7/track/hls/util/hlsSegmentTime.d.ts +1 -1
  362. package/dist/types/ts4.7/track/mse/MseTrack.d.ts +2 -2
  363. package/dist/types/ts4.7/track/source/FixedPlaybackQuality.d.ts +1 -1
  364. package/dist/types/ts4.7/track/source/SourceObjectTrack.d.ts +4 -4
  365. package/dist/types/ts4.7/track/source/SourceTrack.d.ts +4 -4
  366. package/dist/types/ts4.7/track/source/SourceTrackBase.d.ts +2 -2
  367. package/dist/types/ts4.7/vinyl/VinylDeps.d.ts +1 -1
  368. package/dist/types/ts4.7/vinyl/VinylPlayer.d.ts +26 -2
  369. package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +9 -11
  370. package/dist/unit/types/current/streaming/MediaTimeline.test.js +6 -1
  371. package/dist/unit/types/current/streaming/MseTrack.test.js +4 -0
  372. package/dist/unit/types/current/streaming/SegmentControllerImpl.test.js +3 -33
  373. package/dist/unit/types/current/streaming/abr/QualitySelectorImpl.test.js +73 -0
  374. package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +1 -41
  375. package/dist/unit/types/current/streaming/buffering/MediaSourceController.test.js +97 -17
  376. package/dist/unit/types/current/streaming/createDefaultMediaTimelineTransformer.test.js +6 -0
  377. package/dist/unit/types/current/streaming/mediaTimelineFilter.test.js +2 -0
  378. package/dist/unit/types/current/streaming/mediaTimelineLanguageFilter.test.js +7 -0
  379. package/dist/unit/types/current/track/AutoResetController.test.js +134 -22
  380. package/dist/unit/types/current/track/dash/createDashContentStreamFactories.test.js +5 -1
  381. package/dist/unit/types/current/track/dash/createSegmentControllerFactory.test.js +5 -1
  382. package/dist/unit/types/current/track/dash/util/mpd.test.js +29 -0
  383. package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +16 -8
  384. package/dist/unit/types/current/track/hls/createHlsContentStreamFactories.test.js +5 -1
  385. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  386. package/dist/unit/types/current/vinyl/VinylPlayer.test.js +35 -0
  387. package/dist/vinylTestUtil/index.js +20 -14
  388. package/dist/vinylTestUtil/index.js.map +2 -2
  389. package/dist/vinylTestUtil/types/current/media/FrequencyAnalyzer.js +1 -1
  390. package/dist/vinylTestUtil/types/current/mediaSource/ControlledMediaSource.d.ts.map +1 -1
  391. package/dist/vinylTestUtil/types/current/mock/dash/mockDashManifest.d.ts +12 -12
  392. package/dist/vinylTestUtil/types/current/mock/dom/ms/MockMSMediaKeySession.d.ts +2 -2
  393. package/dist/vinylTestUtil/types/current/mock/dom/webkit/MockWebKitMediaKeySession.d.ts +2 -2
  394. package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.d.ts +6 -6
  395. package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.d.ts.map +1 -1
  396. package/dist/vinylTestUtil/types/current/mock/player/MockVinylPlayerDependencies.js +7 -7
  397. package/dist/vinylTestUtil/types/current/mock/streaming/MockSegmentController.d.ts +0 -1
  398. package/dist/vinylTestUtil/types/current/mock/streaming/MockSegmentController.d.ts.map +1 -1
  399. package/dist/vinylTestUtil/types/current/mock/streaming/MockSegmentController.js +0 -1
  400. package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockMediaSourceController.d.ts +0 -1
  401. package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockMediaSourceController.d.ts.map +1 -1
  402. package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockMediaSourceController.js +0 -1
  403. package/dist/vinylTestUtil/types/current/mock/track/MockAutoResetController.d.ts +1 -0
  404. package/dist/vinylTestUtil/types/current/mock/track/MockAutoResetController.d.ts.map +1 -1
  405. package/dist/vinylTestUtil/types/current/mock/track/MockAutoResetController.js +1 -0
  406. package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.d.ts +5 -5
  407. package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.d.ts.map +1 -1
  408. package/dist/vinylTestUtil/types/current/mock/track/dash/createMockDashDependencies.js +11 -7
  409. package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.d.ts +5 -5
  410. package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.d.ts.map +1 -1
  411. package/dist/vinylTestUtil/types/current/mock/track/hls/createMockHlsDependencies.js +11 -7
  412. package/dist/vinylTestUtil/types/current/player/createVinylSuite.js +1 -1
  413. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  414. package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.js +1 -1
  415. package/dist/vinylTestUtil/types/current/util/playback/expectTrackPlays.js +2 -2
  416. package/dist/vinylTestUtil/types/current/util/playback/expectTrackPlaysUntil.d.ts.map +1 -1
  417. package/dist/vinylTestUtil/types/current/util/playback/expectTrackPlaysUntil.js +1 -2
  418. package/dist/vinylTestUtil/types/ts3.7/mock/dash/mockDashManifest.d.ts +12 -12
  419. package/dist/vinylTestUtil/types/ts3.7/mock/dom/ms/MockMSMediaKeySession.d.ts +2 -2
  420. package/dist/vinylTestUtil/types/ts3.7/mock/dom/webkit/MockWebKitMediaKeySession.d.ts +2 -2
  421. package/dist/vinylTestUtil/types/ts3.7/mock/player/MockVinylPlayerDependencies.d.ts +6 -6
  422. package/dist/vinylTestUtil/types/ts3.7/mock/streaming/MockSegmentController.d.ts +0 -1
  423. package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockMediaSourceController.d.ts +0 -1
  424. package/dist/vinylTestUtil/types/ts3.7/mock/track/MockAutoResetController.d.ts +1 -0
  425. package/dist/vinylTestUtil/types/ts3.7/mock/track/dash/createMockDashDependencies.d.ts +5 -5
  426. package/dist/vinylTestUtil/types/ts3.7/mock/track/hls/createMockHlsDependencies.d.ts +5 -5
  427. package/dist/vinylTestUtil/types/ts4.1/mock/dash/mockDashManifest.d.ts +12 -12
  428. package/dist/vinylTestUtil/types/ts4.1/mock/dom/ms/MockMSMediaKeySession.d.ts +2 -2
  429. package/dist/vinylTestUtil/types/ts4.1/mock/dom/webkit/MockWebKitMediaKeySession.d.ts +2 -2
  430. package/dist/vinylTestUtil/types/ts4.1/mock/player/MockVinylPlayerDependencies.d.ts +6 -6
  431. package/dist/vinylTestUtil/types/ts4.1/mock/streaming/MockSegmentController.d.ts +0 -1
  432. package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockMediaSourceController.d.ts +0 -1
  433. package/dist/vinylTestUtil/types/ts4.1/mock/track/MockAutoResetController.d.ts +1 -0
  434. package/dist/vinylTestUtil/types/ts4.1/mock/track/dash/createMockDashDependencies.d.ts +5 -5
  435. package/dist/vinylTestUtil/types/ts4.1/mock/track/hls/createMockHlsDependencies.d.ts +5 -5
  436. package/dist/vinylTestUtil/types/ts4.7/mock/dash/mockDashManifest.d.ts +12 -12
  437. package/dist/vinylTestUtil/types/ts4.7/mock/dom/ms/MockMSMediaKeySession.d.ts +2 -2
  438. package/dist/vinylTestUtil/types/ts4.7/mock/dom/webkit/MockWebKitMediaKeySession.d.ts +2 -2
  439. package/dist/vinylTestUtil/types/ts4.7/mock/player/MockVinylPlayerDependencies.d.ts +6 -6
  440. package/dist/vinylTestUtil/types/ts4.7/mock/streaming/MockSegmentController.d.ts +0 -1
  441. package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockMediaSourceController.d.ts +0 -1
  442. package/dist/vinylTestUtil/types/ts4.7/mock/track/MockAutoResetController.d.ts +1 -0
  443. package/dist/vinylTestUtil/types/ts4.7/mock/track/dash/createMockDashDependencies.d.ts +5 -5
  444. package/dist/vinylTestUtil/types/ts4.7/mock/track/hls/createMockHlsDependencies.d.ts +5 -5
  445. package/docs/USAGE.md +33 -0
  446. package/package.json +13 -15
@@ -2,28 +2,49 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import { MediaSourceControllerImpl, MediaSourceError, } from '@amazon/vinyl';
6
- import { Deferred } from '@amazon/vinyl-util';
7
- import { flushPromises, MockMediaSource, MockSourceBuffer, } from '@amazon/vinyl-util/browserTestUtil';
5
+ import { DURATION_PADDING, LIVE_DURATION, MediaSourceControllerImpl, MediaSourceError, } from '@amazon/vinyl';
6
+ import { AbortError, Deferred } from '@amazon/vinyl-util';
7
+ import { flushPromises, implementEventFakes, mockEvent, MockMediaSource, MockSourceBuffer, } from '@amazon/vinyl-util/browserTestUtil';
8
8
  import { data } from '@amazon/vinyl-observable';
9
9
  var createSpy = jasmine.createSpy;
10
10
  var objectContaining = jasmine.objectContaining;
11
11
  import { createEventSpy } from '@amazon/vinyl-util/testUtil';
12
+ const VOD_DURATION = 60;
13
+ function createVodTimeline(duration = VOD_DURATION) {
14
+ return {
15
+ periods: [],
16
+ minBufferTime: 0,
17
+ getDuration: () => Promise.resolve(duration),
18
+ };
19
+ }
20
+ const liveTimeline = {
21
+ periods: [],
22
+ minBufferTime: 0,
23
+ getDuration: () => Promise.resolve(Infinity),
24
+ };
12
25
  describe('MediaSourceControllerImpl', () => {
13
26
  let mediaSourceFactory;
14
27
  let contentTypesValue;
28
+ let mediaTimelineTransformed;
15
29
  let mockMediaSource;
16
30
  let deps;
17
31
  let controller;
32
+ function open() {
33
+ mockMediaSource.readyState = 'open';
34
+ mockMediaSource.dispatchEvent(mockEvent('sourceopen'));
35
+ }
18
36
  beforeEach(() => {
19
37
  mockMediaSource = new MockMediaSource();
38
+ implementEventFakes(mockMediaSource);
20
39
  mockMediaSource.addSourceBuffer.and.callFake(() => new MockSourceBuffer());
21
40
  mediaSourceFactory =
22
41
  createSpy('mediaSourceFactory').and.returnValue(mockMediaSource);
23
42
  contentTypesValue = data(Promise.resolve(new Set(['audio'])));
43
+ mediaTimelineTransformed = data(Promise.resolve(createVodTimeline()));
24
44
  deps = {
25
45
  mediaSourceFactory,
26
46
  contentTypesValue,
47
+ mediaTimelineTransformed,
27
48
  };
28
49
  controller = new MediaSourceControllerImpl(deps);
29
50
  });
@@ -42,13 +63,71 @@ describe('MediaSourceControllerImpl', () => {
42
63
  });
43
64
  });
44
65
  describe('duration', () => {
45
- it('gets duration from media source', () => {
46
- mockMediaSource.duration = 123.45;
47
- expect(controller.duration).toBe(123.45);
66
+ it('sets media source duration after sourceopen', async () => {
67
+ open();
68
+ await flushPromises();
69
+ expect(mockMediaSource.duration).toBe(VOD_DURATION + DURATION_PADDING);
70
+ });
71
+ it('uses LIVE_DURATION for live timelines', async () => {
72
+ mediaTimelineTransformed.value = Promise.resolve(liveTimeline);
73
+ open();
74
+ await flushPromises();
75
+ expect(mockMediaSource.duration).toBe(LIVE_DURATION);
76
+ });
77
+ it('does not set duration when media source is not open', async () => {
78
+ await flushPromises();
79
+ expect(mockMediaSource.duration).toBe(0);
80
+ });
81
+ it('refreshes duration when timeline changes', async () => {
82
+ open();
83
+ await flushPromises();
84
+ expect(mockMediaSource.duration).toBe(VOD_DURATION + DURATION_PADDING);
85
+ mediaTimelineTransformed.value = Promise.resolve(createVodTimeline(120));
86
+ await flushPromises();
87
+ expect(mockMediaSource.duration).toBe(120 + DURATION_PADDING);
88
+ });
89
+ it('emits an error if getDuration rejects', async () => {
90
+ const errorSpy = createEventSpy(controller, 'error');
91
+ const error = new Error('expected');
92
+ mediaTimelineTransformed.value = Promise.resolve({
93
+ periods: [],
94
+ minBufferTime: 0,
95
+ getDuration: () => Promise.reject(error),
96
+ });
97
+ open();
98
+ await flushPromises();
99
+ expect(errorSpy).toHaveBeenCalledWith({
100
+ target: controller,
101
+ error,
102
+ });
48
103
  });
49
- it('sets duration on media source', () => {
50
- controller.duration = 67.89;
51
- expect(mockMediaSource.duration).toBe(67.89);
104
+ it('does not emit silent (abort) errors', async () => {
105
+ const errorSpy = createEventSpy(controller, 'error');
106
+ mediaTimelineTransformed.value = Promise.resolve({
107
+ periods: [],
108
+ minBufferTime: 0,
109
+ getDuration: () => Promise.reject(new AbortError()),
110
+ });
111
+ open();
112
+ await flushPromises();
113
+ expect(errorSpy).not.toHaveBeenCalled();
114
+ });
115
+ it('discards a duration result if the source closed before it resolved', async () => {
116
+ const deferred = new Deferred();
117
+ mediaTimelineTransformed.value = Promise.resolve({
118
+ periods: [],
119
+ minBufferTime: 0,
120
+ getDuration: () => deferred,
121
+ });
122
+ open();
123
+ await flushPromises();
124
+ // Close before the duration resolves; the late result should be ignored.
125
+ mockMediaSource.readyState = 'closed';
126
+ mockMediaSource.dispatchEvent(mockEvent('sourceclose'));
127
+ deferred.resolve(123);
128
+ await flushPromises();
129
+ expect(mockMediaSource.duration).toBe(0);
130
+ expect(controller.readyToAppend).toBeFalse();
52
131
  });
53
132
  });
54
133
  describe('createSourceBuffer', () => {
@@ -58,18 +137,15 @@ describe('MediaSourceControllerImpl', () => {
58
137
  mockMediaSource.addSourceBuffer.and.returnValue(mockSourceBuffer);
59
138
  });
60
139
  it('creates source buffer with correct mime type', () => {
61
- const controller = new MediaSourceControllerImpl(deps);
62
140
  const ref = controller.createSourceBuffer('audio', 'audio/mp4');
63
141
  expect(mockMediaSource.addSourceBuffer).toHaveBeenCalledWith('audio/mp4');
64
142
  expect(ref.value).toBe(mockSourceBuffer);
65
143
  });
66
144
  it('sets source buffer mode to sequence', () => {
67
- const controller = new MediaSourceControllerImpl(deps);
68
145
  controller.createSourceBuffer('audio', 'audio/mp4');
69
146
  expect(mockSourceBuffer.mode).toBe('sequence');
70
147
  });
71
148
  it('emits error events when contentTypesValue rejects', async () => {
72
- const controller = new MediaSourceControllerImpl(deps);
73
149
  const errorSpy = createEventSpy(controller, 'error');
74
150
  const error = new Error('expected error');
75
151
  contentTypesValue.value = Promise.reject(error);
@@ -80,13 +156,20 @@ describe('MediaSourceControllerImpl', () => {
80
156
  });
81
157
  });
82
158
  describe('readyToAppend', () => {
83
- it('is true when all streams have been created', async () => {
84
- const controller = new MediaSourceControllerImpl(deps);
159
+ it('is true only after duration is set and all source buffers are created', async () => {
160
+ // Each createSourceBuffer must return a distinct SourceBuffer because
161
+ // the controller dedupes buffers by identity.
162
+ mockMediaSource.addSourceBuffer.and.callFake(() => new MockSourceBuffer());
85
163
  const readyToAppendSpy = createEventSpy(controller, 'readyToAppend');
86
164
  expect(controller.readyToAppend).toBeFalse();
87
165
  await flushPromises();
88
166
  expect(readyToAppendSpy).not.toHaveBeenCalled();
167
+ // Source buffer alone is not enough — duration must be set.
89
168
  controller.createSourceBuffer('audio', 'audio/mp4');
169
+ expect(controller.readyToAppend).toBeFalse();
170
+ expect(readyToAppendSpy).not.toHaveBeenCalled();
171
+ open();
172
+ await flushPromises();
90
173
  expect(controller.readyToAppend).toBeTrue();
91
174
  expect(readyToAppendSpy).toHaveBeenCalledTimes(1);
92
175
  readyToAppendSpy.calls.reset();
@@ -104,21 +187,18 @@ describe('MediaSourceControllerImpl', () => {
104
187
  });
105
188
  });
106
189
  it('throws MediaSourceError when addSourceBuffer fails', () => {
107
- const controller = new MediaSourceControllerImpl(deps);
108
190
  const error = new Error('test error');
109
191
  mockMediaSource.addSourceBuffer.and.throwError(error);
110
192
  expect(() => controller.createSourceBuffer('audio', 'invalid/type')).toThrowError(MediaSourceError, 'error creating source buffer');
111
193
  });
112
194
  describe('SourceBufferRef disposal', () => {
113
195
  it('removes source buffer from media source', () => {
114
- const controller = new MediaSourceControllerImpl(deps);
115
196
  mockMediaSource.readyState = 'open';
116
197
  const ref = controller.createSourceBuffer('audio', 'audio/mp4');
117
198
  ref.dispose();
118
199
  expect(mockMediaSource.removeSourceBuffer).toHaveBeenCalledWith(mockSourceBuffer);
119
200
  });
120
201
  it('does not remove source buffer when media source is closed', () => {
121
- const controller = new MediaSourceControllerImpl(deps);
122
202
  mockMediaSource.readyState = 'open';
123
203
  const ref = controller.createSourceBuffer('audio', 'audio/mp4');
124
204
  mockMediaSource.readyState = 'closed';
@@ -48,6 +48,7 @@ describe('createDefaultMediaTimelineTransformer', () => {
48
48
  },
49
49
  ],
50
50
  minBufferTime: 2,
51
+ getDuration: () => Promise.resolve(Infinity),
51
52
  };
52
53
  const result = await createDefaultMediaTimelineTransformer(createDeps(timeline)).value;
53
54
  expect(result.periods[0].qualities.length).toBe(1);
@@ -75,6 +76,7 @@ describe('createDefaultMediaTimelineTransformer', () => {
75
76
  },
76
77
  ],
77
78
  minBufferTime: 2,
79
+ getDuration: () => Promise.resolve(Infinity),
78
80
  };
79
81
  const result = await createDefaultMediaTimelineTransformer(createDeps(timeline)).value;
80
82
  expect(result.periods[0].qualities.length).toBe(1);
@@ -107,6 +109,7 @@ describe('createDefaultMediaTimelineTransformer', () => {
107
109
  },
108
110
  ],
109
111
  minBufferTime: 2,
112
+ getDuration: () => Promise.resolve(Infinity),
110
113
  };
111
114
  const result = await createDefaultMediaTimelineTransformer(createDeps(timeline)).value;
112
115
  expect(result.periods[0].qualities.length).toBe(1);
@@ -135,6 +138,7 @@ describe('createDefaultMediaTimelineTransformer', () => {
135
138
  },
136
139
  ],
137
140
  minBufferTime: 2,
141
+ getDuration: () => Promise.resolve(Infinity),
138
142
  };
139
143
  const result = await createDefaultMediaTimelineTransformer(createDeps(timeline, 'en')).value;
140
144
  expect(result.periods[0].qualities.length).toBe(1);
@@ -163,6 +167,7 @@ describe('createDefaultMediaTimelineTransformer', () => {
163
167
  },
164
168
  ],
165
169
  minBufferTime: 2,
170
+ getDuration: () => Promise.resolve(Infinity),
166
171
  };
167
172
  const options = data({
168
173
  preferredAudioLanguage: 'en',
@@ -197,6 +202,7 @@ describe('createDefaultMediaTimelineTransformer', () => {
197
202
  },
198
203
  ],
199
204
  minBufferTime: 5,
205
+ getDuration: () => Promise.resolve(Infinity),
200
206
  };
201
207
  const result = await createDefaultMediaTimelineTransformer(createDeps(timeline)).value;
202
208
  expect(result.minBufferTime).toBe(5);
@@ -27,6 +27,7 @@ describe('filterTimelineQualities', () => {
27
27
  },
28
28
  ],
29
29
  minBufferTime: 2,
30
+ getDuration: () => Promise.resolve(Infinity),
30
31
  };
31
32
  it('filters qualities by predicate', () => {
32
33
  const result = filterTimelineQualities((q) => q.contentType === 'audio', () => {
@@ -60,6 +61,7 @@ describe('filterTimelineQualitiesAsync', () => {
60
61
  },
61
62
  ],
62
63
  minBufferTime: 2,
64
+ getDuration: () => Promise.resolve(Infinity),
63
65
  };
64
66
  it('filters qualities by async predicate', async () => {
65
67
  const result = await filterTimelineQualitiesAsync((q) => Promise.resolve(q.contentType === 'audio'), () => {
@@ -41,6 +41,7 @@ describe('createLanguageFilter', () => {
41
41
  },
42
42
  ],
43
43
  minBufferTime: 2,
44
+ getDuration: () => Promise.resolve(Infinity),
44
45
  };
45
46
  const result = applyLanguageFilter(timeline, 'en', 'audio');
46
47
  expect(result.periods[0].qualities.length).toBe(2); // en audio + video
@@ -59,6 +60,7 @@ describe('createLanguageFilter', () => {
59
60
  },
60
61
  ],
61
62
  minBufferTime: 2,
63
+ getDuration: () => Promise.resolve(Infinity),
62
64
  };
63
65
  const result = applyLanguageFilter(timeline, 'en', 'audio');
64
66
  expect(result.periods[0].qualities.length).toBe(2); // en + null
@@ -73,6 +75,7 @@ describe('createLanguageFilter', () => {
73
75
  },
74
76
  ],
75
77
  minBufferTime: 5,
78
+ getDuration: () => Promise.resolve(Infinity),
76
79
  };
77
80
  const result = applyLanguageFilter(timeline, 'en', 'audio');
78
81
  expect(result.minBufferTime).toBe(5);
@@ -91,6 +94,7 @@ describe('createLanguageFilter', () => {
91
94
  },
92
95
  ],
93
96
  minBufferTime: 2,
97
+ getDuration: () => Promise.resolve(Infinity),
94
98
  };
95
99
  const result = applyLanguageFilter(timeline, 'en', 'audio');
96
100
  expect(result.periods[0].qualities.some((q) => q.metadata.contentType === 'video')).toBeTrue();
@@ -105,6 +109,7 @@ describe('createLanguageFilter', () => {
105
109
  },
106
110
  ],
107
111
  minBufferTime: 2,
112
+ getDuration: () => Promise.resolve(Infinity),
108
113
  };
109
114
  // 'xx' doesn't match 'ja', so all kept
110
115
  const result = applyLanguageFilter(timeline, 'xx', 'audio');
@@ -131,6 +136,7 @@ describe('createLanguageFilter', () => {
131
136
  },
132
137
  ],
133
138
  minBufferTime: 2,
139
+ getDuration: () => Promise.resolve(Infinity),
134
140
  };
135
141
  // 'en' matches period 1 but not period 2
136
142
  // Period 1: filtered to 'en' only
@@ -161,6 +167,7 @@ describe('createLanguageFilter', () => {
161
167
  },
162
168
  ],
163
169
  minBufferTime: 2,
170
+ getDuration: () => Promise.resolve(Infinity),
164
171
  };
165
172
  const result = applyLanguageFilter(timeline, 'en', 'audio');
166
173
  // Period 1: filtered to 'en'
@@ -3,10 +3,25 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import { AutoResetControllerImpl, } from '@amazon/vinyl';
6
- import { ErrorOrigin, ReportableError, networkState, DisposedError, } from '@amazon/vinyl-util';
6
+ import { networkState, DisposedError, RequestError } from '@amazon/vinyl-util';
7
7
  import { MockPlaybackController } from '@amazon/vinyl/vinylTestUtil';
8
- import { createEventSpy, MockNetworkState, overrideGlobalInit, } from '@amazon/vinyl-util/testUtil';
8
+ import { createEventSpy, emptyInternalError, emptyResponseError, MockNetworkState, overrideGlobalInit, } from '@amazon/vinyl-util/testUtil';
9
9
  import { mockEvent, useMockTime } from '@amazon/vinyl-util/browserTestUtil';
10
+ /**
11
+ * Creates a RequestError representing a transient network failure (no response received).
12
+ * These are the only errors that AutoResetController watches for retry opportunities.
13
+ */
14
+ function createNetworkRequestError() {
15
+ return new RequestError(null, emptyInternalError);
16
+ }
17
+ /**
18
+ * Creates a RequestError that received an HTTP response. These should be ignored by
19
+ * the AutoResetController, since a service that responded is unlikely to recover
20
+ * on its own.
21
+ */
22
+ function createResponseRequestError() {
23
+ return new RequestError(new Response(null, { status: 500 }), emptyResponseError);
24
+ }
10
25
  describe('AutoResetControllerImpl', () => {
11
26
  let deps;
12
27
  let controller;
@@ -47,32 +62,35 @@ describe('AutoResetControllerImpl', () => {
47
62
  expect(playbackController.on).toHaveBeenCalledWith('seeking', jasmine.any(Function));
48
63
  expect(playbackController.on).toHaveBeenCalledWith('playing', jasmine.any(Function));
49
64
  });
65
+ it('starts with resetPending false', () => {
66
+ controller = new AutoResetControllerImpl(deps);
67
+ expect(controller.resetPending).toBeFalse();
68
+ });
50
69
  });
51
70
  describe('setError', () => {
52
71
  beforeEach(() => {
53
72
  controller = new AutoResetControllerImpl(deps);
54
73
  });
55
- it('ignores non-ReportableError', () => {
74
+ it('ignores non-RequestError', () => {
56
75
  const error = new Error('test error');
57
76
  controller.setError(error);
58
77
  expect(mockNetworkState.on).not.toHaveBeenCalled();
78
+ expect(controller.resetPending).toBeFalse();
59
79
  });
60
- it('ignores ReportableError with non-SERVICE_INTERNAL origin', () => {
61
- const error = new ReportableError('test', ErrorOrigin.SERVICE_EXTERNAL);
62
- controller.setError(error);
80
+ it('ignores RequestError with a response (HTTP failure)', () => {
81
+ controller.setError(createResponseRequestError());
63
82
  expect(mockNetworkState.on).not.toHaveBeenCalled();
83
+ expect(controller.resetPending).toBeFalse();
64
84
  });
65
- it('sets error and starts watching for SERVICE_INTERNAL ReportableError', () => {
66
- const error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
67
- controller.setError(error);
85
+ it('sets error and starts watching for transient network RequestError', () => {
86
+ controller.setError(createNetworkRequestError());
68
87
  expect(mockNetworkState.on).toHaveBeenCalledWith('online', jasmine.any(Function));
88
+ expect(controller.resetPending).toBeTrue();
69
89
  });
70
90
  it('ignores subsequent errors when already in error state', () => {
71
- const error1 = new ReportableError('test1', ErrorOrigin.SERVICE_INTERNAL);
72
- const error2 = new ReportableError('test2', ErrorOrigin.SERVICE_INTERNAL);
73
- controller.setError(error1);
91
+ controller.setError(createNetworkRequestError());
74
92
  mockNetworkState.on.calls.reset();
75
- controller.setError(error2);
93
+ controller.setError(createNetworkRequestError());
76
94
  expect(mockNetworkState.on).not.toHaveBeenCalled();
77
95
  });
78
96
  });
@@ -82,7 +100,7 @@ describe('AutoResetControllerImpl', () => {
82
100
  beforeEach(() => {
83
101
  controller = new AutoResetControllerImpl(deps);
84
102
  resetSpy = createEventSpy(controller, 'reset');
85
- error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
103
+ error = createNetworkRequestError();
86
104
  });
87
105
  it('emits reset event when network comes online', () => {
88
106
  controller.setError(error);
@@ -160,7 +178,7 @@ describe('AutoResetControllerImpl', () => {
160
178
  let resetSpy;
161
179
  let error;
162
180
  beforeEach(() => {
163
- error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
181
+ error = createNetworkRequestError();
164
182
  });
165
183
  it('retries at specified interval when online', async () => {
166
184
  controller = new AutoResetControllerImpl(deps, { retryInterval: 5 });
@@ -197,12 +215,109 @@ describe('AutoResetControllerImpl', () => {
197
215
  expect(resetSpy).toHaveBeenCalledTimes(3);
198
216
  }
199
217
  });
218
+ it('clears resetPending when max retries are exhausted', async () => {
219
+ controller = new AutoResetControllerImpl(deps, {
220
+ retryInterval: 1,
221
+ maxRetries: 1,
222
+ });
223
+ controller.setError(error);
224
+ expect(controller.resetPending).toBeTrue();
225
+ // First retry succeeds (resets) and re-arms on next setError
226
+ await clock.tick(1);
227
+ controller.setError(error);
228
+ expect(controller.resetPending).toBeTrue();
229
+ // Second retry exhausts the budget — interval fires but no reset emitted,
230
+ // and resetPending should transition to false.
231
+ await clock.tick(1);
232
+ expect(controller.resetPending).toBeFalse();
233
+ });
234
+ });
235
+ describe('resetPending', () => {
236
+ let error;
237
+ beforeEach(() => {
238
+ controller = new AutoResetControllerImpl(deps);
239
+ error = createNetworkRequestError();
240
+ });
241
+ it('is false initially', () => {
242
+ expect(controller.resetPending).toBeFalse();
243
+ });
244
+ it('becomes true when an eligible error is set', () => {
245
+ controller.setError(error);
246
+ expect(controller.resetPending).toBeTrue();
247
+ });
248
+ it('remains false when a non-eligible error is set', () => {
249
+ controller.setError(new Error('not eligible'));
250
+ expect(controller.resetPending).toBeFalse();
251
+ });
252
+ it('becomes false after a reset is emitted', () => {
253
+ controller.setError(error);
254
+ playbackController.dispatch('play', {});
255
+ expect(controller.resetPending).toBeFalse();
256
+ });
257
+ it('becomes false when cleared', () => {
258
+ controller.setError(error);
259
+ controller.clear();
260
+ expect(controller.resetPending).toBeFalse();
261
+ });
262
+ it('is false when the controller is disabled', () => {
263
+ controller = new AutoResetControllerImpl(deps, { enabled: false });
264
+ controller.setError(error);
265
+ expect(controller.resetPending).toBeFalse();
266
+ });
267
+ });
268
+ describe('resetPendingChange event', () => {
269
+ let resetPendingChangeSpy;
270
+ let error;
271
+ beforeEach(() => {
272
+ controller = new AutoResetControllerImpl(deps);
273
+ resetPendingChangeSpy = createEventSpy(controller, 'resetPendingChange');
274
+ error = createNetworkRequestError();
275
+ });
276
+ it('dispatches when resetPending becomes true', () => {
277
+ controller.setError(error);
278
+ expect(resetPendingChangeSpy).toHaveBeenCalledOnceWith({
279
+ previous: false,
280
+ current: true,
281
+ });
282
+ });
283
+ it('dispatches when resetPending becomes false via reset', () => {
284
+ controller.setError(error);
285
+ resetPendingChangeSpy.calls.reset();
286
+ playbackController.dispatch('play', {});
287
+ expect(resetPendingChangeSpy).toHaveBeenCalledOnceWith({
288
+ previous: true,
289
+ current: false,
290
+ });
291
+ });
292
+ it('dispatches when resetPending becomes false via clear', () => {
293
+ controller.setError(error);
294
+ resetPendingChangeSpy.calls.reset();
295
+ controller.clear();
296
+ expect(resetPendingChangeSpy).toHaveBeenCalledOnceWith({
297
+ previous: true,
298
+ current: false,
299
+ });
300
+ });
301
+ it('does not dispatch when setError is called with an in-progress error', () => {
302
+ controller.setError(error);
303
+ resetPendingChangeSpy.calls.reset();
304
+ controller.setError(error);
305
+ expect(resetPendingChangeSpy).not.toHaveBeenCalled();
306
+ });
307
+ it('does not dispatch when clear is called with no error', () => {
308
+ controller.clear();
309
+ expect(resetPendingChangeSpy).not.toHaveBeenCalled();
310
+ });
311
+ it('does not dispatch when an ineligible error is set', () => {
312
+ controller.setError(new Error('not eligible'));
313
+ expect(resetPendingChangeSpy).not.toHaveBeenCalled();
314
+ });
200
315
  });
201
316
  describe('clear', () => {
202
317
  let error;
203
318
  beforeEach(() => {
204
319
  controller = new AutoResetControllerImpl(deps);
205
- error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
320
+ error = createNetworkRequestError();
206
321
  });
207
322
  it('clears error state and stops watching', () => {
208
323
  controller.setError(error);
@@ -229,8 +344,7 @@ describe('AutoResetControllerImpl', () => {
229
344
  describe('dispose', () => {
230
345
  it('clears error state and disposes resources', () => {
231
346
  controller = new AutoResetControllerImpl(deps);
232
- const error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
233
- controller.setError(error);
347
+ controller.setError(createNetworkRequestError());
234
348
  controller.dispose();
235
349
  // Should not emit reset after disposing
236
350
  const resetSpy = createEventSpy(controller, 'reset');
@@ -250,15 +364,13 @@ describe('AutoResetControllerImpl', () => {
250
364
  describe('disabled behavior', () => {
251
365
  it('does not watch for errors when disabled', () => {
252
366
  controller = new AutoResetControllerImpl(deps, { enabled: false });
253
- const error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
254
- controller.setError(error);
367
+ controller.setError(createNetworkRequestError());
255
368
  expect(mockNetworkState.on).not.toHaveBeenCalled();
256
369
  });
257
370
  it('does not emit reset events when disabled', () => {
258
371
  controller = new AutoResetControllerImpl(deps, { enabled: false });
259
372
  const resetSpy = createEventSpy(controller, 'reset');
260
- const error = new ReportableError('test', ErrorOrigin.SERVICE_INTERNAL);
261
- controller.setError(error);
373
+ controller.setError(createNetworkRequestError());
262
374
  playbackController.dispatch('play', {});
263
375
  expect(resetSpy).not.toHaveBeenCalled();
264
376
  });
@@ -12,7 +12,11 @@ describe('createDashContentStreamFactories', () => {
12
12
  let mediaSourceController;
13
13
  let playbackController;
14
14
  let qualitySelector;
15
- const emptyTimeline = { periods: [], minBufferTime: 0 };
15
+ const emptyTimeline = {
16
+ periods: [],
17
+ minBufferTime: 0,
18
+ getDuration: () => Promise.resolve(Infinity),
19
+ };
16
20
  beforeEach(() => {
17
21
  mediaSourceController = new MockMediaSourceController();
18
22
  playbackController = new MockPlaybackController();
@@ -9,7 +9,11 @@ var objectContaining = jasmine.objectContaining;
9
9
  describe('createSegmentControllerFactory', () => {
10
10
  it('creates SegmentControllerImpl with merged dependencies', () => {
11
11
  const playbackController = new MockPlaybackController();
12
- const emptyTimeline = { periods: [], minBufferTime: 0 };
12
+ const emptyTimeline = {
13
+ periods: [],
14
+ minBufferTime: 0,
15
+ getDuration: () => Promise.resolve(Infinity),
16
+ };
13
17
  const factory = createSegmentControllerFactory({ playbackController }, 'audio', { prefetchActive: 100 });
14
18
  const controller = factory({
15
19
  mediaTimelineTransformed: data(Promise.resolve(emptyTimeline)),
@@ -308,5 +308,34 @@ describe('mpd utils', () => {
308
308
  expect(calculateDuration(manifest)).toBe(50);
309
309
  });
310
310
  });
311
+ describe('when MPD type is dynamic', () => {
312
+ it('returns Infinity for live presentations', () => {
313
+ // language=XML
314
+ const manifest = parseDashManifest(`<?xml version="1.0" ?>
315
+ <MPD type="dynamic" minBufferTime="PT0.0S" profiles="urn:mpeg:dash:profile:isoff-live:2011" xmlns="urn:mpeg:dash:schema:mpd:2011">
316
+ <Period/>
317
+ </MPD>`);
318
+ expect(calculateDuration(manifest)).toBe(Infinity);
319
+ });
320
+ });
321
+ describe('when there are no periods', () => {
322
+ it('throws', () => {
323
+ const manifest = clone(mockDashManifest);
324
+ delete manifest.MPD
325
+ .mediaPresentationDuration;
326
+ manifest.MPD.Period = [];
327
+ expect(() => calculateDuration(manifest)).toThrowError(/no periods/i);
328
+ });
329
+ });
330
+ describe('when the last period has no determinable end', () => {
331
+ it('throws', () => {
332
+ // language=XML
333
+ const manifest = parseDashManifest(`<?xml version="1.0" ?>
334
+ <MPD minBufferTime="PT0.0S" profiles="urn:mpeg:dash:profile:isoff-live:2011" xmlns="urn:mpeg:dash:schema:mpd:2011">
335
+ <Period/>
336
+ </MPD>`);
337
+ expect(() => calculateDuration(manifest)).toThrowError(/Unable to determine/);
338
+ });
339
+ });
311
340
  });
312
341
  });