Skip to content

Commit 66567e4

Browse files
authored
fix: add container keepalive (#51)
1 parent a1f43ca commit 66567e4

1 file changed

Lines changed: 22 additions & 0 deletions

File tree

worker/index.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)