From 8cb319fe3fd100b8bda2d980dda6e2573151b586 Mon Sep 17 00:00:00 2001 From: Bil0000 Date: Mon, 14 Sep 2026 15:56:28 -0700 Subject: [PATCH] fix(server): stop refreshing providers on every config subscription Each subscribeServerConfig connection forked a full provider refresh, so every reconnect and every extra tab re-probed all providers. Managed providers already run their own startup probe and periodic refresh, and the subscription stream seeds the current providers before live changes, so the extra refresh only added CPU load and repeated catalog updates. Split from #11456; the client timeout change stays there for discussion. Co-Authored-By: Claude Fable 5 --- apps/server/src/server.test.ts | 52 ++++++++++------------------------ apps/server/src/ws.ts | 4 --- 2 files changed, 15 insertions(+), 41 deletions(-) diff --git a/apps/server/src/server.test.ts b/apps/server/src/server.test.ts index 7402e908fcf8..0411a0826965 100644 --- a/apps/server/src/server.test.ts +++ b/apps/server/src/server.test.ts @@ -6327,48 +6327,26 @@ it.layer(NodeServices.layer)("server router seam", (it) => { }).pipe(Effect.provide(NodeHttpServer.layerTest)), ); - it.effect("refreshes providers for each subscribeServerConfig connection", () => + it.effect("serves config on reconnect without starting provider probes", () => Effect.gen(function* () { - const refreshCalls = yield* Ref.make(0); - const firstRefreshDone = yield* Deferred.make(); - const secondRefreshDone = yield* Deferred.make(); - + const refresh = vi.fn(() => Effect.never); yield* buildAppUnderTest({ - layers: { - providerRegistry: { - refresh: () => - Ref.updateAndGet(refreshCalls, (count) => count + 1).pipe( - Effect.tap((count) => - Deferred.succeed( - count === 1 ? firstRefreshDone : secondRefreshDone, - undefined, - ).pipe(Effect.ignore), - ), - Effect.as([]), - ), - }, - }, + layers: { providerRegistry: { refresh } }, }); const wsUrl = yield* getWsServerUrl("/ws"); - yield* Effect.scoped( - withWsRpcClient(wsUrl, (client) => - Effect.gen(function* () { - yield* client[WS_METHODS.subscribeServerConfig]({}).pipe(Stream.runHead); - yield* Deferred.await(firstRefreshDone); - }), - ), - ); - yield* Effect.scoped( - withWsRpcClient(wsUrl, (client) => - Effect.gen(function* () { - yield* client[WS_METHODS.subscribeServerConfig]({}).pipe(Stream.runHead); - yield* Deferred.await(secondRefreshDone); - }), - ), - ); - - assert.equal(yield* Ref.get(refreshCalls), 2); + for (let connection = 0; connection < 2; connection += 1) { + const event = yield* Effect.scoped( + withWsRpcClient(wsUrl, (client) => + client[WS_METHODS.subscribeServerConfig]({}).pipe( + Stream.runHead, + Effect.map(Option.getOrThrow), + ), + ), + ); + assert.equal(event.type, "snapshot"); + } + assert.equal(refresh.mock.calls.length, 0); }).pipe(Effect.provide(NodeHttpServer.layerTest)), ); diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index 6e5d9c02db39..cec94e358871 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -3371,10 +3371,6 @@ const makeWsRpcLayer = ( })), ); - yield* providerRegistry - .refresh() - .pipe(Effect.ignoreCause({ log: true }), Effect.forkScoped); - const liveUpdates = Stream.merge( keybindingsUpdates, Stream.merge(