Pi-CLI-Web / server.mjs
Mike0021's picture
Deploy pi cli web docker server
aab0173 verified
import { createReadStream, existsSync, statSync } from "node:fs";
import { createServer } from "node:http";
import { extname, join, normalize } from "node:path";
import { fileURLToPath } from "node:url";
const root = join(fileURLToPath(new URL(".", import.meta.url)), "dist");
const port = Number(process.env.PORT || 7860);
const contentTypes = {
".css": "text/css; charset=utf-8",
".html": "text/html; charset=utf-8",
".js": "application/javascript; charset=utf-8",
".json": "application/json; charset=utf-8",
".map": "application/json; charset=utf-8",
".svg": "image/svg+xml",
".wasm": "application/wasm",
};
function resolvePath(urlPath) {
const decoded = decodeURIComponent(urlPath.split("?")[0] || "/");
const clean = normalize(decoded).replace(/^(\.\.[/\\])+/, "");
const candidate = join(root, clean);
if (existsSync(candidate) && statSync(candidate).isFile()) {
return candidate;
}
return join(root, "index.html");
}
const server = createServer((request, response) => {
const filePath = resolvePath(request.url || "/");
const type = contentTypes[extname(filePath)] || "application/octet-stream";
response.setHeader("content-type", type);
response.setHeader("cross-origin-opener-policy", "same-origin");
response.setHeader("cross-origin-embedder-policy", "credentialless");
response.setHeader("cross-origin-resource-policy", "cross-origin");
response.setHeader("cache-control", filePath.endsWith("index.html") ? "no-store" : "public, max-age=31536000, immutable");
createReadStream(filePath).pipe(response);
});
server.listen(port, "0.0.0.0", () => {
console.log(`Pi CLI Web serving ${root} on ${port}`);
});