@editframe/elements 0.17.6-beta.0 → 0.18.7-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 (211) hide show
  1. package/dist/EF_FRAMEGEN.js +1 -1
  2. package/dist/elements/EFAudio.d.ts +21 -2
  3. package/dist/elements/EFAudio.js +41 -11
  4. package/dist/elements/EFImage.d.ts +1 -0
  5. package/dist/elements/EFImage.js +11 -3
  6. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +18 -0
  7. package/dist/elements/EFMedia/AssetIdMediaEngine.js +41 -0
  8. package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
  9. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +45 -0
  10. package/dist/elements/EFMedia/AssetMediaEngine.js +135 -0
  11. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +55 -0
  12. package/dist/elements/EFMedia/BaseMediaEngine.js +115 -0
  13. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +43 -0
  14. package/dist/elements/EFMedia/BufferedSeekingInput.js +179 -0
  15. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  16. package/dist/elements/EFMedia/JitMediaEngine.d.ts +31 -0
  17. package/dist/elements/EFMedia/JitMediaEngine.js +81 -0
  18. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +9 -0
  19. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +16 -0
  20. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +48 -0
  21. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +3 -0
  22. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +141 -0
  23. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +9 -0
  24. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +4 -0
  25. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +16 -0
  26. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +9 -0
  27. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +3 -0
  28. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +30 -0
  29. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
  30. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +7 -0
  31. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +32 -0
  32. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +4 -0
  33. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +28 -0
  34. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +4 -0
  35. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +17 -0
  36. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +3 -0
  37. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +107 -0
  38. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +7 -0
  39. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +54 -0
  40. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +70 -0
  41. package/dist/elements/EFMedia/shared/BufferUtils.js +89 -0
  42. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +23 -0
  43. package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +28 -0
  44. package/dist/elements/EFMedia/shared/PrecisionUtils.js +29 -0
  45. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +19 -0
  46. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +18 -0
  47. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +60 -0
  48. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.d.ts +9 -0
  49. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +16 -0
  50. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +46 -0
  51. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.d.ts +9 -0
  52. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.d.ts +4 -0
  53. package/dist/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.js +16 -0
  54. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.d.ts +9 -0
  55. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.d.ts +3 -0
  56. package/dist/elements/EFMedia/videoTasks/makeVideoInputTask.js +27 -0
  57. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.d.ts +7 -0
  58. package/dist/elements/EFMedia/videoTasks/makeVideoSeekTask.js +34 -0
  59. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.d.ts +9 -0
  60. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.d.ts +4 -0
  61. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.js +28 -0
  62. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.d.ts +9 -0
  63. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.d.ts +4 -0
  64. package/dist/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.js +17 -0
  65. package/dist/elements/EFMedia.browsertest.d.ts +1 -0
  66. package/dist/elements/EFMedia.d.ts +63 -111
  67. package/dist/elements/EFMedia.js +117 -1113
  68. package/dist/elements/EFTemporal.d.ts +1 -1
  69. package/dist/elements/EFTemporal.js +1 -1
  70. package/dist/elements/EFTimegroup.d.ts +11 -0
  71. package/dist/elements/EFTimegroup.js +83 -13
  72. package/dist/elements/EFVideo.d.ts +54 -32
  73. package/dist/elements/EFVideo.js +100 -207
  74. package/dist/elements/EFWaveform.js +2 -2
  75. package/dist/elements/SampleBuffer.d.ts +14 -0
  76. package/dist/elements/SampleBuffer.js +52 -0
  77. package/dist/getRenderInfo.js +2 -1
  78. package/dist/gui/ContextMixin.js +3 -2
  79. package/dist/gui/EFFilmstrip.d.ts +3 -3
  80. package/dist/gui/EFFilmstrip.js +1 -1
  81. package/dist/gui/EFFitScale.d.ts +2 -2
  82. package/dist/gui/TWMixin.js +1 -1
  83. package/dist/style.css +1 -1
  84. package/dist/transcoding/cache/CacheManager.d.ts +73 -0
  85. package/dist/transcoding/cache/RequestDeduplicator.d.ts +29 -0
  86. package/dist/transcoding/cache/RequestDeduplicator.js +53 -0
  87. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +1 -0
  88. package/dist/transcoding/types/index.d.ts +242 -0
  89. package/dist/transcoding/utils/MediaUtils.d.ts +9 -0
  90. package/dist/transcoding/utils/UrlGenerator.d.ts +26 -0
  91. package/dist/transcoding/utils/UrlGenerator.js +45 -0
  92. package/dist/transcoding/utils/constants.d.ts +27 -0
  93. package/dist/utils/LRUCache.d.ts +34 -0
  94. package/dist/utils/LRUCache.js +115 -0
  95. package/package.json +3 -3
  96. package/src/elements/EFAudio.browsertest.ts +189 -49
  97. package/src/elements/EFAudio.ts +59 -13
  98. package/src/elements/EFImage.browsertest.ts +42 -0
  99. package/src/elements/EFImage.ts +23 -3
  100. package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +222 -0
  101. package/src/elements/EFMedia/AssetIdMediaEngine.ts +70 -0
  102. package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +100 -0
  103. package/src/elements/EFMedia/AssetMediaEngine.ts +255 -0
  104. package/src/elements/EFMedia/BaseMediaEngine.test.ts +164 -0
  105. package/src/elements/EFMedia/BaseMediaEngine.ts +219 -0
  106. package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +481 -0
  107. package/src/elements/EFMedia/BufferedSeekingInput.ts +324 -0
  108. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +165 -0
  109. package/src/elements/EFMedia/JitMediaEngine.ts +166 -0
  110. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +554 -0
  111. package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +81 -0
  112. package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +250 -0
  113. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +59 -0
  114. package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +23 -0
  115. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +55 -0
  116. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +43 -0
  117. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +199 -0
  118. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +64 -0
  119. package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +45 -0
  120. package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +24 -0
  121. package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +183 -0
  122. package/src/elements/EFMedia/shared/AudioSpanUtils.ts +128 -0
  123. package/src/elements/EFMedia/shared/BufferUtils.ts +310 -0
  124. package/src/elements/EFMedia/shared/MediaTaskUtils.ts +44 -0
  125. package/src/elements/EFMedia/shared/PrecisionUtils.ts +46 -0
  126. package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +247 -0
  127. package/src/elements/EFMedia/shared/RenditionHelpers.ts +79 -0
  128. package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +128 -0
  129. package/src/elements/EFMedia/tasks/makeMediaEngineTask.test.ts +233 -0
  130. package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +89 -0
  131. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.browsertest.ts +555 -0
  132. package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +79 -0
  133. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.browsertest.ts +59 -0
  134. package/src/elements/EFMedia/videoTasks/makeVideoInitSegmentFetchTask.ts +23 -0
  135. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.browsertest.ts +55 -0
  136. package/src/elements/EFMedia/videoTasks/makeVideoInputTask.ts +45 -0
  137. package/src/elements/EFMedia/videoTasks/makeVideoSeekTask.ts +68 -0
  138. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.browsertest.ts +57 -0
  139. package/src/elements/EFMedia/videoTasks/makeVideoSegmentFetchTask.ts +43 -0
  140. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.browsertest.ts +56 -0
  141. package/src/elements/EFMedia/videoTasks/makeVideoSegmentIdTask.ts +24 -0
  142. package/src/elements/EFMedia.browsertest.ts +706 -273
  143. package/src/elements/EFMedia.ts +136 -1769
  144. package/src/elements/EFTemporal.ts +3 -4
  145. package/src/elements/EFTimegroup.browsertest.ts +6 -3
  146. package/src/elements/EFTimegroup.ts +147 -21
  147. package/src/elements/EFVideo.browsertest.ts +980 -169
  148. package/src/elements/EFVideo.ts +113 -458
  149. package/src/elements/EFWaveform.ts +1 -1
  150. package/src/elements/MediaController.ts +2 -12
  151. package/src/elements/SampleBuffer.ts +95 -0
  152. package/src/gui/ContextMixin.ts +3 -6
  153. package/src/transcoding/cache/CacheManager.ts +208 -0
  154. package/src/transcoding/cache/RequestDeduplicator.test.ts +170 -0
  155. package/src/transcoding/cache/RequestDeduplicator.ts +65 -0
  156. package/src/transcoding/types/index.ts +269 -0
  157. package/src/transcoding/utils/MediaUtils.ts +63 -0
  158. package/src/transcoding/utils/UrlGenerator.ts +68 -0
  159. package/src/transcoding/utils/constants.ts +36 -0
  160. package/src/utils/LRUCache.ts +153 -0
  161. package/test/EFVideo.framegen.browsertest.ts +39 -30
  162. 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
  163. 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
  164. package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/data.bin +0 -0
  165. package/test/__cache__/GET__api_v1_transcode_audio_1_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__9ed2d25c675aa6bb6ff5b3ae23887c71/metadata.json +22 -0
  166. 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
  167. 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
  168. package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/data.bin +0 -0
  169. package/test/__cache__/GET__api_v1_transcode_audio_2_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__d5a3309a2bf756dd6e304807eb402f56/metadata.json +22 -0
  170. 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
  171. 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
  172. package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/data.bin +0 -0
  173. package/test/__cache__/GET__api_v1_transcode_audio_3_mp4_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4_bytes_0__773254bb671e3466fca8677139fb239e/metadata.json +22 -0
  174. 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
  175. 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
  176. 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
  177. 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
  178. 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
  179. 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
  180. 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
  181. 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
  182. 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
  183. 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
  184. 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
  185. 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
  186. package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/data.bin +0 -0
  187. package/test/__cache__/GET__api_v1_transcode_high_4_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a6fb05a22b18d850f7f2950bbcdbdeed/metadata.json +21 -0
  188. package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/data.bin +0 -0
  189. package/test/__cache__/GET__api_v1_transcode_high_5_m4s_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__a50058c7c3602e90879fe3428ed891f4/metadata.json +21 -0
  190. 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
  191. 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
  192. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/data.bin +1 -0
  193. package/test/__cache__/GET__api_v1_transcode_manifest_json_url_http_3A_2F_2Fweb_3A3000_2Fhead_moov_480p_mp4__3be92a0437de726b431ed5af2369158a/metadata.json +19 -0
  194. package/test/createJitTestClips.ts +320 -188
  195. package/test/recordReplayProxyPlugin.js +352 -0
  196. package/test/useAssetMSW.ts +1 -1
  197. package/test/useMSW.ts +35 -22
  198. package/types.json +1 -1
  199. package/dist/JitTranscodingClient.d.ts +0 -167
  200. package/dist/JitTranscodingClient.js +0 -373
  201. package/dist/ScrubTrackManager.d.ts +0 -96
  202. package/dist/ScrubTrackManager.js +0 -216
  203. package/dist/elements/printTaskStatus.js +0 -11
  204. package/src/elements/__screenshots__/EFMedia.browsertest.ts/EFMedia-JIT-audio-playback-audioBufferTask-should-work-in-JIT-mode-without-URL-errors-1.png +0 -0
  205. package/test/EFVideo.frame-tasks.browsertest.ts +0 -524
  206. /package/dist/{DecoderResetFrequency.test.d.ts → elements/EFMedia/AssetIdMediaEngine.test.d.ts} +0 -0
  207. /package/dist/{DecoderResetRecovery.test.d.ts → elements/EFMedia/BaseMediaEngine.test.d.ts} +0 -0
  208. /package/dist/{JitTranscodingClient.browsertest.d.ts → elements/EFMedia/BufferedSeekingInput.browsertest.d.ts} +0 -0
  209. /package/dist/{JitTranscodingClient.test.d.ts → elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts} +0 -0
  210. /package/dist/{ScrubTrackIntegration.test.d.ts → elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts} +0 -0
  211. /package/dist/{SegmentSwitchLoading.test.d.ts → elements/EFMedia/tasks/makeMediaEngineTask.test.d.ts} +0 -0
@@ -0,0 +1,55 @@
1
+ import { TaskStatus } from "@lit/task";
2
+ import { customElement } from "lit/decorators.js";
3
+ import { afterEach, beforeEach, describe, vi } from "vitest";
4
+ import { test as baseTest } from "../../../../test/useMSW.js";
5
+ import { EFVideo } from "../../EFVideo";
6
+ import { makeVideoInputTask } from "./makeVideoInputTask";
7
+
8
+ @customElement("test-media-video-input")
9
+ class TestMediaVideoInput extends EFVideo {}
10
+
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ "test-media-video-input": TestMediaVideoInput;
14
+ }
15
+ }
16
+
17
+ const test = baseTest.extend<{
18
+ element: TestMediaVideoInput;
19
+ }>({
20
+ element: async ({}, use) => {
21
+ const element = document.createElement("test-media-video-input");
22
+ await use(element);
23
+ element.remove();
24
+ },
25
+ });
26
+
27
+ describe("makeVideoInputTask", () => {
28
+ beforeEach(() => {
29
+ // MSW setup is now handled by test fixtures
30
+ });
31
+
32
+ afterEach(() => {
33
+ const elements = document.querySelectorAll("test-media-video-input");
34
+ for (const element of elements) {
35
+ element.remove();
36
+ }
37
+ vi.restoreAllMocks();
38
+ });
39
+
40
+ test("creates task with correct initial state", ({ element, expect }) => {
41
+ const task = makeVideoInputTask(element);
42
+
43
+ expect(task).toBeDefined();
44
+ expect(task.status).toBe(TaskStatus.INITIAL);
45
+ expect(task.value).toBeUndefined();
46
+ expect(task.error).toBeUndefined();
47
+ });
48
+
49
+ test("task integrates with element properties", ({ element, expect }) => {
50
+ const task = makeVideoInputTask(element);
51
+
52
+ expect(task).toBeDefined();
53
+ expect(task.status).toBe(TaskStatus.INITIAL);
54
+ });
55
+ });
@@ -0,0 +1,45 @@
1
+ import { Task } from "@lit/task";
2
+
3
+ import { EFMedia } from "../../EFMedia";
4
+ import type { EFVideo } from "../../EFVideo";
5
+ import { BufferedSeekingInput } from "../BufferedSeekingInput";
6
+ import type { InputTask } from "../shared/MediaTaskUtils";
7
+
8
+ export const makeVideoInputTask = (host: EFVideo): InputTask => {
9
+ return new Task<
10
+ readonly [ArrayBuffer | undefined, ArrayBuffer | undefined],
11
+ BufferedSeekingInput
12
+ >(host, {
13
+ args: () =>
14
+ [
15
+ host.videoInitSegmentFetchTask.value,
16
+ host.videoSegmentFetchTask.value,
17
+ ] as const,
18
+ onError: (error) => {
19
+ console.error("videoInputTask error", error);
20
+ },
21
+ onComplete: (_value) => {},
22
+ task: async () => {
23
+ const initSegment = await host.videoInitSegmentFetchTask.taskComplete;
24
+ const segment = await host.videoSegmentFetchTask.taskComplete;
25
+ if (!initSegment || !segment) {
26
+ throw new Error("Init segment or segment is not available");
27
+ }
28
+
29
+ // Get startTimeOffsetMs from the video rendition if available
30
+ const mediaEngine = await host.mediaEngineTask.taskComplete;
31
+ const videoRendition = mediaEngine?.videoRendition;
32
+ const startTimeOffsetMs = videoRendition?.startTimeOffsetMs;
33
+
34
+ const input = new BufferedSeekingInput(
35
+ await new Blob([initSegment, segment]).arrayBuffer(),
36
+ {
37
+ videoBufferSize: EFMedia.VIDEO_SAMPLE_BUFFER_SIZE,
38
+ audioBufferSize: EFMedia.AUDIO_SAMPLE_BUFFER_SIZE,
39
+ startTimeOffsetMs,
40
+ },
41
+ );
42
+ return input;
43
+ },
44
+ });
45
+ };
@@ -0,0 +1,68 @@
1
+ import { Task } from "@lit/task";
2
+
3
+ import type { VideoSample } from "mediabunny";
4
+ import { IgnorableError } from "../../EFMedia";
5
+ import type { EFVideo } from "../../EFVideo";
6
+ import type { BufferedSeekingInput } from "../BufferedSeekingInput";
7
+
8
+ type VideoSeekTask = Task<
9
+ readonly [number, BufferedSeekingInput | undefined],
10
+ VideoSample | undefined
11
+ >;
12
+ export const makeVideoSeekTask = (host: EFVideo): VideoSeekTask => {
13
+ return new Task(host, {
14
+ args: () => [host.desiredSeekTimeMs, host.videoInputTask.value] as const,
15
+ onError: (error) => {
16
+ if (error instanceof IgnorableError) {
17
+ console.info("videoSeekTask aborted");
18
+ }
19
+ console.error("videoSeekTask error", error);
20
+ },
21
+ onComplete: (_value) => {},
22
+ task: async (
23
+ [targetSeekTimeMs],
24
+ { signal },
25
+ ): Promise<VideoSample | undefined> => {
26
+ // CRITICAL FIX: Use the targetSeekTimeMs from args, not host.desiredSeekTimeMs
27
+ // This ensures we use the same seek time that the segment loading tasks used
28
+
29
+ await host.mediaEngineTask.taskComplete;
30
+ signal.throwIfAborted(); // Abort if a new seek started
31
+ await host.videoSegmentIdTask.taskComplete;
32
+ signal.throwIfAborted(); // Abort if a new seek started
33
+ await host.videoSegmentFetchTask.taskComplete;
34
+ signal.throwIfAborted(); // Abort if a new seek started
35
+ await host.videoInitSegmentFetchTask.taskComplete;
36
+ signal.throwIfAborted(); // Abort if a new seek started
37
+
38
+ const videoInput = await host.videoInputTask.taskComplete;
39
+ signal.throwIfAborted(); // Abort if a new seek started
40
+ if (!videoInput) {
41
+ throw new Error("Video input is not available");
42
+ }
43
+ const videoTrack = await videoInput.getFirstVideoTrack();
44
+ if (!videoTrack) {
45
+ throw new Error("Video track is not available");
46
+ }
47
+ signal.throwIfAborted(); // Abort if a new seek started
48
+
49
+ const sample = (await videoInput.seek(
50
+ videoTrack.id,
51
+ targetSeekTimeMs, // Use the captured value, not host.desiredSeekTimeMs
52
+ )) as unknown as VideoSample | undefined;
53
+
54
+ signal.throwIfAborted(); // Abort if a new seek started
55
+ // If seek returned undefined, it was aborted - don't throw
56
+ if (sample === undefined && signal.aborted) {
57
+ return undefined;
58
+ }
59
+
60
+ // If we got undefined but weren't aborted, that's an actual error
61
+ if (sample === undefined) {
62
+ throw new Error("Video seek failed to find sample");
63
+ }
64
+
65
+ return sample;
66
+ },
67
+ });
68
+ };
@@ -0,0 +1,57 @@
1
+ import { TaskStatus } from "@lit/task";
2
+ import { customElement } from "lit/decorators.js";
3
+ import { afterEach, beforeEach, describe, vi } from "vitest";
4
+ import { test as baseTest } from "../../../../test/useMSW.js";
5
+ import { EFVideo } from "../../EFVideo";
6
+ import { makeVideoSegmentFetchTask } from "./makeVideoSegmentFetchTask";
7
+
8
+ @customElement("test-media-video-segment-fetch")
9
+ class TestMediaVideoSegmentFetch extends EFVideo {}
10
+
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ "test-media-video-segment-fetch": TestMediaVideoSegmentFetch;
14
+ }
15
+ }
16
+
17
+ const test = baseTest.extend<{
18
+ element: TestMediaVideoSegmentFetch;
19
+ }>({
20
+ element: async ({}, use) => {
21
+ const element = document.createElement("test-media-video-segment-fetch");
22
+ await use(element);
23
+ element.remove();
24
+ },
25
+ });
26
+
27
+ describe("makeVideoSegmentFetchTask", () => {
28
+ beforeEach(() => {
29
+ // MSW setup is now handled by test fixtures
30
+ });
31
+
32
+ afterEach(() => {
33
+ const elements = document.querySelectorAll(
34
+ "test-media-video-segment-fetch",
35
+ );
36
+ for (const element of elements) {
37
+ element.remove();
38
+ }
39
+ vi.restoreAllMocks();
40
+ });
41
+
42
+ test("creates task with correct initial state", ({ element, expect }) => {
43
+ const task = makeVideoSegmentFetchTask(element);
44
+
45
+ expect(task).toBeDefined();
46
+ expect(task.status).toBe(TaskStatus.INITIAL);
47
+ expect(task.value).toBeUndefined();
48
+ expect(task.error).toBeUndefined();
49
+ });
50
+
51
+ test("task integrates with element properties", ({ element, expect }) => {
52
+ const task = makeVideoSegmentFetchTask(element);
53
+
54
+ expect(task).toBeDefined();
55
+ expect(task.status).toBe(TaskStatus.INITIAL);
56
+ });
57
+ });
@@ -0,0 +1,43 @@
1
+ import { Task } from "@lit/task";
2
+ import type { MediaEngine } from "../../../transcoding/types";
3
+ import type { EFVideo } from "../../EFVideo";
4
+ import { getLatestMediaEngine } from "../tasks/makeMediaEngineTask";
5
+
6
+ export const makeVideoSegmentFetchTask = (
7
+ host: EFVideo,
8
+ ): Task<
9
+ readonly [MediaEngine | undefined, number | undefined],
10
+ ArrayBuffer
11
+ > => {
12
+ return new Task(host, {
13
+ args: () =>
14
+ [host.mediaEngineTask.value, host.videoSegmentIdTask.value] as const,
15
+ onError: (error) => {
16
+ console.error("videoSegmentFetchTask error", error);
17
+ },
18
+ onComplete: (_value) => {},
19
+ task: async (_, { signal }) => {
20
+ const mediaEngine = await getLatestMediaEngine(host, signal);
21
+ const segmentId = await host.videoSegmentIdTask.taskComplete;
22
+ if (segmentId === undefined) {
23
+ // Provide more context in the error to help with debugging
24
+ const rendition = mediaEngine.videoRendition;
25
+ const debugInfo = {
26
+ hasRendition: !!rendition,
27
+ segmentDurationMs: rendition?.segmentDurationMs,
28
+ segmentDurationsMs: rendition?.segmentDurationsMs?.length || 0,
29
+ desiredSeekTimeMs: host.desiredSeekTimeMs,
30
+ intrinsicDurationMs: host.intrinsicDurationMs,
31
+ };
32
+ throw new Error(
33
+ `Segment ID is not available for video. Debug info: ${JSON.stringify(debugInfo)}`,
34
+ );
35
+ }
36
+ return mediaEngine.fetchMediaSegment(
37
+ segmentId,
38
+ mediaEngine.getVideoRendition(),
39
+ signal,
40
+ );
41
+ },
42
+ });
43
+ };
@@ -0,0 +1,56 @@
1
+ import { TaskStatus } from "@lit/task";
2
+ import { customElement } from "lit/decorators.js";
3
+ import { afterEach, beforeEach, describe, vi } from "vitest";
4
+ import { test as baseTest } from "../../../../test/useMSW.js";
5
+ import { EFVideo } from "../../EFVideo";
6
+ import { makeVideoSegmentIdTask } from "./makeVideoSegmentIdTask";
7
+
8
+ @customElement("test-media-video-segment")
9
+ class TestMediaVideoSegment extends EFVideo {}
10
+
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ "test-media-video-segment": TestMediaVideoSegment;
14
+ }
15
+ }
16
+
17
+ const test = baseTest.extend<{
18
+ element: TestMediaVideoSegment;
19
+ }>({
20
+ element: async ({}, use) => {
21
+ const element = document.createElement("test-media-video-segment");
22
+ await use(element);
23
+ element.remove();
24
+ },
25
+ });
26
+
27
+ describe("makeVideoSegmentIdTask", () => {
28
+ beforeEach(() => {
29
+ // MSW setup is now handled by test fixtures
30
+ });
31
+
32
+ afterEach(() => {
33
+ const elements = document.querySelectorAll("test-media-video-segment");
34
+ for (const element of elements) {
35
+ element.remove();
36
+ }
37
+ vi.restoreAllMocks();
38
+ });
39
+
40
+ test("creates task with correct initial state", ({ element, expect }) => {
41
+ const task = makeVideoSegmentIdTask(element);
42
+
43
+ expect(task).toBeDefined();
44
+ expect(task.status).toBe(TaskStatus.INITIAL);
45
+ expect(task.value).toBeUndefined();
46
+ expect(task.error).toBeUndefined();
47
+ });
48
+
49
+ test("task integrates with element properties", ({ element, expect }) => {
50
+ element.desiredSeekTimeMs = 7500;
51
+
52
+ const task = makeVideoSegmentIdTask(element);
53
+ expect(task).toBeDefined();
54
+ expect(task.status).toBe(TaskStatus.INITIAL);
55
+ });
56
+ });
@@ -0,0 +1,24 @@
1
+ import { Task } from "@lit/task";
2
+ import type { MediaEngine } from "../../../transcoding/types";
3
+ import type { EFVideo } from "../../EFVideo";
4
+ import { getLatestMediaEngine } from "../tasks/makeMediaEngineTask";
5
+
6
+ export const makeVideoSegmentIdTask = (
7
+ host: EFVideo,
8
+ ): Task<readonly [MediaEngine | undefined, number], number | undefined> => {
9
+ return new Task(host, {
10
+ args: () => [host.mediaEngineTask.value, host.desiredSeekTimeMs] as const,
11
+ onError: (error) => {
12
+ console.error("videoSegmentIdTask error", error);
13
+ },
14
+ onComplete: (_value) => {},
15
+ task: async ([, targetSeekTimeMs], { signal }) => {
16
+ const mediaEngine = await getLatestMediaEngine(host, signal);
17
+ signal.throwIfAborted(); // Abort if a new seek started
18
+ return mediaEngine.computeSegmentId(
19
+ targetSeekTimeMs, // Use captured value, not host.desiredSeekTimeMs
20
+ mediaEngine.getVideoRendition(),
21
+ );
22
+ },
23
+ });
24
+ };