diff --git a/examples/requester.js b/examples/requester.js index 6688753..3b6b75b 100644 --- a/examples/requester.js +++ b/examples/requester.js @@ -3,7 +3,7 @@ var Requester = require('../').Requester; var randomRequest = new Requester({ name: 'randomReq', // namespace: 'rnd', - requests: ['randomRequest'] + requests: ['randomRequest', 'promised request'] }); function makeRequest() { @@ -11,10 +11,20 @@ function makeRequest() { type: 'randomRequest', val: ~~(Math.random() * 10) }; - + console.log('sending request cb', req); randomRequest.send(req, function(res) { - console.log('request', req, 'answer', res); + console.log('request cb', req, 'answer', res); }); + + var reqPromise = { + type: 'promised request', + val: ~~(Math.random() * 10) + }; + + console.log('sending request promise', reqPromise); + randomRequest.send(reqPromise).then((res) => { + console.log('request promise', reqPromise, 'answer', res); + }).catch(e => console.log('rejected', e)); } makeRequest(); diff --git a/examples/responder.js b/examples/responder.js index e63f4d6..4d7e362 100644 --- a/examples/responder.js +++ b/examples/responder.js @@ -4,7 +4,7 @@ var Responder = require('../').Responder; var randomResponder = new Responder({ name: 'randomRep', // namespace: 'rnd', - respondsTo: ['randomRequest'] // types of requests this responder + respondsTo: ['randomRequest', 'promised request'] // types of requests this responder // can respond to. }); @@ -14,3 +14,14 @@ randomResponder.on('randomRequest', function(req, cb) { console.log('request', req.val, 'answering with', answer); cb(answer); }); + +// request handlers are like any event handler. +randomResponder.on('promised request', function(req) { + var answer = ~~(Math.random() * 10); + + return new Promise((resolve, reject) => { + console.log('promise request', req.val, 'answering with', answer); + resolve(answer); + // reject(answer); + }); +}); diff --git a/examples/sockend/index.html b/examples/sockend/index.html index 5157ca3..9a34963 100644 --- a/examples/sockend/index.html +++ b/examples/sockend/index.html @@ -1,7 +1,7 @@ diff --git a/lib/PendingBalancedRequester.js b/lib/PendingBalancedRequester.js index 474409b..123c094 100644 --- a/lib/PendingBalancedRequester.js +++ b/lib/PendingBalancedRequester.js @@ -33,16 +33,16 @@ PendingBalancedRequester.prototype.send = function() { } var args = Array.prototype.slice.call(arguments); - Requester.prototype.send.apply(this, args); + var rv = Requester.prototype.send.apply(this, args); - if (!sock.socks.length) return; + if (!sock.socks.length) return rv; var sentSock = sock.socks[sock.n - 1]; var cbId = sock.identity + ':' + (sock.ids - 1); sock.callbacks[cbId].sock = sentSock; - return sentSock.uuid; + return rv || sentSock.uuid; }; diff --git a/lib/Requester.js b/lib/Requester.js index 476c9a4..7f94360 100644 --- a/lib/Requester.js +++ b/lib/Requester.js @@ -61,10 +61,21 @@ var Requester = function(advertisement, discoveryOptions) { util.inherits(Requester, EventEmitter); -Requester.prototype.send = function() { - var args = Array.prototype.slice.call(arguments); +Requester.prototype.send = function(...args) { + if (args.length == 1 || typeof args[args.length - 1] != 'function') { + return new Promise((resolve, reject) => { + if (!this.sock) return reject(new Error('No socket found')); + + this.sock.send(...args, (err, res) => { + if (err) return reject(err); + resolve(res); + }); + }); + } + + if (!this.sock) return; - this.sock.send.apply(this.sock, args); + this.sock.send(...args); }; diff --git a/lib/Responder.js b/lib/Responder.js index ef0f1c7..4127b8c 100644 --- a/lib/Responder.js +++ b/lib/Responder.js @@ -50,6 +50,16 @@ var Responder = function(advertisement, discoveryOptions) { }; util.inherits(Responder, EventEmitter); +Responder.prototype.on = function(type, listener) { + return EventEmitter.prototype.on.call(this, type, (...args) => { + var rv = listener(...args); + + if (rv && typeof rv.then == 'function') { + var cb = args.pop(); + rv.then((val) => cb(null, val)).catch(cb); + } + }); +} Responder.prototype.close = function() { if (this.discovery) {