/** * @file Triggers the one self-restart path this dashboard has: after * `POST /api/updates/apply` fast-forwards and rebuilds the checkout, the * running process needs to relaunch itself on the new code. Reuses the * existing SIGTERM graceful-shutdown path in `server/index.js` (closes * websockets, drains the HTTP server, closes the DB) instead of duplicating * it, and hands the "wait for the old PID to actually die, then spawn the * replacement" job to a detached helper script — the dying process can't do * that itself without racing its own replacement for the port. * @author Nguyễn Ngọc Trí Vĩ */ const path = require("path"); const { spawn } = require("child_process"); /** * @param {string} [root] repo root the helper should run from. */ function scheduleRestart(root = path.join(__dirname, "..", "..")) { const helperPath = path.join(root, "scripts", "restart-helper.js"); const entry = process.argv[1] || path.join(root, "server", "index.js"); const helper = spawn(process.execPath, [helperPath, String(process.pid), entry], { cwd: root, detached: true, stdio: "ignore", env: process.env, }); helper.unref(); process.kill(process.pid, "SIGTERM"); } module.exports = { scheduleRestart };