import dotenv from 'dotenv'; import { Logger, LogLevel } from '../../common/util/logger.class'; import { ControllerPool } from './ctrl/controller-pool.interface'; import { Database } from './ctrl/database.class'; import { HttpCheckController } from './ctrl/http-check-controller.class'; import { ServerConnector } from './ctrl/server-connector.class'; import { Webserver } from './webserver.class'; import { Timer } from './timer.class'; dotenv.config(); const LOG_LEVEL: LogLevel = (process.env.LOG_LEVEL as LogLevel) || 'INFO'; Logger.logLevel = LOG_LEVEL; process.on('SIGABRT', exitGracefully); process.on('SIGQUIT', exitGracefully); process.on('SIGTERM', exitGracefully); let pool: ControllerPool; (async () => { const db = new Database(); await db.open(true); pool = { db, serverConnector: new ServerConnector(), httpChecks: new HttpCheckController() }; Timer.instance.start(); new Webserver(Number(process.env.WEB_PORT ?? '80'), pool); })(); async function exitGracefully(...args: any[]) { Logger.info(`[EXITING] Graceful exit, received ${JSON.stringify(args)}`); if (pool) { try { Logger.info(`[EXITING] Tear down ServerConnector ...`); await pool.serverConnector.close(); Logger.info(`[EXITING] Tear down HttpCheckController ...`); await pool.httpChecks.close(); Logger.info(`[EXITING] Tear down Main Database Controller ...`); await pool.serverConnector.close(); } catch (err) { Logger.error(`[ERROR] Tear down sequence failed:`, err); process.exit(2); } } process.exit(0); }