open-standards/wai/wai-quantum-js/build.sh
Transaction Science 51e89d4e20
All checks were successful
wai-quantum docs, course and locales / does this change touch it (pull_request) Successful in 6s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 9s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 8s
WAI energy receipts / does this change touch it (pull_request) Successful in 10s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 7s
wai-quantum docs, course and locales / the Studio's words in every locale · linux (pull_request) Successful in 37s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 1m13s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m49s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 3m6s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 3m7s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 5m7s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m33s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 8m31s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 9m6s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m53s
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Successful in 12m23s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 1h4m5s
wai-quantum for JavaScript: the engine as the npm package @transaction-science/wai-quantum 0.1.0
wai/wai-quantum-js/ packs the job service's engine for WebAssembly (wai-web
with its quantum_engine feature, the engine of wai-quantum 0.7.0) and its
bindings as an ES module with its TypeScript declarations and no dependencies,
for a page (init() fetches the .wasm beside the module) or for Node (init is
given its bytes). The package keeps its own version line, as the Python
package does.

- build.sh: wai-web built for wasm32 with paths remapped (as the views build
  does), wasm-bindgen 0.2.127 (refused if it is not the version wai-web's lock
  file pins), package.json, README and the licence copied, the build refused if
  a local path is left in the bindings or the binary, then packed.
- test/smoke.mjs, on the package unpacked: a job run with a fresh 32-byte key
  and its receipt verified with this engine's did:key; a forged result that
  does not verify; a program linted and drawn; a refused program with its
  diagnostic code (Q310).
- test/install.mjs: the README's Node example, run in an empty app that
  installed the tarball with npm, the package found by name and its .wasm by
  the subpath it exports.
- ci/check.sh runs them all and holds the tarball to the package's allow-list
  (the seven files and nothing else).
- wai-quantum-js.yml runs ci/check.sh on Linux. wai-quantum-js-release.yml runs
  it on a wai-quantum-cli-v* tag and attaches the tarball and its SHA-256 to the
  release. Nothing is published to a registry from CI.

On the M3 Ultra: the .wasm is 5,928,153 bytes, the tarball 2.26 MB, and every
check passes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 08:14:24 -04:00

54 lines
2.4 KiB
Shell
Executable file

#!/usr/bin/env bash
# Build the npm package @transaction-science/wai-quantum: the quantum job service's
# engine for WebAssembly (wai/wai-web with its quantum_engine feature), its JavaScript
# bindings, and this folder's package.json and README, packed as one tarball:
#
# bash wai/wai-quantum-js/build.sh OUT_DIR
#
# Writes OUT_DIR/package/ (the package's files) and OUT_DIR/<name>-<version>.tgz, and
# prints the tarball's SHA-256. It needs Rust with the wasm32-unknown-unknown target,
# wasm-bindgen 0.2.127 (the version wai-web's lock file pins) and npm. Paths are
# remapped out of the binary, and the build is refused if a local path is left in the
# files it ships.
set -euo pipefail
if [ $# -ne 1 ]; then
echo "usage: bash wai/wai-quantum-js/build.sh OUT_DIR" >&2
exit 2
fi
here=$(cd "$(dirname "$0")" && pwd)
root=$(cd "$here/../.." && pwd)
web="$root/wai/wai-web"
mkdir -p "$1"
out=$(cd "$1" && pwd)
sha256() { if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1"; else shasum -a 256 "$1"; fi; }
want=$(sed -n '/^name = "wasm-bindgen"$/{n;s/^version = "\(.*\)"$/\1/p;}' "$web/Cargo.lock")
have=$(wasm-bindgen --version | cut -d' ' -f2)
[ "$have" = "$want" ] || { echo "build.sh: wasm-bindgen is $have; wai-web's lock file pins $want" >&2; exit 1; }
target=${CARGO_TARGET_DIR:-"$web/target"}
sysroot=$(cd "$web" && rustc --print sysroot)
commit=$(cd "$web" && rustc -vV | sed -n 's/^commit-hash: //p')
export RUSTFLAGS="--remap-path-prefix=$root=/open-standards --remap-path-prefix=${CARGO_HOME:-$HOME/.cargo}=/cargo --remap-path-prefix=$sysroot/lib/rustlib/src/rust=/rustc/$commit"
(cd "$web" && cargo build --locked --release --target wasm32-unknown-unknown --features quantum_engine)
pkg="$out/package"
rm -rf "$pkg"
mkdir -p "$pkg"
wasm-bindgen --target web --out-dir "$pkg" --out-name wai_quantum "$target/wasm32-unknown-unknown/release/wai_web.wasm"
cp "$here/package.json" "$here/README.md" "$pkg/"
cp "$root/wai/LICENSE" "$pkg/LICENSE"
# Nothing the package ships names the machine that built it.
for leak in "$HOME" /Users/ /home/ /Volumes/ /private/; do
if grep -r -q -a -F "$leak" "$pkg"/wai_quantum*; then
echo "build.sh: '$leak' is in the package's bindings or binary" >&2
exit 1
fi
done
rm -f "$out"/*.tgz
npm pack "$pkg" --pack-destination "$out" --silent > /dev/null
tgz=$(ls "$out"/*.tgz)
echo "wasm: $(wc -c < "$pkg/wai_quantum_bg.wasm" | tr -d ' ') bytes"
sha256 "$tgz"