// Generated by CoffeeScript 1.6.3 /* Server ============ >This is the main module that is used to run the whole server: > > node server [opt] > > See below in the optimist CLI preparation for allowed optional parameters */ (function() { var argv, conf, cp, db, engine, fs, http_listener, init, logger, opt, optimist, path, procCmds, shutDown, usage; logger = require('./new_logging'); conf = require('./config'); db = require('./persistence'); engine = require('./engine'); http_listener = require('./http_listener'); fs = require('fs'); path = require('path'); cp = require('child_process'); optimist = require('optimist'); procCmds = {}; /* Let's prepare the optimist CLI */ usage = 'This runs your webapi-based ECA engine'; opt = { 'h': { alias: 'help', describe: 'Display this' }, 'c': { alias: 'config-path', describe: 'Specify a path to a custom configuration file, other than "config/config.json"' }, 'w': { alias: 'http-port', describe: 'Specify a HTTP port for the web server' }, 'd': { alias: 'db-port', describe: 'Specify a port for the redis DB' }, 'm': { alias: 'log-mode', describe: 'Specify a log mode: [development|productive]' }, 'i': { alias: 'log-io-level', describe: 'Specify the log level for the I/O' }, 'f': { alias: 'log-file-level', describe: 'Specify the log level for the log file' }, 'p': { alias: 'log-file-path', describe: 'Specify the path to the log file within the "logs" folder' }, 'n': { alias: 'nolog', describe: 'Set this if no output shall be generated' } }; argv = optimist.usage(usage).options(opt).argv; if (argv.help) { console.log(optimist.help()); process.exit(); } /* Error handling of the express port listener requires special attention, thus we have to catch the process error, which is issued if the port is already in use. */ process.on('uncaughtException', function(err) { switch (err.errno) { case 'EADDRINUSE': err.addInfo = 'http-port already in use, shutting down!'; log.error('RS', err); return shutDown(); default: throw err; } }); /* This function is invoked right after the module is loaded and starts the server. @private init() */ init = function() { var args, log, logconf; conf(argv.c); if (!conf.isReady()) { console.error('FAIL: Config file not ready! Shutting down...'); process.exit(); } logconf = conf.getLogConf(); if (argv.m) { logconf['mode'] = argv.m; } if (argv.i) { logconf['io-level'] = argv.i; } if (argv.f) { logconf['file-level'] = argv.f; } if (argv.p) { logconf['file-path'] = argv.p; } if (argv.n) { logconf['nolog'] = argv.n; } try { fs.unlinkSync(path.resolve(__dirname, '..', 'logs', logconf['file-path'])); } catch (_error) {} log = logger(logconf); log.info('RS | STARTING SERVER'); args = { logger: log, logconf: logconf }; args['http-port'] = parseInt(argv.w || conf.getHttpPort()); log.info('RS | Initialzing DB'); db(args); return db.isConnected(function(err, result) { var cliArgs, poller; if (!err) { log.info('RS | Initialzing engine'); engine(args); log.info('RS | Initialzing http listener'); http_listener(args); log.info('RS | Passing handlers to engine'); engine.addPersistence(db); log.info('RS | Passing handlers to http listener'); http_listener.addShutdownHandler(shutDown); log.info('RS | For e child process for the event poller'); cliArgs = [args.logconf['mode'], args.logconf['io-level'], args.logconf['file-level'], args.logconf['file-path'], args.logconf['nolog']]; return poller = cp.fork(path.resolve(__dirname, 'event_poller'), cliArgs); } }); }; /* Shuts down the server. @private shutDown() */ shutDown = function() { log.warn('RS | Received shut down command!'); if (engine != null) { engine.shutDown(); } return http_listener != null ? http_listener.shutDown() : void 0; }; /* ## Process Commands When the server is run as a child process, this function handles messages from the parent process (e.g. the testing suite) */ process.on('message', function(cmd) { return typeof procCmds[cmd] === "function" ? procCmds[cmd]() : void 0; }); procCmds.die = shutDown; init(); }).call(this);