@zudojs/queue 0.0.1
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 +46 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/deadLetter/deadLetter.core.d.ts +13 -0
- package/dist/deadLetter/deadLetter.core.d.ts.map +1 -0
- package/dist/deadLetter/deadLetter.core.js +41 -0
- package/dist/deadLetter/deadLetter.core.js.map +1 -0
- package/dist/deadLetter/deadLetter.type.d.ts +33 -0
- package/dist/deadLetter/deadLetter.type.d.ts.map +1 -0
- package/dist/deadLetter/deadLetter.type.js +2 -0
- package/dist/deadLetter/deadLetter.type.js.map +1 -0
- package/dist/deadLetter/index.d.ts +9 -0
- package/dist/deadLetter/index.d.ts.map +1 -0
- package/dist/deadLetter/index.js +8 -0
- package/dist/deadLetter/index.js.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.core.d.ts +48 -0
- package/dist/inMemoryQueue/inMemoryQueue.core.d.ts.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.core.js +230 -0
- package/dist/inMemoryQueue/inMemoryQueue.core.js.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.factory.d.ts +7 -0
- package/dist/inMemoryQueue/inMemoryQueue.factory.d.ts.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.factory.js +8 -0
- package/dist/inMemoryQueue/inMemoryQueue.factory.js.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.processing.d.ts +19 -0
- package/dist/inMemoryQueue/inMemoryQueue.processing.d.ts.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.processing.js +112 -0
- package/dist/inMemoryQueue/inMemoryQueue.processing.js.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.scheduling.d.ts +10 -0
- package/dist/inMemoryQueue/inMemoryQueue.scheduling.d.ts.map +1 -0
- package/dist/inMemoryQueue/inMemoryQueue.scheduling.js +38 -0
- package/dist/inMemoryQueue/inMemoryQueue.scheduling.js.map +1 -0
- package/dist/inMemoryQueue/index.d.ts +8 -0
- package/dist/inMemoryQueue/index.d.ts.map +1 -0
- package/dist/inMemoryQueue/index.js +8 -0
- package/dist/inMemoryQueue/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/job/index.d.ts +9 -0
- package/dist/job/index.d.ts.map +1 -0
- package/dist/job/index.js +8 -0
- package/dist/job/index.js.map +1 -0
- package/dist/job/job.core.d.ts +19 -0
- package/dist/job/job.core.d.ts.map +1 -0
- package/dist/job/job.core.js +74 -0
- package/dist/job/job.core.js.map +1 -0
- package/dist/job/job.type.d.ts +65 -0
- package/dist/job/job.type.d.ts.map +1 -0
- package/dist/job/job.type.js +2 -0
- package/dist/job/job.type.js.map +1 -0
- package/dist/jobContext/index.d.ts +8 -0
- package/dist/jobContext/index.d.ts.map +1 -0
- package/dist/jobContext/index.js +7 -0
- package/dist/jobContext/index.js.map +1 -0
- package/dist/jobContext/jobContext.core.d.ts +17 -0
- package/dist/jobContext/jobContext.core.d.ts.map +1 -0
- package/dist/jobContext/jobContext.core.js +36 -0
- package/dist/jobContext/jobContext.core.js.map +1 -0
- package/dist/jobContext/jobContext.type.d.ts +16 -0
- package/dist/jobContext/jobContext.type.d.ts.map +1 -0
- package/dist/jobContext/jobContext.type.js +2 -0
- package/dist/jobContext/jobContext.type.js.map +1 -0
- package/dist/jobOptions/index.d.ts +8 -0
- package/dist/jobOptions/index.d.ts.map +1 -0
- package/dist/jobOptions/index.js +7 -0
- package/dist/jobOptions/index.js.map +1 -0
- package/dist/jobOptions/jobOptions.core.d.ts +10 -0
- package/dist/jobOptions/jobOptions.core.d.ts.map +1 -0
- package/dist/jobOptions/jobOptions.core.js +23 -0
- package/dist/jobOptions/jobOptions.core.js.map +1 -0
- package/dist/jobOptions/jobOptions.type.d.ts +36 -0
- package/dist/jobOptions/jobOptions.type.d.ts.map +1 -0
- package/dist/jobOptions/jobOptions.type.js +2 -0
- package/dist/jobOptions/jobOptions.type.js.map +1 -0
- package/dist/jobResult/index.d.ts +8 -0
- package/dist/jobResult/index.d.ts.map +1 -0
- package/dist/jobResult/index.js +7 -0
- package/dist/jobResult/index.js.map +1 -0
- package/dist/jobResult/jobResult.core.d.ts +19 -0
- package/dist/jobResult/jobResult.core.d.ts.map +1 -0
- package/dist/jobResult/jobResult.core.js +36 -0
- package/dist/jobResult/jobResult.core.js.map +1 -0
- package/dist/jobResult/jobResult.type.d.ts +34 -0
- package/dist/jobResult/jobResult.type.d.ts.map +1 -0
- package/dist/jobResult/jobResult.type.js +2 -0
- package/dist/jobResult/jobResult.type.js.map +1 -0
- package/dist/jobTypes/index.d.ts +9 -0
- package/dist/jobTypes/index.d.ts.map +1 -0
- package/dist/jobTypes/index.js +8 -0
- package/dist/jobTypes/index.js.map +1 -0
- package/dist/jobTypes/jobTypes.type.d.ts +89 -0
- package/dist/jobTypes/jobTypes.type.d.ts.map +1 -0
- package/dist/jobTypes/jobTypes.type.js +81 -0
- package/dist/jobTypes/jobTypes.type.js.map +1 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +7 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/middleware.core.d.ts +16 -0
- package/dist/middleware/middleware.core.d.ts.map +1 -0
- package/dist/middleware/middleware.core.js +76 -0
- package/dist/middleware/middleware.core.js.map +1 -0
- package/dist/middleware/middleware.type.d.ts +19 -0
- package/dist/middleware/middleware.type.d.ts.map +1 -0
- package/dist/middleware/middleware.type.js +2 -0
- package/dist/middleware/middleware.type.js.map +1 -0
- package/dist/processor/index.d.ts +10 -0
- package/dist/processor/index.d.ts.map +1 -0
- package/dist/processor/index.js +9 -0
- package/dist/processor/index.js.map +1 -0
- package/dist/processor/processor.core.d.ts +6 -0
- package/dist/processor/processor.core.d.ts.map +1 -0
- package/dist/processor/processor.core.js +40 -0
- package/dist/processor/processor.core.js.map +1 -0
- package/dist/processor/processor.type.d.ts +42 -0
- package/dist/processor/processor.type.d.ts.map +1 -0
- package/dist/processor/processor.type.js +7 -0
- package/dist/processor/processor.type.js.map +1 -0
- package/dist/queue/index.d.ts +10 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +8 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.core.d.ts +13 -0
- package/dist/queue/queue.core.d.ts.map +1 -0
- package/dist/queue/queue.core.js +23 -0
- package/dist/queue/queue.core.js.map +1 -0
- package/dist/queue/queue.type.d.ts +109 -0
- package/dist/queue/queue.type.d.ts.map +1 -0
- package/dist/queue/queue.type.js +2 -0
- package/dist/queue/queue.type.js.map +1 -0
- package/dist/queueEmitter/index.d.ts +9 -0
- package/dist/queueEmitter/index.d.ts.map +1 -0
- package/dist/queueEmitter/index.js +8 -0
- package/dist/queueEmitter/index.js.map +1 -0
- package/dist/queueEmitter/queueEmitter.core.d.ts +24 -0
- package/dist/queueEmitter/queueEmitter.core.d.ts.map +1 -0
- package/dist/queueEmitter/queueEmitter.core.js +45 -0
- package/dist/queueEmitter/queueEmitter.core.js.map +1 -0
- package/dist/queueEmitter/queueEmitter.type.d.ts +14 -0
- package/dist/queueEmitter/queueEmitter.type.d.ts.map +1 -0
- package/dist/queueEmitter/queueEmitter.type.js +2 -0
- package/dist/queueEmitter/queueEmitter.type.js.map +1 -0
- package/dist/queueEvents/index.d.ts +8 -0
- package/dist/queueEvents/index.d.ts.map +1 -0
- package/dist/queueEvents/index.js +7 -0
- package/dist/queueEvents/index.js.map +1 -0
- package/dist/queueEvents/queueEvents.core.d.ts +6 -0
- package/dist/queueEvents/queueEvents.core.d.ts.map +1 -0
- package/dist/queueEvents/queueEvents.core.js +12 -0
- package/dist/queueEvents/queueEvents.core.js.map +1 -0
- package/dist/queueEvents/queueEvents.type.d.ts +97 -0
- package/dist/queueEvents/queueEvents.type.d.ts.map +1 -0
- package/dist/queueEvents/queueEvents.type.js +2 -0
- package/dist/queueEvents/queueEvents.type.js.map +1 -0
- package/dist/queueManager/index.d.ts +8 -0
- package/dist/queueManager/index.d.ts.map +1 -0
- package/dist/queueManager/index.js +7 -0
- package/dist/queueManager/index.js.map +1 -0
- package/dist/queueManager/queueManager.core.d.ts +6 -0
- package/dist/queueManager/queueManager.core.d.ts.map +1 -0
- package/dist/queueManager/queueManager.core.js +32 -0
- package/dist/queueManager/queueManager.core.js.map +1 -0
- package/dist/queueManager/queueManager.type.d.ts +18 -0
- package/dist/queueManager/queueManager.type.d.ts.map +1 -0
- package/dist/queueManager/queueManager.type.js +2 -0
- package/dist/queueManager/queueManager.type.js.map +1 -0
- package/dist/queueRegistry/index.d.ts +8 -0
- package/dist/queueRegistry/index.d.ts.map +1 -0
- package/dist/queueRegistry/index.js +7 -0
- package/dist/queueRegistry/index.js.map +1 -0
- package/dist/queueRegistry/queueRegistry.core.d.ts +6 -0
- package/dist/queueRegistry/queueRegistry.core.d.ts.map +1 -0
- package/dist/queueRegistry/queueRegistry.core.js +41 -0
- package/dist/queueRegistry/queueRegistry.core.js.map +1 -0
- package/dist/queueRegistry/queueRegistry.type.d.ts +31 -0
- package/dist/queueRegistry/queueRegistry.type.d.ts.map +1 -0
- package/dist/queueRegistry/queueRegistry.type.js +2 -0
- package/dist/queueRegistry/queueRegistry.type.js.map +1 -0
- package/dist/retryPolicy/index.d.ts +8 -0
- package/dist/retryPolicy/index.d.ts.map +1 -0
- package/dist/retryPolicy/index.js +8 -0
- package/dist/retryPolicy/index.js.map +1 -0
- package/dist/retryPolicy/retryPolicy.core.d.ts +29 -0
- package/dist/retryPolicy/retryPolicy.core.d.ts.map +1 -0
- package/dist/retryPolicy/retryPolicy.core.js +51 -0
- package/dist/retryPolicy/retryPolicy.core.js.map +1 -0
- package/dist/serializer/index.d.ts +9 -0
- package/dist/serializer/index.d.ts.map +1 -0
- package/dist/serializer/index.js +8 -0
- package/dist/serializer/index.js.map +1 -0
- package/dist/serializer/serializer.core.d.ts +19 -0
- package/dist/serializer/serializer.core.d.ts.map +1 -0
- package/dist/serializer/serializer.core.js +53 -0
- package/dist/serializer/serializer.core.js.map +1 -0
- package/dist/serializer/serializer.type.d.ts +12 -0
- package/dist/serializer/serializer.type.d.ts.map +1 -0
- package/dist/serializer/serializer.type.js +2 -0
- package/dist/serializer/serializer.type.js.map +1 -0
- package/dist/worker/index.d.ts +9 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/worker.core.d.ts +11 -0
- package/dist/worker/worker.core.d.ts.map +1 -0
- package/dist/worker/worker.core.js +117 -0
- package/dist/worker/worker.core.js.map +1 -0
- package/dist/worker/worker.type.d.ts +61 -0
- package/dist/worker/worker.type.d.ts.map +1 -0
- package/dist/worker/worker.type.js +2 -0
- package/dist/worker/worker.type.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Job } from "../job/job.type.js";
|
|
2
|
+
import type { JobId } from "../jobTypes/jobTypes.type.js";
|
|
3
|
+
/**
|
|
4
|
+
* Dead letter job with additional metadata.
|
|
5
|
+
*/
|
|
6
|
+
export interface DeadLetterJob<TData = unknown> {
|
|
7
|
+
/** The original job. */
|
|
8
|
+
readonly job: Job<TData>;
|
|
9
|
+
/** When the job was moved to dead letter. */
|
|
10
|
+
readonly deadLetterAt: Date;
|
|
11
|
+
/** The error that caused the job to fail. */
|
|
12
|
+
readonly error: Error;
|
|
13
|
+
/** Number of attempts made. */
|
|
14
|
+
readonly attempts: number;
|
|
15
|
+
/** Optional reason for the failure. */
|
|
16
|
+
readonly reason?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Interface for managing dead letter jobs.
|
|
20
|
+
*/
|
|
21
|
+
export interface DeadLetterStore<TData = unknown> {
|
|
22
|
+
/** Add a job to the dead letter store. */
|
|
23
|
+
add(deadLetterJob: DeadLetterJob<TData>): Promise<void>;
|
|
24
|
+
/** Get a dead letter job by ID. */
|
|
25
|
+
get(jobId: JobId): Promise<DeadLetterJob<TData> | null>;
|
|
26
|
+
/** Get all dead letter jobs. */
|
|
27
|
+
getAll(): Promise<DeadLetterJob<TData>[]>;
|
|
28
|
+
/** Remove a dead letter job. */
|
|
29
|
+
remove(jobId: JobId): Promise<boolean>;
|
|
30
|
+
/** Clear all dead letter jobs. */
|
|
31
|
+
clear(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=deadLetter.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadLetter.type.d.ts","sourceRoot":"","sources":["../../src/deadLetter/deadLetter.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO;IAC5C,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,GAAG,OAAO;IAC9C,0CAA0C;IAC1C,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,mCAAmC;IACnC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,gCAAgC;IAChC,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1C,gCAAgC;IAChC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,kCAAkC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadLetter.type.js","sourceRoot":"","sources":["../../src/deadLetter/deadLetter.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead letter handling for failed jobs.
|
|
3
|
+
*
|
|
4
|
+
* Provides storage and management for jobs that have
|
|
5
|
+
* exceeded their retry attempts.
|
|
6
|
+
*/
|
|
7
|
+
export { createInMemoryDeadLetterStore, moveToDeadLetter, } from "./deadLetter.core.js";
|
|
8
|
+
export type { DeadLetterJob, DeadLetterStore } from "./deadLetter.type.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/deadLetter/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead letter handling for failed jobs.
|
|
3
|
+
*
|
|
4
|
+
* Provides storage and management for jobs that have
|
|
5
|
+
* exceeded their retry attempts.
|
|
6
|
+
*/
|
|
7
|
+
export { createInMemoryDeadLetterStore, moveToDeadLetter, } from "./deadLetter.core.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/deadLetter/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { JobId, QueueName } from "../jobTypes/jobTypes.type.js";
|
|
2
|
+
import type { Job } from "../job/job.type.js";
|
|
3
|
+
import type { Queue, QueueOptions, QueueStats } from "../queue/queue.type.js";
|
|
4
|
+
import type { Processor } from "../processor/processor.type.js";
|
|
5
|
+
import type { JobOptions } from "../jobOptions/jobOptions.type.js";
|
|
6
|
+
/**
|
|
7
|
+
* In-memory queue implementation.
|
|
8
|
+
*
|
|
9
|
+
* Good for testing, development, and simple applications.
|
|
10
|
+
* Jobs are lost when the application crashes.
|
|
11
|
+
*/
|
|
12
|
+
export declare class InMemoryQueue<TData = unknown> implements Queue<TData> {
|
|
13
|
+
readonly name: QueueName;
|
|
14
|
+
private readonly jobs;
|
|
15
|
+
private readonly processors;
|
|
16
|
+
private readonly options;
|
|
17
|
+
private readonly serializer;
|
|
18
|
+
private readonly middleware;
|
|
19
|
+
private paused;
|
|
20
|
+
private disposed;
|
|
21
|
+
private activeCount;
|
|
22
|
+
private pollTimer;
|
|
23
|
+
private scheduledTimers;
|
|
24
|
+
private readonly deduplicationIndex;
|
|
25
|
+
private readonly deadLetterStore;
|
|
26
|
+
private processedCount;
|
|
27
|
+
private succeededCount;
|
|
28
|
+
private failedCount;
|
|
29
|
+
private readonly emitter;
|
|
30
|
+
private emptySince;
|
|
31
|
+
private backoffMs;
|
|
32
|
+
constructor(name: QueueName, options?: QueueOptions);
|
|
33
|
+
add(jobName: string, data: TData, options?: JobOptions): Promise<Job<TData>>;
|
|
34
|
+
process(name: string, processor: Processor<TData>): void;
|
|
35
|
+
getJob(jobId: JobId): Promise<Job<TData> | null>;
|
|
36
|
+
getNextJob(): Promise<Job<TData> | null>;
|
|
37
|
+
getProcessor(name: string): Processor<TData> | undefined;
|
|
38
|
+
getStats(): Promise<QueueStats>;
|
|
39
|
+
pause(): Promise<void>;
|
|
40
|
+
resume(): Promise<void>;
|
|
41
|
+
isPaused(): boolean;
|
|
42
|
+
close(): Promise<void>;
|
|
43
|
+
private startPolling;
|
|
44
|
+
private scheduleNextTick;
|
|
45
|
+
private stopPolling;
|
|
46
|
+
private processTick;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=inMemoryQueue.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.core.d.ts","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.core.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAqBnE;;;;;GAKG;AACH,qBAAa,aAAa,CAAC,KAAK,GAAG,OAAO,CAAE,YAAW,KAAK,CAAC,KAAK,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,eAAe,CACX;IACZ,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;IACpE,OAAO,CAAC,QAAQ,CAAC,eAAe,CACS;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,SAAS,CAAM;IAEvB,YAAY,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,YAAY,EAMlD;IAEK,GAAG,CACP,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CA6CrB;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAIvD;IAEK,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAErD;IAEK,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAqB7C;IAED,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAEvD;IAEK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAepC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IACK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IACD,QAAQ,IAAI,OAAO,CAElB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAe3B;IAED,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,WAAW;YAOL,WAAW;CAuD1B"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { QueueError, QueueClosedError, QueueDisposedError, JobDuplicateError, } from "@zudojs/errors";
|
|
3
|
+
import { createJob } from "../job/job.core.js";
|
|
4
|
+
import { JobState as JobStateEnum, createJobName, } from "../jobTypes/jobTypes.type.js";
|
|
5
|
+
import { JsonSerializer } from "../serializer/serializer.core.js";
|
|
6
|
+
import { createInMemoryDeadLetterStore } from "../deadLetter/deadLetter.core.js";
|
|
7
|
+
import { createNoopQueueEventEmitter } from "../queueEmitter/queueEmitter.core.js";
|
|
8
|
+
import { processJob } from "./inMemoryQueue.processing.js";
|
|
9
|
+
import { scheduleJob, scheduleDelayedJobs, } from "./inMemoryQueue.scheduling.js";
|
|
10
|
+
/**
|
|
11
|
+
* In-memory queue implementation.
|
|
12
|
+
*
|
|
13
|
+
* Good for testing, development, and simple applications.
|
|
14
|
+
* Jobs are lost when the application crashes.
|
|
15
|
+
*/
|
|
16
|
+
export class InMemoryQueue {
|
|
17
|
+
name;
|
|
18
|
+
jobs = new Map();
|
|
19
|
+
processors = new Map();
|
|
20
|
+
options;
|
|
21
|
+
serializer;
|
|
22
|
+
middleware;
|
|
23
|
+
paused = false;
|
|
24
|
+
disposed = false;
|
|
25
|
+
activeCount = 0;
|
|
26
|
+
pollTimer = null;
|
|
27
|
+
scheduledTimers = new Map();
|
|
28
|
+
deduplicationIndex = new Map();
|
|
29
|
+
deadLetterStore = createInMemoryDeadLetterStore();
|
|
30
|
+
processedCount = 0;
|
|
31
|
+
succeededCount = 0;
|
|
32
|
+
failedCount = 0;
|
|
33
|
+
emitter;
|
|
34
|
+
emptySince = 0;
|
|
35
|
+
backoffMs = 50;
|
|
36
|
+
constructor(name, options) {
|
|
37
|
+
this.name = name;
|
|
38
|
+
this.options = options ?? {};
|
|
39
|
+
this.serializer = this.options.serializer ?? JsonSerializer;
|
|
40
|
+
this.middleware = this.options.middleware ?? [];
|
|
41
|
+
this.emitter = options?.eventEmitter ?? createNoopQueueEventEmitter();
|
|
42
|
+
}
|
|
43
|
+
async add(jobName, data, options) {
|
|
44
|
+
if (this.disposed)
|
|
45
|
+
throw new QueueDisposedError(this.name);
|
|
46
|
+
if (this.paused)
|
|
47
|
+
throw new QueueError(`Queue "${this.name}" is paused.`, {
|
|
48
|
+
queueName: this.name,
|
|
49
|
+
});
|
|
50
|
+
const mergedOptions = { ...this.options.defaultJobOptions, ...options };
|
|
51
|
+
if (mergedOptions.deduplicationKey) {
|
|
52
|
+
const existing = this.deduplicationIndex.get(mergedOptions.deduplicationKey);
|
|
53
|
+
if (existing && this.jobs.has(existing)) {
|
|
54
|
+
throw new JobDuplicateError(existing, mergedOptions.deduplicationKey, {
|
|
55
|
+
queueName: this.name,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const jobId = `job_${Date.now()}_${randomBytes(6).toString("hex")}`;
|
|
60
|
+
const job = createJob({
|
|
61
|
+
name: createJobName(jobName),
|
|
62
|
+
queueName: this.name,
|
|
63
|
+
data,
|
|
64
|
+
options: mergedOptions,
|
|
65
|
+
}, jobId);
|
|
66
|
+
this.jobs.set(jobId, job);
|
|
67
|
+
this.emitter.emit("job:created", { job });
|
|
68
|
+
if (mergedOptions.deduplicationKey) {
|
|
69
|
+
this.deduplicationIndex.set(mergedOptions.deduplicationKey, jobId);
|
|
70
|
+
}
|
|
71
|
+
if (job.state === JobStateEnum.SCHEDULED && job.scheduledAt) {
|
|
72
|
+
scheduleJob(job, this.scheduledTimers, this.jobs);
|
|
73
|
+
}
|
|
74
|
+
this.backoffMs = 50;
|
|
75
|
+
this.emptySince = 0;
|
|
76
|
+
return job;
|
|
77
|
+
}
|
|
78
|
+
process(name, processor) {
|
|
79
|
+
if (this.disposed)
|
|
80
|
+
throw new QueueDisposedError(this.name);
|
|
81
|
+
this.processors.set(name, processor);
|
|
82
|
+
if (!this.pollTimer)
|
|
83
|
+
this.startPolling();
|
|
84
|
+
}
|
|
85
|
+
async getJob(jobId) {
|
|
86
|
+
return this.jobs.get(jobId) ?? null;
|
|
87
|
+
}
|
|
88
|
+
async getNextJob() {
|
|
89
|
+
if (this.paused || this.disposed)
|
|
90
|
+
return null;
|
|
91
|
+
const now = Date.now();
|
|
92
|
+
let nextJob = null;
|
|
93
|
+
let nextPriority = -1;
|
|
94
|
+
for (const job of this.jobs.values()) {
|
|
95
|
+
if (job.state !== JobStateEnum.WAITING)
|
|
96
|
+
continue;
|
|
97
|
+
if (job.scheduledAt && new Date(job.scheduledAt).getTime() > now)
|
|
98
|
+
continue;
|
|
99
|
+
if (job.priority > nextPriority) {
|
|
100
|
+
nextPriority = job.priority;
|
|
101
|
+
nextJob = job;
|
|
102
|
+
}
|
|
103
|
+
else if (job.priority === nextPriority && nextJob) {
|
|
104
|
+
const currentTime = new Date(job.createdAt).getTime();
|
|
105
|
+
const nextTime = new Date(nextJob.createdAt).getTime();
|
|
106
|
+
if (currentTime < nextTime)
|
|
107
|
+
nextJob = job;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return nextJob;
|
|
111
|
+
}
|
|
112
|
+
getProcessor(name) {
|
|
113
|
+
return this.processors.get(name);
|
|
114
|
+
}
|
|
115
|
+
async getStats() {
|
|
116
|
+
const allJobs = Array.from(this.jobs.values());
|
|
117
|
+
return {
|
|
118
|
+
waiting: allJobs.filter((j) => j.state === JobStateEnum.WAITING).length,
|
|
119
|
+
active: allJobs.filter((j) => j.state === JobStateEnum.ACTIVE).length,
|
|
120
|
+
completed: allJobs.filter((j) => j.state === JobStateEnum.COMPLETED)
|
|
121
|
+
.length,
|
|
122
|
+
failed: allJobs.filter((j) => j.state === JobStateEnum.FAILED ||
|
|
123
|
+
j.state === JobStateEnum.DEAD_LETTER).length,
|
|
124
|
+
delayed: allJobs.filter((j) => j.state === JobStateEnum.SCHEDULED).length,
|
|
125
|
+
retrying: allJobs.filter((j) => j.state === JobStateEnum.RETRYING).length,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async pause() {
|
|
129
|
+
this.paused = true;
|
|
130
|
+
}
|
|
131
|
+
async resume() {
|
|
132
|
+
this.paused = false;
|
|
133
|
+
}
|
|
134
|
+
isPaused() {
|
|
135
|
+
return this.paused;
|
|
136
|
+
}
|
|
137
|
+
async close() {
|
|
138
|
+
this.stopPolling();
|
|
139
|
+
for (const timer of this.scheduledTimers.values())
|
|
140
|
+
clearTimeout(timer);
|
|
141
|
+
this.scheduledTimers.clear();
|
|
142
|
+
this.jobs.clear();
|
|
143
|
+
this.processors.clear();
|
|
144
|
+
this.deduplicationIndex.clear();
|
|
145
|
+
this.activeCount = 0;
|
|
146
|
+
this.processedCount = 0;
|
|
147
|
+
this.succeededCount = 0;
|
|
148
|
+
this.failedCount = 0;
|
|
149
|
+
this.paused = false;
|
|
150
|
+
this.disposed = true;
|
|
151
|
+
this.emptySince = 0;
|
|
152
|
+
this.backoffMs = 50;
|
|
153
|
+
}
|
|
154
|
+
startPolling() {
|
|
155
|
+
const pollInterval = this.options.concurrency ? 50 : 100;
|
|
156
|
+
this.pollTimer = setTimeout(() => {
|
|
157
|
+
this.pollTimer = null;
|
|
158
|
+
this.processTick().finally(() => {
|
|
159
|
+
if (!this.disposed && this.processors.size > 0)
|
|
160
|
+
this.scheduleNextTick();
|
|
161
|
+
});
|
|
162
|
+
}, pollInterval);
|
|
163
|
+
}
|
|
164
|
+
scheduleNextTick() {
|
|
165
|
+
if (this.disposed)
|
|
166
|
+
return;
|
|
167
|
+
const interval = this.backoffMs;
|
|
168
|
+
this.pollTimer = setTimeout(() => {
|
|
169
|
+
this.pollTimer = null;
|
|
170
|
+
this.processTick().finally(() => {
|
|
171
|
+
if (!this.disposed && this.processors.size > 0)
|
|
172
|
+
this.scheduleNextTick();
|
|
173
|
+
});
|
|
174
|
+
}, interval);
|
|
175
|
+
}
|
|
176
|
+
stopPolling() {
|
|
177
|
+
if (this.pollTimer) {
|
|
178
|
+
clearTimeout(this.pollTimer);
|
|
179
|
+
this.pollTimer = null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async processTick() {
|
|
183
|
+
if (this.paused || this.disposed)
|
|
184
|
+
return;
|
|
185
|
+
const concurrency = Math.max(1, this.options.concurrency ?? 1);
|
|
186
|
+
let processed = 0;
|
|
187
|
+
while (this.activeCount < concurrency) {
|
|
188
|
+
const job = await this.getNextJob();
|
|
189
|
+
if (!job)
|
|
190
|
+
break;
|
|
191
|
+
const processor = this.processors.get(job.name);
|
|
192
|
+
if (!processor)
|
|
193
|
+
continue;
|
|
194
|
+
this.activeCount++;
|
|
195
|
+
processed++;
|
|
196
|
+
processJob(job, processor, this.middleware, this.jobs, { timeoutMs: job.timeoutMs }, this.emitter, this.deadLetterStore, {
|
|
197
|
+
processedCount: this.processedCount,
|
|
198
|
+
succeededCount: this.succeededCount,
|
|
199
|
+
failedCount: this.failedCount,
|
|
200
|
+
})
|
|
201
|
+
.catch((error) => {
|
|
202
|
+
this.emitter.emit("job:failed", {
|
|
203
|
+
job,
|
|
204
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
205
|
+
});
|
|
206
|
+
})
|
|
207
|
+
.finally(() => {
|
|
208
|
+
this.activeCount--;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (processed > 0) {
|
|
212
|
+
this.backoffMs = 50;
|
|
213
|
+
this.emptySince = 0;
|
|
214
|
+
}
|
|
215
|
+
else if (this.emptySince === 0) {
|
|
216
|
+
this.emptySince = Date.now();
|
|
217
|
+
this.backoffMs = 50;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const elapsed = Date.now() - this.emptySince;
|
|
221
|
+
if (elapsed > 500) {
|
|
222
|
+
this.backoffMs = Math.min(this.backoffMs * 2, 2000);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (this.scheduledTimers.size > 0) {
|
|
226
|
+
scheduleDelayedJobs(this.jobs);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=inMemoryQueue.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.core.js","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { QueueName } from "../jobTypes/jobTypes.type.js";
|
|
2
|
+
import type { QueueOptions, Queue } from "../queue/queue.type.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates an InMemoryQueue.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createInMemoryQueue<TData>(name: QueueName, options?: QueueOptions): Queue<TData>;
|
|
7
|
+
//# sourceMappingURL=inMemoryQueue.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.factory.d.ts","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAIlE;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EACvC,IAAI,EAAE,SAAS,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,KAAK,CAAC,KAAK,CAAC,CAEd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.factory.js","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.factory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAe,EACf,OAAsB;IAEtB,OAAO,IAAI,aAAa,CAAQ,IAAI,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Job } from "../job/job.type.js";
|
|
2
|
+
import type { Processor } from "../processor/processor.type.js";
|
|
3
|
+
/**
|
|
4
|
+
* Process a single job with middleware, retry, and failure handling.
|
|
5
|
+
*/
|
|
6
|
+
export declare function processJob<TData>(job: Job<TData>, processor: Processor<TData>, middleware: import("../middleware/middleware.type.js").QueueMiddleware[], jobs: Map<string, Job<TData>>, options: {
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
}, emitter: import("../queueEmitter/queueEmitter.type.js").QueueEventEmitter, deadLetterStore: import("../deadLetter/deadLetter.type.js").DeadLetterStore<TData>, counters: {
|
|
9
|
+
processedCount: number;
|
|
10
|
+
succeededCount: number;
|
|
11
|
+
failedCount: number;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Handle job failure with retry logic.
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleJobFailure<TData>(job: Job<TData>, errorMessage: string, processor: Processor<TData>, abortController: AbortController, jobs: Map<string, Job<TData>>, emitter: import("../queueEmitter/queueEmitter.type.js").QueueEventEmitter, deadLetterStore: import("../deadLetter/deadLetter.type.js").DeadLetterStore<TData>, counters: {
|
|
17
|
+
failedCount: number;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=inMemoryQueue.processing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.processing.d.ts","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.processing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAoBhE;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EACpC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EACf,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAC3B,UAAU,EAAE,OAAO,kCAAkC,EAAE,eAAe,EAAE,EACxE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAC7B,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/B,OAAO,EAAE,OAAO,sCAAsC,EAAE,iBAAiB,EACzE,eAAe,EAAE,OAAO,kCAAkC,EAAE,eAAe,CAAC,KAAK,CAAC,EAClF,QAAQ,EAAE;IACR,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,IAAI,CAAC,CAyEf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAC1C,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAC3B,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAC7B,OAAO,EAAE,OAAO,sCAAsC,EAAE,iBAAiB,EACzE,eAAe,EAAE,OAAO,kCAAkC,EAAE,eAAe,CAAC,KAAK,CAAC,EAClF,QAAQ,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { updateJobState } from "../job/job.core.js";
|
|
2
|
+
import { JobState as JobStateEnum } from "../jobTypes/jobTypes.type.js";
|
|
3
|
+
import { createJobContext } from "../jobContext/jobContext.core.js";
|
|
4
|
+
import { createMiddlewareChain, createTimeoutMiddleware, } from "../middleware/middleware.core.js";
|
|
5
|
+
import { calculateRetryDelay, shouldRetry, } from "../retryPolicy/retryPolicy.core.js";
|
|
6
|
+
import { moveToDeadLetter } from "../deadLetter/deadLetter.core.js";
|
|
7
|
+
import { JobMaxAttemptsError } from "@zudojs/errors";
|
|
8
|
+
/**
|
|
9
|
+
* Process a single job with middleware, retry, and failure handling.
|
|
10
|
+
*/
|
|
11
|
+
export async function processJob(job, processor, middleware, jobs, options, emitter, deadLetterStore, counters) {
|
|
12
|
+
const updatedJob = updateJobState(job, JobStateEnum.ACTIVE, {
|
|
13
|
+
startedAt: new Date().toISOString(),
|
|
14
|
+
});
|
|
15
|
+
jobs.set(updatedJob.id, updatedJob);
|
|
16
|
+
emitter.emit("job:started", { job: updatedJob });
|
|
17
|
+
const abortController = new AbortController();
|
|
18
|
+
const context = createJobContext(updatedJob, abortController.signal, {
|
|
19
|
+
onProgress: async () => {
|
|
20
|
+
const progressJob = updateJobState(updatedJob, JobStateEnum.ACTIVE);
|
|
21
|
+
jobs.set(updatedJob.id, progressJob);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const timeoutMs = options.timeoutMs ?? 30_000;
|
|
25
|
+
const timeoutMiddleware = createTimeoutMiddleware(timeoutMs);
|
|
26
|
+
const middlewareChain = createMiddlewareChain([
|
|
27
|
+
timeoutMiddleware,
|
|
28
|
+
...middleware,
|
|
29
|
+
]);
|
|
30
|
+
try {
|
|
31
|
+
const result = await middlewareChain({
|
|
32
|
+
job: updatedJob,
|
|
33
|
+
context,
|
|
34
|
+
next: async () => {
|
|
35
|
+
return processor(updatedJob, context);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
if (result && "success" in result && result.success) {
|
|
39
|
+
const completedJob = updateJobState(updatedJob, JobStateEnum.COMPLETED, {
|
|
40
|
+
completedAt: new Date().toISOString(),
|
|
41
|
+
});
|
|
42
|
+
jobs.set(updatedJob.id, completedJob);
|
|
43
|
+
counters.succeededCount++;
|
|
44
|
+
emitter.emit("job:completed", { job: completedJob, result: result.data });
|
|
45
|
+
}
|
|
46
|
+
else if (result && "success" in result && !result.success) {
|
|
47
|
+
await handleJobFailure(updatedJob, result.error ?? "Job failed", processor, abortController, jobs, emitter, deadLetterStore, counters);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const completedJob = updateJobState(updatedJob, JobStateEnum.COMPLETED, {
|
|
51
|
+
completedAt: new Date().toISOString(),
|
|
52
|
+
});
|
|
53
|
+
jobs.set(updatedJob.id, completedJob);
|
|
54
|
+
counters.succeededCount++;
|
|
55
|
+
emitter.emit("job:completed", { job: completedJob, result: undefined });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
60
|
+
await handleJobFailure(updatedJob, errorMessage, processor, abortController, jobs, emitter, deadLetterStore, counters);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
counters.processedCount++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Handle job failure with retry logic.
|
|
68
|
+
*/
|
|
69
|
+
export async function handleJobFailure(job, errorMessage, processor, abortController, jobs, emitter, deadLetterStore, counters) {
|
|
70
|
+
const { updateJobState: update, incrementJobAttempt } = await import("../job/job.core.js");
|
|
71
|
+
const failedJob = update(job, JobStateEnum.FAILED, {
|
|
72
|
+
error: errorMessage,
|
|
73
|
+
failedAt: new Date().toISOString(),
|
|
74
|
+
});
|
|
75
|
+
jobs.set(job.id, failedJob);
|
|
76
|
+
counters.failedCount++;
|
|
77
|
+
emitter.emit("job:failed", {
|
|
78
|
+
job: failedJob,
|
|
79
|
+
error: new Error(errorMessage),
|
|
80
|
+
});
|
|
81
|
+
const incrementedJob = incrementJobAttempt(failedJob);
|
|
82
|
+
jobs.set(job.id, incrementedJob);
|
|
83
|
+
if (shouldRetry(incrementedJob.attempt, incrementedJob.maxAttempts)) {
|
|
84
|
+
const retryingJob = update(incrementedJob, JobStateEnum.RETRYING);
|
|
85
|
+
jobs.set(job.id, retryingJob);
|
|
86
|
+
emitter.emit("job:retrying", {
|
|
87
|
+
job: retryingJob,
|
|
88
|
+
attempt: incrementedJob.attempt,
|
|
89
|
+
});
|
|
90
|
+
const backoff = incrementedJob.backoff;
|
|
91
|
+
const delay = calculateRetryDelay(incrementedJob.attempt, backoff);
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
const currentJob = jobs.get(job.id);
|
|
94
|
+
if (currentJob && currentJob.state === JobStateEnum.RETRYING) {
|
|
95
|
+
const waitingJob = update(currentJob, JobStateEnum.WAITING, {
|
|
96
|
+
error: undefined,
|
|
97
|
+
failedAt: undefined,
|
|
98
|
+
});
|
|
99
|
+
jobs.set(job.id, waitingJob);
|
|
100
|
+
}
|
|
101
|
+
}, delay);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const maxAttemptsError = new JobMaxAttemptsError(job.id, incrementedJob.attempt, incrementedJob.maxAttempts, { queueName: job.queueName });
|
|
105
|
+
await moveToDeadLetter(deadLetterStore, incrementedJob, maxAttemptsError);
|
|
106
|
+
const deadLetterJob = update(incrementedJob, JobStateEnum.DEAD_LETTER, {
|
|
107
|
+
error: maxAttemptsError.message,
|
|
108
|
+
});
|
|
109
|
+
jobs.set(job.id, deadLetterJob);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=inMemoryQueue.processing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.processing.js","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.processing.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,mBAAmB,EACnB,WAAW,GACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,SAA2B,EAC3B,UAAwE,EACxE,IAA6B,EAC7B,OAA+B,EAC/B,OAAyE,EACzE,eAAkF,EAClF,QAIC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,EAAE;QAC1D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAW;KAC7C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAQ,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE;QAC1E,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;YACpE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACvC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,qBAAqB,CAAC;QAC5C,iBAAiB;QACjB,GAAG,UAAU;KACd,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,GAAG,EAAE,UAAU;YACf,OAAO;YACP,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO,SAAS,CAAC,UAAU,EAAE,OAAO,CAA8B,CAAC;YACrE,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE;gBACtE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAW;aAC/C,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACtC,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5D,MAAM,gBAAgB,CACpB,UAAU,EACV,MAAM,CAAC,KAAK,IAAI,YAAY,EAC5B,SAAS,EACT,eAAe,EACf,IAAI,EACJ,OAAO,EACP,eAAe,EACf,QAAQ,CACT,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE;gBACtE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAW;aAC/C,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACtC,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,gBAAgB,CACpB,UAAU,EACV,YAAY,EACZ,SAAS,EACT,eAAe,EACf,IAAI,EACJ,OAAO,EACP,eAAe,EACf,QAAQ,CACT,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAe,EACf,YAAoB,EACpB,SAA2B,EAC3B,eAAgC,EAChC,IAA6B,EAC7B,OAAyE,EACzE,eAAkF,EAClF,QAAiC;IAEjC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,mBAAmB,EAAE,GACnD,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,EAAE;QACjD,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAW;KAC5C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEvB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE;QACzB,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,IAAI,KAAK,CAAC,YAAY,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAEjC,IAAI,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAE9B,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE;YAC3B,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,cAAc,CAAC,OAAO;SAChC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC;QACvC,MAAM,KAAK,GAAG,mBAAmB,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEnE,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE;oBAC1D,KAAK,EAAE,SAAS;oBAChB,QAAQ,EAAE,SAAS;iBACpB,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,MAAM,gBAAgB,GAAG,IAAI,mBAAmB,CAC9C,GAAG,CAAC,EAAE,EACN,cAAc,CAAC,OAAO,EACtB,cAAc,CAAC,WAAW,EAC1B,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAC7B,CAAC;QACF,MAAM,gBAAgB,CAAC,eAAe,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,WAAW,EAAE;YACrE,KAAK,EAAE,gBAAgB,CAAC,OAAO;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Job } from "../job/job.type.js";
|
|
2
|
+
/**
|
|
3
|
+
* Schedule a job for future execution.
|
|
4
|
+
*/
|
|
5
|
+
export declare function scheduleJob<TData>(job: Job<TData>, scheduledTimers: Map<string, ReturnType<typeof setTimeout>>, jobs: Map<string, Job<TData>>): void;
|
|
6
|
+
/**
|
|
7
|
+
* Promote scheduled jobs that are ready to run.
|
|
8
|
+
*/
|
|
9
|
+
export declare function scheduleDelayedJobs<TData>(jobs: Map<string, Job<TData>>): void;
|
|
10
|
+
//# sourceMappingURL=inMemoryQueue.scheduling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.scheduling.d.ts","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.scheduling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAC/B,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,EACf,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,EAC3D,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAC5B,IAAI,CAmBN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EACvC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAC5B,IAAI,CAWN"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { updateJobState } from "../job/job.core.js";
|
|
2
|
+
import { JobState as JobStateEnum } from "../jobTypes/jobTypes.type.js";
|
|
3
|
+
/**
|
|
4
|
+
* Schedule a job for future execution.
|
|
5
|
+
*/
|
|
6
|
+
export function scheduleJob(job, scheduledTimers, jobs) {
|
|
7
|
+
if (!job.scheduledAt) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const scheduledTime = new Date(job.scheduledAt).getTime();
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
const delay = Math.max(0, scheduledTime - now);
|
|
13
|
+
const timer = setTimeout(() => {
|
|
14
|
+
scheduledTimers.delete(job.id);
|
|
15
|
+
const currentJob = jobs.get(job.id);
|
|
16
|
+
if (currentJob && currentJob.state === JobStateEnum.SCHEDULED) {
|
|
17
|
+
const waitingJob = updateJobState(currentJob, JobStateEnum.WAITING);
|
|
18
|
+
jobs.set(job.id, waitingJob);
|
|
19
|
+
}
|
|
20
|
+
}, delay);
|
|
21
|
+
scheduledTimers.set(job.id, timer);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Promote scheduled jobs that are ready to run.
|
|
25
|
+
*/
|
|
26
|
+
export function scheduleDelayedJobs(jobs) {
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
for (const job of jobs.values()) {
|
|
29
|
+
if (job.state === JobStateEnum.SCHEDULED && job.scheduledAt) {
|
|
30
|
+
const scheduledTime = new Date(job.scheduledAt).getTime();
|
|
31
|
+
if (scheduledTime <= now) {
|
|
32
|
+
const waitingJob = updateJobState(job, JobStateEnum.WAITING);
|
|
33
|
+
jobs.set(job.id, waitingJob);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=inMemoryQueue.scheduling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryQueue.scheduling.js","sourceRoot":"","sources":["../../src/inMemoryQueue/inMemoryQueue.scheduling.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAExE;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,GAAe,EACf,eAA2D,EAC3D,IAA6B;IAE7B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACpE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YAC5D,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,aAAa,IAAI,GAAG,EAAE,CAAC;gBACzB,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inMemoryQueue/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inMemoryQueue/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC"}
|