Preview1 state lives in the host, so Go modules (esbuild) work. esbuild bundles byte-identical to native; uutils and QuickJS-ng file tests pass. The failed guest-side adapter attempt (T7) moves to spikes/s7-preview1-adapter/.
2.4 KiB
Preview1 command adapter experiment
This directory tests D39 with Go esbuild, uutils, and QuickJS.
The patch reserves the adapter state before the guest calls _start.
It retains both state sentinels and all WASI semantics.
Build
From the repository root:
nix develop -c nu spikes/s7-preview1-adapter/build.nu
nix develop -c nu spikes/s7-preview1-adapter/test.nu
The build pins Wasmtime v49.0.2 to commit
3c8a3e79aa3188a1a12b3aebbaa097abccceac92 and uses its Cargo.lock with --locked.
The repository flake pins the Rust toolchain through flake.lock.
The build requires the wasm32-unknown-unknown standard library.
T11 removed this target from the production flake after T7 disproved the patch.
To repeat this historical experiment, supply that target in a separate Rust toolchain.
It places sources, a persistent target directory, and the adapter under /tmp/p1-adapter/.
The test uses the S6 esbuild v0.27.7 module at /tmp/s6-esbuild/esbuild.wasm.
The S6 build recipe can create this input.
The test copies the S6 fixture into its own scratch directory and installs its locked dependencies.
It compares module and component bundles byte-for-byte and checks rendered elements with LinkeDOM.
It also adapts the lab's preview1 uutils and QuickJS modules.
These smoke tests check command arguments and stdout.
They do not check every utility or JavaScript feature.
The test requires these existing lab inputs:
/tmp/wasi-userland-lab/uu/coreutils-0.12.0-wasm32-wasip1/coreutils.wasm/tmp/wasi-userland-lab/qjs-wasi.wasm
Result
The eager-state patch does not fix esbuild.
The component traps during --version after Go overwrites the adapter state sentinels.
The uutils and QuickJS smoke tests pass.
The task report records the sentinel addresses and values.
diagnostic.patch is an alternative patch against the same pristine Wasmtime revision.
It includes the eager-state change and prints state sentinels before _start and upon corruption.
It does not disable assertions.
Do not apply both patches to one source tree.
The diagnostic build uses the same Cargo command as the normal build.
Use wasm-tools component new with its resulting adapter to reproduce the trace.
The eager-state change does not reserve its memory from Go's allocator. Go starts its allocation cursor at the end of its static data, not at the current memory size. The host-side adapter is the next planned approach under D39.