43 lines
1.5 KiB
TypeScript
43 lines
1.5 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", () => {
|
||
|
|
identity.stop();
|
||
|
|
database
|
||
|
|
.close()
|
||
|
|
.catch(() => console.error(JSON.stringify({ event: "database_close_failed" })));
|
||
|
|
console.error(JSON.stringify({ event: "server_start_failed" }));
|
||
|
|
process.exitCode = 1;
|
||
|
|
});
|
||
|
|
const shutdown = () => {
|
||
|
|
identity.stop();
|
||
|
|
server.close(() => {
|
||
|
|
database.close().catch(() => {
|
||
|
|
console.error(JSON.stringify({ event: "database_close_failed" }));
|
||
|
|
process.exitCode = 1;
|
||
|
|
});
|
||
|
|
});
|
||
|
|
};
|
||
|
|
process.once("SIGINT", shutdown);
|
||
|
|
process.once("SIGTERM", shutdown);
|
||
|
|
} catch (error) {
|
||
|
|
await database.close();
|
||
|
|
throw error;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
start().catch(() => {
|
||
|
|
console.error(JSON.stringify({ event: "server_start_failed" }));
|
||
|
|
process.exitCode = 1;
|
||
|
|
});
|