@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
@@ -0,0 +1,6 @@
1
+ import { ErrorLevel, ReportableError } from '@amazon/vinyl-util';
2
+ export declare class AdError extends ReportableError {
3
+ get [Symbol.toStringTag](): string;
4
+ constructor(message: string, origin?: string, level?: ErrorLevel);
5
+ }
6
+ //# sourceMappingURL=AdError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdError.d.ts","sourceRoot":"","sources":["../../../../src/ad/AdError.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAE7E,qBAAa,OAAQ,SAAQ,eAAe;IACxC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;gBAGG,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAA0B,EAClC,KAAK,GAAE,UAA6B;CAK3C"}
@@ -0,0 +1,14 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { ErrorLevel, ErrorOrigin, ReportableError } from '@amazon/vinyl-util';
6
+ export class AdError extends ReportableError {
7
+ get [Symbol.toStringTag]() {
8
+ return 'AdError';
9
+ }
10
+ constructor(message, origin = ErrorOrigin.MEDIA, level = ErrorLevel.FATAL) {
11
+ super(message, origin, level);
12
+ Object.setPrototypeOf(this, AdError.prototype);
13
+ }
14
+ }
@@ -0,0 +1,28 @@
1
+ import type { AnyRecord, ReadonlyEventHost } from '@amazon/vinyl-util';
2
+ import type { TrackAds } from './AdBreakInfo';
3
+ /**
4
+ * Events dispatched by an {@link AdsProvider}.
5
+ */
6
+ export interface AdsProviderEventMap {
7
+ /**
8
+ * The set of ads has changed; consumers should re-read via
9
+ * {@link AdsProvider.getAds}.
10
+ */
11
+ readonly adsChange: AnyRecord;
12
+ }
13
+ /**
14
+ * The minimal surface an {@link AdController} needs to source its ad breaks:
15
+ * a resolver for the current break list, plus an `adsChange` event to signal
16
+ * when that list changes. A {@link ReadonlyTrack} satisfies this directly, so
17
+ * the current playing track can be passed as-is; applications may also
18
+ * implement it to supply ads out of band (e.g. from an external ad server).
19
+ */
20
+ export interface AdsProvider extends ReadonlyEventHost<AdsProviderEventMap> {
21
+ /**
22
+ * Resolves to the provider's current ad breaks. The result may change over
23
+ * the provider's lifetime; each `adsChange` event indicates that a
24
+ * subsequent call may return different breaks.
25
+ */
26
+ getAds(): Promise<TrackAds>;
27
+ }
28
+ //# sourceMappingURL=AdsProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdsProvider.d.ts","sourceRoot":"","sources":["../../../../src/ad/AdsProvider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;CAChC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAY,SAAQ,iBAAiB,CAAC,mBAAmB,CAAC;IACvE;;;;OAIG;IACH,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC9B"}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { AdInfo } from './AdBreakInfo';
2
+ import type { VinylTrackLoadOptions } from '../track/createVinylTrackFactories';
3
+ import { ReportableError } from '@amazon/vinyl-util';
4
+ export declare function defaultAdLoadOptionsResolver(adInfo: AdInfo): Promise<VinylTrackLoadOptions>;
5
+ /**
6
+ * An error indicating that a method was called with illegal arguments.
7
+ */
8
+ export declare class UnresolvableAdError extends ReportableError {
9
+ get [Symbol.toStringTag](): string;
10
+ constructor(message: string);
11
+ }
12
+ //# sourceMappingURL=defaultAdLoadOptionsResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultAdLoadOptionsResolver.d.ts","sourceRoot":"","sources":["../../../../src/ad/defaultAdLoadOptionsResolver.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC/E,OAAO,EAAe,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEjE,wBAAsB,4BAA4B,CAC9C,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAShC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACpD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;gBAEW,OAAO,EAAE,MAAM;CAI9B"}
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { createTrackLoadOptionsFromUrl } from '../track/inferLoadOptionsFromUri';
6
+ import { ErrorOrigin, ReportableError } from '@amazon/vinyl-util';
7
+ export async function defaultAdLoadOptionsResolver(adInfo) {
8
+ if (!adInfo.uri)
9
+ throw new UnresolvableAdError('Ad with no URI cannot be played');
10
+ const loadOptions = await createTrackLoadOptionsFromUrl(adInfo.uri);
11
+ if (!loadOptions)
12
+ throw new UnresolvableAdError(`could not infer ad track type from uri ${adInfo.uri}`);
13
+ return loadOptions;
14
+ }
15
+ /**
16
+ * An error indicating that a method was called with illegal arguments.
17
+ */
18
+ export class UnresolvableAdError extends ReportableError {
19
+ get [Symbol.toStringTag]() {
20
+ return 'UnresolvableAdError';
21
+ }
22
+ constructor(message) {
23
+ super(message, ErrorOrigin.MEDIA);
24
+ Object.setPrototypeOf(this, UnresolvableAdError.prototype);
25
+ }
26
+ }
@@ -0,0 +1,22 @@
1
+ import type { HlsMediaPlaylist } from '@amazon/vinyl-hls-parser';
2
+ import type { AdBreakList } from './AdBreakInfo';
3
+ /**
4
+ * Discovers HLS Interstitial ad breaks from a parsed media playlist and maps
5
+ * them to the provider-agnostic {@link AdBreakInfo} model.
6
+ *
7
+ * HLS Interstitials (Apple's SGAI primitive) are carried as EXT-X-DATERANGE
8
+ * tags with `CLASS="com.apple.hls.interstitial"`. Each such range is anchored
9
+ * to a wall-clock `START-DATE`; this function converts that to a media-timeline
10
+ * start time by correlating it with the playlist's EXT-X-PROGRAM-DATE-TIME
11
+ * anchor. When the playlist carries no program date-time, and the range's
12
+ * start-date is not otherwise resolvable, the break is anchored to the start of
13
+ * the timeline (pre-roll) as a best effort.
14
+ *
15
+ * @param playlist The parsed HLS media playlist.
16
+ * @param baseUrl The URL of the media playlist, used to resolve relative
17
+ * `X-ASSET-URI` values.
18
+ * @param contentDuration The total content duration in seconds, if known, used
19
+ * to classify post-rolls. Pass null/undefined for live or unknown durations.
20
+ */
21
+ export declare function discoverHlsInterstitials(playlist: HlsMediaPlaylist, baseUrl: string, contentDuration?: number | null): Promise<AdBreakList>;
22
+ //# sourceMappingURL=discoverHlsInterstitials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoverHlsInterstitials.d.ts","sourceRoot":"","sources":["../../../../src/ad/discoverHlsInterstitials.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAU9E,OAAO,KAAK,EAER,WAAW,EAMd,MAAM,eAAe,CAAA;AActB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAChC,OAAO,CAAC,WAAW,CAAC,CAmDtB"}
@@ -0,0 +1,248 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { HLS_INTERSTITIAL_CLASS } from '@amazon/vinyl-hls-parser';
6
+ import { memoize, readResponseBody, requestWithRetry, resolveUrl, } from '@amazon/vinyl-util';
7
+ /**
8
+ * How close to the start or end of content a break must be to be classified as
9
+ * a pre-roll or post-roll rather than a mid-roll, in seconds.
10
+ */
11
+ const ROLL_EPSILON = 0.5;
12
+ /**
13
+ * Discovers HLS Interstitial ad breaks from a parsed media playlist and maps
14
+ * them to the provider-agnostic {@link AdBreakInfo} model.
15
+ *
16
+ * HLS Interstitials (Apple's SGAI primitive) are carried as EXT-X-DATERANGE
17
+ * tags with `CLASS="com.apple.hls.interstitial"`. Each such range is anchored
18
+ * to a wall-clock `START-DATE`; this function converts that to a media-timeline
19
+ * start time by correlating it with the playlist's EXT-X-PROGRAM-DATE-TIME
20
+ * anchor. When the playlist carries no program date-time, and the range's
21
+ * start-date is not otherwise resolvable, the break is anchored to the start of
22
+ * the timeline (pre-roll) as a best effort.
23
+ *
24
+ * @param playlist The parsed HLS media playlist.
25
+ * @param baseUrl The URL of the media playlist, used to resolve relative
26
+ * `X-ASSET-URI` values.
27
+ * @param contentDuration The total content duration in seconds, if known, used
28
+ * to classify post-rolls. Pass null/undefined for live or unknown durations.
29
+ */
30
+ export function discoverHlsInterstitials(playlist, baseUrl, contentDuration) {
31
+ const anchor = findProgramDateTimeAnchor(playlist);
32
+ const breaks = [];
33
+ for (const range of playlist.dateRanges) {
34
+ if (range.classId !== HLS_INTERSTITIAL_CLASS)
35
+ continue;
36
+ const startTime = resolveStartTime(range, anchor);
37
+ if (startTime == null)
38
+ continue;
39
+ const playoutLimit = resolvePlayoutLimit(range);
40
+ let duration = resolveDuration(range);
41
+ if (playoutLimit != null && duration != null)
42
+ duration = Math.min(playoutLimit, duration);
43
+ const cues = parseCues(range);
44
+ const placement = classifyPlacement(startTime, contentDuration, cues);
45
+ const effectiveStartTime = placement === 'preroll' ? 0 : startTime;
46
+ const restrictStr = range.clientAttributes['X-RESTRICT'] ?? '';
47
+ const restrict = parseRestrict(restrictStr);
48
+ // The ads and skip window share one (memoized) asset-list resolution.
49
+ const resolveContent = memoize(() => resolveHlsAssetContent({
50
+ range,
51
+ startTime: effectiveStartTime,
52
+ duration,
53
+ baseUrl,
54
+ }));
55
+ breaks.push({
56
+ id: range.id,
57
+ startTime: effectiveStartTime,
58
+ duration,
59
+ placement,
60
+ once: cues.has('ONCE'),
61
+ resumeOffset: parseResumeOffset(range),
62
+ resolutionTimeOffset: parseResolutionTimeOffset(range),
63
+ playoutLimit,
64
+ ads: async () => (await resolveContent()).ads,
65
+ skipControl: async () => (await resolveContent()).skipControl,
66
+ restrict,
67
+ });
68
+ }
69
+ breaks.sort((a, b) => a.startTime - b.startTime);
70
+ // Discovery is synchronous; ad assets resolve lazily via each break's
71
+ // `ads` ValueProvider. The Promise return keeps the provider-agnostic
72
+ // contract stable for future async discovery (e.g. DASH).
73
+ return Promise.resolve(breaks);
74
+ }
75
+ function findProgramDateTimeAnchor(playlist) {
76
+ let mediaTime = 0;
77
+ for (const seg of playlist.segments) {
78
+ if (seg.programDateTime) {
79
+ const epochMs = Date.parse(seg.programDateTime);
80
+ if (!Number.isNaN(epochMs)) {
81
+ return { epochMs, mediaTime };
82
+ }
83
+ }
84
+ mediaTime += seg.duration;
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Converts a range's wall-clock START-DATE to a media-timeline start time.
90
+ * Returns 0 when there is no program-date-time anchor but the start-date is
91
+ * present (best-effort pre-roll), or null when the start-date is unusable.
92
+ */
93
+ function resolveStartTime(range, anchor) {
94
+ if (!range.startDate) {
95
+ // END-ON-NEXT ranges may omit START-DATE; without an anchor we cannot
96
+ // place them, so skip.
97
+ return null;
98
+ }
99
+ const epochMs = Date.parse(range.startDate);
100
+ if (Number.isNaN(epochMs))
101
+ return null;
102
+ if (!anchor) {
103
+ // No program-date-time to correlate against. Treat as a pre-roll.
104
+ return 0;
105
+ }
106
+ const startTime = anchor.mediaTime + (epochMs - anchor.epochMs) / 1000;
107
+ // Clamp tiny negatives from clock rounding to 0.
108
+ return startTime < 0 && startTime > -ROLL_EPSILON ? 0 : startTime;
109
+ }
110
+ /**
111
+ * Determines a break's duration in seconds. Uses DURATION, else END-DATE span, else
112
+ * PLANNED-DURATION, else null.
113
+ */
114
+ function resolveDuration(range) {
115
+ if (range.duration != null && !Number.isNaN(range.duration)) {
116
+ return range.duration;
117
+ }
118
+ if (range.endDate && range.startDate) {
119
+ const start = Date.parse(range.startDate);
120
+ const end = Date.parse(range.endDate);
121
+ if (!Number.isNaN(start) && !Number.isNaN(end) && end >= start) {
122
+ return (end - start) / 1000;
123
+ }
124
+ }
125
+ if (range.plannedDuration != null && !Number.isNaN(range.plannedDuration)) {
126
+ return range.plannedDuration;
127
+ }
128
+ return null;
129
+ }
130
+ function resolvePlayoutLimit(range) {
131
+ const playoutLimit = parseFloat(range.clientAttributes['X-PLAYOUT-LIMIT'] ?? '');
132
+ if (Number.isFinite(playoutLimit) && playoutLimit > 0) {
133
+ return playoutLimit;
134
+ }
135
+ return null;
136
+ }
137
+ /**
138
+ * Tokenizes the DATERANGE `CUE` attribute, an enumerated-string list of trigger
139
+ * identifiers (e.g. `"PRE,ONCE"`), into an uppercased, trimmed Set. Unknown
140
+ * tokens are preserved but ignored by callers.
141
+ */
142
+ function parseCues(range) {
143
+ return new Set((range.clientAttributes['CUE'] ?? '')
144
+ .split(',')
145
+ .map((token) => token.trim().toUpperCase())
146
+ .filter(Boolean));
147
+ }
148
+ /**
149
+ * Parses the signed `X-RESUME-OFFSET` (seconds). Returns null when the attribute
150
+ * is absent (so the controller substitutes the actual playout duration) — a
151
+ * present value of 0 is distinct from absent and is returned as 0.
152
+ */
153
+ function parseResumeOffset(range) {
154
+ if (!('X-RESUME-OFFSET' in range.clientAttributes))
155
+ return null;
156
+ const value = parseFloat(range.clientAttributes['X-RESUME-OFFSET']);
157
+ return Number.isFinite(value) ? value : null;
158
+ }
159
+ /**
160
+ * Parses the `X-RESOLUTION-TIME-OFFSET` (seconds) — how far ahead of the break
161
+ * the client should resolve/preload its assets. Returns null when absent or not
162
+ * a finite non-negative number, so the controller falls back to its configured
163
+ * `preloadAheadTime`.
164
+ */
165
+ function parseResolutionTimeOffset(range) {
166
+ if (!('X-RESOLUTION-TIME-OFFSET' in range.clientAttributes))
167
+ return null;
168
+ const value = parseFloat(range.clientAttributes['X-RESOLUTION-TIME-OFFSET']);
169
+ return Number.isFinite(value) && value >= 0 ? value : null;
170
+ }
171
+ function classifyPlacement(startTime, contentDuration, cues) {
172
+ // PRE/POST trigger identifiers are authoritative over the proximity
173
+ // heuristic (they may fire outside the range's START-DATE/duration). PRE
174
+ // wins the illegal PRE+POST combination.
175
+ if (cues.has('PRE'))
176
+ return 'preroll';
177
+ if (cues.has('POST'))
178
+ return 'postroll';
179
+ if (startTime <= ROLL_EPSILON)
180
+ return 'preroll';
181
+ if (contentDuration != null &&
182
+ Number.isFinite(contentDuration) &&
183
+ startTime >= contentDuration - ROLL_EPSILON) {
184
+ return 'postroll';
185
+ }
186
+ return 'midroll';
187
+ }
188
+ function resolveHlsAssetContent({ range, startTime, duration, baseUrl, }) {
189
+ const assetUri = range.clientAttributes['X-ASSET-URI'];
190
+ if (assetUri) {
191
+ // A single inline asset carries no skip window.
192
+ return {
193
+ ads: [
194
+ {
195
+ id: `${range.id}-0`,
196
+ startTime,
197
+ duration,
198
+ uri: resolveUrl(assetUri, baseUrl),
199
+ },
200
+ ],
201
+ skipControl: null,
202
+ };
203
+ }
204
+ const assetListUrl = range.clientAttributes['X-ASSET-LIST'];
205
+ if (assetListUrl) {
206
+ return resolveHlsAssetList({
207
+ assetListUrl,
208
+ rangeId: range.id,
209
+ startTime,
210
+ baseUrl,
211
+ });
212
+ }
213
+ return { ads: [], skipControl: null };
214
+ }
215
+ async function resolveHlsAssetList({ assetListUrl, rangeId, startTime, baseUrl, }) {
216
+ const url = resolveUrl(assetListUrl, baseUrl);
217
+ const response = await requestWithRetry(url);
218
+ const json = await readResponseBody(response, 'json');
219
+ const assets = json.ASSETS ?? [];
220
+ const ads = assets.map((asset, i) => {
221
+ return {
222
+ id: `${rangeId}-${i}`,
223
+ startTime,
224
+ duration: asset.DURATION ?? null,
225
+ // Relative to the asset list, which need not sit alongside the
226
+ // media playlist.
227
+ uri: resolveUrl(asset.URI, url),
228
+ };
229
+ });
230
+ return { ads, skipControl: parseSkipControl(json['SKIP-CONTROL']) };
231
+ }
232
+ /**
233
+ * Maps an X-ASSET-LIST `SKIP-CONTROL` object to a {@link SkipControl}, or null
234
+ * when absent or missing a usable offset.
235
+ */
236
+ function parseSkipControl(control) {
237
+ if (!control)
238
+ return null;
239
+ const offset = Number(control.OFFSET);
240
+ if (!Number.isFinite(offset) || offset < 0)
241
+ return null;
242
+ return { offset, duration: control.DURATION ?? null };
243
+ }
244
+ function parseRestrict(str) {
245
+ const skip = str.includes('SKIP');
246
+ const jump = str.includes('JUMP');
247
+ return { skip, jump };
248
+ }
@@ -11,6 +11,12 @@ import type { MediaFormatMetadata } from '../streaming/MediaQualityMetadata';
11
11
  * indicates a stalled promise result from the license provider.
12
12
  */
13
13
  export declare const LICENSE_TIMEOUT = 90;
14
+ /**
15
+ * An excessive number of concurrent key sessions. Sessions are expected to be
16
+ * closed as tracks deactivate; a count this high signals sessions are leaking
17
+ * (never closing) rather than a legitimate playback need.
18
+ */
19
+ export declare const EXCESSIVE_SESSION_COUNT = 20;
14
20
  /**
15
21
  * Dependencies for creating DrmController.
16
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"DrmControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/drm/DrmControllerImpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DrmControllerImpl.d.ts","sourceRoot":"","sources":["../../../../src/drm/DrmControllerImpl.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import { AbortError, base64ToByteArray, buffersEqual, bufferToByteArray, clone, compareBy, createDisposer, ErrorOrigin, EventHostImpl, isSilentError, logDebug, logVerbose, memoize, noop, normalizeHeadersInit, remove, resolveValueProvider, withTimeout, } from '@amazon/vinyl-util';
5
+ import { AbortError, base64ToByteArray, buffersEqual, bufferToByteArray, clone, compareBy, createDisposer, ErrorOrigin, EventHostImpl, getUserAgentInfo, isSilentError, logDebug, logVerbose, logWarn, memoize, noop, normalizeHeadersInit, Os, remove, resolveValueProvider, withTimeout, } from '@amazon/vinyl-util';
6
6
  import { instanceOf, object } from '@amazon/vinyl-validation';
7
7
  import { DrmRobustness, } from './DrmOptions';
8
8
  import { DrmError } from './error/DrmError';
@@ -20,6 +20,12 @@ import { createFairPlaySessionInitData } from './util/createFairPlaySessionInitD
20
20
  */
21
21
  export const LICENSE_TIMEOUT = 90;
22
22
  const LICENSE_TIMEOUT_MESSAGE = 'License provider timed out after {time}s';
23
+ /**
24
+ * An excessive number of concurrent key sessions. Sessions are expected to be
25
+ * closed as tracks deactivate; a count this high signals sessions are leaking
26
+ * (never closing) rather than a legitimate playback need.
27
+ */
28
+ export const EXCESSIVE_SESSION_COUNT = 20;
23
29
  export class DrmControllerImpl extends EventHostImpl {
24
30
  deps;
25
31
  get [Symbol.toStringTag]() {
@@ -152,12 +158,18 @@ export class DrmControllerImpl extends EventHostImpl {
152
158
  else {
153
159
  const newSession = await this.createNewSession(licenseServerOptions.serverCertificate, mediaKeys, initData, initDataType, drmInfo, keySystemOptions?.initDataTransformer);
154
160
  this.sessions.push(newSession);
161
+ logVerbose(this, `total sessions: ${this.sessions.length}`);
162
+ if (this.sessions.length === EXCESSIVE_SESSION_COUNT + 1) {
163
+ logWarn(this, `${this.sessions.length} open key sessions exceeds ${EXCESSIVE_SESSION_COUNT}; sessions may be leaking (not closing on track deactivation)`);
164
+ }
155
165
  this.dispatch('sessionCreate', {
156
166
  initDataType: newSession.initDataType,
157
167
  mimeType: newSession.mimeType,
158
168
  });
159
169
  newSession.on('closed', () => this.closeSession(newSession));
160
170
  abort?.onAborted(() => {
171
+ if (this.disposed)
172
+ return;
161
173
  logDebug(this, 'abort session');
162
174
  this.closeSession(newSession);
163
175
  });
@@ -243,6 +255,16 @@ export class DrmControllerImpl extends EventHostImpl {
243
255
  }
244
256
  else if (contentType === 'audio') {
245
257
  config.audioCapabilities = [capability];
258
+ if (getUserAgentInfo().os?.name === Os.CHROME_OS) {
259
+ // Add videoCapabilities to get ChromeOS to enable verified media path
260
+ logDebug(this, 'Adding video avc1 drm capabilities for VMP');
261
+ config.videoCapabilities = [
262
+ {
263
+ contentType: `video/mp4; codecs="avc1.4d401f"`,
264
+ robustness: 'SW_SECURE_DECODE',
265
+ },
266
+ ];
267
+ }
246
268
  }
247
269
  return {
248
270
  keySystem,
@@ -41,7 +41,7 @@ export declare const defaultPlaybackControllerImplOptions: {
41
41
  * Firefox can but if the playhead reaches the end of track before the media stream is closed, an 'ended' event
42
42
  * will never fire.
43
43
  */
44
- export declare function getMinSeekableBufferDefault(): 2 | 5;
44
+ export declare function getMinSeekableBufferDefault(): 5 | 2;
45
45
  export interface PlaybackControllerImplDeps {
46
46
  readonly media: HTMLMediaElement;
47
47
  readonly loudnessNormalizationController: LoudnessNormalizationController;
@@ -0,0 +1,43 @@
1
+ export interface StallDetectorOptions {
2
+ /**
3
+ * Called when playback resumes without emitting a `playing` event (or after the detector
4
+ * revived it), so the caller can announce playback.
5
+ */
6
+ readonly fabricatePlaying: () => void;
7
+ /** Poll interval in seconds. Default: 0.25 */
8
+ readonly pollInterval?: number;
9
+ /** Seconds the play head must be frozen before recovering. Default: 0.75 */
10
+ readonly stallThreshold?: number;
11
+ /**
12
+ * Don't nudge this close to the end of buffered data; a freeze there is a
13
+ * legitimate wait for more data. Seconds. Default: 0.5
14
+ */
15
+ readonly bufferEndMargin?: number;
16
+ /** Seconds to nudge the play head forward to prod a resume. Default: 0.1 */
17
+ readonly stallSkip?: number;
18
+ /** Max recovery attempts before giving up. Default: 3 */
19
+ readonly maxAttempts?: number;
20
+ /**
21
+ * Nudge even when the playhead isn't inside a buffered range. Some WebKit versions leave a
22
+ * seek perpetually pending (no `seeked`) with a stale empty `buffered` even though data is
23
+ * appended; re-issuing the seek via a nudge can complete it. Off by default (only nudge over
24
+ * genuinely buffered data). Default: false
25
+ */
26
+ readonly nudgeUnbuffered?: boolean;
27
+ }
28
+ /**
29
+ * Watches a media element after a seek/play and drives it back into a playing state. Some WebKit
30
+ * versions stall: the play head freezes inside buffered data and playback never resumes (often with
31
+ * a stale low readyState). This polls the play head and, while the element should be advancing:
32
+ *
33
+ * - if it's frozen inside buffered data, nudges currentTime forward to prod a resume;
34
+ * - if there's no data at the playhead, waits (it's legitimately buffering, or between sources).
35
+ *
36
+ * When the play head progresses it calls {@link StallDetectorOptions.fabricatePlaying} if playback
37
+ * resumed without a `playing` event (or after the detector revived it), then stops. It also stops
38
+ * on pause/ended/emptied or after {@link StallDetectorOptions.maxAttempts}.
39
+ *
40
+ * Start it after a seek or play only when playback is intended — a paused element won't advance.
41
+ */
42
+ export declare function createStallDetector(media: HTMLMediaElement, options: StallDetectorOptions): () => void;
43
+ //# sourceMappingURL=createStallDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createStallDetector.d.ts","sourceRoot":"","sources":["../../../../src/playback/createStallDetector.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAA;IACrC,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CACrC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,oBAAoB,GAC9B,MAAM,IAAI,CAgEZ"}
@@ -0,0 +1,101 @@
1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /**
6
+ * Watches a media element after a seek/play and drives it back into a playing state. Some WebKit
7
+ * versions stall: the play head freezes inside buffered data and playback never resumes (often with
8
+ * a stale low readyState). This polls the play head and, while the element should be advancing:
9
+ *
10
+ * - if it's frozen inside buffered data, nudges currentTime forward to prod a resume;
11
+ * - if there's no data at the playhead, waits (it's legitimately buffering, or between sources).
12
+ *
13
+ * When the play head progresses it calls {@link StallDetectorOptions.fabricatePlaying} if playback
14
+ * resumed without a `playing` event (or after the detector revived it), then stops. It also stops
15
+ * on pause/ended/emptied or after {@link StallDetectorOptions.maxAttempts}.
16
+ *
17
+ * Start it after a seek or play only when playback is intended — a paused element won't advance.
18
+ */
19
+ export function createStallDetector(media, options) {
20
+ const { fabricatePlaying } = options;
21
+ const pollInterval = options.pollInterval ?? 0.25;
22
+ const stallThreshold = options.stallThreshold ?? 0.75;
23
+ const bufferEndMargin = options.bufferEndMargin ?? 0.5;
24
+ const stallSkip = options.stallSkip ?? 0.1;
25
+ const maxAttempts = options.maxAttempts ?? 3;
26
+ const nudgeUnbuffered = options.nudgeUnbuffered ?? false;
27
+ let lastTime = media.currentTime;
28
+ let stalledFor = 0;
29
+ let attempts = 0;
30
+ let sawPlaying = false;
31
+ let recovered = false;
32
+ const onPlaying = () => {
33
+ sawPlaying = true;
34
+ };
35
+ // A cleared source (track unload) means there's nothing to recover.
36
+ const onEmptied = () => stop();
37
+ media.addEventListener('playing', onPlaying);
38
+ media.addEventListener('emptied', onEmptied);
39
+ const stop = () => {
40
+ clearInterval(id);
41
+ media.removeEventListener('playing', onPlaying);
42
+ media.removeEventListener('emptied', onEmptied);
43
+ };
44
+ const id = setInterval(() => {
45
+ // Only a playing element is expected to advance.
46
+ if (media.paused || media.ended)
47
+ return stop();
48
+ if (media.currentTime !== lastTime) {
49
+ lastTime = media.currentTime;
50
+ // Progressing. Announce playback if it resumed without a `playing`
51
+ // event, or if the detector had to revive it (a prior `playing` was
52
+ // cleared by the intervening stall).
53
+ if (!sawPlaying || recovered)
54
+ fabricatePlaying();
55
+ return stop();
56
+ }
57
+ // Frozen. Recover only over buffered data; otherwise it's legitimately
58
+ // waiting to buffer (or between sources) and nudging can disrupt
59
+ // loading — except on platforms whose `buffered` is unreliable here
60
+ // ({@link nudgeUnbuffered}), where re-issuing the seek is the recovery.
61
+ if (!nudgeUnbuffered && !withinBufferedData(media, bufferEndMargin)) {
62
+ stalledFor = 0;
63
+ return;
64
+ }
65
+ stalledFor += pollInterval;
66
+ if (stalledFor < stallThreshold)
67
+ return;
68
+ stalledFor = 0;
69
+ if (attempts++ >= maxAttempts)
70
+ return stop();
71
+ recovered = true;
72
+ // Data is buffered at the playhead — a small nudge prods a resume.
73
+ // (iOS can sit here reporting a stale low readyState even though the
74
+ // range around the playhead is buffered.)
75
+ media.currentTime += stallSkip;
76
+ lastTime = media.currentTime;
77
+ }, pollInterval * 1000);
78
+ return stop;
79
+ }
80
+ /**
81
+ * True when the play head sits inside a buffered range, clear of its end by
82
+ * {@link endMargin} — i.e. there is data to keep playing.
83
+ *
84
+ * A range that ends at the end of the media is treated as nudgeable up to its
85
+ * end: no more data is coming, so a freeze there is a stuck end-of-track (seen
86
+ * on progressive `src` tracks), and a nudge pushes the element to `ended`.
87
+ */
88
+ function withinBufferedData(media, endMargin) {
89
+ const t = media.currentTime;
90
+ const duration = media.duration;
91
+ const buffered = media.buffered;
92
+ for (let i = 0; i < buffered.length; i++) {
93
+ const end = buffered.end(i);
94
+ const isEndOfMedia = Number.isFinite(duration) &&
95
+ duration > 0 &&
96
+ end >= duration - endMargin;
97
+ if (t >= buffered.start(i) && (t < end - endMargin || isEndOfMedia))
98
+ return true;
99
+ }
100
+ return false;
101
+ }