import { createApp } from "./app"; import { createDatabase, readDatabaseEnvironment } from "./config/database"; import { readServerEnvironment } from "./config/env-schema"; import { createIdentityRuntime } from "./infrastructure/http/identity-runtime"; async function start(): Promise { const environment = readServerEnvironment(process.env); const databaseEnvironment = readDatabaseEnvironment(process.env); const database = createDatabase(databaseEnvironment); try { const identity = await createIdentityRuntime(database, databaseEnvironment); const server = createApp(undefined, identity).listen(environment.PORT, "127.0.0.1", () => { console.info(JSON.stringify({ event: "server_started", port: environment.PORT })); }); server.on("error", (error) => { identity.stop(); database .close() .catch(() => console.error(JSON.stringify({ event: "database_close_failed" }))); console.error(JSON.stringify({ event: "server_start_failed", message: error.message })); process.exitCode = 1; }); let stopping = false; const shutdown = () => { if (stopping) { return; } stopping = true; identity.stop(); server.close((error) => { if (error) { console.error(JSON.stringify({ event: "server_close_failed" })); process.exitCode = 1; } database.close().catch(() => { console.error(JSON.stringify({ event: "database_close_failed" })); process.exitCode = 1; }); }); }; process.once("SIGINT", shutdown); process.once("SIGTERM", shutdown); } catch (error) { // El fallo del cleanup no debe sustituir la causa original del arranque. await database.close().catch(() => { console.error(JSON.stringify({ event: "database_close_failed" })); }); throw error; } } start().catch((error: unknown) => { const message = error instanceof Error ? error.message : "Unknown startup failure"; console.error(JSON.stringify({ event: "server_start_failed", message })); process.exitCode = 1; });