import process from "node:process"; import { createApp } from "./app.js"; import { runtimeConfig } from "./config/runtime.js"; import { assertRuntimeConfigValid } from "./config/runtime-validation.js"; import { bootstrapCoreServices } from "./startup/bootstrap.js"; import { createShutdownController } from "./startup/shutdown.js"; import { createStartupState, formatStartupError } from "./startup/state.js"; import { logError, logInfo } from "./utils/logger.js"; const port = Number(runtimeConfig.server.port || 3000); const host = "0.0.0.0"; const startupState = createStartupState(); let shutdownController: ReturnType | null = null; try { assertRuntimeConfigValid(runtimeConfig); } catch (error) { logError("[startup]", "运行时配置校验失败,服务停止启动", error); process.exit(1); } const app = createApp({ startupState, isShutdownStarted: () => shutdownController?.isShutdownStarted() || false, config: runtimeConfig, }); const server = app.listen(port, host, () => { logInfo( "[startup]", `order-site-backend kuaishou-lite listening on http://${host}:${port}` ); void bootstrapCoreServices( startupState, () => shutdownController?.isShutdownStarted() || false ); }); shutdownController = createShutdownController(server, startupState); server.on("error", (error) => { logError("[startup]", "HTTP server failed", error); }); process.on("SIGINT", () => { void shutdownController?.shutdown("SIGINT"); }); process.on("SIGTERM", () => { void shutdownController?.shutdown("SIGTERM"); }); process.on("unhandledRejection", (reason) => { startupState.process.lastUnhandledRejection = { time: new Date().toISOString(), message: formatStartupError(reason), }; logError("[process]", "unhandled promise rejection", reason); }); process.on("uncaughtException", (error) => { startupState.process.lastUncaughtException = { time: new Date().toISOString(), message: formatStartupError(error), }; logError("[process]", "uncaught exception captured", error); });