Gate yaak-web to wasm32 and make the DB lock cover every worker

CI runs `cargo test --all`, which compiled yaak-web for the host and failed
in sqlite-wasm-rs's C shim. The crate is now `#![cfg(target_arch = "wasm32")]`
with its browser-only dependencies target-scoped, so it is empty natively.

Review caught a race in the worker fallback: a shared worker that starts
after the tab has given up on it and taken a dedicated worker would open the
database with no lock. The Web Lock now guards every worker, shared or not —
requested with a short timeout so a reloading tab's dying predecessor is
waited out, then reported. The tab also closes the port it abandoned. Verified
in production builds: 8/8 shared and 3/3 dedicated reloads render, and a
second tab in dedicated mode is told the database is in use.
This commit is contained in:
Gregory Schier
2026-08-15 16:07:41 -07:00
parent 0a7a9f7a2b
commit 6f49d7be00
6 changed files with 84 additions and 45 deletions
+11 -4
View File
@@ -16,15 +16,22 @@ wasm-opt = false # Matches yaak-templates; wasm-opt has caused errors in CI
[lib]
crate-type = ["cdylib", "rlib"]
# The whole crate is `#![cfg(target_arch = "wasm32")]`: on a native target it
# is empty, so a workspace-wide `cargo test` neither builds SQLite's wasm shim
# for the host (which fails) nor links a browser-only runtime. Everything that
# only exists for wasm is a target-scoped dependency for the same reason.
[dependencies]
console_error_panic_hook = "0.1"
js-sys = "0.3"
log = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde-wasm-bindgen = "0.6.5"
serde_json = { workspace = true }
yaak-models = { workspace = true }
[target.'cfg(target_arch = "wasm32")'.dependencies]
console_error_panic_hook = "0.1"
js-sys = "0.3"
serde-wasm-bindgen = "0.6.5"
sqlite-wasm-rs = "0.5"
sqlite-wasm-vfs = "0.2"
wasm-bindgen = "0.2.100"
wasm-bindgen-futures = "0.4"
yaak-models = { workspace = true }
Binary file not shown.
+5
View File
@@ -15,6 +15,11 @@
//! its model store coherent, and blob storage. Sending, plugins, git, sync and
//! everything else with a socket or a filesystem behind it lives elsewhere.
// Nothing in here means anything off wasm32, and building it there would drag
// SQLite's wasm C shim into a native compile. So on any other target the crate
// is empty — a workspace-wide `cargo test` passes through it.
#![cfg(target_arch = "wasm32")]
use std::cell::RefCell;
use std::sync::mpsc;