2025-09-05 14:59:21 +08:00

54 lines
1.6 KiB
JavaScript

import "#nitro-internal-pollyfills";
import { useNitroApp } from "nitropack/runtime";
import {
getRouteRulesForPath,
joinHeaders,
normalizeCookieHeader
} from "nitropack/runtime/internal";
const nitroApp = useNitroApp();
const handler = async (req) => {
const url = new URL(req.url);
const relativeUrl = `${url.pathname}${url.search}`;
const r = await nitroApp.localCall({
url: relativeUrl,
headers: req.headers,
method: req.method,
body: req.body
});
const headers = normalizeResponseHeaders({
...getCacheHeaders(url.pathname),
...r.headers
});
return new Response(r.body, {
status: r.status,
headers
});
};
export default handler;
const ONE_YEAR_IN_SECONDS = 365 * 24 * 60 * 60;
function normalizeResponseHeaders(headers) {
const outgoingHeaders = new Headers();
for (const [name, header] of Object.entries(headers)) {
if (name === "set-cookie") {
for (const cookie of normalizeCookieHeader(header)) {
outgoingHeaders.append("set-cookie", cookie);
}
} else if (header !== void 0) {
outgoingHeaders.set(name, joinHeaders(header));
}
}
return outgoingHeaders;
}
function getCacheHeaders(url) {
const { isr } = getRouteRulesForPath(url);
if (isr) {
const maxAge = typeof isr === "number" ? isr : ONE_YEAR_IN_SECONDS;
const revalidateDirective = typeof isr === "number" ? `stale-while-revalidate=${ONE_YEAR_IN_SECONDS}` : "must-revalidate";
return {
"Cache-Control": "public, max-age=0, must-revalidate",
"Netlify-CDN-Cache-Control": `public, max-age=${maxAge}, ${revalidateDirective}, durable`
};
}
return {};
}