UNPKG

@westacks/vortex

Version:

Server-based routing for SPAs

56 lines (55 loc) 2.14 kB
import { createServer } from "node:http"; import { argv, stdout, exit } from "node:process"; import { s as setPage, g as getPage } from "./page-ILOxo6kg.js"; function createVortexServer(renderer, port = 13714) { return argv.length >= 3 ? createCli(renderer) : createSrv(renderer, port); } const read = (message) => new Promise((resolve, reject) => { let data = ""; message.on("data", (chunk) => data += chunk); message.on("end", () => resolve(data + "\n")); message.on("error", reject); }); async function createCli(renderer) { try { const page = JSON.parse(argv[2] ?? "null"); if (page) setPage(page); stdout.write(JSON.stringify(await renderer(getPage())) + "\n"); } catch (error) { const res = new Error("Unable to parse page data", { cause: error }); console.error(res); exit(1); } } async function createSrv(renderer, port = 13714) { const routes = { "/up": () => ({ status: "OK", timestamp: Date.now() }), "/down": () => exit(), "/render": async (request) => { const timer = performance.now(); const page = JSON.parse(await read(request) ?? "null"); setPage(page); const result = await renderer(getPage()); console.log(`[VORTEX] Rendered page '${page == null ? void 0 : page.url}' in ${performance.now() - timer} ms`); return result; }, "*": () => ({ status: "NOT_FOUND", timestamp: Date.now() }) }; console.log(`[VORTEX] Starting server on port ${port}...`); return createServer(async (request, response) => { const route = routes[request.url ?? ""] || routes["*"]; try { const result = await route(request); response.writeHead(200, { "Content-Type": "application/json", "Server": "Vortex" }); response.write(JSON.stringify(result)); } catch (error) { response.writeHead(500, { "Content-Type": "application/json", "Server": "Vortex" }); response.end(JSON.stringify({ status: "ERROR", timestamp: Date.now(), error })); console.error(error); } response.end(); }).listen(port, () => console.log(`[VORTEX] Listening on port ${port}`)); } export { createVortexServer };