Files
monie-landing/server.mjs
Denis Krylov e406c55c89
All checks were successful
Deploy monie-landing (kaniko) / build-and-deploy (push) Successful in 14m15s
chore: initialize project
2026-04-04 23:14:39 +03:00

94 lines
2.2 KiB
JavaScript

import http from "node:http";
import { Readable } from "node:stream";
import app from "./dist/server/server.js";
const port = Number.parseInt(process.env.PORT ?? "3000", 10);
const host = "0.0.0.0";
function toRequestHeaders(headers) {
const requestHeaders = new Headers();
for (const [key, value] of Object.entries(headers)) {
if (Array.isArray(value)) {
for (const item of value) {
requestHeaders.append(key, item);
}
continue;
}
if (typeof value === "string") {
requestHeaders.set(key, value);
}
}
return requestHeaders;
}
function getRequestBody(req) {
if (req.method === "GET" || req.method === "HEAD") {
return undefined;
}
return Readable.toWeb(req);
}
const server = http.createServer(async (req, res) => {
try {
const origin = `http://${req.headers.host ?? `localhost:${port}`}`;
const url = new URL(req.url ?? "/", origin);
// Fast kube probe endpoint that does not depend on app rendering.
if (url.pathname === "/healthz") {
res.statusCode = 200;
res.setHeader("content-type", "text/plain; charset=utf-8");
res.end("ok");
return;
}
const body = getRequestBody(req);
const request = new Request(url, {
method: req.method,
headers: toRequestHeaders(req.headers),
body,
duplex: body ? "half" : undefined,
});
const response = await app.fetch(request);
res.statusCode = response.status;
res.statusMessage = response.statusText;
const setCookies =
typeof response.headers.getSetCookie === "function"
? response.headers.getSetCookie()
: [];
if (setCookies.length > 0) {
res.setHeader("set-cookie", setCookies);
}
response.headers.forEach((value, key) => {
if (key.toLowerCase() !== "set-cookie") {
res.setHeader(key, value);
}
});
if (!response.body) {
res.end();
return;
}
Readable.fromWeb(response.body).pipe(res);
} catch (error) {
console.error("Request handling failed:", error);
if (!res.headersSent) {
res.statusCode = 500;
res.setHeader("content-type", "text/plain; charset=utf-8");
}
res.end("Internal Server Error");
}
});
server.listen(port, host, () => {
console.log(`Monie landing server listening on http://${host}:${port}`);
});