Spaces:
Sleeping
Sleeping
| 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; | |