kibana/x-pack/legacy/common/poller.js
2019-12-13 23:17:13 -07:00

80 lines
2 KiB
JavaScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import _ from 'lodash';
export class Poller {
constructor(options) {
this.functionToPoll = options.functionToPoll; // Must return a Promise
this.successFunction = options.successFunction || _.noop;
this.errorFunction = options.errorFunction || _.noop;
this.pollFrequencyInMillis = options.pollFrequencyInMillis;
this.trailing = options.trailing || false;
this.continuePollingOnError = options.continuePollingOnError || false;
this.pollFrequencyErrorMultiplier = options.pollFrequencyErrorMultiplier || 1;
this._timeoutId = null;
this._isRunning = false;
}
getPollFrequency() {
return this.pollFrequencyInMillis;
}
_poll() {
return this.functionToPoll()
.then(this.successFunction)
.then(() => {
if (!this._isRunning) {
return;
}
this._timeoutId = setTimeout(this._poll.bind(this), this.pollFrequencyInMillis);
})
.catch(e => {
this.errorFunction(e);
if (!this._isRunning) {
return;
}
if (this.continuePollingOnError) {
this._timeoutId = setTimeout(
this._poll.bind(this),
this.pollFrequencyInMillis * this.pollFrequencyErrorMultiplier
);
} else {
this.stop();
}
});
}
start() {
if (this._isRunning) {
return;
}
this._isRunning = true;
if (this.trailing) {
this._timeoutId = setTimeout(this._poll.bind(this), this.pollFrequencyInMillis);
} else {
this._poll();
}
}
stop() {
if (!this._isRunning) {
return;
}
this._isRunning = false;
clearTimeout(this._timeoutId);
this._timeoutId = null;
}
isRunning() {
return this._isRunning;
}
}