@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.
Files changed (47) hide show
  1. package/README.md +142 -19
  2. package/dist/cjs/index.d.ts +9 -0
  3. package/dist/cjs/index.d.ts.map +1 -0
  4. package/dist/cjs/index.js +13 -0
  5. package/dist/cjs/index.js.map +1 -0
  6. package/dist/cjs/manager.d.ts +139 -0
  7. package/dist/cjs/manager.d.ts.map +1 -0
  8. package/dist/cjs/manager.js +431 -0
  9. package/dist/cjs/manager.js.map +1 -0
  10. package/dist/cjs/package.json +3 -0
  11. package/dist/cjs/types.d.ts +237 -0
  12. package/dist/cjs/types.d.ts.map +1 -0
  13. package/dist/cjs/types.js +3 -0
  14. package/dist/cjs/types.js.map +1 -0
  15. package/dist/cjs/utils.d.ts +43 -0
  16. package/dist/cjs/utils.d.ts.map +1 -0
  17. package/dist/cjs/utils.js +71 -0
  18. package/dist/cjs/utils.js.map +1 -0
  19. package/dist/cjs/validation.d.ts +37 -0
  20. package/dist/cjs/validation.d.ts.map +1 -0
  21. package/dist/cjs/validation.js +69 -0
  22. package/dist/cjs/validation.js.map +1 -0
  23. package/dist/esm/index.d.ts +9 -0
  24. package/dist/esm/index.d.ts.map +1 -0
  25. package/dist/esm/index.js +8 -0
  26. package/dist/esm/index.js.map +1 -0
  27. package/dist/esm/manager.d.ts +139 -0
  28. package/dist/esm/manager.d.ts.map +1 -0
  29. package/dist/esm/manager.js +427 -0
  30. package/dist/esm/manager.js.map +1 -0
  31. package/dist/esm/package.json +3 -0
  32. package/dist/esm/types.d.ts +237 -0
  33. package/dist/esm/types.d.ts.map +1 -0
  34. package/dist/esm/types.js +2 -0
  35. package/dist/esm/types.js.map +1 -0
  36. package/dist/esm/utils.d.ts +43 -0
  37. package/dist/esm/utils.d.ts.map +1 -0
  38. package/dist/esm/utils.js +64 -0
  39. package/dist/esm/utils.js.map +1 -0
  40. package/dist/esm/validation.d.ts +37 -0
  41. package/dist/esm/validation.d.ts.map +1 -0
  42. package/dist/esm/validation.js +65 -0
  43. package/dist/esm/validation.js.map +1 -0
  44. package/package.json +29 -12
  45. package/dist/index.d.ts +0 -85
  46. package/dist/index.js +0 -293
  47. 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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"}