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
 |