timequeue 4.0.0 → 4.0.2
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/README.md +2 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.js +29 -20
- package/dist/index.js.map +1 -1
- package/dist/mem-store.d.ts +1 -1
- package/dist/mem-store.js +1 -0
- package/dist/mem-store.js.map +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.js +0 -4
- package/dist/store.js.map +1 -1
- package/package.json +13 -11
package/README.md
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
A queue with custom concurrency and time limits. Inspired by [async/queue](https://caolan.github.io/async/v3/docs.html#queue), but also with variable number of arguments in the worker, events, and with optional time limits.
|
|
4
4
|
|
|
5
|
-
](https://www.npmjs.com/package/timequeue)
|
|
6
|
+
[](https://github.com/fent/timequeue.js/actions/workflows/nodejs.yml)
|
|
6
7
|
[](https://codecov.io/gh/fent/timequeue.js)
|
|
7
8
|
|
|
8
9
|
# Usage
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
export declare type Worker = (...args: any[]) => void | Promise<any>;
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { Store } from './store';
|
|
3
|
+
export type { Store, StoreOptions } from './store';
|
|
4
|
+
export type Worker = (...args: any[]) => void | Promise<any>;
|
|
6
5
|
export interface Options {
|
|
7
6
|
concurrency?: number;
|
|
8
7
|
every?: number;
|
package/dist/index.js
CHANGED
|
@@ -12,15 +12,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.TaskError =
|
|
16
|
-
const
|
|
15
|
+
exports.TaskError = void 0;
|
|
16
|
+
const node_events_1 = require("node:events");
|
|
17
17
|
const mem_store_1 = __importDefault(require("./mem-store"));
|
|
18
|
-
var store_1 = require("./store");
|
|
19
|
-
Object.defineProperty(exports, "StoreOptions", { enumerable: true, get: function () { return store_1.StoreOptions; } });
|
|
20
18
|
class TaskError extends Error {
|
|
21
19
|
}
|
|
22
20
|
exports.TaskError = TaskError;
|
|
23
|
-
class TimeQueue extends
|
|
21
|
+
class TimeQueue extends node_events_1.EventEmitter {
|
|
24
22
|
/**
|
|
25
23
|
* @constructor
|
|
26
24
|
* @extends {EventEmitter}
|
|
@@ -41,12 +39,13 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
41
39
|
// How many tasks have finished.
|
|
42
40
|
this.finished = 0;
|
|
43
41
|
this.worker = worker;
|
|
44
|
-
this._isWorkerAsync = worker.constructor.name
|
|
42
|
+
this._isWorkerAsync = worker.constructor.name === 'AsyncFunction';
|
|
45
43
|
this.concurrency = options.concurrency || 1;
|
|
46
44
|
this.every = options.every || 0;
|
|
47
45
|
this.maxQueued = options.maxQueued || Infinity;
|
|
48
46
|
this.timeout = options.timeout || 0;
|
|
49
|
-
this.store =
|
|
47
|
+
this.store =
|
|
48
|
+
options.store || new mem_store_1.default({ maxQueued: this.maxQueued });
|
|
50
49
|
this._timers = [];
|
|
51
50
|
}
|
|
52
51
|
/**
|
|
@@ -56,11 +55,12 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
56
55
|
* @param {Function(!Error, ...)} callback
|
|
57
56
|
* @return {Promise?}
|
|
58
57
|
*/
|
|
58
|
+
// biome-ignore lint/suspicious/noExplicitAny: tasks accept arbitrary arguments
|
|
59
59
|
push(...args) {
|
|
60
60
|
return __awaiter(this, void 0, void 0, function* () {
|
|
61
61
|
// Returns a promise when no `callback` is given.
|
|
62
|
-
if (this._isWorkerAsync && args.length === this.worker.length ||
|
|
63
|
-
!this._isWorkerAsync && args.length < this.worker.length) {
|
|
62
|
+
if ((this._isWorkerAsync && args.length === this.worker.length) ||
|
|
63
|
+
(!this._isWorkerAsync && args.length < this.worker.length)) {
|
|
64
64
|
return new Promise((resolve, reject) => {
|
|
65
65
|
// Add any missing arguments.
|
|
66
66
|
if (!this._isWorkerAsync) {
|
|
@@ -70,7 +70,9 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
70
70
|
}
|
|
71
71
|
// Calling from the prototype directly fixes an infinute loop bug that
|
|
72
72
|
// occurs when this method is overwritten by a child class.
|
|
73
|
-
TimeQueue.prototype.push.call(this, ...args,
|
|
73
|
+
TimeQueue.prototype.push.call(this, ...args,
|
|
74
|
+
// biome-ignore lint/suspicious/noExplicitAny: callback can return arbitrary results
|
|
75
|
+
(err, results) => {
|
|
74
76
|
if (err)
|
|
75
77
|
return reject(err);
|
|
76
78
|
resolve(results);
|
|
@@ -95,11 +97,12 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
95
97
|
*
|
|
96
98
|
* @param {Array.<Object>} args
|
|
97
99
|
*/
|
|
100
|
+
// biome-ignore lint/suspicious/noExplicitAny: task args are dynamically typed
|
|
98
101
|
_process(args) {
|
|
99
102
|
return __awaiter(this, void 0, void 0, function* () {
|
|
100
103
|
const callback = args.pop();
|
|
101
104
|
let finished = false;
|
|
102
|
-
|
|
105
|
+
const every = ~~this.every;
|
|
103
106
|
let tookLongerThanEvery;
|
|
104
107
|
if (every) {
|
|
105
108
|
tookLongerThanEvery = false;
|
|
@@ -117,8 +120,9 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
117
120
|
// If `timeout` option is set, set a timeout to check the task doesn't lag.
|
|
118
121
|
let taskTimedOut = false;
|
|
119
122
|
let callbackCalled = false;
|
|
120
|
-
|
|
123
|
+
const timeout = ~~this.timeout;
|
|
121
124
|
let tid;
|
|
125
|
+
// biome-ignore lint/suspicious/noExplicitAny: worker result is arbitrary
|
|
122
126
|
const taskCallback = (err, result) => {
|
|
123
127
|
// If this task has timed out, and the callback is called again
|
|
124
128
|
// from the worker, ignore it.
|
|
@@ -172,15 +176,18 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
172
176
|
*/
|
|
173
177
|
_next() {
|
|
174
178
|
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
this.
|
|
179
|
+
if (this.intransit <= this.concurrency) {
|
|
180
|
+
const task = yield this.store.getNextTask();
|
|
181
|
+
if (task) {
|
|
182
|
+
this.active++;
|
|
183
|
+
yield this._process(task);
|
|
184
|
+
if ((yield this.store.getQueueLen()) === 0) {
|
|
185
|
+
this.emit('empty');
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
181
188
|
}
|
|
182
189
|
}
|
|
183
|
-
|
|
190
|
+
if (--this.intransit === 0) {
|
|
184
191
|
this.emit('drain');
|
|
185
192
|
}
|
|
186
193
|
});
|
|
@@ -192,7 +199,9 @@ class TimeQueue extends events_1.EventEmitter {
|
|
|
192
199
|
die() {
|
|
193
200
|
return __awaiter(this, void 0, void 0, function* () {
|
|
194
201
|
yield this.store.clear();
|
|
195
|
-
this._timers
|
|
202
|
+
for (const t of this._timers) {
|
|
203
|
+
clearTimeout(t);
|
|
204
|
+
}
|
|
196
205
|
this._timers = [];
|
|
197
206
|
this.intransit = 0;
|
|
198
207
|
this.active = 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mem-store.d.ts
CHANGED
package/dist/mem-store.js
CHANGED
package/dist/mem-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mem-store.js","sourceRoot":"","sources":["../src/mem-store.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,MAAqB,WAAW;
|
|
1
|
+
{"version":3,"file":"mem-store.js","sourceRoot":"","sources":["../src/mem-store.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,MAAqB,WAAW;IAI9B,YAAY,OAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IACK,WAAW;;YACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5B,CAAC;KAAA;IACK,WAAW;;YACf,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;KAAA;IACD,uEAAuE;IACjE,QAAQ,CAAC,IAAW;;YACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;KAAA;IACK,KAAK;;YACT,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;KAAA;CACF;AAvBD,8BAuBC"}
|
package/dist/store.d.ts
CHANGED
package/dist/store.js
CHANGED
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"flow",
|
|
7
7
|
"time"
|
|
8
8
|
],
|
|
9
|
-
"version": "4.0.
|
|
9
|
+
"version": "4.0.2",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "git://github.com/fent/timequeue.js.git"
|
|
@@ -19,21 +19,23 @@
|
|
|
19
19
|
"scripts": {
|
|
20
20
|
"prepare": "tsc -p tsconfig.build.json",
|
|
21
21
|
"build": "tsc -p tsconfig.build.json",
|
|
22
|
+
"lint": "biome check .",
|
|
23
|
+
"lint:fix": "biome check --write .",
|
|
22
24
|
"test": "nyc --extension .ts --reporter=lcov --reporter=text-summary npm run test:unit",
|
|
23
|
-
"test:unit": "mocha --
|
|
25
|
+
"test:unit": "mocha --require ts-node/register test/*-test.ts"
|
|
24
26
|
},
|
|
25
27
|
"devDependencies": {
|
|
26
|
-
"@
|
|
27
|
-
"@types/
|
|
28
|
-
"@types/
|
|
29
|
-
"mocha": "^
|
|
30
|
-
"nyc": "^
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"typescript": "^4.5.4"
|
|
28
|
+
"@biomejs/biome": "2.5.15",
|
|
29
|
+
"@types/mocha": "^10.0.10",
|
|
30
|
+
"@types/node": "^20.1.2",
|
|
31
|
+
"mocha": "^12.0.3",
|
|
32
|
+
"nyc": "^18.0.0",
|
|
33
|
+
"ts-node": "^10.9.2",
|
|
34
|
+
"typescript": "^5.6.3"
|
|
34
35
|
},
|
|
35
36
|
"engines": {
|
|
36
|
-
"node": ">=
|
|
37
|
+
"node": ">=20"
|
|
37
38
|
},
|
|
39
|
+
"sideEffects": false,
|
|
38
40
|
"license": "MIT"
|
|
39
41
|
}
|