Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions rivetkit-typescript/packages/rivetkit/src/actor/router-endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,9 @@ export async function handleWebSocketConnect(
// Promise used to wait for the websocket close in `disconnect`
const closePromise = promiseWithResolvers<void>();

// Track connection outside of scope for cleanup
let createdConn: AnyConn | undefined;

return {
onOpen: (_evt: any, ws: WSContext) => {
actor.rLog.debug("actor websocket open");
Expand Down Expand Up @@ -198,6 +201,9 @@ export async function handleWebSocketConnect(
connToken,
);

// Store connection so we can clean on close
createdConn = conn;

// Unblock other handlers
handlersResolve({ conn, actor, connId: conn.id });
} catch (error) {
Expand Down Expand Up @@ -298,20 +304,13 @@ export async function handleWebSocketConnect(
// https://github.com/cloudflare/workerd/issues/2569
ws.close(1000, "hack_force_close");

// Handle cleanup asynchronously
handlersPromise
.then(({ conn, actor }) => {
// Wait for actor.createConn to finish before removing the connection
handlersPromise.finally(() => {
if (createdConn) {
const wasClean = event.wasClean || event.code === 1000;
actor.__connDisconnected(conn, wasClean, requestId);
})
.catch((error) => {
deconstructError(
error,
actor.rLog,
{ wsEvent: "close" },
exposeInternalError,
);
});
actor.__connDisconnected(createdConn, wasClean, requestId);
}
});
},
onError: (_error: unknown) => {
try {
Expand Down
Loading