From da0149de979057b25bb04e5343d1b8a83cd91b02 Mon Sep 17 00:00:00 2001 From: decolua Date: Tue, 7 Jul 2026 11:44:20 +0700 Subject: [PATCH] fix(mitm): recover from stale lock file on server start Detect dead PID in lock file and reclaim it instead of failing, and drop unused fs dependency. Co-authored-by: Cursor --- package.json | 1 - src/mitm/manager.js | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a08b475d..9099c90a 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "bcryptjs": "^3.0.3", "confbox": "^0.2.4", "express": "^5.2.1", - "fs": "^0.0.1-security", "http-proxy-middleware": "^3.0.5", "jose": "^6.1.3", "marked": "^18.0.1", diff --git a/src/mitm/manager.js b/src/mitm/manager.js index b70fbdf0..a9d6e6a6 100644 --- a/src/mitm/manager.js +++ b/src/mitm/manager.js @@ -496,9 +496,15 @@ async function startServer(apiKey, sudoPassword, forceKillPort443 = false) { fs.writeFileSync(LOCK_FILE, String(process.pid), { flag: "wx" }); } catch (e) { if (e.code === "EEXIST") { - throw new Error("MITM server is already starting (lock contention)"); - } - throw e; + let stale = false; + try { + const pid = parseInt(fs.readFileSync(LOCK_FILE, "utf-8").trim(), 10); + stale = !pid || !isProcessAlive(pid); + } catch { stale = true; } // unreadable lock → treat as stale + if (!stale) throw new Error("MITM server is already starting (lock contention)"); + try { fs.unlinkSync(LOCK_FILE); } catch { /* ignore */ } + fs.writeFileSync(LOCK_FILE, String(process.pid), { flag: "wx" }); + } else throw e; } try {