Skip to content
This repository was archived by the owner on Oct 22, 2025. It is now read-only.

Commit 831f4d9

Browse files
committed
fix(core): fix disconnecting sse connections (#1201)
1 parent cf30278 commit 831f4d9

File tree

3 files changed

+18
-14
lines changed

3 files changed

+18
-14
lines changed

packages/core/src/actor/router-endpoints.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,16 +360,13 @@ export async function handleSseConnect(
360360
authData,
361361
);
362362

363-
// HACK: This is required so the abort handler below works
364-
//
365-
// See https://github.com/honojs/hono/issues/1770#issuecomment-2461966225
366-
stream.onAbort(() => {});
367-
368363
// Wait for close
369364
const abortResolver = Promise.withResolvers();
370-
c.req.raw.signal.addEventListener("abort", async () => {
365+
366+
// Handle stream abort (when client closes the connection)
367+
stream.onAbort(async () => {
371368
try {
372-
logger().debug("sse shutting down");
369+
logger().debug("sse stream aborted");
373370

374371
// Cleanup
375372
if (connId) {
@@ -384,6 +381,7 @@ export async function handleSseConnect(
384381
abortResolver.resolve(undefined);
385382
} catch (error) {
386383
logger().error("error closing sse connection", { error });
384+
abortResolver.resolve(undefined);
387385
}
388386
});
389387

packages/core/src/driver-test-suite/mod.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export function runDriverTests(
8888

8989
// TODO: Add back SSE once fixed in Rivet driver & CF lifecycle
9090
// for (const transport of ["websocket", "sse"] as Transport[]) {
91-
for (const transport of ["websocket"] as Transport[]) {
91+
for (const transport of ["websocket", "sse"] as Transport[]) {
9292
describe(`transport (${transport})`, () => {
9393
runActorConnTests({
9494
...driverTestConfig,

packages/core/src/driver-test-suite/tests/actor-conn.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,16 @@ export function runActorConnTests(driverTestConfig: DriverTestConfig) {
8484

8585
// Set up event listener
8686
const receivedEvents: number[] = [];
87-
connection.on("newCount", (count: number) => {
88-
receivedEvents.push(count);
87+
const receivedEventsPromise = new Promise((resolve) => {
88+
connection.on("newCount", (count: number) => {
89+
receivedEvents.push(count);
90+
if (
91+
receivedEvents.includes(1) &&
92+
receivedEvents.includes(6) &&
93+
receivedEvents.includes(9)
94+
)
95+
resolve(undefined);
96+
});
8997
});
9098

9199
// Send one RPC call over the connection to ensure it's open
@@ -96,10 +104,8 @@ export function runActorConnTests(driverTestConfig: DriverTestConfig) {
96104
await handle.increment(5);
97105
await handle.increment(3);
98106

99-
// Verify events were received from both connection and handle calls
100-
expect(receivedEvents).toContain(1); // From connection call
101-
expect(receivedEvents).toContain(6); // From first handle call (1+5)
102-
expect(receivedEvents).toContain(9); // From second handle call (6+3)
107+
// Wait for all events to be received
108+
await receivedEventsPromise;
103109

104110
// Clean up
105111
await connection.dispose();

0 commit comments

Comments
 (0)