wenay-common 1.0.201 → 1.0.203

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.
@@ -82,6 +82,7 @@ export type typeNoVoid2<T> = {
82
82
  };
83
83
  export type UnAwaited<T extends Promise<any>> = T extends Promise<infer R> ? R : never;
84
84
  export type UnAwaitedArr<T extends Promise<any>[]> = T extends Promise<infer R>[] ? R[] : never;
85
+ export type ReturnTypePromise<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends Promise<any> ? UnAwaited<R> : R : any;
85
86
  export type UnObject<T extends object> = T extends {
86
87
  [k: string]: infer R;
87
88
  } ? R : never;
@@ -2,11 +2,16 @@ export declare function enhancedWaitRun(): {
2
2
  throttleAsync: (ms: number, func: () => any | Promise<any>) => void;
3
3
  debounceAsync: (ms: number, func: () => any | Promise<any>) => Promise<void>;
4
4
  };
5
+ export declare function createAsyncQueue(concurrency?: number): {
6
+ enqueue: <T>(task: () => Promise<T>) => Promise<T>;
7
+ onIdle: () => Promise<void>;
8
+ getQueueSize: () => number;
9
+ };
5
10
  export declare function enhancedQueueRun(maxParallelTasks?: number): {
6
11
  readonly queueSize: number;
7
12
  enqueue(task: () => Promise<any>): void;
8
13
  enqueueAndRun(task: () => Promise<any>): void;
9
- runAll(): Promise<PromiseSettledResult<void>[]>;
14
+ runAll(): Promise<void>;
10
15
  };
11
16
  export declare function waitRun(): {
12
17
  refreshAsync: (ms: number, func: () => any | Promise<any>) => void;
@@ -16,5 +21,5 @@ export declare function queueRun(n?: number): {
16
21
  readonly size: number;
17
22
  next: () => Promise<any>;
18
23
  nextRun: () => Promise<any>;
19
- run: () => Promise<PromiseSettledResult<void>[]>;
24
+ run: () => Promise<void>;
20
25
  };
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.enhancedWaitRun = enhancedWaitRun;
4
+ exports.createAsyncQueue = createAsyncQueue;
4
5
  exports.enhancedQueueRun = enhancedQueueRun;
5
6
  exports.waitRun = waitRun;
6
7
  exports.queueRun = queueRun;
@@ -52,40 +53,77 @@ function enhancedWaitRun() {
52
53
  },
53
54
  };
54
55
  }
55
- function enhancedQueueRun(maxParallelTasks = 5) {
56
- const taskQueue = [];
57
- const workers = Array(maxParallelTasks).fill(Promise.resolve());
58
- const processNextTask = () => {
59
- const task = taskQueue.shift();
60
- if (task) {
61
- return task()
62
- .catch((error) => {
63
- console.error("Error in task execution:", error);
64
- })
65
- .finally(processNextTask);
56
+ function createAsyncQueue(concurrency = 1) {
57
+ let queue = [];
58
+ let activeCount = 0;
59
+ let resolveIdle = null;
60
+ let idlePromise = null;
61
+ const runNext = () => {
62
+ if (activeCount >= concurrency || queue.length === 0) {
63
+ if (activeCount === 0 && queue.length === 0 && resolveIdle) {
64
+ resolveIdle();
65
+ resolveIdle = null;
66
+ idlePromise = null;
67
+ }
68
+ return;
66
69
  }
70
+ const task = queue.shift();
71
+ if (!task)
72
+ return;
73
+ activeCount++;
74
+ task().finally(() => {
75
+ activeCount--;
76
+ runNext();
77
+ });
78
+ runNext();
67
79
  };
68
- const checkAndRun = () => {
69
- workers.forEach((worker, index) => {
70
- if (!worker || worker === Promise.resolve()) {
71
- workers[index] = processNextTask() || Promise.resolve();
72
- }
80
+ const enqueue = (task) => {
81
+ return new Promise((resolve, reject) => {
82
+ queue.push(async () => {
83
+ try {
84
+ resolve(await task());
85
+ }
86
+ catch (err) {
87
+ reject(err);
88
+ }
89
+ });
90
+ runNext();
73
91
  });
74
92
  };
93
+ const onIdle = () => {
94
+ if (!idlePromise) {
95
+ idlePromise = new Promise((resolve) => {
96
+ if (activeCount === 0 && queue.length === 0) {
97
+ resolve();
98
+ }
99
+ else {
100
+ resolveIdle = resolve;
101
+ }
102
+ });
103
+ }
104
+ return idlePromise;
105
+ };
106
+ const getQueueSize = () => queue.length;
107
+ return {
108
+ enqueue,
109
+ onIdle,
110
+ getQueueSize,
111
+ };
112
+ }
113
+ function enhancedQueueRun(maxParallelTasks = 5) {
114
+ const tr = createAsyncQueue(maxParallelTasks);
75
115
  return {
76
116
  get queueSize() {
77
- return taskQueue.length;
117
+ return tr.getQueueSize();
78
118
  },
79
119
  enqueue(task) {
80
- taskQueue.push(task);
120
+ tr.enqueue(task);
81
121
  },
82
122
  enqueueAndRun(task) {
83
- taskQueue.push(task);
84
- checkAndRun();
123
+ tr.enqueue(task);
85
124
  },
86
125
  runAll() {
87
- checkAndRun();
88
- return Promise.allSettled(workers);
126
+ return tr.onIdle();
89
127
  },
90
128
  };
91
129
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wenay-common",
3
- "version": "1.0.201",
3
+ "version": "1.0.203",
4
4
  "description": "Common library",
5
5
  "strict": true,
6
6
  "main": "lib/index.js",