import { execFileSync } from "node:child_process"; import { copyFileSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs"; import { createHash } from "node:crypto"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; const repository = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const core = resolve(repository, "crypto-core"); const generated = resolve(core, "generated"); const destination = resolve(repository, "src/shared/noise-core-wasm"); const wasm = resolve(generated, "peach_noise_core_bg.wasm"); function run(command, args) { execFileSync(command, args, { cwd: core, stdio: "inherit" }); } run("cargo", ["fmt", "--check"]); run("cargo", ["test", "--locked"]); run("cargo", [ "build", "--locked", "--target", "wasm32-unknown-unknown", "--release", ]); run("wasm-bindgen", [ "--target", "web", "--out-dir", generated, resolve( core, "target/wasm32-unknown-unknown/release/peach_noise_core.wasm", ), ]); mkdirSync(destination, { recursive: true }); for (const file of [ "peach_noise_core.js", "peach_noise_core.d.ts", "peach_noise_core_bg.wasm", "peach_noise_core_bg.wasm.d.ts", ]) { copyFileSync(resolve(generated, file), resolve(destination, file)); } const bytes = readFileSync(wasm); const base64 = bytes.toString("base64"); const chunks = base64.match(/.{1,120}/g) ?? []; writeFileSync( resolve(destination, "peach_noise_core_bytes.ts"), [ "// Generated by scripts/build-noise-core.mjs. Do not edit.", "export const PEACH_NOISE_CORE_WASM_BASE64 = [", ...chunks.map((chunk) => ` "${chunk}",`), '].join("");', "", ].join("\n"), ); const digest = createHash("sha256").update(bytes).digest("hex"); console.log(`Peach Noise WASM SHA-256: ${digest}`);