12e073e8cf
mostly because code is being autogenerated by all the AI stuff using this prefix. it's also used in the stack trace.
48 lines
1.1 KiB
JavaScript
48 lines
1.1 KiB
JavaScript
'use strict';
|
|
|
|
const debug = require('debug')('box:asynctask'),
|
|
EventEmitter = require('node:events'),
|
|
safe = require('safetydance');
|
|
|
|
// this runs in-process
|
|
class AsyncTask extends EventEmitter {
|
|
name;
|
|
#abortController;
|
|
|
|
constructor(name) {
|
|
super();
|
|
this.name = name;
|
|
this.#abortController = new AbortController();
|
|
}
|
|
|
|
async _run(/*signal*/) {
|
|
// subclasses implement this
|
|
}
|
|
|
|
async start() {
|
|
debug(`start: ${this.name} started`);
|
|
const [error] = await safe(this._run(this.#abortController.signal)); // background
|
|
debug(`start: ${this.name} finished`);
|
|
this.emit('done', { errorMessage: error?.message || '' });
|
|
this.#abortController = null;
|
|
}
|
|
|
|
stop() {
|
|
if (this.#abortController === null) return; // already finished
|
|
debug(`stop: ${this.name} . sending abort signal`);
|
|
this.#abortController.abort();
|
|
}
|
|
|
|
emitProgress(percent, message) {
|
|
this.emit('data', 'progress', { percent, message });
|
|
}
|
|
|
|
emitData(obj) {
|
|
this.emit('data', 'data', obj);
|
|
}
|
|
}
|
|
|
|
exports = module.exports = {
|
|
AsyncTask
|
|
};
|