import { exitProcess } from "./utils/Process"; import { ExitCodes } from "./config/Errors"; // import { setTimeout } from "timers/promises"; import { log } from "./utils/Function"; import { createPool, PoolOptions } from "mysql2"; import { MYSQL_DATABASE, MYSQL_HOST, MYSQL_PASSWORD, MYSQL_USER, } from "./config/CheckableEnv"; /** * The MySQL database connection instance. * @type {mysql.Pool} */ const poolOptions: PoolOptions = { host: MYSQL_HOST, user: MYSQL_USER, password: MYSQL_PASSWORD, database: MYSQL_DATABASE, waitForConnections: true, connectionLimit: 10, queueLimit: 0, }; export const db = createPool(poolOptions).promise(); db.getConnection() .then((connection) => { log(`🗄️ ==> '${connection.config.database}' DB is Connected.`); connection.release(); // Release the connection }) .catch((err) => { exitProcess(ExitCodes.ERROR_DATABASE_CONNECTION, { error: err.message, }); }); /** * System class for managing application startup and error handling. */ export default class System { /** * ProcessError method for exiting the application after a specified time. * @param {number} second - The time in seconds after which the process will be terminated. */ static async ProcessError(second: number) { // Timeout exit // setTimeout(second * 1000).then(() => { // exitProcess(ExitCodes.ERROR_GENERIC, { // error: 'Manual termination after timeout', // }); // }); const delay = (ms: number): Promise => new Promise(resolve => setTimeout(resolve, ms)); try { await delay(second * 1000); exitProcess(ExitCodes.ERROR_GENERIC, { error: 'Manual termination after timeout', }); } catch (error) { console.error('An error occurred:', error); } } /** * Start method for initializing the application and dependencies. */ static async Start() { await db.getConnection(); } }