fix: clear tlon SSE connect timeout (#5926) (thanks @hclsys)

This commit is contained in:
Peter Steinberger
2026-02-01 15:39:37 -08:00
parent 261a05bfc7
commit 13c8b2ada5
3 changed files with 23 additions and 3 deletions

View File

@@ -25,6 +25,7 @@ Docs: https://docs.openclaw.ai
- Telegram: restore draft streaming partials. (#5543) Thanks @obviyus.
- Onboarding: friendlier Windows onboarding message. (#6242) Thanks @shanselman.
- TUI: prevent crash when searching with digits in the model selector.
- Tlon: clear SSE connection timeout on failed connect. (#5926) Thanks @hclsys.
- Agents: wire before_tool_call plugin hook into tool execution. (#6570) Thanks @ryancnelson.
- Browser: secure Chrome extension relay CDP sessions.
- Docker: use container port for gateway command instead of host port. (#5110) Thanks @mise42.

View File

@@ -37,4 +37,23 @@ describe("UrbitSSEClient", () => {
path: "/dm/~zod",
});
});
it("clears the connection timeout when fetch fails", async () => {
const timeoutId = 123 as unknown as NodeJS.Timeout;
const setTimeoutSpy = vi.spyOn(global, "setTimeout").mockReturnValue(timeoutId);
const clearTimeoutSpy = vi.spyOn(global, "clearTimeout");
mockFetch.mockRejectedValue(new Error("network down"));
const client = new UrbitSSEClient("https://example.com", "urbauth-~zod=123");
try {
await expect(client.openStream()).rejects.toThrow("network down");
expect(setTimeoutSpy).toHaveBeenCalled();
expect(clearTimeoutSpy).toHaveBeenCalledWith(timeoutId);
} finally {
setTimeoutSpy.mockRestore();
clearTimeoutSpy.mockRestore();
}
});
});

View File

@@ -179,11 +179,11 @@ export class UrbitSSEClient {
Cookie: this.cookie,
},
signal: controller.signal,
}).finally(() => {
// Clear timeout once connection established (headers received) or on failure.
clearTimeout(timeoutId);
});
// Clear timeout once connection established (headers received)
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`Stream connection failed: ${response.status}`);
}