@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
@@ -2,38 +2,82 @@ import { Task } from "@lit/task";
2
2
  import { html } from "lit";
3
3
  import { customElement } from "lit/decorators.js";
4
4
  import { createRef, ref } from "lit/directives/ref.js";
5
+ import { TWMixin } from "../gui/TWMixin.js";
5
6
  import { EFMedia } from "./EFMedia.js";
6
7
 
7
8
  @customElement("ef-audio")
8
- export class EFAudio extends EFMedia {
9
+ export class EFAudio extends TWMixin(EFMedia) {
10
+ static get observedAttributes() {
11
+ // biome-ignore lint/complexity/noThisInStatic: We need to access super
12
+ const parentAttributes = super.observedAttributes || [];
13
+ return [...parentAttributes];
14
+ }
15
+
16
+ attributeChangedCallback(
17
+ name: string,
18
+ old: string | null,
19
+ value: string | null,
20
+ ) {
21
+ super.attributeChangedCallback(name, old, value);
22
+
23
+ // Explicitly handle asset-id attribute to property conversion
24
+ // EFVideo works without this fix, but EFAudio requires it due to some fundamental difference
25
+ if (name === "asset-id") {
26
+ this.assetId = value;
27
+ }
28
+ }
29
+
9
30
  audioElementRef = createRef<HTMLAudioElement>();
10
31
 
11
32
  render() {
12
33
  return html`<audio ${ref(this.audioElementRef)}></audio>`;
13
34
  }
14
35
 
15
- get audioElement() {
16
- return this.audioElementRef.value;
17
- }
18
-
19
36
  frameTask = new Task(this, {
20
37
  args: () =>
21
38
  [
22
- this.trackFragmentIndexLoader.status,
23
- this.initSegmentsLoader.status,
24
- this.seekTask.status,
25
- this.fetchSeekTask.status,
26
- this.videoAssetTask.status,
39
+ this.audioBufferTask.status,
40
+ this.audioSeekTask.status,
41
+ this.audioSegmentFetchTask.status,
42
+ this.mediaEngineTask.status,
27
43
  ] as const,
28
44
  task: async () => {
29
- await this.trackFragmentIndexLoader.taskComplete;
30
- await this.initSegmentsLoader.taskComplete;
31
- await this.seekTask.taskComplete;
32
- await this.fetchSeekTask.taskComplete;
33
- await this.videoAssetTask.taskComplete;
45
+ await this.mediaEngineTask.taskComplete;
46
+ await this.audioSegmentFetchTask.taskComplete;
47
+ await this.audioSeekTask.taskComplete;
48
+ await this.audioBufferTask.taskComplete;
34
49
  this.rootTimegroup?.requestUpdate();
35
50
  },
36
51
  });
52
+
53
+ // Getter properties for backward compatibility with tests
54
+ /**
55
+ * Legacy getter for fragment index task (maps to audioSegmentIdTask)
56
+ */
57
+ get fragmentIndexTask() {
58
+ return this.audioSegmentIdTask;
59
+ }
60
+
61
+ /**
62
+ * Legacy getter for media segments task (maps to audioSegmentFetchTask)
63
+ */
64
+ get mediaSegmentsTask() {
65
+ return this.audioSegmentFetchTask;
66
+ }
67
+
68
+ /**
69
+ * Legacy getter for seek task (maps to audioSeekTask)
70
+ */
71
+ get seekTask() {
72
+ return this.audioSeekTask;
73
+ }
74
+
75
+ /**
76
+ * Legacy getter for audio asset task (maps to audioBufferTask)
77
+ */
78
+ get videoAssetTask() {
79
+ return this.audioBufferTask;
80
+ }
37
81
  }
38
82
 
39
83
  declare global {
@@ -12,7 +12,6 @@ describe("EFCaptions", () => {
12
12
  });
13
13
  afterEach(() => {
14
14
  // @ts-ignore
15
- // biome-ignore lint/performance/noDelete: <explanation>
16
15
  delete window.FRAMEGEN_BRIDGE;
17
16
  });
18
17
  test("captionsPath uses http:// protocol", () => {
@@ -11,7 +11,6 @@ describe("EFImage", () => {
11
11
  });
12
12
  afterEach(() => {
13
13
  // @ts-ignore
14
- // biome-ignore lint/performance/noDelete: <explanation>
15
14
  delete window.FRAMEGEN_BRIDGE;
16
15
  });
17
16
  test("assetPath uses http:// protocol", () => {
@@ -77,4 +76,46 @@ describe("EFImage", () => {
77
76
  expect(image.durationMs).toBe(1000);
78
77
  });
79
78
  });
79
+
80
+ describe("direct URL support", () => {
81
+ test("assetPath returns https URLs unchanged", () => {
82
+ const image = document.createElement("ef-image");
83
+ image.src = "https://example.com/image.jpg";
84
+ expect(image.assetPath()).toBe("https://example.com/image.jpg");
85
+ });
86
+
87
+ test("assetPath returns http URLs unchanged", () => {
88
+ const image = document.createElement("ef-image");
89
+ image.src = "http://example.com/image.jpg";
90
+ expect(image.assetPath()).toBe("http://example.com/image.jpg");
91
+ });
92
+
93
+ test("assetPath preserves local file behavior", () => {
94
+ const image = document.createElement("ef-image");
95
+ image.src = "local-image.jpg";
96
+ expect(image.assetPath()).toBe("/@ef-image/local-image.jpg");
97
+ });
98
+
99
+ test("assetPath preserves asset-id priority over direct URL", () => {
100
+ const image = document.createElement("ef-image");
101
+ const preview = document.createElement("ef-preview");
102
+ preview.appendChild(image);
103
+ preview.apiHost = "https://api.test.com";
104
+ image.src = "https://example.com/image.jpg";
105
+ image.assetId = "test-asset-id";
106
+ expect(image.assetPath()).toBe(
107
+ "https://api.test.com/api/v1/image_files/test-asset-id",
108
+ );
109
+ });
110
+
111
+ test("handles CORS fallback for direct URLs", () => {
112
+ const image = document.createElement("ef-image");
113
+ image.src =
114
+ "https://storage.googleapis.com/editframe-assets-7ac794b/1080-cat.jpeg";
115
+ expect(image.assetPath()).toBe(
116
+ "https://storage.googleapis.com/editframe-assets-7ac794b/1080-cat.jpeg",
117
+ );
118
+ // Note: CORS fallback behavior is tested in the fetchImage task logic
119
+ });
120
+ });
80
121
  });
@@ -21,7 +21,7 @@ export class EFImage extends EFTemporal(
21
21
  align-items: center;
22
22
  justify-content: center;
23
23
  }
24
- canvas {
24
+ canvas, img {
25
25
  all: inherit;
26
26
  }
27
27
  `,
@@ -41,13 +41,24 @@ export class EFImage extends EFTemporal(
41
41
  }
42
42
 
43
43
  render() {
44
- return html`<canvas ${ref(this.canvasRef)}></canvas>`;
44
+ const assetPath = this.assetPath();
45
+ const isDirectUrl = this.isDirectUrl(assetPath);
46
+ return isDirectUrl
47
+ ? html`<img ${ref(this.imageRef)} src=${assetPath} />`
48
+ : html`<canvas ${ref(this.canvasRef)}></canvas>`;
49
+ }
50
+
51
+ private isDirectUrl(src: string): boolean {
52
+ return src.startsWith("http://") || src.startsWith("https://");
45
53
  }
46
54
 
47
55
  assetPath() {
48
56
  if (this.assetId) {
49
57
  return `${this.apiHost}/api/v1/image_files/${this.assetId}`;
50
58
  }
59
+ if (this.isDirectUrl(this.src)) {
60
+ return this.src;
61
+ }
51
62
  return `/@ef-image/${this.src}`;
52
63
  }
53
64
 
@@ -59,12 +70,21 @@ export class EFImage extends EFTemporal(
59
70
  autoRun: EF_INTERACTIVE,
60
71
  args: () => [this.assetPath(), this.fetch] as const,
61
72
  task: async ([assetPath, fetch], { signal }) => {
73
+ // For direct URLs, skip task - src is set directly in render
74
+ if (this.isDirectUrl(assetPath)) {
75
+ return;
76
+ }
77
+
78
+ // For asset-id and local files, use canvas as before
62
79
  const response = await fetch(assetPath, { signal });
63
80
  const image = new Image();
64
81
  image.src = URL.createObjectURL(await response.blob());
65
- await new Promise((resolve) => {
82
+
83
+ await new Promise((resolve, reject) => {
66
84
  image.onload = resolve;
85
+ image.onerror = reject;
67
86
  });
87
+
68
88
  if (!this.canvasRef.value) throw new Error("Canvas not ready");
69
89
  const ctx = this.canvasRef.value.getContext("2d");
70
90
  if (!ctx) throw new Error("Canvas 2d context not ready");
@@ -0,0 +1,222 @@
1
+ import type { TrackFragmentIndex } from "@editframe/assets";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { UrlGenerator } from "../../transcoding/utils/UrlGenerator";
4
+ import type { EFMedia } from "../EFMedia";
5
+ import { AssetIdMediaEngine } from "./AssetIdMediaEngine";
6
+
7
+ describe("AssetIdMediaEngine", () => {
8
+ const mockApiHost = "https://api.example.com";
9
+ const mockAssetId = "test-asset-123";
10
+ const mockUrlGenerator = new UrlGenerator(() => "https://api.example.com");
11
+
12
+ const mockTrackFragmentData: Record<number, TrackFragmentIndex> = {
13
+ 1: {
14
+ track: 1,
15
+ type: "audio",
16
+ duration: 15000,
17
+ timescale: 1000,
18
+ channel_count: 2,
19
+ sample_rate: 44100,
20
+ sample_size: 16,
21
+ sample_count: 1000,
22
+ codec: "mp4a.40.2",
23
+ initSegment: {
24
+ offset: 0,
25
+ size: 1024,
26
+ },
27
+ segments: [
28
+ {
29
+ cts: 0,
30
+ dts: 0,
31
+ duration: 1000,
32
+ offset: 1024,
33
+ size: 2048,
34
+ },
35
+ {
36
+ cts: 1000,
37
+ dts: 1000,
38
+ duration: 1000,
39
+ offset: 3072,
40
+ size: 2048,
41
+ },
42
+ ],
43
+ },
44
+ 2: {
45
+ track: 2,
46
+ type: "video",
47
+ duration: 15000,
48
+ timescale: 1000,
49
+ width: 1920,
50
+ height: 1080,
51
+ sample_count: 1500,
52
+ codec: "avc1.640029",
53
+ initSegment: {
54
+ offset: 0,
55
+ size: 2048,
56
+ },
57
+ segments: [
58
+ {
59
+ cts: 0,
60
+ dts: 0,
61
+ duration: 1000,
62
+ offset: 7168,
63
+ size: 4096,
64
+ },
65
+ {
66
+ cts: 1000,
67
+ dts: 1000,
68
+ duration: 1000,
69
+ offset: 11264,
70
+ size: 4096,
71
+ },
72
+ ],
73
+ },
74
+ };
75
+
76
+ let engine: AssetIdMediaEngine;
77
+ let host: EFMedia;
78
+
79
+ beforeEach(() => {
80
+ // Create a mock host instead of instantiating EFMedia directly
81
+ host = {
82
+ fetch: vi.fn().mockResolvedValue({
83
+ json: vi.fn().mockResolvedValue(mockTrackFragmentData),
84
+ }),
85
+ } as any;
86
+ engine = new AssetIdMediaEngine(
87
+ host,
88
+ mockAssetId,
89
+ mockTrackFragmentData,
90
+ mockApiHost,
91
+ );
92
+ });
93
+
94
+ describe("constructor", () => {
95
+ it("should initialize with correct duration", () => {
96
+ expect(engine.durationMs).toBe(15000);
97
+ });
98
+
99
+ it("should set assetId correctly", () => {
100
+ expect(engine.assetId).toBe(mockAssetId);
101
+ });
102
+
103
+ it("should expose assetId as src for MediaEngine interface compatibility", () => {
104
+ expect(engine.src).toBe(mockAssetId);
105
+ });
106
+ });
107
+
108
+ describe("track access", () => {
109
+ it("should find audio track", () => {
110
+ const audioTrack = engine.audioTrackIndex;
111
+ expect(audioTrack).toBeDefined();
112
+ expect(audioTrack?.type).toBe("audio");
113
+ expect(audioTrack?.track).toBe(1);
114
+ });
115
+
116
+ it("should find video track", () => {
117
+ const videoTrack = engine.videoTrackIndex;
118
+ expect(videoTrack).toBeDefined();
119
+ expect(videoTrack?.type).toBe("video");
120
+ expect(videoTrack?.track).toBe(2);
121
+ });
122
+
123
+ it("should return correct audio rendition", () => {
124
+ const audioRendition = engine.audioRendition;
125
+ expect(audioRendition.trackId).toBe(1);
126
+ expect(audioRendition.src).toBe(mockAssetId);
127
+ });
128
+
129
+ it("should return correct video rendition", () => {
130
+ const videoRendition = engine.videoRendition;
131
+ expect(videoRendition.trackId).toBe(2);
132
+ expect(videoRendition.src).toBe(mockAssetId);
133
+ });
134
+ });
135
+
136
+ describe("URL generation", () => {
137
+ it("should generate correct init segment URLs", () => {
138
+ const url = engine.buildInitSegmentUrl(1);
139
+ expect(url).toBe(`${mockApiHost}/api/v1/isobmff_tracks/${mockAssetId}/1`);
140
+ });
141
+
142
+ it("should generate correct media segment URLs", () => {
143
+ const url = engine.buildMediaSegmentUrl(1, 0);
144
+ expect(url).toBe(`${mockApiHost}/api/v1/isobmff_tracks/${mockAssetId}/1`);
145
+ });
146
+
147
+ it("should return correct templates", () => {
148
+ const templates = engine.templates;
149
+ expect(templates.initSegment).toBe(
150
+ `${mockApiHost}/api/v1/isobmff_tracks/${mockAssetId}/{trackId}`,
151
+ );
152
+ expect(templates.mediaSegment).toBe(
153
+ `${mockApiHost}/api/v1/isobmff_tracks/${mockAssetId}/{trackId}`,
154
+ );
155
+ });
156
+
157
+ it("should return correct init segment paths", () => {
158
+ const paths = engine.initSegmentPaths;
159
+ expect(paths.audio?.path).toBe(
160
+ `${mockApiHost}/api/v1/isobmff_tracks/${mockAssetId}/1`,
161
+ );
162
+ expect(paths.video?.path).toBe(
163
+ `${mockApiHost}/api/v1/isobmff_tracks/${mockAssetId}/2`,
164
+ );
165
+ });
166
+ });
167
+
168
+ describe("segment calculations", () => {
169
+ it("should calculate audio segment ranges correctly", () => {
170
+ const ranges = engine.calculateAudioSegmentRange(
171
+ 500,
172
+ 1500,
173
+ { trackId: 1, src: mockAssetId },
174
+ 15000,
175
+ );
176
+ expect(ranges).toHaveLength(2);
177
+ expect(ranges[0]?.segmentId).toBe(0);
178
+ expect(ranges[1]?.segmentId).toBe(1);
179
+ });
180
+
181
+ it("should compute segment ID correctly", () => {
182
+ const segmentId = engine.computeSegmentId(500, {
183
+ trackId: 1,
184
+ src: mockAssetId,
185
+ });
186
+ expect(segmentId).toBe(0);
187
+
188
+ const segmentId2 = engine.computeSegmentId(1500, {
189
+ trackId: 1,
190
+ src: mockAssetId,
191
+ });
192
+ expect(segmentId2).toBe(1);
193
+ });
194
+ });
195
+
196
+ describe("static fetch method", () => {
197
+ it("should create engine from API response", async () => {
198
+ // Mock the host's fetch method
199
+ const mockFetch = vi.fn().mockResolvedValue({
200
+ json: vi.fn().mockResolvedValue(mockTrackFragmentData),
201
+ });
202
+
203
+ const mockHost = {
204
+ fetch: mockFetch,
205
+ } as any;
206
+
207
+ const fetchedEngine = await AssetIdMediaEngine.fetchByAssetId(
208
+ mockHost,
209
+ mockUrlGenerator,
210
+ mockAssetId,
211
+ mockApiHost,
212
+ );
213
+
214
+ expect(mockFetch).toHaveBeenCalledWith(
215
+ `${mockApiHost}/api/v1/isobmff_files/${mockAssetId}/index`,
216
+ );
217
+ expect(fetchedEngine.assetId).toBe(mockAssetId);
218
+ expect(fetchedEngine.durationMs).toBe(15000);
219
+ expect(fetchedEngine.audioTrackIndex?.track).toBe(1);
220
+ });
221
+ });
222
+ });
@@ -0,0 +1,70 @@
1
+ import type { TrackFragmentIndex } from "@editframe/assets";
2
+ import type { InitSegmentPaths, MediaEngine } from "../../transcoding/types";
3
+ import type { UrlGenerator } from "../../transcoding/utils/UrlGenerator";
4
+ import type { EFMedia } from "../EFMedia";
5
+ import { AssetMediaEngine } from "./AssetMediaEngine";
6
+
7
+ export class AssetIdMediaEngine
8
+ extends AssetMediaEngine
9
+ implements MediaEngine
10
+ {
11
+ static async fetchByAssetId(
12
+ host: EFMedia,
13
+ _urlGenerator: UrlGenerator,
14
+ assetId: string,
15
+ apiHost: string,
16
+ ) {
17
+ const url = `${apiHost}/api/v1/isobmff_files/${assetId}/index`;
18
+ const response = await host.fetch(url);
19
+ const data = (await response.json()) as Record<number, TrackFragmentIndex>;
20
+ return new AssetIdMediaEngine(host, assetId, data, apiHost);
21
+ }
22
+
23
+ constructor(
24
+ host: EFMedia,
25
+ public assetId: string,
26
+ data: Record<number, TrackFragmentIndex>,
27
+ private apiHost: string,
28
+ ) {
29
+ // Pass assetId as src to parent constructor for compatibility
30
+ super(host, assetId, data);
31
+ }
32
+
33
+ // Override URL-building methods to use API endpoints instead of file paths
34
+ get initSegmentPaths() {
35
+ const paths: InitSegmentPaths = {};
36
+
37
+ if (this.audioTrackIndex !== undefined) {
38
+ paths.audio = {
39
+ path: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${this.audioTrackIndex.track}`,
40
+ pos: this.audioTrackIndex.initSegment.offset,
41
+ size: this.audioTrackIndex.initSegment.size,
42
+ };
43
+ }
44
+
45
+ if (this.videoTrackIndex !== undefined) {
46
+ paths.video = {
47
+ path: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${this.videoTrackIndex.track}`,
48
+ pos: this.videoTrackIndex.initSegment.offset,
49
+ size: this.videoTrackIndex.initSegment.size,
50
+ };
51
+ }
52
+
53
+ return paths;
54
+ }
55
+
56
+ get templates() {
57
+ return {
58
+ initSegment: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/{trackId}`,
59
+ mediaSegment: `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/{trackId}`,
60
+ };
61
+ }
62
+
63
+ buildInitSegmentUrl(trackId: number) {
64
+ return `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${trackId}`;
65
+ }
66
+
67
+ buildMediaSegmentUrl(trackId: number, _segmentId: number) {
68
+ return `${this.apiHost}/api/v1/isobmff_tracks/${this.assetId}/${trackId}`;
69
+ }
70
+ }