chore: initialize project
All checks were successful
Deploy monie-landing (kaniko) / build-and-deploy (push) Successful in 14m15s
All checks were successful
Deploy monie-landing (kaniko) / build-and-deploy (push) Successful in 14m15s
This commit is contained in:
93
server.mjs
Normal file
93
server.mjs
Normal file
@@ -0,0 +1,93 @@
|
||||
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}`);
|
||||
});
|
||||
Reference in New Issue
Block a user