@paroicms/server
Version:
The ParoiCMS server
69 lines • 2.52 kB
JavaScript
let shuttingDown = false;
export function isShuttingDown() {
return shuttingDown;
}
export function handleShutdownEvents({ logger, closingTasks }) {
let shuttingDownTimeMs;
async function stopAllAndExit({ signalCode, error, }) {
if (shuttingDownTimeMs !== undefined) {
if (error || Date.now() - shuttingDownTimeMs > 1000) {
console.warn(signalCode
? `Caught ${signalCode} signal. Already shutting down. Exit anyway.`
: "Already shutting down. Exit anyway.");
process.exit(1);
}
logger.debug(signalCode
? `Caught ${signalCode} signal, but already shutting down. Skip.`
: "Already shutting down. Skip.");
return;
}
if (signalCode) {
logger.info(`Caught ${signalCode} signal.`);
}
shuttingDownTimeMs = Date.now();
shuttingDown = true;
const timeoutId = setTimeout(() => {
console.warn("Backend doesn't answer. Exit anyway.");
logger.warn("Backend doesn't answer. Exit anyway.");
logger.flushSync();
process.exit(1);
}, error === undefined ? 30_000 : 5000);
await Promise.all((closingTasks ?? []).map(async (task) => {
try {
await task();
}
catch (err) {
logger.error("Error during shutdown:", err);
}
}));
clearTimeout(timeoutId);
if (error) {
logger.info("… server ended with error.");
logger.flushSync();
process.exit(1);
}
logger.info("… server ended.");
logger.flushSync();
}
process.on("uncaughtException", (error) => {
console.error("Uncaught exception:", error);
logger.error("Uncaught exception:", error);
void stopAllAndExit({ error });
});
process.on("unhandledRejection", (error) => {
console.error("Unhandled rejection:", error);
logger.error("Unhandled rejection:", error);
void stopAllAndExit({ error });
});
process.on("SIGINT", () => {
void stopAllAndExit({ signalCode: "SIGINT" });
});
process.on("SIGTERM", () => {
void stopAllAndExit({ signalCode: "SIGTERM" });
});
process.on("SIGSEGV", () => {
console.error("Caught SIGSEGV signal. Exit immediately.");
process.exit(1);
});
}
//# sourceMappingURL=shutdown.js.map