UNPKG

elysia

Version:

Ergonomic Framework for Human

360 lines (359 loc) 13.1 kB
import { createResponseHandler, createStreamHandler, handleFile, handleSet } from "../utils.mjs"; import { isNotEmpty } from "../../utils.mjs"; import { Cookie } from "../../cookies.mjs"; import { ElysiaCustomStatusResponse } from "../../error.mjs"; const mapResponse = (response, set2, request) => { if (isNotEmpty(set2.headers) || set2.status !== 200 || set2.cookie) switch (handleSet(set2), response?.constructor?.name) { case "String": return new Response(response, set2); case "Array": case "Object": return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2); case "ElysiaFile": return handleFile( response.value, set2 ); case "File": return handleFile(response, set2); case "Blob": return handleFile(response, set2); case "ElysiaCustomStatusResponse": return set2.status = response.code, mapResponse( response.response, set2, request ); case void 0: return response ? new Response(JSON.stringify(response), set2) : new Response("", set2); case "Response": return handleResponse(response, set2, request); case "Error": return errorToResponse(response, set2); case "Promise": return response.then( (x) => mapResponse(x, set2, request) ); case "Function": return mapResponse(response(), set2, request); case "Number": case "Boolean": return new Response( response.toString(), set2 ); case "Cookie": return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2); case "FormData": return new Response(response, set2); default: if (response instanceof Response) return handleResponse(response, set2, request); if (response instanceof Promise) return response.then((x) => mapResponse(x, set2)); if (response instanceof Error) return errorToResponse(response, set2); if (response instanceof ElysiaCustomStatusResponse) return set2.status = response.code, mapResponse( response.response, set2, request ); if ( // @ts-expect-error typeof response?.next == "function" || response instanceof ReadableStream ) return handleStream(response, set2, request); if (typeof response?.then == "function") return response.then((x) => mapResponse(x, set2)); if (typeof response?.toResponse == "function") return mapResponse(response.toResponse(), set2); if ("charCodeAt" in response) { const code = response.charCodeAt(0); if (code === 123 || code === 91) return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response( JSON.stringify(response), set2 ); } return new Response(response, set2); } return ( // @ts-expect-error typeof response?.next == "function" || response instanceof ReadableStream ? handleStream(response, set2, request) : mapCompactResponse(response, request) ); }, mapEarlyResponse = (response, set2, request) => { if (response != null) if (isNotEmpty(set2.headers) || set2.status !== 200 || set2.cookie) switch (handleSet(set2), response?.constructor?.name) { case "String": return new Response(response, set2); case "Array": case "Object": return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2); case "ElysiaFile": return handleFile(response.value, set2); case "File": return handleFile(response, set2); case "Blob": return handleFile(response, set2); case "ElysiaCustomStatusResponse": return set2.status = response.code, mapEarlyResponse( response.response, set2, request ); case void 0: return response ? new Response(JSON.stringify(response), set2) : void 0; case "Response": return handleResponse(response, set2, request); case "Promise": return response.then( (x) => mapEarlyResponse(x, set2) ); case "Error": return errorToResponse(response, set2); case "Function": return mapEarlyResponse(response(), set2); case "Number": case "Boolean": return new Response( response.toString(), set2 ); case "FormData": return new Response(response); case "Cookie": return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2); default: if (response instanceof Response) return handleResponse(response, set2, request); if (response instanceof Promise) return response.then((x) => mapEarlyResponse(x, set2)); if (response instanceof Error) return errorToResponse(response, set2); if (response instanceof ElysiaCustomStatusResponse) return set2.status = response.code, mapEarlyResponse( response.response, set2, request ); if ( // @ts-expect-error typeof response?.next == "function" || response instanceof ReadableStream ) return handleStream(response, set2, request); if (typeof response?.then == "function") return response.then((x) => mapEarlyResponse(x, set2)); if (typeof response?.toResponse == "function") return mapEarlyResponse(response.toResponse(), set2); if ("charCodeAt" in response) { const code = response.charCodeAt(0); if (code === 123 || code === 91) return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response( JSON.stringify(response), set2 ); } return new Response(response, set2); } else switch (response?.constructor?.name) { case "String": return new Response(response); case "Array": case "Object": return set2.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set2); case "ElysiaFile": return handleFile(response.value, set2); case "File": return handleFile(response, set2); case "Blob": return handleFile(response, set2); case "ElysiaCustomStatusResponse": return set2.status = response.code, mapEarlyResponse( response.response, set2, request ); case void 0: return response ? new Response(JSON.stringify(response), { headers: { "content-type": "application/json" } }) : new Response(""); case "Response": return response; case "Promise": return response.then((x) => { const r = mapEarlyResponse(x, set2); if (r !== void 0) return r; }); case "Error": return errorToResponse(response, set2); case "Function": return mapCompactResponse(response(), request); case "Number": case "Boolean": return new Response(response.toString()); case "Cookie": return response instanceof Cookie ? new Response(response.value, set2) : new Response(response?.toString(), set2); case "FormData": return new Response(response); default: if (response instanceof Response) return response; if (response instanceof Promise) return response.then((x) => mapEarlyResponse(x, set2)); if (response instanceof Error) return errorToResponse(response, set2); if (response instanceof ElysiaCustomStatusResponse) return set2.status = response.code, mapEarlyResponse( response.response, set2, request ); if ( // @ts-expect-error typeof response?.next == "function" || response instanceof ReadableStream ) return handleStream(response, set2, request); if (typeof response?.then == "function") return response.then((x) => mapEarlyResponse(x, set2)); if (typeof response?.toResponse == "function") return mapEarlyResponse(response.toResponse(), set2); if ("charCodeAt" in response) { const code = response.charCodeAt(0); if (code === 123 || code === 91) return set2.headers["Content-Type"] || (set2.headers["Content-Type"] = "application/json"), new Response( JSON.stringify(response), set2 ); } return new Response(response); } }, mapCompactResponse = (response, request) => { switch (response?.constructor?.name) { case "String": return new Response(response); case "Object": case "Array": return new Response(JSON.stringify(response), { headers: { "Content-Type": "application/json" } }); case "ElysiaFile": return handleFile(response.value); case "File": return handleFile(response); case "Blob": return handleFile(response); case "ElysiaCustomStatusResponse": return mapResponse( response.response, { status: response.code, headers: {} } ); case void 0: return response ? new Response(JSON.stringify(response), { headers: { "content-type": "application/json" } }) : new Response(""); case "Response": return response; case "Error": return errorToResponse(response); case "Promise": return response.then( (x) => mapCompactResponse(x, request) ); // ? Maybe response or Blob case "Function": return mapCompactResponse(response(), request); case "Number": case "Boolean": return new Response(response.toString()); case "FormData": return new Response(response); default: if (response instanceof Response) return response; if (response instanceof Promise) return response.then( (x) => mapCompactResponse(x, request) ); if (response instanceof Error) return errorToResponse(response); if (response instanceof ElysiaCustomStatusResponse) return mapResponse( response.response, { status: response.code, headers: {} } ); if ( // @ts-expect-error typeof response?.next == "function" || response instanceof ReadableStream ) return handleStream(response, void 0, request); if (typeof response?.then == "function") return response.then((x) => mapResponse(x, set)); if (typeof response?.toResponse == "function") return mapCompactResponse(response.toResponse()); if ("charCodeAt" in response) { const code = response.charCodeAt(0); if (code === 123 || code === 91) return new Response(JSON.stringify(response), { headers: { "Content-Type": "application/json" } }); } return new Response(response); } }, errorToResponse = (error, set2) => { if (typeof error?.toResponse == "function") { const raw = error.toResponse(), targetSet = set2 ?? { headers: {}, status: 200, redirect: "" }, apply = (resolved) => (resolved instanceof Response && (targetSet.status = resolved.status), mapResponse(resolved, targetSet)); return typeof raw?.then == "function" ? raw.then(apply) : apply(raw); } return new Response( JSON.stringify({ name: error?.name, message: error?.message, cause: error?.cause }), { status: set2?.status !== 200 ? set2?.status ?? 500 : 500, headers: set2?.headers } ); }, createStaticHandler = (handle, hooks, setHeaders = {}) => { if (typeof handle == "function") return; const response = mapResponse(handle, { headers: setHeaders }); if (!hooks.parse?.length && !hooks.transform?.length && !hooks.beforeHandle?.length && !hooks.afterHandle?.length) return () => response.clone(); }, handleResponse = createResponseHandler({ mapResponse, mapCompactResponse }), handleStream = createStreamHandler({ mapResponse, mapCompactResponse }); export { createStaticHandler, errorToResponse, mapCompactResponse, mapEarlyResponse, mapResponse };