fix(scripts): clear RPC RTT send failure timers

This commit is contained in:
Vincent Koc
2026-06-20 06:18:53 +02:00
parent 7d658dfd97
commit 118f3f3312
2 changed files with 33 additions and 8 deletions

View File

@@ -720,18 +720,19 @@ export function createGatewayClient({ WebSocket, openTimeoutMs = 8_000, url }) {
reject(new Error(`timeout waiting for ${method}`));
}, timeoutMs);
pending.set(id, { resolve, reject, timeout });
ws.send(JSON.stringify({ type: "req", id, method, params }), (error) => {
const rejectSendFailure = (error) => {
if (!error) {
return;
}
const waiter = pending.get(id);
if (!waiter) {
return;
}
pending.delete(id);
clearTimeout(waiter.timeout);
waiter.reject(error instanceof Error ? error : new Error(String(error)));
});
clearTimeout(timeout);
reject(error instanceof Error ? error : new Error(String(error)));
};
try {
ws.send(JSON.stringify({ type: "req", id, method, params }), rejectSendFailure);
} catch (error) {
rejectSendFailure(error);
}
});
const close = () => {
rejectPending(new Error("gateway websocket client closed"));

View File

@@ -102,6 +102,30 @@ describe("scripts/measure-rpc-rtt.mjs", () => {
expect(socket.closed).toBe(true);
});
it("clears pending websocket request timers when send throws synchronously", async () => {
vi.useFakeTimers();
FakeWebSocket.instances = [];
const client = createGatewayClient({
WebSocket: FakeWebSocket,
url: "ws://127.0.0.1:12345",
});
const socket = FakeWebSocket.instances[0];
if (!socket) {
throw new Error("fake websocket was not created");
}
socket.readyState = FakeWebSocket.OPEN;
socket.send = () => {
throw new Error("socket closed during send");
};
await expect(client.request("health", {}, 10_000)).rejects.toThrow(
"socket closed during send",
);
expect(vi.getTimerCount()).toBe(0);
client.close();
});
it("parses bounded RPC RTT options strictly", () => {
expect(
parseArgs([