@editframe/elements 0.24.1-beta.0 → 0.25.0-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.
- package/dist/DelayedLoadingState.js +31 -0
- package/dist/DelayedLoadingState.js.map +1 -0
- package/dist/EF_FRAMEGEN.d.ts +50 -46
- package/dist/EF_FRAMEGEN.js +5 -1
- package/dist/EF_FRAMEGEN.js.map +1 -0
- package/dist/EF_INTERACTIVE.js +4 -0
- package/dist/EF_INTERACTIVE.js.map +1 -0
- package/dist/EF_RENDERING.js +4 -0
- package/dist/EF_RENDERING.js.map +1 -0
- package/dist/_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js +4 -1
- package/dist/attachContextRoot.js +6 -1
- package/dist/attachContextRoot.js.map +1 -0
- package/dist/elements/CrossUpdateController.js +4 -0
- package/dist/elements/CrossUpdateController.js.map +1 -0
- package/dist/elements/EFAudio.d.ts +24 -16
- package/dist/elements/EFAudio.js +10 -1
- package/dist/elements/EFAudio.js.map +1 -0
- package/dist/elements/EFCaptions.d.ts +118 -109
- package/dist/elements/EFCaptions.js +11 -6
- package/dist/elements/EFCaptions.js.map +1 -0
- package/dist/elements/EFImage.d.ts +31 -20
- package/dist/elements/EFImage.js +6 -1
- package/dist/elements/EFImage.js.map +1 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.js +5 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js +12 -0
- package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/BaseMediaEngine.js +53 -0
- package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +47 -46
- package/dist/elements/EFMedia/BufferedSeekingInput.js +6 -1
- package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -0
- package/dist/elements/EFMedia/JitMediaEngine.js +12 -0
- package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +9 -13
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +6 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +5 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +6 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -0
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js +18 -2
- package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -0
- package/dist/elements/EFMedia/shared/BufferUtils.d.ts +9 -67
- package/dist/elements/EFMedia/shared/BufferUtils.js +15 -0
- package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -0
- package/dist/elements/EFMedia/shared/GlobalInputCache.js +29 -0
- package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -0
- package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +11 -17
- package/dist/elements/EFMedia/shared/PrecisionUtils.js +25 -0
- package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -0
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +22 -0
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +13 -0
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +21 -0
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +18 -0
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +10 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +6 -1
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +16 -2
- package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +9 -13
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +5 -0
- package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -0
- package/dist/elements/EFMedia.d.ts +115 -104
- package/dist/elements/EFMedia.js +25 -1
- package/dist/elements/EFMedia.js.map +1 -0
- package/dist/elements/EFSourceMixin.d.ts +10 -11
- package/dist/elements/EFSourceMixin.js +5 -0
- package/dist/elements/EFSourceMixin.js.map +1 -0
- package/dist/elements/EFSurface.d.ts +35 -27
- package/dist/elements/EFSurface.js +6 -1
- package/dist/elements/EFSurface.js.map +1 -0
- package/dist/elements/EFTemporal.d.ts +200 -213
- package/dist/elements/EFTemporal.js +24 -4
- package/dist/elements/EFTemporal.js.map +1 -0
- package/dist/elements/EFThumbnailStrip.d.ts +91 -83
- package/dist/elements/EFThumbnailStrip.js +49 -4
- package/dist/elements/EFThumbnailStrip.js.map +1 -0
- package/dist/elements/EFTimegroup.d.ts +107 -101
- package/dist/elements/EFTimegroup.js +58 -3
- package/dist/elements/EFTimegroup.js.map +1 -0
- package/dist/elements/EFVideo.d.ts +120 -108
- package/dist/elements/EFVideo.js +46 -2
- package/dist/elements/EFVideo.js.map +1 -0
- package/dist/elements/EFWaveform.d.ts +48 -41
- package/dist/elements/EFWaveform.js +6 -1
- package/dist/elements/EFWaveform.js.map +1 -0
- package/dist/elements/FetchMixin.d.ts +8 -6
- package/dist/elements/FetchMixin.js +4 -0
- package/dist/elements/FetchMixin.js.map +1 -0
- package/dist/elements/SampleBuffer.d.ts +18 -13
- package/dist/elements/SampleBuffer.js +5 -0
- package/dist/elements/SampleBuffer.js.map +1 -0
- package/dist/elements/TargetController.d.ts +23 -24
- package/dist/elements/TargetController.js +8 -3
- package/dist/elements/TargetController.js.map +1 -0
- package/dist/elements/TimegroupController.d.ts +17 -12
- package/dist/elements/TimegroupController.js +4 -0
- package/dist/elements/TimegroupController.js.map +1 -0
- package/dist/elements/durationConverter.js +9 -4
- package/dist/elements/durationConverter.js.map +1 -0
- package/dist/elements/parseTimeToMs.js +4 -0
- package/dist/elements/parseTimeToMs.js.map +1 -0
- package/dist/elements/renderTemporalAudio.js +4 -0
- package/dist/elements/renderTemporalAudio.js.map +1 -0
- package/dist/elements/updateAnimations.js +29 -8
- package/dist/elements/updateAnimations.js.map +1 -0
- package/dist/elements-ZhsB7B5N.css +9 -0
- package/dist/elements-ZhsB7B5N.css.map +1 -0
- package/dist/getRenderInfo.d.ts +53 -47
- package/dist/getRenderInfo.js +5 -0
- package/dist/getRenderInfo.js.map +1 -0
- package/dist/gui/ContextMixin.d.ts +19 -20
- package/dist/gui/ContextMixin.js +32 -1
- package/dist/gui/ContextMixin.js.map +1 -0
- package/dist/gui/Controllable.d.ts +13 -14
- package/dist/gui/Controllable.js +5 -0
- package/dist/gui/Controllable.js.map +1 -0
- package/dist/gui/EFConfiguration.d.ts +18 -14
- package/dist/gui/EFConfiguration.js +6 -1
- package/dist/gui/EFConfiguration.js.map +1 -0
- package/dist/gui/EFControls.d.ts +35 -31
- package/dist/gui/EFControls.js +8 -3
- package/dist/gui/EFControls.js.map +1 -0
- package/dist/gui/EFDial.d.ts +23 -16
- package/dist/gui/EFDial.js +6 -1
- package/dist/gui/EFDial.js.map +1 -0
- package/dist/gui/EFFilmstrip.d.ts +183 -177
- package/dist/gui/EFFilmstrip.js +30 -25
- package/dist/gui/EFFilmstrip.js.map +1 -0
- package/dist/gui/EFFitScale.d.ts +30 -24
- package/dist/gui/EFFitScale.js +6 -1
- package/dist/gui/EFFitScale.js.map +1 -0
- package/dist/gui/EFFocusOverlay.d.ts +22 -14
- package/dist/gui/EFFocusOverlay.js +6 -1
- package/dist/gui/EFFocusOverlay.js.map +1 -0
- package/dist/gui/EFPause.d.ts +24 -18
- package/dist/gui/EFPause.js +6 -1
- package/dist/gui/EFPause.js.map +1 -0
- package/dist/gui/EFPlay.d.ts +24 -18
- package/dist/gui/EFPlay.js +6 -1
- package/dist/gui/EFPlay.js.map +1 -0
- package/dist/gui/EFPreview.d.ts +22 -15
- package/dist/gui/EFPreview.js +9 -1
- package/dist/gui/EFPreview.js.map +1 -0
- package/dist/gui/EFResizableBox.d.ts +39 -32
- package/dist/gui/EFResizableBox.js +8 -3
- package/dist/gui/EFResizableBox.js.map +1 -0
- package/dist/gui/EFScrubber.d.ts +31 -25
- package/dist/gui/EFScrubber.js +6 -1
- package/dist/gui/EFScrubber.js.map +1 -0
- package/dist/gui/EFTimeDisplay.d.ts +21 -14
- package/dist/gui/EFTimeDisplay.js +6 -1
- package/dist/gui/EFTimeDisplay.js.map +1 -0
- package/dist/gui/EFToggleLoop.d.ts +19 -13
- package/dist/gui/EFToggleLoop.js +6 -1
- package/dist/gui/EFToggleLoop.js.map +1 -0
- package/dist/gui/EFTogglePlay.d.ts +23 -17
- package/dist/gui/EFTogglePlay.js +6 -1
- package/dist/gui/EFTogglePlay.js.map +1 -0
- package/dist/gui/EFWorkbench.d.ts +24 -16
- package/dist/gui/EFWorkbench.js +6 -1
- package/dist/gui/EFWorkbench.js.map +1 -0
- package/dist/gui/PlaybackController.d.ts +54 -50
- package/dist/gui/PlaybackController.js +18 -0
- package/dist/gui/PlaybackController.js.map +1 -0
- package/dist/gui/TWMixin.js +5 -1
- package/dist/gui/TWMixin.js.map +1 -0
- package/dist/gui/TWMixin2.js +6 -1
- package/dist/gui/TWMixin2.js.map +1 -0
- package/dist/gui/TargetOrContextMixin.js +5 -0
- package/dist/gui/TargetOrContextMixin.js.map +1 -0
- package/dist/gui/currentTimeContext.js +5 -0
- package/dist/gui/currentTimeContext.js.map +1 -0
- package/dist/gui/durationContext.js +5 -0
- package/dist/gui/durationContext.js.map +1 -0
- package/dist/gui/efContext.js +5 -0
- package/dist/gui/efContext.js.map +1 -0
- package/dist/gui/fetchContext.js +5 -0
- package/dist/gui/fetchContext.js.map +1 -0
- package/dist/gui/focusContext.d.ts +6 -5
- package/dist/gui/focusContext.js +5 -0
- package/dist/gui/focusContext.js.map +1 -0
- package/dist/gui/focusedElementContext.js +5 -0
- package/dist/gui/focusedElementContext.js.map +1 -0
- package/dist/gui/playingContext.js +5 -0
- package/dist/gui/playingContext.js.map +1 -0
- package/dist/index.d.ts +27 -26
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -0
- package/dist/msToTimeCode.js +4 -0
- package/dist/msToTimeCode.js.map +1 -0
- package/dist/otel/BridgeSpanExporter.js +5 -0
- package/dist/otel/BridgeSpanExporter.js.map +1 -0
- package/dist/otel/setupBrowserTracing.js +7 -2
- package/dist/otel/setupBrowserTracing.js.map +1 -0
- package/dist/otel/tracingHelpers.d.ts +7 -34
- package/dist/otel/tracingHelpers.js +34 -2
- package/dist/otel/tracingHelpers.js.map +1 -0
- package/dist/transcoding/cache/RequestDeduplicator.js +25 -0
- package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -0
- package/dist/transcoding/cache/URLTokenDeduplicator.js +23 -0
- package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -0
- package/dist/transcoding/types/index.d.ts +96 -270
- package/dist/transcoding/utils/UrlGenerator.d.ts +30 -25
- package/dist/transcoding/utils/UrlGenerator.js +19 -0
- package/dist/transcoding/utils/UrlGenerator.js.map +1 -0
- package/dist/utils/LRUCache.js +44 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/package.json +11 -24
- package/tsdown.config.ts +36 -0
- package/dist/DelayedLoadingState.d.ts +0 -48
- package/dist/DelayedLoadingState.integration.test.d.ts +0 -1
- package/dist/DelayedLoadingState.test.d.ts +0 -1
- package/dist/EF_INTERACTIVE.d.ts +0 -1
- package/dist/EF_RENDERING.d.ts +0 -1
- package/dist/LoadingDebounce.test.d.ts +0 -1
- package/dist/ManualScrubTest.test.d.ts +0 -1
- package/dist/ScrubResolvedFlashing.test.d.ts +0 -1
- package/dist/ScrubTrackManager.test.d.ts +0 -1
- package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
- package/dist/VideoStuckDiagnostic.test.d.ts +0 -1
- package/dist/attachContextRoot.d.ts +0 -1
- package/dist/elements/ContextProxiesController.d.ts +0 -39
- package/dist/elements/CrossUpdateController.d.ts +0 -8
- package/dist/elements/EFAudio.browsertest.d.ts +0 -0
- package/dist/elements/EFCaptions.browsertest.d.ts +0 -0
- package/dist/elements/EFImage.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +0 -19
- package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +0 -1
- package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/AssetMediaEngine.d.ts +0 -56
- package/dist/elements/EFMedia/BaseMediaEngine.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/BaseMediaEngine.d.ts +0 -103
- package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/JitMediaEngine.d.ts +0 -46
- package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +0 -3
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +0 -3
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
- package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +0 -7
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +0 -4
- package/dist/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +0 -3
- package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +0 -7
- package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +0 -39
- package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +0 -28
- package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +0 -1
- package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +0 -11
- package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +0 -27
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +0 -9
- package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +0 -17
- package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +0 -29
- package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -25
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.d.ts +0 -8
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.d.ts +0 -3
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.d.ts +0 -6
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.d.ts +0 -4
- package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.d.ts +0 -4
- package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.d.ts +0 -6
- package/dist/elements/EFMedia.browsertest.d.ts +0 -10
- package/dist/elements/EFSurface.browsertest.d.ts +0 -0
- package/dist/elements/EFTemporal.browsertest.d.ts +0 -22
- package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
- package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
- package/dist/elements/EFTimegroup.browsertest.d.ts +0 -41
- package/dist/elements/EFVideo.browsertest.d.ts +0 -0
- package/dist/elements/FetchContext.browsertest.d.ts +0 -0
- package/dist/elements/TargetController.browsertest.d.ts +0 -19
- package/dist/elements/durationConverter.d.ts +0 -16
- package/dist/elements/parseTimeToMs.d.ts +0 -1
- package/dist/elements/printTaskStatus.d.ts +0 -2
- package/dist/elements/renderTemporalAudio.d.ts +0 -10
- package/dist/elements/updateAnimations.browsertest.d.ts +0 -13
- package/dist/elements/updateAnimations.d.ts +0 -24
- package/dist/elements/util.d.ts +0 -3
- package/dist/gui/ContextMixin.browsertest.d.ts +0 -15
- package/dist/gui/Controllable.browsertest.d.ts +0 -0
- package/dist/gui/EFControls.browsertest.d.ts +0 -11
- package/dist/gui/EFDial.browsertest.d.ts +0 -0
- package/dist/gui/EFFilmstrip.browsertest.d.ts +0 -11
- package/dist/gui/EFPause.browsertest.d.ts +0 -0
- package/dist/gui/EFPlay.browsertest.d.ts +0 -0
- package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
- package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
- package/dist/gui/TWMixin.d.ts +0 -2
- package/dist/gui/TargetOrContextMixin.d.ts +0 -10
- package/dist/gui/currentTimeContext.d.ts +0 -3
- package/dist/gui/durationContext.d.ts +0 -3
- package/dist/gui/efContext.d.ts +0 -4
- package/dist/gui/fetchContext.d.ts +0 -3
- package/dist/gui/focusedElementContext.d.ts +0 -3
- package/dist/gui/playingContext.d.ts +0 -6
- package/dist/msToTimeCode.d.ts +0 -1
- package/dist/otel/BridgeSpanExporter.d.ts +0 -13
- package/dist/otel/setupBrowserTracing.d.ts +0 -12
- package/dist/style.css +0 -2
- package/dist/transcoding/cache/RequestDeduplicator.d.ts +0 -29
- package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +0 -1
- package/dist/transcoding/cache/URLTokenDeduplicator.d.ts +0 -38
- package/dist/transcoding/cache/URLTokenDeduplicator.test.d.ts +0 -1
- package/dist/transcoding/utils/MediaUtils.d.ts +0 -9
- package/dist/transcoding/utils/constants.d.ts +0 -27
- package/dist/utils/LRUCache.d.ts +0 -80
- package/dist/utils/LRUCache.test.d.ts +0 -1
- /package/dist/{LoadingIndicator.browsertest.d.ts → elements.js} +0 -0
|
@@ -1,106 +1,112 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { EFMedia } from
|
|
1
|
+
import { TemporalMixinInterface } from "./EFTemporal.js";
|
|
2
|
+
import { ContextMixinInterface } from "../gui/ContextMixin.js";
|
|
3
|
+
import { EFMedia } from "./EFMedia.js";
|
|
4
|
+
import { Task } from "@lit/task";
|
|
5
|
+
import * as lit0 from "lit";
|
|
6
|
+
import { LitElement, PropertyValues } from "lit";
|
|
7
|
+
import * as lit_html0 from "lit-html";
|
|
8
|
+
|
|
9
|
+
//#region src/elements/EFTimegroup.d.ts
|
|
4
10
|
declare global {
|
|
5
|
-
|
|
11
|
+
var EF_DEV_WORKBENCH: boolean | undefined;
|
|
6
12
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
frameTask: Task<readonly [number, number], void>;
|
|
99
|
-
seekTask: Task<readonly [number | undefined], number | undefined>;
|
|
13
|
+
declare const EFTimegroup_base: (new (...args: any[]) => TemporalMixinInterface) & typeof LitElement;
|
|
14
|
+
declare class EFTimegroup extends EFTimegroup_base {
|
|
15
|
+
#private;
|
|
16
|
+
static get observedAttributes(): string[];
|
|
17
|
+
static styles: lit0.CSSResult;
|
|
18
|
+
_timeGroupContext: this;
|
|
19
|
+
efContext: this;
|
|
20
|
+
mode: "fit" | "fixed" | "sequence" | "contain";
|
|
21
|
+
overlapMs: number;
|
|
22
|
+
fps: number;
|
|
23
|
+
attributeChangedCallback(name: string, old: string | null, value: string | null): void;
|
|
24
|
+
fit: "none" | "contain" | "cover";
|
|
25
|
+
/**
|
|
26
|
+
* Get the effective FPS for this timegroup.
|
|
27
|
+
* During rendering, uses the render options FPS if available.
|
|
28
|
+
* Otherwise uses the configured fps property.
|
|
29
|
+
*/
|
|
30
|
+
get effectiveFps(): number;
|
|
31
|
+
/**
|
|
32
|
+
* Quantize a time value to the nearest frame boundary based on effectiveFps.
|
|
33
|
+
* @param timeSeconds - Time in seconds
|
|
34
|
+
* @returns Time quantized to frame boundaries in seconds
|
|
35
|
+
*/
|
|
36
|
+
private quantizeToFrameTime;
|
|
37
|
+
private runThrottledFrameTask;
|
|
38
|
+
set currentTime(time: number);
|
|
39
|
+
get currentTime(): number;
|
|
40
|
+
set currentTimeMs(ms: number);
|
|
41
|
+
get currentTimeMs(): number;
|
|
42
|
+
/**
|
|
43
|
+
* Seek to a specific time and wait for all frames to be ready.
|
|
44
|
+
* This is the recommended way to seek in tests and programmatic control.
|
|
45
|
+
*
|
|
46
|
+
* @param timeMs - Time in milliseconds to seek to
|
|
47
|
+
* @returns Promise that resolves when the seek is complete and all visible children are ready
|
|
48
|
+
*/
|
|
49
|
+
seek(timeMs: number): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Determines if this is a root timegroup (no parent timegroups)
|
|
52
|
+
*/
|
|
53
|
+
get isRootTimegroup(): boolean;
|
|
54
|
+
saveTimeToLocalStorage(time: number): void;
|
|
55
|
+
render(): lit_html0.TemplateResult<1>;
|
|
56
|
+
loadTimeFromLocalStorage(): number | undefined;
|
|
57
|
+
connectedCallback(): void;
|
|
58
|
+
protected updated(changedProperties: PropertyValues): void;
|
|
59
|
+
disconnectedCallback(): void;
|
|
60
|
+
get storageKey(): string;
|
|
61
|
+
get intrinsicDurationMs(): number | undefined;
|
|
62
|
+
get hasOwnDuration(): boolean;
|
|
63
|
+
get durationMs(): number;
|
|
64
|
+
getPendingFrameTasks(signal?: AbortSignal): Promise<Task<readonly unknown[], unknown>[]>;
|
|
65
|
+
waitForNestedUpdates(signal?: AbortSignal): Promise<void>;
|
|
66
|
+
waitForFrameTasks(): Promise<void>;
|
|
67
|
+
mediaDurationsPromise: Promise<void> | undefined;
|
|
68
|
+
waitForMediaDurations(): Promise<void>;
|
|
69
|
+
get childTemporals(): TemporalMixinInterface[];
|
|
70
|
+
get contextProvider(): ContextMixinInterface | null;
|
|
71
|
+
/**
|
|
72
|
+
* Returns true if the timegroup should be wrapped with a workbench.
|
|
73
|
+
*
|
|
74
|
+
* A timegroup should be wrapped with a workbench if:
|
|
75
|
+
* - It's being rendered (EF_RENDERING), OR
|
|
76
|
+
* - It's in interactive mode (EF_INTERACTIVE) with the dev workbench flag set
|
|
77
|
+
*
|
|
78
|
+
* If the timegroup is already wrapped in a context provider like ef-preview,
|
|
79
|
+
* it should NOT be wrapped in a workbench.
|
|
80
|
+
*/
|
|
81
|
+
shouldWrapWithWorkbench(): boolean;
|
|
82
|
+
wrapWithWorkbench(): void;
|
|
83
|
+
get efElements(): Element[];
|
|
84
|
+
/**
|
|
85
|
+
* Returns media elements for playback audio rendering
|
|
86
|
+
* For standalone media, returns [this]; for timegroups, returns all descendants
|
|
87
|
+
* Used by PlaybackController for audio-driven playback
|
|
88
|
+
*/
|
|
89
|
+
getMediaElements(): EFMedia[];
|
|
90
|
+
/**
|
|
91
|
+
* Render audio buffer for playback
|
|
92
|
+
* Called by PlaybackController during live playback
|
|
93
|
+
* Delegates to shared renderTemporalAudio utility for consistent behavior
|
|
94
|
+
*/
|
|
95
|
+
renderAudio(fromMs: number, toMs: number): Promise<AudioBuffer>;
|
|
96
|
+
/**
|
|
97
|
+
* TEMPORARY TEST METHOD: Renders audio and immediately plays it back
|
|
98
|
+
* Usage: timegroup.testPlayAudio(0, 5000) // Play first 5 seconds
|
|
99
|
+
*/
|
|
100
|
+
testPlayAudio(fromMs: number, toMs: number): Promise<void>;
|
|
101
|
+
loadMd5Sums(): Promise<void>;
|
|
102
|
+
frameTask: Task<readonly [number, number], void>;
|
|
103
|
+
seekTask: Task<readonly [number | undefined], number | undefined>;
|
|
100
104
|
}
|
|
101
105
|
declare global {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
interface HTMLElementTagNameMap {
|
|
107
|
+
"ef-timegroup": EFTimegroup & Element;
|
|
108
|
+
}
|
|
105
109
|
}
|
|
106
|
-
|
|
110
|
+
//#endregion
|
|
111
|
+
export { EFTimegroup };
|
|
112
|
+
//# sourceMappingURL=EFTimegroup.d.ts.map
|
|
@@ -17,9 +17,11 @@ import { Task, TaskStatus } from "@lit/task";
|
|
|
17
17
|
import debug from "debug";
|
|
18
18
|
import { LitElement, css, html } from "lit";
|
|
19
19
|
import { customElement, property } from "lit/decorators.js";
|
|
20
|
+
|
|
21
|
+
//#region src/elements/EFTimegroup.ts
|
|
20
22
|
var _EFTimegroup;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
const log = debug("ef:elements:EFTimegroup");
|
|
24
|
+
let sequenceDurationCache = /* @__PURE__ */ new WeakMap();
|
|
23
25
|
const flushSequenceDurationCache = () => {
|
|
24
26
|
sequenceDurationCache = /* @__PURE__ */ new WeakMap();
|
|
25
27
|
};
|
|
@@ -28,7 +30,7 @@ const shallowGetTimegroups = (element, groups = []) => {
|
|
|
28
30
|
else shallowGetTimegroups(child, groups);
|
|
29
31
|
return groups;
|
|
30
32
|
};
|
|
31
|
-
|
|
33
|
+
let EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(LitElement))) {
|
|
32
34
|
static {
|
|
33
35
|
_EFTimegroup = this;
|
|
34
36
|
}
|
|
@@ -122,10 +124,20 @@ var EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(Li
|
|
|
122
124
|
#seekInProgress = false;
|
|
123
125
|
#pendingSeekTime;
|
|
124
126
|
#processingPendingSeek = false;
|
|
127
|
+
/**
|
|
128
|
+
* Get the effective FPS for this timegroup.
|
|
129
|
+
* During rendering, uses the render options FPS if available.
|
|
130
|
+
* Otherwise uses the configured fps property.
|
|
131
|
+
*/
|
|
125
132
|
get effectiveFps() {
|
|
126
133
|
if (typeof window !== "undefined" && window.EF_FRAMEGEN?.renderOptions) return window.EF_FRAMEGEN.renderOptions.encoderOptions.video.framerate;
|
|
127
134
|
return this.fps;
|
|
128
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Quantize a time value to the nearest frame boundary based on effectiveFps.
|
|
138
|
+
* @param timeSeconds - Time in seconds
|
|
139
|
+
* @returns Time quantized to frame boundaries in seconds
|
|
140
|
+
*/
|
|
129
141
|
quantizeToFrameTime(timeSeconds) {
|
|
130
142
|
const fps = this.effectiveFps;
|
|
131
143
|
if (!fps || fps <= 0) return timeSeconds;
|
|
@@ -177,6 +189,13 @@ var EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(Li
|
|
|
177
189
|
get currentTimeMs() {
|
|
178
190
|
return this.currentTime * 1e3;
|
|
179
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Seek to a specific time and wait for all frames to be ready.
|
|
194
|
+
* This is the recommended way to seek in tests and programmatic control.
|
|
195
|
+
*
|
|
196
|
+
* @param timeMs - Time in milliseconds to seek to
|
|
197
|
+
* @returns Promise that resolves when the seek is complete and all visible children are ready
|
|
198
|
+
*/
|
|
180
199
|
async seek(timeMs) {
|
|
181
200
|
this.currentTimeMs = timeMs;
|
|
182
201
|
await this.seekTask.taskComplete;
|
|
@@ -190,6 +209,9 @@ var EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(Li
|
|
|
190
209
|
else await element.updateComplete;
|
|
191
210
|
}));
|
|
192
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* Determines if this is a root timegroup (no parent timegroups)
|
|
214
|
+
*/
|
|
193
215
|
get isRootTimegroup() {
|
|
194
216
|
return !this.parentTimegroup;
|
|
195
217
|
}
|
|
@@ -340,6 +362,12 @@ var EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(Li
|
|
|
340
362
|
if (!this.mediaDurationsPromise) this.mediaDurationsPromise = this.#waitForMediaDurations();
|
|
341
363
|
return this.mediaDurationsPromise;
|
|
342
364
|
}
|
|
365
|
+
/**
|
|
366
|
+
* Wait for all media elements to load their initial segments.
|
|
367
|
+
* Ideally we would only need the extracted index json data, but
|
|
368
|
+
* that caused issues with constructing audio data. We had negative durations
|
|
369
|
+
* in calculations and it was not clear why.
|
|
370
|
+
*/
|
|
343
371
|
async #waitForMediaDurations() {
|
|
344
372
|
return withSpan("timegroup.waitForMediaDurations", {
|
|
345
373
|
timegroupId: this.id || "unknown",
|
|
@@ -366,6 +394,16 @@ var EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(Li
|
|
|
366
394
|
}
|
|
367
395
|
return null;
|
|
368
396
|
}
|
|
397
|
+
/**
|
|
398
|
+
* Returns true if the timegroup should be wrapped with a workbench.
|
|
399
|
+
*
|
|
400
|
+
* A timegroup should be wrapped with a workbench if:
|
|
401
|
+
* - It's being rendered (EF_RENDERING), OR
|
|
402
|
+
* - It's in interactive mode (EF_INTERACTIVE) with the dev workbench flag set
|
|
403
|
+
*
|
|
404
|
+
* If the timegroup is already wrapped in a context provider like ef-preview,
|
|
405
|
+
* it should NOT be wrapped in a workbench.
|
|
406
|
+
*/
|
|
369
407
|
shouldWrapWithWorkbench() {
|
|
370
408
|
if (EF_RENDERING?.() === true) return this.closest("ef-timegroup") === this && this.closest("ef-preview") === null && this.closest("ef-workbench") === null && this.closest("test-context") === null;
|
|
371
409
|
if (!globalThis.EF_DEV_WORKBENCH) return false;
|
|
@@ -385,12 +423,26 @@ var EFTimegroup = class EFTimegroup$1 extends EFTargetable(EFTemporal(TWMixin(Li
|
|
|
385
423
|
get efElements() {
|
|
386
424
|
return Array.from(this.querySelectorAll("ef-audio, ef-video, ef-image, ef-captions, ef-waveform"));
|
|
387
425
|
}
|
|
426
|
+
/**
|
|
427
|
+
* Returns media elements for playback audio rendering
|
|
428
|
+
* For standalone media, returns [this]; for timegroups, returns all descendants
|
|
429
|
+
* Used by PlaybackController for audio-driven playback
|
|
430
|
+
*/
|
|
388
431
|
getMediaElements() {
|
|
389
432
|
return deepGetMediaElements(this);
|
|
390
433
|
}
|
|
434
|
+
/**
|
|
435
|
+
* Render audio buffer for playback
|
|
436
|
+
* Called by PlaybackController during live playback
|
|
437
|
+
* Delegates to shared renderTemporalAudio utility for consistent behavior
|
|
438
|
+
*/
|
|
391
439
|
async renderAudio(fromMs, toMs) {
|
|
392
440
|
return renderTemporalAudio(this, fromMs, toMs);
|
|
393
441
|
}
|
|
442
|
+
/**
|
|
443
|
+
* TEMPORARY TEST METHOD: Renders audio and immediately plays it back
|
|
444
|
+
* Usage: timegroup.testPlayAudio(0, 5000) // Play first 5 seconds
|
|
445
|
+
*/
|
|
394
446
|
async testPlayAudio(fromMs, toMs) {
|
|
395
447
|
const renderedBuffer = await this.renderAudio(fromMs, toMs);
|
|
396
448
|
const playbackContext = new AudioContext();
|
|
@@ -430,4 +482,7 @@ __decorate([property({
|
|
|
430
482
|
attribute: "currenttime"
|
|
431
483
|
})], EFTimegroup.prototype, "currentTime", null);
|
|
432
484
|
EFTimegroup = _EFTimegroup = __decorate([customElement("ef-timegroup")], EFTimegroup);
|
|
485
|
+
|
|
486
|
+
//#endregion
|
|
433
487
|
export { EFTimegroup, flushSequenceDurationCache, shallowGetTimegroups };
|
|
488
|
+
//# sourceMappingURL=EFTimegroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EFTimegroup.js","names":["sequenceDurationCache: WeakMap<EFTimegroup, number>","EFTimegroup","#pendingSeekTime","#currentTime","#seekInProgress","#processingPendingSeek","#handleSlotChange","#previousDurationMs","#resizeObserver","#waitForMediaDurations","loaderTasks: Promise<any>[]"],"sources":["../../src/elements/EFTimegroup.ts"],"sourcesContent":["import { provide } from \"@lit/context\";\nimport { Task, TaskStatus } from \"@lit/task\";\nimport debug from \"debug\";\nimport { css, html, LitElement, type PropertyValues } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nimport { EF_INTERACTIVE } from \"../EF_INTERACTIVE.js\";\nimport { EF_RENDERING } from \"../EF_RENDERING.js\";\nimport { isContextMixin } from \"../gui/ContextMixin.js\";\nimport { efContext } from \"../gui/efContext.js\";\nimport { TWMixin } from \"../gui/TWMixin.js\";\nimport { isTracingEnabled, withSpan } from \"../otel/tracingHelpers.js\";\nimport { deepGetMediaElements, type EFMedia } from \"./EFMedia.js\";\nimport {\n deepGetElementsWithFrameTasks,\n EFTemporal,\n flushStartTimeMsCache,\n resetTemporalCache,\n shallowGetTemporalElements,\n timegroupContext,\n} from \"./EFTemporal.js\";\nimport { parseTimeToMs } from \"./parseTimeToMs.js\";\nimport { renderTemporalAudio } from \"./renderTemporalAudio.js\";\nimport { EFTargetable } from \"./TargetController.js\";\nimport { TimegroupController } from \"./TimegroupController.js\";\nimport {\n evaluateTemporalStateForAnimation,\n updateAnimations,\n} from \"./updateAnimations.ts\";\n\ndeclare global {\n var EF_DEV_WORKBENCH: boolean | undefined;\n}\n\nconst log = debug(\"ef:elements:EFTimegroup\");\n\n// Cache for sequence mode duration calculations to avoid O(n) recalculation\nlet sequenceDurationCache: WeakMap<EFTimegroup, number> = new WeakMap();\n\nexport const flushSequenceDurationCache = () => {\n sequenceDurationCache = new WeakMap();\n};\n\nexport const shallowGetTimegroups = (\n element: Element,\n groups: EFTimegroup[] = [],\n) => {\n for (const child of Array.from(element.children)) {\n if (child instanceof EFTimegroup) {\n groups.push(child);\n } else {\n shallowGetTimegroups(child, groups);\n }\n }\n return groups;\n};\n\n@customElement(\"ef-timegroup\")\nexport class EFTimegroup extends EFTargetable(EFTemporal(TWMixin(LitElement))) {\n static get observedAttributes(): string[] {\n // biome-ignore lint/complexity/noThisInStatic: It's okay to use this here\n const parentAttributes = super.observedAttributes || [];\n return [\n ...parentAttributes,\n \"mode\",\n \"overlap\",\n \"currenttime\",\n \"fit\",\n \"fps\",\n ];\n }\n\n static styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n }\n\n ::slotted(ef-timegroup) {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: initial;\n }\n `;\n\n @provide({ context: timegroupContext })\n _timeGroupContext = this;\n\n @provide({ context: efContext })\n efContext = this;\n\n mode: \"fit\" | \"fixed\" | \"sequence\" | \"contain\" = \"contain\";\n overlapMs = 0;\n\n @property({ type: Number })\n fps = 30;\n\n attributeChangedCallback(\n name: string,\n old: string | null,\n value: string | null,\n ): void {\n if (name === \"mode\" && value) {\n this.mode = value as typeof this.mode;\n }\n if (name === \"overlap\" && value) {\n this.overlapMs = parseTimeToMs(value);\n }\n if (name === \"fps\" && value) {\n this.fps = Number.parseFloat(value);\n }\n super.attributeChangedCallback(name, old, value);\n }\n\n @property({ type: String })\n fit: \"none\" | \"contain\" | \"cover\" = \"none\";\n\n #resizeObserver?: ResizeObserver;\n\n #currentTime: number | undefined = undefined;\n #seekInProgress = false;\n #pendingSeekTime: number | undefined;\n #processingPendingSeek = false;\n\n /**\n * Get the effective FPS for this timegroup.\n * During rendering, uses the render options FPS if available.\n * Otherwise uses the configured fps property.\n */\n get effectiveFps(): number {\n // During rendering, prefer the render options FPS\n if (typeof window !== \"undefined\" && window.EF_FRAMEGEN?.renderOptions) {\n return window.EF_FRAMEGEN.renderOptions.encoderOptions.video.framerate;\n }\n return this.fps;\n }\n\n /**\n * Quantize a time value to the nearest frame boundary based on effectiveFps.\n * @param timeSeconds - Time in seconds\n * @returns Time quantized to frame boundaries in seconds\n */\n private quantizeToFrameTime(timeSeconds: number): number {\n const fps = this.effectiveFps;\n if (!fps || fps <= 0) return timeSeconds;\n const frameDurationS = 1 / fps;\n return Math.round(timeSeconds / frameDurationS) * frameDurationS;\n }\n\n private async runThrottledFrameTask(): Promise<void> {\n if (this.playbackController) {\n return this.playbackController.runThrottledFrameTask();\n }\n await this.frameTask.run();\n }\n\n @property({ type: Number, attribute: \"currenttime\" })\n set currentTime(time: number) {\n // Quantize time to frame boundaries based on fps\n // Do this BEFORE delegating to playbackController to ensure consistency\n time = this.quantizeToFrameTime(time);\n\n if (this.playbackController) {\n this.playbackController.currentTime = time;\n return;\n }\n\n time = Math.max(0, Math.min(this.durationMs / 1000, time));\n if (!this.isRootTimegroup) {\n return;\n }\n if (Number.isNaN(time)) {\n return;\n }\n if (time === this.#currentTime && !this.#processingPendingSeek) {\n return;\n }\n if (this.#pendingSeekTime === time) {\n return;\n }\n\n if (this.#seekInProgress) {\n this.#pendingSeekTime = time;\n this.#currentTime = time;\n return;\n }\n\n this.#currentTime = time;\n this.#seekInProgress = true;\n\n this.seekTask.run().finally(() => {\n if (\n this.#pendingSeekTime !== undefined &&\n this.#pendingSeekTime !== time\n ) {\n const pendingTime = this.#pendingSeekTime;\n this.#pendingSeekTime = undefined;\n this.#processingPendingSeek = true;\n try {\n this.currentTime = pendingTime;\n } finally {\n this.#processingPendingSeek = false;\n }\n } else {\n this.#pendingSeekTime = undefined;\n }\n });\n }\n\n get currentTime() {\n if (this.playbackController) {\n return this.playbackController.currentTime;\n }\n return this.#currentTime ?? 0;\n }\n\n set currentTimeMs(ms: number) {\n this.currentTime = ms / 1000;\n }\n\n get currentTimeMs() {\n return this.currentTime * 1000;\n }\n\n /**\n * Seek to a specific time and wait for all frames to be ready.\n * This is the recommended way to seek in tests and programmatic control.\n *\n * @param timeMs - Time in milliseconds to seek to\n * @returns Promise that resolves when the seek is complete and all visible children are ready\n */\n async seek(timeMs: number): Promise<void> {\n this.currentTimeMs = timeMs;\n await this.seekTask.taskComplete;\n\n // Handle localStorage when playbackController delegates seek\n if (this.playbackController) {\n this.saveTimeToLocalStorage(this.currentTime);\n }\n\n await this.frameTask.taskComplete;\n\n // Ensure all visible elements have completed their reactive update cycles AND frame rendering\n // waitForFrameTasks() calls frameTask.run() on children, but this may happen before child\n // elements have processed property changes from requestUpdate(). To ensure frame data is\n // accurate, we wait for updateComplete first, then ensure the frameTask has run with the\n // updated properties. Elements like EFVideo provide waitForFrameReady() for this pattern.\n const temporalElements = deepGetElementsWithFrameTasks(this);\n const visibleElements = temporalElements.filter((element) => {\n const animationState = evaluateTemporalStateForAnimation(element);\n return animationState.isVisible;\n });\n\n await Promise.all(\n visibleElements.map(async (element) => {\n if (\n \"waitForFrameReady\" in element &&\n typeof element.waitForFrameReady === \"function\"\n ) {\n await (element as any).waitForFrameReady();\n } else {\n await element.updateComplete;\n }\n }),\n );\n }\n\n /**\n * Determines if this is a root timegroup (no parent timegroups)\n */\n get isRootTimegroup(): boolean {\n return !this.parentTimegroup;\n }\n\n saveTimeToLocalStorage(time: number) {\n try {\n if (this.id && this.isConnected && !Number.isNaN(time)) {\n localStorage.setItem(this.storageKey, time.toString());\n }\n } catch (error) {\n log(\"Failed to save time to localStorage\", error);\n }\n }\n\n render() {\n return html`<slot @slotchange=${this.#handleSlotChange}></slot> `;\n }\n\n #handleSlotChange = () => {\n // Invalidate caches when slot content changes\n resetTemporalCache();\n flushSequenceDurationCache();\n flushStartTimeMsCache();\n\n // Request update to trigger recalculation of dependent properties\n this.requestUpdate();\n };\n\n loadTimeFromLocalStorage(): number | undefined {\n if (this.id) {\n try {\n const storedValue = localStorage.getItem(this.storageKey);\n if (storedValue === null) {\n return undefined;\n }\n return Number.parseFloat(storedValue);\n } catch (error) {\n log(\"Failed to load time from localStorage\", error);\n }\n }\n return undefined;\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n if (!this.playbackController) {\n this.waitForMediaDurations().then(() => {\n if (this.id) {\n const maybeLoadedTime = this.loadTimeFromLocalStorage();\n if (maybeLoadedTime !== undefined) {\n this.currentTime = maybeLoadedTime;\n }\n }\n if (EF_INTERACTIVE && this.seekTask.status === TaskStatus.INITIAL) {\n this.seekTask.run();\n }\n });\n }\n\n if (this.parentTimegroup) {\n new TimegroupController(this.parentTimegroup, this);\n }\n\n if (this.shouldWrapWithWorkbench()) {\n this.wrapWithWorkbench();\n }\n }\n\n #previousDurationMs = 0;\n\n protected updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n if (changedProperties.has(\"mode\") || changedProperties.has(\"overlapMs\")) {\n sequenceDurationCache.delete(this);\n }\n\n if (this.#previousDurationMs !== this.durationMs) {\n this.#previousDurationMs = this.durationMs;\n this.runThrottledFrameTask();\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n }\n\n get storageKey() {\n if (!this.id) {\n throw new Error(\"Timegroup must have an id to use localStorage.\");\n }\n return `ef-timegroup-${this.id}`;\n }\n\n get intrinsicDurationMs() {\n if (this.hasExplicitDuration) {\n return this.explicitDurationMs;\n }\n return undefined;\n }\n\n get hasOwnDuration() {\n return (\n this.mode === \"contain\" ||\n this.mode === \"sequence\" ||\n (this.mode === \"fixed\" && this.hasExplicitDuration)\n );\n }\n\n get durationMs(): number {\n switch (this.mode) {\n case \"fit\": {\n if (!this.parentTimegroup) {\n return 0;\n }\n return this.parentTimegroup.durationMs;\n }\n case \"fixed\":\n return super.durationMs;\n case \"sequence\": {\n // Check cache first to avoid expensive O(n) recalculation\n const cachedDuration = sequenceDurationCache.get(this);\n if (cachedDuration !== undefined) {\n return cachedDuration;\n }\n\n let duration = 0;\n this.childTemporals.forEach((child, index) => {\n if (child instanceof EFTimegroup && child.mode === \"fit\") {\n return;\n }\n if (index > 0) {\n duration -= this.overlapMs;\n }\n duration += child.durationMs;\n });\n\n // Cache the calculated duration\n sequenceDurationCache.set(this, duration);\n return duration;\n }\n case \"contain\": {\n let maxDuration = 0;\n for (const child of this.childTemporals) {\n // fit timegroups look \"up\" to their parent timegroup for their duration\n // so we need to skip them to avoid an infinite loop\n if (child instanceof EFTimegroup && child.mode === \"fit\") {\n continue;\n }\n if (!child.hasOwnDuration) {\n continue;\n }\n maxDuration = Math.max(maxDuration, child.durationMs);\n }\n return maxDuration;\n }\n default:\n throw new Error(`Invalid time mode: ${this.mode}`);\n }\n }\n\n async getPendingFrameTasks(signal?: AbortSignal) {\n await this.waitForNestedUpdates(signal);\n signal?.throwIfAborted();\n const temporals = deepGetElementsWithFrameTasks(this);\n\n // Filter to only include temporally visible elements for frame processing\n // (but keep all elements for duration calculations)\n // Use the target timeline time if we're in the middle of seeking\n const timelineTimeMs =\n (this.#pendingSeekTime ?? this.#currentTime ?? 0) * 1000;\n const activeTemporals = temporals.filter((temporal) => {\n // Skip timeline filtering if temporal doesn't have timeline position info\n if (!(\"startTimeMs\" in temporal) || !(\"endTimeMs\" in temporal)) {\n return true; // Keep non-temporal elements\n }\n\n // Only process frame tasks for elements that overlap the current timeline\n // Use same epsilon logic as seek task for consistency\n const epsilon = 0.001; // 1µs offset to break ties at boundaries\n const startTimeMs = (temporal as any).startTimeMs as number;\n const endTimeMs = (temporal as any).endTimeMs as number;\n const elementStartsBeforeEnd = startTimeMs <= timelineTimeMs + epsilon;\n // Root timegroups should remain visible at exact end time, but other elements use exclusive end for clean transitions\n const isRootTimegroup =\n temporal.tagName.toLowerCase() === \"ef-timegroup\" &&\n !(temporal as any).parentTimegroup;\n const useInclusiveEnd = isRootTimegroup;\n const elementEndsAfterStart = useInclusiveEnd\n ? endTimeMs >= timelineTimeMs\n : endTimeMs > timelineTimeMs;\n return elementStartsBeforeEnd && elementEndsAfterStart;\n });\n\n const frameTasks = activeTemporals.map((temporal) => temporal.frameTask);\n frameTasks.forEach((task) => {\n task.run();\n });\n\n return frameTasks.filter((task) => task.status < TaskStatus.COMPLETE);\n }\n\n async waitForNestedUpdates(signal?: AbortSignal) {\n const limit = 10;\n let steps = 0;\n let isComplete = true;\n while (true) {\n steps++;\n if (steps > limit) {\n throw new Error(\"Reached update depth limit.\");\n }\n isComplete = await this.updateComplete;\n signal?.throwIfAborted();\n if (isComplete) {\n break;\n }\n }\n }\n\n async waitForFrameTasks() {\n const result = await withSpan(\n \"timegroup.waitForFrameTasks\",\n {\n timegroupId: this.id || \"unknown\",\n mode: this.mode,\n },\n undefined,\n async (span) => {\n const innerStart = performance.now();\n\n const temporalElements = deepGetElementsWithFrameTasks(this);\n if (isTracingEnabled()) {\n span.setAttribute(\"temporalElementsCount\", temporalElements.length);\n }\n\n // Filter to only include temporally visible elements for frame processing\n // Use animation-friendly visibility to prevent animation jumps at exact boundaries\n const visibleElements = temporalElements.filter((element) => {\n const animationState = evaluateTemporalStateForAnimation(element);\n return animationState.isVisible;\n });\n if (isTracingEnabled()) {\n span.setAttribute(\"visibleElementsCount\", visibleElements.length);\n }\n\n const promiseStart = performance.now();\n\n await Promise.all(\n visibleElements.map((element) => element.frameTask.run()),\n );\n const promiseEnd = performance.now();\n\n const innerEnd = performance.now();\n if (isTracingEnabled()) {\n span.setAttribute(\"actualInnerMs\", innerEnd - innerStart);\n span.setAttribute(\"promiseAwaitMs\", promiseEnd - promiseStart);\n }\n },\n );\n\n return result;\n }\n\n mediaDurationsPromise: Promise<void> | undefined = undefined;\n\n async waitForMediaDurations() {\n if (!this.mediaDurationsPromise) {\n this.mediaDurationsPromise = this.#waitForMediaDurations();\n }\n return this.mediaDurationsPromise;\n }\n\n /**\n * Wait for all media elements to load their initial segments.\n * Ideally we would only need the extracted index json data, but\n * that caused issues with constructing audio data. We had negative durations\n * in calculations and it was not clear why.\n */\n async #waitForMediaDurations() {\n return withSpan(\n \"timegroup.waitForMediaDurations\",\n {\n timegroupId: this.id || \"unknown\",\n mode: this.mode,\n },\n undefined,\n async (span) => {\n // We must await updateComplete to ensure all media elements inside this are connected\n // and will match deepGetMediaElements\n await this.updateComplete;\n const mediaElements = deepGetMediaElements(this);\n if (isTracingEnabled()) {\n span.setAttribute(\"mediaElementsCount\", mediaElements.length);\n }\n\n // Then, we must await the fragmentIndexTask to ensure all media elements have their\n // fragment index loaded, which is where their duration is parsed from.\n await Promise.all(\n mediaElements.map((m) =>\n m.mediaEngineTask.value\n ? Promise.resolve()\n : m.mediaEngineTask.run(),\n ),\n );\n\n // After waiting for durations, we must force some updates to cascade and ensure all temporal elements\n // have correct durations and start times. It is not ideal that we have to do this inside here,\n // but it is the best current way to ensure that all temporal elements have correct durations and start times.\n\n // Next, we must flush the startTimeMs cache to ensure all media elements have their\n // startTimeMs parsed fresh, otherwise the startTimeMs is cached per animation frame.\n flushStartTimeMsCache();\n\n // Flush duration cache since child durations may have changed\n flushSequenceDurationCache();\n\n // Request an update to the currentTime of this group, ensuring that time updates will cascade\n // down to children, forcing sequence groups to arrange correctly.\n // This also makes the filmstrip update correctly.\n this.requestUpdate(\"currentTime\");\n // Finally, we must await updateComplete to ensure all temporal elements have their\n // currentTime updated and all animations have run.\n\n await this.updateComplete;\n },\n );\n }\n\n get childTemporals() {\n return shallowGetTemporalElements(this);\n }\n\n get contextProvider() {\n let parent = this.parentNode;\n while (parent) {\n if (isContextMixin(parent)) {\n return parent;\n }\n parent = parent.parentNode;\n }\n return null;\n }\n\n /**\n * Returns true if the timegroup should be wrapped with a workbench.\n *\n * A timegroup should be wrapped with a workbench if:\n * - It's being rendered (EF_RENDERING), OR\n * - It's in interactive mode (EF_INTERACTIVE) with the dev workbench flag set\n *\n * If the timegroup is already wrapped in a context provider like ef-preview,\n * it should NOT be wrapped in a workbench.\n */\n shouldWrapWithWorkbench() {\n const isRendering = EF_RENDERING?.() === true;\n\n // During rendering, always wrap with workbench (needed by EF_FRAMEGEN)\n if (isRendering) {\n return (\n this.closest(\"ef-timegroup\") === this &&\n this.closest(\"ef-preview\") === null &&\n this.closest(\"ef-workbench\") === null &&\n this.closest(\"test-context\") === null\n );\n }\n\n // During interactive mode, respect the dev workbench flag\n if (!globalThis.EF_DEV_WORKBENCH) {\n return false;\n }\n\n return (\n EF_INTERACTIVE &&\n this.closest(\"ef-timegroup\") === this &&\n this.closest(\"ef-preview\") === null &&\n this.closest(\"ef-workbench\") === null &&\n this.closest(\"test-context\") === null\n );\n }\n\n wrapWithWorkbench() {\n const workbench = document.createElement(\"ef-workbench\");\n this.parentElement?.append(workbench);\n if (!this.hasAttribute(\"id\")) {\n this.setAttribute(\"id\", \"root-this\");\n }\n this.setAttribute(\"slot\", \"canvas\");\n workbench.append(this as unknown as Element);\n\n const filmstrip = document.createElement(\"ef-filmstrip\");\n filmstrip.setAttribute(\"slot\", \"timeline\");\n filmstrip.setAttribute(\"target\", this.id);\n workbench.append(filmstrip);\n }\n\n get efElements() {\n return Array.from(\n this.querySelectorAll(\n \"ef-audio, ef-video, ef-image, ef-captions, ef-waveform\",\n ),\n );\n }\n\n /**\n * Returns media elements for playback audio rendering\n * For standalone media, returns [this]; for timegroups, returns all descendants\n * Used by PlaybackController for audio-driven playback\n */\n getMediaElements(): EFMedia[] {\n return deepGetMediaElements(this);\n }\n\n /**\n * Render audio buffer for playback\n * Called by PlaybackController during live playback\n * Delegates to shared renderTemporalAudio utility for consistent behavior\n */\n async renderAudio(fromMs: number, toMs: number): Promise<AudioBuffer> {\n return renderTemporalAudio(this, fromMs, toMs);\n }\n\n /**\n * TEMPORARY TEST METHOD: Renders audio and immediately plays it back\n * Usage: timegroup.testPlayAudio(0, 5000) // Play first 5 seconds\n */\n async testPlayAudio(fromMs: number, toMs: number) {\n // Render the audio using the existing renderAudio method\n const renderedBuffer = await this.renderAudio(fromMs, toMs);\n\n // Create a regular AudioContext for playback\n const playbackContext = new AudioContext();\n\n // Create a buffer source and connect it\n const bufferSource = playbackContext.createBufferSource();\n bufferSource.buffer = renderedBuffer;\n bufferSource.connect(playbackContext.destination);\n\n // Start playback immediately\n bufferSource.start(0);\n\n // Return a promise that resolves when playback ends\n return new Promise<void>((resolve) => {\n bufferSource.onended = () => {\n playbackContext.close();\n resolve();\n };\n });\n }\n\n async loadMd5Sums() {\n const efElements = this.efElements;\n const loaderTasks: Promise<any>[] = [];\n for (const el of efElements) {\n const md5SumLoader = (el as any).md5SumLoader;\n if (md5SumLoader instanceof Task) {\n md5SumLoader.run();\n loaderTasks.push(md5SumLoader.taskComplete);\n }\n }\n\n await Promise.all(loaderTasks);\n\n efElements.forEach((el) => {\n if (\"productionSrc\" in el && el.productionSrc instanceof Function) {\n el.setAttribute(\"src\", el.productionSrc());\n }\n });\n }\n\n frameTask = new Task(this, {\n // autoRun: EF_INTERACTIVE,\n autoRun: false,\n args: () => [this.ownCurrentTimeMs, this.currentTimeMs] as const,\n task: async ([ownCurrentTimeMs, currentTimeMs]) => {\n if (this.isRootTimegroup) {\n await withSpan(\n \"timegroup.frameTask\",\n {\n timegroupId: this.id || \"unknown\",\n ownCurrentTimeMs,\n currentTimeMs,\n },\n undefined,\n async () => {\n await this.waitForFrameTasks();\n updateAnimations(this);\n },\n );\n }\n },\n });\n\n seekTask = new Task(this, {\n autoRun: false,\n args: () => [this.#pendingSeekTime ?? this.#currentTime] as const,\n onComplete: () => {},\n task: async ([targetTime]) => {\n if (this.playbackController) {\n await this.playbackController.seekTask.taskComplete;\n return this.currentTime;\n }\n\n if (!this.isRootTimegroup) {\n return;\n }\n return withSpan(\n \"timegroup.seekTask\",\n {\n timegroupId: this.id || \"unknown\",\n targetTime: targetTime ?? 0,\n durationMs: this.durationMs,\n },\n undefined,\n async (span) => {\n await this.waitForMediaDurations();\n const newTime = Math.max(\n 0,\n Math.min(targetTime ?? 0, this.durationMs / 1000),\n );\n if (isTracingEnabled()) {\n span.setAttribute(\"newTime\", newTime);\n }\n // Apply the clamped time back to currentTime\n\n this.#currentTime = newTime;\n this.requestUpdate(\"currentTime\");\n await this.runThrottledFrameTask();\n this.saveTimeToLocalStorage(this.#currentTime);\n this.#seekInProgress = false;\n return newTime;\n },\n );\n },\n });\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-timegroup\": EFTimegroup & Element;\n }\n}\n"],"mappings":"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"}
|