guvnor
Version:
A node process manager that isn't spanners all the way down
80 lines (64 loc) • 2 kB
JavaScript
var EventEmitter = require('events').EventEmitter
var util = require('util')
var cluster = require('cluster')
var ParentProcess = function () {
EventEmitter.call(this)
if (process.send) {
process.on('message', function (message) {
this.emit.apply(this, [message.event].concat(message.args ? message.args : []))
}.bind(this))
}
}
util.inherits(ParentProcess, EventEmitter)
ParentProcess.prototype.send = function (event) {
if (!process.send) {
return
}
// if we are a worker, swap out process:foo for worker:foo
if (event.substring(0, 'process:'.length) === 'process:') {
if (cluster.isWorker) {
event = 'worker:' + event.substring('process:'.length)
} else if (process.env.GUVNOR_IS_CLUSTER) {
// cannot use cluster.isMaster here because every process is a cluster master unless
// it was forked by a cluster master, capisce?
event = 'cluster:' + event.substring('process:'.length)
}
}
var message = {
event: event,
args: Array.prototype.slice.call(arguments, 1).map(function (arg) {
return this._remotePrivateFieldsFromObject(arg)
}.bind(this))
}
try {
// this will get picked up by the wrapping ProcessInfo object and turned back into an event
process.send(message)
} catch (error) {
console.error(error)
}
}
ParentProcess.prototype._remotePrivateFieldsFromObject = function (object) {
if (!object) {
return object
}
if (Array.isArray(object)) {
return object.map(function (entry) {
return this._remotePrivateFieldsFromObject(entry)
}.bind(this))
}
if (typeof object !== 'object') {
return object
}
if (typeof object === 'string' || object instanceof String) {
return object
}
var output = {}
Object.keys(object).forEach(function (key) {
if (key.substring(0, 1) === '_') {
return
}
output[key] = this._remotePrivateFieldsFromObject(object[key])
}.bind(this))
return output
}
module.exports = ParentProcess