@ls-stack/utils 3.9.1 → 3.10.0
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/asyncQueue.cjs +43 -39
- package/lib/asyncQueue.d.cts +19 -19
- package/lib/asyncQueue.d.ts +19 -19
- package/lib/asyncQueue.js +42 -30
- package/lib/testUtils.cjs +29 -2
- package/lib/testUtils.d.cts +6 -1
- package/lib/testUtils.d.ts +6 -1
- package/lib/testUtils.js +19 -1
- package/package.json +4 -3
package/lib/asyncQueue.cjs
CHANGED
|
@@ -21,23 +21,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var asyncQueue_exports = {};
|
|
22
22
|
__export(asyncQueue_exports, {
|
|
23
23
|
createAsyncQueue: () => createAsyncQueue,
|
|
24
|
-
|
|
24
|
+
createAsyncQueueWithMeta: () => createAsyncQueueWithMeta
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(asyncQueue_exports);
|
|
27
27
|
var import_evtmitter = require("evtmitter");
|
|
28
28
|
var import_t_result = require("t-result");
|
|
29
29
|
|
|
30
|
-
// src/assertions.ts
|
|
31
|
-
function isObject(value) {
|
|
32
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
-
}
|
|
34
|
-
function isFunction(value) {
|
|
35
|
-
return typeof value === "function";
|
|
36
|
-
}
|
|
37
|
-
function isPromise(value) {
|
|
38
|
-
return isObject(value) && "then" in value && isFunction(value.then);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
30
|
// src/promiseUtils.ts
|
|
42
31
|
function defer() {
|
|
43
32
|
let resolve;
|
|
@@ -74,38 +63,48 @@ var AsyncQueue = class {
|
|
|
74
63
|
this.#queue.push(task);
|
|
75
64
|
this.#size++;
|
|
76
65
|
}
|
|
77
|
-
add(fn, options) {
|
|
66
|
+
async add(fn, options) {
|
|
67
|
+
if (this.#signal?.aborted) {
|
|
68
|
+
return import_t_result.Result.err(
|
|
69
|
+
this.#signal.reason instanceof Error ? this.#signal.reason : new DOMException("Queue aborted", "AbortError")
|
|
70
|
+
);
|
|
71
|
+
}
|
|
78
72
|
const deferred = defer();
|
|
79
73
|
const taskTimeout = this.#taskTimeout ?? options?.timeout;
|
|
80
74
|
const task = {
|
|
81
75
|
run: async (ctx) => {
|
|
82
|
-
|
|
83
|
-
return fn;
|
|
84
|
-
}
|
|
85
|
-
return await fn(ctx);
|
|
76
|
+
return fn(ctx);
|
|
86
77
|
},
|
|
87
78
|
resolve: deferred.resolve,
|
|
88
79
|
reject: deferred.reject,
|
|
89
80
|
signal: options?.signal,
|
|
90
|
-
|
|
81
|
+
meta: options?.meta,
|
|
91
82
|
timeout: taskTimeout
|
|
92
83
|
};
|
|
93
84
|
this.#enqueue(task);
|
|
94
85
|
this.#processQueue();
|
|
95
|
-
|
|
86
|
+
const r = await deferred.promise;
|
|
87
|
+
if (options?.onComplete) {
|
|
88
|
+
r.onOk(options.onComplete);
|
|
89
|
+
}
|
|
90
|
+
if (options?.onError) {
|
|
91
|
+
r.onErr(options.onError);
|
|
92
|
+
}
|
|
93
|
+
return r;
|
|
96
94
|
}
|
|
97
95
|
resultifyAdd(fn, options) {
|
|
98
96
|
return this.add(
|
|
99
97
|
(ctx) => (0, import_t_result.resultify)(async () => {
|
|
100
|
-
if (isPromise(fn)) {
|
|
101
|
-
return await fn;
|
|
102
|
-
}
|
|
103
98
|
return fn(ctx);
|
|
104
99
|
}),
|
|
105
100
|
options
|
|
106
101
|
);
|
|
107
102
|
}
|
|
108
103
|
async #processQueue() {
|
|
104
|
+
if (this.#signal?.aborted) {
|
|
105
|
+
this.clear();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
109
108
|
if (this.#pending >= this.#concurrency || this.#queue.length === 0) {
|
|
110
109
|
return;
|
|
111
110
|
}
|
|
@@ -129,43 +128,52 @@ var AsyncQueue = class {
|
|
|
129
128
|
let abortListener;
|
|
130
129
|
try {
|
|
131
130
|
if (signal?.aborted) {
|
|
132
|
-
const error = signal.reason instanceof Error ? signal.reason : new DOMException("
|
|
131
|
+
const error = signal.reason instanceof Error ? signal.reason : new DOMException("This operation was aborted", "AbortError");
|
|
133
132
|
throw error;
|
|
134
133
|
}
|
|
135
134
|
const signalAbortPromise = new Promise((_, reject) => {
|
|
136
135
|
if (signal) {
|
|
137
|
-
const error = signal.reason instanceof Error ? signal.reason : new DOMException("
|
|
136
|
+
const error = signal.reason instanceof Error ? signal.reason : new DOMException("This operation was aborted", "AbortError");
|
|
138
137
|
abortListener = () => {
|
|
139
138
|
reject(error);
|
|
140
139
|
};
|
|
141
140
|
signal.addEventListener("abort", abortListener, { once: true });
|
|
142
141
|
}
|
|
143
142
|
});
|
|
144
|
-
const taskRunPromise = task.run({ signal,
|
|
145
|
-
this.events.emit("start", {
|
|
143
|
+
const taskRunPromise = task.run({ signal, meta: task.meta });
|
|
144
|
+
this.events.emit("start", { meta: task.meta });
|
|
146
145
|
const result = await Promise.race([taskRunPromise, signalAbortPromise]);
|
|
147
146
|
if ((0, import_t_result.isResult)(result)) {
|
|
148
147
|
task.resolve(result);
|
|
149
148
|
if (result.error) {
|
|
150
149
|
this.#failed++;
|
|
151
|
-
this.events.emit("error", {
|
|
150
|
+
this.events.emit("error", {
|
|
151
|
+
meta: task.meta,
|
|
152
|
+
error: result.error
|
|
153
|
+
});
|
|
152
154
|
} else {
|
|
153
155
|
this.#completed++;
|
|
154
|
-
this.events.emit("complete", {
|
|
156
|
+
this.events.emit("complete", {
|
|
157
|
+
meta: task.meta,
|
|
158
|
+
value: result.value
|
|
159
|
+
});
|
|
155
160
|
}
|
|
156
161
|
} else {
|
|
157
162
|
const error = new Error("Response not a Result");
|
|
158
163
|
task.resolve(import_t_result.Result.err(error));
|
|
159
164
|
this.#failed++;
|
|
160
165
|
this.events.emit("error", {
|
|
161
|
-
|
|
166
|
+
meta: task.meta,
|
|
162
167
|
error
|
|
163
168
|
});
|
|
164
169
|
}
|
|
165
170
|
} catch (error) {
|
|
166
171
|
task.resolve(import_t_result.Result.err(error));
|
|
167
172
|
this.#failed++;
|
|
168
|
-
this.events.emit("error", {
|
|
173
|
+
this.events.emit("error", {
|
|
174
|
+
meta: task.meta,
|
|
175
|
+
error: (0, import_t_result.unknownToError)(error)
|
|
176
|
+
});
|
|
169
177
|
} finally {
|
|
170
178
|
if (signal && abortListener) {
|
|
171
179
|
signal.removeEventListener("abort", abortListener);
|
|
@@ -193,13 +201,9 @@ var AsyncQueue = class {
|
|
|
193
201
|
this.#idleResolvers.push(resolve);
|
|
194
202
|
});
|
|
195
203
|
}
|
|
196
|
-
clear(
|
|
204
|
+
clear() {
|
|
197
205
|
this.#queue = [];
|
|
198
206
|
this.#size = 0;
|
|
199
|
-
if (resetCounters) {
|
|
200
|
-
this.#completed = 0;
|
|
201
|
-
this.#failed = 0;
|
|
202
|
-
}
|
|
203
207
|
if (this.#pending === 0) {
|
|
204
208
|
this.#resolveIdleWaiters();
|
|
205
209
|
}
|
|
@@ -217,7 +221,7 @@ var AsyncQueue = class {
|
|
|
217
221
|
return this.#size;
|
|
218
222
|
}
|
|
219
223
|
};
|
|
220
|
-
var
|
|
224
|
+
var AsyncQueueWithMeta = class extends AsyncQueue {
|
|
221
225
|
constructor(options) {
|
|
222
226
|
super(options);
|
|
223
227
|
}
|
|
@@ -231,11 +235,11 @@ var AsyncQueueWithId = class extends AsyncQueue {
|
|
|
231
235
|
function createAsyncQueue(options) {
|
|
232
236
|
return new AsyncQueue(options);
|
|
233
237
|
}
|
|
234
|
-
function
|
|
235
|
-
return new
|
|
238
|
+
function createAsyncQueueWithMeta(options) {
|
|
239
|
+
return new AsyncQueueWithMeta(options);
|
|
236
240
|
}
|
|
237
241
|
// Annotate the CommonJS export names for ESM import in node:
|
|
238
242
|
0 && (module.exports = {
|
|
239
243
|
createAsyncQueue,
|
|
240
|
-
|
|
244
|
+
createAsyncQueueWithMeta
|
|
241
245
|
});
|
package/lib/asyncQueue.d.cts
CHANGED
|
@@ -6,51 +6,51 @@ type AsyncQueueOptions = {
|
|
|
6
6
|
signal?: AbortSignal;
|
|
7
7
|
timeout?: number;
|
|
8
8
|
};
|
|
9
|
-
type AddOptions<I> = {
|
|
9
|
+
type AddOptions<I, T, E extends ResultValidErrors> = {
|
|
10
10
|
signal?: AbortSignal;
|
|
11
11
|
timeout?: number;
|
|
12
|
-
|
|
12
|
+
meta?: I;
|
|
13
|
+
onComplete?: (value: T) => void;
|
|
14
|
+
onError?: (error: E | Error) => void;
|
|
13
15
|
};
|
|
14
16
|
type RunCtx<I> = {
|
|
15
17
|
signal?: AbortSignal;
|
|
16
|
-
|
|
18
|
+
meta?: I;
|
|
17
19
|
};
|
|
18
|
-
declare class AsyncQueue<T, E extends ResultValidErrors = Error, I =
|
|
20
|
+
declare class AsyncQueue<T, E extends ResultValidErrors = Error, I = unknown> {
|
|
19
21
|
#private;
|
|
20
22
|
events: evtmitter.Emitter<{
|
|
21
23
|
error: {
|
|
22
|
-
|
|
24
|
+
meta: I;
|
|
23
25
|
error: E | Error;
|
|
24
26
|
};
|
|
25
27
|
complete: {
|
|
26
|
-
|
|
28
|
+
meta: I;
|
|
27
29
|
value: T;
|
|
28
30
|
};
|
|
29
31
|
start: {
|
|
30
|
-
|
|
32
|
+
meta: I;
|
|
31
33
|
};
|
|
32
34
|
}>;
|
|
33
35
|
constructor({ concurrency, signal, timeout: taskTimeout, }?: AsyncQueueOptions);
|
|
34
|
-
add(fn: (
|
|
35
|
-
resultifyAdd(fn: (
|
|
36
|
+
add(fn: (ctx: RunCtx<I>) => Promise<Result<T, E>> | Result<T, E>, options?: AddOptions<I, T, E>): Promise<Result<T, E | Error>>;
|
|
37
|
+
resultifyAdd(fn: (ctx: RunCtx<I>) => Promise<T> | T, options?: AddOptions<I, T, E>): Promise<Result<T, E | Error>>;
|
|
36
38
|
onIdle(): Promise<void>;
|
|
37
|
-
clear(
|
|
38
|
-
resetCounters?: boolean;
|
|
39
|
-
}): void;
|
|
39
|
+
clear(): void;
|
|
40
40
|
get completed(): number;
|
|
41
41
|
get failed(): number;
|
|
42
42
|
get pending(): number;
|
|
43
43
|
get size(): number;
|
|
44
44
|
}
|
|
45
|
-
type AddOptionsWithId<I> = Omit<AddOptions<I>, '
|
|
46
|
-
|
|
45
|
+
type AddOptionsWithId<I, T, E extends ResultValidErrors> = Omit<AddOptions<I, T, E>, 'meta'> & {
|
|
46
|
+
meta: I;
|
|
47
47
|
};
|
|
48
|
-
declare class
|
|
48
|
+
declare class AsyncQueueWithMeta<T, I, E extends ResultValidErrors = Error> extends AsyncQueue<T, E, I> {
|
|
49
49
|
constructor(options?: AsyncQueueOptions);
|
|
50
|
-
add(fn: (
|
|
51
|
-
resultifyAdd(fn: (
|
|
50
|
+
add(fn: (ctx: RunCtx<I>) => Promise<Result<T, E>> | Result<T, E>, options?: AddOptionsWithId<I, T, E>): Promise<Result<T, E | Error>>;
|
|
51
|
+
resultifyAdd(fn: (ctx: RunCtx<I>) => Promise<T> | T, options?: AddOptionsWithId<I, T, E>): Promise<Result<T, E | Error>>;
|
|
52
52
|
}
|
|
53
53
|
declare function createAsyncQueue<T, E extends ResultValidErrors = Error>(options?: AsyncQueueOptions): AsyncQueue<T, E>;
|
|
54
|
-
declare function
|
|
54
|
+
declare function createAsyncQueueWithMeta<T, I, E extends ResultValidErrors = Error>(options?: AsyncQueueOptions): AsyncQueueWithMeta<T, I, E>;
|
|
55
55
|
|
|
56
|
-
export { createAsyncQueue,
|
|
56
|
+
export { createAsyncQueue, createAsyncQueueWithMeta };
|
package/lib/asyncQueue.d.ts
CHANGED
|
@@ -6,51 +6,51 @@ type AsyncQueueOptions = {
|
|
|
6
6
|
signal?: AbortSignal;
|
|
7
7
|
timeout?: number;
|
|
8
8
|
};
|
|
9
|
-
type AddOptions<I> = {
|
|
9
|
+
type AddOptions<I, T, E extends ResultValidErrors> = {
|
|
10
10
|
signal?: AbortSignal;
|
|
11
11
|
timeout?: number;
|
|
12
|
-
|
|
12
|
+
meta?: I;
|
|
13
|
+
onComplete?: (value: T) => void;
|
|
14
|
+
onError?: (error: E | Error) => void;
|
|
13
15
|
};
|
|
14
16
|
type RunCtx<I> = {
|
|
15
17
|
signal?: AbortSignal;
|
|
16
|
-
|
|
18
|
+
meta?: I;
|
|
17
19
|
};
|
|
18
|
-
declare class AsyncQueue<T, E extends ResultValidErrors = Error, I =
|
|
20
|
+
declare class AsyncQueue<T, E extends ResultValidErrors = Error, I = unknown> {
|
|
19
21
|
#private;
|
|
20
22
|
events: evtmitter.Emitter<{
|
|
21
23
|
error: {
|
|
22
|
-
|
|
24
|
+
meta: I;
|
|
23
25
|
error: E | Error;
|
|
24
26
|
};
|
|
25
27
|
complete: {
|
|
26
|
-
|
|
28
|
+
meta: I;
|
|
27
29
|
value: T;
|
|
28
30
|
};
|
|
29
31
|
start: {
|
|
30
|
-
|
|
32
|
+
meta: I;
|
|
31
33
|
};
|
|
32
34
|
}>;
|
|
33
35
|
constructor({ concurrency, signal, timeout: taskTimeout, }?: AsyncQueueOptions);
|
|
34
|
-
add(fn: (
|
|
35
|
-
resultifyAdd(fn: (
|
|
36
|
+
add(fn: (ctx: RunCtx<I>) => Promise<Result<T, E>> | Result<T, E>, options?: AddOptions<I, T, E>): Promise<Result<T, E | Error>>;
|
|
37
|
+
resultifyAdd(fn: (ctx: RunCtx<I>) => Promise<T> | T, options?: AddOptions<I, T, E>): Promise<Result<T, E | Error>>;
|
|
36
38
|
onIdle(): Promise<void>;
|
|
37
|
-
clear(
|
|
38
|
-
resetCounters?: boolean;
|
|
39
|
-
}): void;
|
|
39
|
+
clear(): void;
|
|
40
40
|
get completed(): number;
|
|
41
41
|
get failed(): number;
|
|
42
42
|
get pending(): number;
|
|
43
43
|
get size(): number;
|
|
44
44
|
}
|
|
45
|
-
type AddOptionsWithId<I> = Omit<AddOptions<I>, '
|
|
46
|
-
|
|
45
|
+
type AddOptionsWithId<I, T, E extends ResultValidErrors> = Omit<AddOptions<I, T, E>, 'meta'> & {
|
|
46
|
+
meta: I;
|
|
47
47
|
};
|
|
48
|
-
declare class
|
|
48
|
+
declare class AsyncQueueWithMeta<T, I, E extends ResultValidErrors = Error> extends AsyncQueue<T, E, I> {
|
|
49
49
|
constructor(options?: AsyncQueueOptions);
|
|
50
|
-
add(fn: (
|
|
51
|
-
resultifyAdd(fn: (
|
|
50
|
+
add(fn: (ctx: RunCtx<I>) => Promise<Result<T, E>> | Result<T, E>, options?: AddOptionsWithId<I, T, E>): Promise<Result<T, E | Error>>;
|
|
51
|
+
resultifyAdd(fn: (ctx: RunCtx<I>) => Promise<T> | T, options?: AddOptionsWithId<I, T, E>): Promise<Result<T, E | Error>>;
|
|
52
52
|
}
|
|
53
53
|
declare function createAsyncQueue<T, E extends ResultValidErrors = Error>(options?: AsyncQueueOptions): AsyncQueue<T, E>;
|
|
54
|
-
declare function
|
|
54
|
+
declare function createAsyncQueueWithMeta<T, I, E extends ResultValidErrors = Error>(options?: AsyncQueueOptions): AsyncQueueWithMeta<T, I, E>;
|
|
55
55
|
|
|
56
|
-
export { createAsyncQueue,
|
|
56
|
+
export { createAsyncQueue, createAsyncQueueWithMeta };
|
package/lib/asyncQueue.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defer
|
|
3
3
|
} from "./chunk-DFXNVEH6.js";
|
|
4
|
-
import {
|
|
5
|
-
isPromise
|
|
6
|
-
} from "./chunk-3XCS7FVO.js";
|
|
7
4
|
|
|
8
5
|
// src/asyncQueue.ts
|
|
9
6
|
import { evtmitter } from "evtmitter";
|
|
@@ -37,38 +34,48 @@ var AsyncQueue = class {
|
|
|
37
34
|
this.#queue.push(task);
|
|
38
35
|
this.#size++;
|
|
39
36
|
}
|
|
40
|
-
add(fn, options) {
|
|
37
|
+
async add(fn, options) {
|
|
38
|
+
if (this.#signal?.aborted) {
|
|
39
|
+
return Result.err(
|
|
40
|
+
this.#signal.reason instanceof Error ? this.#signal.reason : new DOMException("Queue aborted", "AbortError")
|
|
41
|
+
);
|
|
42
|
+
}
|
|
41
43
|
const deferred = defer();
|
|
42
44
|
const taskTimeout = this.#taskTimeout ?? options?.timeout;
|
|
43
45
|
const task = {
|
|
44
46
|
run: async (ctx) => {
|
|
45
|
-
|
|
46
|
-
return fn;
|
|
47
|
-
}
|
|
48
|
-
return await fn(ctx);
|
|
47
|
+
return fn(ctx);
|
|
49
48
|
},
|
|
50
49
|
resolve: deferred.resolve,
|
|
51
50
|
reject: deferred.reject,
|
|
52
51
|
signal: options?.signal,
|
|
53
|
-
|
|
52
|
+
meta: options?.meta,
|
|
54
53
|
timeout: taskTimeout
|
|
55
54
|
};
|
|
56
55
|
this.#enqueue(task);
|
|
57
56
|
this.#processQueue();
|
|
58
|
-
|
|
57
|
+
const r = await deferred.promise;
|
|
58
|
+
if (options?.onComplete) {
|
|
59
|
+
r.onOk(options.onComplete);
|
|
60
|
+
}
|
|
61
|
+
if (options?.onError) {
|
|
62
|
+
r.onErr(options.onError);
|
|
63
|
+
}
|
|
64
|
+
return r;
|
|
59
65
|
}
|
|
60
66
|
resultifyAdd(fn, options) {
|
|
61
67
|
return this.add(
|
|
62
68
|
(ctx) => resultify(async () => {
|
|
63
|
-
if (isPromise(fn)) {
|
|
64
|
-
return await fn;
|
|
65
|
-
}
|
|
66
69
|
return fn(ctx);
|
|
67
70
|
}),
|
|
68
71
|
options
|
|
69
72
|
);
|
|
70
73
|
}
|
|
71
74
|
async #processQueue() {
|
|
75
|
+
if (this.#signal?.aborted) {
|
|
76
|
+
this.clear();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
72
79
|
if (this.#pending >= this.#concurrency || this.#queue.length === 0) {
|
|
73
80
|
return;
|
|
74
81
|
}
|
|
@@ -92,43 +99,52 @@ var AsyncQueue = class {
|
|
|
92
99
|
let abortListener;
|
|
93
100
|
try {
|
|
94
101
|
if (signal?.aborted) {
|
|
95
|
-
const error = signal.reason instanceof Error ? signal.reason : new DOMException("
|
|
102
|
+
const error = signal.reason instanceof Error ? signal.reason : new DOMException("This operation was aborted", "AbortError");
|
|
96
103
|
throw error;
|
|
97
104
|
}
|
|
98
105
|
const signalAbortPromise = new Promise((_, reject) => {
|
|
99
106
|
if (signal) {
|
|
100
|
-
const error = signal.reason instanceof Error ? signal.reason : new DOMException("
|
|
107
|
+
const error = signal.reason instanceof Error ? signal.reason : new DOMException("This operation was aborted", "AbortError");
|
|
101
108
|
abortListener = () => {
|
|
102
109
|
reject(error);
|
|
103
110
|
};
|
|
104
111
|
signal.addEventListener("abort", abortListener, { once: true });
|
|
105
112
|
}
|
|
106
113
|
});
|
|
107
|
-
const taskRunPromise = task.run({ signal,
|
|
108
|
-
this.events.emit("start", {
|
|
114
|
+
const taskRunPromise = task.run({ signal, meta: task.meta });
|
|
115
|
+
this.events.emit("start", { meta: task.meta });
|
|
109
116
|
const result = await Promise.race([taskRunPromise, signalAbortPromise]);
|
|
110
117
|
if (isResult(result)) {
|
|
111
118
|
task.resolve(result);
|
|
112
119
|
if (result.error) {
|
|
113
120
|
this.#failed++;
|
|
114
|
-
this.events.emit("error", {
|
|
121
|
+
this.events.emit("error", {
|
|
122
|
+
meta: task.meta,
|
|
123
|
+
error: result.error
|
|
124
|
+
});
|
|
115
125
|
} else {
|
|
116
126
|
this.#completed++;
|
|
117
|
-
this.events.emit("complete", {
|
|
127
|
+
this.events.emit("complete", {
|
|
128
|
+
meta: task.meta,
|
|
129
|
+
value: result.value
|
|
130
|
+
});
|
|
118
131
|
}
|
|
119
132
|
} else {
|
|
120
133
|
const error = new Error("Response not a Result");
|
|
121
134
|
task.resolve(Result.err(error));
|
|
122
135
|
this.#failed++;
|
|
123
136
|
this.events.emit("error", {
|
|
124
|
-
|
|
137
|
+
meta: task.meta,
|
|
125
138
|
error
|
|
126
139
|
});
|
|
127
140
|
}
|
|
128
141
|
} catch (error) {
|
|
129
142
|
task.resolve(Result.err(error));
|
|
130
143
|
this.#failed++;
|
|
131
|
-
this.events.emit("error", {
|
|
144
|
+
this.events.emit("error", {
|
|
145
|
+
meta: task.meta,
|
|
146
|
+
error: unknownToError(error)
|
|
147
|
+
});
|
|
132
148
|
} finally {
|
|
133
149
|
if (signal && abortListener) {
|
|
134
150
|
signal.removeEventListener("abort", abortListener);
|
|
@@ -156,13 +172,9 @@ var AsyncQueue = class {
|
|
|
156
172
|
this.#idleResolvers.push(resolve);
|
|
157
173
|
});
|
|
158
174
|
}
|
|
159
|
-
clear(
|
|
175
|
+
clear() {
|
|
160
176
|
this.#queue = [];
|
|
161
177
|
this.#size = 0;
|
|
162
|
-
if (resetCounters) {
|
|
163
|
-
this.#completed = 0;
|
|
164
|
-
this.#failed = 0;
|
|
165
|
-
}
|
|
166
178
|
if (this.#pending === 0) {
|
|
167
179
|
this.#resolveIdleWaiters();
|
|
168
180
|
}
|
|
@@ -180,7 +192,7 @@ var AsyncQueue = class {
|
|
|
180
192
|
return this.#size;
|
|
181
193
|
}
|
|
182
194
|
};
|
|
183
|
-
var
|
|
195
|
+
var AsyncQueueWithMeta = class extends AsyncQueue {
|
|
184
196
|
constructor(options) {
|
|
185
197
|
super(options);
|
|
186
198
|
}
|
|
@@ -194,10 +206,10 @@ var AsyncQueueWithId = class extends AsyncQueue {
|
|
|
194
206
|
function createAsyncQueue(options) {
|
|
195
207
|
return new AsyncQueue(options);
|
|
196
208
|
}
|
|
197
|
-
function
|
|
198
|
-
return new
|
|
209
|
+
function createAsyncQueueWithMeta(options) {
|
|
210
|
+
return new AsyncQueueWithMeta(options);
|
|
199
211
|
}
|
|
200
212
|
export {
|
|
201
213
|
createAsyncQueue,
|
|
202
|
-
|
|
214
|
+
createAsyncQueueWithMeta
|
|
203
215
|
};
|
package/lib/testUtils.cjs
CHANGED
|
@@ -21,7 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var testUtils_exports = {};
|
|
22
22
|
__export(testUtils_exports, {
|
|
23
23
|
createLoggerStore: () => createLoggerStore,
|
|
24
|
-
getResultFn: () => getResultFn
|
|
24
|
+
getResultFn: () => getResultFn,
|
|
25
|
+
waitController: () => waitController
|
|
25
26
|
});
|
|
26
27
|
module.exports = __toCommonJS(testUtils_exports);
|
|
27
28
|
|
|
@@ -141,6 +142,17 @@ function omit(obj, keys) {
|
|
|
141
142
|
return result;
|
|
142
143
|
}
|
|
143
144
|
|
|
145
|
+
// src/promiseUtils.ts
|
|
146
|
+
function defer() {
|
|
147
|
+
let resolve;
|
|
148
|
+
let reject;
|
|
149
|
+
const promise = new Promise((_resolve, _reject) => {
|
|
150
|
+
resolve = _resolve;
|
|
151
|
+
reject = _reject;
|
|
152
|
+
});
|
|
153
|
+
return { resolve, reject, promise };
|
|
154
|
+
}
|
|
155
|
+
|
|
144
156
|
// src/testUtils.ts
|
|
145
157
|
function createLoggerStore({
|
|
146
158
|
filterKeys: defaultFilterKeys,
|
|
@@ -353,8 +365,23 @@ function getResultFn(fnGetter, wrapper) {
|
|
|
353
365
|
}
|
|
354
366
|
};
|
|
355
367
|
}
|
|
368
|
+
function waitController() {
|
|
369
|
+
const { promise, resolve } = defer();
|
|
370
|
+
return {
|
|
371
|
+
wait: promise,
|
|
372
|
+
stopWaiting: () => {
|
|
373
|
+
resolve();
|
|
374
|
+
},
|
|
375
|
+
stopWaitingAfter: (ms) => {
|
|
376
|
+
setTimeout(() => {
|
|
377
|
+
resolve();
|
|
378
|
+
}, ms);
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
}
|
|
356
382
|
// Annotate the CommonJS export names for ESM import in node:
|
|
357
383
|
0 && (module.exports = {
|
|
358
384
|
createLoggerStore,
|
|
359
|
-
getResultFn
|
|
385
|
+
getResultFn,
|
|
386
|
+
waitController
|
|
360
387
|
});
|
package/lib/testUtils.d.cts
CHANGED
|
@@ -34,5 +34,10 @@ declare function createLoggerStore({ filterKeys: defaultFilterKeys, rejectKeys:
|
|
|
34
34
|
addMark: (label: string) => void;
|
|
35
35
|
};
|
|
36
36
|
declare function getResultFn<T extends (...args: any[]) => any>(fnGetter: () => T, wrapper?: (...args: any[]) => any): T;
|
|
37
|
+
declare function waitController(): {
|
|
38
|
+
wait: Promise<void>;
|
|
39
|
+
stopWaiting: () => void;
|
|
40
|
+
stopWaitingAfter: (ms: number) => void;
|
|
41
|
+
};
|
|
37
42
|
|
|
38
|
-
export { createLoggerStore, getResultFn };
|
|
43
|
+
export { createLoggerStore, getResultFn, waitController };
|
package/lib/testUtils.d.ts
CHANGED
|
@@ -34,5 +34,10 @@ declare function createLoggerStore({ filterKeys: defaultFilterKeys, rejectKeys:
|
|
|
34
34
|
addMark: (label: string) => void;
|
|
35
35
|
};
|
|
36
36
|
declare function getResultFn<T extends (...args: any[]) => any>(fnGetter: () => T, wrapper?: (...args: any[]) => any): T;
|
|
37
|
+
declare function waitController(): {
|
|
38
|
+
wait: Promise<void>;
|
|
39
|
+
stopWaiting: () => void;
|
|
40
|
+
stopWaitingAfter: (ms: number) => void;
|
|
41
|
+
};
|
|
37
42
|
|
|
38
|
-
export { createLoggerStore, getResultFn };
|
|
43
|
+
export { createLoggerStore, getResultFn, waitController };
|
package/lib/testUtils.js
CHANGED
|
@@ -5,6 +5,9 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
deepEqual
|
|
7
7
|
} from "./chunk-JQFUKJU5.js";
|
|
8
|
+
import {
|
|
9
|
+
defer
|
|
10
|
+
} from "./chunk-DFXNVEH6.js";
|
|
8
11
|
import {
|
|
9
12
|
clampMin
|
|
10
13
|
} from "./chunk-HTCYUMDR.js";
|
|
@@ -228,7 +231,22 @@ function getResultFn(fnGetter, wrapper) {
|
|
|
228
231
|
}
|
|
229
232
|
};
|
|
230
233
|
}
|
|
234
|
+
function waitController() {
|
|
235
|
+
const { promise, resolve } = defer();
|
|
236
|
+
return {
|
|
237
|
+
wait: promise,
|
|
238
|
+
stopWaiting: () => {
|
|
239
|
+
resolve();
|
|
240
|
+
},
|
|
241
|
+
stopWaitingAfter: (ms) => {
|
|
242
|
+
setTimeout(() => {
|
|
243
|
+
resolve();
|
|
244
|
+
}, ms);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
}
|
|
231
248
|
export {
|
|
232
249
|
createLoggerStore,
|
|
233
|
-
getResultFn
|
|
250
|
+
getResultFn,
|
|
251
|
+
waitController
|
|
234
252
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ls-stack/utils",
|
|
3
3
|
"description": "Typescript utils",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.10.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
7
7
|
"lib"
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
"tsc": "tsc -p tsconfig.prod.json",
|
|
199
199
|
"tsc:watch": "tsc -p tsconfig.prod.json --watch",
|
|
200
200
|
"eslint": "CI=true eslint src/ scripts/ --color --max-warnings=0",
|
|
201
|
-
"build": "pnpm test && pnpm lint && pnpm build:no-test && pnpm docs && pnpm build:update-exports",
|
|
201
|
+
"build": "pnpm test && pnpm lint && pnpm build:no-test && pnpm run docs && pnpm run docs:commit && pnpm build:update-exports",
|
|
202
202
|
"build:no-test": "tsup",
|
|
203
203
|
"build:update-exports": "tsm --no-warnings scripts/updatePackageExports.ts",
|
|
204
204
|
"build-test": "tsup --config tsup.test.config.ts",
|
|
@@ -206,6 +206,7 @@
|
|
|
206
206
|
"test:console-fmt": "tsm --no-warnings scripts/testConsoleFmt.ts",
|
|
207
207
|
"bench:deepEqual": "tsm --no-warnings benchmarks/deepEqual.ts",
|
|
208
208
|
"docs": "typedoc",
|
|
209
|
-
"docs:watch": "typedoc --watch"
|
|
209
|
+
"docs:watch": "typedoc --watch",
|
|
210
|
+
"docs:commit": "git add docs && git diff --cached --quiet docs || git commit -m 'docs: update docs'"
|
|
210
211
|
}
|
|
211
212
|
}
|