@elysiajs/node
Version:
Elysia adapter to run Elysia on Node.js
99 lines (98 loc) • 3.22 kB
JavaScript
// src/utils.ts
import { FastResponse as Response } from "srvx";
import { isNotEmpty, StatusMap } from "elysia/utils";
import {
createStreamHandler,
responseToSetHeaders,
streamResponse
} from "elysia/adapter/utils";
var handleFile = (response, set) => {
if (response instanceof Promise)
return response.then((res) => handleFile(res, set));
const size = response.size;
const immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416);
const defaultHeader = immutable ? {
"transfer-encoding": "chunked"
} : {
"accept-ranges": "bytes",
"content-range": size ? `bytes 0-${size - 1}/${size}` : void 0,
"transfer-encoding": "chunked"
};
if (!set && !size) return new Response(response);
if (!set)
return new Response(response, {
headers: defaultHeader
});
if (set.headers instanceof Headers) {
let setHeaders = defaultHeader;
setHeaders = {};
for (const [key, value] of set.headers.entries())
if (key in set.headers) setHeaders[key] = value;
if (immutable) {
delete set.headers["content-length"];
delete set.headers["accept-ranges"];
}
return new Response(response, {
status: set.status,
headers: setHeaders
});
}
if (isNotEmpty(set.headers))
return new Response(response, {
status: set.status,
headers: Object.assign(defaultHeader, set.headers)
});
return new Response(response, {
status: set.status,
headers: defaultHeader
});
};
function mergeHeaders(responseHeaders, setHeaders) {
const headers = new Headers(Object.fromEntries(responseHeaders.entries()));
if (setHeaders instanceof Headers)
for (const key of setHeaders.keys()) {
if (key === "set-cookie") {
if (headers.has("set-cookie")) continue;
for (const cookie of setHeaders.getSetCookie())
headers.append("set-cookie", cookie);
} else if (!responseHeaders.has(key))
headers.set(key, setHeaders?.get(key) ?? "");
}
else
for (const key in setHeaders)
if (key === "set-cookie")
headers.append(key, setHeaders[key]);
else if (!responseHeaders.has(key))
headers.set(key, setHeaders[key]);
return headers;
}
function mergeStatus(responseStatus, setStatus) {
if (typeof setStatus === "string") setStatus = StatusMap[setStatus];
if (responseStatus === 200) return setStatus;
return responseStatus;
}
var createResponseHandler = (handler) => {
const handleStream = createStreamHandler(handler);
return (response, set, request) => {
const newResponse = new Response(response.body, {
headers: mergeHeaders(response.headers, set.headers),
status: mergeStatus(response.status, set.status)
});
if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked")
return handleStream(
streamResponse(newResponse),
responseToSetHeaders(newResponse, set),
request,
// @ts-ignore
true
// don't auto-format SSE for pre-formatted Response
);
return newResponse;
};
};
export {
createResponseHandler,
handleFile,
mergeHeaders,
mergeStatus
};