import assert from "node:assert/strict"; import { spawn } from "node:child_process"; import { access, readFile } from "node:fs/promises"; import { createServer } from "node:net"; import { fileURLToPath } from "node:url"; import test, { after, before } from "node:test"; let serverProcess; let serverOrigin; async function reservePort() { const server = createServer(); await new Promise((resolve, reject) => { server.once("error", reject); server.listen(0, "127.0.0.1", resolve); }); const address = server.address(); assert(address && typeof address === "object"); await new Promise((resolve, reject) => { server.close((error) => (error ? reject(error) : resolve())); }); return address.port; } before(async () => { const port = await reservePort(); serverOrigin = `http://127.0.0.1:${port}`; serverProcess = spawn( process.execPath, [ fileURLToPath(new URL("../node_modules/srvx/bin/srvx.mjs", import.meta.url)), "serve", "--prod", "--entry", "dist/server/server.js", "--static", "../client", ], { env: { ...process.env, HOST: "127.0.0.1", PORT: String(port), }, stdio: ["ignore", "pipe", "pipe"], }, ); for (let attempt = 0; attempt < 50; attempt += 1) { if (serverProcess.exitCode !== null) { throw new Error(`Node server exited with code ${serverProcess.exitCode}`); } try { const response = await fetch(serverOrigin); if (response.ok) return; } catch { // The server is still starting. } await new Promise((resolve) => setTimeout(resolve, 100)); } throw new Error("Node server did not become ready"); }); after(() => { serverProcess?.kill("SIGTERM"); }); test("server-renders the Wasm management console", async () => { const response = await fetch(serverOrigin, { headers: { accept: "text/html" }, }); assert.equal(response.status, 200); assert.match(response.headers.get("content-type") ?? "", /^text\/html\b/i); const html = await response.text(); assert.match(html, /