34 lines
1.3 KiB
JavaScript
34 lines
1.3 KiB
JavaScript
import { eventHandler } from "h3";
|
|
import { useNitroApp } from "./app.mjs";
|
|
export function defineRenderHandler(handler) {
|
|
return eventHandler(async (event) => {
|
|
if (event.req.url.endsWith("/favicon.ico")) {
|
|
event.res.setHeader("Content-Type", "image/x-icon");
|
|
event.res.end("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
|
|
return;
|
|
}
|
|
const response = await handler(event);
|
|
if (!response) {
|
|
if (!event.res.writableEnded) {
|
|
event.res.statusCode = event.res.statusCode === 200 ? 500 : event.res.statusCode;
|
|
event.res.end("No response returned from render handler: " + event.req.url);
|
|
}
|
|
return;
|
|
}
|
|
const nitroApp = useNitroApp();
|
|
await nitroApp.hooks.callHook("render:response", response, { event });
|
|
if (!event.res.headersSent && response.headers) {
|
|
for (const header in response.headers) {
|
|
event.res.setHeader(header, response.headers[header]);
|
|
}
|
|
if (response.statusCode) {
|
|
event.res.statusCode = response.statusCode;
|
|
}
|
|
if (response.statusMessage) {
|
|
event.res.statusMessage = response.statusMessage;
|
|
}
|
|
}
|
|
return typeof response.body === "string" ? response.body : JSON.stringify(response.body);
|
|
});
|
|
}
|