aboutsummaryrefslogtreecommitdiff
path: root/packages/integrations/cloudflare/src/entrypoints/server.advanced.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/cloudflare/src/entrypoints/server.advanced.ts')
-rw-r--r--packages/integrations/cloudflare/src/entrypoints/server.advanced.ts50
1 files changed, 31 insertions, 19 deletions
diff --git a/packages/integrations/cloudflare/src/entrypoints/server.advanced.ts b/packages/integrations/cloudflare/src/entrypoints/server.advanced.ts
index f5c596a7d..d7f9e1f24 100644
--- a/packages/integrations/cloudflare/src/entrypoints/server.advanced.ts
+++ b/packages/integrations/cloudflare/src/entrypoints/server.advanced.ts
@@ -1,59 +1,71 @@
import type {
- Request as CFRequest,
- CacheStorage,
+ CacheStorage as CLOUDFLARE_CACHESTORAGE,
+ Request as CLOUDFLARE_REQUEST,
ExecutionContext,
} from '@cloudflare/workers-types';
import type { SSRManifest } from 'astro';
import { App } from 'astro/app';
-import { getProcessEnvProxy, isNode } from '../util.js';
-
-if (!isNode) {
- process.env = getProcessEnvProxy();
-}
type Env = {
- ASSETS: { fetch: (req: Request) => Promise<Response> };
+ ASSETS: { fetch: (req: Request | string) => Promise<Response> };
+ ASTRO_STUDIO_APP_TOKEN?: string;
};
-export interface AdvancedRuntime<T extends object = object> {
+export interface Runtime<T extends object = object> {
runtime: {
waitUntil: (promise: Promise<any>) => void;
env: Env & T;
- cf: CFRequest['cf'];
- caches: CacheStorage;
+ cf: CLOUDFLARE_REQUEST['cf'];
+ caches: CLOUDFLARE_CACHESTORAGE;
};
}
export function createExports(manifest: SSRManifest) {
const app = new App(manifest);
- const fetch = async (request: Request & CFRequest, env: Env, context: ExecutionContext) => {
- // 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 fetch = async (
+ request: Request & CLOUDFLARE_REQUEST,
+ env: Env,
+ context: ExecutionContext
+ ) => {
const { pathname } = new URL(request.url);
// static assets fallback, in case default _routes.json is not used
if (manifest.assets.has(pathname)) {
- return env.ASSETS.fetch(request);
+ return env.ASSETS.fetch(request.url.replace(/\.html$/, ''));
}
const routeData = app.match(request);
+ if (!routeData) {
+ // https://developers.cloudflare.com/pages/functions/api-reference/#envassetsfetch
+ 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: AdvancedRuntime = {
+ process.env.ASTRO_STUDIO_APP_TOKEN ??= (() => {
+ if (typeof env.ASTRO_STUDIO_APP_TOKEN === 'string') {
+ return env.ASTRO_STUDIO_APP_TOKEN;
+ }
+ })();
+
+ const locals: Runtime = {
runtime: {
waitUntil: (promise: Promise<any>) => {
context.waitUntil(promise);
},
env: env,
cf: request.cf,
- caches: caches as unknown as CacheStorage,
+ caches: caches as unknown as CLOUDFLARE_CACHESTORAGE,
},
};