alinea
Version:
Headless git-based CMS
75 lines (73 loc) • 2.09 kB
JavaScript
import "../../chunks/chunk-NZLE2WMY.js";
// src/backend/router/NodeHandler.ts
import { Headers, Request } from "@alinea/iso";
import { TLSSocket } from "node:tls";
async function writeReadableStreamToWritable(stream, writable) {
const reader = stream.getReader();
async function read() {
const { done, value } = await reader.read();
if (done) return writable.end();
writable.write(value);
await read();
}
try {
await read();
} catch (error) {
writable.destroy(error);
throw error;
}
}
async function respondTo(to, response) {
to.statusCode = response.status;
response.headers.forEach((value, key) => to.setHeader(key, value));
if (response.body) {
await writeReadableStreamToWritable(response.body, to);
}
to.end();
}
var skipHeaders = /* @__PURE__ */ new Set(["transfer-encoding", "connection", "keep-alive"]);
function fromNodeRequest(request) {
const headers = new Headers();
for (const key of Object.keys(request.headers)) {
if (skipHeaders.has(key)) continue;
if (!(key in request.headers)) continue;
const value = request.headers[key];
if (value === void 0) continue;
if (Array.isArray(value)) {
for (const v of value) {
headers.append(key, v);
}
} else {
headers.set(key, value);
}
}
const init = {
method: request.method,
headers,
duplex: "half"
};
const protocol = request.socket instanceof TLSSocket && request.socket.encrypted ? "https" : "http";
const url = `${protocol}://${request.headers.host}${request.originalUrl || request.url}`;
if (request.method !== "GET" && request.method !== "HEAD")
init.body = request;
return new Request(url, init);
}
function nodeHandler(handler) {
return async (req, res, next) => {
const request = fromNodeRequest(req);
const result = await handler(request);
if (result) {
await respondTo(res, result);
} else if (next) {
next();
} else {
res.statusCode = 404;
res.end("Not found");
}
};
}
export {
fromNodeRequest,
nodeHandler,
respondTo
};