@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.
Files changed (211) hide show
  1. package/README.md +46 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/deadLetter/deadLetter.core.d.ts +13 -0
  4. package/dist/deadLetter/deadLetter.core.d.ts.map +1 -0
  5. package/dist/deadLetter/deadLetter.core.js +41 -0
  6. package/dist/deadLetter/deadLetter.core.js.map +1 -0
  7. package/dist/deadLetter/deadLetter.type.d.ts +33 -0
  8. package/dist/deadLetter/deadLetter.type.d.ts.map +1 -0
  9. package/dist/deadLetter/deadLetter.type.js +2 -0
  10. package/dist/deadLetter/deadLetter.type.js.map +1 -0
  11. package/dist/deadLetter/index.d.ts +9 -0
  12. package/dist/deadLetter/index.d.ts.map +1 -0
  13. package/dist/deadLetter/index.js +8 -0
  14. package/dist/deadLetter/index.js.map +1 -0
  15. package/dist/inMemoryQueue/inMemoryQueue.core.d.ts +48 -0
  16. package/dist/inMemoryQueue/inMemoryQueue.core.d.ts.map +1 -0
  17. package/dist/inMemoryQueue/inMemoryQueue.core.js +230 -0
  18. package/dist/inMemoryQueue/inMemoryQueue.core.js.map +1 -0
  19. package/dist/inMemoryQueue/inMemoryQueue.factory.d.ts +7 -0
  20. package/dist/inMemoryQueue/inMemoryQueue.factory.d.ts.map +1 -0
  21. package/dist/inMemoryQueue/inMemoryQueue.factory.js +8 -0
  22. package/dist/inMemoryQueue/inMemoryQueue.factory.js.map +1 -0
  23. package/dist/inMemoryQueue/inMemoryQueue.processing.d.ts +19 -0
  24. package/dist/inMemoryQueue/inMemoryQueue.processing.d.ts.map +1 -0
  25. package/dist/inMemoryQueue/inMemoryQueue.processing.js +112 -0
  26. package/dist/inMemoryQueue/inMemoryQueue.processing.js.map +1 -0
  27. package/dist/inMemoryQueue/inMemoryQueue.scheduling.d.ts +10 -0
  28. package/dist/inMemoryQueue/inMemoryQueue.scheduling.d.ts.map +1 -0
  29. package/dist/inMemoryQueue/inMemoryQueue.scheduling.js +38 -0
  30. package/dist/inMemoryQueue/inMemoryQueue.scheduling.js.map +1 -0
  31. package/dist/inMemoryQueue/index.d.ts +8 -0
  32. package/dist/inMemoryQueue/index.d.ts.map +1 -0
  33. package/dist/inMemoryQueue/index.js +8 -0
  34. package/dist/inMemoryQueue/index.js.map +1 -0
  35. package/dist/index.d.ts +27 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +44 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/job/index.d.ts +9 -0
  40. package/dist/job/index.d.ts.map +1 -0
  41. package/dist/job/index.js +8 -0
  42. package/dist/job/index.js.map +1 -0
  43. package/dist/job/job.core.d.ts +19 -0
  44. package/dist/job/job.core.d.ts.map +1 -0
  45. package/dist/job/job.core.js +74 -0
  46. package/dist/job/job.core.js.map +1 -0
  47. package/dist/job/job.type.d.ts +65 -0
  48. package/dist/job/job.type.d.ts.map +1 -0
  49. package/dist/job/job.type.js +2 -0
  50. package/dist/job/job.type.js.map +1 -0
  51. package/dist/jobContext/index.d.ts +8 -0
  52. package/dist/jobContext/index.d.ts.map +1 -0
  53. package/dist/jobContext/index.js +7 -0
  54. package/dist/jobContext/index.js.map +1 -0
  55. package/dist/jobContext/jobContext.core.d.ts +17 -0
  56. package/dist/jobContext/jobContext.core.d.ts.map +1 -0
  57. package/dist/jobContext/jobContext.core.js +36 -0
  58. package/dist/jobContext/jobContext.core.js.map +1 -0
  59. package/dist/jobContext/jobContext.type.d.ts +16 -0
  60. package/dist/jobContext/jobContext.type.d.ts.map +1 -0
  61. package/dist/jobContext/jobContext.type.js +2 -0
  62. package/dist/jobContext/jobContext.type.js.map +1 -0
  63. package/dist/jobOptions/index.d.ts +8 -0
  64. package/dist/jobOptions/index.d.ts.map +1 -0
  65. package/dist/jobOptions/index.js +7 -0
  66. package/dist/jobOptions/index.js.map +1 -0
  67. package/dist/jobOptions/jobOptions.core.d.ts +10 -0
  68. package/dist/jobOptions/jobOptions.core.d.ts.map +1 -0
  69. package/dist/jobOptions/jobOptions.core.js +23 -0
  70. package/dist/jobOptions/jobOptions.core.js.map +1 -0
  71. package/dist/jobOptions/jobOptions.type.d.ts +36 -0
  72. package/dist/jobOptions/jobOptions.type.d.ts.map +1 -0
  73. package/dist/jobOptions/jobOptions.type.js +2 -0
  74. package/dist/jobOptions/jobOptions.type.js.map +1 -0
  75. package/dist/jobResult/index.d.ts +8 -0
  76. package/dist/jobResult/index.d.ts.map +1 -0
  77. package/dist/jobResult/index.js +7 -0
  78. package/dist/jobResult/index.js.map +1 -0
  79. package/dist/jobResult/jobResult.core.d.ts +19 -0
  80. package/dist/jobResult/jobResult.core.d.ts.map +1 -0
  81. package/dist/jobResult/jobResult.core.js +36 -0
  82. package/dist/jobResult/jobResult.core.js.map +1 -0
  83. package/dist/jobResult/jobResult.type.d.ts +34 -0
  84. package/dist/jobResult/jobResult.type.d.ts.map +1 -0
  85. package/dist/jobResult/jobResult.type.js +2 -0
  86. package/dist/jobResult/jobResult.type.js.map +1 -0
  87. package/dist/jobTypes/index.d.ts +9 -0
  88. package/dist/jobTypes/index.d.ts.map +1 -0
  89. package/dist/jobTypes/index.js +8 -0
  90. package/dist/jobTypes/index.js.map +1 -0
  91. package/dist/jobTypes/jobTypes.type.d.ts +89 -0
  92. package/dist/jobTypes/jobTypes.type.d.ts.map +1 -0
  93. package/dist/jobTypes/jobTypes.type.js +81 -0
  94. package/dist/jobTypes/jobTypes.type.js.map +1 -0
  95. package/dist/middleware/index.d.ts +8 -0
  96. package/dist/middleware/index.d.ts.map +1 -0
  97. package/dist/middleware/index.js +7 -0
  98. package/dist/middleware/index.js.map +1 -0
  99. package/dist/middleware/middleware.core.d.ts +16 -0
  100. package/dist/middleware/middleware.core.d.ts.map +1 -0
  101. package/dist/middleware/middleware.core.js +76 -0
  102. package/dist/middleware/middleware.core.js.map +1 -0
  103. package/dist/middleware/middleware.type.d.ts +19 -0
  104. package/dist/middleware/middleware.type.d.ts.map +1 -0
  105. package/dist/middleware/middleware.type.js +2 -0
  106. package/dist/middleware/middleware.type.js.map +1 -0
  107. package/dist/processor/index.d.ts +10 -0
  108. package/dist/processor/index.d.ts.map +1 -0
  109. package/dist/processor/index.js +9 -0
  110. package/dist/processor/index.js.map +1 -0
  111. package/dist/processor/processor.core.d.ts +6 -0
  112. package/dist/processor/processor.core.d.ts.map +1 -0
  113. package/dist/processor/processor.core.js +40 -0
  114. package/dist/processor/processor.core.js.map +1 -0
  115. package/dist/processor/processor.type.d.ts +42 -0
  116. package/dist/processor/processor.type.d.ts.map +1 -0
  117. package/dist/processor/processor.type.js +7 -0
  118. package/dist/processor/processor.type.js.map +1 -0
  119. package/dist/queue/index.d.ts +10 -0
  120. package/dist/queue/index.d.ts.map +1 -0
  121. package/dist/queue/index.js +8 -0
  122. package/dist/queue/index.js.map +1 -0
  123. package/dist/queue/queue.core.d.ts +13 -0
  124. package/dist/queue/queue.core.d.ts.map +1 -0
  125. package/dist/queue/queue.core.js +23 -0
  126. package/dist/queue/queue.core.js.map +1 -0
  127. package/dist/queue/queue.type.d.ts +109 -0
  128. package/dist/queue/queue.type.d.ts.map +1 -0
  129. package/dist/queue/queue.type.js +2 -0
  130. package/dist/queue/queue.type.js.map +1 -0
  131. package/dist/queueEmitter/index.d.ts +9 -0
  132. package/dist/queueEmitter/index.d.ts.map +1 -0
  133. package/dist/queueEmitter/index.js +8 -0
  134. package/dist/queueEmitter/index.js.map +1 -0
  135. package/dist/queueEmitter/queueEmitter.core.d.ts +24 -0
  136. package/dist/queueEmitter/queueEmitter.core.d.ts.map +1 -0
  137. package/dist/queueEmitter/queueEmitter.core.js +45 -0
  138. package/dist/queueEmitter/queueEmitter.core.js.map +1 -0
  139. package/dist/queueEmitter/queueEmitter.type.d.ts +14 -0
  140. package/dist/queueEmitter/queueEmitter.type.d.ts.map +1 -0
  141. package/dist/queueEmitter/queueEmitter.type.js +2 -0
  142. package/dist/queueEmitter/queueEmitter.type.js.map +1 -0
  143. package/dist/queueEvents/index.d.ts +8 -0
  144. package/dist/queueEvents/index.d.ts.map +1 -0
  145. package/dist/queueEvents/index.js +7 -0
  146. package/dist/queueEvents/index.js.map +1 -0
  147. package/dist/queueEvents/queueEvents.core.d.ts +6 -0
  148. package/dist/queueEvents/queueEvents.core.d.ts.map +1 -0
  149. package/dist/queueEvents/queueEvents.core.js +12 -0
  150. package/dist/queueEvents/queueEvents.core.js.map +1 -0
  151. package/dist/queueEvents/queueEvents.type.d.ts +97 -0
  152. package/dist/queueEvents/queueEvents.type.d.ts.map +1 -0
  153. package/dist/queueEvents/queueEvents.type.js +2 -0
  154. package/dist/queueEvents/queueEvents.type.js.map +1 -0
  155. package/dist/queueManager/index.d.ts +8 -0
  156. package/dist/queueManager/index.d.ts.map +1 -0
  157. package/dist/queueManager/index.js +7 -0
  158. package/dist/queueManager/index.js.map +1 -0
  159. package/dist/queueManager/queueManager.core.d.ts +6 -0
  160. package/dist/queueManager/queueManager.core.d.ts.map +1 -0
  161. package/dist/queueManager/queueManager.core.js +32 -0
  162. package/dist/queueManager/queueManager.core.js.map +1 -0
  163. package/dist/queueManager/queueManager.type.d.ts +18 -0
  164. package/dist/queueManager/queueManager.type.d.ts.map +1 -0
  165. package/dist/queueManager/queueManager.type.js +2 -0
  166. package/dist/queueManager/queueManager.type.js.map +1 -0
  167. package/dist/queueRegistry/index.d.ts +8 -0
  168. package/dist/queueRegistry/index.d.ts.map +1 -0
  169. package/dist/queueRegistry/index.js +7 -0
  170. package/dist/queueRegistry/index.js.map +1 -0
  171. package/dist/queueRegistry/queueRegistry.core.d.ts +6 -0
  172. package/dist/queueRegistry/queueRegistry.core.d.ts.map +1 -0
  173. package/dist/queueRegistry/queueRegistry.core.js +41 -0
  174. package/dist/queueRegistry/queueRegistry.core.js.map +1 -0
  175. package/dist/queueRegistry/queueRegistry.type.d.ts +31 -0
  176. package/dist/queueRegistry/queueRegistry.type.d.ts.map +1 -0
  177. package/dist/queueRegistry/queueRegistry.type.js +2 -0
  178. package/dist/queueRegistry/queueRegistry.type.js.map +1 -0
  179. package/dist/retryPolicy/index.d.ts +8 -0
  180. package/dist/retryPolicy/index.d.ts.map +1 -0
  181. package/dist/retryPolicy/index.js +8 -0
  182. package/dist/retryPolicy/index.js.map +1 -0
  183. package/dist/retryPolicy/retryPolicy.core.d.ts +29 -0
  184. package/dist/retryPolicy/retryPolicy.core.d.ts.map +1 -0
  185. package/dist/retryPolicy/retryPolicy.core.js +51 -0
  186. package/dist/retryPolicy/retryPolicy.core.js.map +1 -0
  187. package/dist/serializer/index.d.ts +9 -0
  188. package/dist/serializer/index.d.ts.map +1 -0
  189. package/dist/serializer/index.js +8 -0
  190. package/dist/serializer/index.js.map +1 -0
  191. package/dist/serializer/serializer.core.d.ts +19 -0
  192. package/dist/serializer/serializer.core.d.ts.map +1 -0
  193. package/dist/serializer/serializer.core.js +53 -0
  194. package/dist/serializer/serializer.core.js.map +1 -0
  195. package/dist/serializer/serializer.type.d.ts +12 -0
  196. package/dist/serializer/serializer.type.d.ts.map +1 -0
  197. package/dist/serializer/serializer.type.js +2 -0
  198. package/dist/serializer/serializer.type.js.map +1 -0
  199. package/dist/worker/index.d.ts +9 -0
  200. package/dist/worker/index.d.ts.map +1 -0
  201. package/dist/worker/index.js +8 -0
  202. package/dist/worker/index.js.map +1 -0
  203. package/dist/worker/worker.core.d.ts +11 -0
  204. package/dist/worker/worker.core.d.ts.map +1 -0
  205. package/dist/worker/worker.core.js +117 -0
  206. package/dist/worker/worker.core.js.map +1 -0
  207. package/dist/worker/worker.type.d.ts +61 -0
  208. package/dist/worker/worker.type.d.ts.map +1 -0
  209. package/dist/worker/worker.type.js +2 -0
  210. package/dist/worker/worker.type.js.map +1 -0
  211. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deadLetter.type.js.map
@@ -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,8 @@
1
+ import { InMemoryQueue } from "./inMemoryQueue.core.js";
2
+ /**
3
+ * Creates an InMemoryQueue.
4
+ */
5
+ export function createInMemoryQueue(name, options) {
6
+ return new InMemoryQueue(name, options);
7
+ }
8
+ //# sourceMappingURL=inMemoryQueue.factory.js.map
@@ -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":"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"}
@@ -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,8 @@
1
+ /**
2
+ * @zudojs/queue/inMemoryQueue
3
+ *
4
+ * In-memory queue module.
5
+ */
6
+ export * from "./inMemoryQueue.core.js";
7
+ export * from "./inMemoryQueue.factory.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * @zudojs/queue/inMemoryQueue
3
+ *
4
+ * In-memory queue module.
5
+ */
6
+ export * from "./inMemoryQueue.core.js";
7
+ export * from "./inMemoryQueue.factory.js";
8
+ //# sourceMappingURL=index.js.map
@@ -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"}