@twick/core 0.11.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/LICENSE +21 -0
- package/lib/app/Logger.d.ts +105 -0
- package/lib/app/Logger.d.ts.map +1 -0
- package/lib/app/Logger.js +77 -0
- package/lib/app/PlaybackManager.d.ts +55 -0
- package/lib/app/PlaybackManager.d.ts.map +1 -0
- package/lib/app/PlaybackManager.js +179 -0
- package/lib/app/PlaybackStatus.d.ts +30 -0
- package/lib/app/PlaybackStatus.d.ts.map +1 -0
- package/lib/app/PlaybackStatus.js +46 -0
- package/lib/app/Player.d.ts +130 -0
- package/lib/app/Player.d.ts.map +1 -0
- package/lib/app/Player.js +375 -0
- package/lib/app/Project.d.ts +145 -0
- package/lib/app/Project.d.ts.map +1 -0
- package/lib/app/Project.js +10 -0
- package/lib/app/Renderer.d.ts +90 -0
- package/lib/app/Renderer.d.ts.map +1 -0
- package/lib/app/Renderer.js +318 -0
- package/lib/app/SharedWebGLContext.d.ts +24 -0
- package/lib/app/SharedWebGLContext.d.ts.map +1 -0
- package/lib/app/SharedWebGLContext.js +200 -0
- package/lib/app/Stage.d.ts +30 -0
- package/lib/app/Stage.d.ts.map +1 -0
- package/lib/app/Stage.js +75 -0
- package/lib/app/TimeEstimator.d.ts +53 -0
- package/lib/app/TimeEstimator.d.ts.map +1 -0
- package/lib/app/TimeEstimator.js +70 -0
- package/lib/app/index.d.ts +16 -0
- package/lib/app/index.d.ts.map +1 -0
- package/lib/app/index.js +16 -0
- package/lib/app/makeProject.d.ts +15 -0
- package/lib/app/makeProject.d.ts.map +1 -0
- package/lib/app/makeProject.js +72 -0
- package/lib/app/project-settings.d.ts +8 -0
- package/lib/app/project-settings.d.ts.map +1 -0
- package/lib/app/project-settings.js +13 -0
- package/lib/decorators/decorate.d.ts +2 -0
- package/lib/decorators/decorate.d.ts.map +1 -0
- package/lib/decorators/decorate.js +10 -0
- package/lib/decorators/deprecated.d.ts +5 -0
- package/lib/decorators/deprecated.d.ts.map +1 -0
- package/lib/decorators/deprecated.js +23 -0
- package/lib/decorators/index.d.ts +9 -0
- package/lib/decorators/index.d.ts.map +1 -0
- package/lib/decorators/index.js +9 -0
- package/lib/decorators/lazy.d.ts +14 -0
- package/lib/decorators/lazy.d.ts.map +1 -0
- package/lib/decorators/lazy.js +27 -0
- package/lib/decorators/threadable.d.ts +2 -0
- package/lib/decorators/threadable.d.ts.map +1 -0
- package/lib/decorators/threadable.js +7 -0
- package/lib/events/AsyncEventDispatcher.d.ts +45 -0
- package/lib/events/AsyncEventDispatcher.d.ts.map +1 -0
- package/lib/events/AsyncEventDispatcher.js +33 -0
- package/lib/events/EventDispatcher.d.ts +38 -0
- package/lib/events/EventDispatcher.d.ts.map +1 -0
- package/lib/events/EventDispatcher.js +29 -0
- package/lib/events/EventDispatcherBase.d.ts +55 -0
- package/lib/events/EventDispatcherBase.d.ts.map +1 -0
- package/lib/events/EventDispatcherBase.js +68 -0
- package/lib/events/FlagDispatcher.d.ts +54 -0
- package/lib/events/FlagDispatcher.d.ts.map +1 -0
- package/lib/events/FlagDispatcher.js +63 -0
- package/lib/events/ValueDispatcher.d.ts +81 -0
- package/lib/events/ValueDispatcher.d.ts.map +1 -0
- package/lib/events/ValueDispatcher.js +97 -0
- package/lib/events/index.d.ts +11 -0
- package/lib/events/index.d.ts.map +1 -0
- package/lib/events/index.js +11 -0
- package/lib/exporter/Exporter.d.ts +101 -0
- package/lib/exporter/Exporter.d.ts.map +1 -0
- package/lib/exporter/Exporter.js +2 -0
- package/lib/exporter/FFmpegExporter.d.ts +50 -0
- package/lib/exporter/FFmpegExporter.d.ts.map +1 -0
- package/lib/exporter/FFmpegExporter.js +140 -0
- package/lib/exporter/ImageExporter.d.ts +34 -0
- package/lib/exporter/ImageExporter.d.ts.map +1 -0
- package/lib/exporter/ImageExporter.js +80 -0
- package/lib/exporter/WasmExporter.d.ts +19 -0
- package/lib/exporter/WasmExporter.d.ts.map +1 -0
- package/lib/exporter/WasmExporter.js +78 -0
- package/lib/exporter/download-videos.d.ts +3 -0
- package/lib/exporter/download-videos.d.ts.map +1 -0
- package/lib/exporter/download-videos.js +45 -0
- package/lib/exporter/index.d.ts +5 -0
- package/lib/exporter/index.d.ts.map +1 -0
- package/lib/exporter/index.js +5 -0
- package/lib/flow/all.d.ts +18 -0
- package/lib/flow/all.d.ts.map +1 -0
- package/lib/flow/all.js +25 -0
- package/lib/flow/any.d.ts +18 -0
- package/lib/flow/any.d.ts.map +1 -0
- package/lib/flow/any.js +25 -0
- package/lib/flow/chain.d.ts +36 -0
- package/lib/flow/chain.d.ts.map +1 -0
- package/lib/flow/chain.js +46 -0
- package/lib/flow/delay.d.ts +29 -0
- package/lib/flow/delay.d.ts.map +1 -0
- package/lib/flow/delay.js +39 -0
- package/lib/flow/every.d.ts +41 -0
- package/lib/flow/every.d.ts.map +1 -0
- package/lib/flow/every.js +61 -0
- package/lib/flow/index.d.ts +17 -0
- package/lib/flow/index.d.ts.map +1 -0
- package/lib/flow/index.js +17 -0
- package/lib/flow/join.d.ts +35 -0
- package/lib/flow/join.d.ts.map +1 -0
- package/lib/flow/join.js +33 -0
- package/lib/flow/loop.d.ts +58 -0
- package/lib/flow/loop.d.ts.map +1 -0
- package/lib/flow/loop.js +51 -0
- package/lib/flow/loopFor.d.ts +25 -0
- package/lib/flow/loopFor.d.ts.map +1 -0
- package/lib/flow/loopFor.js +42 -0
- package/lib/flow/names.d.ts +3 -0
- package/lib/flow/names.d.ts.map +1 -0
- package/lib/flow/names.js +11 -0
- package/lib/flow/run.d.ts +45 -0
- package/lib/flow/run.d.ts.map +1 -0
- package/lib/flow/run.js +14 -0
- package/lib/flow/scheduling.d.ts +18 -0
- package/lib/flow/scheduling.d.ts.map +1 -0
- package/lib/flow/scheduling.js +33 -0
- package/lib/flow/sequence.d.ts +22 -0
- package/lib/flow/sequence.d.ts.map +1 -0
- package/lib/flow/sequence.js +31 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +16 -0
- package/lib/media/index.d.ts +7 -0
- package/lib/media/index.d.ts.map +1 -0
- package/lib/media/index.js +7 -0
- package/lib/media/loadImage.d.ts +8 -0
- package/lib/media/loadImage.d.ts.map +1 -0
- package/lib/media/loadImage.js +29 -0
- package/lib/plugin/DefaultPlugin.d.ts +10 -0
- package/lib/plugin/DefaultPlugin.d.ts.map +1 -0
- package/lib/plugin/DefaultPlugin.js +17 -0
- package/lib/plugin/Plugin.d.ts +53 -0
- package/lib/plugin/Plugin.d.ts.map +1 -0
- package/lib/plugin/Plugin.js +2 -0
- package/lib/plugin/index.d.ts +3 -0
- package/lib/plugin/index.d.ts.map +1 -0
- package/lib/plugin/index.js +3 -0
- package/lib/plugin/makePlugin.d.ts +15 -0
- package/lib/plugin/makePlugin.d.ts.map +1 -0
- package/lib/plugin/makePlugin.js +16 -0
- package/lib/scenes/GeneratorScene.d.ts +95 -0
- package/lib/scenes/GeneratorScene.d.ts.map +1 -0
- package/lib/scenes/GeneratorScene.js +273 -0
- package/lib/scenes/Inspectable.d.ts +71 -0
- package/lib/scenes/Inspectable.d.ts.map +1 -0
- package/lib/scenes/Inspectable.js +4 -0
- package/lib/scenes/LifecycleEvents.d.ts +18 -0
- package/lib/scenes/LifecycleEvents.d.ts.map +1 -0
- package/lib/scenes/LifecycleEvents.js +45 -0
- package/lib/scenes/Random.d.ts +66 -0
- package/lib/scenes/Random.d.ts.map +1 -0
- package/lib/scenes/Random.js +101 -0
- package/lib/scenes/Scene.d.ts +298 -0
- package/lib/scenes/Scene.d.ts.map +1 -0
- package/lib/scenes/Scene.js +25 -0
- package/lib/scenes/SceneState.d.ts +34 -0
- package/lib/scenes/SceneState.d.ts.map +1 -0
- package/lib/scenes/SceneState.js +35 -0
- package/lib/scenes/Shaders.d.ts +63 -0
- package/lib/scenes/Shaders.d.ts.map +1 -0
- package/lib/scenes/Shaders.js +158 -0
- package/lib/scenes/Slides.d.ts +33 -0
- package/lib/scenes/Slides.d.ts.map +1 -0
- package/lib/scenes/Slides.js +115 -0
- package/lib/scenes/Threadable.d.ts +19 -0
- package/lib/scenes/Threadable.d.ts.map +1 -0
- package/lib/scenes/Threadable.js +4 -0
- package/lib/scenes/Variables.d.ts +24 -0
- package/lib/scenes/Variables.d.ts.map +1 -0
- package/lib/scenes/Variables.js +39 -0
- package/lib/scenes/index.d.ts +16 -0
- package/lib/scenes/index.d.ts.map +1 -0
- package/lib/scenes/index.js +16 -0
- package/lib/signals/CompoundSignalContext.d.ts +21 -0
- package/lib/signals/CompoundSignalContext.d.ts.map +1 -0
- package/lib/signals/CompoundSignalContext.js +73 -0
- package/lib/signals/ComputedContext.d.ts +14 -0
- package/lib/signals/ComputedContext.d.ts.map +1 -0
- package/lib/signals/ComputedContext.js +36 -0
- package/lib/signals/DependencyContext.d.ts +32 -0
- package/lib/signals/DependencyContext.d.ts.map +1 -0
- package/lib/signals/DependencyContext.js +87 -0
- package/lib/signals/SignalContext.d.ts +120 -0
- package/lib/signals/SignalContext.d.ts.map +1 -0
- package/lib/signals/SignalContext.js +245 -0
- package/lib/signals/createComputed.d.ts +3 -0
- package/lib/signals/createComputed.d.ts.map +1 -0
- package/lib/signals/createComputed.js +5 -0
- package/lib/signals/createComputedAsync.d.ts +4 -0
- package/lib/signals/createComputedAsync.d.ts.map +1 -0
- package/lib/signals/createComputedAsync.js +15 -0
- package/lib/signals/createSignal.d.ts +5 -0
- package/lib/signals/createSignal.d.ts.map +1 -0
- package/lib/signals/createSignal.js +6 -0
- package/lib/signals/index.d.ts +16 -0
- package/lib/signals/index.d.ts.map +1 -0
- package/lib/signals/index.js +16 -0
- package/lib/signals/symbols.d.ts +2 -0
- package/lib/signals/symbols.d.ts.map +1 -0
- package/lib/signals/symbols.js +2 -0
- package/lib/signals/types.d.ts +51 -0
- package/lib/signals/types.d.ts.map +1 -0
- package/lib/signals/types.js +2 -0
- package/lib/signals/utils.d.ts +5 -0
- package/lib/signals/utils.d.ts.map +1 -0
- package/lib/signals/utils.js +10 -0
- package/lib/threading/Thread.d.ts +77 -0
- package/lib/threading/Thread.d.ts.map +1 -0
- package/lib/threading/Thread.js +169 -0
- package/lib/threading/ThreadGenerator.d.ts +39 -0
- package/lib/threading/ThreadGenerator.d.ts.map +1 -0
- package/lib/threading/ThreadGenerator.js +17 -0
- package/lib/threading/cancel.d.ts +17 -0
- package/lib/threading/cancel.d.ts.map +1 -0
- package/lib/threading/cancel.js +26 -0
- package/lib/threading/index.d.ts +11 -0
- package/lib/threading/index.d.ts.map +1 -0
- package/lib/threading/index.js +11 -0
- package/lib/threading/spawn.d.ts +28 -0
- package/lib/threading/spawn.d.ts.map +1 -0
- package/lib/threading/spawn.js +30 -0
- package/lib/threading/threads.d.ts +46 -0
- package/lib/threading/threads.d.ts.map +1 -0
- package/lib/threading/threads.js +89 -0
- package/lib/transitions/fadeTransition.d.ts +8 -0
- package/lib/transitions/fadeTransition.d.ts.map +1 -0
- package/lib/transitions/fadeTransition.js +16 -0
- package/lib/transitions/index.d.ts +11 -0
- package/lib/transitions/index.d.ts.map +1 -0
- package/lib/transitions/index.js +11 -0
- package/lib/transitions/slideTransition.d.ts +18 -0
- package/lib/transitions/slideTransition.d.ts.map +1 -0
- package/lib/transitions/slideTransition.js +14 -0
- package/lib/transitions/useTransition.d.ts +10 -0
- package/lib/transitions/useTransition.d.ts.map +1 -0
- package/lib/transitions/useTransition.js +27 -0
- package/lib/transitions/zoomInTransition.d.ts +10 -0
- package/lib/transitions/zoomInTransition.d.ts.map +1 -0
- package/lib/transitions/zoomInTransition.js +33 -0
- package/lib/transitions/zoomOutTransition.d.ts +10 -0
- package/lib/transitions/zoomOutTransition.d.ts.map +1 -0
- package/lib/transitions/zoomOutTransition.js +33 -0
- package/lib/tsconfig.build.tsbuildinfo +1 -0
- package/lib/tweening/helpers.d.ts +5 -0
- package/lib/tweening/helpers.d.ts.map +1 -0
- package/lib/tweening/helpers.js +16 -0
- package/lib/tweening/index.d.ts +11 -0
- package/lib/tweening/index.d.ts.map +1 -0
- package/lib/tweening/index.js +11 -0
- package/lib/tweening/interpolationFunctions.d.ts +38 -0
- package/lib/tweening/interpolationFunctions.d.ts.map +1 -0
- package/lib/tweening/interpolationFunctions.js +107 -0
- package/lib/tweening/spring.d.ts +20 -0
- package/lib/tweening/spring.d.ts.map +1 -0
- package/lib/tweening/spring.js +103 -0
- package/lib/tweening/timingFunctions.d.ts +46 -0
- package/lib/tweening/timingFunctions.d.ts.map +1 -0
- package/lib/tweening/timingFunctions.js +233 -0
- package/lib/tweening/tween.d.ts +3 -0
- package/lib/tweening/tween.d.ts.map +1 -0
- package/lib/tweening/tween.js +21 -0
- package/lib/types/BBox.d.ts +73 -0
- package/lib/types/BBox.d.ts.map +1 -0
- package/lib/types/BBox.js +249 -0
- package/lib/types/Canvas.d.ts +3 -0
- package/lib/types/Canvas.d.ts.map +1 -0
- package/lib/types/Canvas.js +2 -0
- package/lib/types/Color.d.ts +65 -0
- package/lib/types/Color.d.ts.map +1 -0
- package/lib/types/Color.js +185 -0
- package/lib/types/Matrix.d.ts +3 -0
- package/lib/types/Matrix.d.ts.map +1 -0
- package/lib/types/Matrix.js +10 -0
- package/lib/types/Matrix2D.d.ts +363 -0
- package/lib/types/Matrix2D.d.ts.map +1 -0
- package/lib/types/Matrix2D.js +554 -0
- package/lib/types/Origin.d.ts +17 -0
- package/lib/types/Origin.d.ts.map +1 -0
- package/lib/types/Origin.js +53 -0
- package/lib/types/Spacing.d.ts +36 -0
- package/lib/types/Spacing.d.ts.map +1 -0
- package/lib/types/Spacing.js +70 -0
- package/lib/types/Type.d.ts +9 -0
- package/lib/types/Type.d.ts.map +1 -0
- package/lib/types/Type.js +5 -0
- package/lib/types/Vector.d.ts +203 -0
- package/lib/types/Vector.d.ts.map +1 -0
- package/lib/types/Vector.js +355 -0
- package/lib/types/alignment-enums.d.ts +22 -0
- package/lib/types/alignment-enums.d.ts.map +1 -0
- package/lib/types/alignment-enums.js +25 -0
- package/lib/types/index.d.ts +17 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +17 -0
- package/lib/types/vector-transformations.d.ts +20 -0
- package/lib/types/vector-transformations.d.ts.map +1 -0
- package/lib/types/vector-transformations.js +31 -0
- package/lib/utils/DetailedError.d.ts +24 -0
- package/lib/utils/DetailedError.d.ts.map +1 -0
- package/lib/utils/DetailedError.js +16 -0
- package/lib/utils/ExperimentalError.d.ts +10 -0
- package/lib/utils/ExperimentalError.d.ts.map +1 -0
- package/lib/utils/ExperimentalError.js +32 -0
- package/lib/utils/Semaphore.d.ts +12 -0
- package/lib/utils/Semaphore.d.ts.map +1 -0
- package/lib/utils/Semaphore.js +25 -0
- package/lib/utils/beginSlide.d.ts +3 -0
- package/lib/utils/beginSlide.d.ts.map +1 -0
- package/lib/utils/beginSlide.js +12 -0
- package/lib/utils/capitalize.d.ts +2 -0
- package/lib/utils/capitalize.d.ts.map +1 -0
- package/lib/utils/capitalize.js +4 -0
- package/lib/utils/createRef.d.ts +15 -0
- package/lib/utils/createRef.d.ts.map +1 -0
- package/lib/utils/createRef.js +21 -0
- package/lib/utils/createRefArray.d.ts +27 -0
- package/lib/utils/createRefArray.d.ts.map +1 -0
- package/lib/utils/createRefArray.js +49 -0
- package/lib/utils/createRefMap.d.ts +50 -0
- package/lib/utils/createRefMap.d.ts.map +1 -0
- package/lib/utils/createRefMap.js +77 -0
- package/lib/utils/debug.d.ts +24 -0
- package/lib/utils/debug.d.ts.map +1 -0
- package/lib/utils/debug.js +47 -0
- package/lib/utils/deprecate.d.ts +9 -0
- package/lib/utils/deprecate.d.ts.map +1 -0
- package/lib/utils/deprecate.js +15 -0
- package/lib/utils/errorToLog.d.ts +3 -0
- package/lib/utils/errorToLog.d.ts.map +1 -0
- package/lib/utils/errorToLog.js +8 -0
- package/lib/utils/experimentalLog.d.ts +3 -0
- package/lib/utils/experimentalLog.d.ts.map +1 -0
- package/lib/utils/experimentalLog.js +10 -0
- package/lib/utils/getContext.d.ts +2 -0
- package/lib/utils/getContext.d.ts.map +1 -0
- package/lib/utils/getContext.js +8 -0
- package/lib/utils/index.d.ts +26 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/math.d.ts +15 -0
- package/lib/utils/math.d.ts.map +1 -0
- package/lib/utils/math.js +15 -0
- package/lib/utils/range.d.ts +40 -0
- package/lib/utils/range.d.ts.map +1 -0
- package/lib/utils/range.js +18 -0
- package/lib/utils/useContext.d.ts +13 -0
- package/lib/utils/useContext.d.ts.map +1 -0
- package/lib/utils/useContext.js +18 -0
- package/lib/utils/usePlayback.d.ts +8 -0
- package/lib/utils/usePlayback.d.ts.map +1 -0
- package/lib/utils/usePlayback.js +20 -0
- package/lib/utils/useScene.d.ts +17 -0
- package/lib/utils/useScene.d.ts.map +1 -0
- package/lib/utils/useScene.js +33 -0
- package/lib/utils/useThread.d.ts +8 -0
- package/lib/utils/useThread.d.ts.map +1 -0
- package/lib/utils/useThread.js +24 -0
- package/lib/utils/useTime.d.ts +19 -0
- package/lib/utils/useTime.d.ts.map +1 -0
- package/lib/utils/useTime.js +22 -0
- package/package.json +36 -0
- package/project.d.ts +24 -0
- package/shaders/common.glsl +15 -0
- package/shaders/fragment.glsl +8 -0
- package/tsconfig.project.json +14 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { EventDispatcher } from '../events';
|
|
3
|
+
import { download } from './download-videos';
|
|
4
|
+
/**
|
|
5
|
+
* FFmpeg video exporter.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* Most of the export logic is handled on the server. This class communicates
|
|
9
|
+
* with the FFmpegBridge through a WebSocket connection which lets it invoke
|
|
10
|
+
* methods on the FFmpegExporterServer class.
|
|
11
|
+
*
|
|
12
|
+
* For example, calling the following method:
|
|
13
|
+
* ```ts
|
|
14
|
+
* async this.invoke('process', 7);
|
|
15
|
+
* ```
|
|
16
|
+
* Will invoke the `process` method on the FFmpegExporterServer class with `7`
|
|
17
|
+
* as the argument. The result of the method will be returned as a Promise.
|
|
18
|
+
*
|
|
19
|
+
* Before any methods can be invoked, the FFmpegExporterServer class must be
|
|
20
|
+
* initialized by invoking `start`.
|
|
21
|
+
*/
|
|
22
|
+
export class FFmpegExporterClient {
|
|
23
|
+
static async create(_, settings) {
|
|
24
|
+
return new _a(settings);
|
|
25
|
+
}
|
|
26
|
+
constructor(settings) {
|
|
27
|
+
if (settings.exporter.name !== _a.id) {
|
|
28
|
+
throw new Error('Invalid exporter');
|
|
29
|
+
}
|
|
30
|
+
this.settings = settings;
|
|
31
|
+
this.exporterOptions = settings.exporter.options;
|
|
32
|
+
}
|
|
33
|
+
async start() {
|
|
34
|
+
await this.invoke('start', this.settings);
|
|
35
|
+
}
|
|
36
|
+
async handleFrame(canvas) {
|
|
37
|
+
const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
|
|
38
|
+
if (!blob) {
|
|
39
|
+
throw Error('Failed to convert canvas to Blob.');
|
|
40
|
+
}
|
|
41
|
+
const dataUrl = await this.blobToDataUrl(blob);
|
|
42
|
+
await this.invoke('handleFrame', {
|
|
43
|
+
data: dataUrl,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async blobToDataUrl(blob) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const reader = new FileReader();
|
|
49
|
+
reader.onloadend = () => resolve(reader.result);
|
|
50
|
+
reader.onerror = reject;
|
|
51
|
+
reader.readAsDataURL(blob);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async stop(result) {
|
|
55
|
+
await this.invoke('end', result);
|
|
56
|
+
await fetch('/twick-ffmpeg-decoder/finished', {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: {
|
|
59
|
+
// eslint-disable-next-line
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
},
|
|
62
|
+
body: JSON.stringify({}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async kill() {
|
|
66
|
+
await this.invoke('kill', {});
|
|
67
|
+
}
|
|
68
|
+
async downloadVideos(assets) {
|
|
69
|
+
await download(assets);
|
|
70
|
+
}
|
|
71
|
+
async generateAudio(assets, startFrame, endFrame) {
|
|
72
|
+
await fetch('/audio-processing/generate-audio', {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
tempDir: `twick-${this.settings.name}-${this.settings.hiddenFolderId}`,
|
|
76
|
+
assets,
|
|
77
|
+
startFrame,
|
|
78
|
+
endFrame,
|
|
79
|
+
fps: this.settings.fps,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async mergeMedia() {
|
|
84
|
+
const outputFilename = this.settings.name;
|
|
85
|
+
const tempDir = `twick-${this.settings.name}-${this.settings.hiddenFolderId}`;
|
|
86
|
+
const format = this.exporterOptions.format;
|
|
87
|
+
await fetch('/audio-processing/merge-media', {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
outputFilename,
|
|
91
|
+
tempDir,
|
|
92
|
+
format,
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Remotely invoke a method on the server and wait for a response.
|
|
98
|
+
*
|
|
99
|
+
* @param method - The method name to execute on the server.
|
|
100
|
+
* @param data - The data that will be passed as an argument to the method.
|
|
101
|
+
* Should be serializable.
|
|
102
|
+
*/
|
|
103
|
+
invoke(method, data) {
|
|
104
|
+
if (import.meta.hot) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
const handle = (response) => {
|
|
107
|
+
if (response.method !== method) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
_a.response.unsubscribe(handle);
|
|
111
|
+
if (response.status === 'success') {
|
|
112
|
+
resolve(response.data);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
reject({
|
|
116
|
+
message: `An error occurred while exporting the video: ${response.message}`,
|
|
117
|
+
remarks: `Method: ${method}<br>Server error: ${response.message}`,
|
|
118
|
+
object: data,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
_a.response.subscribe(handle);
|
|
123
|
+
import.meta.hot.send('twick:ffmpeg-exporter', { method, data });
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error('FFmpegExporter can only be used locally.');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
_a = FFmpegExporterClient;
|
|
132
|
+
FFmpegExporterClient.id = '@twick/core/ffmpeg';
|
|
133
|
+
FFmpegExporterClient.displayName = 'Video (FFmpeg)';
|
|
134
|
+
FFmpegExporterClient.response = new EventDispatcher();
|
|
135
|
+
(() => {
|
|
136
|
+
if (import.meta.hot) {
|
|
137
|
+
import.meta.hot.on(`twick:ffmpeg-exporter-ack`, (response) => _a.response.dispatch(response));
|
|
138
|
+
}
|
|
139
|
+
})();
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnRXhwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhwb3J0ZXIvRkZtcGVnRXhwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU1BLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBa0IzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBT3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQVUsRUFBRSxRQUEwQjtRQUMvRCxPQUFPLElBQUksRUFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBYUQsWUFBbUIsUUFBMEI7UUFDM0MsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFvQixDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUNuRCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBeUI7UUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBYyxPQUFPLENBQUMsRUFBRSxDQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FDcEMsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sS0FBSyxDQUFD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
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Logger } from '../app/Logger';
|
|
2
|
+
import type { Project } from '../app/Project';
|
|
3
|
+
import type { AssetInfo, RendererSettings } from '../app/Renderer';
|
|
4
|
+
import type { CanvasOutputMimeType } from '../types';
|
|
5
|
+
import type { Exporter } from './Exporter';
|
|
6
|
+
export interface ImageExporterOptions {
|
|
7
|
+
quality: number;
|
|
8
|
+
fileType: CanvasOutputMimeType;
|
|
9
|
+
groupByScene: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Image sequence exporter.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export declare class ImageExporter implements Exporter {
|
|
17
|
+
private readonly logger;
|
|
18
|
+
static readonly id = "@twick/core/image-sequence";
|
|
19
|
+
static readonly displayName = "Image sequence";
|
|
20
|
+
static create(project: Project, settings: RendererSettings): Promise<ImageExporter>;
|
|
21
|
+
private static readonly response;
|
|
22
|
+
private readonly frameLookup;
|
|
23
|
+
private readonly projectName;
|
|
24
|
+
private readonly quality;
|
|
25
|
+
private readonly fileType;
|
|
26
|
+
private readonly groupByScene;
|
|
27
|
+
constructor(logger: Logger, settings: RendererSettings);
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
handleFrame(canvas: HTMLCanvasElement, frame: number, sceneFrame: number, sceneName: string, signal: AbortSignal): Promise<void>;
|
|
30
|
+
downloadVideos(assets: AssetInfo[][]): Promise<void>;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
private handleResponse;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ImageExporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageExporter.d.ts","sourceRoot":"","sources":["../../src/exporter/ImageExporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAE,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAGjE,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAMzC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC;CACvB;AAMD;;;;GAIG;AACH,qBAAa,aAAc,YAAW,QAAQ;IA4B1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IA3BzB,gBAAuB,EAAE,gCAAgC;IACzD,gBAAuB,WAAW,oBAAoB;WAElC,MAAM,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,aAAa,CAAC;IAIzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAUzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAGpB,MAAM,EAAE,MAAM,EAC/B,QAAQ,EAAE,gBAAgB;IAef,KAAK;IAIL,WAAW,CACtB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW;IA4BR,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,IAAI;IAOjB,OAAO,CAAC,cAAc,CAEpB;CACH"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { EventDispatcher } from '../events';
|
|
3
|
+
import { clamp } from '../tweening';
|
|
4
|
+
import { download } from './download-videos';
|
|
5
|
+
const EXPORT_FRAME_LIMIT = 256;
|
|
6
|
+
const EXPORT_RETRY_DELAY = 1000;
|
|
7
|
+
/**
|
|
8
|
+
* Image sequence exporter.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export class ImageExporter {
|
|
13
|
+
static async create(project, settings) {
|
|
14
|
+
return new _a(project.logger, settings);
|
|
15
|
+
}
|
|
16
|
+
constructor(logger, settings) {
|
|
17
|
+
this.logger = logger;
|
|
18
|
+
this.frameLookup = new Set();
|
|
19
|
+
this.handleResponse = ({ frame }) => {
|
|
20
|
+
this.frameLookup.delete(frame);
|
|
21
|
+
};
|
|
22
|
+
if (settings.exporter.name !== _a.id) {
|
|
23
|
+
throw new Error(`Invalid exporter name: ${settings.exporter.name}. Expected: ${_a.id}`);
|
|
24
|
+
}
|
|
25
|
+
const options = settings.exporter.options;
|
|
26
|
+
this.projectName = settings.name;
|
|
27
|
+
this.quality = clamp(0, 1, options.quality / 100);
|
|
28
|
+
this.fileType = options.fileType;
|
|
29
|
+
this.groupByScene = options.groupByScene;
|
|
30
|
+
}
|
|
31
|
+
async start() {
|
|
32
|
+
_a.response.subscribe(this.handleResponse);
|
|
33
|
+
}
|
|
34
|
+
async handleFrame(canvas, frame, sceneFrame, sceneName, signal) {
|
|
35
|
+
if (this.frameLookup.has(frame)) {
|
|
36
|
+
this.logger.warn(`Frame no. ${frame} is already being exported.`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (import.meta.hot) {
|
|
40
|
+
while (this.frameLookup.size > EXPORT_FRAME_LIMIT) {
|
|
41
|
+
await new Promise(resolve => setTimeout(resolve, EXPORT_RETRY_DELAY));
|
|
42
|
+
if (signal.aborted) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.frameLookup.add(frame);
|
|
47
|
+
import.meta.hot.send('twick:export', {
|
|
48
|
+
frame,
|
|
49
|
+
sceneFrame,
|
|
50
|
+
data: canvas.toDataURL(this.fileType, this.quality),
|
|
51
|
+
mimeType: this.fileType,
|
|
52
|
+
subDirectories: this.groupByScene
|
|
53
|
+
? [this.projectName, sceneName]
|
|
54
|
+
: [this.projectName],
|
|
55
|
+
groupByScene: this.groupByScene,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async downloadVideos(assets) {
|
|
60
|
+
await download(assets);
|
|
61
|
+
}
|
|
62
|
+
async stop() {
|
|
63
|
+
while (this.frameLookup.size > 0) {
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, EXPORT_RETRY_DELAY));
|
|
65
|
+
}
|
|
66
|
+
_a.response.unsubscribe(this.handleResponse);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
_a = ImageExporter;
|
|
70
|
+
ImageExporter.id = '@twick/core/image-sequence';
|
|
71
|
+
ImageExporter.displayName = 'Image sequence';
|
|
72
|
+
ImageExporter.response = new EventDispatcher();
|
|
73
|
+
(() => {
|
|
74
|
+
if (import.meta.hot) {
|
|
75
|
+
import.meta.hot.on('twick:export-ack', response => {
|
|
76
|
+
_a.response.dispatch(response);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
})();
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZ2VFeHBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHBvcnRlci9JbWFnZUV4cG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFHQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHbEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBWWhDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUlqQixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDeEIsT0FBZ0IsRUFDaEIsUUFBMEI7UUFFMUIsT0FBTyxJQUFJLEVBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFrQkQsWUFDbUIsTUFBYyxFQUMvQixRQUEwQjtRQURULFdBQU0sR0FBTixNQUFNLENBQVE7UUFQaEIsZ0JBQVcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBdUV6QyxtQkFBYyxHQUFHLENBQUMsRUFBQyxLQUFLLEVBQWlCLEVBQUUsRUFBRTtZQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUM7UUEvREEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFhLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQkFBMEIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGVBQWUsRUFBYSxDQUFDLEVBQUUsRUFBRSxDQUNsRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FB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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Project } from '../app/Project';
|
|
2
|
+
import type { AssetInfo, RendererSettings } from '../app/Renderer';
|
|
3
|
+
import type { Exporter } from './Exporter';
|
|
4
|
+
export declare class WasmExporter implements Exporter {
|
|
5
|
+
private readonly project;
|
|
6
|
+
private readonly settings;
|
|
7
|
+
static readonly id = "@twick/core/wasm";
|
|
8
|
+
static readonly displayName = "Video (Wasm)";
|
|
9
|
+
static create(project: Project, settings: RendererSettings): Promise<WasmExporter>;
|
|
10
|
+
constructor(project: Project, settings: RendererSettings);
|
|
11
|
+
start(): Promise<void>;
|
|
12
|
+
private encoder;
|
|
13
|
+
handleFrame(canvas: HTMLCanvasElement): Promise<void>;
|
|
14
|
+
stop(): Promise<void>;
|
|
15
|
+
generateAudio(assets: AssetInfo[][], startFrame: number, endFrame: number): Promise<void>;
|
|
16
|
+
mergeMedia(): Promise<void>;
|
|
17
|
+
downloadVideos(assets: AssetInfo[][]): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=WasmExporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WasmExporter.d.ts","sourceRoot":"","sources":["../../src/exporter/WasmExporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAE,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAGzC,qBAAa,YAAa,YAAW,QAAQ;IASzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAT3B,gBAAuB,EAAE,sBAAsB;IAC/C,gBAAuB,WAAW,kBAAkB;WAEhC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB;gBAKpD,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB;IAGhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAenC,OAAO,CAAC,OAAO,CAAM;IAER,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBrB,aAAa,CACxB,MAAM,EAAE,SAAS,EAAE,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAcH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAGlE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import loadMp4Module from 'mp4-wasm';
|
|
2
|
+
import { download } from './download-videos';
|
|
3
|
+
export class WasmExporter {
|
|
4
|
+
static async create(project, settings) {
|
|
5
|
+
return new WasmExporter(project, settings);
|
|
6
|
+
}
|
|
7
|
+
constructor(project, settings) {
|
|
8
|
+
this.project = project;
|
|
9
|
+
this.settings = settings;
|
|
10
|
+
}
|
|
11
|
+
async start() {
|
|
12
|
+
const resp = await fetch('/@mp4-wasm');
|
|
13
|
+
const buffer = await resp.arrayBuffer();
|
|
14
|
+
const mp4 = await loadMp4Module({
|
|
15
|
+
wasmBinary: buffer,
|
|
16
|
+
});
|
|
17
|
+
this.encoder = mp4.createWebCodecsEncoder({
|
|
18
|
+
width: this.settings.size.x,
|
|
19
|
+
height: this.settings.size.y,
|
|
20
|
+
fps: this.project.settings.rendering.fps,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async handleFrame(canvas) {
|
|
24
|
+
const frame = new VideoFrame(canvas, { timestamp: 0 });
|
|
25
|
+
await this.encoder.addFrame(frame);
|
|
26
|
+
frame.close();
|
|
27
|
+
}
|
|
28
|
+
async stop() {
|
|
29
|
+
const buf = await this.encoder.end();
|
|
30
|
+
const formData = new FormData();
|
|
31
|
+
formData.append('file', new Blob([buf], { type: 'video/mp4' }), 'video.mp4');
|
|
32
|
+
formData.append('tempDir', `twick-${this.settings.name}-${this.settings.hiddenFolderId}`);
|
|
33
|
+
await fetch('/twick-ffmpeg-decoder/finished', {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: {
|
|
36
|
+
// eslint-disable-next-line
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({}),
|
|
40
|
+
});
|
|
41
|
+
await fetch('/uploadVideoFile', {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
body: formData,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async generateAudio(assets, startFrame, endFrame) {
|
|
47
|
+
await fetch('/audio-processing/generate-audio', {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
// TODO: add type and validate on the other side
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
tempDir: `twick-${this.settings.name}-${this.settings.hiddenFolderId}`,
|
|
52
|
+
assets,
|
|
53
|
+
startFrame,
|
|
54
|
+
endFrame,
|
|
55
|
+
fps: this.settings.fps,
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async mergeMedia() {
|
|
60
|
+
const outputFilename = this.settings.name;
|
|
61
|
+
const tempDir = `twick-${this.settings.name}-${this.settings.hiddenFolderId}`;
|
|
62
|
+
await fetch('/audio-processing/merge-media', {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
// TODO: add type and validate on the other side
|
|
65
|
+
body: JSON.stringify({
|
|
66
|
+
outputFilename,
|
|
67
|
+
tempDir,
|
|
68
|
+
format: 'mp4',
|
|
69
|
+
}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async downloadVideos(assets) {
|
|
73
|
+
await download(assets);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
WasmExporter.id = '@twick/core/wasm';
|
|
77
|
+
WasmExporter.displayName = 'Video (Wasm)';
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FzbUV4cG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4cG9ydGVyL1dhc21FeHBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGFBQWEsTUFBTSxVQUFVLENBQUM7QUFJckMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE1BQU0sT0FBTyxZQUFZO0lBSWhCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWdCLEVBQUUsUUFBMEI7UUFDckUsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFlBQ21CLE9BQWdCLEVBQ2hCLFFBQTBCO1FBRDFCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFDMUMsQ0FBQztJQUVHLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXhDLE1BQU0sR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDO1lBQzlCLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLHNCQUFzQixDQUFDO1lBQ3hDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRztTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBSU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUF5QjtRQUNoRCxNQUFN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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-videos.d.ts","sourceRoot":"","sources":["../../src/exporter/download-videos.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,QAAQ,CAAC;AAEtC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DnE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export async function download(assets) {
|
|
2
|
+
const videoRanges = new Map();
|
|
3
|
+
assets.forEach(frameAssets => {
|
|
4
|
+
frameAssets.forEach(asset => {
|
|
5
|
+
if (asset.type !== 'video' || asset.decoder !== 'ffmpeg') {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (videoRanges.has(asset.src)) {
|
|
9
|
+
const range = videoRanges.get(asset.src);
|
|
10
|
+
range.start = Math.min(range.start, asset.currentTime);
|
|
11
|
+
range.end = Math.max(range.end, asset.currentTime);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
videoRanges.set(asset.src, {
|
|
15
|
+
start: asset.currentTime,
|
|
16
|
+
end: asset.currentTime,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
const videoDurations = Array.from(videoRanges.entries()).map(([src, { start, end }]) => ({
|
|
21
|
+
src,
|
|
22
|
+
startTime: start,
|
|
23
|
+
endTime: end,
|
|
24
|
+
}));
|
|
25
|
+
videoDurations.forEach(({ src, startTime, endTime }) => {
|
|
26
|
+
console.log(`downloading ${src} from ${startTime}s to ${endTime}s`);
|
|
27
|
+
});
|
|
28
|
+
const response = await fetch('/twick-ffmpeg-decoder/download-video-chunks', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: {
|
|
31
|
+
// eslint-disable-next-line
|
|
32
|
+
'Content-Type': 'application/json',
|
|
33
|
+
},
|
|
34
|
+
body: JSON.stringify(videoDurations),
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
38
|
+
}
|
|
39
|
+
const result = await response.json();
|
|
40
|
+
if (!result.success) {
|
|
41
|
+
throw new Error(`Error downloading video chunks: ${result.error}`);
|
|
42
|
+
}
|
|
43
|
+
console.log('finished downloading');
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtdmlkZW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4cG9ydGVyL2Rvd25sb2FkLXZpZGVvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsS0FBSyxVQUFVLFFBQVEsQ0FBQyxNQUFxQjtJQUNsRCxNQUFNLFdBQVcsR0FBOEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUV6RSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQzNCLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6RCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFFLENBQUM7Z0JBQzFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPO1lBQ1QsQ0FBQztZQUVELFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDekIsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUN4QixHQUFHLEVBQUUsS0FBSyxDQUFDLFdBQVc7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUMxRCxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEIsR0FBRztRQUNILFNBQVMsRUFBRSxLQUFLO1FBQ2hCLE9BQU8sRUFBRSxHQUFHO0tBQ2IsQ0FBQyxDQUNILENBQUM7SUFFRixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxTQUFTLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUMxQiw2Q0FBNkMsRUFDN0M7UUFDRSxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRTtZQUNQLDJCQUEyQjtZQUMzQixjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO1FBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0tBQ3JDLENBQ0YsQ0FBQztJQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBRXJDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUN0QyxDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exporter/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './Exporter';
|
|
2
|
+
export * from './FFmpegExporter';
|
|
3
|
+
export * from './ImageExporter';
|
|
4
|
+
export * from './WasmExporter';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhwb3J0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsZ0JBQWdCLENBQUMifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ThreadGenerator } from '../threading';
|
|
2
|
+
/**
|
|
3
|
+
* Run all tasks concurrently and wait for all of them to finish.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* // current time: 0s
|
|
8
|
+
* yield* all(
|
|
9
|
+
* rect.fill('#ff0000', 2),
|
|
10
|
+
* rect.opacity(1, 1),
|
|
11
|
+
* );
|
|
12
|
+
* // current time: 2s
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @param tasks - A list of tasks to run.
|
|
16
|
+
*/
|
|
17
|
+
export declare function all(...tasks: ThreadGenerator[]): ThreadGenerator;
|
|
18
|
+
//# sourceMappingURL=all.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../../src/flow/all.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAIlD;;;;;;;;;;;;;;GAcG;AACH,wBAAiB,GAAG,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,CAKjE"}
|
package/lib/flow/all.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { decorate, threadable } from '../decorators';
|
|
2
|
+
import { join } from './join';
|
|
3
|
+
decorate(all, threadable());
|
|
4
|
+
/**
|
|
5
|
+
* Run all tasks concurrently and wait for all of them to finish.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* // current time: 0s
|
|
10
|
+
* yield* all(
|
|
11
|
+
* rect.fill('#ff0000', 2),
|
|
12
|
+
* rect.opacity(1, 1),
|
|
13
|
+
* );
|
|
14
|
+
* // current time: 2s
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @param tasks - A list of tasks to run.
|
|
18
|
+
*/
|
|
19
|
+
export function* all(...tasks) {
|
|
20
|
+
for (const task of tasks) {
|
|
21
|
+
yield task;
|
|
22
|
+
}
|
|
23
|
+
yield* join(...tasks);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Zsb3cvYWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsUUFBUSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzVCOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUF3QjtJQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUNELEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUMifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ThreadGenerator } from '../threading';
|
|
2
|
+
/**
|
|
3
|
+
* Run all tasks concurrently and wait for any of them to finish.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* // current time: 0s
|
|
8
|
+
* yield* any(
|
|
9
|
+
* rect.fill('#ff0000', 2),
|
|
10
|
+
* rect.opacity(1, 1),
|
|
11
|
+
* );
|
|
12
|
+
* // current time: 1s
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @param tasks - A list of tasks to run.
|
|
16
|
+
*/
|
|
17
|
+
export declare function any(...tasks: ThreadGenerator[]): ThreadGenerator;
|
|
18
|
+
//# sourceMappingURL=any.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"any.d.ts","sourceRoot":"","sources":["../../src/flow/any.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAIlD;;;;;;;;;;;;;;GAcG;AACH,wBAAiB,GAAG,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,CAKjE"}
|
package/lib/flow/any.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { decorate, threadable } from '../decorators';
|
|
2
|
+
import { join } from './join';
|
|
3
|
+
decorate(any, threadable());
|
|
4
|
+
/**
|
|
5
|
+
* Run all tasks concurrently and wait for any of them to finish.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* // current time: 0s
|
|
10
|
+
* yield* any(
|
|
11
|
+
* rect.fill('#ff0000', 2),
|
|
12
|
+
* rect.opacity(1, 1),
|
|
13
|
+
* );
|
|
14
|
+
* // current time: 1s
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @param tasks - A list of tasks to run.
|
|
18
|
+
*/
|
|
19
|
+
export function* any(...tasks) {
|
|
20
|
+
for (const task of tasks) {
|
|
21
|
+
yield task;
|
|
22
|
+
}
|
|
23
|
+
yield* join(false, ...tasks);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Zsb3cvYW55LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsUUFBUSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzVCOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUF3QjtJQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUNELEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDIn0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ThreadGenerator } from '../threading';
|
|
2
|
+
/**
|
|
3
|
+
* Run tasks one after another.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* // current time: 0s
|
|
8
|
+
* yield* chain(
|
|
9
|
+
* rect.fill('#ff0000', 2),
|
|
10
|
+
* rect.opacity(1, 1),
|
|
11
|
+
* );
|
|
12
|
+
* // current time: 3s
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Note that the same animation can be written as:
|
|
16
|
+
* ```ts
|
|
17
|
+
* yield* rect.fill('#ff0000', 2),
|
|
18
|
+
* yield* rect.opacity(1, 1),
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* The reason `chain` exists is to make it easier to pass it to other flow
|
|
22
|
+
* functions. For example:
|
|
23
|
+
* ```ts
|
|
24
|
+
* yield* all(
|
|
25
|
+
* rect.radius(20, 3),
|
|
26
|
+
* chain(
|
|
27
|
+
* rect.fill('#ff0000', 2),
|
|
28
|
+
* rect.opacity(1, 1),
|
|
29
|
+
* ),
|
|
30
|
+
* );
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @param tasks - A list of tasks to run.
|
|
34
|
+
*/
|
|
35
|
+
export declare function chain(...tasks: (ThreadGenerator | Callback)[]): ThreadGenerator;
|
|
36
|
+
//# sourceMappingURL=chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/flow/chain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAGlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAiB,KAAK,CACpB,GAAG,KAAK,EAAE,CAAC,eAAe,GAAG,QAAQ,CAAC,EAAE,GACvC,eAAe,CAQjB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { decorate, threadable } from '../decorators';
|
|
2
|
+
decorate(chain, threadable());
|
|
3
|
+
/**
|
|
4
|
+
* Run tasks one after another.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* // current time: 0s
|
|
9
|
+
* yield* chain(
|
|
10
|
+
* rect.fill('#ff0000', 2),
|
|
11
|
+
* rect.opacity(1, 1),
|
|
12
|
+
* );
|
|
13
|
+
* // current time: 3s
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Note that the same animation can be written as:
|
|
17
|
+
* ```ts
|
|
18
|
+
* yield* rect.fill('#ff0000', 2),
|
|
19
|
+
* yield* rect.opacity(1, 1),
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* The reason `chain` exists is to make it easier to pass it to other flow
|
|
23
|
+
* functions. For example:
|
|
24
|
+
* ```ts
|
|
25
|
+
* yield* all(
|
|
26
|
+
* rect.radius(20, 3),
|
|
27
|
+
* chain(
|
|
28
|
+
* rect.fill('#ff0000', 2),
|
|
29
|
+
* rect.opacity(1, 1),
|
|
30
|
+
* ),
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @param tasks - A list of tasks to run.
|
|
35
|
+
*/
|
|
36
|
+
export function* chain(...tasks) {
|
|
37
|
+
for (const generator of tasks) {
|
|
38
|
+
if ('next' in generator) {
|
|
39
|
+
yield* generator;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
generator();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmxvdy9jaGFpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUduRCxRQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsTUFBTSxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQ3BCLEdBQUcsS0FBcUM7SUFFeEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyJ9
|