utiller 1.0.397 → 1.0.398

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.
@@ -1,1044 +1 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports["default"] = void 0;
8
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
10
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
- var _lodash = _interopRequireDefault(require("lodash"));
15
- var _index2 = require("../index.js");
16
- var _configerer = require("configerer");
17
- var _exceptioner = _interopRequireDefault(require("../exceptioner"));
18
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
19
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
20
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
21
- function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
22
- function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
23
- function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
24
- 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"); }
25
- /**
26
- *
27
- Pooller 有以下特點:
28
- 1.task可以設定timeout
29
- 2.queue滿了的可以設定task interval
30
- 3.如果是runByEachTask length, queue裡面沒有task時,可以設定sleeptime, 以及Sleepcounts
31
- 4.task 可以cancelled by hash
32
- 5.runByParams,runByTimes,runInInfinite,runByEachTask
33
- 6.可以設定taskFailHandler, 這樣遇到錯誤就不會停掉poollers
34
- *
35
- */
36
- var SPECIFICITY_DEBUG = false;
37
- var _run = /*#__PURE__*/new WeakMap();
38
- var InfinitePool = /*#__PURE__*/function () {
39
- function InfinitePool() {
40
- var _this = this;
41
- var maxWorkers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _configerer.configerer.POOLLER_WORKER_DEFAULT;
42
- var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _index2.utiller.getRandomValue(0, 100000000000);
43
- (0, _classCallCheck2["default"])(this, InfinitePool);
44
- (0, _defineProperty2["default"])(this, "isRunInBackgroundMode", false);
45
- (0, _defineProperty2["default"])(this, "state", _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);
46
- /** 用來處理Task的延遲,假設要偷網頁東西, 不能太頻繁, 要偽裝成手動只能透過這方式, 如果是multi thread, 延遲是針對worker滿載後,再加進去的那一個 */
47
- (0, _defineProperty2["default"])(this, "enableOfTaskSleepByInterval", _configerer.configerer.POOLLER_ENABLE_TASK_SLEEP_BY_INTERVAL);
48
- (0, _defineProperty2["default"])(this, "taskSleepInterval", _configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT);
49
- /** 用來處理每一個task的timeout, 避免task處理太久卡在Queue裡面 */
50
- (0, _defineProperty2["default"])(this, "enableOfTaskTimeout", _configerer.configerer.POOLLER_ENABLE_TIMEOUT);
51
- (0, _defineProperty2["default"])(this, "timeOfTaskTimeout", _configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT);
52
- /** 如果要讓每個pool不會因為task掉進catch 而被中斷, 就必須加入taskFailHandler*/
53
- (0, _defineProperty2["default"])(this, "handlerOfAssignTaskFail", undefined);
54
- (0, _defineProperty2["default"])(this, "maximumOfWorker", void 0);
55
- /** 如果設定sleep interval, 可以加這個參數要不要先執行第一次 再開始 interval 機制*/
56
- (0, _defineProperty2["default"])(this, "disableFirstRun", false);
57
- /** 用於 runByParam */
58
- (0, _defineProperty2["default"])(this, "queueOfWaitingParam", []);
59
- /** runByTimes 的次數 */
60
- (0, _defineProperty2["default"])(this, "countsOfRunByTimes", -1);
61
- /** 裡面放 {high:[], low:[], medium }
62
- * taskQueue就是指裡面有多少Task!
63
- * 通常Infinite模式,裡面只會有一個asyncTask
64
- * */
65
- (0, _defineProperty2["default"])(this, "queueOfAssignTask", {});
66
- /** 裡面放準備執行中的Task(worker正在工作的Task), 這邊的task就沒辦法remove了
67
- * 一次能處理幾個取決於maxWorker
68
- * */
69
- (0, _defineProperty2["default"])(this, "queueOfExecutingTask", []);
70
- /** [{state: 'NOT', hash: hash, task: functionOfAsyncTask} ]*/
71
- (0, _defineProperty2["default"])(this, "isQueuePolling", false);
72
- /** 目前queue機制是while(isQueuePolling) 沒任務就睡一下, 有任務就做事情, 發現task有延遲, 就要注意是不是taskInterval*/
73
- (0, _defineProperty2["default"])(this, "initialTaskCompleted", false);
74
- (0, _defineProperty2["default"])(this, "mapOfHashNTask", {});
75
- /** 為了刪除未執行的task, 但只限於runByTask, 因為下一個run之後, hash就改變了 */
76
- (0, _defineProperty2["default"])(this, "mapOfHashNCallbackWrapper", {});
77
- (0, _defineProperty2["default"])(this, "nameOfCurrentPool", "");
78
- (0, _defineProperty2["default"])(this, "setPoolId", function () {
79
- var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.nameOfCurrentPool;
80
- _this.nameOfCurrentPool = id;
81
- });
82
- (0, _defineProperty2["default"])(this, "getPoolId", function () {
83
- return _this.nameOfCurrentPool;
84
- });
85
- /** return true if task completed, after 15 secs, force leave
86
- * TODO:應該要設計成當terminate後, 監聽executingTaskInQueue為零時,回傳結束 */
87
- (0, _defineProperty2["default"])(this, "stopInBackground", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
88
- var attempts, maxAttempts;
89
- return _regenerator["default"].wrap(function _callee$(_context) {
90
- while (1) switch (_context.prev = _context.next) {
91
- case 0:
92
- _this.terminate();
93
- attempts = 0;
94
- maxAttempts = 30; // 30 * 500ms = 15 seconds wait
95
- case 3:
96
- if (!(_lodash["default"].size(_this.queueOfExecutingTask) > 0 && attempts < maxAttempts)) {
97
- _context.next = 11;
98
- break;
99
- }
100
- _context.next = 6;
101
- return _index2.utiller.syncDelay(500);
102
- case 6:
103
- _this.printLogMessage("784512, \u54AC\u5728 stopInBackground \u51FA\u4E0D\u4F86,".concat(_this.getLogMessageOfExecutingTaskQueueCount()));
104
- _this.showState();
105
- attempts++;
106
- _context.next = 3;
107
- break;
108
- case 11:
109
- return _context.abrupt("return", true);
110
- case 12:
111
- case "end":
112
- return _context.stop();
113
- }
114
- }, _callee);
115
- })));
116
- (0, _defineProperty2["default"])(this, "isRunning", function () {
117
- return _this.isQueuePolling;
118
- });
119
- (0, _defineProperty2["default"])(this, "getCountOfAssignTaskInQueue", function () {
120
- var size = 0;
121
- var _iterator = _createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),
122
- _step;
123
- try {
124
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
125
- var prior = _step.value;
126
- size += _this.queueOfAssignTask[prior].length;
127
- }
128
- } catch (err) {
129
- _iterator.e(err);
130
- } finally {
131
- _iterator.f();
132
- }
133
- return size;
134
- });
135
- /** 3:low,2:medium,1:high */
136
- /** add the task into queueOfAssignTask, return task key,once you want to remove it */
137
- (0, _defineProperty2["default"])(this, "add", function (task) {
138
- var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "low";
139
- if (typeof task === "function") {
140
- if (_configerer.configerer.POOLLER_PRIORITY.indexOf(priority) < 0) {
141
- throw new _exceptioner["default"](4001, "priority can't be ".concat(priority));
142
- }
143
- var hash = _index2.utiller.getRandomHash();
144
- var taskInfo = {
145
- task: task,
146
- hash: hash
147
- };
148
- _this.appendHashTaskMap(taskInfo);
149
- _this.queueOfAssignTask[priority].push(taskInfo);
150
- return hash;
151
- } else {
152
- throw new _exceptioner["default"](4002, "task can't be ".concat((0, _typeof2["default"])(task)));
153
- }
154
- });
155
- (0, _defineProperty2["default"])(this, "updateExecuteTaskState", function (hash) {
156
- var self = _this;
157
- var task = _lodash["default"].find(_this.queueOfExecutingTask, function (each) {
158
- return _lodash["default"].isEqual(each.hash, hash);
159
- });
160
- if (task) {
161
- _this.printLogMessage("847875153, \u5BA2\u7AEF\u59D4\u8A17\u7684\u4EFB\u52D9: ".concat(hash, ",\u66F4\u6539\u72C0\u614B\u70BA 'ING'"));
162
- task.state = "ING";
163
- }
164
- });
165
- /** 這裡的設計是利用兩個promise, 一個為了timeout , 一個被客端委託的task */
166
- (0, _defineProperty2["default"])(this, "taskWrapper", function (assignedTask, hashOfTask, param) {
167
- return function () {
168
- var self = _this;
169
- var timeoutHash = "";
170
- var assignedTaskResult;
171
- var assignedTaskError;
172
- var isAssignedTaskCompleted = true;
173
- /** 用來判斷task 有沒有走到 catch裡面, 不然resolve了但return undefined, task會不知所措 */
174
- return new Promise(function (resolve, reject) {
175
- if (self.enableOfTaskTimeout) {
176
- timeoutHash = setTimeout(function () {
177
- try {
178
- _this.printLogMessage("982532, taskWrapper\u57F7\u884C\u4E2D,\u767C\u751Ftimout: ".concat(self.timeOfTaskTimeout, " ms"));
179
- throw new _exceptioner["default"](4010, self.getPoollerLogFormat("TASK HASH:".concat(hashOfTask, " IS TIMEOUT ").concat(self.timeOfTaskTimeout, " ms ").concat(param ? ",PARAMS IS ".concat(JSON.stringify(param)) : "")));
180
- } catch (error) {
181
- reject(error);
182
- }
183
- }, self.timeOfTaskTimeout);
184
- }
185
- /** 客端委託的task的是從這裡開始 */
186
- _this.printLogMessage("984135, \u5BA2\u7AEF\u59D4\u8A17\u7684task\u958B\u59CB\u57F7\u884C ".concat(hashOfTask));
187
- self.updateExecuteTaskState(hashOfTask);
188
- assignedTask(param).then(function (result) {
189
- _this.printLogMessage("984545, \u5BA2\u7AEF\u59D4\u8A17\u7684\u4EFB\u52D9(TASK HASH:".concat(hashOfTask, "),resolve\u56DE\u61C9: ").concat(result));
190
- assignedTaskResult = result;
191
- isAssignedTaskCompleted = true;
192
- })["catch"](function (error) {
193
- _this.printLogMessage("989652, \u5BA2\u7AEF\u59D4\u8A17\u7684\u4EFB\u52D9,reject\u56DE\u61C9: ".concat(error.message), true, error);
194
- assignedTaskError = error;
195
- isAssignedTaskCompleted = false;
196
- })["finally"](function () {
197
- clearTimeout(timeoutHash);
198
- resolve();
199
- _this.printLogMessage("98942,(TASK HASH:".concat(hashOfTask, ") taskWrapper()\u88E1\u9762\u7B2C\u4E00\u500Bpromise(\u70BA\u4E86timeout\u8A2D\u8A08)\u5B8C\u6210\u4E86"));
200
- });
201
- }).then(function (result) {
202
- /** 能走到這裡,代表沒有timeout的狀況下,執行了委託的任務 */
203
- if (!isAssignedTaskCompleted) {
204
- throw assignedTaskError;
205
- } else {
206
- _this.printLogMessage("9894841,(TASK HASH:".concat(hashOfTask, ") taskWrapper()\u88E1\u9762\u7B2C\u4E8C\u500Bpromise(\u6574\u500B\u4EFB\u52D9)\u5B8C\u6210\u4E86"));
207
- return "".concat(_this.getLogMessageOfTaskHash(hashOfTask), " completed");
208
- }
209
- })["catch"](function (error) {
210
- /** 如果發生timeout 或是 客端任務掉進去catch都會跑到這裡 */
211
- isAssignedTaskCompleted = false;
212
- assignedTaskError = error;
213
- /** 如果是Wait4ResultTask模式, 要把catch | result 回到callbackWrapper */
214
- if (!self.isWait4ResultTask(hashOfTask)) {
215
- if (self.handlerOfAssignTaskFail !== undefined) {
216
- self.handlerOfAssignTaskFail(assignedTaskError);
217
- } else throw assignedTaskError;
218
- }
219
- })["finally"](function () {
220
- var result = {
221
- assignedTaskCompleted: isAssignedTaskCompleted,
222
- resolve: assignedTaskResult,
223
- reject: assignedTaskError
224
- };
225
- self.removeResolveOrRejectPromiseByHash(hashOfTask, result);
226
- _this.printLogMessage("98943213, ".concat(_this.getLogMessageOfTaskHash(hashOfTask), " taskWrapper()\u88E1\u9762\u7B2C2\u500Bpromise\u5B8C\u6210\u4E86"), false, result);
227
- });
228
- };
229
- });
230
- (0, _defineProperty2["default"])(this, "adds", function (tasks) {
231
- var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "low";
232
- var hashes = [];
233
- if (_lodash["default"].isArray(tasks)) {
234
- var _iterator2 = _createForOfIteratorHelper(tasks),
235
- _step2;
236
- try {
237
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
238
- var task = _step2.value;
239
- hashes.push(_this.add(task, priority));
240
- }
241
- } catch (err) {
242
- _iterator2.e(err);
243
- } finally {
244
- _iterator2.f();
245
- }
246
- } else {
247
- throw new _exceptioner["default"](4003, "should be async function array, not ".concat((0, _typeof2["default"])(tasks)));
248
- }
249
- return hashes;
250
- });
251
- (0, _defineProperty2["default"])(this, "removeTaskMapByHash", function (hash) {
252
- delete _this.mapOfHashNTask[hash];
253
- });
254
- (0, _defineProperty2["default"])(this, "beforeRun", function () {
255
- _this.isQueuePolling = true;
256
- /** 有點多餘的設計, 本來是想要當沒有task時, 有個house-keeping的設計, 但發現只要在任務加入時, 觸發runByEachTask即可
257
- this.currentSleepCounts = 0;
258
- */
259
- });
260
- (0, _defineProperty2["default"])(this, "afterRun", function () {
261
- _this.clearCache();
262
- });
263
- /** interval was the time between tasks when queueOfExecutingTask is full.
264
- * run would infinite, in default, intervalOfQueueSleep over 100 times, pooller would shutdown */
265
- (0, _defineProperty2["default"])(this, "runInInfinite", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
266
- var task,
267
- interval,
268
- _args2 = arguments;
269
- return _regenerator["default"].wrap(function _callee2$(_context2) {
270
- while (1) switch (_context2.prev = _context2.next) {
271
- case 0:
272
- task = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : [];
273
- interval = _args2.length > 1 ? _args2[1] : undefined;
274
- _this.beforeRun();
275
- if (!_lodash["default"].isFunction(task)) {
276
- _context2.next = 7;
277
- break;
278
- }
279
- _this.add(task);
280
- _context2.next = 12;
281
- break;
282
- case 7:
283
- if (!_lodash["default"].isArray(task)) {
284
- _context2.next = 11;
285
- break;
286
- }
287
- _this.adds(task);
288
- _context2.next = 12;
289
- break;
290
- case 11:
291
- throw new _exceptioner["default"](4006, "type of task is ===> ".concat((0, _typeof2["default"])(task)));
292
- case 12:
293
- _this.enableTaskSleepInterval(_lodash["default"].isNumber(interval), interval);
294
- _this.setState(_configerer.configerer.POOLLER_STATE.RUN_INFINITE);
295
- case 14:
296
- if (_this.ruleOfStopInfiniteRun()) {
297
- _context2.next = 20;
298
- break;
299
- }
300
- _this.printLogMessage("415123, runInInfinite() \u6B63\u5728\u7121\u9650Loop\u4E2D, ".concat(_this.getLogMessageOfExecutingTaskQueueCount()));
301
- _context2.next = 18;
302
- return _classPrivateFieldGet(_run, _this).call(_this);
303
- case 18:
304
- _context2.next = 14;
305
- break;
306
- case 20:
307
- case "end":
308
- return _context2.stop();
309
- }
310
- }, _callee2);
311
- })));
312
- /** 我的設計是,如果放到了executingQueue裡面,就必須執行完畢,清空executingTaskQueue才能真正的結束*/
313
- (0, _defineProperty2["default"])(this, "ruleOfStopInfiniteRun", function () {
314
- return !_this.isRunning() && _this.isExecutingTaskQueueEmpty();
315
- });
316
- (0, _defineProperty2["default"])(this, "isExecutingTaskQueueEmpty", function () {
317
- return _lodash["default"].size(_this.queueOfExecutingTask) === 0;
318
- });
319
- (0, _defineProperty2["default"])(this, "appendParamInToQueue", function () {
320
- var _this$queueOfWaitingP;
321
- _this.triggerBgInstance();
322
- (_this$queueOfWaitingP = _this.queueOfWaitingParam).push.apply(_this$queueOfWaitingP, arguments);
323
- });
324
- /** run time by params length, param有可能會是undefined, 要在functionOfAsyncTask判斷 */
325
- (0, _defineProperty2["default"])(this, "runByParams", /*#__PURE__*/function () {
326
- var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(functionOfAsyncTask) {
327
- var _len,
328
- params,
329
- _key,
330
- _args3 = arguments;
331
- return _regenerator["default"].wrap(function _callee3$(_context3) {
332
- while (1) switch (_context3.prev = _context3.next) {
333
- case 0:
334
- for (_len = _args3.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
335
- params[_key - 1] = _args3[_key];
336
- }
337
- if (functionOfAsyncTask === undefined) {
338
- functionOfAsyncTask = _this.queueOfAssignTask["low"].shift().task;
339
- }
340
- if (_lodash["default"].isFunction(functionOfAsyncTask)) {
341
- _context3.next = 4;
342
- break;
343
- }
344
- throw new _exceptioner["default"](4006, "runByParams error, typeof task can't be ".concat((0, _typeof2["default"])(functionOfAsyncTask)));
345
- case 4:
346
- if (_lodash["default"].isArray(params)) {
347
- _context3.next = 6;
348
- break;
349
- }
350
- throw new _exceptioner["default"](4006, "runByParams error, typeof params can't be ".concat((0, _typeof2["default"])(params)));
351
- case 6:
352
- _this.beforeRun();
353
- _this.add(functionOfAsyncTask);
354
- _this.appendParamInToQueue.apply(_this, params);
355
- _this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS);
356
- case 10:
357
- if (!(!_this.ruleOfStopInfiniteRun() && _lodash["default"].size(_this.queueOfWaitingParam) > 0)) {
358
- _context3.next = 15;
359
- break;
360
- }
361
- _context3.next = 13;
362
- return _classPrivateFieldGet(_run, _this).call(_this);
363
- case 13:
364
- _context3.next = 10;
365
- break;
366
- case 15:
367
- case "end":
368
- return _context3.stop();
369
- }
370
- }, _callee3);
371
- }));
372
- return function (_x) {
373
- return _ref3.apply(this, arguments);
374
- };
375
- }());
376
- (0, _defineProperty2["default"])(this, "runByEachTask", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
377
- var tasks,
378
- self,
379
- _args4 = arguments;
380
- return _regenerator["default"].wrap(function _callee4$(_context4) {
381
- while (1) switch (_context4.prev = _context4.next) {
382
- case 0:
383
- tasks = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : [];
384
- self = _this;
385
- _this.id = _index2.utiller.getRandomHash(15);
386
- _this.beforeRun();
387
- _this.adds(tasks);
388
- _this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);
389
- case 6:
390
- if (_this.ruleOfStopInfiniteRun()) {
391
- _context4.next = 15;
392
- break;
393
- }
394
- _context4.next = 9;
395
- return _classPrivateFieldGet(_run, _this).call(_this, _this.id);
396
- case 9:
397
- if (_this.getCountOfAssignTaskInQueue() <= 0) {
398
- _this.terminate();
399
- _this.printLogMessage("788121, runByEachTask() \u56E0\u70BA taskOfWaitingQueue \u6E05\u7A7A\u800C\u505C\u6B62");
400
- }
401
-
402
- /** 為了讓while不要停止運算 !this.ruleOfStopInfiniteRun(),不然 runByTask不會停止 */
403
- _context4.next = 12;
404
- return _index2.utiller.syncDelay(10);
405
- case 12:
406
- _this.printLogMessage("788143, runByEachTask() \u70BA\u4E86\u8B93while\u4E0D\u8981\u505C\u6B62\u904B\u7B97");
407
- _context4.next = 6;
408
- break;
409
- case 15:
410
- _this.printLogMessage("7881952, runByEachTask() \u7D50\u675F\u4E86while()");
411
- case 16:
412
- case "end":
413
- return _context4.stop();
414
- }
415
- }, _callee4);
416
- })));
417
- /** run times wound be depend on times, task would by loop and sync in given order
418
- * runByTimes目前只支援1個worker
419
- * */
420
- (0, _defineProperty2["default"])(this, "runByTimes", /*#__PURE__*/function () {
421
- var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(functionOfAsyncTask) {
422
- var times,
423
- _args5 = arguments;
424
- return _regenerator["default"].wrap(function _callee5$(_context5) {
425
- while (1) switch (_context5.prev = _context5.next) {
426
- case 0:
427
- times = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : 1;
428
- _this.countsOfRunByTimes = times;
429
- _this.add(functionOfAsyncTask);
430
- _this.beforeRun();
431
- _this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES);
432
- case 5:
433
- if (!(!_this.ruleOfStopInfiniteRun() && _this.countsOfRunByTimes > 0)) {
434
- _context5.next = 10;
435
- break;
436
- }
437
- _context5.next = 8;
438
- return _classPrivateFieldGet(_run, _this).call(_this);
439
- case 8:
440
- _context5.next = 5;
441
- break;
442
- case 10:
443
- case "end":
444
- return _context5.stop();
445
- }
446
- }, _callee5);
447
- }));
448
- return function (_x2) {
449
- return _ref5.apply(this, arguments);
450
- };
451
- }());
452
- /** what it means, like a thread run in background, */
453
- (0, _defineProperty2["default"])(this, "runInBackGround", function (asyncfunc) {
454
- for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
455
- params[_key2 - 1] = arguments[_key2];
456
- }
457
- _this.isRunInBackgroundMode = true;
458
- if (!(typeof asyncfunc === "function")) {
459
- throw new _exceptioner["default"](4002, "_asyncfunc can't be ".concat((0, _typeof2["default"])(asyncfunc)));
460
- }
461
- return setTimeout( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
462
- return _regenerator["default"].wrap(function _callee6$(_context6) {
463
- while (1) switch (_context6.prev = _context6.next) {
464
- case 0:
465
- _context6.prev = 0;
466
- _context6.next = 3;
467
- return asyncfunc.apply(_this, params);
468
- case 3:
469
- _context6.next = 12;
470
- break;
471
- case 5:
472
- _context6.prev = 5;
473
- _context6.t0 = _context6["catch"](0);
474
- if (!(_context6.t0 instanceof _exceptioner["default"])) {
475
- _context6.next = 11;
476
- break;
477
- }
478
- _this.printLogMessage("7812123, runInBackGround() \u57F7\u884C\u932F\u8AA4: ".concat(_context6.t0.message), true, _context6.t0);
479
- _context6.next = 12;
480
- break;
481
- case 11:
482
- throw new _exceptioner["default"](4009, {
483
- message: "".concat(_this.getPoollerLogFormat(""))
484
- }, _context6.t0);
485
- case 12:
486
- _context6.prev = 12;
487
- _this.terminate();
488
- _this.printLogMessage("7812123, runInBackGround() \u8D70\u5230finally");
489
- return _context6.finish(12);
490
- case 16:
491
- case "end":
492
- return _context6.stop();
493
- }
494
- }, _callee6, null, [[0, 5, 12, 16]]);
495
- })), 1);
496
- });
497
- (0, _defineProperty2["default"])(this, "getPoollerLogFormat", function (msg) {
498
- return "POOLLER NAME: ".concat(_this.getPoolId()).concat(_lodash["default"].isEmpty(msg) ? "" : " , ").concat(msg);
499
- });
500
- (0, _defineProperty2["default"])(this, "setTaskFailHandler", function () {
501
- var listener = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (error) {
502
- return console.log(error.message);
503
- };
504
- _this.handlerOfAssignTaskFail = listener;
505
- });
506
- /** 把assignedTask 加入到 QueueOfExecutingTask 的規則*/
507
- (0, _defineProperty2["default"])(this, "rulesOfAppendToExecutingTask", function () {
508
- switch (_this.state) {
509
- case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:
510
- return _this.isRunning() && !_this.isExecutingQueueFull() && _this.getCountOfAssignTaskInQueue() > 0;
511
- case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:
512
- return _this.isRunning() && !_this.isExecutingQueueFull() && _lodash["default"].size(_this.queueOfWaitingParam) > 0;
513
- case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:
514
- case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:
515
- // 這三種模式的任務數在 AssignTaskQueue 中只有一個或一組
516
- return _this.isRunning() && !_this.isExecutingQueueFull() && _this.getCountOfAssignTaskInQueue() > 0;
517
- default:
518
- throw new _exceptioner["default"](4005, "this.state ==> ".concat(_this.state));
519
- }
520
- });
521
- (0, _defineProperty2["default"])(this, "appendTaskToExecuteQueue", function (hash, promise) {
522
- if (_lodash["default"].isEqual(_this.state, _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES)) {
523
- _this.countsOfRunByTimes = _this.countsOfRunByTimes - 1;
524
- }
525
- var task = {
526
- state: "NOT",
527
- hash: hash,
528
- task: promise
529
- };
530
- _this.printLogMessage("4484451, \u589E\u52A0\u4E86\u4E00\u500BassignedTask ".concat(_this.getLogMessageOfTaskHash(hash), " \u5230 QueueOfExecutingTask ,").concat(_this.getLogMessageOfExecutingTaskQueueCount), false, task);
531
- _this.queueOfExecutingTask.push(task);
532
- });
533
- (0, _defineProperty2["default"])(this, "getLogMessageOfExecutingTaskQueueCount", function () {
534
- return "ExecutingTaskQueueCount: ".concat(_lodash["default"].size(_this.queueOfExecutingTask));
535
- });
536
- (0, _defineProperty2["default"])(this, "getLogMessageOfAssignTaskQueueCount", function () {
537
- return "AssignTaskQueueCount: ".concat(_this.getCountOfAssignTaskInQueue());
538
- });
539
- (0, _defineProperty2["default"])(this, "getLogMessageOfTaskHash", function (hash) {
540
- return "TASK HASH: ".concat(hash);
541
- });
542
- (0, _defineProperty2["default"])(this, "showState", function () {
543
- _index2.utiller.appendInfo(_this.getPoollerLogFormat("workerCount: ".concat(_this.maximumOfWorker)));
544
- _index2.utiller.appendInfo(_this.getPoollerLogFormat("taskQueue(\u9084\u5728\u6392\u968A\u7684Task): ".concat(_this.getCountOfAssignTaskInQueue())));
545
- _index2.utiller.appendInfo(_this.getPoollerLogFormat("QueueOfExecutingTask(\u6B63\u5728\u57F7\u884C\u7684AsyncTask, \u8D85\u904EworkerCount\u5C31\u662Fbug): ".concat(_lodash["default"].size(_this.queueOfExecutingTask))));
546
- _index2.utiller.appendInfo(_this.getPoollerLogFormat("mapOfHashNTask(\u9084\u6C92\u57F7\u884C\u5230\u7684AsyncTask reference\u7684\u66AB\u5B58\u5340): ".concat(_lodash["default"].size(_this.mapOfHashNTask))));
547
- });
548
- _classPrivateFieldInitSpec(this, _run, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
549
- var self, execute, _execute, emptyTask, _emptyTask, task;
550
- return _regenerator["default"].wrap(function _callee9$(_context9) {
551
- while (1) switch (_context9.prev = _context9.next) {
552
- case 0:
553
- _emptyTask = function _emptyTask3() {
554
- _emptyTask = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
555
- return _regenerator["default"].wrap(function _callee8$(_context8) {
556
- while (1) switch (_context8.prev = _context8.next) {
557
- case 0:
558
- self.printLogMessage("\u56E0\u70BAmax count of worker\u70BA0\uFF0C\u6240\u4EE5\u6307\u6D3E\u4E00\u500B\u7C21\u55AE\u7684\u4EFB\u52D9");
559
- _context8.next = 3;
560
- return _index2.utiller.syncDelay(10);
561
- case 3:
562
- case "end":
563
- return _context8.stop();
564
- }
565
- }, _callee8);
566
- }));
567
- return _emptyTask.apply(this, arguments);
568
- };
569
- emptyTask = function _emptyTask2() {
570
- return _emptyTask.apply(this, arguments);
571
- };
572
- _execute = function _execute3() {
573
- _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
574
- var tasks, result;
575
- return _regenerator["default"].wrap(function _callee7$(_context7) {
576
- while (1) switch (_context7.prev = _context7.next) {
577
- case 0:
578
- tasks = _lodash["default"].filter(self.queueOfExecutingTask, function (each) {
579
- return _lodash["default"].isEqual(each.state, "NOT");
580
- }).map(function (each) {
581
- var taskWrapper = each.task;
582
- return taskWrapper();
583
- });
584
- /** Util.appendInfo(`\n\n正要執行的隊列`,self.queueOfExecutingTask) */
585
- self.printLogMessage("454652321, \u958B\u59CB\u4EFB\u52D9(taskWrapper): run() \u88E1\u9762\u7684execute\u958B\u59CB\u57F7\u884C, task(state = NOT)\u7684\u9577\u5EA6 ".concat(_lodash["default"].size(tasks)));
586
- if (!(_lodash["default"].size(tasks) > 0)) {
587
- _context7.next = 8;
588
- break;
589
- }
590
- _context7.next = 5;
591
- return Promise.race(tasks);
592
- case 5:
593
- _context7.t0 = _context7.sent;
594
- _context7.next = 9;
595
- break;
596
- case 8:
597
- _context7.t0 = "4542131684, task is empty";
598
- case 9:
599
- result = _context7.t0;
600
- self.printLogMessage("54121445161, \u7D50\u675F\u4EFB\u52D9(taskWrapper): run() \u88E1\u9762\u7684execute\u7D50\u675F\u57F7\u884C");
601
- return _context7.abrupt("return", result);
602
- case 12:
603
- case "end":
604
- return _context7.stop();
605
- }
606
- }, _callee7);
607
- }));
608
- return _execute.apply(this, arguments);
609
- };
610
- execute = function _execute2() {
611
- return _execute.apply(this, arguments);
612
- };
613
- self = _this;
614
- _context9.next = 7;
615
- return _this.syncTaskDispatcher();
616
- case 7:
617
- if (!(_this.maximumOfWorker === 0)) {
618
- _context9.next = 12;
619
- break;
620
- }
621
- _context9.next = 10;
622
- return emptyTask();
623
- case 10:
624
- _context9.next = 21;
625
- break;
626
- case 12:
627
- if (_this.isExecutingTaskQueueEmpty()) {
628
- _context9.next = 20;
629
- break;
630
- }
631
- /** 當pool已經被要求停止時, executeQueue裡面還有未做完的任務*/
632
- _this.printLogMessage("4512211, \u958B\u59CB\u4EFB\u52D9(taskWrapper): ".concat(_this.getLogMessageOfExecutingTaskQueueCount()));
633
- _context9.next = 16;
634
- return execute();
635
- case 16:
636
- task = _context9.sent;
637
- _this.printLogMessage("4512213 \u5B8C\u7562\u4EFB\u52D9(taskWrapper:".concat(task, "), ").concat(_this.getLogMessageOfExecutingTaskQueueCount(), ", ").concat(_this.getLogMessageOfAssignTaskQueueCount()));
638
- _context9.next = 21;
639
- break;
640
- case 20:
641
- _this.printLogMessage("4574152 \u4E0D\u61C9\u8A72\u8D70\u5230\u9019\u88CF,\u4F46\u662F minor issue", true);
642
- case 21:
643
- if (_this.queueOfExecutingTask.length > _this.maximumOfWorker) _this.printLogMessage("4512214 \u4E00\u5B9A\u662F\u6539\u58DE\u4E86!!!!!!!!!!, ".concat(_this.getLogMessageOfExecutingTaskQueueCount, " "), true);
644
- self.printLogMessage("5478421212, \u96E2\u958B run()");
645
- case 23:
646
- case "end":
647
- return _context9.stop();
648
- }
649
- }, _callee9);
650
- })));
651
- /** [新增] 輔助方法:獲取用於重複執行模式的任務資訊(複製任務並賦予新 hash) */
652
- (0, _defineProperty2["default"])(this, "getTaskInfoForRepetitiveRun", function (originalTaskInfo) {
653
- // 必須複製任務函數並給予一個新的 hash,用於在 executingTaskQueue 中追蹤
654
- var newTaskInfo = {
655
- task: originalTaskInfo.task,
656
- hash: _index2.utiller.getRandomHash()
657
- };
658
- _this.appendHashTaskMap(newTaskInfo); // 追蹤這個新的 hash 直到任務開始執行
659
- return newTaskInfo;
660
- });
661
- /** taskInfo = { task, hash }*/
662
- (0, _defineProperty2["default"])(this, "getTaskInfoDependOnPriority", function () {
663
- var _iterator3 = _createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),
664
- _step3;
665
- try {
666
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
667
- var prior = _step3.value;
668
- if (_this.queueOfAssignTask[prior].length > 0) {
669
- switch (_this.state) {
670
- case _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK:
671
- // [修正] RUN_BY_EACH_TASK: 移除任務
672
- return _this.queueOfAssignTask[prior].shift();
673
- case _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS:
674
- case _configerer.configerer.POOLLER_STATE.RUN_BY_TIMES:
675
- case _configerer.configerer.POOLLER_STATE.RUN_INFINITE:
676
- // [重大 Bug 修正] 針對重複執行模式:
677
- // 1. 不使用 shift() 移除任務 (因為需要重複執行)
678
- // 2. 獲取任務函數的引用 (Peek)
679
- // 3. 複製任務函數並賦予新的 Hash 以便追蹤本次執行
680
- var originalTaskInfo = _this.queueOfAssignTask[prior][0];
681
- return _this.getTaskInfoForRepetitiveRun(originalTaskInfo);
682
- default:
683
- throw new _exceptioner["default"](4005, "this.state ==> ".concat(_this.state));
684
- }
685
- }
686
- }
687
- } catch (err) {
688
- _iterator3.e(err);
689
- } finally {
690
- _iterator3.f();
691
- }
692
- if (!_lodash["default"].isEqual(_this.state, _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK)) throw new _exceptioner["default"](4007);
693
- });
694
- (0, _defineProperty2["default"])(this, "removeResolveOrRejectPromiseByHash", function (hash, result) {
695
- var callbackWrapper = _this.mapOfHashNCallbackWrapper[hash];
696
- if (callbackWrapper !== undefined) {
697
- _this.printLogMessage("5644153248, removeResolveOrRejectPromiseByHash \u62FF\u6389\u4E86\u5B8C\u6210\u7684\u4EFB\u52D9(".concat(_this.getLogMessageOfTaskHash(hash), ")"));
698
- callbackWrapper(result);
699
- delete _this.mapOfHashNCallbackWrapper[hash];
700
- }
701
- _this.removePromiseFromExecutingQueue(hash);
702
- });
703
- (0, _defineProperty2["default"])(this, "removePromiseFromExecutingQueue", function (hash) {
704
- _this.printLogMessage("56448412, QueueOfExecutingTask \u62FF\u6389\u4E86\u5B8C\u6210\u7684\u4EFB\u52D9 ".concat(_this.getLogMessageOfTaskHash(hash)));
705
- _lodash["default"].remove(_this.queueOfExecutingTask, function (each) {
706
- return _lodash["default"].isEqual(hash, each.hash);
707
- });
708
- });
709
- (0, _defineProperty2["default"])(this, "runInfiniteInBackground", function (functionOfAsyncTask, interval) {
710
- _this.invokeInstanceOfBackground(_this.runInInfinite, functionOfAsyncTask, interval);
711
- });
712
- (0, _defineProperty2["default"])(this, "runByParamInBackGround", function (functionOfAsyncTask) {
713
- for (var _len3 = arguments.length, params = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
714
- params[_key3 - 1] = arguments[_key3];
715
- }
716
- return _this.invokeInstanceOfBackground.apply(_this, [_this.runByParams, functionOfAsyncTask].concat(params));
717
- });
718
- (0, _defineProperty2["default"])(this, "runByTimesInBackGround", function (functionOfAsyncTask, times) {
719
- _this.invokeInstanceOfBackground(_this.runByTimes, functionOfAsyncTask, times);
720
- return _this;
721
- });
722
- (0, _defineProperty2["default"])(this, "runByEachTaskInBackGround", function () {
723
- for (var _len4 = arguments.length, params = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
724
- params[_key4] = arguments[_key4];
725
- }
726
- return _this.invokeInstanceOfBackground.apply(_this, [_this.runByEachTask].concat(params));
727
- });
728
- (0, _defineProperty2["default"])(this, "invokeInstanceOfBackground", function (state) {
729
- if (_this.atomicBgInstance !== undefined) clearTimeout(_this.atomicBgInstance);
730
- for (var _len5 = arguments.length, params = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
731
- params[_key5 - 1] = arguments[_key5];
732
- }
733
- _this.atomicBgInstance = _this.runInBackGround.apply(_this, [state].concat(params));
734
- /**
735
- * 因為偷懶, 所以回傳整個instance, 這樣程式碼就只要寫一行
736
- * const pool = new InfinitePool(1).runByEachTaskInBackGround();
737
- */
738
- return _this;
739
- });
740
- this.maximumOfWorker = maxWorkers;
741
- this.setPoolId(_lodash["default"].toString(name));
742
- var _iterator4 = _createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),
743
- _step4;
744
- try {
745
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
746
- var prior = _step4.value;
747
- this.queueOfAssignTask[prior] = [];
748
- }
749
- } catch (err) {
750
- _iterator4.e(err);
751
- } finally {
752
- _iterator4.f();
753
- }
754
- }
755
- return (0, _createClass2["default"])(InfinitePool, [{
756
- key: "enableQueueTerminateBySleepCount",
757
- value:
758
- /**
759
- * @deprecated there's no sleep mechanism
760
- */
761
- function enableQueueTerminateBySleepCount() {
762
- var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
763
- var interval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _configerer.configerer.POOLLER_QUEUE_TIME_OF_SLEEP_INTERVAL_DEFAULT;
764
- var times = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _configerer.configerer.POOLLER_QUEUE_MAX_SLEEP_COUNTS_DEFAULT;
765
- this.enableOfQueueTerminateSleepCount = enable;
766
- this.queueMaxSleepCounts = times;
767
- this.intervalOfQueueSleep = interval;
768
- }
769
- }, {
770
- key: "clearCache",
771
- value: function clearCache() {
772
- this.queueOfExecutingTask.length = 0;
773
- this.mapOfHashNTask = {};
774
- this.queueOfAssignTask = {};
775
- }
776
- }, {
777
- key: "terminate",
778
- value: function terminate() {
779
- this.isQueuePolling = false;
780
- }
781
- }, {
782
- key: "printLogMessage",
783
- value: function printLogMessage(message) {
784
- var error = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
785
- for (var _len6 = arguments.length, infos = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
786
- infos[_key6 - 2] = arguments[_key6];
787
- }
788
- if (SPECIFICITY_DEBUG) _index2.utiller.printLogMessage.apply(_index2.utiller, [this.getPoollerLogFormat(message), error].concat(infos));
789
- }
790
- }, {
791
- key: "setWorker",
792
- value: function setWorker(counts) {
793
- this.maximumOfWorker = counts;
794
- }
795
- }, {
796
- key: "cleanTaskInterval",
797
- value: function cleanTaskInterval() {
798
- this.taskSleepInterval = {
799
- min: 0,
800
- max: 0
801
- };
802
- }
803
-
804
- /**
805
- * interval:{min: 800, max: 1000}
806
- * */
807
- }, {
808
- key: "enableTaskSleepInterval",
809
- value: function enableTaskSleepInterval() {
810
- var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
811
- var interval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT;
812
- this.enableOfTaskSleepByInterval = enable;
813
- if (_lodash["default"].isNumber(interval)) {
814
- interval = {
815
- min: interval,
816
- max: interval
817
- };
818
- }
819
- this.taskSleepInterval = interval;
820
- }
821
- }, {
822
- key: "enableTaskTimeout",
823
- value: function enableTaskTimeout() {
824
- var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
825
- var millionSec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT;
826
- this.enableOfTaskTimeout = enable;
827
- this.timeOfTaskTimeout = millionSec;
828
- }
829
- }, {
830
- key: "addTaskAndWait4Result",
831
- value: function () {
832
- var _addTaskAndWait4Result = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(asyncTask) {
833
- var _this2 = this;
834
- var priority,
835
- taskName,
836
- _args10 = arguments;
837
- return _regenerator["default"].wrap(function _callee10$(_context10) {
838
- while (1) switch (_context10.prev = _context10.next) {
839
- case 0:
840
- priority = _args10.length > 1 && _args10[1] !== undefined ? _args10[1] : "low";
841
- taskName = _args10.length > 2 && _args10[2] !== undefined ? _args10[2] : "noName";
842
- this.triggerBgInstance();
843
- return _context10.abrupt("return", new Promise(function (resolve, reject) {
844
- var callbackWrapper = function callbackWrapper(result) {
845
- if (result.assignedTaskCompleted) {
846
- resolve(result.resolve);
847
- } else {
848
- reject(result.reject);
849
- }
850
- };
851
- var hash = _this2.add(asyncTask, priority);
852
- _this2.registerHash4Result(hash, callbackWrapper);
853
- }));
854
- case 4:
855
- case "end":
856
- return _context10.stop();
857
- }
858
- }, _callee10, this);
859
- }));
860
- function addTaskAndWait4Result(_x3) {
861
- return _addTaskAndWait4Result.apply(this, arguments);
862
- }
863
- return addTaskAndWait4Result;
864
- }()
865
- }, {
866
- key: "registerHash4Result",
867
- value: function registerHash4Result(hash, callback) {
868
- this.mapOfHashNCallbackWrapper[hash] = callback;
869
- }
870
- }, {
871
- key: "appendHashTaskMap",
872
- value: function appendHashTaskMap(taskInfo) {
873
- this.mapOfHashNTask[taskInfo.hash] = taskInfo;
874
- }
875
- }, {
876
- key: "getTaskInfoByHash",
877
- value: function getTaskInfoByHash(hash) {
878
- return this.mapOfHashNTask[hash];
879
- }
880
-
881
- /**
882
- * remove task in queue by its hash, hash was created when add to queue
883
- * method will return true when succeed delete
884
- * 放到executing queue, 就沒辦法刪除了
885
- **/
886
- }, {
887
- key: "remove",
888
- value: function remove(hash) {
889
- var taskInfo = this.getTaskInfoByHash(hash);
890
- if (taskInfo) {
891
- var _iterator5 = _createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),
892
- _step5;
893
- try {
894
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
895
- var prior = _step5.value;
896
- var _index = _lodash["default"].indexOf(this.queueOfAssignTask[prior], taskInfo);
897
- if (_index > 0) {
898
- this.queueOfAssignTask[prior].splice(_index, 1);
899
- this.removeTaskMapByHash(hash);
900
- return true;
901
- }
902
- }
903
- } catch (err) {
904
- _iterator5.e(err);
905
- } finally {
906
- _iterator5.f();
907
- }
908
- return false;
909
- } else {
910
- throw new _exceptioner["default"](4004, hash);
911
- }
912
- }
913
- }, {
914
- key: "setState",
915
- value:
916
- /** run by how many task in queue, FIFO, if task completed, pool with intervalOfQueueSleep for a while
917
- * ,after this.queueMaxSleepCounts, pooller would closed */
918
-
919
- function setState(_state) {
920
- this.state = _state;
921
- }
922
-
923
- /** [優化] 重新命名以明確說明它具有副作用 (Side Effect) */
924
- }, {
925
- key: "checkAndMarkInitialTaskStatus",
926
- value: function checkAndMarkInitialTaskStatus() {
927
- if (!this.initialTaskCompleted) {
928
- this.initialTaskCompleted = true;
929
- return false;
930
- }
931
- return this.initialTaskCompleted;
932
- }
933
-
934
- /** 如果設定interval, 第一個run不要執行的話,就設定true, default是false */
935
- }, {
936
- key: "setDisableFirstRun",
937
- value: function setDisableFirstRun() {
938
- var disable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
939
- this.disableFirstRun = disable;
940
- }
941
-
942
- /** 加上一個 被動式啟動, 不然一直while() run, 可能有效能上的問題,現階端只支援RUN_BY_TASK */
943
- }, {
944
- key: "triggerBgInstance",
945
- value: function triggerBgInstance() {
946
- if (!this.isRunInBackgroundMode || this.isQueuePolling) {
947
- return;
948
- }
949
- if (this.state === _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK) {
950
- /** 因為不這樣做, 就會產生 race condition, 會產生出3個runInBackGround instance */
951
- this.runByEachTaskInBackGround();
952
- return;
953
- } else if (this.state === _configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS) {
954
- this.runByParamInBackGround();
955
- return;
956
- }
957
- throw new _exceptioner["default"](4011, "this.state is ==> ".concat(_index2.utiller.getItsKeyByValue(_configerer.configerer.POOLLER_STATE, this.state)));
958
- }
959
- }, {
960
- key: "isExecutingQueueFull",
961
- value: function isExecutingQueueFull() {
962
- return _lodash["default"].size(this.queueOfExecutingTask) >= this.maximumOfWorker;
963
- }
964
- }, {
965
- key: "isTaskQueueEmpty",
966
- value: function isTaskQueueEmpty() {
967
- return this.getCountOfAssignTaskInQueue() === 0;
968
- }
969
-
970
- /** 依照config 把委託任務放置到Queue裡面 */
971
- }, {
972
- key: "syncTaskDispatcher",
973
- value: (function () {
974
- var _syncTaskDispatcher = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
975
- var initialTaskShouldNotRun, isExecutingTaskAlmostFull, comparison, restInInterval, taskInfo, promise;
976
- return _regenerator["default"].wrap(function _callee11$(_context11) {
977
- while (1) switch (_context11.prev = _context11.next) {
978
- case 0:
979
- this.printLogMessage("448984466, \u8D70\u9032\u4F86\u4E86 syncTaskDispatcher()");
980
-
981
- // [修正/優化] 使用新的方法名稱,並將檢查和標記分開處理
982
- initialTaskShouldNotRun = this.disableFirstRun && !this.checkAndMarkInitialTaskStatus();
983
- isExecutingTaskAlmostFull = this.queueOfExecutingTask.length >= this.maximumOfWorker - 1;
984
- /** 因為走能到syncTaskDispatcher表示其中一個工作完成了, 這個瞬間不可能 === maximumOfWorker,
985
- * 所以必須減1, 除非這個syncTaskDispatcher是單獨一個線程 */
986
- comparison = this.checkAndMarkInitialTaskStatus() && isExecutingTaskAlmostFull && this.enableOfTaskSleepByInterval;
987
- if (!(initialTaskShouldNotRun || comparison)) {
988
- _context11.next = 9;
989
- break;
990
- }
991
- _context11.next = 7;
992
- return _index2.utiller.syncDelayRandom(this.taskSleepInterval.min, this.taskSleepInterval.max);
993
- case 7:
994
- restInInterval = _context11.sent;
995
- this.printLogMessage("4484121, \u8D70\u5230\u7761\u89BA\u5340 enableOfTaskSleepByInterval:".concat(this.enableOfTaskSleepByInterval, " || ").concat(restInInterval, " ms"));
996
- case 9:
997
- if (!this.rulesOfAppendToExecutingTask()) {
998
- _context11.next = 21;
999
- break;
1000
- }
1001
- taskInfo = this.getTaskInfoDependOnPriority();
1002
- if (!taskInfo) {
1003
- _context11.next = 17;
1004
- break;
1005
- }
1006
- promise = this.taskWrapper(taskInfo.task, taskInfo.hash, this.queueOfWaitingParam.shift()); // 如果是重複執行的 Task,就不移除 TaskMap,因為它只追蹤任務函數的參考,並在下次執行時產生新的 Hash
1007
- if (this.state === _configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK) {
1008
- this.removeTaskMapByHash(taskInfo.hash);
1009
- } else {
1010
- // 對於重複執行的任務,只需移除本次執行時生成的臨時 Hash
1011
- // 由於 getTaskInfoDependOnPriority 現在會產生新的 hash,這裡不需要額外處理
1012
- }
1013
- this.appendTaskToExecuteQueue(taskInfo.hash, promise);
1014
- _context11.next = 19;
1015
- break;
1016
- case 17:
1017
- /** 沒有taskInfo, 也許有未知的isssue,保險起見break */
1018
- this.printLogMessage("848451 \u4E5F\u8A31\u6709\u672A\u77E5\u7684isssue,\u4FDD\u96AA\u8D77\u898Bbreak,\u662F\u4E0D\u662F\u5728\u9019\u88E1\u7121\u9650\u8FF4\u5708\u8DD1\u8DD1\u8DD1", true);
1019
- return _context11.abrupt("break", 21);
1020
- case 19:
1021
- _context11.next = 9;
1022
- break;
1023
- case 21:
1024
- this.printLogMessage("4489844821, \u96E2\u958B\u4E86 syncTaskDispatcher()");
1025
- case 22:
1026
- case "end":
1027
- return _context11.stop();
1028
- }
1029
- }, _callee11, this);
1030
- }));
1031
- function syncTaskDispatcher() {
1032
- return _syncTaskDispatcher.apply(this, arguments);
1033
- }
1034
- return syncTaskDispatcher;
1035
- }())
1036
- }, {
1037
- key: "isWait4ResultTask",
1038
- value: /** 如果有function 就代表是一個需要回傳result的task, task在線等的意思*/
1039
- function isWait4ResultTask(hash) {
1040
- return this.mapOfHashNCallbackWrapper[hash] !== undefined;
1041
- }
1042
- }]);
1043
- }();
1044
- 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 _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _typeof2=_interopRequireDefault(require("@babel/runtime/helpers/typeof"));var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));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 _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}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")}var SPECIFICITY_DEBUG=false;var _run=new WeakMap;var InfinitePool=function(){function InfinitePool(){var _this=this;var maxWorkers=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_configerer.configerer.POOLLER_WORKER_DEFAULT;var name=arguments.length>1&&arguments[1]!==undefined?arguments[1]:_index2.utiller.getRandomValue(0,100000000000);(0,_classCallCheck2["default"])(this,InfinitePool);(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",function(){var id=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_this.nameOfCurrentPool;_this.nameOfCurrentPool=id});(0,_defineProperty2["default"])(this,"getPoolId",function(){return _this.nameOfCurrentPool});(0,_defineProperty2["default"])(this,"stopInBackground",(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(){var attempts,maxAttempts;return _regenerator["default"].wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:_this.terminate();attempts=0;maxAttempts=30;case 3:if(!(_lodash["default"].size(_this.queueOfExecutingTask)>0&&attempts<maxAttempts)){_context.next=11;break}_context.next=6;return _index2.utiller.syncDelay(500);case 6:_this.printLogMessage("784512, \u54AC\u5728 stopInBackground \u51FA\u4E0D\u4F86,".concat(_this.getLogMessageOfExecutingTaskQueueCount()));_this.showState();attempts++;_context.next=3;break;case 11:return _context.abrupt("return",true);case 12:case"end":return _context.stop()}},_callee)})));(0,_defineProperty2["default"])(this,"isRunning",function(){return _this.isQueuePolling});(0,_defineProperty2["default"])(this,"getCountOfAssignTaskInQueue",function(){var size=0;var _iterator=_createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var prior=_step.value;size+=_this.queueOfAssignTask[prior].length}}catch(err){_iterator.e(err)}finally{_iterator.f()}return size});(0,_defineProperty2["default"])(this,"add",function(task){var priority=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"low";if(typeof task==="function"){if(_configerer.configerer.POOLLER_PRIORITY.indexOf(priority)<0){throw new _exceptioner["default"](4001,"priority can't be ".concat(priority))}var hash=_index2.utiller.getRandomHash();var taskInfo={task:task,hash:hash};_this.appendHashTaskMap(taskInfo);_this.queueOfAssignTask[priority].push(taskInfo);return hash}else{throw new _exceptioner["default"](4002,"task can't be ".concat((0,_typeof2["default"])(task)))}});(0,_defineProperty2["default"])(this,"updateExecuteTaskState",function(hash){var self=_this;var task=_lodash["default"].find(_this.queueOfExecutingTask,function(each){return _lodash["default"].isEqual(each.hash,hash)});if(task){_this.printLogMessage("847875153, \u5BA2\u7AEF\u59D4\u8A17\u7684\u4EFB\u52D9: ".concat(hash,",\u66F4\u6539\u72C0\u614B\u70BA 'ING'"));task.state="ING"}});(0,_defineProperty2["default"])(this,"taskWrapper",function(assignedTask,hashOfTask,param){return function(){var self=_this;var timeoutHash="";var assignedTaskResult;var assignedTaskError;var isAssignedTaskCompleted=true;return new Promise(function(resolve,reject){if(self.enableOfTaskTimeout){timeoutHash=setTimeout(function(){try{_this.printLogMessage("982532, taskWrapper\u57F7\u884C\u4E2D,\u767C\u751Ftimout: ".concat(self.timeOfTaskTimeout," ms"));throw new _exceptioner["default"](4010,self.getPoollerLogFormat("TASK HASH:".concat(hashOfTask," IS TIMEOUT ").concat(self.timeOfTaskTimeout," ms ").concat(param?",PARAMS IS ".concat(JSON.stringify(param)):"")))}catch(error){reject(error)}},self.timeOfTaskTimeout)}_this.printLogMessage("984135, \u5BA2\u7AEF\u59D4\u8A17\u7684task\u958B\u59CB\u57F7\u884C ".concat(hashOfTask));self.updateExecuteTaskState(hashOfTask);assignedTask(param).then(function(result){_this.printLogMessage("984545, \u5BA2\u7AEF\u59D4\u8A17\u7684\u4EFB\u52D9(TASK HASH:".concat(hashOfTask,"),resolve\u56DE\u61C9: ").concat(result));assignedTaskResult=result;isAssignedTaskCompleted=true})["catch"](function(error){_this.printLogMessage("989652, \u5BA2\u7AEF\u59D4\u8A17\u7684\u4EFB\u52D9,reject\u56DE\u61C9: ".concat(error.message),true,error);assignedTaskError=error;isAssignedTaskCompleted=false})["finally"](function(){clearTimeout(timeoutHash);resolve();_this.printLogMessage("98942,(TASK HASH:".concat(hashOfTask,") taskWrapper()\u88E1\u9762\u7B2C\u4E00\u500Bpromise(\u70BA\u4E86timeout\u8A2D\u8A08)\u5B8C\u6210\u4E86"))})}).then(function(result){if(!isAssignedTaskCompleted){throw assignedTaskError}else{_this.printLogMessage("9894841,(TASK HASH:".concat(hashOfTask,") taskWrapper()\u88E1\u9762\u7B2C\u4E8C\u500Bpromise(\u6574\u500B\u4EFB\u52D9)\u5B8C\u6210\u4E86"));return"".concat(_this.getLogMessageOfTaskHash(hashOfTask)," completed")}})["catch"](function(error){isAssignedTaskCompleted=false;assignedTaskError=error;if(!self.isWait4ResultTask(hashOfTask)){if(self.handlerOfAssignTaskFail!==undefined){self.handlerOfAssignTaskFail(assignedTaskError)}else throw assignedTaskError}})["finally"](function(){var result={assignedTaskCompleted:isAssignedTaskCompleted,resolve:assignedTaskResult,reject:assignedTaskError};self.removeResolveOrRejectPromiseByHash(hashOfTask,result);_this.printLogMessage("98943213, ".concat(_this.getLogMessageOfTaskHash(hashOfTask)," taskWrapper()\u88E1\u9762\u7B2C2\u500Bpromise\u5B8C\u6210\u4E86"),false,result)})}});(0,_defineProperty2["default"])(this,"adds",function(tasks){var priority=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"low";var hashes=[];if(_lodash["default"].isArray(tasks)){var _iterator2=_createForOfIteratorHelper(tasks),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var task=_step2.value;hashes.push(_this.add(task,priority))}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}}else{throw new _exceptioner["default"](4003,"should be async function array, not ".concat((0,_typeof2["default"])(tasks)))}return hashes});(0,_defineProperty2["default"])(this,"removeTaskMapByHash",function(hash){delete _this.mapOfHashNTask[hash]});(0,_defineProperty2["default"])(this,"beforeRun",function(){_this.isQueuePolling=true});(0,_defineProperty2["default"])(this,"afterRun",function(){_this.clearCache()});(0,_defineProperty2["default"])(this,"runInInfinite",(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(){var task,interval,_args2=arguments;return _regenerator["default"].wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:task=_args2.length>0&&_args2[0]!==undefined?_args2[0]:[];interval=_args2.length>1?_args2[1]:undefined;_this.beforeRun();if(!_lodash["default"].isFunction(task)){_context2.next=7;break}_this.add(task);_context2.next=12;break;case 7:if(!_lodash["default"].isArray(task)){_context2.next=11;break}_this.adds(task);_context2.next=12;break;case 11:throw new _exceptioner["default"](4006,"type of task is ===> ".concat((0,_typeof2["default"])(task)));case 12:_this.enableTaskSleepInterval(_lodash["default"].isNumber(interval),interval);_this.setState(_configerer.configerer.POOLLER_STATE.RUN_INFINITE);case 14:if(_this.ruleOfStopInfiniteRun()){_context2.next=20;break}_this.printLogMessage("415123, runInInfinite() \u6B63\u5728\u7121\u9650Loop\u4E2D, ".concat(_this.getLogMessageOfExecutingTaskQueueCount()));_context2.next=18;return _classPrivateFieldGet(_run,_this).call(_this);case 18:_context2.next=14;break;case 20:case"end":return _context2.stop()}},_callee2)})));(0,_defineProperty2["default"])(this,"ruleOfStopInfiniteRun",function(){return!_this.isRunning()&&_this.isExecutingTaskQueueEmpty()});(0,_defineProperty2["default"])(this,"isExecutingTaskQueueEmpty",function(){return _lodash["default"].size(_this.queueOfExecutingTask)===0});(0,_defineProperty2["default"])(this,"appendParamInToQueue",function(){var _this$queueOfWaitingP;_this.triggerBgInstance();(_this$queueOfWaitingP=_this.queueOfWaitingParam).push.apply(_this$queueOfWaitingP,arguments)});(0,_defineProperty2["default"])(this,"runByParams",function(){var _ref3=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3(functionOfAsyncTask){var _len,params,_key,_args3=arguments;return _regenerator["default"].wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:for(_len=_args3.length,params=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){params[_key-1]=_args3[_key]}if(functionOfAsyncTask===undefined){functionOfAsyncTask=_this.queueOfAssignTask["low"].shift().task}if(_lodash["default"].isFunction(functionOfAsyncTask)){_context3.next=4;break}throw new _exceptioner["default"](4006,"runByParams error, typeof task can't be ".concat((0,_typeof2["default"])(functionOfAsyncTask)));case 4:if(_lodash["default"].isArray(params)){_context3.next=6;break}throw new _exceptioner["default"](4006,"runByParams error, typeof params can't be ".concat((0,_typeof2["default"])(params)));case 6:_this.beforeRun();_this.add(functionOfAsyncTask);_this.appendParamInToQueue.apply(_this,params);_this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_PARAMS);case 10:if(!(!_this.ruleOfStopInfiniteRun()&&_lodash["default"].size(_this.queueOfWaitingParam)>0)){_context3.next=15;break}_context3.next=13;return _classPrivateFieldGet(_run,_this).call(_this);case 13:_context3.next=10;break;case 15:case"end":return _context3.stop()}},_callee3)}));return function(_x){return _ref3.apply(this,arguments)}}());(0,_defineProperty2["default"])(this,"runByEachTask",(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee4(){var tasks,self,_args4=arguments;return _regenerator["default"].wrap(function _callee4$(_context4){while(1)switch(_context4.prev=_context4.next){case 0:tasks=_args4.length>0&&_args4[0]!==undefined?_args4[0]:[];self=_this;_this.id=_index2.utiller.getRandomHash(15);_this.beforeRun();_this.adds(tasks);_this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK);case 6:if(_this.ruleOfStopInfiniteRun()){_context4.next=15;break}_context4.next=9;return _classPrivateFieldGet(_run,_this).call(_this,_this.id);case 9:if(_this.getCountOfAssignTaskInQueue()<=0){_this.terminate();_this.printLogMessage("788121, runByEachTask() \u56E0\u70BA taskOfWaitingQueue \u6E05\u7A7A\u800C\u505C\u6B62")}_context4.next=12;return _index2.utiller.syncDelay(10);case 12:_this.printLogMessage("788143, runByEachTask() \u70BA\u4E86\u8B93while\u4E0D\u8981\u505C\u6B62\u904B\u7B97");_context4.next=6;break;case 15:_this.printLogMessage("7881952, runByEachTask() \u7D50\u675F\u4E86while()");case 16:case"end":return _context4.stop()}},_callee4)})));(0,_defineProperty2["default"])(this,"runByTimes",function(){var _ref5=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee5(functionOfAsyncTask){var times,_args5=arguments;return _regenerator["default"].wrap(function _callee5$(_context5){while(1)switch(_context5.prev=_context5.next){case 0:times=_args5.length>1&&_args5[1]!==undefined?_args5[1]:1;_this.countsOfRunByTimes=times;_this.add(functionOfAsyncTask);_this.beforeRun();_this.setState(_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES);case 5:if(!(!_this.ruleOfStopInfiniteRun()&&_this.countsOfRunByTimes>0)){_context5.next=10;break}_context5.next=8;return _classPrivateFieldGet(_run,_this).call(_this);case 8:_context5.next=5;break;case 10:case"end":return _context5.stop()}},_callee5)}));return function(_x2){return _ref5.apply(this,arguments)}}());(0,_defineProperty2["default"])(this,"runInBackGround",function(asyncfunc){for(var _len2=arguments.length,params=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++){params[_key2-1]=arguments[_key2]}_this.isRunInBackgroundMode=true;if(!(typeof asyncfunc==="function")){throw new _exceptioner["default"](4002,"_asyncfunc can't be ".concat((0,_typeof2["default"])(asyncfunc)))}return setTimeout((0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee6(){return _regenerator["default"].wrap(function _callee6$(_context6){while(1)switch(_context6.prev=_context6.next){case 0:_context6.prev=0;_context6.next=3;return asyncfunc.apply(_this,params);case 3:_context6.next=12;break;case 5:_context6.prev=5;_context6.t0=_context6["catch"](0);if(!(_context6.t0 instanceof _exceptioner["default"])){_context6.next=11;break}_this.printLogMessage("7812123, runInBackGround() \u57F7\u884C\u932F\u8AA4: ".concat(_context6.t0.message),true,_context6.t0);_context6.next=12;break;case 11:throw new _exceptioner["default"](4009,{message:"".concat(_this.getPoollerLogFormat(""))},_context6.t0);case 12:_context6.prev=12;_this.terminate();_this.printLogMessage("7812123, runInBackGround() \u8D70\u5230finally");return _context6.finish(12);case 16:case"end":return _context6.stop()}},_callee6,null,[[0,5,12,16]])})),1)});(0,_defineProperty2["default"])(this,"getPoollerLogFormat",function(msg){return"POOLLER NAME: ".concat(_this.getPoolId()).concat(_lodash["default"].isEmpty(msg)?"":" , ").concat(msg)});(0,_defineProperty2["default"])(this,"setTaskFailHandler",function(){var listener=arguments.length>0&&arguments[0]!==undefined?arguments[0]:function(error){return console.log(error.message)};_this.handlerOfAssignTaskFail=listener});(0,_defineProperty2["default"])(this,"rulesOfAppendToExecutingTask",function(){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 ==> ".concat(_this.state))}});(0,_defineProperty2["default"])(this,"appendTaskToExecuteQueue",function(hash,promise){if(_lodash["default"].isEqual(_this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_TIMES)){_this.countsOfRunByTimes=_this.countsOfRunByTimes-1}var task={state:"NOT",hash:hash,task:promise};_this.printLogMessage("4484451, \u589E\u52A0\u4E86\u4E00\u500BassignedTask ".concat(_this.getLogMessageOfTaskHash(hash)," \u5230 QueueOfExecutingTask ,").concat(_this.getLogMessageOfExecutingTaskQueueCount),false,task);_this.queueOfExecutingTask.push(task)});(0,_defineProperty2["default"])(this,"getLogMessageOfExecutingTaskQueueCount",function(){return"ExecutingTaskQueueCount: ".concat(_lodash["default"].size(_this.queueOfExecutingTask))});(0,_defineProperty2["default"])(this,"getLogMessageOfAssignTaskQueueCount",function(){return"AssignTaskQueueCount: ".concat(_this.getCountOfAssignTaskInQueue())});(0,_defineProperty2["default"])(this,"getLogMessageOfTaskHash",function(hash){return"TASK HASH: ".concat(hash)});(0,_defineProperty2["default"])(this,"showState",function(){_index2.utiller.appendInfo(_this.getPoollerLogFormat("workerCount: ".concat(_this.maximumOfWorker)));_index2.utiller.appendInfo(_this.getPoollerLogFormat("taskQueue(\u9084\u5728\u6392\u968A\u7684Task): ".concat(_this.getCountOfAssignTaskInQueue())));_index2.utiller.appendInfo(_this.getPoollerLogFormat("QueueOfExecutingTask(\u6B63\u5728\u57F7\u884C\u7684AsyncTask, \u8D85\u904EworkerCount\u5C31\u662Fbug): ".concat(_lodash["default"].size(_this.queueOfExecutingTask))));_index2.utiller.appendInfo(_this.getPoollerLogFormat("mapOfHashNTask(\u9084\u6C92\u57F7\u884C\u5230\u7684AsyncTask reference\u7684\u66AB\u5B58\u5340): ".concat(_lodash["default"].size(_this.mapOfHashNTask))))});_classPrivateFieldInitSpec(this,_run,(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee9(){var self,execute,_execute,emptyTask,_emptyTask,task;return _regenerator["default"].wrap(function _callee9$(_context9){while(1)switch(_context9.prev=_context9.next){case 0:_emptyTask=function _emptyTask3(){_emptyTask=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee8(){return _regenerator["default"].wrap(function _callee8$(_context8){while(1)switch(_context8.prev=_context8.next){case 0:self.printLogMessage("\u56E0\u70BAmax count of worker\u70BA0\uFF0C\u6240\u4EE5\u6307\u6D3E\u4E00\u500B\u7C21\u55AE\u7684\u4EFB\u52D9");_context8.next=3;return _index2.utiller.syncDelay(10);case 3:case"end":return _context8.stop()}},_callee8)}));return _emptyTask.apply(this,arguments)};emptyTask=function _emptyTask2(){return _emptyTask.apply(this,arguments)};_execute=function _execute3(){_execute=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee7(){var tasks,result;return _regenerator["default"].wrap(function _callee7$(_context7){while(1)switch(_context7.prev=_context7.next){case 0:tasks=_lodash["default"].filter(self.queueOfExecutingTask,function(each){return _lodash["default"].isEqual(each.state,"NOT")}).map(function(each){var taskWrapper=each.task;return taskWrapper()});self.printLogMessage("454652321, \u958B\u59CB\u4EFB\u52D9(taskWrapper): run() \u88E1\u9762\u7684execute\u958B\u59CB\u57F7\u884C, task(state = NOT)\u7684\u9577\u5EA6 ".concat(_lodash["default"].size(tasks)));if(!(_lodash["default"].size(tasks)>0)){_context7.next=8;break}_context7.next=5;return Promise.race(tasks);case 5:_context7.t0=_context7.sent;_context7.next=9;break;case 8:_context7.t0="4542131684, task is empty";case 9:result=_context7.t0;self.printLogMessage("54121445161, \u7D50\u675F\u4EFB\u52D9(taskWrapper): run() \u88E1\u9762\u7684execute\u7D50\u675F\u57F7\u884C");return _context7.abrupt("return",result);case 12:case"end":return _context7.stop()}},_callee7)}));return _execute.apply(this,arguments)};execute=function _execute2(){return _execute.apply(this,arguments)};self=_this;_context9.next=7;return _this.syncTaskDispatcher();case 7:if(!(_this.maximumOfWorker===0)){_context9.next=12;break}_context9.next=10;return emptyTask();case 10:_context9.next=21;break;case 12:if(_this.isExecutingTaskQueueEmpty()){_context9.next=20;break}_this.printLogMessage("4512211, \u958B\u59CB\u4EFB\u52D9(taskWrapper): ".concat(_this.getLogMessageOfExecutingTaskQueueCount()));_context9.next=16;return execute();case 16:task=_context9.sent;_this.printLogMessage("4512213 \u5B8C\u7562\u4EFB\u52D9(taskWrapper:".concat(task,"), ").concat(_this.getLogMessageOfExecutingTaskQueueCount(),", ").concat(_this.getLogMessageOfAssignTaskQueueCount()));_context9.next=21;break;case 20:_this.printLogMessage("4574152 \u4E0D\u61C9\u8A72\u8D70\u5230\u9019\u88CF,\u4F46\u662F minor issue",true);case 21:if(_this.queueOfExecutingTask.length>_this.maximumOfWorker)_this.printLogMessage("4512214 \u4E00\u5B9A\u662F\u6539\u58DE\u4E86!!!!!!!!!!, ".concat(_this.getLogMessageOfExecutingTaskQueueCount," "),true);self.printLogMessage("5478421212, \u96E2\u958B run()");case 23:case"end":return _context9.stop()}},_callee9)})));(0,_defineProperty2["default"])(this,"getTaskInfoForRepetitiveRun",function(originalTaskInfo){var newTaskInfo={task:originalTaskInfo.task,hash:_index2.utiller.getRandomHash()};_this.appendHashTaskMap(newTaskInfo);return newTaskInfo});(0,_defineProperty2["default"])(this,"getTaskInfoDependOnPriority",function(){var _iterator3=_createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var prior=_step3.value;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:var originalTaskInfo=_this.queueOfAssignTask[prior][0];return _this.getTaskInfoForRepetitiveRun(originalTaskInfo);default:throw new _exceptioner["default"](4005,"this.state ==> ".concat(_this.state))}}}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}if(!_lodash["default"].isEqual(_this.state,_configerer.configerer.POOLLER_STATE.RUN_BY_EACH_TASK))throw new _exceptioner["default"](4007)});(0,_defineProperty2["default"])(this,"removeResolveOrRejectPromiseByHash",function(hash,result){var callbackWrapper=_this.mapOfHashNCallbackWrapper[hash];if(callbackWrapper!==undefined){_this.printLogMessage("5644153248, removeResolveOrRejectPromiseByHash \u62FF\u6389\u4E86\u5B8C\u6210\u7684\u4EFB\u52D9(".concat(_this.getLogMessageOfTaskHash(hash),")"));callbackWrapper(result);delete _this.mapOfHashNCallbackWrapper[hash]}_this.removePromiseFromExecutingQueue(hash)});(0,_defineProperty2["default"])(this,"removePromiseFromExecutingQueue",function(hash){_this.printLogMessage("56448412, QueueOfExecutingTask \u62FF\u6389\u4E86\u5B8C\u6210\u7684\u4EFB\u52D9 ".concat(_this.getLogMessageOfTaskHash(hash)));_lodash["default"].remove(_this.queueOfExecutingTask,function(each){return _lodash["default"].isEqual(hash,each.hash)})});(0,_defineProperty2["default"])(this,"runInfiniteInBackground",function(functionOfAsyncTask,interval){_this.invokeInstanceOfBackground(_this.runInInfinite,functionOfAsyncTask,interval)});(0,_defineProperty2["default"])(this,"runByParamInBackGround",function(functionOfAsyncTask){for(var _len3=arguments.length,params=new Array(_len3>1?_len3-1:0),_key3=1;_key3<_len3;_key3++){params[_key3-1]=arguments[_key3]}return _this.invokeInstanceOfBackground.apply(_this,[_this.runByParams,functionOfAsyncTask].concat(params))});(0,_defineProperty2["default"])(this,"runByTimesInBackGround",function(functionOfAsyncTask,times){_this.invokeInstanceOfBackground(_this.runByTimes,functionOfAsyncTask,times);return _this});(0,_defineProperty2["default"])(this,"runByEachTaskInBackGround",function(){for(var _len4=arguments.length,params=new Array(_len4),_key4=0;_key4<_len4;_key4++){params[_key4]=arguments[_key4]}return _this.invokeInstanceOfBackground.apply(_this,[_this.runByEachTask].concat(params))});(0,_defineProperty2["default"])(this,"invokeInstanceOfBackground",function(state){if(_this.atomicBgInstance!==undefined)clearTimeout(_this.atomicBgInstance);for(var _len5=arguments.length,params=new Array(_len5>1?_len5-1:0),_key5=1;_key5<_len5;_key5++){params[_key5-1]=arguments[_key5]}_this.atomicBgInstance=_this.runInBackGround.apply(_this,[state].concat(params));return _this});this.maximumOfWorker=maxWorkers;this.setPoolId(_lodash["default"].toString(name));var _iterator4=_createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var prior=_step4.value;this.queueOfAssignTask[prior]=[]}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}}return(0,_createClass2["default"])(InfinitePool,[{key:"enableQueueTerminateBySleepCount",value:function enableQueueTerminateBySleepCount(){var enable=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;var interval=arguments.length>1&&arguments[1]!==undefined?arguments[1]:_configerer.configerer.POOLLER_QUEUE_TIME_OF_SLEEP_INTERVAL_DEFAULT;var times=arguments.length>2&&arguments[2]!==undefined?arguments[2]:_configerer.configerer.POOLLER_QUEUE_MAX_SLEEP_COUNTS_DEFAULT;this.enableOfQueueTerminateSleepCount=enable;this.queueMaxSleepCounts=times;this.intervalOfQueueSleep=interval}},{key:"clearCache",value:function clearCache(){this.queueOfExecutingTask.length=0;this.mapOfHashNTask={};this.queueOfAssignTask={}}},{key:"terminate",value:function terminate(){this.isQueuePolling=false}},{key:"printLogMessage",value:function printLogMessage(message){var error=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;for(var _len6=arguments.length,infos=new Array(_len6>2?_len6-2:0),_key6=2;_key6<_len6;_key6++){infos[_key6-2]=arguments[_key6]}if(SPECIFICITY_DEBUG)_index2.utiller.printLogMessage.apply(_index2.utiller,[this.getPoollerLogFormat(message),error].concat(infos))}},{key:"setWorker",value:function setWorker(counts){this.maximumOfWorker=counts}},{key:"cleanTaskInterval",value:function cleanTaskInterval(){this.taskSleepInterval={min:0,max:0}}},{key:"enableTaskSleepInterval",value:function enableTaskSleepInterval(){var enable=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;var interval=arguments.length>1&&arguments[1]!==undefined?arguments[1]:_configerer.configerer.POOLLER_TASK_OF_INTERVAL_DEFAULT;this.enableOfTaskSleepByInterval=enable;if(_lodash["default"].isNumber(interval)){interval={min:interval,max:interval}}this.taskSleepInterval=interval}},{key:"enableTaskTimeout",value:function enableTaskTimeout(){var enable=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;var millionSec=arguments.length>1&&arguments[1]!==undefined?arguments[1]:_configerer.configerer.POOLLER_TASK_TIMEOUT_DEFAULT;this.enableOfTaskTimeout=enable;this.timeOfTaskTimeout=millionSec}},{key:"addTaskAndWait4Result",value:function(){var _addTaskAndWait4Result=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee10(asyncTask){var _this2=this;var priority,taskName,_args10=arguments;return _regenerator["default"].wrap(function _callee10$(_context10){while(1)switch(_context10.prev=_context10.next){case 0:priority=_args10.length>1&&_args10[1]!==undefined?_args10[1]:"low";taskName=_args10.length>2&&_args10[2]!==undefined?_args10[2]:"noName";this.triggerBgInstance();return _context10.abrupt("return",new Promise(function(resolve,reject){var callbackWrapper=function callbackWrapper(result){if(result.assignedTaskCompleted){resolve(result.resolve)}else{reject(result.reject)}};var hash=_this2.add(asyncTask,priority);_this2.registerHash4Result(hash,callbackWrapper)}));case 4:case"end":return _context10.stop()}},_callee10,this)}));function addTaskAndWait4Result(_x3){return _addTaskAndWait4Result.apply(this,arguments)}return addTaskAndWait4Result}()},{key:"registerHash4Result",value:function registerHash4Result(hash,callback){this.mapOfHashNCallbackWrapper[hash]=callback}},{key:"appendHashTaskMap",value:function appendHashTaskMap(taskInfo){this.mapOfHashNTask[taskInfo.hash]=taskInfo}},{key:"getTaskInfoByHash",value:function getTaskInfoByHash(hash){return this.mapOfHashNTask[hash]}},{key:"remove",value:function remove(hash){var taskInfo=this.getTaskInfoByHash(hash);if(taskInfo){var _iterator5=_createForOfIteratorHelper(_configerer.configerer.POOLLER_PRIORITY),_step5;try{for(_iterator5.s();!(_step5=_iterator5.n()).done;){var prior=_step5.value;var _index=_lodash["default"].indexOf(this.queueOfAssignTask[prior],taskInfo);if(_index>0){this.queueOfAssignTask[prior].splice(_index,1);this.removeTaskMapByHash(hash);return true}}}catch(err){_iterator5.e(err)}finally{_iterator5.f()}return false}else{throw new _exceptioner["default"](4004,hash)}}},{key:"setState",value:function setState(_state){this.state=_state}},{key:"checkAndMarkInitialTaskStatus",value:function checkAndMarkInitialTaskStatus(){if(!this.initialTaskCompleted){this.initialTaskCompleted=true;return false}return this.initialTaskCompleted}},{key:"setDisableFirstRun",value:function setDisableFirstRun(){var disable=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;this.disableFirstRun=disable}},{key:"triggerBgInstance",value:function 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 ==> ".concat(_index2.utiller.getItsKeyByValue(_configerer.configerer.POOLLER_STATE,this.state)))}},{key:"isExecutingQueueFull",value:function isExecutingQueueFull(){return _lodash["default"].size(this.queueOfExecutingTask)>=this.maximumOfWorker}},{key:"isTaskQueueEmpty",value:function isTaskQueueEmpty(){return this.getCountOfAssignTaskInQueue()===0}},{key:"syncTaskDispatcher",value:(function(){var _syncTaskDispatcher=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee11(){var initialTaskShouldNotRun,isExecutingTaskAlmostFull,comparison,restInInterval,taskInfo,promise;return _regenerator["default"].wrap(function _callee11$(_context11){while(1)switch(_context11.prev=_context11.next){case 0:this.printLogMessage("448984466, \u8D70\u9032\u4F86\u4E86 syncTaskDispatcher()");initialTaskShouldNotRun=this.disableFirstRun&&!this.checkAndMarkInitialTaskStatus();isExecutingTaskAlmostFull=this.queueOfExecutingTask.length>=this.maximumOfWorker-1;comparison=this.checkAndMarkInitialTaskStatus()&&isExecutingTaskAlmostFull&&this.enableOfTaskSleepByInterval;if(!(initialTaskShouldNotRun||comparison)){_context11.next=9;break}_context11.next=7;return _index2.utiller.syncDelayRandom(this.taskSleepInterval.min,this.taskSleepInterval.max);case 7:restInInterval=_context11.sent;this.printLogMessage("4484121, \u8D70\u5230\u7761\u89BA\u5340 enableOfTaskSleepByInterval:".concat(this.enableOfTaskSleepByInterval," || ").concat(restInInterval," ms"));case 9:if(!this.rulesOfAppendToExecutingTask()){_context11.next=21;break}taskInfo=this.getTaskInfoDependOnPriority();if(!taskInfo){_context11.next=17;break}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);_context11.next=19;break;case 17:this.printLogMessage("848451 \u4E5F\u8A31\u6709\u672A\u77E5\u7684isssue,\u4FDD\u96AA\u8D77\u898Bbreak,\u662F\u4E0D\u662F\u5728\u9019\u88E1\u7121\u9650\u8FF4\u5708\u8DD1\u8DD1\u8DD1",true);return _context11.abrupt("break",21);case 19:_context11.next=9;break;case 21:this.printLogMessage("4489844821, \u96E2\u958B\u4E86 syncTaskDispatcher()");case 22:case"end":return _context11.stop()}},_callee11,this)}));function syncTaskDispatcher(){return _syncTaskDispatcher.apply(this,arguments)}return syncTaskDispatcher}())},{key:"isWait4ResultTask",value:function isWait4ResultTask(hash){return this.mapOfHashNCallbackWrapper[hash]!==undefined}}])}();var _default=exports["default"]=InfinitePool;