Skip to content

Commit cde5aa5

Browse files
committed
fix(rivetkit): fix conns not being cleaned up if actor.createConn errors
1 parent b5e9f49 commit cde5aa5

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

rivetkit-typescript/packages/rivetkit/src/actor/router-endpoints.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ export async function handleWebSocketConnect(
163163
// Promise used to wait for the websocket close in `disconnect`
164164
const closePromise = promiseWithResolvers<void>();
165165

166+
// Track connection outside of scope for cleanup
167+
let createdConn: AnyConn | undefined;
168+
166169
return {
167170
onOpen: (_evt: any, ws: WSContext) => {
168171
actor.rLog.debug("actor websocket open");
@@ -198,6 +201,9 @@ export async function handleWebSocketConnect(
198201
connToken,
199202
);
200203

204+
// Store connection so we can clean on close
205+
createdConn = conn;
206+
201207
// Unblock other handlers
202208
handlersResolve({ conn, actor, connId: conn.id });
203209
} catch (error) {
@@ -298,20 +304,13 @@ export async function handleWebSocketConnect(
298304
// https://github.com/cloudflare/workerd/issues/2569
299305
ws.close(1000, "hack_force_close");
300306

301-
// Handle cleanup asynchronously
302-
handlersPromise
303-
.then(({ conn, actor }) => {
307+
// Wait for actor.createConn to finish before removing the connection
308+
handlersPromise.finally(() => {
309+
if (createdConn) {
304310
const wasClean = event.wasClean || event.code === 1000;
305-
actor.__connDisconnected(conn, wasClean, requestId);
306-
})
307-
.catch((error) => {
308-
deconstructError(
309-
error,
310-
actor.rLog,
311-
{ wsEvent: "close" },
312-
exposeInternalError,
313-
);
314-
});
311+
actor.__connDisconnected(createdConn, wasClean, requestId);
312+
}
313+
});
315314
},
316315
onError: (_error: unknown) => {
317316
try {

0 commit comments

Comments
 (0)