mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-23 04:02:49 -05:00
- Persistence: settings, shortcuts, recent projects, imported media, saved projects and auto-saves live in OPFS (IndexedDB fallback) through an in-memory mirror flushed in the background (apps/effectcraft-web/src/store.rs, persist.rs); ConfigStore gains FileOps so auto-save / recovery work in the browser store; the session snapshot restores the last project + editor state on reload; File > Open Recent works from storage. - Audio: Web Audio output (AudioWorklet, ScriptProcessor fallback) fed by AudioPlayback::pump on wasm32; A/V sync from AudioContext.currentTime; meters; unlock on first gesture. - Background jobs: engine::offload (WorkerRequest/WorkerReply protocol, Offload trait, run_request); Render Queue, tracker, mask tracker, Warp Stabilizer and Roto Freeze run in Web Workers (a second engine instance on the shared compiled module), progress streamed back; cancel terminates the worker. - GPU: WebGPU viewer frames drawn straight from the compositor's texture (gpu_display on wasm32 when the viewer draws plainly); async readback (Gpu::read_display_async) for pixels. - PWA: manifest, service worker precaching the build (xtask fills list/version), icons copied from assets/app-icon; COOP/COEP kept from cached responses; offline reload works. - window.effectcraft: saveToBrowser, listStored, removeStored, flush; info() reports storage, audio, gpu, workers. - Tests: native store + protocol + offload (render, track, cancel) tests; smoke.mjs extended (GPU path, worker render responsiveness, audio gesture + playback, reload persistence, Open Recent, offline reload). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
1.6 KiB
TOML
56 lines
1.6 KiB
TOML
[package]
|
|
name = "effectcraft-web"
|
|
description = "EffectCraft in the browser (wasm32): eframe web runner, persistent browser storage (OPFS / IndexedDB), Web Audio, Web Worker renders, PWA, window.effectcraft API"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
publish = false
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
crate-type = ["cdylib", "rlib"]
|
|
|
|
# The browser glue is wasm32-only; on other targets the crate holds just the portable storage
|
|
# model (`store`), unit-tested natively. Build the app with `cargo xtask web` (see docs/web.md).
|
|
[dependencies]
|
|
effectcraft-engine = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
|
|
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
|
effectcraft-host = { workspace = true }
|
|
effectcraft-media = { workspace = true }
|
|
effectcraft-export = { workspace = true }
|
|
effectcraft-expr = { workspace = true }
|
|
effectcraft-ui-egui = { workspace = true }
|
|
egui = { workspace = true }
|
|
eframe = { workspace = true, features = ["default_fonts", "wgpu"] }
|
|
log = { workspace = true }
|
|
web-time = { workspace = true }
|
|
# The wasm-bindgen CLI used by `cargo xtask web` must be exactly this version.
|
|
wasm-bindgen = "=0.2.129"
|
|
wasm-bindgen-futures = "0.4"
|
|
js-sys = "0.3"
|
|
web-sys = { version = "0.3", features = [
|
|
"Blob",
|
|
"BlobPropertyBag",
|
|
"CssStyleDeclaration",
|
|
"Document",
|
|
"Element",
|
|
"DedicatedWorkerGlobalScope",
|
|
"Event",
|
|
"EventTarget",
|
|
"File",
|
|
"FileList",
|
|
"HtmlAnchorElement",
|
|
"HtmlCanvasElement",
|
|
"HtmlElement",
|
|
"HtmlInputElement",
|
|
"Location",
|
|
"Url",
|
|
"UrlSearchParams",
|
|
"Window",
|
|
] }
|