// Demo page logic for guest node:http: the guest listens on a port, the page waits // for it and mounts an iframe on the /~/@/http// virtual origin. ?esm runs the // ESM variant of the server. Runs on the page (host side). import { boot } from "@nibling/kernel"; const out = document.getElementById("out"); const errEl = document.getElementById("err"); const exitEl = document.getElementById("exit"); const dec = new TextDecoder(); const entry = new URLSearchParams(location.search).has("esm") ? "/app/server.mjs" : "/app/server.cjs"; try { const runtime = await boot(); const source = await (await fetch(`/demo${entry}`)).text(); runtime.writeTree({ [entry]: source }); const proc = runtime.exec(entry); proc.stdout.pipeTo(new WritableStream({ write: (c) => { out.textContent += dec.decode(c); } })); proc.stderr.pipeTo(new WritableStream({ write: (c) => { errEl.textContent += dec.decode(c); } })); proc.exited.then((code) => { exitEl.textContent = String(code); }); const url = await runtime.waitForPort(3000); const frame = document.createElement("iframe"); frame.id = "app"; frame.title = "guest server on port 3000"; frame.src = url; document.body.append(frame); } catch (e) { errEl.textContent = "BOOT FAILED: " + (e?.message ?? String(e)); exitEl.textContent = "?"; }