utiller 1.0.408 → 1.0.411
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/pooller/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _lodash=_interopRequireDefault(require("lodash"));var _index2=require("../index.js");var _configerer=require("configerer");var _exceptioner=_interopRequireDefault(require("../exceptioner"));function _classPrivateFieldInitSpec(e,t,a){_checkPrivateRedeclaration(e,t),t.set(e,a)}function _checkPrivateRedeclaration(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function _classPrivateFieldGet(s,a){return s.get(_assertClassBrand(s,a))}function _assertClassBrand(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const SPECIFICITY_DEBUG=false;var _run=new WeakMap;class InfinitePool{constructor(maxWorkers=_configerer.configerer.POOLLER_WORKER_DEFAULT,name=_index2.utiller.getRandomValue(0,100000000000)){(0,_defineProperty2.default)(this,"isRunInBackgroundMode",false);(0,_defineProperty2.default)(this,"state",_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);(0,_defineProperty2.default)(this,"enableOfTaskSleepByInterval",_configerer.configerer.POOLLER_ENABLE_TASK_SLEEP_BY_INTERVAL);(0,_defineProperty2.default)(this,"taskSleepInterval",_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT);(0,_defineProperty2.default)(this,"enableOfTaskTimeout",_configerer.configerer.POOLLER_ENABLE_TIMEOUT);(0,_defineProperty2.default)(this,"timeOfTaskTimeout",_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT);(0,_defineProperty2.default)(this,"handlerOfAssignTaskFail",undefined);(0,_defineProperty2.default)(this,"maximumOfWorker",void 0);(0,_defineProperty2.default)(this,"disableFirstRun",false);(0,_defineProperty2.default)(this,"queueOfWaitingParam",[]);(0,_defineProperty2.default)(this,"countsOfRunByTimes",-1);(0,_defineProperty2.default)(this,"queueOfAssignTask",{});(0,_defineProperty2.default)(this,"queueOfExecutingTask",[]);(0,_defineProperty2.default)(this,"isQueuePolling",false);(0,_defineProperty2.default)(this,"initialTaskCompleted",false);(0,_defineProperty2.default)(this,"mapOfHashNTask",{});(0,_defineProperty2.default)(this,"mapOfHashNCallbackWrapper",{});(0,_defineProperty2.default)(this,"nameOfCurrentPool",``);(0,_defineProperty2.default)(this,"setPoolId",(id=this.nameOfCurrentPool)=>{this.nameOfCurrentPool=id});(0,_defineProperty2.default)(this,"getPoolId",()=>{return this.nameOfCurrentPool});(0,_defineProperty2.default)(this,"stopInBackground",async()=>{this.terminate();let attempts=0;const maxAttempts=30;while(_lodash.default.size(this.queueOfExecutingTask)>0&&attempts<maxAttempts){await _index2.utiller.syncDelay(500);this.printLogMessage(`784512, 咬在 stopInBackground 出不來,${this.getLogMessageOfExecutingTaskQueueCount()}`);this.showState();attempts++}return true});(0,_defineProperty2.default)(this,"isRunning",()=>{return this.isQueuePolling});(0,_defineProperty2.default)(this,"getCountOfAssignTaskInQueue",()=>{let size=0;for(const prior of _configerer.configerer.POOLLER_PRIORITY){size+=this.queueOfAssignTask[prior].length}return size});(0,_defineProperty2.default)(this,"add",(task,priority="low")=>{if(typeof task==="function"){if(_configerer.configerer.POOLLER_PRIORITY.indexOf(priority)<0){throw new _exceptioner.default(4001,`priority can't be ${priority}`)}const hash=_index2.utiller.getRandomHash();const taskInfo={task,hash};this.appendHashTaskMap(taskInfo);this.queueOfAssignTask[priority].push(taskInfo);return hash}else{throw new _exceptioner.default(4002,`task can't be ${typeof task}`)}});(0,_defineProperty2.default)(this,"updateExecuteTaskState",hash=>{const self=this;const task=_lodash.default.find(this.queueOfExecutingTask,each=>_lodash.default.isEqual(each.hash,hash));if(task){this.printLogMessage(`847875153, 客端委託的任務: ${hash},更改狀態為 'ING'`);task.state="ING"}});(0,_defineProperty2.default)(this,"taskWrapper",(assignedTask,hashOfTask,param)=>()=>{const self=this;let timeoutHash="";let assignedTaskResult;let assignedTaskError;let isAssignedTaskCompleted=true;return new Promise((resolve,reject)=>{if(self.enableOfTaskTimeout){timeoutHash=setTimeout(()=>{try{this.printLogMessage(`982532, taskWrapper執行中,發生timout: ${self.timeOfTaskTimeout} ms`);throw new _exceptioner.default(4010,self.getPoollerLogFormat(`TASK HASH:${hashOfTask} IS TIMEOUT ${self.timeOfTaskTimeout} ms ${param?`,PARAMS IS ${JSON.stringify(param)}`:""}`))}catch(error){reject(error)}},self.timeOfTaskTimeout)}this.printLogMessage(`984135, 客端委託的task開始執行 ${hashOfTask}`);self.updateExecuteTaskState(hashOfTask);assignedTask(param).then(result=>{this.printLogMessage(`984545, 客端委託的任務(TASK HASH:${hashOfTask}),resolve回應: ${result}`);assignedTaskResult=result;isAssignedTaskCompleted=true}).catch(error=>{this.printLogMessage(`989652, 客端委託的任務,reject回應: ${error.message}`,true,error);assignedTaskError=error;isAssignedTaskCompleted=false}).finally(()=>{clearTimeout(timeoutHash);resolve();this.printLogMessage(`98942,(TASK HASH:${hashOfTask}) taskWrapper()裡面第一個promise(為了timeout設計)完成了`)})}).then(result=>{if(!isAssignedTaskCompleted){throw assignedTaskError}else{this.printLogMessage(`9894841,(TASK HASH:${hashOfTask}) taskWrapper()裡面第二個promise(整個任務)完成了`);return`${this.getLogMessageOfTaskHash(hashOfTask)} completed`}}).catch(error=>{isAssignedTaskCompleted=false;assignedTaskError=error;if(!self.isWait4ResultTask(hashOfTask)){if(self.handlerOfAssignTaskFail!==undefined){self.handlerOfAssignTaskFail(assignedTaskError)}else throw assignedTaskError}}).finally(()=>{const result={assignedTaskCompleted:isAssignedTaskCompleted,resolve:assignedTaskResult,reject:assignedTaskError};self.removeResolveOrRejectPromiseByHash(hashOfTask,result);this.printLogMessage(`98943213, ${this.getLogMessageOfTaskHash(hashOfTask)} taskWrapper()裡面第2個promise完成了`,false,result)})});(0,_defineProperty2.default)(this,"adds",(tasks,priority="low")=>{const hashes=[];if(_lodash.default.isArray(tasks)){for(const task of tasks){hashes.push(this.add(task,priority))}}else{throw new _exceptioner.default(4003,`should be async function array, not ${typeof tasks}`)}return hashes});(0,_defineProperty2.default)(this,"removeTaskMapByHash",hash=>{delete this.mapOfHashNTask[hash]});(0,_defineProperty2.default)(this,"beforeRun",()=>{this.isQueuePolling=true});(0,_defineProperty2.default)(this,"afterRun",()=>{this.clearCache()});(0,_defineProperty2.default)(this,"runInInfinite",async(task=[],interval)=>{this.beforeRun();if(_lodash.default.isFunction(task))this.add(task);else if(_lodash.default.isArray(task))this.adds(task);else throw new _exceptioner.default(4006,`type of task is ===> ${typeof task}`);this.enableTaskSleepInterval(_lodash.default.isNumber(interval),interval);this.setState(_configerer.configerer.POOLLER_STATE.RUN_INFINITE);while(!this.ruleOfStopInfiniteRun()){this.printLogMessage(`415123, runInInfinite() 正在無限Loop中, ${this.getLogMessageOfExecutingTaskQueueCount()}`);await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"ruleOfStopInfiniteRun",()=>{return!this.isRunning()&&this.isExecutingTaskQueueEmpty()});(0,_defineProperty2.default)(this,"isExecutingTaskQueueEmpty",()=>{return _lodash.default.size(this.queueOfExecutingTask)===0});(0,_defineProperty2.default)(this,"appendParamInToQueue",(...params)=>{this.triggerBgInstance();this.queueOfWaitingParam.push(...params)});(0,_defineProperty2.default)(this,"runByParams",async(functionOfAsyncTask,...params)=>{if(functionOfAsyncTask===undefined){functionOfAsyncTask=this.queueOfAssignTask["low"].shift().task}if(!_lodash.default.isFunction(functionOfAsyncTask))throw new _exceptioner.default(4006,`runByParams error, typeof task can't be ${typeof functionOfAsyncTask}`);if(!_lodash.default.isArray(params))throw new _exceptioner.default(4006,`runByParams error, typeof params can't be ${typeof params}`);this.beforeRun();this.add(functionOfAsyncTask);this.appendParamInToQueue(...params);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS);while(!this.ruleOfStopInfiniteRun()&&_lodash.default.size(this.queueOfWaitingParam)>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runByEachTask",async(tasks=[])=>{const self=this;this.id=_index2.utiller.getRandomHash(15);this.beforeRun();this.adds(tasks);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);while(!this.ruleOfStopInfiniteRun()){await _classPrivateFieldGet(_run,this).call(this,this.id);if(this.getCountOfAssignTaskInQueue()<=0){this.terminate();this.printLogMessage(`788121, runByEachTask() 因為 taskOfWaitingQueue 清空而停止`)}await _index2.utiller.syncDelay(10);this.printLogMessage(`788143, runByEachTask() 為了讓while不要停止運算`)}this.printLogMessage(`7881952, runByEachTask() 結束了while()`)});(0,_defineProperty2.default)(this,"runByTimes",async(functionOfAsyncTask,times=1)=>{this.countsOfRunByTimes=times;this.add(functionOfAsyncTask);this.beforeRun();this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES);while(!this.ruleOfStopInfiniteRun()&&this.countsOfRunByTimes>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runInBackGround",(asyncfunc,...params)=>{this.isRunInBackgroundMode=true;if(!(typeof asyncfunc==="function")){throw new _exceptioner.default(4002,`_asyncfunc can't be ${typeof asyncfunc}`)}return setTimeout(async()=>{try{await asyncfunc.apply(this,params)}catch(error){if(error instanceof _exceptioner.default){this.printLogMessage(`7812123, runInBackGround() 執行錯誤: ${error.message}`,true,error)}else{throw new _exceptioner.default(4009,{message:`${this.getPoollerLogFormat("")}`},error)}}finally{this.terminate();this.printLogMessage(`7812123, runInBackGround() 走到finally`)}},1)});(0,_defineProperty2.default)(this,"getPoollerLogFormat",msg=>{return`POOLLER NAME: ${this.getPoolId()}${_lodash.default.isEmpty(msg)?"":" , "}${msg}`});(0,_defineProperty2.default)(this,"setTaskFailHandler",(listener=error=>console.log(error.message))=>{this.handlerOfAssignTaskFail=listener});(0,_defineProperty2.default)(this,"rulesOfAppendToExecutingTask",()=>{switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:return this.isRunning()&&!this.isExecutingQueueFull()&&_lodash.default.size(this.queueOfWaitingParam)>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}});(0,_defineProperty2.default)(this,"appendTaskToExecuteQueue",(hash,promise)=>{if(_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES)){this.countsOfRunByTimes=this.countsOfRunByTimes-1}const task={state:"NOT",hash:hash,task:promise};this.printLogMessage(`4484451, 增加了一個assignedTask ${this.getLogMessageOfTaskHash(hash)} 到 QueueOfExecutingTask ,${this.getLogMessageOfExecutingTaskQueueCount}`,false,task);this.queueOfExecutingTask.push(task)});(0,_defineProperty2.default)(this,"getLogMessageOfExecutingTaskQueueCount",()=>{return`ExecutingTaskQueueCount: ${_lodash.default.size(this.queueOfExecutingTask)}`});(0,_defineProperty2.default)(this,"getLogMessageOfAssignTaskQueueCount",()=>{return`AssignTaskQueueCount: ${this.getCountOfAssignTaskInQueue()}`});(0,_defineProperty2.default)(this,"getLogMessageOfTaskHash",hash=>{return`TASK HASH: ${hash}`});(0,_defineProperty2.default)(this,"showState",()=>{_index2.utiller.appendInfo(this.getPoollerLogFormat(`workerCount: ${this.maximumOfWorker}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`taskQueue(還在排隊的Task): ${this.getCountOfAssignTaskInQueue()}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`QueueOfExecutingTask(正在執行的AsyncTask, 超過workerCount就是bug): ${_lodash.default.size(this.queueOfExecutingTask)}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`mapOfHashNTask(還沒執行到的AsyncTask reference的暫存區): ${_lodash.default.size(this.mapOfHashNTask)}`))});_classPrivateFieldInitSpec(this,_run,async()=>{const self=this;async function execute(){const tasks=_lodash.default.filter(self.queueOfExecutingTask,each=>_lodash.default.isEqual(each.state,"NOT")).map(each=>{const taskWrapper=each.task;return taskWrapper()});self.printLogMessage(`454652321, 開始任務(taskWrapper): run() 裡面的execute開始執行, task(state = NOT)的長度 ${_lodash.default.size(tasks)}`);const result=_lodash.default.size(tasks)>0?await Promise.race(tasks):"4542131684, task is empty";self.printLogMessage(`54121445161, 結束任務(taskWrapper): run() 裡面的execute結束執行`);return result}async function emptyTask(){self.printLogMessage(`因為max count of worker為0,所以指派一個簡單的任務`);await _index2.utiller.syncDelay(10)}await this.syncTaskDispatcher();if(this.maximumOfWorker===0){await emptyTask()}else if(!this.isExecutingTaskQueueEmpty()){this.printLogMessage(`4512211, 開始任務(taskWrapper): ${this.getLogMessageOfExecutingTaskQueueCount()}`);const task=await execute();this.printLogMessage(`4512213 完畢任務(taskWrapper:${task}), ${this.getLogMessageOfExecutingTaskQueueCount()}, ${this.getLogMessageOfAssignTaskQueueCount()}`)}else{this.printLogMessage(`4574152 不應該走到這裏,但是 minor issue`,true)}if(this.queueOfExecutingTask.length>this.maximumOfWorker)this.printLogMessage(`4512214 一定是改壞了!!!!!!!!!!, ${this.getLogMessageOfExecutingTaskQueueCount} `,true);self.printLogMessage(`5478421212, 離開 run()`)});(0,_defineProperty2.default)(this,"getTaskInfoForRepetitiveRun",originalTaskInfo=>{const newTaskInfo={task:originalTaskInfo.task,hash:_index2.utiller.getRandomHash()};this.appendHashTaskMap(newTaskInfo);return newTaskInfo});(0,_defineProperty2.default)(this,"getTaskInfoDependOnPriority",()=>{for(const prior of _configerer.configerer.POOLLER_PRIORITY){if(this.queueOfAssignTask[prior].length>0){switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.queueOfAssignTask[prior].shift();case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:const originalTaskInfo=this.queueOfAssignTask[prior][0];return this.getTaskInfoForRepetitiveRun(originalTaskInfo);default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}}}if(!_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK))throw new _exceptioner.default(4007)});(0,_defineProperty2.default)(this,"removeResolveOrRejectPromiseByHash",(hash,result)=>{const callbackWrapper=this.mapOfHashNCallbackWrapper[hash];if(callbackWrapper!==undefined){this.printLogMessage(`5644153248, removeResolveOrRejectPromiseByHash 拿掉了完成的任務(${this.getLogMessageOfTaskHash(hash)})`);callbackWrapper(result);delete this.mapOfHashNCallbackWrapper[hash]}this.removePromiseFromExecutingQueue(hash)});(0,_defineProperty2.default)(this,"removePromiseFromExecutingQueue",hash=>{this.printLogMessage(`56448412, QueueOfExecutingTask 拿掉了完成的任務 ${this.getLogMessageOfTaskHash(hash)}`);_lodash.default.remove(this.queueOfExecutingTask,each=>_lodash.default.isEqual(hash,each.hash))});(0,_defineProperty2.default)(this,"runInfiniteInBackground",(functionOfAsyncTask,interval)=>{this.invokeInstanceOfBackground(this.runInInfinite,functionOfAsyncTask,interval)});(0,_defineProperty2.default)(this,"runByParamInBackGround",(functionOfAsyncTask,...params)=>{return this.invokeInstanceOfBackground(this.runByParams,functionOfAsyncTask,...params)});(0,_defineProperty2.default)(this,"runByTimesInBackGround",(functionOfAsyncTask,times)=>{this.invokeInstanceOfBackground(this.runByTimes,functionOfAsyncTask,times);return this});(0,_defineProperty2.default)(this,"runByEachTaskInBackGround",(...params)=>{return this.invokeInstanceOfBackground(this.runByEachTask,...params)});(0,_defineProperty2.default)(this,"invokeInstanceOfBackground",(state,...params)=>{if(this.atomicBgInstance!==undefined)clearTimeout(this.atomicBgInstance);this.atomicBgInstance=this.runInBackGround(state,...params);return this});this.maximumOfWorker=maxWorkers;this.setPoolId(_lodash.default.toString(name));for(const prior of _configerer.configerer.POOLLER_PRIORITY){this.queueOfAssignTask[prior]=[]}}enableQueueTerminateBySleepCount(enable=true,interval=_configerer.configerer.POOLLER_QUEUE_TIME_OF_SLEEP_INTERVAL_DEFAULT,times=_configerer.configerer.POOLLER_QUEUE_MAX_SLEEP_COUNTS_DEFAULT){this.enableOfQueueTerminateSleepCount=enable;this.queueMaxSleepCounts=times;this.intervalOfQueueSleep=interval}clearCache(){this.queueOfExecutingTask.length=0;this.mapOfHashNTask={};this.queueOfAssignTask={}}terminate(){this.isQueuePolling=false}printLogMessage(message,error=false,...infos){if(SPECIFICITY_DEBUG)_index2.utiller.printLogMessage(this.getPoollerLogFormat(message),error,...infos)}setWorker(counts){this.maximumOfWorker=counts}cleanTaskInterval(){this.taskSleepInterval={min:0,max:0}}enableTaskSleepInterval(enable=true,interval=_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT){this.enableOfTaskSleepByInterval=enable;if(_lodash.default.isNumber(interval)){interval={min:interval,max:interval}}this.taskSleepInterval=interval}enableTaskTimeout(enable=true,millionSec=_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT){this.enableOfTaskTimeout=enable;this.timeOfTaskTimeout=millionSec}async addTaskAndWait4Result(asyncTask,priority="low",taskName="noName"){this.triggerBgInstance();return new Promise((resolve,reject)=>{const callbackWrapper=result=>{if(result.assignedTaskCompleted){resolve(result.resolve)}else{reject(result.reject)}};const hash=this.add(asyncTask,priority);this.registerHash4Result(hash,callbackWrapper)})}registerHash4Result(hash,callback){this.mapOfHashNCallbackWrapper[hash]=callback}appendHashTaskMap(taskInfo){this.mapOfHashNTask[taskInfo.hash]=taskInfo}getTaskInfoByHash(hash){return this.mapOfHashNTask[hash]}remove(hash){let taskInfo=this.getTaskInfoByHash(hash);if(taskInfo){for(const prior of _configerer.configerer.POOLLER_PRIORITY){const _index=_lodash.default.indexOf(this.queueOfAssignTask[prior],taskInfo);if(_index>0){this.queueOfAssignTask[prior].splice(_index,1);this.removeTaskMapByHash(hash);return true}}return false}else{throw new _exceptioner.default(4004,hash)}}setState(_state){this.state=_state}checkAndMarkInitialTaskStatus(){if(!this.initialTaskCompleted){this.initialTaskCompleted=true;return false}return this.initialTaskCompleted}setDisableFirstRun(disable=true){this.disableFirstRun=disable}triggerBgInstance(){if(!this.isRunInBackgroundMode||this.isQueuePolling){return}if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.runByEachTaskInBackGround();return}else if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS){this.runByParamInBackGround();return}throw new _exceptioner.default(4011,`this.state is ==> ${_index2.utiller.getItsKeyByValue(_configerer.configerer.POOLLER_STATE,this.state)}`)}isExecutingQueueFull(){return _lodash.default.size(this.queueOfExecutingTask)>=this.maximumOfWorker}isTaskQueueEmpty(){return this.getCountOfAssignTaskInQueue()===0}async syncTaskDispatcher(){this.printLogMessage(`448984466, 走進來了 syncTaskDispatcher()`);const initialTaskShouldNotRun=this.disableFirstRun&&!this.checkAndMarkInitialTaskStatus();const isExecutingTaskAlmostFull=this.queueOfExecutingTask.length>=this.maximumOfWorker-1;const comparison=this.checkAndMarkInitialTaskStatus()&&isExecutingTaskAlmostFull&&this.enableOfTaskSleepByInterval;if(initialTaskShouldNotRun||comparison){const restInInterval=await _index2.utiller.syncDelayRandom(this.taskSleepInterval.min,this.taskSleepInterval.max);this.printLogMessage(`4484121, 走到睡覺區 enableOfTaskSleepByInterval:${this.enableOfTaskSleepByInterval} || ${restInInterval} ms`)}while(this.rulesOfAppendToExecutingTask()){const taskInfo=this.getTaskInfoDependOnPriority();if(taskInfo){const promise=this.taskWrapper(taskInfo.task,taskInfo.hash,this.queueOfWaitingParam.shift());if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.removeTaskMapByHash(taskInfo.hash)}else{}this.appendTaskToExecuteQueue(taskInfo.hash,promise)}else{this.printLogMessage(`848451 也許有未知的isssue,保險起見break,是不是在這裡無限迴圈跑跑跑`,true);break}}this.printLogMessage(`4489844821, 離開了 syncTaskDispatcher()`)}isWait4ResultTask(hash){return this.mapOfHashNCallbackWrapper[hash]!==undefined}}var _default=exports.default=InfinitePool;
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _defineProperty2=_interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));var _lodash=_interopRequireDefault(require("lodash"));var _index2=require("../index.js");var _configerer=require("configerer");var _exceptioner=_interopRequireDefault(require("../exceptioner"));function _classPrivateFieldInitSpec(e,t,a){_checkPrivateRedeclaration(e,t),t.set(e,a)}function _checkPrivateRedeclaration(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function _classPrivateFieldGet(s,a){return s.get(_assertClassBrand(s,a))}function _assertClassBrand(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const SPECIFICITY_DEBUG=false;var _run=new WeakMap;class InfinitePool{constructor(maxWorkers=_configerer.configerer.POOLLER_WORKER_DEFAULT,name=_index2.utiller.getRandomValue(0,100000000000)){(0,_defineProperty2.default)(this,"isRunInBackgroundMode",false);(0,_defineProperty2.default)(this,"state",_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);(0,_defineProperty2.default)(this,"enableOfTaskSleepByInterval",_configerer.configerer.POOLLER_ENABLE_TASK_SLEEP_BY_INTERVAL);(0,_defineProperty2.default)(this,"taskSleepInterval",_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT);(0,_defineProperty2.default)(this,"enableOfTaskTimeout",_configerer.configerer.POOLLER_ENABLE_TIMEOUT);(0,_defineProperty2.default)(this,"timeOfTaskTimeout",_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT);(0,_defineProperty2.default)(this,"handlerOfAssignTaskFail",undefined);(0,_defineProperty2.default)(this,"maximumOfWorker",void 0);(0,_defineProperty2.default)(this,"disableFirstRun",false);(0,_defineProperty2.default)(this,"queueOfWaitingParam",[]);(0,_defineProperty2.default)(this,"countsOfRunByTimes",-1);(0,_defineProperty2.default)(this,"queueOfAssignTask",{});(0,_defineProperty2.default)(this,"queueOfExecutingTask",[]);(0,_defineProperty2.default)(this,"isQueuePolling",false);(0,_defineProperty2.default)(this,"initialTaskCompleted",false);(0,_defineProperty2.default)(this,"mapOfHashNTask",{});(0,_defineProperty2.default)(this,"mapOfHashNCallbackWrapper",{});(0,_defineProperty2.default)(this,"nameOfCurrentPool",``);(0,_defineProperty2.default)(this,"atomicBgInstance",undefined);(0,_defineProperty2.default)(this,"setPoolId",(id=this.nameOfCurrentPool)=>{this.nameOfCurrentPool=id});(0,_defineProperty2.default)(this,"getPoolId",()=>{return this.nameOfCurrentPool});(0,_defineProperty2.default)(this,"stopInBackground",async()=>{this.terminate();let attempts=0;const maxAttempts=30;while(_lodash.default.size(this.queueOfExecutingTask)>0&&attempts<maxAttempts){await _index2.utiller.syncDelay(500);this.printLogMessage(`784512, 卡在 stopInBackground 出不來,${this.getLogMessageOfExecutingTaskQueueCount()}`);this.showState();attempts++}if(_lodash.default.size(this.queueOfExecutingTask)>0){this.printLogMessage(`stopInBackground 超時,仍有 ${_lodash.default.size(this.queueOfExecutingTask)} 個任務在執行`,true);return false}return true});(0,_defineProperty2.default)(this,"isRunning",()=>{return this.isQueuePolling});(0,_defineProperty2.default)(this,"getCountOfAssignTaskInQueue",()=>{let size=0;for(const prior of _configerer.configerer.POOLLER_PRIORITY){size+=this.queueOfAssignTask[prior].length}return size});(0,_defineProperty2.default)(this,"add",(task,priority="low")=>{if(typeof task==="function"){if(_configerer.configerer.POOLLER_PRIORITY.indexOf(priority)<0){throw new _exceptioner.default(4001,`priority can't be ${priority}`)}const hash=_index2.utiller.getRandomHash();const taskInfo={task,hash};this.appendHashTaskMap(taskInfo);this.queueOfAssignTask[priority].push(taskInfo);return hash}else{throw new _exceptioner.default(4002,`task can't be ${typeof task}`)}});(0,_defineProperty2.default)(this,"updateExecuteTaskState",hash=>{const task=_lodash.default.find(this.queueOfExecutingTask,each=>_lodash.default.isEqual(each.hash,hash));if(task){this.printLogMessage(`847875153, 客端委託的任務: ${hash},更改狀態為 'ING'`);task.state="ING"}});(0,_defineProperty2.default)(this,"taskWrapper",(assignedTask,hashOfTask,param)=>()=>{const self=this;let timeoutHash="";let assignedTaskResult;let assignedTaskError;let isAssignedTaskCompleted=true;return new Promise((resolve,reject)=>{if(self.enableOfTaskTimeout){timeoutHash=setTimeout(()=>{try{this.printLogMessage(`982532, taskWrapper執行中,發生timeout: ${self.timeOfTaskTimeout} ms`);throw new _exceptioner.default(4010,self.getPoollerLogFormat(`TASK HASH:${hashOfTask} IS TIMEOUT ${self.timeOfTaskTimeout} ms ${param?`,PARAMS IS ${JSON.stringify(param)}`:""}`))}catch(error){reject(error)}},self.timeOfTaskTimeout)}this.printLogMessage(`984135, 客端委託的task開始執行 ${hashOfTask}`);self.updateExecuteTaskState(hashOfTask);assignedTask(param).then(result=>{this.printLogMessage(`984545, 客端委託的任務(TASK HASH:${hashOfTask}),resolve回應: ${result}`);assignedTaskResult=result;isAssignedTaskCompleted=true}).catch(error=>{this.printLogMessage(`989652, 客端委託的任務,reject回應: ${error.message}`,true,error);assignedTaskError=error;isAssignedTaskCompleted=false}).finally(()=>{clearTimeout(timeoutHash);resolve();this.printLogMessage(`98942,(TASK HASH:${hashOfTask}) taskWrapper()裡面第一個promise(為了timeout設計)完成了`)})}).then(()=>{if(!isAssignedTaskCompleted){throw assignedTaskError}else{this.printLogMessage(`9894841,(TASK HASH:${hashOfTask}) taskWrapper()裡面第二個promise(整個任務)完成了`);return`${this.getLogMessageOfTaskHash(hashOfTask)} completed`}}).catch(error=>{isAssignedTaskCompleted=false;assignedTaskError=error;if(!self.isWait4ResultTask(hashOfTask)){if(self.handlerOfAssignTaskFail!==undefined){try{self.handlerOfAssignTaskFail(assignedTaskError)}catch(handlerError){this.printLogMessage(`錯誤處理器執行失敗: ${handlerError.message}`,true,handlerError)}}else{this.printLogMessage(`任務執行失敗但未設置錯誤處理器: ${assignedTaskError.message}`,true,assignedTaskError)}}}).finally(()=>{const result={assignedTaskCompleted:isAssignedTaskCompleted,resolve:assignedTaskResult,reject:assignedTaskError};self.removeResolveOrRejectPromiseByHash(hashOfTask,result);this.printLogMessage(`98943213, ${this.getLogMessageOfTaskHash(hashOfTask)} taskWrapper()裡面第2個promise完成了`,false,result)})});(0,_defineProperty2.default)(this,"adds",(tasks,priority="low")=>{const hashes=[];if(_lodash.default.isArray(tasks)){for(const task of tasks){hashes.push(this.add(task,priority))}}else{throw new _exceptioner.default(4003,`should be async function array, not ${typeof tasks}`)}return hashes});(0,_defineProperty2.default)(this,"removeTaskMapByHash",hash=>{delete this.mapOfHashNTask[hash]});(0,_defineProperty2.default)(this,"beforeRun",()=>{this.isQueuePolling=true});(0,_defineProperty2.default)(this,"afterRun",()=>{this.clearCache()});(0,_defineProperty2.default)(this,"runInInfinite",async(task=[],interval)=>{this.beforeRun();if(_lodash.default.isFunction(task))this.add(task);else if(_lodash.default.isArray(task))this.adds(task);else throw new _exceptioner.default(4006,`type of task is ===> ${typeof task}`);this.enableTaskSleepInterval(_lodash.default.isNumber(interval),interval);this.setState(_configerer.configerer.POOLLER_STATE.RUN_INFINITE);while(!this.ruleOfStopInfiniteRun()){this.printLogMessage(`415123, runInInfinite() 正在無限Loop中, ${this.getLogMessageOfExecutingTaskQueueCount()}`);await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"ruleOfStopInfiniteRun",()=>{return!this.isRunning()&&this.isExecutingTaskQueueEmpty()});(0,_defineProperty2.default)(this,"isExecutingTaskQueueEmpty",()=>{return _lodash.default.size(this.queueOfExecutingTask)===0});(0,_defineProperty2.default)(this,"appendParamInToQueue",(...params)=>{this.triggerBgInstance();this.queueOfWaitingParam.push(...params)});(0,_defineProperty2.default)(this,"runByParams",async(functionOfAsyncTask,...params)=>{if(functionOfAsyncTask===undefined){functionOfAsyncTask=this.queueOfAssignTask["low"].shift().task}if(!_lodash.default.isFunction(functionOfAsyncTask))throw new _exceptioner.default(4006,`runByParams error, typeof task can't be ${typeof functionOfAsyncTask}`);if(!_lodash.default.isArray(params))throw new _exceptioner.default(4006,`runByParams error, typeof params can't be ${typeof params}`);this.beforeRun();this.add(functionOfAsyncTask);this.appendParamInToQueue(...params);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS);while(_lodash.default.size(this.queueOfWaitingParam)>0){await _classPrivateFieldGet(_run,this).call(this)}while(!this.isExecutingTaskQueueEmpty()){await _index2.utiller.syncDelay(100);this.printLogMessage(`等待執行中的任務完成,剩餘: ${_lodash.default.size(this.queueOfExecutingTask)}`)}this.printLogMessage(`951281952, runByParams() 結束了while()`);this.terminate()});(0,_defineProperty2.default)(this,"runByEachTask",async(tasks=[])=>{this.id=_index2.utiller.getRandomHash(15);this.beforeRun();this.adds(tasks);this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);while(!this.ruleOfStopInfiniteRun()){await _classPrivateFieldGet(_run,this).call(this,this.id);if(this.getCountOfAssignTaskInQueue()<=0){this.terminate();this.printLogMessage(`788121, runByEachTask() 因為 taskOfWaitingQueue 清空而停止`)}await _index2.utiller.syncDelay(10);this.printLogMessage(`788143, runByEachTask() 為了讓while不要停止運算`)}this.printLogMessage(`7881952, runByEachTask() 結束了while()`)});(0,_defineProperty2.default)(this,"runByTimes",async(functionOfAsyncTask,times=1)=>{if(this.maximumOfWorker!==1){this.printLogMessage(`警告: runByTimes 模式建議使用 1 個 worker,當前為 ${this.maximumOfWorker}`,true)}this.countsOfRunByTimes=times;this.add(functionOfAsyncTask);this.beforeRun();this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES);while(!this.ruleOfStopInfiniteRun()&&this.countsOfRunByTimes>0){await _classPrivateFieldGet(_run,this).call(this)}});(0,_defineProperty2.default)(this,"runInBackGround",(asyncfunc,...params)=>{this.isRunInBackgroundMode=true;if(!(typeof asyncfunc==="function")){throw new _exceptioner.default(4002,`_asyncfunc can't be ${typeof asyncfunc}`)}return setTimeout(async()=>{try{await asyncfunc.apply(this,params)}catch(error){if(error instanceof _exceptioner.default){this.printLogMessage(`7812123, runInBackGround() 執行錯誤: ${error.message}`,true,error)}else{throw new _exceptioner.default(4009,{message:`${this.getPoollerLogFormat("")}`},error)}}finally{this.terminate();this.printLogMessage(`7812123, runInBackGround() 走到finally`)}},1)});(0,_defineProperty2.default)(this,"getPoollerLogFormat",msg=>{return`POOLLER NAME: ${this.getPoolId()}${_lodash.default.isEmpty(msg)?"":" , "}${msg}`});(0,_defineProperty2.default)(this,"setTaskFailHandler",(listener=error=>console.log(error.message))=>{this.handlerOfAssignTaskFail=listener});(0,_defineProperty2.default)(this,"rulesOfAppendToExecutingTask",()=>{switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:return this.isRunning()&&!this.isExecutingQueueFull()&&_lodash.default.size(this.queueOfWaitingParam)>0;case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:return this.isRunning()&&!this.isExecutingQueueFull()&&this.getCountOfAssignTaskInQueue()>0;default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}});(0,_defineProperty2.default)(this,"appendTaskToExecuteQueue",(hash,promise)=>{if(_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES)){this.countsOfRunByTimes=this.countsOfRunByTimes-1}const task={state:"NOT",hash:hash,task:promise};this.printLogMessage(`4484451, 增加了一個assignedTask ${this.getLogMessageOfTaskHash(hash)} 到 QueueOfExecutingTask ,${this.getLogMessageOfExecutingTaskQueueCount()}`,false,task);this.queueOfExecutingTask.push(task)});(0,_defineProperty2.default)(this,"getLogMessageOfExecutingTaskQueueCount",()=>{return`ExecutingTaskQueueCount: ${_lodash.default.size(this.queueOfExecutingTask)}`});(0,_defineProperty2.default)(this,"getLogMessageOfAssignTaskQueueCount",()=>{return`AssignTaskQueueCount: ${this.getCountOfAssignTaskInQueue()}`});(0,_defineProperty2.default)(this,"getLogMessageOfTaskHash",hash=>{return`TASK HASH: ${hash}`});(0,_defineProperty2.default)(this,"showState",()=>{_index2.utiller.appendInfo(this.getPoollerLogFormat(`workerCount: ${this.maximumOfWorker}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`taskQueue(還在排隊的Task): ${this.getCountOfAssignTaskInQueue()}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`QueueOfExecutingTask(正在執行的AsyncTask, 超過workerCount就是bug): ${_lodash.default.size(this.queueOfExecutingTask)}`));_index2.utiller.appendInfo(this.getPoollerLogFormat(`mapOfHashNTask(還沒執行到的AsyncTask reference的暫存區): ${_lodash.default.size(this.mapOfHashNTask)}`))});_classPrivateFieldInitSpec(this,_run,async()=>{const self=this;async function execute(){const tasks=_lodash.default.filter(self.queueOfExecutingTask,each=>_lodash.default.isEqual(each.state,"NOT")).map(each=>{const taskWrapper=each.task;return taskWrapper()});self.printLogMessage(`454652321, 開始任務(taskWrapper): run() 裡面的execute開始執行, task(state = NOT)的長度 ${_lodash.default.size(tasks)}`);const result=_lodash.default.size(tasks)>0?await Promise.race(tasks):"4542131684, task is empty";self.printLogMessage(`54121445161, 結束任務(taskWrapper): run() 裡面的execute結束執行`);return result}async function emptyTask(){self.printLogMessage(`因為max count of worker為0,所以指派一個簡單的任務`);await _index2.utiller.syncDelay(10)}await this.syncTaskDispatcher();if(this.maximumOfWorker===0){await emptyTask()}else if(!this.isExecutingTaskQueueEmpty()){this.printLogMessage(`4512211, 開始任務(taskWrapper): ${this.getLogMessageOfExecutingTaskQueueCount()}`);const task=await execute();this.printLogMessage(`4512213 完畢任務(taskWrapper:${task}), ${this.getLogMessageOfExecutingTaskQueueCount()}, ${this.getLogMessageOfAssignTaskQueueCount()}`)}else{this.printLogMessage(`4574152 不應該走到這裏,但是 minor issue`,true)}if(this.queueOfExecutingTask.length>this.maximumOfWorker)this.printLogMessage(`4512214 一定是改壞了!!!!!!!!!!, ${this.getLogMessageOfExecutingTaskQueueCount} `,true);self.printLogMessage(`5478421212, 離開 run()`)});(0,_defineProperty2.default)(this,"getTaskInfoForRepetitiveRun",originalTaskInfo=>{const newTaskInfo={task:originalTaskInfo.task,hash:_index2.utiller.getRandomHash()};this.appendHashTaskMap(newTaskInfo);return newTaskInfo});(0,_defineProperty2.default)(this,"getTaskInfoDependOnPriority",()=>{for(const prior of _configerer.configerer.POOLLER_PRIORITY){if(this.queueOfAssignTask[prior].length>0){switch(this.state){case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:return this.queueOfAssignTask[prior].shift();case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:const originalTaskInfo=this.queueOfAssignTask[prior][0];return this.getTaskInfoForRepetitiveRun(originalTaskInfo);default:throw new _exceptioner.default(4005,`this.state ==> ${this.state}`)}}}if(!_lodash.default.isEqual(this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK))throw new _exceptioner.default(4007)});(0,_defineProperty2.default)(this,"removeResolveOrRejectPromiseByHash",(hash,result)=>{const callbackWrapper=this.mapOfHashNCallbackWrapper[hash];if(callbackWrapper!==undefined){this.printLogMessage(`5644153248, removeResolveOrRejectPromiseByHash 拿掉了完成的任務(${this.getLogMessageOfTaskHash(hash)})`);try{callbackWrapper(result)}catch(callbackError){this.printLogMessage(`回調執行失敗: ${callbackError.message}`,true,callbackError)}finally{delete this.mapOfHashNCallbackWrapper[hash]}}this.removePromiseFromExecutingQueue(hash)});(0,_defineProperty2.default)(this,"removePromiseFromExecutingQueue",hash=>{this.printLogMessage(`56448412, QueueOfExecutingTask 拿掉了完成的任務 ${this.getLogMessageOfTaskHash(hash)}`);_lodash.default.remove(this.queueOfExecutingTask,each=>_lodash.default.isEqual(hash,each.hash))});(0,_defineProperty2.default)(this,"runInfiniteInBackground",(functionOfAsyncTask,interval)=>{return this.invokeInstanceOfBackground(this.runInInfinite,functionOfAsyncTask,interval)});(0,_defineProperty2.default)(this,"runByParamInBackGround",(functionOfAsyncTask,...params)=>{return this.invokeInstanceOfBackground(this.runByParams,functionOfAsyncTask,...params)});(0,_defineProperty2.default)(this,"runByTimesInBackGround",(functionOfAsyncTask,times)=>{return this.invokeInstanceOfBackground(this.runByTimes,functionOfAsyncTask,times)});(0,_defineProperty2.default)(this,"runByEachTaskInBackGround",(...params)=>{return this.invokeInstanceOfBackground(this.runByEachTask,...params)});(0,_defineProperty2.default)(this,"invokeInstanceOfBackground",(state,...params)=>{if(this.atomicBgInstance!==undefined)clearTimeout(this.atomicBgInstance);this.atomicBgInstance=this.runInBackGround(state,...params);return this});this.maximumOfWorker=maxWorkers;this.setPoolId(_lodash.default.toString(name));for(const prior of _configerer.configerer.POOLLER_PRIORITY){this.queueOfAssignTask[prior]=[]}}enableQueueTerminateBySleepCount(enable=true,interval=_configerer.configerer.POOLLER_QUEUE_TIME_OF_SLEEP_INTERVAL_DEFAULT,times=_configerer.configerer.POOLLER_QUEUE_MAX_SLEEP_COUNTS_DEFAULT){this.enableOfQueueTerminateSleepCount=enable;this.queueMaxSleepCounts=times;this.intervalOfQueueSleep=interval}clearCache(){this.queueOfExecutingTask.length=0;this.mapOfHashNTask={};this.queueOfAssignTask={}}terminate(){this.isQueuePolling=false}printLogMessage(message,error=false,...infos){if(SPECIFICITY_DEBUG)_index2.utiller.printLogMessage(this.getPoollerLogFormat(message),error,...infos)}setWorker(counts){this.maximumOfWorker=counts}cleanTaskInterval(){this.taskSleepInterval={min:0,max:0}}enableTaskSleepInterval(enable=true,interval=_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT){this.enableOfTaskSleepByInterval=enable;if(_lodash.default.isNumber(interval)){interval={min:interval,max:interval}}this.taskSleepInterval=interval}enableTaskTimeout(enable=true,millionSec=_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT){this.enableOfTaskTimeout=enable;this.timeOfTaskTimeout=millionSec}async addTaskAndWait4Result(asyncTask,priority="low",taskName="noName"){this.triggerBgInstance();return new Promise((resolve,reject)=>{const callbackWrapper=result=>{if(result.assignedTaskCompleted){resolve(result.resolve)}else{reject(result.reject)}};const hash=this.add(asyncTask,priority);this.registerHash4Result(hash,callbackWrapper)})}registerHash4Result(hash,callback){this.mapOfHashNCallbackWrapper[hash]=callback}appendHashTaskMap(taskInfo){this.mapOfHashNTask[taskInfo.hash]=taskInfo}getTaskInfoByHash(hash){return this.mapOfHashNTask[hash]}remove(hash){let taskInfo=this.getTaskInfoByHash(hash);if(taskInfo){for(const prior of _configerer.configerer.POOLLER_PRIORITY){const _index=_lodash.default.indexOf(this.queueOfAssignTask[prior],taskInfo);if(_index>=0){this.queueOfAssignTask[prior].splice(_index,1);this.removeTaskMapByHash(hash);return true}}return false}else{throw new _exceptioner.default(4004,hash)}}setState(_state){this.state=_state}checkAndMarkInitialTaskStatus(){if(!this.initialTaskCompleted){this.initialTaskCompleted=true;return false}return this.initialTaskCompleted}setDisableFirstRun(disable=true){this.disableFirstRun=disable}triggerBgInstance(){if(!this.isRunInBackgroundMode||this.isQueuePolling){return}if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.runByEachTaskInBackGround();return}else if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS){this.runByParamInBackGround();return}throw new _exceptioner.default(4011,`this.state is ==> ${_index2.utiller.getItsKeyByValue(_configerer.configerer.POOLLER_STATE,this.state)}`)}isExecutingQueueFull(){return _lodash.default.size(this.queueOfExecutingTask)>=this.maximumOfWorker}isTaskQueueEmpty(){return this.getCountOfAssignTaskInQueue()===0}async syncTaskDispatcher(){this.printLogMessage(`448984466, 走進來了 syncTaskDispatcher()`);const initialTaskShouldNotRun=this.disableFirstRun&&!this.checkAndMarkInitialTaskStatus();const isExecutingTaskAlmostFull=this.queueOfExecutingTask.length>=this.maximumOfWorker-1;const comparison=this.checkAndMarkInitialTaskStatus()&&isExecutingTaskAlmostFull&&this.enableOfTaskSleepByInterval;if(initialTaskShouldNotRun||comparison){const restInInterval=await _index2.utiller.syncDelayRandom(this.taskSleepInterval.min,this.taskSleepInterval.max);this.printLogMessage(`4484121, 走到睡覺區 enableOfTaskSleepByInterval:${this.enableOfTaskSleepByInterval} || ${restInInterval} ms`)}while(this.rulesOfAppendToExecutingTask()){const taskInfo=this.getTaskInfoDependOnPriority();if(taskInfo){const promise=this.taskWrapper(taskInfo.task,taskInfo.hash,this.queueOfWaitingParam.shift());if(this.state===_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK){this.removeTaskMapByHash(taskInfo.hash)}this.appendTaskToExecuteQueue(taskInfo.hash,promise)}else{this.printLogMessage(`848451 也許有未知的issue,保險起見break`,true);break}}this.printLogMessage(`4489844821, 離開了 syncTaskDispatcher()`)}isWait4ResultTask(hash){return this.mapOfHashNCallbackWrapper[hash]!==undefined}}var _default=exports.default=InfinitePool;
|
package/package.json
CHANGED