UNPKG

alinea

Version:
75 lines (73 loc) 2.09 kB
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 };