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) {