import fs from 'fs'; import fsp from 'fs/promises'; import path from 'path'; import moment from 'moment'; import { Pool } from 'mysql'; import { Logger, LogLevel } from '../../common/util/logger.class'; import { ControllerPool } from './ctrl/controller-pool.interface'; import { HttpCheckController } from './ctrl/http-check-controller.class'; import { MariaDBDatabase } from './ctrl/mariadb-database.class'; import { MariaDBImporter } from './ctrl/mariadb-importer.class'; import { MariaDBPoolFactory } from './ctrl/mariadb-poolfactory.class'; import { ServerConnector } from './ctrl/server-connector.class'; import { Webserver } from './webserver.class'; import { Timer } from './timer.class'; 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; let db: MariaDBDatabase; let mig: MariaDBImporter; let connectionPool: Pool; (async () => { connectionPool = await MariaDBPoolFactory.createConnectionPool(); const sqliteDir = path.resolve(process.cwd(), process.env.DATA_DIR || 'data'); const doneFile = path.resolve(sqliteDir, 'import_done.txt'); if (fs.existsSync(sqliteDir) && !fs.existsSync(doneFile)) { mig = new MariaDBImporter(connectionPool); await mig.connect(); await mig.runImport(); await fsp.writeFile(doneFile, moment().format('YYYY-MM-DD[T]HH:mm:ss.SSSZZ'), { encoding: 'utf-8' }); } db = new MariaDBDatabase(connectionPool); await db.open(); pool = { connectionPool, serverConnector: new ServerConnector(connectionPool), httpChecks: new HttpCheckController(connectionPool) }; 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)}`); try { if (mig) { Logger.info(`[EXITING] Tear down MariaDBImporter instance ...`); await mig.close(); } Logger.info(`[EXITING] Tear down Main Database Controller ...`); if (db) await db.close(); Logger.info(`[EXITING] Tear down MariaDB Connection Pool ...`); if (connectionPool) await MariaDBPoolFactory.end(connectionPool); } catch (err) { Logger.error(`[ERROR] Tear down sequence failed:`, err); process.exit(2); } Logger.info(`[EXITING] Tear down sequence succeeded. exiting.`); process.exit(0); }