diff options
Diffstat (limited to 'packages/integrations/cloudflare/src/server.directory.ts')
-rw-r--r-- | packages/integrations/cloudflare/src/server.directory.ts | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/packages/integrations/cloudflare/src/server.directory.ts b/packages/integrations/cloudflare/src/server.directory.ts index 3e9531a56..d4e4094de 100644 --- a/packages/integrations/cloudflare/src/server.directory.ts +++ b/packages/integrations/cloudflare/src/server.directory.ts @@ -7,28 +7,30 @@ if (!isNode) { process.env = getProcessEnvProxy(); } +interface FunctionRuntime { + runtime: { + waitUntil: (promise: Promise<any>) => void; + env: EventContext<unknown, string, unknown>['env']; + cf: CFRequest['cf']; + caches: typeof caches; + }; +} + export function createExports(manifest: SSRManifest) { const app = new App(manifest); - const onRequest = async ({ - request, - next, - ...runtimeEnv - }: { - request: Request & CFRequest; - next: (request: Request) => void; - waitUntil: EventContext<unknown, any, unknown>['waitUntil']; - } & Record<string, unknown>) => { - process.env = runtimeEnv.env as any; + const onRequest = async (context: EventContext<unknown, string, unknown>) => { + const request = context.request as CFRequest & Request; + const { next, env } = context; + + // TODO: remove this any cast in the future + // REF: the type cast to any is needed because the Cloudflare Env Type is not assignable to type 'ProcessEnv' + process.env = env as any; const { pathname } = new URL(request.url); // static assets fallback, in case default _routes.json is not used if (manifest.assets.has(pathname)) { - // we need this so the page does not error - // https://developers.cloudflare.com/pages/platform/functions/advanced-mode/#set-up-a-function - return (runtimeEnv.env as EventContext<unknown, string, unknown>['env']).ASSETS.fetch( - request - ); + return env.ASSETS.fetch(request); } let routeData = app.match(request, { matchNotFound: true }); @@ -38,17 +40,32 @@ export function createExports(manifest: SSRManifest) { Symbol.for('astro.clientAddress'), request.headers.get('cf-connecting-ip') ); + + // `getRuntime()` is deprecated, currently available additionally to new Astro.locals.runtime + // TODO: remove `getRuntime()` in Astro 3.0 Reflect.set(request, Symbol.for('runtime'), { - ...runtimeEnv, + ...context, waitUntil: (promise: Promise<any>) => { - runtimeEnv.waitUntil(promise); + context.waitUntil(promise); }, name: 'cloudflare', next, caches, cf: request.cf, }); - let response = await app.render(request, routeData); + + const locals: FunctionRuntime = { + runtime: { + waitUntil: (promise: Promise<any>) => { + context.waitUntil(promise); + }, + env: context.env, + cf: request.cf, + caches: caches, + }, + }; + + let response = await app.render(request, routeData, locals); if (app.setCookieHeaders) { for (const setCookieHeader of app.setCookieHeaders(response)) { |