UNPKG

@astrojs/cloudflare

Version:
60 lines (59 loc) 1.88 kB
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 };