webappengine
Version:
A web application server that can host multiple web apps running with Node.js.
120 lines (92 loc) • 3.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _cluster = require('cluster');
var _cluster2 = _interopRequireDefault(_cluster);
var _events = require('events');
var _events2 = _interopRequireDefault(_events);
var _http = require('http');
var _http2 = _interopRequireDefault(_http);
var _settings = require('./config/settings');
var _settings2 = _interopRequireDefault(_settings);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint no-console: 0 */
// Module dependencies
var eventEmitter = new _events2.default.EventEmitter();
var createMaster = function createMaster(cluster) {
console.log('Starting directory:', process.cwd());
console.log('NodeJS-%s-%s-%s', process.version, process.platform, process.arch);
// Fork workers
for (var i = 0; i < _settings2.default.cluster.maxWorkers; ++i) {
cluster.fork();
}
// Event: online
cluster.on('online', function (worker) {
console.log('The worker #%d(pid=%d) is online', worker.id, worker.process.pid);
});
// Event: listening
cluster.on('listening', function (worker, address) {
console.log('The worker #%d(pid=%d) is listening on %s:%d', worker.id, worker.process.pid, address.address, address.port);
});
// Event: disconnect
cluster.on('disconnect', function (worker) {
console.log('The worker #%d(pid=%d) has disconnected', worker.id, worker.process.pid);
});
// Event: exit
cluster.on('exit', function (worker, code, signal) {
var exitCode = worker.process.exitCode;
console.log('The worker #%d(pid=%d) died (%d). restarting...', worker.id, worker.process.pid, exitCode);
cluster.fork();
});
};
var createServer = function createServer() {
var app = require('./app.multihost').default();
var server = _http2.default.createServer(app);
server.on('error', function (err) {
eventEmitter.emit('error', err);
});
server.setMaxListeners(0); // Set to zero for unlimited
server.listen(_settings2.default.port, _settings2.default.host, _settings2.default.backlog, function () {
// Lower the process privileges by setting the UID and GUID after the process has mound to the port.
if (_settings2.default.uid) {
process.setuid(_settings2.default.uid);
}
if (_settings2.default.gid) {
process.setgid(_settings2.default.gid);
}
eventEmitter.emit('ready', server);
});
return server;
};
var serverMain = function serverMain() {
if (_settings2.default.cluster.enable) {
if (_cluster2.default.isMaster) {
// True if the process is a master.
createMaster(_cluster2.default);
// Event: message
Object.keys(_cluster2.default.workers).forEach(function (id) {
_cluster2.default.workers[id].on('message', function (msg) {
if (msg.cmd === 'bonjour') {
console.log('Received a bonjour command from worker #%d(pid=%d)', undefined.id, undefined.process.pid);
undefined.send({ reply: 'ok' });
}
});
});
} else if (_cluster2.default.isWorker) {
// True if the process is not a master (it is the negation of cluster.isMaster).
createServer();
// Event: message
process.send({ cmd: 'bonjour' });
process.on('message', function (msg) {
console.log('Received a bonjour reply from master: %s', JSON.stringify(msg));
});
}
} else {
// Debugging Clustered Apps with Node-Inspector
// http://strongloop.com/strongblog/whats-new-nodejs-v0-12-debugging-clusters/
createServer();
}
return eventEmitter;
};
exports.default = serverMain;