fix: release session locks on process termination

Adds cleanup handlers to release held file locks when the process
terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned
lock files that would block future sessions.

Fixes #1951
This commit is contained in:
Sash Zats 2026-01-25 21:35:26 +00:00
parent e0adf65dac
commit 35fc2a1120

View File

@ -14,6 +14,32 @@ type HeldLock = {
const HELD_LOCKS = new Map<string, HeldLock>();
/**
* Release all held locks - called on process exit to prevent orphaned locks
*/
async function releaseAllLocks(): Promise<void> {
const locks = Array.from(HELD_LOCKS.values());
HELD_LOCKS.clear();
for (const lock of locks) {
try {
await lock.handle.close();
await fs.rm(lock.lockPath, { force: true });
} catch {
// Best effort cleanup
}
}
}
// Register cleanup handlers to release locks on unexpected termination
process.on("exit", releaseAllLocks);
process.on("SIGTERM", () => {
void releaseAllLocks().then(() => process.exit(0));
});
process.on("SIGINT", () => {
void releaseAllLocks().then(() => process.exit(0));
});
// Note: unhandledRejection handler will call process.exit() which triggers 'exit'
function isAlive(pid: number): boolean {
if (!Number.isFinite(pid) || pid <= 0) return false;
try {