import type { Server } from "node:http"; import { stopKuaishouIndustrySendCallbackRetryWorker } from "../services/platforms/kuaishou-industry/send-code-service.js"; import { stopScheduledJobs } from "../services/scheduler/scheduler-service.js"; import { logError, logInfo } from "../utils/logger.js"; import type { StartupState } from "./state.js"; export function createShutdownController( server: Server, startupState: StartupState ) { let shutdownStarted = false; async function shutdown(signal: string) { if (shutdownStarted) { return; } shutdownStarted = true; startupState.phase = "shutting_down"; logInfo("[shutdown]", `received ${signal}, closing HTTP server`); stopScheduledJobs(); stopKuaishouIndustrySendCallbackRetryWorker(); if (!server.listening) { return; } await new Promise((resolve) => { server.close((error) => { if (error) { logError("[shutdown]", "failed to close HTTP server", error); process.exitCode = 1; } resolve(); }); }); } return { isShutdownStarted: () => shutdownStarted, shutdown, }; }