54 lines
1.6 KiB
JavaScript
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 {};
|
|
}
|