Better back off implementation.
This commit is contained in:
parent
07da03618f
commit
daf42b63c8
@ -88,6 +88,35 @@ function fibonacci(start) {
|
|||||||
return iterator;
|
return iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
function BackOff(generator, opts) {
|
||||||
|
if (!opts) {
|
||||||
|
opts = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
this._attempts = 0;
|
||||||
|
this._generator = generator;
|
||||||
|
this._iterator = generator();
|
||||||
|
this._maxAttempts = opts.maxAttempts || Infinity;
|
||||||
|
}
|
||||||
|
|
||||||
|
BackOff.prototype.wait = function () {
|
||||||
|
var maxAttempts = this._maxAttempts;
|
||||||
|
if (this._attempts++ > maxAttempts) {
|
||||||
|
return Bluebird.reject(new Error(
|
||||||
|
'maximum attempts reached (' + maxAttempts +')'
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Bluebird.delay(this._iterator.next().value);
|
||||||
|
};
|
||||||
|
|
||||||
|
BackOff.prototype.reset = function () {
|
||||||
|
this._attempts = 0;
|
||||||
|
this._iterator = this._generator();
|
||||||
|
};
|
||||||
|
|
||||||
//====================================================================
|
//====================================================================
|
||||||
|
|
||||||
// Fix URL if necessary.
|
// Fix URL if necessary.
|
||||||
@ -234,8 +263,8 @@ function tryConnect() {
|
|||||||
this.status = 'connecting';
|
this.status = 'connecting';
|
||||||
return this._api.connect().bind(this).catch(function () {
|
return this._api.connect().bind(this).catch(function () {
|
||||||
this.status = 'disconnected';
|
this.status = 'disconnected';
|
||||||
var delay = this._backOff.next().value;
|
|
||||||
return Bluebird.delay(delay).bind(this).then(tryConnect);
|
return this._backOff.wait().bind(this).then(tryConnect);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,15 +340,15 @@ function Xo(opts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._api = new Api(opts.url);
|
this._api = new Api(opts.url);
|
||||||
this._backOff = fibonacci(1e3);
|
this._backOff = new BackOff(function () {
|
||||||
|
return fibonacci(1e3);
|
||||||
|
});
|
||||||
this.objects = createCollection(objectsOptions);
|
this.objects = createCollection(objectsOptions);
|
||||||
this.status = 'disconnected';
|
this.status = 'disconnected';
|
||||||
|
|
||||||
self._api.on('connected', function () {
|
self._api.on('connected', function () {
|
||||||
self.status = 'connected';
|
self.status = 'connected';
|
||||||
|
self._backOff.reset();
|
||||||
// Reset back off.
|
|
||||||
self._backOff = fibonacci(1e3);
|
|
||||||
|
|
||||||
signIn.call(self);
|
signIn.call(self);
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user