89 lines
1.7 KiB
JavaScript
89 lines
1.7 KiB
JavaScript
import {EventTarget} from '../common/event-target';
|
|
import {AbortError} from '../common/errors';
|
|
import {progress, error, currentTask} from './stores';
|
|
|
|
class Task extends EventTarget {
|
|
constructor () {
|
|
super();
|
|
this.aborted = false;
|
|
progress.reset();
|
|
progress.update((p) => {
|
|
p.visible = true;
|
|
return p;
|
|
});
|
|
currentTask.replace(this);
|
|
}
|
|
|
|
abort () {
|
|
if (!this.aborted) {
|
|
this.aborted = true;
|
|
this.dispatchEvent(new Event('abort'));
|
|
}
|
|
}
|
|
|
|
error (e) {
|
|
if (!this.aborted) {
|
|
error.set(e);
|
|
progress.reset();
|
|
this.abort();
|
|
}
|
|
}
|
|
|
|
setProgress (percent) {
|
|
if (!this.aborted) {
|
|
progress.update((p) => {
|
|
p.progress = percent;
|
|
return p;
|
|
});
|
|
}
|
|
}
|
|
|
|
setProgressText (text) {
|
|
if (!this.aborted) {
|
|
progress.update((p) => {
|
|
p.text = text;
|
|
return p;
|
|
});
|
|
}
|
|
}
|
|
|
|
whenAbort (callback) {
|
|
this.addEventListener('abort', callback);
|
|
if (this.aborted) {
|
|
callback();
|
|
}
|
|
}
|
|
|
|
do (promise) {
|
|
if (this.aborted) {
|
|
return Promise.reject(new AbortError());
|
|
}
|
|
return new Promise((resolve, reject) => {
|
|
const abortCallback = () => {
|
|
reject(new AbortError());
|
|
};
|
|
this.addEventListener('abort', abortCallback);
|
|
promise
|
|
.then((r) => {
|
|
resolve(r);
|
|
this.removeEventListener('abort', abortCallback);
|
|
})
|
|
.catch((e) => {
|
|
reject(e);
|
|
this.error(e);
|
|
this.removeEventListener('abort', abortCallback);
|
|
});
|
|
});
|
|
}
|
|
|
|
done () {
|
|
progress.update((p) => {
|
|
p.visible = false;
|
|
return p;
|
|
});
|
|
currentTask.set(null);
|
|
}
|
|
}
|
|
|
|
export default Task;
|