@stamhoofd/queues 2.1.3 → 2.6.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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/src/QueueHandler.d.ts +27 -0
- package/dist/src/QueueHandler.d.ts.map +1 -0
- package/dist/src/QueueHandler.js +102 -0
- package/dist/src/QueueHandler.js.map +1 -0
- package/dist/src/QueueHandler.test.d.ts +2 -0
- package/dist/src/QueueHandler.test.d.ts.map +1 -0
- package/dist/src/QueueHandler.test.js +73 -0
- package/dist/src/QueueHandler.test.js.map +1 -0
- package/package.json +4 -3
- package/src/QueueHandler.ts +13 -1
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,6DAAkC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
declare class Queue {
|
|
4
|
+
name: string;
|
|
5
|
+
items: QueueItem<any>[];
|
|
6
|
+
parallel: number;
|
|
7
|
+
runCount: number;
|
|
8
|
+
constructor(name: string, parallel?: number);
|
|
9
|
+
addItem(item: QueueItem<any>): void;
|
|
10
|
+
}
|
|
11
|
+
declare class QueueItem<T> {
|
|
12
|
+
handler: () => Promise<T>;
|
|
13
|
+
resolve: (value: T) => void;
|
|
14
|
+
reject: (reason?: any) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Force the usage of a queue to prevent concurrency issues
|
|
18
|
+
*/
|
|
19
|
+
export declare class QueueHandler {
|
|
20
|
+
static queues: Map<string, Queue>;
|
|
21
|
+
static asyncLocalStorage: AsyncLocalStorage<string[]>;
|
|
22
|
+
static cancel(queue: string): void;
|
|
23
|
+
static schedule<T>(queue: string, handler: () => Promise<T>, parallel?: number): Promise<T>;
|
|
24
|
+
private static runNext;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=QueueHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueueHandler.d.ts","sourceRoot":"","sources":["../../src/QueueHandler.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,cAAM,KAAK;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAK;IAC5B,QAAQ,SAAI;IACZ,QAAQ,SAAI;gBAEA,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAI;IAKtC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;CAG/B;AAED,cAAM,SAAS,CAAC,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CACjC;AAED;;GAEG;AACH,qBAAa,YAAY;IACrB,MAAM,CAAC,MAAM,qBAA2B;IACxC,MAAM,CAAC,iBAAiB,8BAAqC;IAE7D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;WAYd,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,SAAI,GAAG,OAAO,CAAC,CAAC,CAAC;mBAuCvE,OAAO;CAoC/B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueueHandler = void 0;
|
|
4
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
|
+
class Queue {
|
|
6
|
+
constructor(name, parallel = 1) {
|
|
7
|
+
this.items = [];
|
|
8
|
+
this.parallel = 1;
|
|
9
|
+
this.runCount = 0;
|
|
10
|
+
this.name = name;
|
|
11
|
+
this.parallel = parallel;
|
|
12
|
+
}
|
|
13
|
+
addItem(item) {
|
|
14
|
+
this.items.push(item);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class QueueItem {
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Force the usage of a queue to prevent concurrency issues
|
|
21
|
+
*/
|
|
22
|
+
class QueueHandler {
|
|
23
|
+
static cancel(queue) {
|
|
24
|
+
const q = this.queues.get(queue);
|
|
25
|
+
if (q) {
|
|
26
|
+
// This doesn't interfere any running items
|
|
27
|
+
for (const item of q.items) {
|
|
28
|
+
item.handler = () => {
|
|
29
|
+
return Promise.reject(new Error('Queue was cancelled'));
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
static async schedule(queue, handler, parallel = 1) {
|
|
35
|
+
// console.log("[QUEUE] Schedule "+queue)
|
|
36
|
+
const currentQueues = this.asyncLocalStorage.getStore();
|
|
37
|
+
if (currentQueues !== undefined && currentQueues.includes(queue)) {
|
|
38
|
+
console.warn('Recursive usage of queues detected. Ignored running in queue', queue, currentQueues);
|
|
39
|
+
return await handler();
|
|
40
|
+
}
|
|
41
|
+
// We need to save the current AsyncLocalStorage context
|
|
42
|
+
// otherwise we could run items on the queue with the wrong context
|
|
43
|
+
const snapshot = node_async_hooks_1.AsyncLocalStorage.snapshot();
|
|
44
|
+
const item = new QueueItem();
|
|
45
|
+
item.handler = () => snapshot(async () => {
|
|
46
|
+
var _a;
|
|
47
|
+
const currentQueues = (_a = this.asyncLocalStorage.getStore()) !== null && _a !== void 0 ? _a : [];
|
|
48
|
+
return await this.asyncLocalStorage.run([...currentQueues, queue], async () => {
|
|
49
|
+
return await handler();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
const promise = new Promise((resolve, reject) => {
|
|
53
|
+
var _a;
|
|
54
|
+
item.resolve = resolve;
|
|
55
|
+
item.reject = reject;
|
|
56
|
+
// We only add it here because resolve and reject is required
|
|
57
|
+
const q = (_a = this.queues.get(queue)) !== null && _a !== void 0 ? _a : new Queue(queue, parallel);
|
|
58
|
+
q.addItem(item);
|
|
59
|
+
this.queues.set(queue, q);
|
|
60
|
+
// Run the next item if not already running
|
|
61
|
+
this.runNext(queue).catch(e => {
|
|
62
|
+
console.error("[QUEUE] Fatal error in queue logic", e);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
return promise;
|
|
66
|
+
}
|
|
67
|
+
static async runNext(queue) {
|
|
68
|
+
const q = this.queues.get(queue);
|
|
69
|
+
if (!q) {
|
|
70
|
+
// console.warn("[QUEUE] Queue not found (no items left)", queue)
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (q.runCount >= q.parallel) {
|
|
74
|
+
// console.log("[QUEUE] Queue", queue, 'reached maximum of', q.parallel)
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const next = q.items.shift();
|
|
78
|
+
if (next === undefined) {
|
|
79
|
+
this.queues.delete(queue);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
q.runCount += 1;
|
|
83
|
+
// console.log("[QUEUE] ("+q.runCount+"/"+q.parallel+") Executing "+queue+" ("+q.items.length+" remaining)")
|
|
84
|
+
try {
|
|
85
|
+
next.resolve(await next.handler());
|
|
86
|
+
// console.log("[QUEUE] ("+(q.runCount-1)+"/"+q.parallel+") Resolved "+queue+" ("+q.items.length+" remaining)")
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
next.reject(e);
|
|
90
|
+
if (STAMHOOFD.environment !== 'test') {
|
|
91
|
+
console.log("[QUEUE] (" + (q.runCount - 1) + "/" + q.parallel + ") Rejected " + queue + " (" + q.items.length + " remaining)");
|
|
92
|
+
console.error(e);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
q.runCount -= 1;
|
|
96
|
+
await this.runNext(queue);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.QueueHandler = QueueHandler;
|
|
100
|
+
QueueHandler.queues = new Map();
|
|
101
|
+
QueueHandler.asyncLocalStorage = new node_async_hooks_1.AsyncLocalStorage();
|
|
102
|
+
//# sourceMappingURL=QueueHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueueHandler.js","sourceRoot":"","sources":["../../src/QueueHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueueHandler.test.d.ts","sourceRoot":"","sources":["../../src/QueueHandler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
4
|
+
const QueueHandler_1 = require("./QueueHandler");
|
|
5
|
+
describe('QueueHandler', () => {
|
|
6
|
+
it('Guards against deadlocks', async () => {
|
|
7
|
+
const result = await QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
8
|
+
return QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
9
|
+
return 'test';
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
expect(result).toBe('test');
|
|
13
|
+
});
|
|
14
|
+
it('Guards against deep deadlocks', async () => {
|
|
15
|
+
const result = await QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
16
|
+
return QueueHandler_1.QueueHandler.schedule('other', async () => {
|
|
17
|
+
return QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
18
|
+
return QueueHandler_1.QueueHandler.schedule('other', async () => {
|
|
19
|
+
return QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
20
|
+
return 'test';
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
expect(result).toBe('test');
|
|
27
|
+
});
|
|
28
|
+
it('Inherits the right AsyncLocalStorage context', async () => {
|
|
29
|
+
const context = new node_async_hooks_1.AsyncLocalStorage();
|
|
30
|
+
const ranContexts = [];
|
|
31
|
+
const promises = [];
|
|
32
|
+
// Do some quick scheduling
|
|
33
|
+
for (let i = 0; i < 20; i++) {
|
|
34
|
+
context.run(i.toString(), async () => {
|
|
35
|
+
promises.push(QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
36
|
+
var _a;
|
|
37
|
+
await new Promise(resolve => {
|
|
38
|
+
setTimeout(() => {
|
|
39
|
+
resolve();
|
|
40
|
+
}, 100);
|
|
41
|
+
});
|
|
42
|
+
ranContexts.push((_a = context.getStore()) !== null && _a !== void 0 ? _a : '');
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
await Promise.allSettled(promises);
|
|
47
|
+
expect(ranContexts).toHaveLength(20);
|
|
48
|
+
expect(ranContexts.sort()).toEqual(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'].sort());
|
|
49
|
+
});
|
|
50
|
+
it('Inherits the right AsyncLocalStorage context with parallel execution', async () => {
|
|
51
|
+
const context = new node_async_hooks_1.AsyncLocalStorage();
|
|
52
|
+
const ranContexts = [];
|
|
53
|
+
const promises = [];
|
|
54
|
+
// Do some quick scheduling
|
|
55
|
+
for (let i = 0; i < 50; i++) {
|
|
56
|
+
context.run(i.toString(), async () => {
|
|
57
|
+
promises.push(QueueHandler_1.QueueHandler.schedule('test', async () => {
|
|
58
|
+
var _a;
|
|
59
|
+
await new Promise(resolve => {
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
resolve();
|
|
62
|
+
}, 100);
|
|
63
|
+
});
|
|
64
|
+
ranContexts.push((_a = context.getStore()) !== null && _a !== void 0 ? _a : '');
|
|
65
|
+
}, 5));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
await Promise.allSettled(promises);
|
|
69
|
+
expect(ranContexts).toHaveLength(50);
|
|
70
|
+
expect(ranContexts.sort()).toEqual(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49'].sort());
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=QueueHandler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueueHandler.test.js","sourceRoot":"","sources":["../../src/QueueHandler.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stamhoofd/queues",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "UNLICENCED",
|
|
7
7
|
"sideEffects": false,
|
|
8
8
|
"files": [
|
|
9
|
-
"src"
|
|
9
|
+
"src",
|
|
10
|
+
"dist"
|
|
10
11
|
],
|
|
11
12
|
"scripts": {
|
|
12
13
|
"build": "tsc -b",
|
|
@@ -14,5 +15,5 @@
|
|
|
14
15
|
"test": "jest --runInBand",
|
|
15
16
|
"test:reset": "yarn build:full && jest --runInBand"
|
|
16
17
|
},
|
|
17
|
-
"gitHead": "
|
|
18
|
+
"gitHead": "7a3f9f6c08058dc8b671befbfad73184afdc6d7c"
|
|
18
19
|
}
|
package/src/QueueHandler.ts
CHANGED
|
@@ -30,6 +30,18 @@ export class QueueHandler {
|
|
|
30
30
|
static queues = new Map<string, Queue>()
|
|
31
31
|
static asyncLocalStorage = new AsyncLocalStorage<string[]>();
|
|
32
32
|
|
|
33
|
+
static cancel(queue: string) {
|
|
34
|
+
const q = this.queues.get(queue)
|
|
35
|
+
if (q) {
|
|
36
|
+
// This doesn't interfere any running items
|
|
37
|
+
for (const item of q.items) {
|
|
38
|
+
item.handler = () => {
|
|
39
|
+
return Promise.reject(new Error('Queue was cancelled'))
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
33
45
|
static async schedule<T>(queue: string, handler: () => Promise<T>, parallel = 1): Promise<T> {
|
|
34
46
|
// console.log("[QUEUE] Schedule "+queue)
|
|
35
47
|
|
|
@@ -105,4 +117,4 @@ export class QueueHandler {
|
|
|
105
117
|
q.runCount -= 1
|
|
106
118
|
await this.runNext(queue)
|
|
107
119
|
}
|
|
108
|
-
}
|
|
120
|
+
}
|