@anishhs/retryq 1.1.0 → 1.2.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/README.md +142 -19
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +13 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/manager.d.ts +139 -0
- package/dist/cjs/manager.d.ts.map +1 -0
- package/dist/cjs/manager.js +431 -0
- package/dist/cjs/manager.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types.d.ts +237 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.d.ts +43 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +71 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/cjs/validation.d.ts +37 -0
- package/dist/cjs/validation.d.ts.map +1 -0
- package/dist/cjs/validation.js +69 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/manager.d.ts +139 -0
- package/dist/esm/manager.d.ts.map +1 -0
- package/dist/esm/manager.js +427 -0
- package/dist/esm/manager.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/types.d.ts +237 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +43 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +64 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/validation.d.ts +37 -0
- package/dist/esm/validation.d.ts.map +1 -0
- package/dist/esm/validation.js +65 -0
- package/dist/esm/validation.js.map +1 -0
- package/package.json +29 -12
- package/dist/index.d.ts +0 -85
- package/dist/index.js +0 -293
- package/dist/index.js.map +0 -1
package/dist/index.js
DELETED
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RetryQManager = void 0;
|
|
4
|
-
// Custom ID generator - improved collision resistance with counter + multiple random segments
|
|
5
|
-
let idCounter = 0;
|
|
6
|
-
function randomId() {
|
|
7
|
-
const timestamp = Date.now();
|
|
8
|
-
const counter = (idCounter++ % 10000).toString(36);
|
|
9
|
-
const random1 = Math.random().toString(36).slice(2, 11);
|
|
10
|
-
const random2 = Math.random().toString(36).slice(2, 11);
|
|
11
|
-
return `job-${timestamp}-${counter}-${random1}${random2}`;
|
|
12
|
-
}
|
|
13
|
-
function sleep(ms, cancelFn) {
|
|
14
|
-
return new Promise((resolve, reject) => {
|
|
15
|
-
const timer = setTimeout(() => resolve(), ms);
|
|
16
|
-
if (cancelFn) {
|
|
17
|
-
cancelFn.cancelSleep = () => {
|
|
18
|
-
clearTimeout(timer);
|
|
19
|
-
reject(new Error("RetryQ job cancelled"));
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
class RetryQManager {
|
|
25
|
-
constructor(config = {}) {
|
|
26
|
-
var _a, _b;
|
|
27
|
-
this.pendingQueue = [];
|
|
28
|
-
this.runningJobs = new Map();
|
|
29
|
-
this.failedJobs = new Map();
|
|
30
|
-
this.completedJobs = new Map();
|
|
31
|
-
this.registry = new Map();
|
|
32
|
-
// Support legacy number parameter for backwards compatibility
|
|
33
|
-
if (typeof config === "number") {
|
|
34
|
-
this.maxConcurrent = config;
|
|
35
|
-
this.maxHistorySize = 1000;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
this.maxConcurrent = (_a = config.maxConcurrent) !== null && _a !== void 0 ? _a : Infinity;
|
|
39
|
-
this.maxHistorySize = (_b = config.maxHistorySize) !== null && _b !== void 0 ? _b : 1000;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// Evict oldest job from a map when it exceeds maxHistorySize
|
|
43
|
-
_evictOldest(map) {
|
|
44
|
-
if (map.size >= this.maxHistorySize) {
|
|
45
|
-
const oldest = map.keys().next().value;
|
|
46
|
-
if (oldest) {
|
|
47
|
-
map.delete(oldest);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
// Clear job history for a specific state or all states
|
|
52
|
-
clearHistory(state) {
|
|
53
|
-
if (!state || state === "failed") {
|
|
54
|
-
this.failedJobs.clear();
|
|
55
|
-
}
|
|
56
|
-
if (!state || state === "completed") {
|
|
57
|
-
this.completedJobs.clear();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
createJob(fn, options = {}) {
|
|
61
|
-
var _a, _b, _c, _d, _e, _f;
|
|
62
|
-
// Input validation to prevent DoS and invalid configurations
|
|
63
|
-
const retries = (_a = options.retries) !== null && _a !== void 0 ? _a : 3;
|
|
64
|
-
const delay = (_b = options.delay) !== null && _b !== void 0 ? _b : 1000;
|
|
65
|
-
const backoff = (_c = options.backoff) !== null && _c !== void 0 ? _c : 2;
|
|
66
|
-
const maxTime = (_d = options.maxTime) !== null && _d !== void 0 ? _d : 30000; // Increased from 5000 to 30000 (30s)
|
|
67
|
-
const jitter = (_e = options.jitter) !== null && _e !== void 0 ? _e : 0.1;
|
|
68
|
-
const priority = (_f = options.priority) !== null && _f !== void 0 ? _f : 1;
|
|
69
|
-
// Validate inputs
|
|
70
|
-
if (retries < 0) {
|
|
71
|
-
throw new Error("retries must be >= 0");
|
|
72
|
-
}
|
|
73
|
-
if (retries > 100) {
|
|
74
|
-
throw new Error("retries cannot exceed 100 (DoS protection)");
|
|
75
|
-
}
|
|
76
|
-
if (delay < 0) {
|
|
77
|
-
throw new Error("delay must be >= 0");
|
|
78
|
-
}
|
|
79
|
-
if (backoff < 1) {
|
|
80
|
-
throw new Error("backoff must be >= 1");
|
|
81
|
-
}
|
|
82
|
-
if (maxTime <= 0) {
|
|
83
|
-
throw new Error("maxTime must be > 0");
|
|
84
|
-
}
|
|
85
|
-
if (jitter < 0 || jitter > 1) {
|
|
86
|
-
throw new Error("jitter must be between 0 and 1");
|
|
87
|
-
}
|
|
88
|
-
const id = randomId();
|
|
89
|
-
// Create internal AbortController for force cancellation
|
|
90
|
-
const abortController = new AbortController();
|
|
91
|
-
// If external signal provided, link it to internal controller
|
|
92
|
-
if (options.signal) {
|
|
93
|
-
const externalSignal = options.signal;
|
|
94
|
-
externalSignal.addEventListener('abort', () => {
|
|
95
|
-
if (!abortController.signal.aborted) {
|
|
96
|
-
abortController.abort(externalSignal.reason);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
const job = {
|
|
101
|
-
id,
|
|
102
|
-
label: options.label || id,
|
|
103
|
-
state: "pending",
|
|
104
|
-
priority,
|
|
105
|
-
retriesLeft: retries + 1, // +1 for initial attempt (retries is number of RETRIES, not total attempts)
|
|
106
|
-
promise: Promise.resolve(), // placeholder
|
|
107
|
-
cancel: (force) => this.cancelJob(id, force),
|
|
108
|
-
fn,
|
|
109
|
-
options: Object.assign(Object.assign({}, options), { retries, delay, backoff, maxTime, jitter, priority }),
|
|
110
|
-
createdAt: Date.now(),
|
|
111
|
-
abortController,
|
|
112
|
-
};
|
|
113
|
-
// Add to pending queue BEFORE starting execution (fixes state inconsistency)
|
|
114
|
-
this.pendingQueue.push(job);
|
|
115
|
-
this._sortQueue();
|
|
116
|
-
// Start execution
|
|
117
|
-
job.promise = this._runJob(job);
|
|
118
|
-
// Add internal error handler to prevent unhandled promise rejections
|
|
119
|
-
job.promise.catch(() => {
|
|
120
|
-
// Errors are already handled in _runJob and stored in job.error
|
|
121
|
-
// This catch prevents unhandled rejection if consumer doesn't add .catch()
|
|
122
|
-
});
|
|
123
|
-
this._processQueue();
|
|
124
|
-
return job;
|
|
125
|
-
}
|
|
126
|
-
_sortQueue() {
|
|
127
|
-
this.pendingQueue.sort((a, b) => b.priority - a.priority);
|
|
128
|
-
}
|
|
129
|
-
_processQueue() {
|
|
130
|
-
// Synchronous to prevent race conditions with concurrent calls
|
|
131
|
-
while (this.runningJobs.size < this.maxConcurrent &&
|
|
132
|
-
this.pendingQueue.length > 0) {
|
|
133
|
-
const job = this.pendingQueue.shift();
|
|
134
|
-
// job.promise already set in createJob
|
|
135
|
-
this.runningJobs.set(job.id, job);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
async _runJob(job) {
|
|
139
|
-
var _a, _b, _c, _d;
|
|
140
|
-
// Wait until _processQueue() has moved this job to runningJobs
|
|
141
|
-
// This enforces concurrency control
|
|
142
|
-
while (!this.runningJobs.has(job.id)) {
|
|
143
|
-
// Check if cancelled while waiting
|
|
144
|
-
if (job.state === "cancelled") {
|
|
145
|
-
throw job.error || new Error("Job cancelled");
|
|
146
|
-
}
|
|
147
|
-
// Check if external/internal signal already aborted
|
|
148
|
-
if ((_a = job.abortController) === null || _a === void 0 ? void 0 : _a.signal.aborted) {
|
|
149
|
-
job.state = "cancelled";
|
|
150
|
-
job.error = new Error("Job cancelled via abort signal");
|
|
151
|
-
throw job.error;
|
|
152
|
-
}
|
|
153
|
-
// Yield control to allow _processQueue() to run
|
|
154
|
-
await new Promise(resolve => setTimeout(resolve, 0));
|
|
155
|
-
}
|
|
156
|
-
job.state = "running";
|
|
157
|
-
job.startedAt = Date.now();
|
|
158
|
-
const cancelFn = () => { };
|
|
159
|
-
this.registry.set(job.id, cancelFn);
|
|
160
|
-
const { delay = 1000, backoff = 2, maxTime = 30000, jitter = 0.1, } = job.options;
|
|
161
|
-
let currentDelay = delay;
|
|
162
|
-
try {
|
|
163
|
-
while (job.retriesLeft > 0) {
|
|
164
|
-
// Check for cancellation at the start of each iteration
|
|
165
|
-
if (job.state === "cancelled") {
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
168
|
-
// Check if abort signal was triggered
|
|
169
|
-
if ((_b = job.abortController) === null || _b === void 0 ? void 0 : _b.signal.aborted) {
|
|
170
|
-
job.state = "cancelled";
|
|
171
|
-
job.error = new Error("Job cancelled via abort signal");
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
const elapsed = Date.now() - ((_c = job.startedAt) !== null && _c !== void 0 ? _c : Date.now());
|
|
175
|
-
if (elapsed >= maxTime)
|
|
176
|
-
break;
|
|
177
|
-
try {
|
|
178
|
-
// Pass abort signal to job function for force cancellation support
|
|
179
|
-
const signal = ((_d = job.abortController) === null || _d === void 0 ? void 0 : _d.signal) || new AbortController().signal;
|
|
180
|
-
const result = await job.fn(signal);
|
|
181
|
-
// Check if cancelled during execution
|
|
182
|
-
if (job.state === "cancelled") {
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
job.state = "completed";
|
|
186
|
-
job.finishedAt = Date.now();
|
|
187
|
-
// Evict oldest if history is full, then add new job
|
|
188
|
-
this._evictOldest(this.completedJobs);
|
|
189
|
-
this.completedJobs.set(job.id, job);
|
|
190
|
-
this.runningJobs.delete(job.id);
|
|
191
|
-
this.registry.delete(job.id); // Clean up registry
|
|
192
|
-
this._processQueue();
|
|
193
|
-
return result; // returns actual value
|
|
194
|
-
}
|
|
195
|
-
catch (err) {
|
|
196
|
-
job.retriesLeft--;
|
|
197
|
-
job.error = err;
|
|
198
|
-
// Check again after error in case cancelled during execution
|
|
199
|
-
if (job.state === "cancelled") {
|
|
200
|
-
break;
|
|
201
|
-
}
|
|
202
|
-
if (job.retriesLeft <= 0)
|
|
203
|
-
break;
|
|
204
|
-
// jitter with boundary checks
|
|
205
|
-
const jitterAmount = currentDelay * jitter;
|
|
206
|
-
let adjustedDelay = currentDelay + (Math.random() * 2 - 1) * jitterAmount;
|
|
207
|
-
adjustedDelay = Math.max(0, Math.min(adjustedDelay, maxTime - elapsed));
|
|
208
|
-
if (adjustedDelay > 0)
|
|
209
|
-
await sleep(adjustedDelay, cancelFn);
|
|
210
|
-
currentDelay *= backoff;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Job failed after exhausting retries or exceeding maxTime
|
|
214
|
-
// Only set to failed if not already cancelled (can be set externally by cancelJob)
|
|
215
|
-
const currentState = job.state;
|
|
216
|
-
if (currentState !== "cancelled") {
|
|
217
|
-
job.state = "failed";
|
|
218
|
-
job.finishedAt = Date.now();
|
|
219
|
-
// Evict oldest if history is full, then add new job
|
|
220
|
-
this._evictOldest(this.failedJobs);
|
|
221
|
-
this.failedJobs.set(job.id, job);
|
|
222
|
-
}
|
|
223
|
-
// Cleanup (safe to call even if already done by cancelJob)
|
|
224
|
-
this.runningJobs.delete(job.id);
|
|
225
|
-
this.registry.delete(job.id);
|
|
226
|
-
this._processQueue();
|
|
227
|
-
throw job.error || new Error("Job failed");
|
|
228
|
-
}
|
|
229
|
-
catch (err) {
|
|
230
|
-
// Ensure cleanup happens even if there's an unexpected error
|
|
231
|
-
this.runningJobs.delete(job.id);
|
|
232
|
-
this.registry.delete(job.id);
|
|
233
|
-
throw err;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
cancelJob(id, force = false) {
|
|
237
|
-
const job = this.runningJobs.get(id) || this.pendingQueue.find((j) => j.id === id);
|
|
238
|
-
if (!job)
|
|
239
|
-
return;
|
|
240
|
-
job.state = "cancelled";
|
|
241
|
-
job.error = new Error("Job cancelled");
|
|
242
|
-
job.finishedAt = Date.now();
|
|
243
|
-
// Force cancellation: abort the controller to interrupt in-progress execution
|
|
244
|
-
if (force && job.abortController && !job.abortController.signal.aborted) {
|
|
245
|
-
job.abortController.abort(new Error("Job forcefully cancelled"));
|
|
246
|
-
}
|
|
247
|
-
this.runningJobs.delete(id);
|
|
248
|
-
this.pendingQueue = this.pendingQueue.filter((j) => j.id !== id);
|
|
249
|
-
// Evict oldest if history is full, then add cancelled job
|
|
250
|
-
this._evictOldest(this.failedJobs);
|
|
251
|
-
this.failedJobs.set(id, job);
|
|
252
|
-
const cancelFn = this.registry.get(id);
|
|
253
|
-
if (cancelFn === null || cancelFn === void 0 ? void 0 : cancelFn.cancelSleep)
|
|
254
|
-
cancelFn.cancelSleep();
|
|
255
|
-
// Clean up registry
|
|
256
|
-
this.registry.delete(id);
|
|
257
|
-
}
|
|
258
|
-
listJobs() {
|
|
259
|
-
return {
|
|
260
|
-
pending: this.pendingQueue.map((j) => this._jobSummary(j)),
|
|
261
|
-
running: Array.from(this.runningJobs.values()).map((j) => this._jobSummary(j)),
|
|
262
|
-
failed: Array.from(this.failedJobs.values()).map((j) => this._jobSummary(j)),
|
|
263
|
-
completed: Array.from(this.completedJobs.values()).map((j) => this._jobSummary(j)),
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
findJobById(id) {
|
|
267
|
-
return (this.runningJobs.get(id) ||
|
|
268
|
-
this.pendingQueue.find((j) => j.id === id) ||
|
|
269
|
-
this.failedJobs.get(id) ||
|
|
270
|
-
this.completedJobs.get(id) ||
|
|
271
|
-
null);
|
|
272
|
-
}
|
|
273
|
-
findJobsByLabel(label) {
|
|
274
|
-
const all = [
|
|
275
|
-
...Array.from(this.runningJobs.values()),
|
|
276
|
-
...this.pendingQueue,
|
|
277
|
-
...Array.from(this.failedJobs.values()),
|
|
278
|
-
...Array.from(this.completedJobs.values()),
|
|
279
|
-
];
|
|
280
|
-
return all.filter((j) => j.label === label);
|
|
281
|
-
}
|
|
282
|
-
_jobSummary(job) {
|
|
283
|
-
return {
|
|
284
|
-
id: job.id,
|
|
285
|
-
label: job.label,
|
|
286
|
-
state: job.state,
|
|
287
|
-
retriesLeft: job.retriesLeft,
|
|
288
|
-
priority: job.priority,
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
exports.RetryQManager = RetryQManager;
|
|
293
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|