gypsum
Version:
Simple and easy lightweight typescript server side framework on Node.js.
79 lines • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const cluster = require("cluster");
const os_1 = require("os");
const logger_1 = require("./misc/logger");
let logger;
let isRestarting = false;
function initializeWorkers(processesCount) {
let cores = os_1.cpus().length;
let workersCount = (processesCount === 'max' || processesCount >= cores) ? cores : processesCount;
logger = new logger_1.Logger('workers');
logger.info(`forking processes count: ${workersCount}`);
for (let i = 0; i < workersCount; i++)
cluster.fork();
logger.info('listening on worker crash');
cluster.on('exit', (worker, code, signal) => {
if (code !== 0) {
logger.warn(`Worker ${worker.id} crashed`);
logger.warn(`Starting new worker`);
cluster.fork();
}
});
logger.info('listening on worker online');
cluster.on('online', (worker) => {
logger.info(`worker online: ${worker.id}, process: ${worker.process.pid}`);
prepareWorker(worker);
});
}
exports.initializeWorkers = initializeWorkers;
function restartWorkers(workers, index) {
const worker = workers[index];
if (!worker) {
isRestarting = false;
return;
}
worker.on('exit', () => {
if (!worker.exitedAfterDisconnect)
return;
logger.info(`Exited process ${worker.process.pid}`);
let newWorker = cluster.fork();
newWorker.on('listening', () => {
restartWorkers(workers, index + 1);
});
});
worker.disconnect();
}
function prepareWorker(worker) {
logger.info(`Preparing worker: ${worker.id}`);
worker.on('message', msg => {
if (msg.action === 'restart all') {
if (isRestarting)
return;
else
isRestarting = true;
let workers = [];
for (let wid in cluster.workers) {
let worker = cluster.workers[wid];
if (worker)
workers.push(worker);
}
logger.info('restarting workers..');
restartWorkers(workers, 0);
}
else if (msg.target === 'others' || msg.target === 'all') {
publishMsg(msg, msg.target === 'others' ? worker.process.pid : undefined);
}
});
}
function publishMsg(msg, pid) {
for (let wid in cluster.workers) {
let worker = cluster.workers[wid];
if (worker)
if (pid && worker.process.pid === pid)
continue;
else
worker.send(msg);
}
}
//# sourceMappingURL=workers.js.map