@@ -131,6 +131,15 @@ export class TranscriberContainer extends Container {
131131 throw error ;
132132 }
133133 }
134+
135+ /**
136+ * Keep the container alive by renewing the activity timeout.
137+ * Call this periodically for long-lived WebSocket connections
138+ * where messages bypass the Container class's fetch method.
139+ */
140+ keepAlive ( ) {
141+ this . renewActivityTimeout ( ) ;
142+ }
134143}
135144
136145/**
@@ -243,6 +252,15 @@ async function handleWebSocketWithDispatcher(
243252 const queue = env . TRANSCRIPTION_QUEUE ;
244253 const dispatcher = env . TRANSCRIPTION_DISPATCHER ;
245254
255+ // Keep container alive by periodically renewing activity timeout
256+ // WebSocket messages bypass the Container class, so sleepAfter doesn't reset automatically
257+ const keepAliveInterval = setInterval ( ( ) => {
258+ container . keepAlive ( ) . catch ( ( error ) => {
259+ const msg = error instanceof Error ? error . message : String ( error ) ;
260+ console . error ( `Container keepAlive failed: ${ msg } ` ) ;
261+ } ) ;
262+ } , 10_000 ) ; // Every 10 seconds
263+
246264 // Pipe: client → container (upstream, no interception needed)
247265 serverWs . addEventListener ( 'message' , ( event ) => {
248266 if ( containerWs . readyState === WebSocket . READY_STATE_OPEN ) {
@@ -305,13 +323,15 @@ async function handleWebSocketWithDispatcher(
305323
306324 // Handle close events
307325 serverWs . addEventListener ( 'close' , ( event ) => {
326+ clearInterval ( keepAliveInterval ) ;
308327 console . log ( `Client WebSocket closed: code=${ event . code } , reason=${ event . reason || 'none' } ` ) ;
309328 if ( containerWs . readyState === WebSocket . READY_STATE_OPEN || containerWs . readyState === WebSocket . READY_STATE_CONNECTING ) {
310329 containerWs . close ( event . code , event . reason ) ;
311330 }
312331 } ) ;
313332
314333 containerWs . addEventListener ( 'close' , ( event ) => {
334+ clearInterval ( keepAliveInterval ) ;
315335 console . log ( `Container WebSocket closed: code=${ event . code } , reason=${ event . reason || 'none' } , sessionId=${ sessionId } ` ) ;
316336 if ( serverWs . readyState === WebSocket . READY_STATE_OPEN || serverWs . readyState === WebSocket . READY_STATE_CONNECTING ) {
317337 serverWs . close ( event . code , event . reason || 'Container connection closed' ) ;
@@ -320,6 +340,7 @@ async function handleWebSocketWithDispatcher(
320340
321341 // Handle errors - these fire when connection fails abnormally
322342 serverWs . addEventListener ( 'error' , ( event ) => {
343+ clearInterval ( keepAliveInterval ) ;
323344 console . error ( `Client WebSocket error, closing both connections, sessionId=${ sessionId } ` ) ;
324345 if ( containerWs . readyState === WebSocket . READY_STATE_OPEN || containerWs . readyState === WebSocket . READY_STATE_CONNECTING ) {
325346 containerWs . close ( 1011 , 'Client WebSocket error' ) ;
@@ -330,6 +351,7 @@ async function handleWebSocketWithDispatcher(
330351 } ) ;
331352
332353 containerWs . addEventListener ( 'error' , ( event ) => {
354+ clearInterval ( keepAliveInterval ) ;
333355 console . error ( `Container WebSocket error, closing client connection, sessionId=${ sessionId } ` ) ;
334356 if ( serverWs . readyState === WebSocket . READY_STATE_OPEN || serverWs . readyState === WebSocket . READY_STATE_CONNECTING ) {
335357 serverWs . close ( 1011 , 'Container connection error' ) ;
0 commit comments