From f5ecca4480b5b399833cdeade4c4abce1b74cf4d Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 13 Apr 2026 13:16:08 -0700 Subject: [PATCH] Clear tracked RPCs on reconnect (#2000) --- apps/web/src/rpc/wsTransport.test.ts | 50 ++++++++++++++++++++++++++++ apps/web/src/rpc/wsTransport.ts | 2 ++ 2 files changed, 52 insertions(+) diff --git a/apps/web/src/rpc/wsTransport.test.ts b/apps/web/src/rpc/wsTransport.test.ts index 12c3d4528b5bd9ea56f5d1c6128bdf4d872dc500..a5610a931f6a62b833d9ea92ccd501b5f60f5ba1 100644 --- a/apps/web/src/rpc/wsTransport.test.ts +++ b/apps/web/src/rpc/wsTransport.test.ts @@ -417,6 +417,56 @@ describe("WsTransport", () => { await transport.dispose(); }, 5_000); + it("clears slow unary request tracking when the transport reconnects", async () => { + const slowAckThresholdMs = 25; + setSlowRpcAckThresholdMsForTests(slowAckThresholdMs); + const transport = createTransport("ws://localhost:3020"); + + const requestPromise = transport.request((client) => + client[WS_METHODS.serverUpsertKeybinding]({ + command: "terminal.toggle", + key: "ctrl+k", + }), + ); + + await waitFor(() => { + expect(sockets).toHaveLength(1); + }); + + const firstSocket = getSocket(); + firstSocket.open(); + + await waitFor(() => { + expect(firstSocket.sent).toHaveLength(1); + }); + + const firstRequest = JSON.parse(firstSocket.sent[0] ?? "{}") as { id: string }; + + await waitFor(() => { + expect(getSlowRpcAckRequests()).toMatchObject([ + { + requestId: firstRequest.id, + tag: WS_METHODS.serverUpsertKeybinding, + }, + ]); + }, 1_000); + + void requestPromise.catch(() => undefined); + + await transport.reconnect(); + + expect(getSlowRpcAckRequests()).toEqual([]); + + await waitFor(() => { + expect(sockets).toHaveLength(2); + }); + + const secondSocket = getSocket(); + secondSocket.open(); + + await transport.dispose(); + }, 5_000); + it("sends unary RPC requests and resolves successful exits", async () => { const transport = createTransport("ws://localhost:3020"); diff --git a/apps/web/src/rpc/wsTransport.ts b/apps/web/src/rpc/wsTransport.ts index 8c86625dce4cff487505429ff52847d1cb825bdf..d9a50a9fad0340d243721aa5d21acec3b5bd7d41 100644 --- a/apps/web/src/rpc/wsTransport.ts +++ b/apps/web/src/rpc/wsTransport.ts @@ -12,6 +12,7 @@ import { import { RpcClient } from "effect/unstable/rpc"; import { ClientTracingLive } from "../observability/clientTracing"; +import { clearAllTrackedRpcRequests } from "./requestLatencyState"; import { createWsRpcProtocolLayer, makeWsRpcProtocolClient, @@ -189,6 +190,7 @@ export class WsTransport { throw new Error("Transport disposed"); } + clearAllTrackedRpcRequests(); const previousSession = this.session; this.session = this.createSession(); await this.closeSession(previousSession); -- 2.54.0