UNPKG

cluster-service

Version:

Turns your single process code into a fault-resilient multi-process service with built-in REST & CLI support

98 lines (87 loc) 2.43 kB
var async = require("async"); var cservice = require("../../cluster-service"); module.exports = function(evt, cb, cmd) { processDetails(evt.service.workers, function(err, workers) { var ret = {}; cmd = cmd || "simple"; switch (cmd) { case "details": ret.workers = workers; break; default: ret.workers = workerSummary(workers); break; } cb(err, ret); }); }; module.exports.more = function(cb) { cb(null, { command: "workers [simple|details]", info: "Returns list of active worker processes.", "simple|details": "Defaults to 'simple'.", "* simple": "Simple overview of running workers.", "* details": "Full details of running workers." }); }; function processDetails(workers, cb) { var tasks = [], i, w; for (i = 0; i < workers.length; i++) { w = workers[i]; tasks.push(getProcessDetails(w)); } async.parallel(tasks, function(err, results) { cb(err, workers); }); } function getProcessDetails(worker) { return function(cb) { var timer, msgCb, processDetails, netStats; msgCb = function (msg) { if (msg && msg.cservice.processDetails) { processDetails = msg.cservice.processDetails; } if (msg && msg.cservice.netStats) { netStats = msg.cservice.netStats; } if (processDetails && netStats) { clearTimeout(timer); worker.removeListener("message", msgCb); worker.processDetails = processDetails; processDetails.net = netStats; cb(null, worker); } }; timer = setTimeout(function() { worker.removeListener("message", msgCb); if (processDetails) { // net stats not required for success worker.processDetails = processDetails; cb(null, worker); } else { cb("getProcessDetails TIMEOUT"); } }, 1000); worker.on("message", msgCb); cservice.processSafeSend(worker.process, cservice.msgBus.createMessage("processDetails") ); cservice.processSafeSend(worker.process, cservice.msgBus.createMessage("netStats") ); }; } function workerSummary(workers) { var ret = [], i, w; for (i = 0; i < workers.length; i++) { w = workers[i]; ret.push({ id: w.id, pid: w.pid, state: w.state, worker: w.cservice.worker, cwd: w.cservice.cwd, process: w.processDetails }); } return ret; }