From 442797a8aa788be624493a62a107be0d6584297a Mon Sep 17 00:00:00 2001 From: utopy <30875147+utopyin@users.noreply.github.com> Date: Sun, 12 Jul 2026 17:52:03 +0200 Subject: [PATCH] fix(Cloudflare/LocalWorkerProvider): preserve worker registration on reload --- .../src/Cloudflare/Workers/LocalWorkerProvider.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/alchemy/src/Cloudflare/Workers/LocalWorkerProvider.ts b/packages/alchemy/src/Cloudflare/Workers/LocalWorkerProvider.ts index 09a68a858a..72c577e7eb 100644 --- a/packages/alchemy/src/Cloudflare/Workers/LocalWorkerProvider.ts +++ b/packages/alchemy/src/Cloudflare/Workers/LocalWorkerProvider.ts @@ -204,6 +204,13 @@ export const LocalWorkerProvider = () => bundle: Bundle.BundleOutput, proxy: WorkerProxy.WorkerProxyInstance, ) { + const previous = workerdScopes.get(worker.id); + if (previous) { + // Both runtimes use the same registry key. Close the old scope first so + // its unregister finalizer cannot delete the replacement registration. + yield* Scope.close(previous, Exit.void); + workerdScopes.delete(worker.id); + } const scope = yield* Effect.scope.pipe(Effect.flatMap(Scope.fork)); const url = yield* runtime .start({ @@ -218,10 +225,6 @@ export const LocalWorkerProvider = () => assets: toRuntimeAssets(worker.assets), }) .pipe(Scope.provide(scope)); - const previous = workerdScopes.get(worker.id); - if (previous) { - yield* Effect.forkDetach(Scope.close(previous, Exit.void)); - } workerdScopes.set(worker.id, scope); yield* proxy.set(url); return url;