@editframe/elements 0.16.8-beta.0 → 0.18.3-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +30 -0
  2. package/dist/DecoderResetFrequency.test.d.ts +1 -0
  3. package/dist/DecoderResetRecovery.test.d.ts +1 -0
  4. package/dist/DelayedLoadingState.d.ts +48 -0
  5. package/dist/DelayedLoadingState.integration.test.d.ts +1 -0
  6. package/dist/DelayedLoadingState.js +113 -0
  7. package/dist/DelayedLoadingState.test.d.ts +1 -0
  8. package/dist/EF_FRAMEGEN.d.ts +10 -1
  9. package/dist/EF_FRAMEGEN.js +199 -179
  10. package/dist/EF_INTERACTIVE.js +2 -6
  11. package/dist/EF_RENDERING.js +1 -3
  12. package/dist/LoadingDebounce.test.d.ts +1 -0
  13. package/dist/LoadingIndicator.browsertest.d.ts +0 -0
  14. package/dist/ManualScrubTest.test.d.ts +1 -0
  15. package/dist/ScrubResolvedFlashing.test.d.ts +1 -0
  16. package/dist/ScrubTrackManager.d.ts +96 -0
  17. package/dist/ScrubTrackManager.test.d.ts +1 -0
  18. package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
  19. package/dist/VideoStuckDiagnostic.test.d.ts +1 -0
  20. package/dist/elements/CrossUpdateController.js +13 -15
  21. package/dist/elements/EFAudio.browsertest.d.ts +0 -0
  22. package/dist/elements/EFAudio.d.ts +22 -3
  23. package/dist/elements/EFAudio.js +60 -43
  24. package/dist/elements/EFCaptions.js +337 -373
  25. package/dist/elements/EFImage.d.ts +1 -0
  26. package/dist/elements/EFImage.js +73 -91
  27. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
  28. package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
  29. package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +1 -0
  30. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +47 -0
  31. package/dist/elements/EFMedia/AssetMediaEngine.js +116 -0
  32. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
  33. package/dist/elements/EFMedia/BaseMediaEngine.js +96 -0
  34. package/dist/elements/EFMedia/BaseMediaEngine.test.d.ts +1 -0
  35. package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +1 -0
  36. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
  37. package/dist/elements/EFMedia/BufferedSeekingInput.js +159 -0
  38. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  39. package/dist/elements/EFMedia/JitMediaEngine.d.ts +31 -0
  40. package/dist/elements/EFMedia/JitMediaEngine.js +62 -0
  41. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +9 -0
  42. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +16 -0
  43. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +48 -0
  44. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +3 -0
  45. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +138 -0
  46. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +9 -0
  47. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +4 -0
  48. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +16 -0
  49. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +9 -0
  50. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +3 -0
  51. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +22 -0
  52. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
  53. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +24 -0
  54. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
  55. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +18 -0
  56. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
  57. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +16 -0
  58. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
  59. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +104 -0
  60. package/dist/elements/EFMedia/services/AudioElementFactory.browsertest.d.ts +1 -0
  61. package/dist/elements/EFMedia/services/AudioElementFactory.d.ts +22 -0
  62. package/dist/elements/EFMedia/services/AudioElementFactory.js +72 -0
  63. package/dist/elements/EFMedia/services/MediaSourceService.browsertest.d.ts +1 -0
  64. package/dist/elements/EFMedia/services/MediaSourceService.d.ts +47 -0
  65. package/dist/elements/EFMedia/services/MediaSourceService.js +73 -0
  66. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +7 -0
  67. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +54 -0
  68. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +70 -0
  69. package/dist/elements/EFMedia/shared/BufferUtils.js +89 -0
  70. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +23 -0
  71. package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +1 -0
  72. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
  73. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +1 -0
  74. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
  75. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
  76. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts +1 -0
  77. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.d.ts +9 -0
  78. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +16 -0
  79. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +46 -0
  80. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.d.ts +9 -0
  81. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.d.ts +4 -0
  82. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js +16 -0
  83. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.d.ts +9 -0
  84. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.d.ts +3 -0
  85. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.js +27 -0
  86. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.d.ts +7 -0
  87. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +25 -0
  88. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.d.ts +9 -0
  89. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.d.ts +4 -0
  90. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +18 -0
  91. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.d.ts +9 -0
  92. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.d.ts +4 -0
  93. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +16 -0
  94. package/dist/elements/EFMedia.browsertest.d.ts +1 -0
  95. package/dist/elements/EFMedia.d.ts +95 -66
  96. package/dist/elements/EFMedia.js +204 -683
  97. package/dist/elements/EFSourceMixin.js +31 -48
  98. package/dist/elements/EFTemporal.d.ts +2 -1
  99. package/dist/elements/EFTemporal.js +266 -360
  100. package/dist/elements/EFTimegroup.d.ts +14 -1
  101. package/dist/elements/EFTimegroup.js +337 -323
  102. package/dist/elements/EFVideo.browsertest.d.ts +0 -0
  103. package/dist/elements/EFVideo.d.ts +123 -4
  104. package/dist/elements/EFVideo.js +308 -111
  105. package/dist/elements/EFWaveform.js +375 -411
  106. package/dist/elements/FetchMixin.js +14 -24
  107. package/dist/elements/MediaController.d.ts +30 -0
  108. package/dist/elements/SampleBuffer.d.ts +14 -0
  109. package/dist/elements/SampleBuffer.js +52 -0
  110. package/dist/elements/TargetController.js +130 -156
  111. package/dist/elements/TimegroupController.js +17 -19
  112. package/dist/elements/durationConverter.js +15 -4
  113. package/dist/elements/parseTimeToMs.js +4 -10
  114. package/dist/elements/printTaskStatus.d.ts +2 -0
  115. package/dist/elements/updateAnimations.js +39 -59
  116. package/dist/getRenderInfo.d.ts +2 -2
  117. package/dist/getRenderInfo.js +59 -67
  118. package/dist/gui/ContextMixin.js +150 -288
  119. package/dist/gui/EFConfiguration.js +27 -43
  120. package/dist/gui/EFFilmstrip.d.ts +3 -3
  121. package/dist/gui/EFFilmstrip.js +440 -620
  122. package/dist/gui/EFFitScale.d.ts +2 -2
  123. package/dist/gui/EFFitScale.js +112 -135
  124. package/dist/gui/EFFocusOverlay.js +45 -61
  125. package/dist/gui/EFPreview.js +30 -49
  126. package/dist/gui/EFScrubber.js +78 -99
  127. package/dist/gui/EFTimeDisplay.js +49 -70
  128. package/dist/gui/EFToggleLoop.js +17 -34
  129. package/dist/gui/EFTogglePlay.js +37 -58
  130. package/dist/gui/EFWorkbench.js +66 -88
  131. package/dist/gui/TWMixin.js +2 -48
  132. package/dist/gui/TWMixin2.js +31 -0
  133. package/dist/gui/efContext.js +2 -6
  134. package/dist/gui/fetchContext.js +1 -3
  135. package/dist/gui/focusContext.js +1 -3
  136. package/dist/gui/focusedElementContext.js +2 -6
  137. package/dist/gui/playingContext.js +1 -4
  138. package/dist/gui/services/ElementConnectionManager.browsertest.d.ts +1 -0
  139. package/dist/gui/services/ElementConnectionManager.d.ts +59 -0
  140. package/dist/gui/services/ElementConnectionManager.js +128 -0
  141. package/dist/gui/services/PlaybackController.browsertest.d.ts +1 -0
  142. package/dist/gui/services/PlaybackController.d.ts +103 -0
  143. package/dist/gui/services/PlaybackController.js +290 -0
  144. package/dist/index.js +5 -30
  145. package/dist/msToTimeCode.js +11 -13
  146. package/dist/services/MediaSourceManager.d.ts +62 -0
  147. package/dist/services/MediaSourceManager.js +211 -0
  148. package/dist/style.css +2 -1
  149. package/dist/transcoding/cache/CacheManager.d.ts +73 -0
  150. package/dist/transcoding/cache/RequestDeduplicator.d.ts +29 -0
  151. package/dist/transcoding/cache/RequestDeduplicator.js +53 -0
  152. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +1 -0
  153. package/dist/transcoding/types/index.d.ts +242 -0
  154. package/dist/transcoding/utils/MediaUtils.d.ts +9 -0
  155. package/dist/transcoding/utils/UrlGenerator.d.ts +26 -0
  156. package/dist/transcoding/utils/UrlGenerator.js +45 -0
  157. package/dist/transcoding/utils/constants.d.ts +27 -0
  158. package/dist/utils/LRUCache.d.ts +34 -0
  159. package/dist/utils/LRUCache.js +115 -0
  160. package/package.json +4 -3
  161. package/src/elements/EFAudio.browsertest.ts +709 -0
  162. package/src/elements/EFAudio.ts +59 -15
  163. package/src/elements/EFCaptions.browsertest.ts +0 -1
  164. package/src/elements/EFImage.browsertest.ts +42 -1
  165. package/src/elements/EFImage.ts +23 -3
  166. package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +222 -0
  167. package/src/elements/EFMedia/AssetIdMediaEngine.ts +70 -0
  168. package/src/elements/EFMedia/AssetMediaEngine.ts +210 -0
  169. package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
  170. package/src/elements/EFMedia/BaseMediaEngine.ts +170 -0
  171. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +400 -0
  172. package/src/elements/EFMedia/BufferedSeekingInput.ts +267 -0
  173. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
  174. package/src/elements/EFMedia/JitMediaEngine.ts +110 -0
  175. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +554 -0
  176. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +81 -0
  177. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +241 -0
  178. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +59 -0
  179. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +23 -0
  180. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +55 -0
  181. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +35 -0
  182. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +42 -0
  183. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +34 -0
  184. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +23 -0
  185. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +174 -0
  186. package/src/elements/EFMedia/services/AudioElementFactory.browsertest.ts +325 -0
  187. package/src/elements/EFMedia/services/AudioElementFactory.ts +119 -0
  188. package/src/elements/EFMedia/services/MediaSourceService.browsertest.ts +257 -0
  189. package/src/elements/EFMedia/services/MediaSourceService.ts +102 -0
  190. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +128 -0
  191. package/src/elements/EFMedia/shared/BufferUtils.ts +310 -0
  192. package/src/elements/EFMedia/shared/MediaTaskUtils.ts +44 -0
  193. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +247 -0
  194. package/src/elements/EFMedia/shared/RenditionHelpers.ts +79 -0
  195. package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +128 -0
  196. package/src/elements/EFMedia/tasks/makeMediaEngineTask.test.ts +233 -0
  197. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +89 -0
  198. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.ts +555 -0
  199. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +79 -0
  200. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.ts +59 -0
  201. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.ts +23 -0
  202. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.ts +55 -0
  203. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.ts +45 -0
  204. package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +44 -0
  205. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
  206. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +32 -0
  207. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
  208. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +23 -0
  209. package/src/elements/EFMedia.browsertest.ts +696 -271
  210. package/src/elements/EFMedia.ts +218 -776
  211. package/src/elements/EFTemporal.browsertest.ts +0 -1
  212. package/src/elements/EFTemporal.ts +13 -3
  213. package/src/elements/EFTimegroup.browsertest.ts +6 -3
  214. package/src/elements/EFTimegroup.ts +221 -27
  215. package/src/elements/EFVideo.browsertest.ts +758 -0
  216. package/src/elements/EFVideo.ts +418 -68
  217. package/src/elements/EFWaveform.ts +5 -5
  218. package/src/elements/MediaController.ts +98 -0
  219. package/src/elements/SampleBuffer.ts +97 -0
  220. package/src/elements/printTaskStatus.ts +16 -0
  221. package/src/elements/updateAnimations.ts +6 -0
  222. package/src/gui/ContextMixin.ts +23 -104
  223. package/src/gui/TWMixin.ts +10 -3
  224. package/src/gui/services/ElementConnectionManager.browsertest.ts +263 -0
  225. package/src/gui/services/ElementConnectionManager.ts +224 -0
  226. package/src/gui/services/PlaybackController.browsertest.ts +437 -0
  227. package/src/gui/services/PlaybackController.ts +521 -0
  228. package/src/services/MediaSourceManager.ts +333 -0
  229. package/src/transcoding/cache/CacheManager.ts +208 -0
  230. package/src/transcoding/cache/RequestDeduplicator.test.ts +170 -0
  231. package/src/transcoding/cache/RequestDeduplicator.ts +65 -0
  232. package/src/transcoding/types/index.ts +265 -0
  233. package/src/transcoding/utils/MediaUtils.ts +63 -0
  234. package/src/transcoding/utils/UrlGenerator.ts +68 -0
  235. package/src/transcoding/utils/constants.ts +36 -0
  236. package/src/utils/LRUCache.ts +153 -0
  237. package/test/EFVideo.framegen.browsertest.ts +127 -0
  238. package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/data.bin +0 -0
  239. package/test/__cache__/GET__api_v1_transcode_audio_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__32da3954ba60c96ad732020c65a08ebc/metadata.json +21 -0
  240. package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/data.bin +0 -0
  241. package/test/__cache__/GET__api_v1_transcode_audio_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__b0b2b07efcf607de8ee0f650328c32f7/metadata.json +21 -0
  242. package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/data.bin +0 -0
  243. package/test/__cache__/GET__api_v1_transcode_audio_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a75c2252b542e0c152c780e9a8d7b154/metadata.json +21 -0
  244. package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/data.bin +0 -0
  245. package/test/__cache__/GET__api_v1_transcode_audio_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a64ff1cfb1b52cae14df4b5dfa1e222b/metadata.json +21 -0
  246. package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/data.bin +0 -0
  247. package/test/__cache__/GET__api_v1_transcode_audio_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__91e8a522f950809b9f09f4173113b4b0/metadata.json +21 -0
  248. package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/data.bin +0 -0
  249. package/test/__cache__/GET__api_v1_transcode_audio_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__e66d2c831d951e74ad0aeaa6489795d0/metadata.json +21 -0
  250. package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/data.bin +0 -0
  251. package/test/__cache__/GET__api_v1_transcode_high_1_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__26197f6f7c46cacb0a71134131c3f775/metadata.json +21 -0
  252. package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/data.bin +0 -0
  253. package/test/__cache__/GET__api_v1_transcode_high_2_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__4cb6774cd3650ccf59c8f8dc6678c0b9/metadata.json +21 -0
  254. package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/data.bin +0 -0
  255. package/test/__cache__/GET__api_v1_transcode_high_3_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0b3b2b1c8933f7fcf8a9ecaa88d58b41/metadata.json +21 -0
  256. package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/data.bin +0 -0
  257. package/test/__cache__/GET__api_v1_transcode_high_init_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__0798c479b44aaeef850609a430f6e613/metadata.json +21 -0
  258. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -0
  259. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +19 -0
  260. package/test/createJitTestClips.ts +425 -0
  261. package/test/recordReplayProxyPlugin.js +302 -0
  262. package/test/useAssetMSW.ts +49 -0
  263. package/test/useMSW.ts +44 -0
  264. package/types.json +1 -1
  265. package/dist/gui/TWMixin.css.js +0 -4
  266. /package/dist/elements/{TargetController.test.d.ts → TargetController.browsertest.d.ts} +0 -0
  267. /package/src/elements/{TargetController.test.ts → TargetController.browsertest.ts} +0 -0
@@ -9,6 +9,7 @@ export declare class EFImage extends EFImage_base {
9
9
  set assetId(value: string | null);
10
10
  get assetId(): string | null;
11
11
  render(): import('lit-html').TemplateResult<1>;
12
+ private isDirectUrl;
12
13
  assetPath(): string;
13
14
  get hasOwnDuration(): boolean;
14
15
  fetchImage: Task<readonly [string, typeof fetch], void>;
@@ -1,104 +1,86 @@
1
- import { Task } from "@lit/task";
2
- import { LitElement, html, css } from "lit";
3
- import { property, customElement } from "lit/decorators.js";
4
- import { createRef, ref } from "lit/directives/ref.js";
5
1
  import { EF_INTERACTIVE } from "../EF_INTERACTIVE.js";
6
2
  import { EFSourceMixin } from "./EFSourceMixin.js";
7
3
  import { EFTemporal } from "./EFTemporal.js";
8
4
  import { FetchMixin } from "./FetchMixin.js";
9
- var __defProp = Object.defineProperty;
10
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
- var __typeError = (msg) => {
12
- throw TypeError(msg);
13
- };
14
- var __decorateClass = (decorators, target, key, kind) => {
15
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
16
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
17
- if (decorator = decorators[i])
18
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
19
- if (kind && result) __defProp(target, key, result);
20
- return result;
21
- };
22
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
23
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
24
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
25
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
26
- var _assetId;
27
- let EFImage = class extends EFTemporal(
28
- EFSourceMixin(FetchMixin(LitElement), {
29
- assetType: "image_files"
30
- })
31
- ) {
32
- constructor() {
33
- super(...arguments);
34
- this.imageRef = createRef();
35
- this.canvasRef = createRef();
36
- __privateAdd(this, _assetId, null);
37
- this.fetchImage = new Task(this, {
38
- autoRun: EF_INTERACTIVE,
39
- args: () => [this.assetPath(), this.fetch],
40
- task: async ([assetPath, fetch], { signal }) => {
41
- const response = await fetch(assetPath, { signal });
42
- const image = new Image();
43
- image.src = URL.createObjectURL(await response.blob());
44
- await new Promise((resolve) => {
45
- image.onload = resolve;
46
- });
47
- if (!this.canvasRef.value) throw new Error("Canvas not ready");
48
- const ctx = this.canvasRef.value.getContext("2d");
49
- if (!ctx) throw new Error("Canvas 2d context not ready");
50
- this.canvasRef.value.width = image.width;
51
- this.canvasRef.value.height = image.height;
52
- ctx.drawImage(image, 0, 0);
53
- }
54
- });
55
- this.frameTask = new Task(this, {
56
- autoRun: EF_INTERACTIVE,
57
- args: () => [this.fetchImage.status],
58
- task: async () => {
59
- await this.fetchImage.taskComplete;
60
- }
61
- });
62
- }
63
- set assetId(value) {
64
- __privateSet(this, _assetId, value);
65
- }
66
- get assetId() {
67
- return __privateGet(this, _assetId) ?? this.getAttribute("asset-id");
68
- }
69
- render() {
70
- return html`<canvas ${ref(this.canvasRef)}></canvas>`;
71
- }
72
- assetPath() {
73
- if (this.assetId) {
74
- return `${this.apiHost}/api/v1/image_files/${this.assetId}`;
75
- }
76
- return `/@ef-image/${this.src}`;
77
- }
78
- get hasOwnDuration() {
79
- return this.hasExplicitDuration;
80
- }
81
- };
82
- _assetId = /* @__PURE__ */ new WeakMap();
83
- EFImage.styles = [
84
- css`
5
+ import { Task } from "@lit/task";
6
+ import { LitElement, css, html } from "lit";
7
+ import { customElement, property } from "lit/decorators.js";
8
+ import _decorate from "@oxc-project/runtime/helpers/decorate";
9
+ import { createRef, ref } from "lit/directives/ref.js";
10
+ let EFImage = class EFImage$1 extends EFTemporal(EFSourceMixin(FetchMixin(LitElement), { assetType: "image_files" })) {
11
+ constructor(..._args) {
12
+ super(..._args);
13
+ this.imageRef = createRef();
14
+ this.canvasRef = createRef();
15
+ this.fetchImage = new Task(this, {
16
+ autoRun: EF_INTERACTIVE,
17
+ args: () => [this.assetPath(), this.fetch],
18
+ task: async ([assetPath, fetch], { signal }) => {
19
+ if (this.isDirectUrl(assetPath)) return;
20
+ const response = await fetch(assetPath, { signal });
21
+ const image = new Image();
22
+ image.src = URL.createObjectURL(await response.blob());
23
+ await new Promise((resolve, reject) => {
24
+ image.onload = resolve;
25
+ image.onerror = reject;
26
+ });
27
+ if (!this.canvasRef.value) throw new Error("Canvas not ready");
28
+ const ctx = this.canvasRef.value.getContext("2d");
29
+ if (!ctx) throw new Error("Canvas 2d context not ready");
30
+ this.canvasRef.value.width = image.width;
31
+ this.canvasRef.value.height = image.height;
32
+ ctx.drawImage(image, 0, 0);
33
+ }
34
+ });
35
+ this.frameTask = new Task(this, {
36
+ autoRun: EF_INTERACTIVE,
37
+ args: () => [this.fetchImage.status],
38
+ task: async () => {
39
+ await this.fetchImage.taskComplete;
40
+ }
41
+ });
42
+ }
43
+ static {
44
+ this.styles = [css`
85
45
  :host {
86
46
  display: block;
87
47
  display: flex;
88
48
  align-items: center;
89
49
  justify-content: center;
90
50
  }
91
- canvas {
51
+ canvas, img {
92
52
  all: inherit;
93
53
  }
94
- `
95
- ];
96
- __decorateClass([
97
- property({ type: String, attribute: "asset-id", reflect: true })
98
- ], EFImage.prototype, "assetId", 1);
99
- EFImage = __decorateClass([
100
- customElement("ef-image")
101
- ], EFImage);
102
- export {
103
- EFImage
54
+ `];
55
+ }
56
+ #assetId = null;
57
+ set assetId(value) {
58
+ this.#assetId = value;
59
+ }
60
+ get assetId() {
61
+ return this.#assetId ?? this.getAttribute("asset-id");
62
+ }
63
+ render() {
64
+ const assetPath = this.assetPath();
65
+ const isDirectUrl = this.isDirectUrl(assetPath);
66
+ return isDirectUrl ? html`<img ${ref(this.imageRef)} src=${assetPath} />` : html`<canvas ${ref(this.canvasRef)}></canvas>`;
67
+ }
68
+ isDirectUrl(src) {
69
+ return src.startsWith("http://") || src.startsWith("https://");
70
+ }
71
+ assetPath() {
72
+ if (this.assetId) return `${this.apiHost}/api/v1/image_files/${this.assetId}`;
73
+ if (this.isDirectUrl(this.src)) return this.src;
74
+ return `/@ef-image/${this.src}`;
75
+ }
76
+ get hasOwnDuration() {
77
+ return this.hasExplicitDuration;
78
+ }
104
79
  };
80
+ _decorate([property({
81
+ type: String,
82
+ attribute: "asset-id",
83
+ reflect: true
84
+ })], EFImage.prototype, "assetId", null);
85
+ EFImage = _decorate([customElement("ef-image")], EFImage);
86
+ export { EFImage };
@@ -0,0 +1,18 @@
1
+ import { TrackFragmentIndex } from '../../../../assets/src/index.ts';
2
+ import { InitSegmentPaths, MediaEngine } from '../../transcoding/types';
3
+ import { UrlGenerator } from '../../transcoding/utils/UrlGenerator';
4
+ import { EFMedia } from '../EFMedia';
5
+ import { AssetMediaEngine } from './AssetMediaEngine';
6
+ export declare class AssetIdMediaEngine extends AssetMediaEngine implements MediaEngine {
7
+ assetId: string;
8
+ private apiHost;
9
+ static fetchByAssetId(host: EFMedia, _urlGenerator: UrlGenerator, assetId: string, apiHost: string): Promise<AssetIdMediaEngine>;
10
+ constructor(host: EFMedia, assetId: string, data: Record<number, TrackFragmentIndex>, apiHost: string);
11
+ get initSegmentPaths(): InitSegmentPaths;
12
+ get templates(): {
13
+ initSegment: string;
14
+ mediaSegment: string;
15
+ };
16
+ buildInitSegmentUrl(trackId: number): string;
17
+ buildMediaSegmentUrl(trackId: number, _segmentId: number): string;
18
+ }
@@ -0,0 +1,41 @@
1
+ import { AssetMediaEngine } from "./AssetMediaEngine.js";
2
+ var AssetIdMediaEngine = class AssetIdMediaEngine extends AssetMediaEngine {
3
+ static async fetchByAssetId(host, _urlGenerator, assetId, apiHost) {
4
+ const url = `${apiHost}/api/v1/isobmff_files/${assetId}/index`;
5
+ const response = await host.fetch(url);
6
+ const data = await response.json();
7
+ return new AssetIdMediaEngine(host, assetId, data, apiHost);
8
+ }
9
+ constructor(host, assetId, data, apiHost) {
10
+ super(host, assetId, data);
11
+ this.assetId = assetId;
12
+ this.apiHost = apiHost;
13
+ }
14
+ get initSegmentPaths() {
15
+ const paths = {};
16
+ if (this.audioTrackIndex !== void 0) paths.audio = {
17
+ path: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${this.audioTrackIndex.track}`,
18
+ pos: this.audioTrackIndex.initSegment.offset,
19
+ size: this.audioTrackIndex.initSegment.size
20
+ };
21
+ if (this.videoTrackIndex !== void 0) paths.video = {
22
+ path: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${this.videoTrackIndex.track}`,
23
+ pos: this.videoTrackIndex.initSegment.offset,
24
+ size: this.videoTrackIndex.initSegment.size
25
+ };
26
+ return paths;
27
+ }
28
+ get templates() {
29
+ return {
30
+ initSegment: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/{trackId}`,
31
+ mediaSegment: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/{trackId}`
32
+ };
33
+ }
34
+ buildInitSegmentUrl(trackId) {
35
+ return `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${trackId}`;
36
+ }
37
+ buildMediaSegmentUrl(trackId, _segmentId) {
38
+ return `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${trackId}`;
39
+ }
40
+ };
41
+ export { AssetIdMediaEngine };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import { TrackFragmentIndex } from '../../../../assets/src/index.ts';
2
+ import { AudioRendition, InitSegmentPaths, MediaEngine, SegmentTimeRange } from '../../transcoding/types';
3
+ import { UrlGenerator } from '../../transcoding/utils/UrlGenerator';
4
+ import { EFMedia } from '../EFMedia';
5
+ import { BaseMediaEngine } from './BaseMediaEngine';
6
+ export declare class AssetMediaEngine extends BaseMediaEngine implements MediaEngine {
7
+ host: EFMedia;
8
+ src: string;
9
+ protected data: Record<number, TrackFragmentIndex>;
10
+ static fetch(host: EFMedia, urlGenerator: UrlGenerator, src: string): Promise<AssetMediaEngine>;
11
+ durationMs: number;
12
+ constructor(host: EFMedia, src: string, data: Record<number, TrackFragmentIndex>);
13
+ get audioTrackIndex(): import('../../../../assets/src/index.ts').AudioTrackFragmentIndex | undefined;
14
+ get videoTrackIndex(): import('../../../../assets/src/index.ts').VideoTrackFragmentIndex | undefined;
15
+ get videoRendition(): {
16
+ trackId: number | undefined;
17
+ src: string;
18
+ startTimeOffsetMs: number | undefined;
19
+ };
20
+ get audioRendition(): {
21
+ trackId: number | undefined;
22
+ src: string;
23
+ };
24
+ get initSegmentPaths(): InitSegmentPaths;
25
+ get templates(): {
26
+ initSegment: string;
27
+ mediaSegment: string;
28
+ };
29
+ buildInitSegmentUrl(trackId: number): string;
30
+ buildMediaSegmentUrl(trackId: number, segmentId: number): string;
31
+ fetchInitSegment(rendition: {
32
+ trackId: number | undefined;
33
+ src: string;
34
+ }, signal: AbortSignal): Promise<ArrayBuffer>;
35
+ fetchMediaSegmentImpl(segmentId: number, rendition: {
36
+ trackId: number | undefined;
37
+ src: string;
38
+ }, signal?: AbortSignal): Promise<ArrayBuffer>;
39
+ /**
40
+ * Calculate audio segments for variable-duration segments using track fragment index
41
+ */
42
+ calculateAudioSegmentRange(fromMs: number, toMs: number, rendition: AudioRendition, _durationMs: number): SegmentTimeRange[];
43
+ computeSegmentId(desiredSeekTimeMs: number, rendition: {
44
+ trackId: number | undefined;
45
+ src: string;
46
+ }): number;
47
+ }
@@ -0,0 +1,116 @@
1
+ import { BaseMediaEngine } from "./BaseMediaEngine.js";
2
+ var AssetMediaEngine = class AssetMediaEngine extends BaseMediaEngine {
3
+ static async fetch(host, urlGenerator, src) {
4
+ const url = urlGenerator.generateTrackFragmentIndexUrl(src);
5
+ const response = await host.fetch(url);
6
+ const data = await response.json();
7
+ if (src.startsWith("/")) src = src.slice(1);
8
+ return new AssetMediaEngine(host, src, data);
9
+ }
10
+ constructor(host, src, data) {
11
+ super();
12
+ this.host = host;
13
+ this.src = src;
14
+ this.data = data;
15
+ const longestFragment = Object.values(data).reduce((max, fragment) => Math.max(max, fragment.duration / fragment.timescale), 0);
16
+ this.durationMs = longestFragment * 1e3;
17
+ }
18
+ get audioTrackIndex() {
19
+ return Object.values(this.data).find((track) => track.type === "audio");
20
+ }
21
+ get videoTrackIndex() {
22
+ return Object.values(this.data).find((track) => track.type === "video");
23
+ }
24
+ get videoRendition() {
25
+ return {
26
+ trackId: this.videoTrackIndex?.track,
27
+ src: this.src,
28
+ startTimeOffsetMs: this.videoTrackIndex?.startTimeOffsetMs
29
+ };
30
+ }
31
+ get audioRendition() {
32
+ return {
33
+ trackId: this.audioTrackIndex?.track,
34
+ src: this.src
35
+ };
36
+ }
37
+ get initSegmentPaths() {
38
+ const paths = {};
39
+ if (this.audioTrackIndex !== void 0) paths.audio = {
40
+ path: `@ef-track/${this.audioTrackIndex.track}.m4s`,
41
+ pos: this.audioTrackIndex.initSegment.offset,
42
+ size: this.audioTrackIndex.initSegment.size
43
+ };
44
+ if (this.videoTrackIndex !== void 0) paths.video = {
45
+ path: `/@ef-track/${this.videoTrackIndex.track}.m4s`,
46
+ pos: this.videoTrackIndex.initSegment.offset,
47
+ size: this.videoTrackIndex.initSegment.size
48
+ };
49
+ return paths;
50
+ }
51
+ get templates() {
52
+ return {
53
+ initSegment: "/@ef-track/{src}?trackId={trackId}",
54
+ mediaSegment: "/@ef-track/{src}?trackId={trackId}"
55
+ };
56
+ }
57
+ buildInitSegmentUrl(trackId) {
58
+ return `/@ef-track/${this.src}?trackId=${trackId}`;
59
+ }
60
+ buildMediaSegmentUrl(trackId, segmentId) {
61
+ return `/@ef-track/${this.src}?trackId=${trackId}&segmentId=${segmentId}`;
62
+ }
63
+ async fetchInitSegment(rendition, signal) {
64
+ if (!rendition.trackId) throw new Error("Track ID is required for asset metadata");
65
+ const url = this.buildInitSegmentUrl(rendition.trackId);
66
+ const initSegment = this.data[rendition.trackId]?.initSegment;
67
+ if (!initSegment) throw new Error("Init segment not found");
68
+ const headers = { Range: `bytes=${initSegment.offset}-${initSegment.offset + initSegment.size - 1}` };
69
+ return this.fetchMediaCacheWithHeaders(url, headers, signal);
70
+ }
71
+ async fetchMediaSegmentImpl(segmentId, rendition, signal) {
72
+ if (!rendition.trackId) throw new Error("Track ID is required for asset metadata");
73
+ if (segmentId === void 0) throw new Error("Segment ID is not available");
74
+ const url = this.buildMediaSegmentUrl(rendition.trackId, segmentId);
75
+ const mediaSegment = this.data[rendition.trackId]?.segments[segmentId];
76
+ if (!mediaSegment) throw new Error("Media segment not found");
77
+ const headers = { Range: `bytes=${mediaSegment.offset}-${mediaSegment.offset + mediaSegment.size - 1}` };
78
+ return this.fetchMediaCacheWithHeaders(url, headers, signal);
79
+ }
80
+ /**
81
+ * Calculate audio segments for variable-duration segments using track fragment index
82
+ */
83
+ calculateAudioSegmentRange(fromMs, toMs, rendition, _durationMs) {
84
+ if (fromMs >= toMs || !rendition.trackId) return [];
85
+ const track = this.data[rendition.trackId];
86
+ if (!track) return [];
87
+ const { timescale, segments } = track;
88
+ const segmentRanges = [];
89
+ for (let i = 0; i < segments.length; i++) {
90
+ const segment = segments[i];
91
+ const segmentStartTime = segment.cts;
92
+ const segmentEndTime = segment.cts + segment.duration;
93
+ const segmentStartMs = segmentStartTime / timescale * 1e3;
94
+ const segmentEndMs = segmentEndTime / timescale * 1e3;
95
+ if (segmentStartMs < toMs && segmentEndMs > fromMs) segmentRanges.push({
96
+ segmentId: i,
97
+ startMs: segmentStartMs,
98
+ endMs: segmentEndMs
99
+ });
100
+ }
101
+ return segmentRanges;
102
+ }
103
+ computeSegmentId(desiredSeekTimeMs, rendition) {
104
+ if (!rendition.trackId) throw new Error("Track ID is required for asset metadata");
105
+ const track = this.data[rendition.trackId];
106
+ if (!track) throw new Error("Track not found");
107
+ const { timescale, segments } = track;
108
+ const desiredSeekTime = desiredSeekTimeMs / 1e3 * timescale;
109
+ for (let i = segments.length - 1; i >= 0; i--) {
110
+ const segment = segments[i];
111
+ if (segment.cts <= desiredSeekTime) return i;
112
+ }
113
+ return 0;
114
+ }
115
+ };
116
+ export { AssetMediaEngine };
@@ -0,0 +1,55 @@
1
+ import { AudioRendition, SegmentTimeRange, VideoRendition } from '../../transcoding/types';
2
+ import { EFMedia } from '../EFMedia.js';
3
+ export declare abstract class BaseMediaEngine {
4
+ private requestDeduplicator;
5
+ abstract get videoRendition(): VideoRendition | undefined;
6
+ abstract get audioRendition(): AudioRendition | undefined;
7
+ abstract get host(): EFMedia;
8
+ getVideoRendition(): VideoRendition;
9
+ getAudioRendition(): AudioRendition;
10
+ /**
11
+ * Generate cache key for segment requests
12
+ */
13
+ private getSegmentCacheKey;
14
+ /**
15
+ * Abstract method for actual segment fetching - implemented by subclasses
16
+ */
17
+ abstract fetchMediaSegmentImpl(segmentId: number, rendition: {
18
+ trackId: number | undefined;
19
+ src: string;
20
+ }): Promise<ArrayBuffer>;
21
+ /**
22
+ * Fetch media segment with built-in deduplication
23
+ * Eliminates the need for separate coordinators - cleaner architecture
24
+ */
25
+ fetchMediaSegment(segmentId: number, rendition: {
26
+ trackId: number | undefined;
27
+ src: string;
28
+ }, _signal?: AbortSignal): Promise<ArrayBuffer>;
29
+ /**
30
+ * Check if a segment is currently being fetched
31
+ */
32
+ isSegmentBeingFetched(segmentId: number, rendition: {
33
+ src: string;
34
+ trackId: number | undefined;
35
+ }): boolean;
36
+ /**
37
+ * Get count of active segment requests (for debugging/monitoring)
38
+ */
39
+ getActiveSegmentRequestCount(): number;
40
+ /**
41
+ * Cancel all active segment requests (for cleanup)
42
+ */
43
+ cancelAllSegmentRequests(): void;
44
+ fetchMediaCache(mediaUrl: string): Promise<ArrayBuffer>;
45
+ /**
46
+ * Enhanced caching method that supports custom headers (e.g., Range requests)
47
+ * Cache key includes both URL and headers for proper cache isolation
48
+ */
49
+ fetchMediaCacheWithHeaders(mediaUrl: string, headers?: Record<string, string>, signal?: AbortSignal): Promise<ArrayBuffer>;
50
+ /**
51
+ * Calculate audio segments needed for a time range
52
+ * Each media engine implements this based on their segment structure
53
+ */
54
+ calculateAudioSegmentRange(fromMs: number, toMs: number, rendition: AudioRendition, durationMs: number): SegmentTimeRange[];
55
+ }
@@ -0,0 +1,96 @@
1
+ import { RequestDeduplicator } from "../../transcoding/cache/RequestDeduplicator.js";
2
+ import { SizeAwareLRUCache } from "../../utils/LRUCache.js";
3
+ const mediaCache = new SizeAwareLRUCache(100 * 1024 * 1024);
4
+ var BaseMediaEngine = class {
5
+ constructor() {
6
+ this.requestDeduplicator = new RequestDeduplicator();
7
+ }
8
+ getVideoRendition() {
9
+ if (!this.videoRendition) throw new Error("No video rendition available");
10
+ return this.videoRendition;
11
+ }
12
+ getAudioRendition() {
13
+ if (!this.audioRendition) throw new Error("No audio rendition available");
14
+ return this.audioRendition;
15
+ }
16
+ /**
17
+ * Generate cache key for segment requests
18
+ */
19
+ getSegmentCacheKey(segmentId, rendition) {
20
+ return `${rendition.src}-${rendition.id}-${segmentId}-${rendition.trackId}`;
21
+ }
22
+ /**
23
+ * Fetch media segment with built-in deduplication
24
+ * Eliminates the need for separate coordinators - cleaner architecture
25
+ */
26
+ async fetchMediaSegment(segmentId, rendition, _signal) {
27
+ const cacheKey = this.getSegmentCacheKey(segmentId, rendition);
28
+ return this.requestDeduplicator.executeRequest(cacheKey, async () => {
29
+ return this.fetchMediaSegmentImpl(segmentId, rendition);
30
+ });
31
+ }
32
+ /**
33
+ * Check if a segment is currently being fetched
34
+ */
35
+ isSegmentBeingFetched(segmentId, rendition) {
36
+ const cacheKey = this.getSegmentCacheKey(segmentId, rendition);
37
+ return this.requestDeduplicator.isPending(cacheKey);
38
+ }
39
+ /**
40
+ * Get count of active segment requests (for debugging/monitoring)
41
+ */
42
+ getActiveSegmentRequestCount() {
43
+ return this.requestDeduplicator.getPendingCount();
44
+ }
45
+ /**
46
+ * Cancel all active segment requests (for cleanup)
47
+ */
48
+ cancelAllSegmentRequests() {
49
+ this.requestDeduplicator.clear();
50
+ }
51
+ async fetchMediaCache(mediaUrl) {
52
+ const cached = mediaCache.get(mediaUrl);
53
+ if (cached) return cached;
54
+ const promise = this.host.fetch(mediaUrl).then((response) => response.arrayBuffer());
55
+ mediaCache.set(mediaUrl, promise);
56
+ return promise;
57
+ }
58
+ /**
59
+ * Enhanced caching method that supports custom headers (e.g., Range requests)
60
+ * Cache key includes both URL and headers for proper cache isolation
61
+ */
62
+ async fetchMediaCacheWithHeaders(mediaUrl, headers, signal) {
63
+ const cacheKey = headers ? `${mediaUrl}:${JSON.stringify(headers)}` : mediaUrl;
64
+ const cached = mediaCache.get(cacheKey);
65
+ if (cached) return cached;
66
+ const promise = this.host.fetch(mediaUrl, {
67
+ headers,
68
+ signal
69
+ }).then((response) => response.arrayBuffer());
70
+ mediaCache.set(cacheKey, promise);
71
+ return promise;
72
+ }
73
+ /**
74
+ * Calculate audio segments needed for a time range
75
+ * Each media engine implements this based on their segment structure
76
+ */
77
+ calculateAudioSegmentRange(fromMs, toMs, rendition, durationMs) {
78
+ if (fromMs >= toMs) return [];
79
+ const segmentDurationMs = rendition.segmentDurationMs || 1e3;
80
+ const segments = [];
81
+ const startSegmentIndex = Math.floor(fromMs / segmentDurationMs);
82
+ const endSegmentIndex = Math.floor(toMs / segmentDurationMs);
83
+ for (let i = startSegmentIndex; i <= endSegmentIndex; i++) {
84
+ const segmentId = i + 1;
85
+ const segmentStartMs = i * segmentDurationMs;
86
+ const segmentEndMs = Math.min((i + 1) * segmentDurationMs, durationMs);
87
+ if (segmentStartMs < toMs && segmentEndMs > fromMs) segments.push({
88
+ segmentId,
89
+ startMs: segmentStartMs,
90
+ endMs: segmentEndMs
91
+ });
92
+ }
93
+ return segments;
94
+ }
95
+ };
96
+ export { BaseMediaEngine };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ import { MediaSample } from '../SampleBuffer';
2
+ interface BufferedSeekingInputOptions {
3
+ videoBufferSize?: number;
4
+ audioBufferSize?: number;
5
+ /**
6
+ * FFmpeg start_time offset in milliseconds from the processed video.
7
+ * Applied during seeking to correct for timing shifts introduced by FFmpeg processing.
8
+ */
9
+ startTimeOffsetMs?: number;
10
+ }
11
+ export declare class NoSample extends RangeError {
12
+ }
13
+ export declare class BufferedSeekingInput {
14
+ private input;
15
+ private trackIterators;
16
+ private trackBuffers;
17
+ private options;
18
+ private trackIteratorCreationPromises;
19
+ private trackSeekPromises;
20
+ /**
21
+ * FFmpeg start_time offset in milliseconds from the processed video.
22
+ * Applied during seeking to correct for timing shifts introduced by FFmpeg processing.
23
+ */
24
+ private readonly startTimeOffsetMs;
25
+ constructor(arrayBuffer: ArrayBuffer, options?: BufferedSeekingInputOptions);
26
+ getBufferSize(trackId: number): number;
27
+ getBufferContents(trackId: number): readonly MediaSample[];
28
+ getBufferTimestamps(trackId: number): number[];
29
+ clearBuffer(trackId: number): void;
30
+ computeDuration(): Promise<number>;
31
+ getTrack(trackId: number): Promise<import('mediabunny').InputTrack>;
32
+ getAudioTrack(trackId: number): Promise<import('mediabunny').InputAudioTrack>;
33
+ getVideoTrack(trackId: number): Promise<import('mediabunny').InputVideoTrack>;
34
+ getFirstVideoTrack(): Promise<import('mediabunny').InputVideoTrack | undefined>;
35
+ getFirstAudioTrack(): Promise<import('mediabunny').InputAudioTrack | undefined>;
36
+ getTrackIterator(trackId: number): Promise<AsyncIterator<MediaSample, any, undefined>>;
37
+ private createIteratorSafe;
38
+ createTrackBuffer(trackId: number): Promise<void>;
39
+ seek(trackId: number, timeMs: number): Promise<MediaSample>;
40
+ private resetIterator;
41
+ private seekSafe;
42
+ }
43
+ export {};