summaryrefslogtreecommitdiff
path: root/packages/integrations/cloudflare/src/server.directory.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/cloudflare/src/server.directory.ts')
-rw-r--r--packages/integrations/cloudflare/src/server.directory.ts53
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)) {