From a414e65efe903adb520face76bb3fdedc3103ce3 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Wed, 18 Jun 2025 15:01:48 +0100 Subject: [PATCH] handle env vars that have been removed between executions --- .../cli-v3/src/entryPoints/dev-run-worker.ts | 5 +++++ .../src/entryPoints/managed-run-worker.ts | 5 +++++ packages/core/src/v3/workers/populateEnv.ts | 17 ++++++++++++++++- references/hello-world/src/trigger/example.ts | 5 +++++ references/hello-world/trigger.config.ts | 2 +- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/cli-v3/src/entryPoints/dev-run-worker.ts b/packages/cli-v3/src/entryPoints/dev-run-worker.ts index 165206c99..9820ea2a2 100644 --- a/packages/cli-v3/src/entryPoints/dev-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/dev-run-worker.ts @@ -252,6 +252,8 @@ let _cancelController = new AbortController(); let _lastFlushPromise: Promise | undefined; let _sharedWorkerRuntime: SharedRuntimeManager | undefined; +let _lastEnv: Record | undefined; + function resetExecutionEnvironment() { _execution = undefined; _isRunning = false; @@ -285,7 +287,10 @@ const zodIpc = new ZodIpcConnection({ if (env) { populateEnv(env, { override: true, + previousEnv: _lastEnv, }); + + _lastEnv = env; } log(`[${new Date().toISOString()}] Received EXECUTE_TASK_RUN`, execution); diff --git a/packages/cli-v3/src/entryPoints/managed-run-worker.ts b/packages/cli-v3/src/entryPoints/managed-run-worker.ts index a31e88887..a7450132b 100644 --- a/packages/cli-v3/src/entryPoints/managed-run-worker.ts +++ b/packages/cli-v3/src/entryPoints/managed-run-worker.ts @@ -266,6 +266,8 @@ function resetExecutionEnvironment() { console.log(`[${new Date().toISOString()}] Reset execution environment`); } +let _lastEnv: Record | undefined; + const zodIpc = new ZodIpcConnection({ listenSchema: WorkerToExecutorMessageCatalog, emitSchema: ExecutorToWorkerMessageCatalog, @@ -278,7 +280,10 @@ const zodIpc = new ZodIpcConnection({ if (env) { populateEnv(env, { override: true, + previousEnv: _lastEnv, }); + + _lastEnv = env; } console.log( diff --git a/packages/core/src/v3/workers/populateEnv.ts b/packages/core/src/v3/workers/populateEnv.ts index 68fafddf1..9645b9e9e 100644 --- a/packages/core/src/v3/workers/populateEnv.ts +++ b/packages/core/src/v3/workers/populateEnv.ts @@ -13,6 +13,12 @@ interface PopulateEnvOptions { * @default false */ debug?: boolean; + + /** + * The previous environment variables + * @default undefined + */ + previousEnv?: Record; } /** @@ -25,7 +31,7 @@ export function populateEnv( envObject: Record, options: PopulateEnvOptions = {} ): void { - const { override = false, debug = false } = options; + const { override = false, debug = false, previousEnv } = options; if (!envObject || typeof envObject !== "object") { return; @@ -47,4 +53,13 @@ export function populateEnv( process.env[key] = envObject[key]; } } + + if (previousEnv) { + // if there are any keys in previousEnv that are not in envObject, remove them from process.env + for (const key of Object.keys(previousEnv)) { + if (!envObject[key]) { + delete process.env[key]; + } + } + } } diff --git a/references/hello-world/src/trigger/example.ts b/references/hello-world/src/trigger/example.ts index 1a475d11d..b02c325c6 100644 --- a/references/hello-world/src/trigger/example.ts +++ b/references/hello-world/src/trigger/example.ts @@ -6,6 +6,9 @@ export const helloWorldTask = task({ id: "hello-world", run: async (payload: any, { ctx }) => { logger.info("Hello, world from the init", { ctx, payload }); + logger.info("env vars", { + env: process.env, + }); logger.debug("debug: Hello, world!", { payload }); logger.info("info: Hello, world!", { payload }); @@ -17,6 +20,8 @@ export const helloWorldTask = task({ logger.debug("some log", { span }); }); + await setTimeout(payload.sleepFor ?? 180_000); + logger.trace( "my trace", async (span) => { diff --git a/references/hello-world/trigger.config.ts b/references/hello-world/trigger.config.ts index f0d8e2947..33935a4a1 100644 --- a/references/hello-world/trigger.config.ts +++ b/references/hello-world/trigger.config.ts @@ -6,7 +6,7 @@ export default defineConfig({ project: "proj_rrkpdguyagvsoktglnod", experimental_processKeepAlive: { enabled: true, - maxExecutionsPerProcess: 3, + maxExecutionsPerProcess: 20, }, logLevel: "log", maxDuration: 3600,