@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.
Files changed (373) hide show
  1. package/LICENSE +21 -0
  2. package/lib/app/Logger.d.ts +105 -0
  3. package/lib/app/Logger.d.ts.map +1 -0
  4. package/lib/app/Logger.js +77 -0
  5. package/lib/app/PlaybackManager.d.ts +55 -0
  6. package/lib/app/PlaybackManager.d.ts.map +1 -0
  7. package/lib/app/PlaybackManager.js +179 -0
  8. package/lib/app/PlaybackStatus.d.ts +30 -0
  9. package/lib/app/PlaybackStatus.d.ts.map +1 -0
  10. package/lib/app/PlaybackStatus.js +46 -0
  11. package/lib/app/Player.d.ts +130 -0
  12. package/lib/app/Player.d.ts.map +1 -0
  13. package/lib/app/Player.js +375 -0
  14. package/lib/app/Project.d.ts +145 -0
  15. package/lib/app/Project.d.ts.map +1 -0
  16. package/lib/app/Project.js +10 -0
  17. package/lib/app/Renderer.d.ts +90 -0
  18. package/lib/app/Renderer.d.ts.map +1 -0
  19. package/lib/app/Renderer.js +318 -0
  20. package/lib/app/SharedWebGLContext.d.ts +24 -0
  21. package/lib/app/SharedWebGLContext.d.ts.map +1 -0
  22. package/lib/app/SharedWebGLContext.js +200 -0
  23. package/lib/app/Stage.d.ts +30 -0
  24. package/lib/app/Stage.d.ts.map +1 -0
  25. package/lib/app/Stage.js +75 -0
  26. package/lib/app/TimeEstimator.d.ts +53 -0
  27. package/lib/app/TimeEstimator.d.ts.map +1 -0
  28. package/lib/app/TimeEstimator.js +70 -0
  29. package/lib/app/index.d.ts +16 -0
  30. package/lib/app/index.d.ts.map +1 -0
  31. package/lib/app/index.js +16 -0
  32. package/lib/app/makeProject.d.ts +15 -0
  33. package/lib/app/makeProject.d.ts.map +1 -0
  34. package/lib/app/makeProject.js +72 -0
  35. package/lib/app/project-settings.d.ts +8 -0
  36. package/lib/app/project-settings.d.ts.map +1 -0
  37. package/lib/app/project-settings.js +13 -0
  38. package/lib/decorators/decorate.d.ts +2 -0
  39. package/lib/decorators/decorate.d.ts.map +1 -0
  40. package/lib/decorators/decorate.js +10 -0
  41. package/lib/decorators/deprecated.d.ts +5 -0
  42. package/lib/decorators/deprecated.d.ts.map +1 -0
  43. package/lib/decorators/deprecated.js +23 -0
  44. package/lib/decorators/index.d.ts +9 -0
  45. package/lib/decorators/index.d.ts.map +1 -0
  46. package/lib/decorators/index.js +9 -0
  47. package/lib/decorators/lazy.d.ts +14 -0
  48. package/lib/decorators/lazy.d.ts.map +1 -0
  49. package/lib/decorators/lazy.js +27 -0
  50. package/lib/decorators/threadable.d.ts +2 -0
  51. package/lib/decorators/threadable.d.ts.map +1 -0
  52. package/lib/decorators/threadable.js +7 -0
  53. package/lib/events/AsyncEventDispatcher.d.ts +45 -0
  54. package/lib/events/AsyncEventDispatcher.d.ts.map +1 -0
  55. package/lib/events/AsyncEventDispatcher.js +33 -0
  56. package/lib/events/EventDispatcher.d.ts +38 -0
  57. package/lib/events/EventDispatcher.d.ts.map +1 -0
  58. package/lib/events/EventDispatcher.js +29 -0
  59. package/lib/events/EventDispatcherBase.d.ts +55 -0
  60. package/lib/events/EventDispatcherBase.d.ts.map +1 -0
  61. package/lib/events/EventDispatcherBase.js +68 -0
  62. package/lib/events/FlagDispatcher.d.ts +54 -0
  63. package/lib/events/FlagDispatcher.d.ts.map +1 -0
  64. package/lib/events/FlagDispatcher.js +63 -0
  65. package/lib/events/ValueDispatcher.d.ts +81 -0
  66. package/lib/events/ValueDispatcher.d.ts.map +1 -0
  67. package/lib/events/ValueDispatcher.js +97 -0
  68. package/lib/events/index.d.ts +11 -0
  69. package/lib/events/index.d.ts.map +1 -0
  70. package/lib/events/index.js +11 -0
  71. package/lib/exporter/Exporter.d.ts +101 -0
  72. package/lib/exporter/Exporter.d.ts.map +1 -0
  73. package/lib/exporter/Exporter.js +2 -0
  74. package/lib/exporter/FFmpegExporter.d.ts +50 -0
  75. package/lib/exporter/FFmpegExporter.d.ts.map +1 -0
  76. package/lib/exporter/FFmpegExporter.js +140 -0
  77. package/lib/exporter/ImageExporter.d.ts +34 -0
  78. package/lib/exporter/ImageExporter.d.ts.map +1 -0
  79. package/lib/exporter/ImageExporter.js +80 -0
  80. package/lib/exporter/WasmExporter.d.ts +19 -0
  81. package/lib/exporter/WasmExporter.d.ts.map +1 -0
  82. package/lib/exporter/WasmExporter.js +78 -0
  83. package/lib/exporter/download-videos.d.ts +3 -0
  84. package/lib/exporter/download-videos.d.ts.map +1 -0
  85. package/lib/exporter/download-videos.js +45 -0
  86. package/lib/exporter/index.d.ts +5 -0
  87. package/lib/exporter/index.d.ts.map +1 -0
  88. package/lib/exporter/index.js +5 -0
  89. package/lib/flow/all.d.ts +18 -0
  90. package/lib/flow/all.d.ts.map +1 -0
  91. package/lib/flow/all.js +25 -0
  92. package/lib/flow/any.d.ts +18 -0
  93. package/lib/flow/any.d.ts.map +1 -0
  94. package/lib/flow/any.js +25 -0
  95. package/lib/flow/chain.d.ts +36 -0
  96. package/lib/flow/chain.d.ts.map +1 -0
  97. package/lib/flow/chain.js +46 -0
  98. package/lib/flow/delay.d.ts +29 -0
  99. package/lib/flow/delay.d.ts.map +1 -0
  100. package/lib/flow/delay.js +39 -0
  101. package/lib/flow/every.d.ts +41 -0
  102. package/lib/flow/every.d.ts.map +1 -0
  103. package/lib/flow/every.js +61 -0
  104. package/lib/flow/index.d.ts +17 -0
  105. package/lib/flow/index.d.ts.map +1 -0
  106. package/lib/flow/index.js +17 -0
  107. package/lib/flow/join.d.ts +35 -0
  108. package/lib/flow/join.d.ts.map +1 -0
  109. package/lib/flow/join.js +33 -0
  110. package/lib/flow/loop.d.ts +58 -0
  111. package/lib/flow/loop.d.ts.map +1 -0
  112. package/lib/flow/loop.js +51 -0
  113. package/lib/flow/loopFor.d.ts +25 -0
  114. package/lib/flow/loopFor.d.ts.map +1 -0
  115. package/lib/flow/loopFor.js +42 -0
  116. package/lib/flow/names.d.ts +3 -0
  117. package/lib/flow/names.d.ts.map +1 -0
  118. package/lib/flow/names.js +11 -0
  119. package/lib/flow/run.d.ts +45 -0
  120. package/lib/flow/run.d.ts.map +1 -0
  121. package/lib/flow/run.js +14 -0
  122. package/lib/flow/scheduling.d.ts +18 -0
  123. package/lib/flow/scheduling.d.ts.map +1 -0
  124. package/lib/flow/scheduling.js +33 -0
  125. package/lib/flow/sequence.d.ts +22 -0
  126. package/lib/flow/sequence.d.ts.map +1 -0
  127. package/lib/flow/sequence.js +31 -0
  128. package/lib/index.d.ts +16 -0
  129. package/lib/index.d.ts.map +1 -0
  130. package/lib/index.js +16 -0
  131. package/lib/media/index.d.ts +7 -0
  132. package/lib/media/index.d.ts.map +1 -0
  133. package/lib/media/index.js +7 -0
  134. package/lib/media/loadImage.d.ts +8 -0
  135. package/lib/media/loadImage.d.ts.map +1 -0
  136. package/lib/media/loadImage.js +29 -0
  137. package/lib/plugin/DefaultPlugin.d.ts +10 -0
  138. package/lib/plugin/DefaultPlugin.d.ts.map +1 -0
  139. package/lib/plugin/DefaultPlugin.js +17 -0
  140. package/lib/plugin/Plugin.d.ts +53 -0
  141. package/lib/plugin/Plugin.d.ts.map +1 -0
  142. package/lib/plugin/Plugin.js +2 -0
  143. package/lib/plugin/index.d.ts +3 -0
  144. package/lib/plugin/index.d.ts.map +1 -0
  145. package/lib/plugin/index.js +3 -0
  146. package/lib/plugin/makePlugin.d.ts +15 -0
  147. package/lib/plugin/makePlugin.d.ts.map +1 -0
  148. package/lib/plugin/makePlugin.js +16 -0
  149. package/lib/scenes/GeneratorScene.d.ts +95 -0
  150. package/lib/scenes/GeneratorScene.d.ts.map +1 -0
  151. package/lib/scenes/GeneratorScene.js +273 -0
  152. package/lib/scenes/Inspectable.d.ts +71 -0
  153. package/lib/scenes/Inspectable.d.ts.map +1 -0
  154. package/lib/scenes/Inspectable.js +4 -0
  155. package/lib/scenes/LifecycleEvents.d.ts +18 -0
  156. package/lib/scenes/LifecycleEvents.d.ts.map +1 -0
  157. package/lib/scenes/LifecycleEvents.js +45 -0
  158. package/lib/scenes/Random.d.ts +66 -0
  159. package/lib/scenes/Random.d.ts.map +1 -0
  160. package/lib/scenes/Random.js +101 -0
  161. package/lib/scenes/Scene.d.ts +298 -0
  162. package/lib/scenes/Scene.d.ts.map +1 -0
  163. package/lib/scenes/Scene.js +25 -0
  164. package/lib/scenes/SceneState.d.ts +34 -0
  165. package/lib/scenes/SceneState.d.ts.map +1 -0
  166. package/lib/scenes/SceneState.js +35 -0
  167. package/lib/scenes/Shaders.d.ts +63 -0
  168. package/lib/scenes/Shaders.d.ts.map +1 -0
  169. package/lib/scenes/Shaders.js +158 -0
  170. package/lib/scenes/Slides.d.ts +33 -0
  171. package/lib/scenes/Slides.d.ts.map +1 -0
  172. package/lib/scenes/Slides.js +115 -0
  173. package/lib/scenes/Threadable.d.ts +19 -0
  174. package/lib/scenes/Threadable.d.ts.map +1 -0
  175. package/lib/scenes/Threadable.js +4 -0
  176. package/lib/scenes/Variables.d.ts +24 -0
  177. package/lib/scenes/Variables.d.ts.map +1 -0
  178. package/lib/scenes/Variables.js +39 -0
  179. package/lib/scenes/index.d.ts +16 -0
  180. package/lib/scenes/index.d.ts.map +1 -0
  181. package/lib/scenes/index.js +16 -0
  182. package/lib/signals/CompoundSignalContext.d.ts +21 -0
  183. package/lib/signals/CompoundSignalContext.d.ts.map +1 -0
  184. package/lib/signals/CompoundSignalContext.js +73 -0
  185. package/lib/signals/ComputedContext.d.ts +14 -0
  186. package/lib/signals/ComputedContext.d.ts.map +1 -0
  187. package/lib/signals/ComputedContext.js +36 -0
  188. package/lib/signals/DependencyContext.d.ts +32 -0
  189. package/lib/signals/DependencyContext.d.ts.map +1 -0
  190. package/lib/signals/DependencyContext.js +87 -0
  191. package/lib/signals/SignalContext.d.ts +120 -0
  192. package/lib/signals/SignalContext.d.ts.map +1 -0
  193. package/lib/signals/SignalContext.js +245 -0
  194. package/lib/signals/createComputed.d.ts +3 -0
  195. package/lib/signals/createComputed.d.ts.map +1 -0
  196. package/lib/signals/createComputed.js +5 -0
  197. package/lib/signals/createComputedAsync.d.ts +4 -0
  198. package/lib/signals/createComputedAsync.d.ts.map +1 -0
  199. package/lib/signals/createComputedAsync.js +15 -0
  200. package/lib/signals/createSignal.d.ts +5 -0
  201. package/lib/signals/createSignal.d.ts.map +1 -0
  202. package/lib/signals/createSignal.js +6 -0
  203. package/lib/signals/index.d.ts +16 -0
  204. package/lib/signals/index.d.ts.map +1 -0
  205. package/lib/signals/index.js +16 -0
  206. package/lib/signals/symbols.d.ts +2 -0
  207. package/lib/signals/symbols.d.ts.map +1 -0
  208. package/lib/signals/symbols.js +2 -0
  209. package/lib/signals/types.d.ts +51 -0
  210. package/lib/signals/types.d.ts.map +1 -0
  211. package/lib/signals/types.js +2 -0
  212. package/lib/signals/utils.d.ts +5 -0
  213. package/lib/signals/utils.d.ts.map +1 -0
  214. package/lib/signals/utils.js +10 -0
  215. package/lib/threading/Thread.d.ts +77 -0
  216. package/lib/threading/Thread.d.ts.map +1 -0
  217. package/lib/threading/Thread.js +169 -0
  218. package/lib/threading/ThreadGenerator.d.ts +39 -0
  219. package/lib/threading/ThreadGenerator.d.ts.map +1 -0
  220. package/lib/threading/ThreadGenerator.js +17 -0
  221. package/lib/threading/cancel.d.ts +17 -0
  222. package/lib/threading/cancel.d.ts.map +1 -0
  223. package/lib/threading/cancel.js +26 -0
  224. package/lib/threading/index.d.ts +11 -0
  225. package/lib/threading/index.d.ts.map +1 -0
  226. package/lib/threading/index.js +11 -0
  227. package/lib/threading/spawn.d.ts +28 -0
  228. package/lib/threading/spawn.d.ts.map +1 -0
  229. package/lib/threading/spawn.js +30 -0
  230. package/lib/threading/threads.d.ts +46 -0
  231. package/lib/threading/threads.d.ts.map +1 -0
  232. package/lib/threading/threads.js +89 -0
  233. package/lib/transitions/fadeTransition.d.ts +8 -0
  234. package/lib/transitions/fadeTransition.d.ts.map +1 -0
  235. package/lib/transitions/fadeTransition.js +16 -0
  236. package/lib/transitions/index.d.ts +11 -0
  237. package/lib/transitions/index.d.ts.map +1 -0
  238. package/lib/transitions/index.js +11 -0
  239. package/lib/transitions/slideTransition.d.ts +18 -0
  240. package/lib/transitions/slideTransition.d.ts.map +1 -0
  241. package/lib/transitions/slideTransition.js +14 -0
  242. package/lib/transitions/useTransition.d.ts +10 -0
  243. package/lib/transitions/useTransition.d.ts.map +1 -0
  244. package/lib/transitions/useTransition.js +27 -0
  245. package/lib/transitions/zoomInTransition.d.ts +10 -0
  246. package/lib/transitions/zoomInTransition.d.ts.map +1 -0
  247. package/lib/transitions/zoomInTransition.js +33 -0
  248. package/lib/transitions/zoomOutTransition.d.ts +10 -0
  249. package/lib/transitions/zoomOutTransition.d.ts.map +1 -0
  250. package/lib/transitions/zoomOutTransition.js +33 -0
  251. package/lib/tsconfig.build.tsbuildinfo +1 -0
  252. package/lib/tweening/helpers.d.ts +5 -0
  253. package/lib/tweening/helpers.d.ts.map +1 -0
  254. package/lib/tweening/helpers.js +16 -0
  255. package/lib/tweening/index.d.ts +11 -0
  256. package/lib/tweening/index.d.ts.map +1 -0
  257. package/lib/tweening/index.js +11 -0
  258. package/lib/tweening/interpolationFunctions.d.ts +38 -0
  259. package/lib/tweening/interpolationFunctions.d.ts.map +1 -0
  260. package/lib/tweening/interpolationFunctions.js +107 -0
  261. package/lib/tweening/spring.d.ts +20 -0
  262. package/lib/tweening/spring.d.ts.map +1 -0
  263. package/lib/tweening/spring.js +103 -0
  264. package/lib/tweening/timingFunctions.d.ts +46 -0
  265. package/lib/tweening/timingFunctions.d.ts.map +1 -0
  266. package/lib/tweening/timingFunctions.js +233 -0
  267. package/lib/tweening/tween.d.ts +3 -0
  268. package/lib/tweening/tween.d.ts.map +1 -0
  269. package/lib/tweening/tween.js +21 -0
  270. package/lib/types/BBox.d.ts +73 -0
  271. package/lib/types/BBox.d.ts.map +1 -0
  272. package/lib/types/BBox.js +249 -0
  273. package/lib/types/Canvas.d.ts +3 -0
  274. package/lib/types/Canvas.d.ts.map +1 -0
  275. package/lib/types/Canvas.js +2 -0
  276. package/lib/types/Color.d.ts +65 -0
  277. package/lib/types/Color.d.ts.map +1 -0
  278. package/lib/types/Color.js +185 -0
  279. package/lib/types/Matrix.d.ts +3 -0
  280. package/lib/types/Matrix.d.ts.map +1 -0
  281. package/lib/types/Matrix.js +10 -0
  282. package/lib/types/Matrix2D.d.ts +363 -0
  283. package/lib/types/Matrix2D.d.ts.map +1 -0
  284. package/lib/types/Matrix2D.js +554 -0
  285. package/lib/types/Origin.d.ts +17 -0
  286. package/lib/types/Origin.d.ts.map +1 -0
  287. package/lib/types/Origin.js +53 -0
  288. package/lib/types/Spacing.d.ts +36 -0
  289. package/lib/types/Spacing.d.ts.map +1 -0
  290. package/lib/types/Spacing.js +70 -0
  291. package/lib/types/Type.d.ts +9 -0
  292. package/lib/types/Type.d.ts.map +1 -0
  293. package/lib/types/Type.js +5 -0
  294. package/lib/types/Vector.d.ts +203 -0
  295. package/lib/types/Vector.d.ts.map +1 -0
  296. package/lib/types/Vector.js +355 -0
  297. package/lib/types/alignment-enums.d.ts +22 -0
  298. package/lib/types/alignment-enums.d.ts.map +1 -0
  299. package/lib/types/alignment-enums.js +25 -0
  300. package/lib/types/index.d.ts +17 -0
  301. package/lib/types/index.d.ts.map +1 -0
  302. package/lib/types/index.js +17 -0
  303. package/lib/types/vector-transformations.d.ts +20 -0
  304. package/lib/types/vector-transformations.d.ts.map +1 -0
  305. package/lib/types/vector-transformations.js +31 -0
  306. package/lib/utils/DetailedError.d.ts +24 -0
  307. package/lib/utils/DetailedError.d.ts.map +1 -0
  308. package/lib/utils/DetailedError.js +16 -0
  309. package/lib/utils/ExperimentalError.d.ts +10 -0
  310. package/lib/utils/ExperimentalError.d.ts.map +1 -0
  311. package/lib/utils/ExperimentalError.js +32 -0
  312. package/lib/utils/Semaphore.d.ts +12 -0
  313. package/lib/utils/Semaphore.d.ts.map +1 -0
  314. package/lib/utils/Semaphore.js +25 -0
  315. package/lib/utils/beginSlide.d.ts +3 -0
  316. package/lib/utils/beginSlide.d.ts.map +1 -0
  317. package/lib/utils/beginSlide.js +12 -0
  318. package/lib/utils/capitalize.d.ts +2 -0
  319. package/lib/utils/capitalize.d.ts.map +1 -0
  320. package/lib/utils/capitalize.js +4 -0
  321. package/lib/utils/createRef.d.ts +15 -0
  322. package/lib/utils/createRef.d.ts.map +1 -0
  323. package/lib/utils/createRef.js +21 -0
  324. package/lib/utils/createRefArray.d.ts +27 -0
  325. package/lib/utils/createRefArray.d.ts.map +1 -0
  326. package/lib/utils/createRefArray.js +49 -0
  327. package/lib/utils/createRefMap.d.ts +50 -0
  328. package/lib/utils/createRefMap.d.ts.map +1 -0
  329. package/lib/utils/createRefMap.js +77 -0
  330. package/lib/utils/debug.d.ts +24 -0
  331. package/lib/utils/debug.d.ts.map +1 -0
  332. package/lib/utils/debug.js +47 -0
  333. package/lib/utils/deprecate.d.ts +9 -0
  334. package/lib/utils/deprecate.d.ts.map +1 -0
  335. package/lib/utils/deprecate.js +15 -0
  336. package/lib/utils/errorToLog.d.ts +3 -0
  337. package/lib/utils/errorToLog.d.ts.map +1 -0
  338. package/lib/utils/errorToLog.js +8 -0
  339. package/lib/utils/experimentalLog.d.ts +3 -0
  340. package/lib/utils/experimentalLog.d.ts.map +1 -0
  341. package/lib/utils/experimentalLog.js +10 -0
  342. package/lib/utils/getContext.d.ts +2 -0
  343. package/lib/utils/getContext.d.ts.map +1 -0
  344. package/lib/utils/getContext.js +8 -0
  345. package/lib/utils/index.d.ts +26 -0
  346. package/lib/utils/index.d.ts.map +1 -0
  347. package/lib/utils/index.js +26 -0
  348. package/lib/utils/math.d.ts +15 -0
  349. package/lib/utils/math.d.ts.map +1 -0
  350. package/lib/utils/math.js +15 -0
  351. package/lib/utils/range.d.ts +40 -0
  352. package/lib/utils/range.d.ts.map +1 -0
  353. package/lib/utils/range.js +18 -0
  354. package/lib/utils/useContext.d.ts +13 -0
  355. package/lib/utils/useContext.d.ts.map +1 -0
  356. package/lib/utils/useContext.js +18 -0
  357. package/lib/utils/usePlayback.d.ts +8 -0
  358. package/lib/utils/usePlayback.d.ts.map +1 -0
  359. package/lib/utils/usePlayback.js +20 -0
  360. package/lib/utils/useScene.d.ts +17 -0
  361. package/lib/utils/useScene.d.ts.map +1 -0
  362. package/lib/utils/useScene.js +33 -0
  363. package/lib/utils/useThread.d.ts +8 -0
  364. package/lib/utils/useThread.d.ts.map +1 -0
  365. package/lib/utils/useThread.js +24 -0
  366. package/lib/utils/useTime.d.ts +19 -0
  367. package/lib/utils/useTime.d.ts.map +1 -0
  368. package/lib/utils/useTime.js +22 -0
  369. package/package.json +36 -0
  370. package/project.d.ts +24 -0
  371. package/shaders/common.glsl +15 -0
  372. package/shaders/fragment.glsl +8 -0
  373. 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,3 @@
1
+ import type { AssetInfo } from '../app';
2
+ export declare function download(assets: AssetInfo[][]): Promise<void>;
3
+ //# sourceMappingURL=download-videos.d.ts.map
@@ -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,5 @@
1
+ export * from './Exporter';
2
+ export * from './FFmpegExporter';
3
+ export * from './ImageExporter';
4
+ export * from './WasmExporter';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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"}
@@ -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