UNPKG

metallic-launcher

Version:
108 lines (80 loc) 9.28 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _metallicErrors = require('metallic-errors'); var _role = require('../role'); var _role2 = _interopRequireDefault(_role); var _leaderInterface = require('./leader-interface'); var _leaderInterface2 = _interopRequireDefault(_leaderInterface); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class Leader extends _leaderInterface2.default { constructor({ cluster, serverPoolSize }) { super(); this.cluster = cluster; this.serverPoolSize = serverPoolSize; this.servers = []; } static is(clusterOn) { return _role2.default.isLeader(clusterOn); } get role() { return _role.LEADER; } async run() { const workers = []; for (let i = 0; i < this.serverPoolSize; i++) { const worker = this.cluster.fork(); workers.push(new Promise(resolve => { worker.on('message', httpServerInfo => { resolve(httpServerInfo); }); })); } const httpServersInfo = await Promise.all(workers); this.httpServersInfo = Object.assign({}, ...httpServersInfo); return this.httpServersInfo; } async close() { process.exit(0); } async exit(failure = 0) { process.exit(failure); } refork(server, code) { if (code > 0 && !server.exitedAfterDisconnect) { this.cluster.fork(); } } async reboot() { const serverKeys = Object.keys(this.cluster.workers); const reloads = serverKeys.map(serverKey => this.rebootServer(serverKey)); return Promise.all(reloads); } rebootServer(serverKey) { return new Promise((resolve, reject) => { const server = this.cluster.workers[serverKey]; server.disconnect(); server.once('exit', () => { if (!server.exitedAfterDisconnect) { return reject(new _metallicErrors.ExitError('Server')); } const newServer = this.cluster.fork(); newServer.once('listening', () => resolve()); newServer.once('error', err => reject(err)); }); }); } async rotateLog() { const serverKeys = Object.keys(this.cluster.workers); const rotates = serverKeys.map(serverKey => this.sendSignalToRotateLog(this.cluster.workers[serverKey])); return Promise.all(rotates); } sendSignalToRotateLog(server) { return new Promise((resolve, reject) => { server.send('logger:reopen-file-streams', err => err ? reject(err) : resolve()); }); } } exports.default = Leader; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbHVzdGVyL2xlYWRlci9sZWFkZXIuanMiXSwibmFtZXMiOlsiTGVhZGVyIiwiY29uc3RydWN0b3IiLCJjbHVzdGVyIiwic2VydmVyUG9vbFNpemUiLCJzZXJ2ZXJzIiwiaXMiLCJjbHVzdGVyT24iLCJpc0xlYWRlciIsInJvbGUiLCJydW4iLCJ3b3JrZXJzIiwiaSIsIndvcmtlciIsImZvcmsiLCJwdXNoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbiIsImh0dHBTZXJ2ZXJJbmZvIiwiaHR0cFNlcnZlcnNJbmZvIiwiYWxsIiwiT2JqZWN0IiwiYXNzaWduIiwiY2xvc2UiLCJwcm9jZXNzIiwiZXhpdCIsImZhaWx1cmUiLCJyZWZvcmsiLCJzZXJ2ZXIiLCJjb2RlIiwiZXhpdGVkQWZ0ZXJEaXNjb25uZWN0IiwicmVib290Iiwic2VydmVyS2V5cyIsImtleXMiLCJyZWxvYWRzIiwibWFwIiwic2VydmVyS2V5IiwicmVib290U2VydmVyIiwicmVqZWN0IiwiZGlzY29ubmVjdCIsIm9uY2UiLCJuZXdTZXJ2ZXIiLCJlcnIiLCJyb3RhdGVMb2ciLCJyb3RhdGVzIiwic2VuZFNpZ25hbFRvUm90YXRlTG9nIiwic2VuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRWUsTUFBTUEsTUFBTixtQ0FBcUM7QUFDbERDLGNBQWEsRUFBRUMsT0FBRixFQUFXQyxjQUFYLEVBQWIsRUFBMEM7QUFDeEM7QUFDQSxTQUFLRCxPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLQyxjQUFMLEdBQXNCQSxjQUF0QjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0Q7O0FBRUQsU0FBT0MsRUFBUCxDQUFXQyxTQUFYLEVBQXNCO0FBQ3BCLFdBQU8sZUFBS0MsUUFBTCxDQUFjRCxTQUFkLENBQVA7QUFDRDs7QUFFRCxNQUFJRSxJQUFKLEdBQVk7QUFDVjtBQUNEOztBQUVELFFBQU1DLEdBQU4sR0FBYTtBQUNYLFVBQU1DLFVB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXhpdEVycm9yIH0gZnJvbSAnbWV0YWxsaWMtZXJyb3JzJ1xuaW1wb3J0IFJvbGUsIHsgTEVBREVSIH0gZnJvbSAnLi4vcm9sZSdcbmltcG9ydCBMZWFkZXJJbnRlcmZhY2UgZnJvbSAnLi9sZWFkZXItaW50ZXJmYWNlJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMZWFkZXIgZXh0ZW5kcyBMZWFkZXJJbnRlcmZhY2Uge1xuICBjb25zdHJ1Y3RvciAoeyBjbHVzdGVyLCBzZXJ2ZXJQb29sU2l6ZSB9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY2x1c3RlciA9IGNsdXN0ZXJcbiAgICB0aGlzLnNlcnZlclBvb2xTaXplID0gc2VydmVyUG9vbFNpemVcbiAgICB0aGlzLnNlcnZlcnMgPSBbXVxuICB9XG5cbiAgc3RhdGljIGlzIChjbHVzdGVyT24pIHtcbiAgICByZXR1cm4gUm9sZS5pc0xlYWRlcihjbHVzdGVyT24pXG4gIH1cblxuICBnZXQgcm9sZSAoKSB7XG4gICAgcmV0dXJuIExFQURFUlxuICB9XG5cbiAgYXN5bmMgcnVuICgpIHtcbiAgICBjb25zdCB3b3JrZXJzID0gW11cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXJ2ZXJQb29sU2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmNsdXN0ZXIuZm9yaygpXG4gICAgICB3b3JrZXJzLnB1c2gobmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGh0dHBTZXJ2ZXJJbmZvID0+IHtcbiAgICAgICAgICByZXNvbHZlKGh0dHBTZXJ2ZXJJbmZvKVxuICAgICAgICB9KVxuICAgICAgfSkpXG4gICAgfVxuXG4gICAgY29uc3QgaHR0cFNlcnZlcnNJbmZvID0gYXdhaXQgUHJvbWlzZS5hbGwod29ya2VycylcblxuICAgIHRoaXMuaHR0cFNlcnZlcnNJbmZvID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uaHR0cFNlcnZlcnNJbmZvKVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZlcnNJbmZvXG4gIH1cblxuICBhc3luYyBjbG9zZSAoKSB7XG4gICAgcHJvY2Vzcy5leGl0KDApXG4gIH1cblxuICBhc3luYyBleGl0IChmYWlsdXJlID0gMCkge1xuICAgIHByb2Nlc3MuZXhpdChmYWlsdXJlKVxuICB9XG5cbiAgcmVmb3JrIChzZXJ2ZXIsIGNvZGUpIHtcbiAgICBpZiAoY29kZSA+IDAgJiYgIXNlcnZlci5leGl0ZWRBZnRlckRpc2Nvbm5lY3QpIHtcbiAgICAgIHRoaXMuY2x1c3Rlci5mb3JrKClcbiAgICB9XG4gIH1cblxuICBhc3luYyByZWJvb3QgKCkge1xuICAgIGNvbnN0IHNlcnZlcktleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNsdXN0ZXIud29ya2VycylcbiAgICBjb25zdCByZWxvYWRzID0gc2VydmVyS2V5cy5tYXAoc2VydmVyS2V5ID0+IHRoaXMucmVib290U2VydmVyKHNlcnZlcktleSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVsb2FkcylcbiAgfVxuXG4gIHJlYm9vdFNlcnZlciAoc2VydmVyS2V5KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMuY2x1c3Rlci53b3JrZXJzW3NlcnZlcktleV1cblxuICAgICAgc2VydmVyLmRpc2Nvbm5lY3QoKVxuXG4gICAgICBzZXJ2ZXIub25jZSgnZXhpdCcsICgpID0+IHtcbiAgICAgICAgaWYgKCFzZXJ2ZXIuZXhpdGVkQWZ0ZXJEaXNjb25uZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXhpdEVycm9yKCdTZXJ2ZXInKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1NlcnZlciA9IHRoaXMuY2x1c3Rlci5mb3JrKClcblxuICAgICAgICBuZXdTZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICBuZXdTZXJ2ZXIub25jZSgnZXJyb3InLCBlcnIgPT4gcmVqZWN0KGVycikpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyByb3RhdGVMb2cgKCkge1xuICAgIGNvbnN0IHNlcnZlcktleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNsdXN0ZXIud29ya2VycylcbiAgICBjb25zdCByb3RhdGVzID0gc2VydmVyS2V5cy5tYXAoc2VydmVyS2V5ID0+IHRoaXMuc2VuZFNpZ25hbFRvUm90YXRlTG9nKHRoaXMuY2x1c3Rlci53b3JrZXJzW3NlcnZlcktleV0pKVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJvdGF0ZXMpXG4gIH1cblxuICBzZW5kU2lnbmFsVG9Sb3RhdGVMb2cgKHNlcnZlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXJ2ZXIuc2VuZCgnbG9nZ2VyOnJlb3Blbi1maWxlLXN0cmVhbXMnLCBlcnIgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKCkpXG4gICAgfSlcbiAgfVxufVxuIl19