Files

4.1 KiB

Building the OneCAD Draft wasm bundle (static/onecaddraft)

The complete source state of this repository (rebrand + Odoo glue + Rust bridge) is ready to build. The wasm compile of the app crate (640k lines of Rust across 789 files) needs ~4.5 GB RAM for rustc alone — it OOM-kills in a 4 GB cgroup (verified twice with a memory monitor: rustc peaks at ~3.7 GB and grows past the ceiling during metadata encoding). Any machine with 8 GB+ free RAM and ~3 GB free disk completes it.

Build on a roomy machine (the one path that works end-to-end)

# 0) deps: rustup target add wasm32-unknown-unknown; cargo install --locked trunk
#    wasm-bindgen-cli MUST match Cargo.lock (grep wasm-bindgen Cargo.lock)

# 1) OPTIONAL (recommended for production quality): restore opt level
#    In Cargo.toml [profile.release] remove the opt-level = 0 line added for
#    the constrained sandbox build. Upstream default (opt 3) is best for CAD.

# 2) build (trunk reads Trunk.toml: target=web-app.html, dist=dist/app,
#    and runs the [[hooks]] post_build script that builds + wasm-binds
#    the ocs_web_worker cdylib automatically)
trunk build --release

# 3) assemble + deploy + version lockstep (compiles web/odoo/*.ts with
#    esbuild, strips sw.js/app.webmanifest, injects the odoo boot snippet,
#    deploys to core-components/one_cad_draft/static/onecaddraft/)
python3 scripts/assemble_onecaddraft_dist.py   # on the one-os-dev sandbox

# 4) install/upgrade the module
python3 scripts/onecaddraft-install-rpc.py     # XML-RPC 127.0.0.1:18070 db=oneos

assemble_onecaddraft_dist.py gates: REQUIRED index.html, OpenCADStudio.js, OpenCADStudio_bg.wasm, worker_pkg/ocs_web_worker.js, worker_pkg/ocs_web_worker_bg.wasm, ocs-parse-worker.js, ocs-control.js, locale-labels.json, non-empty fonts/; FORBIDDEN sw.js, app.webmanifest (stripped with a loud log); no absolute /app/-prefixed asset refs; version lockstep across bundleVersion, __manifest__.py and the glue ?v= literals.

Sandbox lessons that cost us hours (do not re-learn)

  1. ?v= bump per build. Odoo serves statics with 7-day max-age; the assembler bumps everything in lockstep. Hard-refresh the browser once.
  2. wasm-bindgen stack OOM when the Odoo stack is up: oneos-dev down before bindgen, up after (the assembler does not build, so this only matters for manual bindgen runs).
  3. NEVER wasm-tools strip -a (destroys __wasm_bindgen_unstable). Use wasm-opt --strip-dwarf then -O1/-O2 if hand-optimizing; trunk already runs the wasm-opt pass requested in the HTML tag.
  4. Overlay rootfs: only runtime-layer deletions free space; build scratch must be deleted eagerly (target/release/deps re-fills on resume — deleting it buys nothing net).
  5. NO_COLOR=1 breaks trunk's clap parser (--no-color expects true/false): run trunk with env -u NO_COLOR.
  6. cargo check creates a full second (dev-profile) tree — on a constrained disk it IS the disk-full event. Don't check; build.
  7. Orphan sweep: profile-era changes leave stale-hash artifacts forever; scripts/prune-orphans.py (in the one-os-dev sandbox) reclaims them.
  8. Background processes die between tool calls in the z.ai sandbox — run long builds in ≤9-minute foreground chunks; cargo resumes incrementally.

What is already wired (no further source work needed)

  • web/odoo/{index.ts,bridge.ts,explorer.js} — the Documents glue (save air-gap via window.openCadStudioSaveFile, deep-link opens via wasmBindings.ocs_web_drop_file, explorer dialogs, bind storage).
  • src/odoo_bridge.rs — Rust bridge: File > Open in the embedded shell dispatches onecaddraft:host-request {method:"odoo.pickOpen"} and drains completions in Message::PollWebControl (50 ms tick) into open_web_bytes. Never touches window.onecaddraftHostReady.
  • src/app/update/file.rs (intercept) + src/app/update/mod.rs (drain) + src/lib.rs (module decl) + Cargo.toml (CustomEvent features).
  • core-components/one_cad_draft/ in one-os-dev: the 5-file addon (storage seq 52, menu seq 37, extensions dxf/dwg, fileExtension .dxf).