const packageJSON = require('./package.json'); const path = require('path'); const Connection = require('./classes/Connection.js'); const Logger = require('./classes/Logger.js'); const Player = require('./classes/Player.js'); const INTERRUPTS = ['beforeExit', 'SIGINT', 'SIGTERM']; main(); async function main() { global.reconnects = 0; 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 + "..."); global.player = new Player(); global.connection = new Connection(); while (true) { try { await global.connection.initialize(); global.reconnects = 0; } catch (err) { const limit = global.config.reconnect?.limit; if (isNaN(limit) || (global.reconnects >= limit && limit > 0)) { return exit(err); } global.logger.error(err); const delay = global.config.reconnect?.delay || 1000; global.reconnects++; global.logger.warn('retry ' + global.reconnects + '/' + limit + " in " + delay + 'ms...'); await new Promise((resolve, reject) => { setTimeout(resolve, delay); }) } } }; function handleExit() { for (var index = 0; index < INTERRUPTS.length; index++) { process.on(INTERRUPTS[index], (code) => { exit(undefined, code); }); } } function exit(err, code) { if (code === undefined) { code = 0; if (err !== undefined) { code = 1; } } if (err) { global.logger.error(err); global.logger.error(packageJSON.name + ' ' + packageJSON.version + ' ended due to an error'); } else { global.logger.info(packageJSON.name + ' ' + packageJSON.version + ' shutting down gracefully') } process.exit(code); }