diff --git a/src/core/request.js b/src/core/request.js index 1f1bad7e..a9f1c90d 100644 --- a/src/core/request.js +++ b/src/core/request.js @@ -39,7 +39,10 @@ function Request(remote, command) { util.inherits(Request, EventEmitter); // Send the request to a remote. -Request.prototype.request = function(servers, callback) { +Request.prototype.request = function(servers, callback_) { + const self = this; + const callback = typeof servers === 'function' ? servers : callback_; + this.emit('before'); this.callback(callback); @@ -51,15 +54,32 @@ Request.prototype.request = function(servers, callback) { this.on('error', function() {}); this.emit('request', this.remote); - if (Array.isArray(servers)) { - servers.forEach(function(server) { - this.setServer(server); - this.remote.request(this); - }, this); - } else { - this.remote.request(this); + function doRequest() { + if (Array.isArray(servers)) { + servers.forEach(function(server) { + self.setServer(server); + self.remote.request(self); + }, self); + } else { + self.remote.request(self); + } } + function onReconnect() { + doRequest(); + } + + function onResponse() { + self.remote.removeListener('connected', onReconnect); + } + + if (this.remote.isConnected()) { + this.remote.on('connected', onReconnect); + } + this.once('response', onResponse); + + doRequest(); + return this; }; @@ -228,7 +248,9 @@ Request.prototype.callback = function(callback, successEvent, errorEvent) { this.once(this.successEvent, requestSuccess); this.once(this.errorEvent, requestError); - this.request(); + if (!this.requested) { + this.request(); + } return this; }; diff --git a/src/core/server.js b/src/core/server.js index 3952b7e5..ffa9d623 100644 --- a/src/core/server.js +++ b/src/core/server.js @@ -692,6 +692,7 @@ Server.prototype._handleResponse = function(message) { remote: message }); } + request.emit('response', message); }; Server.prototype._handlePathFind = function(message) { diff --git a/test/request-test.js b/test/request-test.js index 17122029..377aaefe 100644 --- a/test/request-test.js +++ b/test/request-test.js @@ -47,6 +47,11 @@ describe('Request', function() { assert.strictEqual(typeof req.message, 'object'); assert.strictEqual(req.message.command, 'server_info'); done(); + }, + on: function() { + }, + isConnected: function() { + return true; } };