metis-desk/apps/server/src/index.ts
2026-10-10 12:01:58 +02:00

62 lines
2.1 KiB
TypeScript

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<void> {
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;
});