From 08fa8910975dd745244ed0549c848bab3159ff87 Mon Sep 17 00:00:00 2001 From: Dorseuil Nicolas Date: Thu, 12 Sep 2024 11:43:31 +0200 Subject: [PATCH] fix issue with env in cloudflare --- .../open-next/src/build/edge/createEdgeBundle.ts | 13 +++++++++++-- packages/open-next/src/plugins/edge.ts | 8 -------- packages/open-next/src/types/open-next.ts | 1 + packages/open-next/src/wrappers/cloudflare.ts | 13 +++++++++++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/packages/open-next/src/build/edge/createEdgeBundle.ts b/packages/open-next/src/build/edge/createEdgeBundle.ts index e846f935..dfa5542c 100644 --- a/packages/open-next/src/build/edge/createEdgeBundle.ts +++ b/packages/open-next/src/build/edge/createEdgeBundle.ts @@ -42,6 +42,10 @@ export async function buildEdgeBundle({ additionalInject, includeCache, }: BuildEdgeBundleOptions) { + const isInCloudfare = + typeof overrides?.wrapper === "string" + ? overrides.wrapper === "cloudflare" + : (await overrides?.wrapper?.())?.edgeRuntime; await esbuildAsync( { entryPoints: [entrypoint], @@ -93,7 +97,7 @@ export async function buildEdgeBundle({ "../../core", "edgeFunctionHandler.js", ), - isInCloudfare: overrides?.wrapper === "cloudflare", + isInCloudfare, }), ], treeShaking: true, @@ -106,8 +110,13 @@ export async function buildEdgeBundle({ mainFields: ["module", "main"], banner: { js: ` +import {Buffer} from "node:buffer"; +globalThis.Buffer = Buffer; + +import {AsyncLocalStorage} from "node:async_hooks"; +globalThis.AsyncLocalStorage = AsyncLocalStorage; ${ - overrides?.wrapper === "cloudflare" + isInCloudfare ? "" : ` const require = (await import("node:module")).createRequire(import.meta.url); diff --git a/packages/open-next/src/plugins/edge.ts b/packages/open-next/src/plugins/edge.ts index 2422421c..98861a7f 100644 --- a/packages/open-next/src/plugins/edge.ts +++ b/packages/open-next/src/plugins/edge.ts @@ -92,16 +92,8 @@ export function openNextEdgePlugins({ contents = ` globalThis._ENTRIES = {}; globalThis.self = globalThis; -if(!globalThis.process){ - globalThis.process = {env: {}}; -} globalThis._ROUTES = ${JSON.stringify(routes)}; -import {Buffer} from "node:buffer"; -globalThis.Buffer = Buffer; - -import {AsyncLocalStorage} from "node:async_hooks"; -globalThis.AsyncLocalStorage = AsyncLocalStorage; ${ isInCloudfare ? `` diff --git a/packages/open-next/src/types/open-next.ts b/packages/open-next/src/types/open-next.ts index d0912027..804001b6 100644 --- a/packages/open-next/src/types/open-next.ts +++ b/packages/open-next/src/types/open-next.ts @@ -83,6 +83,7 @@ export type Wrapper< > = BaseOverride & { wrapper: WrapperHandler; supportStreaming: boolean; + edgeRuntime?: boolean; }; export type Warmer = BaseOverride & { diff --git a/packages/open-next/src/wrappers/cloudflare.ts b/packages/open-next/src/wrappers/cloudflare.ts index a9fcca44..bfeea939 100644 --- a/packages/open-next/src/wrappers/cloudflare.ts +++ b/packages/open-next/src/wrappers/cloudflare.ts @@ -12,8 +12,16 @@ const handler: WrapperHandler< > = async (handler, converter) => async (event: Request, env: Record): Promise => { - //@ts-expect-error - process is not defined in cloudflare workers - globalThis.process = { env }; + globalThis.process = process; + + // Set the environment variables + // Cloudlare suggests to not override the process.env object but instead apply the values to it + for (const [key, value] of Object.entries(env)) { + if (typeof value === "string") { + process.env[key] = value; + } + } + const internalEvent = await converter.convertFrom(event); const response = await handler(internalEvent); @@ -27,4 +35,5 @@ export default { wrapper: handler, name: "cloudflare", supportStreaming: true, + edgeRuntime: true, };