@amazon/vinyl 1.2.0 → 1.2.2

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 (330) hide show
  1. package/dist/index.cjs +24 -6
  2. package/dist/index.cjs.map +2 -2
  3. package/dist/index.js +33 -13
  4. package/dist/index.js.map +3 -3
  5. package/dist/test/integ.es5.js +62 -62
  6. package/dist/test/integ.js +119 -6
  7. package/dist/test/integ.js.map +2 -2
  8. package/dist/types/current/ad/AdBreakInfo.d.ts +160 -0
  9. package/dist/types/current/ad/AdBreakInfo.d.ts.map +1 -0
  10. package/dist/types/current/ad/AdBreakInfo.js +5 -0
  11. package/dist/types/current/ad/AdController.d.ts +229 -0
  12. package/dist/types/current/ad/AdController.d.ts.map +1 -0
  13. package/dist/types/current/ad/AdController.js +19 -0
  14. package/dist/types/current/ad/AdControllerImpl.d.ts +162 -0
  15. package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -0
  16. package/dist/types/current/ad/AdControllerImpl.js +741 -0
  17. package/dist/types/current/ad/AdError.d.ts +6 -0
  18. package/dist/types/current/ad/AdError.d.ts.map +1 -0
  19. package/dist/types/current/ad/AdError.js +14 -0
  20. package/dist/types/current/ad/AdsProvider.d.ts +28 -0
  21. package/dist/types/current/ad/AdsProvider.d.ts.map +1 -0
  22. package/dist/types/current/ad/AdsProvider.js +5 -0
  23. package/dist/types/current/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
  24. package/dist/types/current/ad/defaultAdLoadOptionsResolver.d.ts.map +1 -0
  25. package/dist/types/current/ad/defaultAdLoadOptionsResolver.js +26 -0
  26. package/dist/types/current/ad/discoverHlsInterstitials.d.ts +22 -0
  27. package/dist/types/current/ad/discoverHlsInterstitials.d.ts.map +1 -0
  28. package/dist/types/current/ad/discoverHlsInterstitials.js +248 -0
  29. package/dist/types/current/drm/DrmControllerImpl.d.ts +6 -0
  30. package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
  31. package/dist/types/current/drm/DrmControllerImpl.js +23 -1
  32. package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -1
  33. package/dist/types/current/playback/createStallDetector.d.ts +43 -0
  34. package/dist/types/current/playback/createStallDetector.d.ts.map +1 -0
  35. package/dist/types/current/playback/createStallDetector.js +101 -0
  36. package/dist/types/current/playback/createStallMonitor.d.ts +45 -0
  37. package/dist/types/current/playback/createStallMonitor.d.ts.map +1 -0
  38. package/dist/types/current/playback/createStallMonitor.js +99 -0
  39. package/dist/types/current/streaming/AudioOptions.d.ts +66 -0
  40. package/dist/types/current/streaming/AudioOptions.d.ts.map +1 -0
  41. package/dist/types/current/streaming/AudioOptions.js +19 -0
  42. package/dist/types/current/streaming/LoadMetric.d.ts +72 -0
  43. package/dist/types/current/streaming/LoadMetric.d.ts.map +1 -0
  44. package/dist/types/current/streaming/LoadMetric.js +5 -0
  45. package/dist/types/current/streaming/ManifestControllerImpl.d.ts +43 -0
  46. package/dist/types/current/streaming/ManifestControllerImpl.d.ts.map +1 -0
  47. package/dist/types/current/streaming/ManifestControllerImpl.js +104 -0
  48. package/dist/types/current/streaming/buffering/codecDenylist.d.ts +23 -0
  49. package/dist/types/current/streaming/buffering/codecDenylist.d.ts.map +1 -0
  50. package/dist/types/current/streaming/buffering/codecDenylist.js +62 -0
  51. package/dist/types/current/streaming/createAllowedContentTypesValue.d.ts +30 -0
  52. package/dist/types/current/streaming/createAllowedContentTypesValue.d.ts.map +1 -0
  53. package/dist/types/current/streaming/createAllowedContentTypesValue.js +43 -0
  54. package/dist/types/current/streaming/createTimelineContentTypesValue.d.ts +21 -0
  55. package/dist/types/current/streaming/createTimelineContentTypesValue.d.ts.map +1 -0
  56. package/dist/types/current/streaming/createTimelineContentTypesValue.js +25 -0
  57. package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
  58. package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.d.ts.map +1 -0
  59. package/dist/types/current/streaming/mediaTimelineAccessibilityFilter.js +75 -0
  60. package/dist/types/current/text/HtmlTextTrackRenderer.d.ts +60 -0
  61. package/dist/types/current/text/HtmlTextTrackRenderer.d.ts.map +1 -0
  62. package/dist/types/current/text/HtmlTextTrackRenderer.js +231 -0
  63. package/dist/types/current/text/SidecarTextTrackController.d.ts +103 -0
  64. package/dist/types/current/text/SidecarTextTrackController.d.ts.map +1 -0
  65. package/dist/types/current/text/SidecarTextTrackController.js +250 -0
  66. package/dist/types/current/text/SidecarTextTrackLoader.d.ts +65 -0
  67. package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -0
  68. package/dist/types/current/text/SidecarTextTrackLoader.js +150 -0
  69. package/dist/types/current/text/TextTrack.d.ts +179 -0
  70. package/dist/types/current/text/TextTrack.d.ts.map +1 -0
  71. package/dist/types/current/text/TextTrack.js +29 -0
  72. package/dist/types/current/text/TextTrackRenderer.d.ts +24 -0
  73. package/dist/types/current/text/TextTrackRenderer.d.ts.map +1 -0
  74. package/dist/types/current/text/TextTrackRenderer.js +5 -0
  75. package/dist/types/current/text/VttCueStyle.d.ts +41 -0
  76. package/dist/types/current/text/VttCueStyle.d.ts.map +1 -0
  77. package/dist/types/current/text/VttCueStyle.js +45 -0
  78. package/dist/types/current/text/discoverDashTextTracks.d.ts +24 -0
  79. package/dist/types/current/text/discoverDashTextTracks.d.ts.map +1 -0
  80. package/dist/types/current/text/discoverDashTextTracks.js +110 -0
  81. package/dist/types/current/text/discoverHlsTextTracks.d.ts +19 -0
  82. package/dist/types/current/text/discoverHlsTextTracks.d.ts.map +1 -0
  83. package/dist/types/current/text/discoverHlsTextTracks.js +49 -0
  84. package/dist/types/current/text/mediaTextTrackProvider.d.ts +34 -0
  85. package/dist/types/current/text/mediaTextTrackProvider.d.ts.map +1 -0
  86. package/dist/types/current/text/mediaTextTrackProvider.js +42 -0
  87. package/dist/types/current/text/parseWebVtt.d.ts +60 -0
  88. package/dist/types/current/text/parseWebVtt.d.ts.map +1 -0
  89. package/dist/types/current/text/parseWebVtt.js +249 -0
  90. package/dist/types/current/text/pickPreferredTextTrack.d.ts +15 -0
  91. package/dist/types/current/text/pickPreferredTextTrack.d.ts.map +1 -0
  92. package/dist/types/current/text/pickPreferredTextTrack.js +71 -0
  93. package/dist/types/current/track/SeekRange.d.ts +9 -0
  94. package/dist/types/current/track/SeekRange.d.ts.map +1 -0
  95. package/dist/types/current/track/SeekRange.js +5 -0
  96. package/dist/types/current/track/hls/HlsManifestData.d.ts +19 -0
  97. package/dist/types/current/track/hls/HlsManifestData.d.ts.map +1 -0
  98. package/dist/types/current/track/hls/HlsManifestData.js +5 -0
  99. package/dist/types/current/track/hls/createHlsManifestProvider.d.ts +6 -0
  100. package/dist/types/current/track/hls/createHlsManifestProvider.d.ts.map +1 -0
  101. package/dist/types/current/track/hls/createHlsManifestProvider.js +9 -0
  102. package/dist/types/current/track/inferLoadOptionsFromUri.d.ts +15 -0
  103. package/dist/types/current/track/inferLoadOptionsFromUri.d.ts.map +1 -0
  104. package/dist/types/current/track/inferLoadOptionsFromUri.js +55 -0
  105. package/dist/types/current/track/mse/MseTrack.d.ts +0 -1
  106. package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
  107. package/dist/types/current/track/mse/MseTrack.js +4 -5
  108. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  109. package/dist/types/current/util/media/codecOverrides.d.ts +33 -0
  110. package/dist/types/current/util/media/codecOverrides.d.ts.map +1 -0
  111. package/dist/types/current/util/media/codecOverrides.js +37 -0
  112. package/dist/types/current/util/media/codecSupport.d.ts +6 -0
  113. package/dist/types/current/util/media/codecSupport.d.ts.map +1 -0
  114. package/dist/types/current/util/media/codecSupport.js +17 -0
  115. package/dist/types/current/util/media/mimeType.d.ts +8 -0
  116. package/dist/types/current/util/media/mimeType.d.ts.map +1 -0
  117. package/dist/types/current/util/media/mimeType.js +13 -0
  118. package/dist/types/ts3.7/ad/AdBreakInfo.d.ts +160 -0
  119. package/dist/types/ts3.7/ad/AdController.d.ts +243 -0
  120. package/dist/types/ts3.7/ad/AdControllerImpl.d.ts +162 -0
  121. package/dist/types/ts3.7/ad/AdError.d.ts +6 -0
  122. package/dist/types/ts3.7/ad/AdsProvider.d.ts +28 -0
  123. package/dist/types/ts3.7/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
  124. package/dist/types/ts3.7/ad/discoverHlsInterstitials.d.ts +22 -0
  125. package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +6 -0
  126. package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -1
  127. package/dist/types/ts3.7/playback/createStallDetector.d.ts +43 -0
  128. package/dist/types/ts3.7/playback/createStallMonitor.d.ts +45 -0
  129. package/dist/types/ts3.7/streaming/AudioOptions.d.ts +66 -0
  130. package/dist/types/ts3.7/streaming/LoadMetric.d.ts +72 -0
  131. package/dist/types/ts3.7/streaming/ManifestControllerImpl.d.ts +40 -0
  132. package/dist/types/ts3.7/streaming/buffering/codecDenylist.d.ts +23 -0
  133. package/dist/types/ts3.7/streaming/createAllowedContentTypesValue.d.ts +30 -0
  134. package/dist/types/ts3.7/streaming/createTimelineContentTypesValue.d.ts +21 -0
  135. package/dist/types/ts3.7/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
  136. package/dist/types/ts3.7/text/HtmlTextTrackRenderer.d.ts +60 -0
  137. package/dist/types/ts3.7/text/SidecarTextTrackController.d.ts +103 -0
  138. package/dist/types/ts3.7/text/SidecarTextTrackLoader.d.ts +65 -0
  139. package/dist/types/ts3.7/text/TextTrack.d.ts +183 -0
  140. package/dist/types/ts3.7/text/TextTrackRenderer.d.ts +24 -0
  141. package/dist/types/ts3.7/text/VttCueStyle.d.ts +41 -0
  142. package/dist/types/ts3.7/text/discoverDashTextTracks.d.ts +24 -0
  143. package/dist/types/ts3.7/text/discoverHlsTextTracks.d.ts +19 -0
  144. package/dist/types/ts3.7/text/mediaTextTrackProvider.d.ts +34 -0
  145. package/dist/types/ts3.7/text/parseWebVtt.d.ts +60 -0
  146. package/dist/types/ts3.7/text/pickPreferredTextTrack.d.ts +15 -0
  147. package/dist/types/ts3.7/track/SeekRange.d.ts +9 -0
  148. package/dist/types/ts3.7/track/hls/HlsManifestData.d.ts +19 -0
  149. package/dist/types/ts3.7/track/hls/createHlsManifestProvider.d.ts +6 -0
  150. package/dist/types/ts3.7/track/inferLoadOptionsFromUri.d.ts +15 -0
  151. package/dist/types/ts3.7/track/mse/MseTrack.d.ts +0 -1
  152. package/dist/types/ts3.7/util/media/codecOverrides.d.ts +33 -0
  153. package/dist/types/ts3.7/util/media/codecSupport.d.ts +6 -0
  154. package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
  155. package/dist/types/ts4.1/ad/AdBreakInfo.d.ts +160 -0
  156. package/dist/types/ts4.1/ad/AdController.d.ts +243 -0
  157. package/dist/types/ts4.1/ad/AdControllerImpl.d.ts +162 -0
  158. package/dist/types/ts4.1/ad/AdError.d.ts +6 -0
  159. package/dist/types/ts4.1/ad/AdsProvider.d.ts +28 -0
  160. package/dist/types/ts4.1/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
  161. package/dist/types/ts4.1/ad/discoverHlsInterstitials.d.ts +22 -0
  162. package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +6 -0
  163. package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -1
  164. package/dist/types/ts4.1/playback/createStallDetector.d.ts +43 -0
  165. package/dist/types/ts4.1/playback/createStallMonitor.d.ts +45 -0
  166. package/dist/types/ts4.1/streaming/AudioOptions.d.ts +66 -0
  167. package/dist/types/ts4.1/streaming/LoadMetric.d.ts +72 -0
  168. package/dist/types/ts4.1/streaming/ManifestControllerImpl.d.ts +40 -0
  169. package/dist/types/ts4.1/streaming/buffering/codecDenylist.d.ts +23 -0
  170. package/dist/types/ts4.1/streaming/createAllowedContentTypesValue.d.ts +30 -0
  171. package/dist/types/ts4.1/streaming/createTimelineContentTypesValue.d.ts +21 -0
  172. package/dist/types/ts4.1/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
  173. package/dist/types/ts4.1/text/HtmlTextTrackRenderer.d.ts +60 -0
  174. package/dist/types/ts4.1/text/SidecarTextTrackController.d.ts +104 -0
  175. package/dist/types/ts4.1/text/SidecarTextTrackLoader.d.ts +65 -0
  176. package/dist/types/ts4.1/text/TextTrack.d.ts +183 -0
  177. package/dist/types/ts4.1/text/TextTrackRenderer.d.ts +24 -0
  178. package/dist/types/ts4.1/text/VttCueStyle.d.ts +41 -0
  179. package/dist/types/ts4.1/text/discoverDashTextTracks.d.ts +24 -0
  180. package/dist/types/ts4.1/text/discoverHlsTextTracks.d.ts +19 -0
  181. package/dist/types/ts4.1/text/mediaTextTrackProvider.d.ts +34 -0
  182. package/dist/types/ts4.1/text/parseWebVtt.d.ts +60 -0
  183. package/dist/types/ts4.1/text/pickPreferredTextTrack.d.ts +15 -0
  184. package/dist/types/ts4.1/track/SeekRange.d.ts +9 -0
  185. package/dist/types/ts4.1/track/hls/HlsManifestData.d.ts +19 -0
  186. package/dist/types/ts4.1/track/hls/createHlsManifestProvider.d.ts +6 -0
  187. package/dist/types/ts4.1/track/inferLoadOptionsFromUri.d.ts +15 -0
  188. package/dist/types/ts4.1/track/mse/MseTrack.d.ts +0 -1
  189. package/dist/types/ts4.1/util/media/codecOverrides.d.ts +33 -0
  190. package/dist/types/ts4.1/util/media/codecSupport.d.ts +6 -0
  191. package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
  192. package/dist/types/ts4.7/ad/AdBreakInfo.d.ts +160 -0
  193. package/dist/types/ts4.7/ad/AdController.d.ts +243 -0
  194. package/dist/types/ts4.7/ad/AdControllerImpl.d.ts +162 -0
  195. package/dist/types/ts4.7/ad/AdError.d.ts +6 -0
  196. package/dist/types/ts4.7/ad/AdsProvider.d.ts +28 -0
  197. package/dist/types/ts4.7/ad/defaultAdLoadOptionsResolver.d.ts +12 -0
  198. package/dist/types/ts4.7/ad/discoverHlsInterstitials.d.ts +22 -0
  199. package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +6 -0
  200. package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -1
  201. package/dist/types/ts4.7/playback/createStallDetector.d.ts +43 -0
  202. package/dist/types/ts4.7/playback/createStallMonitor.d.ts +45 -0
  203. package/dist/types/ts4.7/streaming/AudioOptions.d.ts +66 -0
  204. package/dist/types/ts4.7/streaming/LoadMetric.d.ts +72 -0
  205. package/dist/types/ts4.7/streaming/ManifestControllerImpl.d.ts +43 -0
  206. package/dist/types/ts4.7/streaming/buffering/codecDenylist.d.ts +23 -0
  207. package/dist/types/ts4.7/streaming/createAllowedContentTypesValue.d.ts +30 -0
  208. package/dist/types/ts4.7/streaming/createTimelineContentTypesValue.d.ts +21 -0
  209. package/dist/types/ts4.7/streaming/mediaTimelineAccessibilityFilter.d.ts +35 -0
  210. package/dist/types/ts4.7/text/HtmlTextTrackRenderer.d.ts +60 -0
  211. package/dist/types/ts4.7/text/SidecarTextTrackController.d.ts +103 -0
  212. package/dist/types/ts4.7/text/SidecarTextTrackLoader.d.ts +65 -0
  213. package/dist/types/ts4.7/text/TextTrack.d.ts +183 -0
  214. package/dist/types/ts4.7/text/TextTrackRenderer.d.ts +24 -0
  215. package/dist/types/ts4.7/text/VttCueStyle.d.ts +41 -0
  216. package/dist/types/ts4.7/text/discoverDashTextTracks.d.ts +24 -0
  217. package/dist/types/ts4.7/text/discoverHlsTextTracks.d.ts +19 -0
  218. package/dist/types/ts4.7/text/mediaTextTrackProvider.d.ts +34 -0
  219. package/dist/types/ts4.7/text/parseWebVtt.d.ts +60 -0
  220. package/dist/types/ts4.7/text/pickPreferredTextTrack.d.ts +15 -0
  221. package/dist/types/ts4.7/track/SeekRange.d.ts +9 -0
  222. package/dist/types/ts4.7/track/hls/HlsManifestData.d.ts +19 -0
  223. package/dist/types/ts4.7/track/hls/createHlsManifestProvider.d.ts +6 -0
  224. package/dist/types/ts4.7/track/inferLoadOptionsFromUri.d.ts +15 -0
  225. package/dist/types/ts4.7/track/mse/MseTrack.d.ts +0 -1
  226. package/dist/types/ts4.7/util/media/codecOverrides.d.ts +33 -0
  227. package/dist/types/ts4.7/util/media/codecSupport.d.ts +6 -0
  228. package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -0
  229. package/dist/unit/types/current/ad/AdController.test.d.ts +2 -0
  230. package/dist/unit/types/current/ad/AdController.test.d.ts.map +1 -0
  231. package/dist/unit/types/current/ad/AdController.test.js +10 -0
  232. package/dist/unit/types/current/ad/AdControllerImpl.test.d.ts +2 -0
  233. package/dist/unit/types/current/ad/AdControllerImpl.test.d.ts.map +1 -0
  234. package/dist/unit/types/current/ad/AdControllerImpl.test.js +1654 -0
  235. package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.d.ts +2 -0
  236. package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.d.ts.map +1 -0
  237. package/dist/unit/types/current/ad/defaultAdLoadOptionsResolver.test.js +56 -0
  238. package/dist/unit/types/current/ad/discoverHlsInterstitials.test.d.ts +2 -0
  239. package/dist/unit/types/current/ad/discoverHlsInterstitials.test.d.ts.map +1 -0
  240. package/dist/unit/types/current/ad/discoverHlsInterstitials.test.js +757 -0
  241. package/dist/unit/types/current/drm/DrmControllerImpl.test.js +96 -2
  242. package/dist/unit/types/current/playback/createStallDetector.test.d.ts +2 -0
  243. package/dist/unit/types/current/playback/createStallDetector.test.d.ts.map +1 -0
  244. package/dist/unit/types/current/playback/createStallDetector.test.js +163 -0
  245. package/dist/unit/types/current/playback/createStallMonitor.test.d.ts +2 -0
  246. package/dist/unit/types/current/playback/createStallMonitor.test.d.ts.map +1 -0
  247. package/dist/unit/types/current/playback/createStallMonitor.test.js +163 -0
  248. package/dist/unit/types/current/streaming/ManifestControllerImpl.test.d.ts +2 -0
  249. package/dist/unit/types/current/streaming/ManifestControllerImpl.test.d.ts.map +1 -0
  250. package/dist/unit/types/current/streaming/ManifestControllerImpl.test.js +197 -0
  251. package/dist/unit/types/current/streaming/MseTrack.test.js +15 -0
  252. package/dist/unit/types/current/streaming/buffering/codecDenylist.test.d.ts +2 -0
  253. package/dist/unit/types/current/streaming/buffering/codecDenylist.test.d.ts.map +1 -0
  254. package/dist/unit/types/current/streaming/buffering/codecDenylist.test.js +56 -0
  255. package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.d.ts +2 -0
  256. package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.d.ts.map +1 -0
  257. package/dist/unit/types/current/streaming/createAllowedContentTypesValue.test.js +77 -0
  258. package/dist/unit/types/current/streaming/createTimelineContentTypesValue.test.d.ts +2 -0
  259. package/dist/unit/types/current/streaming/createTimelineContentTypesValue.test.d.ts.map +1 -0
  260. package/dist/unit/types/current/streaming/createTimelineContentTypesValue.test.js +57 -0
  261. package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.d.ts +2 -0
  262. package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.d.ts.map +1 -0
  263. package/dist/unit/types/current/streaming/mediaTimelineAccessibilityFilter.test.js +99 -0
  264. package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.d.ts +2 -0
  265. package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.d.ts.map +1 -0
  266. package/dist/unit/types/current/text/HtmlTextTrackRenderer.test.js +231 -0
  267. package/dist/unit/types/current/text/SidecarTextTrackController.test.d.ts +2 -0
  268. package/dist/unit/types/current/text/SidecarTextTrackController.test.d.ts.map +1 -0
  269. package/dist/unit/types/current/text/SidecarTextTrackController.test.js +686 -0
  270. package/dist/unit/types/current/text/SidecarTextTrackLoader.test.d.ts +2 -0
  271. package/dist/unit/types/current/text/SidecarTextTrackLoader.test.d.ts.map +1 -0
  272. package/dist/unit/types/current/text/SidecarTextTrackLoader.test.js +365 -0
  273. package/dist/unit/types/current/text/TextTrack.test.d.ts +2 -0
  274. package/dist/unit/types/current/text/TextTrack.test.d.ts.map +1 -0
  275. package/dist/unit/types/current/text/TextTrack.test.js +12 -0
  276. package/dist/unit/types/current/text/VttCueStyle.test.d.ts +2 -0
  277. package/dist/unit/types/current/text/VttCueStyle.test.d.ts.map +1 -0
  278. package/dist/unit/types/current/text/VttCueStyle.test.js +76 -0
  279. package/dist/unit/types/current/text/discoverDashTextTracks.test.d.ts +2 -0
  280. package/dist/unit/types/current/text/discoverDashTextTracks.test.d.ts.map +1 -0
  281. package/dist/unit/types/current/text/discoverDashTextTracks.test.js +216 -0
  282. package/dist/unit/types/current/text/discoverHlsTextTracks.test.d.ts +2 -0
  283. package/dist/unit/types/current/text/discoverHlsTextTracks.test.d.ts.map +1 -0
  284. package/dist/unit/types/current/text/discoverHlsTextTracks.test.js +177 -0
  285. package/dist/unit/types/current/text/mediaTextTrackProvider.test.d.ts +2 -0
  286. package/dist/unit/types/current/text/mediaTextTrackProvider.test.d.ts.map +1 -0
  287. package/dist/unit/types/current/text/mediaTextTrackProvider.test.js +86 -0
  288. package/dist/unit/types/current/text/parseWebVtt.test.d.ts +2 -0
  289. package/dist/unit/types/current/text/parseWebVtt.test.d.ts.map +1 -0
  290. package/dist/unit/types/current/text/parseWebVtt.test.js +419 -0
  291. package/dist/unit/types/current/text/pickPreferredTextTrack.test.d.ts +2 -0
  292. package/dist/unit/types/current/text/pickPreferredTextTrack.test.d.ts.map +1 -0
  293. package/dist/unit/types/current/text/pickPreferredTextTrack.test.js +78 -0
  294. package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.d.ts +2 -0
  295. package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.d.ts.map +1 -0
  296. package/dist/unit/types/current/track/inferLoadOptionsFromUri.test.js +165 -0
  297. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  298. package/dist/unit/types/current/util/media/codecOverrides.test.d.ts +2 -0
  299. package/dist/unit/types/current/util/media/codecOverrides.test.d.ts.map +1 -0
  300. package/dist/unit/types/current/util/media/codecOverrides.test.js +42 -0
  301. package/dist/unit/types/current/util/media/codecSupport.test.d.ts +2 -0
  302. package/dist/unit/types/current/util/media/codecSupport.test.d.ts.map +1 -0
  303. package/dist/unit/types/current/util/media/codecSupport.test.js +26 -0
  304. package/dist/unit/types/current/util/media/mimeType.test.d.ts +2 -0
  305. package/dist/unit/types/current/util/media/mimeType.test.d.ts.map +1 -0
  306. package/dist/unit/types/current/util/media/mimeType.test.js +22 -0
  307. package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.d.ts +2 -0
  308. package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.d.ts.map +1 -0
  309. package/dist/unit/types/current/vinyl/VinylPlayerAdBreaks.test.js +142 -0
  310. package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.d.ts +2 -0
  311. package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.d.ts.map +1 -0
  312. package/dist/unit/types/current/vinyl/VinylPlayerTextTracks.test.js +188 -0
  313. package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.d.ts +15 -0
  314. package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.d.ts.map +1 -0
  315. package/dist/vinylTestUtil/types/current/mock/ad/MockAdController.js +26 -0
  316. package/dist/vinylTestUtil/types/current/mock/dash/mockDashManifest.d.ts +84 -84
  317. package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts +10 -0
  318. package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.d.ts.map +1 -0
  319. package/dist/vinylTestUtil/types/current/mock/text/MockTextTrackController.js +14 -0
  320. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  321. package/dist/vinylTestUtil/types/ts3.7/mock/ad/MockAdController.d.ts +15 -0
  322. package/dist/vinylTestUtil/types/ts3.7/mock/dash/mockDashManifest.d.ts +84 -84
  323. package/dist/vinylTestUtil/types/ts3.7/mock/text/MockTextTrackController.d.ts +10 -0
  324. package/dist/vinylTestUtil/types/ts4.1/mock/ad/MockAdController.d.ts +15 -0
  325. package/dist/vinylTestUtil/types/ts4.1/mock/dash/mockDashManifest.d.ts +84 -84
  326. package/dist/vinylTestUtil/types/ts4.1/mock/text/MockTextTrackController.d.ts +10 -0
  327. package/dist/vinylTestUtil/types/ts4.7/mock/ad/MockAdController.d.ts +15 -0
  328. package/dist/vinylTestUtil/types/ts4.7/mock/dash/mockDashManifest.d.ts +84 -84
  329. package/dist/vinylTestUtil/types/ts4.7/mock/text/MockTextTrackController.d.ts +10 -0
  330. package/package.json +10 -11
@@ -2,9 +2,9 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import { createEmptyMediaQualityMetadata, DrmControllerImpl, DrmError, DrmKeySystem, DrmRobustness, LICENSE_TIMEOUT, ReportableMediaError, } from '@amazon/vinyl';
5
+ import { createEmptyMediaQualityMetadata, DrmControllerImpl, DrmError, DrmKeySystem, DrmRobustness, EXCESSIVE_SESSION_COUNT, LICENSE_TIMEOUT, ReportableMediaError, } from '@amazon/vinyl';
6
6
  import { createEventSpy, useMockLogger } from '@amazon/vinyl-util/testUtil';
7
- import { Abort, base64ToByteArray, bufferToBase64, Deferred, ErrorLevel, ErrorOrigin, never, nextEventAsPromise, ReportableError, utf16ToUint16Array, } from '@amazon/vinyl-util';
7
+ import { Abort, base64ToByteArray, bufferToBase64, Deferred, ErrorLevel, ErrorOrigin, never, nextEventAsPromise, ReportableError, setUserAgent, utf16ToUint16Array, } from '@amazon/vinyl-util';
8
8
  import { flushPromises, implementEventFakes, MockHTMLAudioElement, MockMediaError, useMockTime, } from '@amazon/vinyl-util/browserTestUtil';
9
9
  import { MockCommonEme, MockCommonMediaKeys, MockCommonMediaKeySession, MockCommonMediaKeySystemAccess, } from '@amazon/vinyl/vinylTestUtil';
10
10
  var createSpy = jasmine.createSpy;
@@ -331,6 +331,17 @@ describe('DrmControllerImpl', () => {
331
331
  expect(sessions.map((session) => session.dispose.calls.count())).toEqual([1, 1, 1, 1, 1, 1]); // Expect all sessions to have been disposed
332
332
  expect(drmController.activeSessions).toEqual(0);
333
333
  });
334
+ it('does not close sessions again after dispose', async () => {
335
+ const abort = new Abort();
336
+ drmController.setBufferingDrmInfo(drmInfo, abort);
337
+ await emitEncrypted();
338
+ const session = mediaKeys.createSession.calls.mostRecent()
339
+ .returnValue;
340
+ drmController.dispose();
341
+ const disposeCount = session.dispose.calls.count();
342
+ abort.abort();
343
+ expect(session.dispose.calls.count()).toBe(disposeCount);
344
+ });
334
345
  });
335
346
  });
336
347
  describe('when an encrypted event is observed', () => {
@@ -1048,6 +1059,24 @@ describe('DrmControllerImpl', () => {
1048
1059
  expect(drmController.isEmeSupported()).toBeFalse();
1049
1060
  });
1050
1061
  });
1062
+ describe('excessive sessions', () => {
1063
+ it('warns once when the open session count exceeds the threshold', async () => {
1064
+ drmController.setBufferingDrmInfo(drmInfo);
1065
+ // Distinct init data per event so each opens its own session.
1066
+ for (let i = 0; i < EXCESSIVE_SESSION_COUNT; i++) {
1067
+ await emitEncrypted(new Uint8Array([i]));
1068
+ }
1069
+ expect(drmController.activeSessions).toBe(EXCESSIVE_SESSION_COUNT);
1070
+ expect(logger.value.warn).not.toHaveBeenCalled();
1071
+ // Crossing the threshold warns.
1072
+ await emitEncrypted(new Uint8Array([EXCESSIVE_SESSION_COUNT]));
1073
+ expect(drmController.activeSessions).toBe(EXCESSIVE_SESSION_COUNT + 1);
1074
+ expect(logger.value.warn).toHaveBeenCalledTimes(1);
1075
+ // Further sessions past the threshold don't re-warn.
1076
+ await emitEncrypted(new Uint8Array([EXCESSIVE_SESSION_COUNT + 1]));
1077
+ expect(logger.value.warn).toHaveBeenCalledTimes(1);
1078
+ });
1079
+ });
1051
1080
  describe('closeSessions', () => {
1052
1081
  it('clears active sessions', async () => {
1053
1082
  const sessionCloseSpy = createEventSpy(drmController, 'sessionClose');
@@ -1275,6 +1304,71 @@ describe('DrmControllerImpl', () => {
1275
1304
  ]);
1276
1305
  });
1277
1306
  });
1307
+ describe('ChromeOS verified media path', () => {
1308
+ // ChromeOS only enables the verified media path (VMP) when a video
1309
+ // capability is present, so audio-only content must advertise a dummy
1310
+ // avc1 video capability alongside its audio capability.
1311
+ const chromeOsUserAgent = 'Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36';
1312
+ const chromeUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36';
1313
+ it('adds avc1 video capabilities for audio content on ChromeOS', async () => {
1314
+ setUserAgent(chromeOsUserAgent);
1315
+ drmController.setBufferingDrmInfo({
1316
+ ...drmInfo,
1317
+ contentType: 'audio',
1318
+ mimeType: 'audio/mp4',
1319
+ });
1320
+ await emitEncrypted();
1321
+ expect(commonEme.requestMediaKeySystemAccess).toHaveBeenCalledOnceWith(DrmKeySystem.WIDEVINE, [
1322
+ {
1323
+ initDataTypes: ['cenc'],
1324
+ audioCapabilities: [
1325
+ {
1326
+ contentType: 'audio/mp4',
1327
+ encryptionScheme: 'cenc',
1328
+ robustness: DrmRobustness.SW_SECURE_CRYPTO,
1329
+ },
1330
+ ],
1331
+ videoCapabilities: [
1332
+ {
1333
+ contentType: 'video/mp4; codecs="avc1.4d401f"',
1334
+ robustness: DrmRobustness.SW_SECURE_DECODE,
1335
+ },
1336
+ ],
1337
+ },
1338
+ ]);
1339
+ });
1340
+ it('does not add video capabilities for audio content off ChromeOS', async () => {
1341
+ setUserAgent(chromeUserAgent);
1342
+ drmController.setBufferingDrmInfo({
1343
+ ...drmInfo,
1344
+ contentType: 'audio',
1345
+ mimeType: 'audio/mp4',
1346
+ });
1347
+ await emitEncrypted();
1348
+ const config = commonEme.requestMediaKeySystemAccess.calls.mostRecent()
1349
+ .args[1][0];
1350
+ expect(config.videoCapabilities).toBeUndefined();
1351
+ });
1352
+ it('does not alter video content capabilities on ChromeOS', async () => {
1353
+ setUserAgent(chromeOsUserAgent);
1354
+ drmController.setBufferingDrmInfo({
1355
+ ...drmInfo,
1356
+ contentType: 'video',
1357
+ mimeType: 'video/mp4',
1358
+ });
1359
+ await emitEncrypted();
1360
+ const config = commonEme.requestMediaKeySystemAccess.calls.mostRecent()
1361
+ .args[1][0];
1362
+ expect(config.videoCapabilities).toEqual([
1363
+ {
1364
+ contentType: 'video/mp4',
1365
+ encryptionScheme: 'cenc',
1366
+ robustness: DrmRobustness.SW_SECURE_CRYPTO,
1367
+ },
1368
+ ]);
1369
+ expect(config.audioCapabilities).toBeUndefined();
1370
+ });
1371
+ });
1278
1372
  describe('when a session has been created', () => {
1279
1373
  beforeEach(async () => {
1280
1374
  drmController.setBufferingDrmInfo(drmInfo);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createStallDetector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStallDetector.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/playback/createStallDetector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,163 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { createStallDetector } from '@amazon/vinyl';
6
+ import { implementEventFakes, MockHTMLAudioElement, mockEvent, MockTimeRanges, useMockTime, } from '@amazon/vinyl-util/browserTestUtil';
7
+ describe('createStallDetector', () => {
8
+ const clock = useMockTime();
9
+ let media;
10
+ let fabricatePlaying;
11
+ let stop;
12
+ beforeEach(() => {
13
+ media = new MockHTMLAudioElement();
14
+ implementEventFakes(media);
15
+ media.play.and.returnValue(Promise.resolve());
16
+ media.paused = false;
17
+ media.ended = false;
18
+ media.readyState = media.HAVE_ENOUGH_DATA;
19
+ media.currentTime = 10;
20
+ media.buffered = new MockTimeRanges([[0, 100]]);
21
+ fabricatePlaying = jasmine.createSpy('fabricatePlaying');
22
+ });
23
+ afterEach(() => {
24
+ stop?.();
25
+ });
26
+ function detect(overrides = {}) {
27
+ stop = createStallDetector(media, { fabricatePlaying, ...overrides });
28
+ }
29
+ /** Advances the mock clock by `n` default poll intervals. */
30
+ async function poll(n) {
31
+ for (let i = 0; i < n; i++) {
32
+ await clock.tick(0.25);
33
+ }
34
+ }
35
+ describe('a stall inside ready buffered data', () => {
36
+ it('nudges the play head once frozen past the stall threshold', async () => {
37
+ detect();
38
+ // Threshold is 0.75s = three polls; the third nudges by stallSkip.
39
+ await poll(3);
40
+ expect(media.currentTime).toBeCloseTo(10.1);
41
+ });
42
+ it('does not recover before the stall threshold', async () => {
43
+ detect();
44
+ await poll(2);
45
+ expect(media.currentTime).toBe(10);
46
+ expect(media.play).not.toHaveBeenCalled();
47
+ });
48
+ it('nudges even when the ready state is low (iOS reports a stale readyState)', async () => {
49
+ media.readyState = media.HAVE_METADATA;
50
+ detect();
51
+ await poll(3);
52
+ expect(media.currentTime).toBeCloseTo(10.1);
53
+ expect(media.play).not.toHaveBeenCalled();
54
+ });
55
+ it('keeps nudging, then gives up after maxAttempts', async () => {
56
+ detect();
57
+ // Default maxAttempts is 3, so at most three nudges (one every 3 polls).
58
+ await poll(12);
59
+ expect(media.currentTime).toBeCloseTo(10.3);
60
+ // Further polls do nothing; the detector has stopped.
61
+ await poll(6);
62
+ expect(media.currentTime).toBeCloseTo(10.3);
63
+ });
64
+ });
65
+ describe('a stall with no data at the playhead', () => {
66
+ it('does not recover when the playhead is outside all buffered ranges', async () => {
67
+ media.buffered = new MockTimeRanges([[50, 100]]);
68
+ detect();
69
+ await poll(6);
70
+ expect(media.currentTime).toBe(10);
71
+ expect(fabricatePlaying).not.toHaveBeenCalled();
72
+ });
73
+ it('does not recover at the end of buffered data', async () => {
74
+ // Within the default end margin (0.5s) of the buffer end.
75
+ media.buffered = new MockTimeRanges([[0, 10.3]]);
76
+ detect();
77
+ await poll(6);
78
+ expect(media.currentTime).toBe(10);
79
+ });
80
+ it('nudges at the end of the media (stuck end-of-track on src)', async () => {
81
+ // Buffer ends at the media duration: no more data is coming, so a
82
+ // freeze here is a stuck end-of-track and a nudge drives it to end.
83
+ media.buffered = new MockTimeRanges([[0, 10.3]]);
84
+ media.duration = 10.3;
85
+ detect();
86
+ await poll(3);
87
+ expect(media.currentTime).toBeCloseTo(10.1);
88
+ });
89
+ it('nudges outside buffered ranges when nudgeUnbuffered is set', async () => {
90
+ // WebKit path: re-issue the seek even though buffered looks empty.
91
+ media.buffered = new MockTimeRanges([[50, 100]]);
92
+ detect({ nudgeUnbuffered: true });
93
+ await poll(3);
94
+ expect(media.currentTime).toBeCloseTo(10.1);
95
+ });
96
+ it('stops when the source is emptied', async () => {
97
+ detect();
98
+ media.dispatchEvent(mockEvent('emptied'));
99
+ // Stopped: a later freeze in buffered data is not nudged.
100
+ await poll(6);
101
+ expect(media.currentTime).toBe(10);
102
+ });
103
+ });
104
+ describe('fabricating a playing event', () => {
105
+ it('fabricates when the head progresses without a playing event', async () => {
106
+ detect();
107
+ media.currentTime = 20;
108
+ await poll(1);
109
+ expect(fabricatePlaying).toHaveBeenCalledTimes(1);
110
+ // Detector stopped; a later freeze is not recovered.
111
+ await poll(6);
112
+ expect(media.play).not.toHaveBeenCalled();
113
+ });
114
+ it('does not fabricate when a real playing event fired and it keeps progressing', async () => {
115
+ detect();
116
+ media.dispatchEvent(mockEvent('playing'));
117
+ media.currentTime = 20;
118
+ await poll(6);
119
+ expect(fabricatePlaying).not.toHaveBeenCalled();
120
+ });
121
+ it('fabricates after reviving a stall even if a playing event fired earlier', async () => {
122
+ // iOS pattern: a playing event fires, then playback stalls.
123
+ media.readyState = media.HAVE_METADATA;
124
+ detect();
125
+ media.dispatchEvent(mockEvent('playing'));
126
+ await poll(3);
127
+ expect(media.currentTime).toBeCloseTo(10.1); // nudged (recovered)
128
+ // The recovery revives playback.
129
+ media.currentTime = 11;
130
+ await poll(1);
131
+ expect(fabricatePlaying).toHaveBeenCalledTimes(1);
132
+ });
133
+ });
134
+ describe('when the element is not advancing by design', () => {
135
+ it('does not recover while paused', async () => {
136
+ media.paused = true;
137
+ detect();
138
+ await poll(6);
139
+ expect(media.play).not.toHaveBeenCalled();
140
+ expect(media.currentTime).toBe(10);
141
+ });
142
+ it('does not recover once ended', async () => {
143
+ media.ended = true;
144
+ detect();
145
+ await poll(6);
146
+ expect(media.play).not.toHaveBeenCalled();
147
+ expect(media.currentTime).toBe(10);
148
+ });
149
+ });
150
+ it('honors provided options', async () => {
151
+ detect({
152
+ pollInterval: 0.5,
153
+ stallThreshold: 1,
154
+ bufferEndMargin: 0.2,
155
+ stallSkip: 0.25,
156
+ maxAttempts: 1,
157
+ });
158
+ // Threshold 1s = two 0.5s polls; one nudge of 0.25, then it gives up.
159
+ for (let i = 0; i < 6; i++)
160
+ await clock.tick(0.5);
161
+ expect(media.currentTime).toBeCloseTo(10.25);
162
+ });
163
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createStallMonitor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStallMonitor.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/playback/createStallMonitor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,163 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { createStallMonitor, StallEndedReason, } from '@amazon/vinyl';
6
+ import { EventHostImpl } from '@amazon/vinyl-util';
7
+ import { useMockTime } from '@amazon/vinyl-util/browserTestUtil';
8
+ describe('createStallMonitor', () => {
9
+ const clock = useMockTime();
10
+ let host;
11
+ let onStallEntered;
12
+ let onStallEnded;
13
+ let stop;
14
+ beforeEach(() => {
15
+ host = new EventHostImpl();
16
+ onStallEntered = jasmine.createSpy('onStallEntered');
17
+ onStallEnded = jasmine.createSpy('onStallEnded');
18
+ });
19
+ afterEach(() => stop?.());
20
+ function monitor(overrides = {}) {
21
+ stop = createStallMonitor(host, { onStallEntered, onStallEnded }, overrides);
22
+ }
23
+ /** Advances the mock clock by `n` default (0.25s) poll intervals. */
24
+ async function poll(n) {
25
+ for (let i = 0; i < n; i++)
26
+ await clock.tick(0.25);
27
+ }
28
+ it('does not report a stall before playback is observed', async () => {
29
+ monitor();
30
+ // No 'playing' has been observed (e.g. initial load / awaiting a seek).
31
+ await poll(8);
32
+ expect(onStallEntered).not.toHaveBeenCalled();
33
+ });
34
+ it('reports a stall once the play head is frozen past the threshold', async () => {
35
+ monitor();
36
+ host.dispatch('playing', {});
37
+ await poll(3); // 0.75s < 1s threshold
38
+ expect(onStallEntered).not.toHaveBeenCalled();
39
+ await poll(1); // 1s
40
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
41
+ });
42
+ it('honors a configurable threshold', async () => {
43
+ monitor({ stallThreshold: 2 });
44
+ host.dispatch('playing', {});
45
+ await poll(4); // 1s < 2s
46
+ expect(onStallEntered).not.toHaveBeenCalled();
47
+ await poll(4); // 2s
48
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
49
+ });
50
+ it('does not report a stall while timeUpdates keep arriving', async () => {
51
+ monitor();
52
+ host.dispatch('playing', {});
53
+ for (let i = 0; i < 10; i++) {
54
+ await poll(2); // 0.5s, under the threshold
55
+ host.dispatch('timeUpdate', { previous: i, current: i + 1 });
56
+ }
57
+ expect(onStallEntered).not.toHaveBeenCalled();
58
+ });
59
+ it('ends a stall with reason "playing" when the play head advances, measuring from the last timeUpdate', async () => {
60
+ monitor();
61
+ host.dispatch('playing', {});
62
+ host.dispatch('timeUpdate', { previous: 0, current: 1 });
63
+ await poll(4); // freeze 1s -> stallEntered
64
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
65
+ await poll(4); // frozen another 1s (total 2s)
66
+ host.dispatch('timeUpdate', { previous: 1, current: 2 }); // resume
67
+ expect(onStallEnded).toHaveBeenCalledTimes(1);
68
+ const info = onStallEnded.calls.mostRecent().args[0];
69
+ expect(info.reason).toBe(StallEndedReason.PLAYING);
70
+ expect(info.duration).toBeCloseTo(2, 1);
71
+ });
72
+ for (const [event, reason] of [
73
+ ['pause', StallEndedReason.PAUSE],
74
+ ['seeking', StallEndedReason.SEEKING],
75
+ ['emptied', StallEndedReason.EMPTIED],
76
+ ]) {
77
+ it(`ends a stall with reason "${reason}" on ${event}`, async () => {
78
+ monitor();
79
+ host.dispatch('playing', {});
80
+ await poll(4); // stallEntered
81
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
82
+ host.dispatch(event, {});
83
+ expect(onStallEnded).toHaveBeenCalledTimes(1);
84
+ expect(onStallEnded.calls.mostRecent().args[0].reason).toBe(reason);
85
+ });
86
+ }
87
+ it('ends a stall with reason "playing" when a playing event fires (resume without a timeUpdate)', async () => {
88
+ monitor();
89
+ host.dispatch('playing', {});
90
+ await poll(4); // stallEntered
91
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
92
+ // A 'playing' event (rather than a timeUpdate) signals the resume.
93
+ host.dispatch('playing', {});
94
+ expect(onStallEnded).toHaveBeenCalledTimes(1);
95
+ expect(onStallEnded.calls.mostRecent().args[0].reason).toBe(StallEndedReason.PLAYING);
96
+ });
97
+ it('suspends detection after a seek until playback is observed again', async () => {
98
+ monitor();
99
+ host.dispatch('playing', {});
100
+ host.dispatch('seeking', {}); // suspends; observedPlaying = false
101
+ await poll(8);
102
+ expect(onStallEntered).not.toHaveBeenCalled();
103
+ // Once playback is observed again, detection resumes.
104
+ host.dispatch('playing', {});
105
+ await poll(4);
106
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
107
+ });
108
+ it('reports each stall/recovery cycle', async () => {
109
+ monitor();
110
+ host.dispatch('playing', {});
111
+ await poll(4);
112
+ host.dispatch('timeUpdate', { previous: 0, current: 1 }); // resume 1
113
+ await poll(4);
114
+ host.dispatch('timeUpdate', { previous: 1, current: 2 }); // resume 2
115
+ expect(onStallEntered).toHaveBeenCalledTimes(2);
116
+ expect(onStallEnded).toHaveBeenCalledTimes(2);
117
+ });
118
+ it('does not end and re-detect a stall on a non-advancing timeUpdate', async () => {
119
+ // Browsers emit `timeUpdate` even while the play head is frozen, with an unchanged (or
120
+ // briefly backward) currentTime. These must not be treated as progress, or the stall is
121
+ // ended and immediately re-detected, doubling the reported events.
122
+ monitor();
123
+ host.dispatch('playing', {});
124
+ host.dispatch('timeUpdate', { previous: 4, current: 5 });
125
+ await poll(4); // freeze 1s -> stallEntered
126
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
127
+ // Still frozen: currentTime hasn't advanced (unchanged, backward, or sub-epsilon jitter).
128
+ host.dispatch('timeUpdate', { previous: 5, current: 5 });
129
+ host.dispatch('timeUpdate', { previous: 5, current: 4.99 });
130
+ host.dispatch('timeUpdate', { previous: 5, current: 5 + 1e-9 });
131
+ await poll(4);
132
+ expect(onStallEnded).not.toHaveBeenCalled();
133
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
134
+ // A real forward advance ends the stall exactly once.
135
+ host.dispatch('timeUpdate', { previous: 5, current: 6 });
136
+ expect(onStallEnded).toHaveBeenCalledTimes(1);
137
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
138
+ });
139
+ it('does not re-detect a stall immediately after resuming via a playing event', async () => {
140
+ // Resuming via `playing` must restart the freeze clock. Otherwise the poll, still seeing
141
+ // the stale pre-freeze progress time, immediately re-enters a stall before the first
142
+ // post-resume timeUpdate arrives — an extra, spurious stall.
143
+ monitor();
144
+ host.dispatch('playing', {});
145
+ host.dispatch('timeUpdate', { previous: 0, current: 1 });
146
+ await poll(4); // freeze 1s -> stallEntered
147
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
148
+ // Resume with a 'playing' event and no timeUpdate yet.
149
+ host.dispatch('playing', {});
150
+ expect(onStallEnded).toHaveBeenCalledTimes(1);
151
+ // The freeze clock reset on resume, so a sub-threshold gap is not a new stall.
152
+ await poll(3); // 0.75s < 1s threshold
153
+ expect(onStallEntered).toHaveBeenCalledTimes(1);
154
+ });
155
+ it('stops reporting after disposal', async () => {
156
+ monitor();
157
+ host.dispatch('playing', {});
158
+ stop();
159
+ stop = undefined; // disposal is single-shot; don't dispose again in afterEach
160
+ await poll(8);
161
+ expect(onStallEntered).not.toHaveBeenCalled();
162
+ });
163
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ManifestControllerImpl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManifestControllerImpl.test.d.ts","sourceRoot":"","sources":["../../../../../test/unit/streaming/ManifestControllerImpl.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,197 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { Deferred } from '@amazon/vinyl-util';
6
+ import { ManifestControllerImpl } from '@amazon/vinyl';
7
+ import { mockHlsManifestData } from '@amazon/vinyl/vinylTestUtil';
8
+ import { expectNothing, flushPromises, } from '@amazon/vinyl-util/browserTestUtil';
9
+ var createSpy = jasmine.createSpy;
10
+ describe('ManifestControllerImpl', () => {
11
+ let manifestProvider;
12
+ beforeEach(() => {
13
+ manifestProvider = createSpy('manifestProvider');
14
+ manifestProvider.and.resolveTo(mockHlsManifestData);
15
+ });
16
+ function createManifestController() {
17
+ return new ManifestControllerImpl({ manifestProvider });
18
+ }
19
+ it('has a toStringTag', () => {
20
+ const controller = createManifestController();
21
+ expect(String(controller)).toContain('ManifestControllerImpl');
22
+ });
23
+ it('has a logPrefix', () => {
24
+ const controller = createManifestController();
25
+ expect(controller.logPrefix).toBe('ManifestControllerImpl');
26
+ });
27
+ describe('refresh', () => {
28
+ it('reloads the manifest', () => {
29
+ const controller = createManifestController();
30
+ controller.refresh();
31
+ expect(manifestProvider).toHaveBeenCalledTimes(2);
32
+ });
33
+ it('notifies observers', () => {
34
+ const controller = createManifestController();
35
+ const observer = createSpy('observer');
36
+ controller.onData(observer);
37
+ observer.calls.reset();
38
+ controller.refresh();
39
+ expect(observer).toHaveBeenCalledTimes(1);
40
+ });
41
+ });
42
+ describe('value', () => {
43
+ it('resolves to the manifest data', async () => {
44
+ const controller = createManifestController();
45
+ const result = await controller.value;
46
+ expect(result.mainPlaylist).toBe(mockHlsManifestData.mainPlaylist);
47
+ expect(result.baseUrl).toBe(mockHlsManifestData.baseUrl);
48
+ });
49
+ });
50
+ describe('getValue', () => {
51
+ it('returns the same as value', () => {
52
+ const controller = createManifestController();
53
+ expect(controller.getValue()).toBe(controller.value);
54
+ });
55
+ });
56
+ describe('changeId', () => {
57
+ it('increments when manifest is refreshed', () => {
58
+ const controller = createManifestController();
59
+ const initial = controller.changeId;
60
+ controller.refresh();
61
+ expect(controller.changeId).toBe(initial + 1);
62
+ });
63
+ });
64
+ describe('pick', () => {
65
+ it('returns a sub-observable', () => {
66
+ const controller = createManifestController();
67
+ const thenPick = controller.pick('then');
68
+ expect(thenPick.value).toEqual(jasmine.any(Function));
69
+ });
70
+ });
71
+ describe('map', () => {
72
+ it('returns a mapped observable', async () => {
73
+ const controller = createManifestController();
74
+ const mapped = controller.map(async (promise) => {
75
+ const data = await promise;
76
+ return data.baseUrl;
77
+ });
78
+ expect(await mapped.value).toBe(mockHlsManifestData.baseUrl);
79
+ });
80
+ });
81
+ describe('disposed', () => {
82
+ it('returns false before dispose', () => {
83
+ const controller = createManifestController();
84
+ expect(controller.disposed).toBe(false);
85
+ });
86
+ it('returns true after dispose', () => {
87
+ const controller = createManifestController();
88
+ controller.dispose();
89
+ expect(controller.disposed).toBe(true);
90
+ });
91
+ });
92
+ describe('value - pending', () => {
93
+ it('resolves pending manifest', async () => {
94
+ const deferred = new Deferred();
95
+ manifestProvider.and.returnValue(deferred);
96
+ const controller = createManifestController();
97
+ const valuePromise = controller.value;
98
+ deferred.resolve(mockHlsManifestData);
99
+ const result = await valuePromise;
100
+ expect(result.mainPlaylist).toBe(mockHlsManifestData.mainPlaylist);
101
+ });
102
+ });
103
+ describe('when manifest provider rejects', () => {
104
+ it('does not cause an unhandled rejection', async () => {
105
+ manifestProvider.and.rejectWith(new Error('expected'));
106
+ createManifestController();
107
+ await flushPromises();
108
+ expectNothing();
109
+ });
110
+ it('rejects the value', async () => {
111
+ manifestProvider.and.rejectWith(new Error('expected'));
112
+ const controller = createManifestController();
113
+ await expectAsync(controller.value).toBeRejectedWithError('expected');
114
+ });
115
+ });
116
+ describe('error', () => {
117
+ it('is null when manifest loads successfully', async () => {
118
+ const controller = createManifestController();
119
+ await controller.value;
120
+ expect(controller.error).toBeNull();
121
+ });
122
+ it('is set when manifest provider rejects', async () => {
123
+ manifestProvider.and.rejectWith(new Error('test error'));
124
+ const controller = createManifestController();
125
+ await expectAsync(controller.value).toBeRejected();
126
+ expect(controller.error).toEqual(jasmine.objectContaining({ message: 'test error' }));
127
+ });
128
+ it('is cleared after refresh', async () => {
129
+ manifestProvider.and.rejectWith(new Error('test error'));
130
+ const controller = createManifestController();
131
+ await expectAsync(controller.value).toBeRejected();
132
+ expect(controller.error).not.toBeNull();
133
+ manifestProvider.and.resolveTo(mockHlsManifestData);
134
+ controller.refresh();
135
+ expect(controller.error).toBeNull();
136
+ });
137
+ });
138
+ describe('reset', () => {
139
+ it('refreshes manifest when there was an error', async () => {
140
+ manifestProvider.and.rejectWith(new Error('test error'));
141
+ const controller = createManifestController();
142
+ await expectAsync(controller.value).toBeRejected();
143
+ manifestProvider.and.resolveTo(mockHlsManifestData);
144
+ controller.reset();
145
+ expect(manifestProvider.calls.count()).toBe(2);
146
+ });
147
+ it('does nothing when no error occurred', () => {
148
+ const controller = createManifestController();
149
+ const initialCallCount = manifestProvider.calls.count();
150
+ controller.reset();
151
+ expect(manifestProvider.calls.count()).toBe(initialCallCount);
152
+ });
153
+ });
154
+ describe('load span metrics', () => {
155
+ it('dispatches loadSpanMeasured on the initial manifest fetch', async () => {
156
+ const controller = createManifestController();
157
+ const spy = createSpy('loadSpanMeasured');
158
+ controller.on('loadSpanMeasured', spy);
159
+ await controller.value;
160
+ await flushPromises();
161
+ expect(spy).toHaveBeenCalledWith(jasmine.objectContaining({
162
+ kind: 'manifest',
163
+ startTime: jasmine.any(Number),
164
+ endTime: jasmine.any(Number),
165
+ }));
166
+ });
167
+ it('does not re-measure on refresh', async () => {
168
+ const controller = createManifestController();
169
+ await controller.value;
170
+ const spy = createSpy('loadSpanMeasured');
171
+ controller.on('loadSpanMeasured', spy);
172
+ controller.refresh();
173
+ await controller.value;
174
+ await flushPromises();
175
+ expect(spy).not.toHaveBeenCalled();
176
+ });
177
+ it('reports listeners', () => {
178
+ const controller = createManifestController();
179
+ expect(controller.hasAnyListeners()).toBeFalse();
180
+ expect(controller.hasListeners('loadSpanMeasured')).toBeFalse();
181
+ controller.on('loadSpanMeasured', createSpy('loadSpanMeasured'));
182
+ expect(controller.hasAnyListeners()).toBeTrue();
183
+ expect(controller.hasListeners('loadSpanMeasured')).toBeTrue();
184
+ });
185
+ });
186
+ describe('dispose', () => {
187
+ it('aborts current request', () => {
188
+ const deferred = new Deferred();
189
+ manifestProvider.and.returnValue(deferred);
190
+ const controller = createManifestController();
191
+ const abort = manifestProvider.calls.first()
192
+ .args[0];
193
+ controller.dispose();
194
+ expect(abort.aborted()).toBeTrue();
195
+ });
196
+ });
197
+ });