62 lines
1.1 KiB
JavaScript
62 lines
1.1 KiB
JavaScript
|
import Component from '@glimmer/component';
|
||
|
import { action } from '@ember/object';
|
||
|
import { tracked } from '@glimmer/tracking';
|
||
|
import { later, cancel as _cancel } from '@ember/runloop';
|
||
|
import { inject as service } from '@ember/service';
|
||
|
|
||
|
const DEFAULT_TIMEOUT = 10000;
|
||
|
const TESTING_TIMEOUT = 300;
|
||
|
|
||
|
export default class Watcher extends Component {
|
||
|
@service env;
|
||
|
|
||
|
@tracked _isPolling = false;
|
||
|
@tracked cancel = null;
|
||
|
|
||
|
get timeout() {
|
||
|
if (this.isTesting) {
|
||
|
return TESTING_TIMEOUT;
|
||
|
} else {
|
||
|
return this.args.timeout || DEFAULT_TIMEOUT;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get isTesting() {
|
||
|
return this.env.var('environment') === 'testing';
|
||
|
}
|
||
|
|
||
|
get isPolling() {
|
||
|
const { isTesting, _isPolling: isPolling } = this;
|
||
|
|
||
|
return !isTesting && isPolling;
|
||
|
}
|
||
|
|
||
|
@action start() {
|
||
|
this._isPolling = true;
|
||
|
|
||
|
this.watchTask();
|
||
|
}
|
||
|
|
||
|
@action stop() {
|
||
|
this._isPolling = false;
|
||
|
|
||
|
_cancel(this.cancel);
|
||
|
}
|
||
|
|
||
|
watchTask() {
|
||
|
const cancel = later(
|
||
|
this,
|
||
|
() => {
|
||
|
this.args.watch?.();
|
||
|
|
||
|
if (this.isPolling) {
|
||
|
this.watchTask();
|
||
|
}
|
||
|
},
|
||
|
this.timeout
|
||
|
);
|
||
|
|
||
|
this.cancel = cancel;
|
||
|
}
|
||
|
}
|