Skip to content

Commit 83c9d0e

Browse files
CopilotJavanPoirier
andcommitted
fix(sse): update readyState to CLOSED on owner disposal
Co-authored-by: JavanPoirier <42590458+JavanPoirier@users.noreply.github.com>
1 parent 2a4c74f commit 83c9d0e

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

packages/sse/src/sse.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ export const createSSE = <T = string>(
341341
onCleanup(() => {
342342
clearReconnectTimer();
343343
teardown();
344+
setReadyState(SSEReadyState.CLOSED);
344345
});
345346

346347
return { source, data, error, readyState, close: disconnect, reconnect: manualReconnect };

packages/sse/test/index.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,23 @@ describe("createSSE", () => {
286286
dispose();
287287
}),
288288
));
289+
290+
it("readyState is CLOSED after owner disposal", () =>
291+
createRoot(dispose => {
292+
const { readyState } = createSSE("https://example.com/events");
293+
vi.advanceTimersByTime(20);
294+
expect(readyState()).toBe(SSEReadyState.OPEN);
295+
dispose();
296+
expect(readyState()).toBe(SSEReadyState.CLOSED);
297+
}));
298+
299+
it("readyState updates to CONNECTING when server drops connection", () =>
300+
createRoot(dispose => {
301+
const { readyState, source } = createSSE("https://example.com/events");
302+
vi.advanceTimersByTime(20);
303+
expect(readyState()).toBe(SSEReadyState.OPEN);
304+
(source() as unknown as MockEventSource).simulateTransientError();
305+
expect(readyState()).toBe(SSEReadyState.CONNECTING);
306+
dispose();
307+
}));
289308
});

0 commit comments

Comments
 (0)