|
|
@ -30,24 +30,21 @@ function setup(opts) { |
|
|
|
var crypto = require('crypto'); |
|
|
|
var methods = getMethods(opts.instance, opts.methods); |
|
|
|
var token = crypto.randomBytes(16).toString('hex'); |
|
|
|
var msgPrefix = 'cluster-rpc.' + opts.name; |
|
|
|
var rpcPrefix = msgPrefix + '.rpc'; |
|
|
|
var resultPrefix = msgPrefix + '.result'; |
|
|
|
var initPrefix = msgPrefix + '.init'; |
|
|
|
var inst = opts.instance; |
|
|
|
var prefixes = require('./prefixes.js').create(opts); // uses opts.name
|
|
|
|
|
|
|
|
opts.master = opts.master || require('./process/master').create(); |
|
|
|
opts.master = opts.master || require('./process/master').create(prefixes); |
|
|
|
|
|
|
|
opts.master.on('connection', function (w) { |
|
|
|
//console.log('debug w: worker connection');
|
|
|
|
if (opts.debug) { console.log('[cluster-rpc] [master] worker connected'); } |
|
|
|
w.send({ |
|
|
|
methods: methods |
|
|
|
, _token: token |
|
|
|
, type: initPrefix |
|
|
|
, type: prefixes.init |
|
|
|
}); |
|
|
|
|
|
|
|
w.on('message', function (cmd) { |
|
|
|
if (0 !== (cmd.type||'').indexOf(msgPrefix)) { |
|
|
|
if (0 !== (cmd.type||'').indexOf(prefixes.root)) { |
|
|
|
//console.log('debug w: got unknown message type');
|
|
|
|
return; |
|
|
|
} |
|
|
@ -62,7 +59,7 @@ function setup(opts) { |
|
|
|
} |
|
|
|
|
|
|
|
switch (cmd.type) { |
|
|
|
case rpcPrefix: |
|
|
|
case prefixes.rpc: |
|
|
|
cmd.args.push(function callback() { |
|
|
|
// args is probably err, data in most cases
|
|
|
|
var args = Array.prototype.slice.call(arguments); |
|
|
@ -72,7 +69,7 @@ function setup(opts) { |
|
|
|
, id: cmd.id |
|
|
|
//, this: this
|
|
|
|
, _token: token |
|
|
|
, type: resultPrefix |
|
|
|
, type: prefixes.result |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
@ -89,12 +86,14 @@ function setup(opts) { |
|
|
|
} |
|
|
|
|
|
|
|
module.exports.create = function (opts) { |
|
|
|
if (opts.debug) { console.log('[cluster-rpc] [master] create'); } |
|
|
|
var cluster = require('cluster'); |
|
|
|
var PromiseA = opts.PromiseA || global.Promise || require('bluebird'); |
|
|
|
var init = false; |
|
|
|
|
|
|
|
opts._promise = PromiseA.resolve(opts.instance); |
|
|
|
opts._promise.addWorker = function (w) { |
|
|
|
if (opts.debug) { console.log('[cluster-rpc] [master] addWorker wrapper'); } |
|
|
|
if (!init) { |
|
|
|
init = true; |
|
|
|
setup(opts); |
|
|
@ -103,6 +102,7 @@ module.exports.create = function (opts) { |
|
|
|
}; |
|
|
|
|
|
|
|
if (false !== opts.addOnFork) { |
|
|
|
if (opts.debug) { console.log('[cluster-rpc] [master] -- will call addWorker on each fork'); } |
|
|
|
cluster.on('fork', opts._promise.addWorker); |
|
|
|
} |
|
|
|
|
|
|
|