128 lines
2.4 KiB
JavaScript
128 lines
2.4 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.AsyncTaskManager = void 0;
|
||
|
|
||
|
function _log() {
|
||
|
const data = require("./log");
|
||
|
|
||
|
_log = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
function _promise() {
|
||
|
const data = require("./promise");
|
||
|
|
||
|
_promise = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
class AsyncTaskManager {
|
||
|
constructor(cancellationToken) {
|
||
|
this.cancellationToken = cancellationToken;
|
||
|
this.tasks = [];
|
||
|
this.errors = [];
|
||
|
}
|
||
|
|
||
|
add(task) {
|
||
|
if (this.cancellationToken == null || !this.cancellationToken.cancelled) {
|
||
|
this.addTask(task());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
addTask(promise) {
|
||
|
if (this.cancellationToken.cancelled) {
|
||
|
_log().log.debug({
|
||
|
reason: "cancelled",
|
||
|
stack: new Error().stack
|
||
|
}, "async task not added");
|
||
|
|
||
|
if ("cancel" in promise) {
|
||
|
promise.cancel();
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.tasks.push(promise.catch(it => {
|
||
|
_log().log.debug({
|
||
|
error: it.message || it.toString()
|
||
|
}, "async task error");
|
||
|
|
||
|
this.errors.push(it);
|
||
|
return Promise.resolve(null);
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
cancelTasks() {
|
||
|
for (const task of this.tasks) {
|
||
|
if ("cancel" in task) {
|
||
|
task.cancel();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.tasks.length = 0;
|
||
|
}
|
||
|
|
||
|
async awaitTasks() {
|
||
|
if (this.cancellationToken.cancelled) {
|
||
|
this.cancelTasks();
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
const checkErrors = () => {
|
||
|
if (this.errors.length > 0) {
|
||
|
this.cancelTasks();
|
||
|
throwError(this.errors);
|
||
|
return;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
checkErrors();
|
||
|
let result = null;
|
||
|
const tasks = this.tasks;
|
||
|
let list = tasks.slice();
|
||
|
tasks.length = 0;
|
||
|
|
||
|
while (list.length > 0) {
|
||
|
const subResult = await Promise.all(list);
|
||
|
result = result == null ? subResult : result.concat(subResult);
|
||
|
checkErrors();
|
||
|
|
||
|
if (tasks.length === 0) {
|
||
|
break;
|
||
|
} else {
|
||
|
if (this.cancellationToken.cancelled) {
|
||
|
this.cancelTasks();
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
list = tasks.slice();
|
||
|
tasks.length = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result || [];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
exports.AsyncTaskManager = AsyncTaskManager;
|
||
|
|
||
|
function throwError(errors) {
|
||
|
if (errors.length === 1) {
|
||
|
throw errors[0];
|
||
|
} else if (errors.length > 1) {
|
||
|
throw new (_promise().NestedError)(errors, "Cannot cleanup: ");
|
||
|
}
|
||
|
}
|
||
|
// __ts-babel@6.0.4
|
||
|
//# sourceMappingURL=asyncTaskManager.js.map
|