UNPKG

@paroicms/server

Version:
69 lines 2.52 kB
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