fix: graceful ctrl+c shutdown and await session-end memory writes

This commit is contained in:
William Valentin
2026-02-18 11:30:47 -08:00
parent 55cde541ea
commit 21232748b9
6 changed files with 103 additions and 30 deletions
+34 -2
View File
@@ -540,8 +540,40 @@ export async function startServices(deps: {
});
// Signal handlers
const signalHandler = () => {
lifecycle.shutdown().then(() => process.exit(0));
let shutdownPromise: Promise<void> | null = null;
let forceExitArmed = false;
const forceExitTimeoutMs = 15_000;
const signalHandler = (signal: NodeJS.Signals) => {
if (shutdownPromise) {
if (forceExitArmed) {
console.warn(`Second ${signal} received; forcing exit now.`);
process.exit(130);
}
forceExitArmed = true;
console.warn(`Shutdown already in progress. Send ${signal} again to force exit.`);
return;
}
console.log(`Received ${signal}; shutting down gracefully...`);
shutdownPromise = lifecycle.shutdown();
const forceTimer = setTimeout(() => {
forceExitArmed = true;
console.error(`Graceful shutdown timed out after ${forceExitTimeoutMs / 1000}s; forcing exit.`);
process.exit(130);
}, forceExitTimeoutMs);
forceTimer.unref();
shutdownPromise
.then(() => {
clearTimeout(forceTimer);
process.exit(0);
})
.catch((error) => {
clearTimeout(forceTimer);
console.error('Graceful shutdown failed:', error);
process.exit(1);
});
};
process.on('SIGINT', signalHandler);