@stamhoofd/queues 2.52.0 → 2.53.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/dist/src/QueueHandler.d.ts +3 -2
- package/dist/src/QueueHandler.d.ts.map +1 -1
- package/dist/src/QueueHandler.js +25 -15
- package/dist/src/QueueHandler.js.map +1 -1
- package/package.json +2 -2
- package/src/QueueHandler.ts +117 -101
|
@@ -27,7 +27,8 @@ export declare class AbortSignal {
|
|
|
27
27
|
protected listeners: ((error: unknown) => Promise<void> | void)[];
|
|
28
28
|
get isAborted(): boolean;
|
|
29
29
|
abort(error?: unknown): void;
|
|
30
|
-
throwIfAborted(cleanup
|
|
30
|
+
throwIfAborted(cleanup: () => Promise<void>): Promise<void>;
|
|
31
|
+
throwIfAborted(cleanup?: () => void): void;
|
|
31
32
|
on(on: 'abort', listener: (error: unknown) => Promise<void> | void): void;
|
|
32
33
|
}
|
|
33
34
|
/**
|
|
@@ -41,7 +42,7 @@ export declare class QueueHandler {
|
|
|
41
42
|
* Abort any running queue items. Same as 'cancel' but will also reject any running items if they support the 'abort' method (otherwise they will just resolve as normal)
|
|
42
43
|
*/
|
|
43
44
|
static abort(queue: string, error?: Error): void;
|
|
44
|
-
|
|
45
|
+
/** $
|
|
45
46
|
* Waits {timeout} ms before executing the handler, if another call is made to the same queue, the timeout is reset
|
|
46
47
|
* and the other users will receive an error.
|
|
47
48
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueueHandler.d.ts","sourceRoot":"","sources":["../../src/QueueHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"QueueHandler.d.ts","sourceRoot":"","sources":["../../src/QueueHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,cAAM,KAAK;IACP,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAM;IAC7B,QAAQ,SAAK;IACb,QAAQ,SAAK;IACb,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,CAAa;gBAE/B,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI;IAKtC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;IAI5B,iBAAiB;IAMjB,iBAAiB,CAAC,MAAM,EAAE,WAAW;IAIrC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK;CAMtB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAC9B,KAAK,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,cAAM,SAAS,CAAC,CAAC;IACb,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,WAE9C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,WAE7C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,WAE5C;AAED,qBAAa,WAAW;IACpB,SAAS,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAQ;IAChD,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAM;IAEvE,IAAI,SAAS,YAEZ;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO;IAqBrB,cAAc,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAgB1C,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAGrE;AAED;;GAEG;AACH,qBAAa,YAAY;IACrB,MAAM,CAAC,MAAM,qBAA4B;IACzC,MAAM,CAAC,iBAAiB,8BAAqC;IAE7D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAe1C;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAiBzC;;;;;OAKG;WACU,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;WA0B9G,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,SAAI,GAAG,OAAO,CAAC,CAAC,CAAC;IAuCxH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM;IAI9B;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM;mBAKP,OAAO;CAwD/B"}
|
package/dist/src/QueueHandler.js
CHANGED
|
@@ -61,17 +61,27 @@ class AbortSignal {
|
|
|
61
61
|
this.abortWithError = error ?? new simple_errors_1.SimpleError({
|
|
62
62
|
code: 'queue-aborted',
|
|
63
63
|
message: 'Queue was aborted',
|
|
64
|
-
statusCode: 500
|
|
64
|
+
statusCode: 500,
|
|
65
65
|
});
|
|
66
66
|
for (const listener of this.listeners) {
|
|
67
|
-
listener(this.abortWithError);
|
|
67
|
+
const promise = listener(this.abortWithError);
|
|
68
|
+
if (promise instanceof Promise) {
|
|
69
|
+
promise.catch((e) => {
|
|
70
|
+
console.error('Error in abort listener', e);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
68
73
|
}
|
|
69
74
|
this.listeners = [];
|
|
70
75
|
}
|
|
71
|
-
|
|
76
|
+
throwIfAborted(cleanup) {
|
|
72
77
|
if (this.isAborted) {
|
|
73
78
|
if (cleanup) {
|
|
74
|
-
|
|
79
|
+
const promise = cleanup();
|
|
80
|
+
if (promise instanceof Promise) {
|
|
81
|
+
return promise.then(() => {
|
|
82
|
+
throw this.abortWithError;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
75
85
|
}
|
|
76
86
|
throw this.abortWithError;
|
|
77
87
|
}
|
|
@@ -120,7 +130,7 @@ class QueueHandler {
|
|
|
120
130
|
q.abort(error);
|
|
121
131
|
}
|
|
122
132
|
}
|
|
123
|
-
|
|
133
|
+
/** $
|
|
124
134
|
* Waits {timeout} ms before executing the handler, if another call is made to the same queue, the timeout is reset
|
|
125
135
|
* and the other users will receive an error.
|
|
126
136
|
*
|
|
@@ -131,7 +141,7 @@ class QueueHandler {
|
|
|
131
141
|
this.abort(queue, new simple_errors_1.SimpleError({
|
|
132
142
|
code: 'queue-debounced',
|
|
133
143
|
message: 'Debounced',
|
|
134
|
-
statusCode: 500
|
|
144
|
+
statusCode: 500,
|
|
135
145
|
}));
|
|
136
146
|
// Schedule timeout (will throw if cancelled)
|
|
137
147
|
await this.schedule(queue, ({ abort }) => {
|
|
@@ -159,7 +169,7 @@ class QueueHandler {
|
|
|
159
169
|
// otherwise we could run items on the queue with the wrong context
|
|
160
170
|
const snapshot = node_async_hooks_1.AsyncLocalStorage.snapshot();
|
|
161
171
|
const item = new QueueItem();
|
|
162
|
-
item.handler =
|
|
172
|
+
item.handler = options => snapshot(async () => {
|
|
163
173
|
const currentQueues = this.asyncLocalStorage.getStore() ?? [];
|
|
164
174
|
return await this.asyncLocalStorage.run([...currentQueues, queue], async () => {
|
|
165
175
|
return await handler(options);
|
|
@@ -173,8 +183,8 @@ class QueueHandler {
|
|
|
173
183
|
q.addItem(item);
|
|
174
184
|
this.queues.set(queue, q);
|
|
175
185
|
// Run the next item if not already running
|
|
176
|
-
this.runNext(queue).catch(e => {
|
|
177
|
-
console.error(
|
|
186
|
+
this.runNext(queue).catch((e) => {
|
|
187
|
+
console.error('[QUEUE] Fatal error in queue logic', e);
|
|
178
188
|
});
|
|
179
189
|
});
|
|
180
190
|
return promise;
|
|
@@ -187,7 +197,7 @@ class QueueHandler {
|
|
|
187
197
|
*/
|
|
188
198
|
static getSize(queue) {
|
|
189
199
|
const q = this.queues.get(queue);
|
|
190
|
-
return
|
|
200
|
+
return q ? (q.runCount + q.items.length) : 0;
|
|
191
201
|
}
|
|
192
202
|
static async runNext(queue) {
|
|
193
203
|
const q = this.queues.get(queue);
|
|
@@ -209,7 +219,7 @@ class QueueHandler {
|
|
|
209
219
|
const abort = q.createAbortSignal();
|
|
210
220
|
try {
|
|
211
221
|
next.resolve(await next.handler({
|
|
212
|
-
abort
|
|
222
|
+
abort,
|
|
213
223
|
}));
|
|
214
224
|
// console.log("[QUEUE] ("+(q.runCount-1)+"/"+q.parallel+") Resolved "+queue+" ("+q.items.length+" remaining)")
|
|
215
225
|
}
|
|
@@ -217,18 +227,18 @@ class QueueHandler {
|
|
|
217
227
|
next.reject(e);
|
|
218
228
|
if (STAMHOOFD.environment !== 'test') {
|
|
219
229
|
if (!isDebouncedError(e) && !isCanceledError(e) && !isAbortedError(e)) {
|
|
220
|
-
console.log(
|
|
230
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Rejected ' + queue + ' (' + q.items.length + ' remaining)');
|
|
221
231
|
console.error(e);
|
|
222
232
|
}
|
|
223
233
|
else {
|
|
224
234
|
if (isDebouncedError(e)) {
|
|
225
|
-
console.log(
|
|
235
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Debounced ' + queue + ' (' + q.items.length + ' remaining)');
|
|
226
236
|
}
|
|
227
237
|
else if (isCanceledError(e)) {
|
|
228
|
-
console.log(
|
|
238
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Canceled ' + queue + ' (' + q.items.length + ' remaining)');
|
|
229
239
|
}
|
|
230
240
|
else if (isAbortedError(e)) {
|
|
231
|
-
console.log(
|
|
241
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Aborted ' + queue + ' (' + q.items.length + ' remaining)');
|
|
232
242
|
}
|
|
233
243
|
}
|
|
234
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueueHandler.js","sourceRoot":"","sources":["../../src/QueueHandler.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"QueueHandler.js","sourceRoot":"","sources":["../../src/QueueHandler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stamhoofd/queues",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.53.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "UNLICENCED",
|
|
@@ -16,5 +16,5 @@
|
|
|
16
16
|
"publishConfig": {
|
|
17
17
|
"access": "public"
|
|
18
18
|
},
|
|
19
|
-
"gitHead": "
|
|
19
|
+
"gitHead": "d202fb8d4a234f7369c3da54ba15f2b10b82e74e"
|
|
20
20
|
}
|
package/src/QueueHandler.ts
CHANGED
|
@@ -1,100 +1,111 @@
|
|
|
1
|
-
|
|
2
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
2
|
import { sleep } from '@stamhoofd/utility';
|
|
4
3
|
import { isSimpleError, SimpleError } from '@simonbackx/simple-errors';
|
|
5
4
|
|
|
6
5
|
class Queue {
|
|
7
|
-
name: string
|
|
8
|
-
items: QueueItem<any>[] = []
|
|
9
|
-
parallel = 1
|
|
10
|
-
runCount = 0
|
|
11
|
-
abortSignals: Set<AbortSignal> = new Set()
|
|
6
|
+
name: string;
|
|
7
|
+
items: QueueItem<any>[] = [];
|
|
8
|
+
parallel = 1;
|
|
9
|
+
runCount = 0;
|
|
10
|
+
abortSignals: Set<AbortSignal> = new Set();
|
|
12
11
|
|
|
13
12
|
constructor(name: string, parallel = 1) {
|
|
14
|
-
this.name = name
|
|
15
|
-
this.parallel = parallel
|
|
13
|
+
this.name = name;
|
|
14
|
+
this.parallel = parallel;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
17
|
addItem(item: QueueItem<any>) {
|
|
19
|
-
this.items.push(item)
|
|
18
|
+
this.items.push(item);
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
createAbortSignal() {
|
|
23
|
-
const signal = new AbortSignal()
|
|
24
|
-
this.abortSignals.add(signal)
|
|
25
|
-
return signal
|
|
22
|
+
const signal = new AbortSignal();
|
|
23
|
+
this.abortSignals.add(signal);
|
|
24
|
+
return signal;
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
removeAbortSignal(signal: AbortSignal) {
|
|
29
|
-
this.abortSignals.delete(signal)
|
|
28
|
+
this.abortSignals.delete(signal);
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
abort(error?: Error) {
|
|
33
32
|
for (const signal of this.abortSignals) {
|
|
34
|
-
signal.abort(error)
|
|
33
|
+
signal.abort(error);
|
|
35
34
|
}
|
|
36
|
-
this.abortSignals.clear() // Avoid swapping error midway the abort
|
|
35
|
+
this.abortSignals.clear(); // Avoid swapping error midway the abort
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
export type QueueHandlerOptions = {
|
|
41
|
-
abort: AbortSignal
|
|
42
|
-
}
|
|
40
|
+
abort: AbortSignal;
|
|
41
|
+
};
|
|
43
42
|
|
|
44
43
|
class QueueItem<T> {
|
|
45
|
-
handler: (options: QueueHandlerOptions) => Promise<T
|
|
46
|
-
resolve: (value: T) => void
|
|
47
|
-
reject: (reason?: any) => void
|
|
44
|
+
handler: (options: QueueHandlerOptions) => Promise<T>;
|
|
45
|
+
resolve: (value: T) => void;
|
|
46
|
+
reject: (reason?: any) => void;
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
export function isDebouncedError(error: unknown) {
|
|
51
|
-
return isSimpleError(error) && error.code === 'queue-debounced'
|
|
50
|
+
return isSimpleError(error) && error.code === 'queue-debounced';
|
|
52
51
|
}
|
|
53
52
|
|
|
54
53
|
export function isCanceledError(error: unknown) {
|
|
55
|
-
return isSimpleError(error) && error.code === 'queue-canceled'
|
|
54
|
+
return isSimpleError(error) && error.code === 'queue-canceled';
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
export function isAbortedError(error: unknown) {
|
|
59
|
-
return isSimpleError(error) && error.code === 'queue-aborted'
|
|
58
|
+
return isSimpleError(error) && error.code === 'queue-aborted';
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
export class AbortSignal {
|
|
63
|
-
protected abortWithError: unknown | null = null
|
|
64
|
-
protected listeners: ((error: unknown) => Promise<void
|
|
62
|
+
protected abortWithError: unknown | null = null;
|
|
63
|
+
protected listeners: ((error: unknown) => Promise<void> | void)[] = [];
|
|
65
64
|
|
|
66
65
|
get isAborted() {
|
|
67
|
-
return this.abortWithError !== null
|
|
66
|
+
return this.abortWithError !== null;
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
abort(error?: unknown) {
|
|
71
70
|
if (this.isAborted) {
|
|
72
|
-
return
|
|
71
|
+
return;
|
|
73
72
|
}
|
|
74
73
|
this.abortWithError = error ?? new SimpleError({
|
|
75
74
|
code: 'queue-aborted',
|
|
76
75
|
message: 'Queue was aborted',
|
|
77
|
-
statusCode: 500
|
|
78
|
-
})
|
|
76
|
+
statusCode: 500,
|
|
77
|
+
});
|
|
79
78
|
|
|
80
79
|
for (const listener of this.listeners) {
|
|
81
|
-
listener(this.abortWithError)
|
|
80
|
+
const promise = listener(this.abortWithError);
|
|
81
|
+
if (promise instanceof Promise) {
|
|
82
|
+
promise.catch((e) => {
|
|
83
|
+
console.error('Error in abort listener', e);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
82
86
|
}
|
|
83
|
-
this.listeners = []
|
|
87
|
+
this.listeners = [];
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
|
|
90
|
+
throwIfAborted(cleanup: () => Promise<void>): Promise<void>;
|
|
91
|
+
throwIfAborted(cleanup?: () => void): void;
|
|
92
|
+
throwIfAborted(cleanup?: () => Promise<void> | void): Promise<void> | void {
|
|
87
93
|
if (this.isAborted) {
|
|
88
94
|
if (cleanup) {
|
|
89
|
-
|
|
95
|
+
const promise = cleanup();
|
|
96
|
+
if (promise instanceof Promise) {
|
|
97
|
+
return promise.then(() => {
|
|
98
|
+
throw this.abortWithError;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
90
101
|
}
|
|
91
|
-
throw this.abortWithError
|
|
102
|
+
throw this.abortWithError;
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
105
|
|
|
95
106
|
// Add event listeners
|
|
96
|
-
on(on: 'abort', listener: (error: unknown) => Promise<void
|
|
97
|
-
this.listeners.push(listener)
|
|
107
|
+
on(on: 'abort', listener: (error: unknown) => Promise<void> | void) {
|
|
108
|
+
this.listeners.push(listener);
|
|
98
109
|
}
|
|
99
110
|
}
|
|
100
111
|
|
|
@@ -102,20 +113,20 @@ export class AbortSignal {
|
|
|
102
113
|
* Force the usage of a queue to prevent concurrency issues
|
|
103
114
|
*/
|
|
104
115
|
export class QueueHandler {
|
|
105
|
-
static queues = new Map<string, Queue>()
|
|
116
|
+
static queues = new Map<string, Queue>();
|
|
106
117
|
static asyncLocalStorage = new AsyncLocalStorage<string[]>();
|
|
107
118
|
|
|
108
119
|
static cancel(queue: string, error?: Error) {
|
|
109
|
-
const q = this.queues.get(queue)
|
|
120
|
+
const q = this.queues.get(queue);
|
|
110
121
|
if (q) {
|
|
111
122
|
// This doesn't interfere any running items
|
|
112
123
|
for (const item of q.items) {
|
|
113
124
|
item.handler = () => {
|
|
114
125
|
return Promise.reject(error ?? new SimpleError({
|
|
115
126
|
code: 'queue-canceled',
|
|
116
|
-
message: 'Queue '+queue+' was canceled',
|
|
117
|
-
}))
|
|
118
|
-
}
|
|
127
|
+
message: 'Queue ' + queue + ' was canceled',
|
|
128
|
+
}));
|
|
129
|
+
};
|
|
119
130
|
}
|
|
120
131
|
}
|
|
121
132
|
}
|
|
@@ -124,52 +135,52 @@ export class QueueHandler {
|
|
|
124
135
|
* Abort any running queue items. Same as 'cancel' but will also reject any running items if they support the 'abort' method (otherwise they will just resolve as normal)
|
|
125
136
|
*/
|
|
126
137
|
static abort(queue: string, error?: Error) {
|
|
127
|
-
const q = this.queues.get(queue)
|
|
138
|
+
const q = this.queues.get(queue);
|
|
128
139
|
if (q) {
|
|
129
140
|
// This doesn't interfere any running items
|
|
130
141
|
for (const item of q.items) {
|
|
131
142
|
item.handler = () => {
|
|
132
143
|
return Promise.reject(error ?? new SimpleError({
|
|
133
144
|
code: 'queue-canceled',
|
|
134
|
-
message: 'Queue '+queue+' was canceled',
|
|
135
|
-
}))
|
|
136
|
-
}
|
|
145
|
+
message: 'Queue ' + queue + ' was canceled',
|
|
146
|
+
}));
|
|
147
|
+
};
|
|
137
148
|
}
|
|
138
149
|
|
|
139
|
-
q.abort(error)
|
|
150
|
+
q.abort(error);
|
|
140
151
|
}
|
|
141
152
|
}
|
|
142
153
|
|
|
143
|
-
|
|
154
|
+
/** $
|
|
144
155
|
* Waits {timeout} ms before executing the handler, if another call is made to the same queue, the timeout is reset
|
|
145
156
|
* and the other users will receive an error.
|
|
146
|
-
*
|
|
157
|
+
*
|
|
147
158
|
* Note: this will throw if the handler was debounced and not yet executed
|
|
148
159
|
*/
|
|
149
160
|
static async debounce<T>(queue: string, handler: (options: QueueHandlerOptions) => Promise<T>, timeout: number): Promise<T> {
|
|
150
161
|
// Stop any running items that were not yet executed
|
|
151
|
-
this.abort(queue, new SimpleError({
|
|
162
|
+
this.abort(queue, new SimpleError({
|
|
152
163
|
code: 'queue-debounced',
|
|
153
164
|
message: 'Debounced',
|
|
154
|
-
statusCode: 500
|
|
165
|
+
statusCode: 500,
|
|
155
166
|
}));
|
|
156
167
|
|
|
157
168
|
// Schedule timeout (will throw if cancelled)
|
|
158
|
-
await this.schedule(queue, ({abort}) => {
|
|
169
|
+
await this.schedule(queue, ({ abort }) => {
|
|
159
170
|
return new Promise<void>((resolve, reject) => {
|
|
160
171
|
const timeoutId = setTimeout(() => {
|
|
161
|
-
resolve()
|
|
162
|
-
}, timeout)
|
|
172
|
+
resolve();
|
|
173
|
+
}, timeout);
|
|
163
174
|
|
|
164
175
|
abort.on('abort', (error) => {
|
|
165
|
-
clearTimeout(timeoutId)
|
|
166
|
-
reject(error)
|
|
167
|
-
})
|
|
168
|
-
})
|
|
176
|
+
clearTimeout(timeoutId);
|
|
177
|
+
reject(error);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
169
180
|
});
|
|
170
181
|
|
|
171
182
|
// Run the handler
|
|
172
|
-
return await this.schedule(queue, handler)
|
|
183
|
+
return await this.schedule(queue, handler);
|
|
173
184
|
}
|
|
174
185
|
|
|
175
186
|
static async schedule<T>(queue: string, handler: (options: QueueHandlerOptions) => Promise<T>, parallel = 1): Promise<T> {
|
|
@@ -178,100 +189,105 @@ export class QueueHandler {
|
|
|
178
189
|
const currentQueues = this.asyncLocalStorage.getStore();
|
|
179
190
|
if (currentQueues !== undefined && currentQueues.includes(queue)) {
|
|
180
191
|
console.warn('Recursive usage of queues detected. Ignored running in queue', queue, currentQueues);
|
|
181
|
-
return await handler({abort: new AbortSignal()});
|
|
192
|
+
return await handler({ abort: new AbortSignal() });
|
|
182
193
|
}
|
|
183
194
|
|
|
184
195
|
// We need to save the current AsyncLocalStorage context
|
|
185
196
|
// otherwise we could run items on the queue with the wrong context
|
|
186
|
-
const snapshot = AsyncLocalStorage.snapshot()
|
|
197
|
+
const snapshot = AsyncLocalStorage.snapshot();
|
|
187
198
|
|
|
188
|
-
const item = new QueueItem<T>()
|
|
189
|
-
item.handler =
|
|
199
|
+
const item = new QueueItem<T>();
|
|
200
|
+
item.handler = options => snapshot(async () => {
|
|
190
201
|
const currentQueues = this.asyncLocalStorage.getStore() ?? [];
|
|
191
202
|
return await this.asyncLocalStorage.run([...currentQueues, queue], async () => {
|
|
192
203
|
return await handler(options);
|
|
193
204
|
});
|
|
194
|
-
})
|
|
195
|
-
|
|
205
|
+
});
|
|
206
|
+
|
|
196
207
|
const promise = new Promise<T>((resolve, reject) => {
|
|
197
|
-
item.resolve = resolve
|
|
198
|
-
item.reject = reject
|
|
208
|
+
item.resolve = resolve;
|
|
209
|
+
item.reject = reject;
|
|
199
210
|
|
|
200
211
|
// We only add it here because resolve and reject is required
|
|
201
|
-
const q = this.queues.get(queue) ?? new Queue(queue, parallel)
|
|
202
|
-
q.addItem(item)
|
|
203
|
-
this.queues.set(queue, q)
|
|
212
|
+
const q = this.queues.get(queue) ?? new Queue(queue, parallel);
|
|
213
|
+
q.addItem(item);
|
|
214
|
+
this.queues.set(queue, q);
|
|
204
215
|
|
|
205
216
|
// Run the next item if not already running
|
|
206
|
-
this.runNext(queue).catch(e => {
|
|
207
|
-
console.error(
|
|
208
|
-
})
|
|
209
|
-
})
|
|
217
|
+
this.runNext(queue).catch((e) => {
|
|
218
|
+
console.error('[QUEUE] Fatal error in queue logic', e);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
210
221
|
|
|
211
|
-
return promise
|
|
222
|
+
return promise;
|
|
212
223
|
}
|
|
213
224
|
|
|
214
225
|
static isRunning(queue: string) {
|
|
215
|
-
return this.getSize(queue) > 0
|
|
226
|
+
return this.getSize(queue) > 0;
|
|
216
227
|
}
|
|
217
228
|
|
|
218
229
|
/**
|
|
219
230
|
* Returns amount of running jobs + pending jobs for a given queue
|
|
220
231
|
*/
|
|
221
232
|
static getSize(queue: string) {
|
|
222
|
-
const q = this.queues.get(queue)
|
|
223
|
-
return
|
|
233
|
+
const q = this.queues.get(queue);
|
|
234
|
+
return q ? (q.runCount + q.items.length) : 0;
|
|
224
235
|
}
|
|
225
236
|
|
|
226
237
|
private static async runNext(queue: string) {
|
|
227
|
-
const q = this.queues.get(queue)
|
|
238
|
+
const q = this.queues.get(queue);
|
|
228
239
|
if (!q) {
|
|
229
240
|
// console.warn("[QUEUE] Queue not found (no items left)", queue)
|
|
230
|
-
return
|
|
241
|
+
return;
|
|
231
242
|
}
|
|
232
243
|
|
|
233
244
|
if (q.runCount >= q.parallel) {
|
|
234
245
|
// console.log("[QUEUE] Queue", queue, 'reached maximum of', q.parallel)
|
|
235
|
-
return
|
|
246
|
+
return;
|
|
236
247
|
}
|
|
237
248
|
|
|
238
|
-
const next = q.items.shift()
|
|
249
|
+
const next = q.items.shift();
|
|
239
250
|
|
|
240
251
|
if (next === undefined) {
|
|
241
|
-
this.queues.delete(queue)
|
|
242
|
-
return
|
|
252
|
+
this.queues.delete(queue);
|
|
253
|
+
return;
|
|
243
254
|
}
|
|
244
255
|
|
|
245
|
-
q.runCount += 1
|
|
256
|
+
q.runCount += 1;
|
|
246
257
|
// console.log("[QUEUE] ("+q.runCount+"/"+q.parallel+") Executing "+queue+" ("+q.items.length+" remaining)")
|
|
247
|
-
const abort = q.createAbortSignal()
|
|
258
|
+
const abort = q.createAbortSignal();
|
|
248
259
|
|
|
249
260
|
try {
|
|
250
261
|
next.resolve(await next.handler({
|
|
251
|
-
abort
|
|
252
|
-
}))
|
|
262
|
+
abort,
|
|
263
|
+
}));
|
|
253
264
|
// console.log("[QUEUE] ("+(q.runCount-1)+"/"+q.parallel+") Resolved "+queue+" ("+q.items.length+" remaining)")
|
|
254
|
-
}
|
|
255
|
-
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
next.reject(e);
|
|
256
268
|
if (STAMHOOFD.environment !== 'test') {
|
|
257
269
|
if (!isDebouncedError(e) && !isCanceledError(e) && !isAbortedError(e)) {
|
|
258
|
-
console.log(
|
|
259
|
-
console.error(e)
|
|
260
|
-
}
|
|
270
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Rejected ' + queue + ' (' + q.items.length + ' remaining)');
|
|
271
|
+
console.error(e);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
261
274
|
if (isDebouncedError(e)) {
|
|
262
|
-
console.log(
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
275
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Debounced ' + queue + ' (' + q.items.length + ' remaining)');
|
|
276
|
+
}
|
|
277
|
+
else if (isCanceledError(e)) {
|
|
278
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Canceled ' + queue + ' (' + q.items.length + ' remaining)');
|
|
279
|
+
}
|
|
280
|
+
else if (isAbortedError(e)) {
|
|
281
|
+
console.log('[QUEUE] (' + (q.runCount - 1) + '/' + q.parallel + ') Aborted ' + queue + ' (' + q.items.length + ' remaining)');
|
|
267
282
|
}
|
|
268
283
|
}
|
|
269
284
|
}
|
|
270
|
-
}
|
|
271
|
-
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
q.removeAbortSignal(abort);
|
|
272
288
|
}
|
|
273
289
|
|
|
274
|
-
q.runCount -= 1
|
|
275
|
-
await this.runNext(queue)
|
|
290
|
+
q.runCount -= 1;
|
|
291
|
+
await this.runNext(queue);
|
|
276
292
|
}
|
|
277
293
|
}
|