@@ -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