@astrojs/cloudflare
Version:
Deploy your site to Cloudflare Workers/Pages
60 lines (59 loc) • 1.88 kB
JavaScript
import { env as globalEnv } from "cloudflare:workers";
import { setGetEnv } from "astro/env/setup";
import { createGetEnv } from "../utils/env.js";
setGetEnv(createGetEnv(globalEnv));
async function handle(manifest, app, request, env, context) {
const { pathname } = new URL(request.url);
const bindingName = globalThis.__ASTRO_SESSION_BINDING_NAME;
globalThis.__env__ ??= {};
globalThis.__env__[bindingName] = env[bindingName];
if (manifest.assets.has(pathname)) {
return env.ASSETS.fetch(request.url.replace(/\.html$/, ""));
}
const routeData = app.match(request);
if (!routeData) {
const asset = await env.ASSETS.fetch(
request.url.replace(/index.html$/, "").replace(/\.html$/, "")
);
if (asset.status !== 404) {
return asset;
}
}
Reflect.set(request, Symbol.for("astro.clientAddress"), request.headers.get("cf-connecting-ip"));
const locals = {
runtime: {
env,
cf: request.cf,
caches,
ctx: {
waitUntil: (promise) => context.waitUntil(promise),
// Currently not available: https://developers.cloudflare.com/pages/platform/known-issues/#pages-functions
passThroughOnException: () => {
throw new Error(
"`passThroughOnException` is currently not available in Cloudflare Pages. See https://developers.cloudflare.com/pages/platform/known-issues/#pages-functions."
);
},
props: {}
}
}
};
const response = await app.render(
request,
{
routeData,
locals,
prerenderedErrorPageFetch: async (url) => {
return env.ASSETS.fetch(url.replace(/\.html$/, ""));
}
}
);
if (app.setCookieHeaders) {
for (const setCookieHeader of app.setCookieHeaders(response)) {
response.headers.append("Set-Cookie", setCookieHeader);
}
}
return response;
}
export {
handle
};