diff --git a/src/presets/cloudflare/runtime/_module-handler.ts b/src/presets/cloudflare/runtime/_module-handler.ts index 3f397265b0..d9d479318b 100644 --- a/src/presets/cloudflare/runtime/_module-handler.ts +++ b/src/presets/cloudflare/runtime/_module-handler.ts @@ -1,7 +1,6 @@ import "#nitro/virtual/polyfills"; import type * as CF from "@cloudflare/workers-types"; -import type { ExportedHandler } from "@cloudflare/workers-types"; -import type { ServerRequest } from "srvx"; +import type { ServerRequest, ServerRuntimeContext } from "srvx"; import { runCronTasks } from "#nitro/runtime/task"; import { useNitroApp, useNitroHooks } from "nitro/app"; @@ -22,6 +21,9 @@ export function createHandler(hooks: { return { async fetch(request, env, context) { + (globalThis as any).__env__ = env; + augmentReq(request as any, { env: env as any, context }); + const ctxExt = {}; const url = new URL(request.url); @@ -33,14 +35,7 @@ export function createHandler(hooks: { } } - return fetchHandler( - request, - env, - context, - url, - nitroApp, - ctxExt - ) as Promise; + return (await nitroApp.fetch(request)) as any; }, scheduled(controller, env, context) { @@ -71,8 +66,8 @@ export function createHandler(hooks: { (globalThis as any).__env__ = env; context.waitUntil( nitroHooks.callHook("cloudflare:email", { - message, - event: message, // backward compat + message: message as any, + event: message as any, // backward compat env, context, }) || Promise.resolve() @@ -115,22 +110,12 @@ export function createHandler(hooks: { } satisfies ExportedHandler; } -export async function fetchHandler( +export function augmentReq( cfReq: Request | CF.Request, - env: unknown, - context: CF.ExecutionContext | DurableObjectState, - url: URL = new URL(cfReq.url), - nitroApp = useNitroApp(), - ctxExt: any + ctx: NonNullable ) { - // Expose latest env to the global context - (globalThis as any).__env__ = env; - - // srvx compatibility const req = cfReq as ServerRequest; req.runtime ??= { name: "cloudflare" }; - req.runtime.cloudflare ??= { context, env } as any; - req.waitUntil = context.waitUntil.bind(context); - - return nitroApp.fetch(req) as unknown as Promise; + req.runtime.cloudflare = { ...req.runtime.cloudflare, ...ctx }; + req.waitUntil = ctx.context?.waitUntil.bind(ctx.context); } diff --git a/src/presets/cloudflare/runtime/cloudflare-durable.ts b/src/presets/cloudflare/runtime/cloudflare-durable.ts index d6f7ad1360..54b214b2ea 100644 --- a/src/presets/cloudflare/runtime/cloudflare-durable.ts +++ b/src/presets/cloudflare/runtime/cloudflare-durable.ts @@ -2,7 +2,7 @@ import "#nitro/virtual/polyfills"; import type * as CF from "@cloudflare/workers-types"; import { DurableObject } from "cloudflare:workers"; import wsAdapter from "crossws/adapters/cloudflare"; -import { createHandler, fetchHandler } from "./_module-handler.ts"; +import { createHandler, augmentReq } from "./_module-handler.ts"; import { useNitroApp, useNitroHooks } from "nitro/app"; import { isPublicAssetURL } from "#nitro/virtual/public-assets"; @@ -43,11 +43,12 @@ export default createHandler({ fetch(request, env, context, url, ctxExt) { // Static assets fallback (optional binding) if (env.ASSETS && isPublicAssetURL(url.pathname)) { - return env.ASSETS.fetch(request); + return env.ASSETS.fetch(request as any); } // Expose stub fetch to the context - ctxExt.durableFetch = (req = request) => getDurableStub(env).fetch(req); + ctxExt.durableFetch = (req = request) => + getDurableStub(env).fetch(req as any); // Websocket upgrade // https://crossws.unjs.io/adapters/cloudflare#durable-objects @@ -72,14 +73,16 @@ export class $DurableObject extends DurableObject { } override fetch(request: Request) { + augmentReq(request, { + env: this.env, + context: this.ctx as any, + }); + if (hasWebSocket && request.headers.get("upgrade") === "websocket") { return ws!.handleDurableUpgrade(this, request); } - // Main handler - const url = new URL(request.url); - return fetchHandler(request, this.env, this.ctx, url, nitroApp, { - durable: this, - }); + + return nitroApp.fetch(request); } override alarm(): void | Promise { diff --git a/src/presets/cloudflare/runtime/cloudflare-module.ts b/src/presets/cloudflare/runtime/cloudflare-module.ts index d966dd01f6..798cae3bec 100644 --- a/src/presets/cloudflare/runtime/cloudflare-module.ts +++ b/src/presets/cloudflare/runtime/cloudflare-module.ts @@ -16,16 +16,16 @@ interface Env { } export default createHandler({ - fetch(request, env, context, url) { + fetch(cfRequest, env, context, url) { // Static assets fallback (optional binding) if (env.ASSETS && isPublicAssetURL(url.pathname)) { - return env.ASSETS.fetch(request); + return env.ASSETS.fetch(cfRequest as any); } // Websocket upgrade // https://crossws.unjs.io/adapters/cloudflare - if (hasWebSocket && request.headers.get("upgrade") === "websocket") { - return ws!.handleUpgrade(request as any, env, context); + if (hasWebSocket && cfRequest.headers.get("upgrade") === "websocket") { + return ws!.handleUpgrade(cfRequest, env, context); } }, }); diff --git a/src/presets/cloudflare/runtime/cloudflare-pages.ts b/src/presets/cloudflare/runtime/cloudflare-pages.ts index e4889b3e30..d1c176a873 100644 --- a/src/presets/cloudflare/runtime/cloudflare-pages.ts +++ b/src/presets/cloudflare/runtime/cloudflare-pages.ts @@ -1,5 +1,4 @@ import "#nitro/virtual/polyfills"; -import type { ServerRequest } from "srvx"; import type { Request as CFRequest, EventContext, @@ -12,6 +11,7 @@ import { isPublicAssetURL } from "#nitro/virtual/public-assets"; import { runCronTasks } from "#nitro/runtime/task"; import { resolveWebsocketHooks } from "#nitro/runtime/app"; import { hasWebSocket } from "#nitro/virtual/feature-flags"; +import { augmentReq } from "./_module-handler.ts"; /** * Reference: https://developers.cloudflare.com/workers/runtime-apis/fetch-event/#parameters @@ -38,17 +38,16 @@ export default { env: CFPagesEnv, context: EventContext ) { - // srvx compatibility - const req = cfReq as unknown as ServerRequest; - req.runtime ??= { name: "cloudflare" }; - req.runtime.cloudflare ??= { context, env } as any; - req.waitUntil = context.waitUntil.bind(context); + augmentReq(cfReq, { + env, + context: context as any, + }); // Websocket upgrade // https://crossws.unjs.io/adapters/cloudflare if (hasWebSocket && cfReq.headers.get("upgrade") === "websocket") { return ws!.handleUpgrade( - cfReq as any, + cfReq, env, context as unknown as ExecutionContext ); @@ -59,10 +58,7 @@ export default { return env.ASSETS.fetch(cfReq); } - // Expose latest env to the global context - (globalThis as any).__env__ = env; - - return nitroApp.fetch(req); + return nitroApp.fetch(cfReq as any); }, scheduled(event: any, env: CFPagesEnv, context: ExecutionContext) { if (import.meta._tasks) {