diff options
Diffstat (limited to 'packages/integrations/cloudflare/src')
-rw-r--r-- | packages/integrations/cloudflare/src/runtime.ts | 28 | ||||
-rw-r--r-- | packages/integrations/cloudflare/src/server.advanced.ts | 4 | ||||
-rw-r--r-- | packages/integrations/cloudflare/src/server.directory.ts | 9 |
3 files changed, 38 insertions, 3 deletions
diff --git a/packages/integrations/cloudflare/src/runtime.ts b/packages/integrations/cloudflare/src/runtime.ts new file mode 100644 index 000000000..ddf372cb4 --- /dev/null +++ b/packages/integrations/cloudflare/src/runtime.ts @@ -0,0 +1,28 @@ +export type WorkerRuntime<T = unknown> = { + name: 'cloudflare'; + env: T; + waitUntil(promise: Promise<any>): void; + passThroughOnException(): void; +}; + +export type PagesRuntime<T = unknown, U = unknown> = { + name: 'cloudflare'; + env: T; + functionPath: string; + params: Record<string, string>; + data: U; + waitUntil(promise: Promise<any>): void; + next(request: Request): void; +}; + +export function getRuntime<T = unknown, U = unknown>( + request: Request +): WorkerRuntime<T> | PagesRuntime<T, U> { + if (!!request) { + return Reflect.get(request, Symbol.for('runtime')); + } else { + throw new Error( + 'To retrieve the current cloudflare runtime you need to pass in the Astro request object' + ); + } +} diff --git a/packages/integrations/cloudflare/src/server.advanced.ts b/packages/integrations/cloudflare/src/server.advanced.ts index c285ccaba..502700e0b 100644 --- a/packages/integrations/cloudflare/src/server.advanced.ts +++ b/packages/integrations/cloudflare/src/server.advanced.ts @@ -5,12 +5,13 @@ import { App } from 'astro/app'; type Env = { ASSETS: { fetch: (req: Request) => Promise<Response> }; + name: string; }; export function createExports(manifest: SSRManifest) { const app = new App(manifest, false); - const fetch = async (request: Request, env: Env) => { + const fetch = async (request: Request, env: Env, context: any) => { const { origin, pathname } = new URL(request.url); // static assets @@ -26,6 +27,7 @@ export function createExports(manifest: SSRManifest) { Symbol.for('astro.clientAddress'), request.headers.get('cf-connecting-ip') ); + Reflect.set(request, Symbol.for('runtime'), { env, name: 'cloudflare', ...context }); let response = await app.render(request, routeData); if (app.setCookieHeaders) { diff --git a/packages/integrations/cloudflare/src/server.directory.ts b/packages/integrations/cloudflare/src/server.directory.ts index e51d0ea57..d31e2189f 100644 --- a/packages/integrations/cloudflare/src/server.directory.ts +++ b/packages/integrations/cloudflare/src/server.directory.ts @@ -9,12 +9,12 @@ export function createExports(manifest: SSRManifest) { const onRequest = async ({ request, next, + ...runtimeEnv }: { request: Request; next: (request: Request) => void; - }) => { + } & Record<string, unknown>) => { const { origin, pathname } = new URL(request.url); - // static assets if (manifest.assets.has(pathname)) { const assetRequest = new Request(`${origin}/static${pathname}`, request); @@ -28,6 +28,11 @@ export function createExports(manifest: SSRManifest) { Symbol.for('astro.clientAddress'), request.headers.get('cf-connecting-ip') ); + Reflect.set(request, Symbol.for('runtime'), { + ...runtimeEnv, + name: 'cloudflare', + next, + }); let response = await app.render(request, routeData); if (app.setCookieHeaders) { |