const util = require('./libs/util.js'); const packageJSON = require('./package.json'); const path = require('path'); const Logger = require('./classes/Logger.js'); const Server = require('./classes/Server.js'); const Database = require('./classes/Database.js'); const Queue = require('./classes/Queue.js'); const Watcher = require('./classes/Watcher.js'); const EventParser = require('./classes/EventParser'); const ApiServer = require('./classes/ApiServer.js'); const INTERRUPTS = ['beforeExit', 'SIGINT', 'SIGTERM']; main(); async function main() { global.logger = new Logger(); let configPath = path.resolve(process.argv[2] || __dirname + '/config.json'); try { global.config = require(configPath); global.logger.setLogLevel(global.config?.log?.level); global.logger.setTimestamp(global.config?.log?.timestamp); } catch (err) { exit('could not read config file at \'' + configPath + '\''); } handleExit(); global.constants = require('./libs/constants.js'); global.logger.info("launching " + packageJSON.name + " " + packageJSON.version + "..."); try { // connect to the database and create/alter tables global.database = new Database(); await global.database.initialize(); // socket server if (util.isEnabled(global.config.server)) { global.eventparser = new EventParser(); global.server = new Server(); await global.server.start(); } // api server if (util.isEnabled(global.config.api)) { global.apiserver = new ApiServer(); global.apiserver.start(); } // queue and watcher if (util.isEnabled(global.config.library)) { global.queue = new Queue(); global.watcher = new Watcher(); } } catch (err) { exit(err); } }; function handleExit() { for (var index = 0; index < INTERRUPTS.length; index++) { process.on(INTERRUPTS[index], async (code) => { exit(undefined, code); }); } } function exit(err, code) { if (code === undefined) { code = 0; if (err !== undefined) { code = 1; } } if (err) { logger.error(err); logger.error(packageJSON.name + ' ' + packageJSON.version + ' ended due to an error'); } else { logger.info(packageJSON.name + ' ' + packageJSON.version + ' shutting down gracefully') } process.exit(code); }