@westacks/vortex
Version:
Server-based routing for SPAs
56 lines (55 loc) • 2.14 kB
JavaScript
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
};