@quave/agenda 1.0.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 (216) hide show
  1. package/LICENSE.md +25 -0
  2. package/README.md +380 -0
  3. package/dist/Job.d.ts +190 -0
  4. package/dist/Job.js +689 -0
  5. package/dist/Job.js.map +1 -0
  6. package/dist/JobProcessingQueue.d.ts +47 -0
  7. package/dist/JobProcessingQueue.js +107 -0
  8. package/dist/JobProcessingQueue.js.map +1 -0
  9. package/dist/JobProcessor.d.ts +72 -0
  10. package/dist/JobProcessor.js +512 -0
  11. package/dist/JobProcessor.js.map +1 -0
  12. package/dist/backends/index.d.ts +18 -0
  13. package/dist/backends/index.js +20 -0
  14. package/dist/backends/index.js.map +1 -0
  15. package/dist/cjs/Job.d.ts +190 -0
  16. package/dist/cjs/Job.js +696 -0
  17. package/dist/cjs/Job.js.map +1 -0
  18. package/dist/cjs/JobProcessingQueue.d.ts +47 -0
  19. package/dist/cjs/JobProcessingQueue.js +111 -0
  20. package/dist/cjs/JobProcessingQueue.js.map +1 -0
  21. package/dist/cjs/JobProcessor.d.ts +72 -0
  22. package/dist/cjs/JobProcessor.js +519 -0
  23. package/dist/cjs/JobProcessor.js.map +1 -0
  24. package/dist/cjs/backends/index.d.ts +17 -0
  25. package/dist/cjs/backends/index.js +20 -0
  26. package/dist/cjs/backends/index.js.map +1 -0
  27. package/dist/cjs/decorators/Define.d.ts +33 -0
  28. package/dist/cjs/decorators/Define.js +47 -0
  29. package/dist/cjs/decorators/Define.js.map +1 -0
  30. package/dist/cjs/decorators/Every.d.ts +43 -0
  31. package/dist/cjs/decorators/Every.js +58 -0
  32. package/dist/cjs/decorators/Every.js.map +1 -0
  33. package/dist/cjs/decorators/JobsController.d.ts +43 -0
  34. package/dist/cjs/decorators/JobsController.js +40 -0
  35. package/dist/cjs/decorators/JobsController.js.map +1 -0
  36. package/dist/cjs/decorators/index.d.ts +41 -0
  37. package/dist/cjs/decorators/index.js +57 -0
  38. package/dist/cjs/decorators/index.js.map +1 -0
  39. package/dist/cjs/decorators/metadata.d.ts +50 -0
  40. package/dist/cjs/decorators/metadata.js +41 -0
  41. package/dist/cjs/decorators/metadata.js.map +1 -0
  42. package/dist/cjs/decorators/register.d.ts +52 -0
  43. package/dist/cjs/decorators/register.js +145 -0
  44. package/dist/cjs/decorators/register.js.map +1 -0
  45. package/dist/cjs/index.d.ts +498 -0
  46. package/dist/cjs/index.js +776 -0
  47. package/dist/cjs/index.js.map +1 -0
  48. package/dist/cjs/notifications/BaseNotificationChannel.d.ts +47 -0
  49. package/dist/cjs/notifications/BaseNotificationChannel.js +112 -0
  50. package/dist/cjs/notifications/BaseNotificationChannel.js.map +1 -0
  51. package/dist/cjs/notifications/InMemoryNotificationChannel.d.ts +13 -0
  52. package/dist/cjs/notifications/InMemoryNotificationChannel.js +37 -0
  53. package/dist/cjs/notifications/InMemoryNotificationChannel.js.map +1 -0
  54. package/dist/cjs/notifications/index.d.ts +2 -0
  55. package/dist/cjs/notifications/index.js +8 -0
  56. package/dist/cjs/notifications/index.js.map +1 -0
  57. package/dist/cjs/package.json +1 -0
  58. package/dist/cjs/types/AgendaBackend.d.ts +61 -0
  59. package/dist/cjs/types/AgendaBackend.js +3 -0
  60. package/dist/cjs/types/AgendaBackend.js.map +1 -0
  61. package/dist/cjs/types/AgendaConfig.d.ts +10 -0
  62. package/dist/cjs/types/AgendaConfig.js +3 -0
  63. package/dist/cjs/types/AgendaConfig.js.map +1 -0
  64. package/dist/cjs/types/AgendaStatus.d.ts +32 -0
  65. package/dist/cjs/types/AgendaStatus.js +3 -0
  66. package/dist/cjs/types/AgendaStatus.js.map +1 -0
  67. package/dist/cjs/types/DbOptions.d.ts +4 -0
  68. package/dist/cjs/types/DbOptions.js +3 -0
  69. package/dist/cjs/types/DbOptions.js.map +1 -0
  70. package/dist/cjs/types/DrainOptions.d.ts +37 -0
  71. package/dist/cjs/types/DrainOptions.js +3 -0
  72. package/dist/cjs/types/DrainOptions.js.map +1 -0
  73. package/dist/cjs/types/JobDefinition.d.ts +49 -0
  74. package/dist/cjs/types/JobDefinition.js +3 -0
  75. package/dist/cjs/types/JobDefinition.js.map +1 -0
  76. package/dist/cjs/types/JobLogger.d.ts +111 -0
  77. package/dist/cjs/types/JobLogger.js +3 -0
  78. package/dist/cjs/types/JobLogger.js.map +1 -0
  79. package/dist/cjs/types/JobParameters.d.ts +106 -0
  80. package/dist/cjs/types/JobParameters.js +21 -0
  81. package/dist/cjs/types/JobParameters.js.map +1 -0
  82. package/dist/cjs/types/JobQuery.d.ts +79 -0
  83. package/dist/cjs/types/JobQuery.js +36 -0
  84. package/dist/cjs/types/JobQuery.js.map +1 -0
  85. package/dist/cjs/types/JobRepository.d.ts +101 -0
  86. package/dist/cjs/types/JobRepository.js +3 -0
  87. package/dist/cjs/types/JobRepository.js.map +1 -0
  88. package/dist/cjs/types/NotificationChannel.d.ts +120 -0
  89. package/dist/cjs/types/NotificationChannel.js +3 -0
  90. package/dist/cjs/types/NotificationChannel.js.map +1 -0
  91. package/dist/cjs/utils/backoff.d.ts +152 -0
  92. package/dist/cjs/utils/backoff.js +175 -0
  93. package/dist/cjs/utils/backoff.js.map +1 -0
  94. package/dist/cjs/utils/dateConstraints.d.ts +48 -0
  95. package/dist/cjs/utils/dateConstraints.js +127 -0
  96. package/dist/cjs/utils/dateConstraints.js.map +1 -0
  97. package/dist/cjs/utils/isValidDate.d.ts +1 -0
  98. package/dist/cjs/utils/isValidDate.js +8 -0
  99. package/dist/cjs/utils/isValidDate.js.map +1 -0
  100. package/dist/cjs/utils/nextRunAt.d.ts +10 -0
  101. package/dist/cjs/utils/nextRunAt.js +119 -0
  102. package/dist/cjs/utils/nextRunAt.js.map +1 -0
  103. package/dist/cjs/utils/priority.d.ts +13 -0
  104. package/dist/cjs/utils/priority.js +23 -0
  105. package/dist/cjs/utils/priority.js.map +1 -0
  106. package/dist/cjs/utils/processEvery.d.ts +1 -0
  107. package/dist/cjs/utils/processEvery.js +13 -0
  108. package/dist/cjs/utils/processEvery.js.map +1 -0
  109. package/dist/cjs/utils/stack.d.ts +1 -0
  110. package/dist/cjs/utils/stack.js +21 -0
  111. package/dist/cjs/utils/stack.js.map +1 -0
  112. package/dist/cjs/version.d.ts +9 -0
  113. package/dist/cjs/version.js +13 -0
  114. package/dist/cjs/version.js.map +1 -0
  115. package/dist/decorators/Define.d.ts +33 -0
  116. package/dist/decorators/Define.js +44 -0
  117. package/dist/decorators/Define.js.map +1 -0
  118. package/dist/decorators/Every.d.ts +43 -0
  119. package/dist/decorators/Every.js +55 -0
  120. package/dist/decorators/Every.js.map +1 -0
  121. package/dist/decorators/JobsController.d.ts +43 -0
  122. package/dist/decorators/JobsController.js +37 -0
  123. package/dist/decorators/JobsController.js.map +1 -0
  124. package/dist/decorators/index.d.ts +41 -0
  125. package/dist/decorators/index.js +46 -0
  126. package/dist/decorators/index.js.map +1 -0
  127. package/dist/decorators/metadata.d.ts +50 -0
  128. package/dist/decorators/metadata.js +35 -0
  129. package/dist/decorators/metadata.js.map +1 -0
  130. package/dist/decorators/register.d.ts +52 -0
  131. package/dist/decorators/register.js +139 -0
  132. package/dist/decorators/register.js.map +1 -0
  133. package/dist/index.d.ts +498 -0
  134. package/dist/index.js +744 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/notifications/BaseNotificationChannel.d.ts +47 -0
  137. package/dist/notifications/BaseNotificationChannel.js +108 -0
  138. package/dist/notifications/BaseNotificationChannel.js.map +1 -0
  139. package/dist/notifications/InMemoryNotificationChannel.d.ts +13 -0
  140. package/dist/notifications/InMemoryNotificationChannel.js +33 -0
  141. package/dist/notifications/InMemoryNotificationChannel.js.map +1 -0
  142. package/dist/notifications/index.d.ts +2 -0
  143. package/dist/notifications/index.js +3 -0
  144. package/dist/notifications/index.js.map +1 -0
  145. package/dist/types/AgendaBackend.d.ts +61 -0
  146. package/dist/types/AgendaBackend.js +2 -0
  147. package/dist/types/AgendaBackend.js.map +1 -0
  148. package/dist/types/AgendaConfig.d.ts +10 -0
  149. package/dist/types/AgendaConfig.js +2 -0
  150. package/dist/types/AgendaConfig.js.map +1 -0
  151. package/dist/types/AgendaStatus.d.ts +32 -0
  152. package/dist/types/AgendaStatus.js +2 -0
  153. package/dist/types/AgendaStatus.js.map +1 -0
  154. package/dist/types/DbOptions.d.ts +4 -0
  155. package/dist/types/DbOptions.js +2 -0
  156. package/dist/types/DbOptions.js.map +1 -0
  157. package/dist/types/DrainOptions.d.ts +37 -0
  158. package/dist/types/DrainOptions.js +2 -0
  159. package/dist/types/DrainOptions.js.map +1 -0
  160. package/dist/types/JobDefinition.d.ts +49 -0
  161. package/dist/types/JobDefinition.js +2 -0
  162. package/dist/types/JobDefinition.js.map +1 -0
  163. package/dist/types/JobLogger.d.ts +111 -0
  164. package/dist/types/JobLogger.js +2 -0
  165. package/dist/types/JobLogger.js.map +1 -0
  166. package/dist/types/JobParameters.d.ts +106 -0
  167. package/dist/types/JobParameters.js +17 -0
  168. package/dist/types/JobParameters.js.map +1 -0
  169. package/dist/types/JobQuery.d.ts +79 -0
  170. package/dist/types/JobQuery.js +33 -0
  171. package/dist/types/JobQuery.js.map +1 -0
  172. package/dist/types/JobRepository.d.ts +101 -0
  173. package/dist/types/JobRepository.js +2 -0
  174. package/dist/types/JobRepository.js.map +1 -0
  175. package/dist/types/NotificationChannel.d.ts +120 -0
  176. package/dist/types/NotificationChannel.js +2 -0
  177. package/dist/types/NotificationChannel.js.map +1 -0
  178. package/dist/utils/backoff.d.ts +152 -0
  179. package/dist/utils/backoff.js +167 -0
  180. package/dist/utils/backoff.js.map +1 -0
  181. package/dist/utils/dateConstraints.d.ts +48 -0
  182. package/dist/utils/dateConstraints.js +117 -0
  183. package/dist/utils/dateConstraints.js.map +1 -0
  184. package/dist/utils/isValidDate.d.ts +1 -0
  185. package/dist/utils/isValidDate.js +5 -0
  186. package/dist/utils/isValidDate.js.map +1 -0
  187. package/dist/utils/nextRunAt.d.ts +10 -0
  188. package/dist/utils/nextRunAt.js +110 -0
  189. package/dist/utils/nextRunAt.js.map +1 -0
  190. package/dist/utils/priority.d.ts +13 -0
  191. package/dist/utils/priority.js +20 -0
  192. package/dist/utils/priority.js.map +1 -0
  193. package/dist/utils/processEvery.d.ts +1 -0
  194. package/dist/utils/processEvery.js +7 -0
  195. package/dist/utils/processEvery.js.map +1 -0
  196. package/dist/utils/stack.d.ts +1 -0
  197. package/dist/utils/stack.js +18 -0
  198. package/dist/utils/stack.js.map +1 -0
  199. package/dist/version.d.ts +9 -0
  200. package/dist/version.js +10 -0
  201. package/dist/version.js.map +1 -0
  202. package/package.json +79 -0
  203. package/test/fixtures/forkHelper.js +40 -0
  204. package/test/fixtures/someJobDefinition.ts +12 -0
  205. package/test/shared/agenda-test-suite.ts +1876 -0
  206. package/test/shared/backoff-test-suite.ts +408 -0
  207. package/test/shared/debounce-test-suite.ts +377 -0
  208. package/test/shared/full-test-suite.ts +161 -0
  209. package/test/shared/index.ts +50 -0
  210. package/test/shared/joblogger-test-suite.ts +305 -0
  211. package/test/shared/jobprocessor-test-suite.ts +266 -0
  212. package/test/shared/notification-channel-test-suite.ts +471 -0
  213. package/test/shared/removeoncomplete-test-suite.ts +228 -0
  214. package/test/shared/repository-test-suite.ts +708 -0
  215. package/test/shared/retry-test-suite.ts +174 -0
  216. package/test/shared/test-utils.ts +100 -0
@@ -0,0 +1,498 @@
1
+ import { EventEmitter } from 'events';
2
+ import { ForkOptions } from 'child_process';
3
+ import type { JobDefinition } from './types/JobDefinition.js';
4
+ import type { AgendaConfig } from './types/AgendaConfig.js';
5
+ import type { AgendaBackend } from './types/AgendaBackend.js';
6
+ import type { NotificationChannel, JobStateNotification, JobStateType } from './types/NotificationChannel.js';
7
+ import type { JobRepository } from './types/JobRepository.js';
8
+ import type { AgendaStatus } from './types/AgendaStatus.js';
9
+ import type { JobsQueryOptions, JobsResult, JobsOverview } from './types/JobQuery.js';
10
+ import type { RemoveJobsOptions } from './types/JobRepository.js';
11
+ import type { DrainOptions, DrainResult } from './types/DrainOptions.js';
12
+ import type { JobLogger, JobLogEntry, JobLogQuery, JobLogQueryResult } from './types/JobLogger.js';
13
+ import { Job, JobWithId } from './Job.js';
14
+ import { JobPriority } from './utils/priority.js';
15
+ /**
16
+ * Agenda configuration options
17
+ */
18
+ export interface AgendaOptions {
19
+ /** Unified backend for storage and optionally notifications */
20
+ backend: AgendaBackend;
21
+ /** Name to identify this agenda instance */
22
+ name?: string;
23
+ /** Default number of concurrent jobs per job type */
24
+ defaultConcurrency?: number;
25
+ /** How often to poll for new jobs (string like '5 seconds' or milliseconds) */
26
+ processEvery?: string | number;
27
+ /** Maximum number of concurrent jobs globally */
28
+ maxConcurrency?: number;
29
+ /** Default max locked jobs per job type */
30
+ defaultLockLimit?: number;
31
+ /** Global max locked jobs */
32
+ lockLimit?: number;
33
+ /** Default lock lifetime in milliseconds */
34
+ defaultLockLifetime?: number;
35
+ /** Automatically remove one-time jobs from database after successful completion */
36
+ removeOnComplete?: boolean;
37
+ /** Fork helper configuration for sandboxed workers */
38
+ forkHelper?: {
39
+ path: string;
40
+ options?: ForkOptions;
41
+ };
42
+ /** Whether this is a forked worker instance */
43
+ forkedWorker?: boolean;
44
+ /**
45
+ * Override notification channel from backend.
46
+ * Use this to mix storage from one system with notifications from another.
47
+ * e.g., MongoDB storage + Redis notifications
48
+ */
49
+ notificationChannel?: NotificationChannel;
50
+ /**
51
+ * Enable persistent job event logging (stored in the backend's database).
52
+ *
53
+ * Disabled by default. When enabled, all job lifecycle events (start, success,
54
+ * fail, complete, retry, etc.) are persisted and can be queried via
55
+ * `agenda.getLogs()` or viewed in agendash.
56
+ *
57
+ * Options:
58
+ * - `true` — use the backend's built-in logger, all jobs are logged
59
+ * - `false` / omitted — no logging (default)
60
+ * - `JobLogger` — use a custom logger instance, all jobs are logged
61
+ * - `{ logger?: JobLogger, default?: boolean }` — fine-grained control:
62
+ * - `logger`: custom `JobLogger` (omit to use backend's built-in logger)
63
+ * - `default`: whether job definitions are logged by default (`true` = all logged,
64
+ * `false` = only jobs with `logging: true` in their definition are logged).
65
+ * Defaults to `true`.
66
+ *
67
+ * Per-job definitions can override the default via `define('job', fn, { logging: false })`.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * // Enable — log all jobs using backend's logger
72
+ * const agenda = new Agenda({ backend, logging: true });
73
+ *
74
+ * // Enable — opt-in per job (logger configured, but off by default)
75
+ * const agenda = new Agenda({ backend, logging: { default: false } });
76
+ * agenda.define('important', handler, { logging: true }); // logged
77
+ * agenda.define('noisy', handler); // NOT logged
78
+ *
79
+ * // Enable — custom logger (e.g., log to Postgres while using Mongo for storage)
80
+ * const agenda = new Agenda({ backend, logging: myPostgresJobLogger });
81
+ *
82
+ * // Enable — custom logger + opt-in per job
83
+ * const agenda = new Agenda({
84
+ * backend,
85
+ * logging: { logger: myPostgresJobLogger, default: false }
86
+ * });
87
+ *
88
+ * // Query logs
89
+ * const { entries } = await agenda.getLogs({ jobName: 'myJob', limit: 100 });
90
+ * ```
91
+ */
92
+ logging?: boolean | JobLogger | {
93
+ logger?: JobLogger;
94
+ default?: boolean;
95
+ };
96
+ }
97
+ /**
98
+ * Details provided when a job is scheduled for retry
99
+ */
100
+ export interface RetryDetails {
101
+ /** The retry attempt number (1-based) */
102
+ attempt: number;
103
+ /** Delay in milliseconds before the retry */
104
+ delay: number;
105
+ /** When the retry will be executed */
106
+ nextRunAt: Date;
107
+ /** The error that caused the failure */
108
+ error: Error;
109
+ }
110
+ /**
111
+ * Event names that Agenda emits
112
+ */
113
+ export type AgendaEventName = 'ready' | 'error' | 'fail' | 'success' | 'start' | 'complete' | 'retry' | 'retry exhausted' | `fail:${string}` | `success:${string}` | `start:${string}` | `complete:${string}` | `retry:${string}` | `retry exhausted:${string}`;
114
+ /**
115
+ * @class
116
+ */
117
+ export declare class Agenda extends EventEmitter {
118
+ readonly attrs: AgendaConfig;
119
+ readonly forkedWorker?: boolean;
120
+ readonly forkHelper?: {
121
+ path: string;
122
+ options?: ForkOptions;
123
+ };
124
+ private backend;
125
+ db: JobRepository;
126
+ private notificationChannel?;
127
+ private stateSubscriptionUnsubscribe?;
128
+ /**
129
+ * The persistent job logger for storing job lifecycle events in the database.
130
+ * Disabled by default. Enable via `logging: true` (uses backend's built-in logger)
131
+ * or by passing a custom `JobLogger` implementation.
132
+ */
133
+ jobLogger?: JobLogger;
134
+ /**
135
+ * Default logging behavior for job definitions that don't explicitly set `logging`.
136
+ * When `true` (default when logging is enabled), all jobs are logged.
137
+ * When `false`, only jobs with `logging: true` in their definition are logged.
138
+ */
139
+ loggingDefault: boolean;
140
+ on(event: 'ready', listener: () => void): this;
141
+ on(event: 'error', listener: (error: Error) => void): this;
142
+ on(event: 'fail', listener: (error: Error, job: JobWithId, remote?: false) => void): this;
143
+ on(event: 'fail', listener: (error: string, job: JobStateNotification, remote: true) => void): this;
144
+ on(event: 'success', listener: (job: JobWithId, remote?: false) => void): this;
145
+ on(event: 'success', listener: (job: JobStateNotification, remote: true) => void): this;
146
+ on(event: 'start', listener: (job: JobWithId, remote?: false) => void): this;
147
+ on(event: 'start', listener: (job: JobStateNotification, remote: true) => void): this;
148
+ on(event: 'complete', listener: (job: JobWithId, remote?: false) => void): this;
149
+ on(event: 'complete', listener: (job: JobStateNotification, remote: true) => void): this;
150
+ on(event: 'progress', listener: (job: JobWithId, remote?: false) => void): this;
151
+ on(event: 'progress', listener: (job: JobStateNotification, remote: true) => void): this;
152
+ on(event: 'retry', listener: (job: JobWithId, details: RetryDetails, remote?: false) => void): this;
153
+ on(event: 'retry', listener: (job: JobStateNotification, details: RetryDetails, remote: true) => void): this;
154
+ on(event: 'retry exhausted', listener: (error: Error, job: JobWithId) => void): this;
155
+ on(event: `fail:${string}`, listener: (error: Error, job: JobWithId, remote?: false) => void): this;
156
+ on(event: `fail:${string}`, listener: (error: string, job: JobStateNotification, remote: true) => void): this;
157
+ on(event: `success:${string}`, listener: (job: JobWithId, remote?: false) => void): this;
158
+ on(event: `success:${string}`, listener: (job: JobStateNotification, remote: true) => void): this;
159
+ on(event: `start:${string}`, listener: (job: JobWithId, remote?: false) => void): this;
160
+ on(event: `start:${string}`, listener: (job: JobStateNotification, remote: true) => void): this;
161
+ on(event: `complete:${string}`, listener: (job: JobWithId, remote?: false) => void): this;
162
+ on(event: `complete:${string}`, listener: (job: JobStateNotification, remote: true) => void): this;
163
+ on(event: `progress:${string}`, listener: (job: JobWithId, remote?: false) => void): this;
164
+ on(event: `progress:${string}`, listener: (job: JobStateNotification, remote: true) => void): this;
165
+ on(event: `retry:${string}`, listener: (job: JobWithId, details: RetryDetails, remote?: false) => void): this;
166
+ on(event: `retry:${string}`, listener: (job: JobStateNotification, details: RetryDetails, remote: true) => void): this;
167
+ on(event: `retry exhausted:${string}`, listener: (error: Error, job: JobWithId) => void): this;
168
+ readonly definitions: {
169
+ [name: string]: JobDefinition;
170
+ };
171
+ private jobProcessor?;
172
+ readonly ready: Promise<void>;
173
+ isActiveJobProcessor(): boolean;
174
+ runForkedJob(jobId: string): Promise<void>;
175
+ getRunningStats(fullDetails?: boolean): Promise<AgendaStatus>;
176
+ /**
177
+ * @param config - Agenda configuration with backend
178
+ * @param cb - Optional callback after Agenda is ready
179
+ */
180
+ constructor(config: AgendaOptions, cb?: (error?: Error) => void);
181
+ /**
182
+ * Cancels any jobs matching the passed options, and removes them from the database.
183
+ * @param options Options for which jobs to cancel
184
+ */
185
+ cancel(options: RemoveJobsOptions): Promise<number>;
186
+ /**
187
+ * Disables any jobs matching the passed options, preventing them from being run.
188
+ * @param options Options for which jobs to disable
189
+ * @returns Number of jobs disabled
190
+ */
191
+ disable(options: RemoveJobsOptions): Promise<number>;
192
+ /**
193
+ * Enables any jobs matching the passed options, allowing them to be run.
194
+ * @param options Options for which jobs to enable
195
+ * @returns Number of jobs enabled
196
+ */
197
+ enable(options: RemoveJobsOptions): Promise<number>;
198
+ /**
199
+ * Set name of queue
200
+ * @param name
201
+ */
202
+ name(name: string): Agenda;
203
+ /**
204
+ * Set the time how often the job processor checks for new jobs to process
205
+ * @param time
206
+ */
207
+ processEvery(time: string | number): Agenda;
208
+ /**
209
+ * Set the concurrency for jobs (globally), type does not matter
210
+ * @param num
211
+ */
212
+ maxConcurrency(num: number): Agenda;
213
+ /**
214
+ * Set the default concurrency for each job
215
+ * @param num number of max concurrency
216
+ */
217
+ defaultConcurrency(num: number): Agenda;
218
+ /**
219
+ * Set the default amount jobs that are allowed to be locked at one time (GLOBAL)
220
+ * @param num
221
+ */
222
+ lockLimit(num: number): Agenda;
223
+ /**
224
+ * Set default lock limit per job type
225
+ * @param num
226
+ */
227
+ defaultLockLimit(num: number): Agenda;
228
+ /**
229
+ * Set the default lock time (in ms)
230
+ * Default is 10 * 60 * 1000 ms (10 minutes)
231
+ * @param ms
232
+ */
233
+ defaultLockLifetime(ms: number): Agenda;
234
+ /**
235
+ * Set a notification channel for real-time job notifications
236
+ * @param channel - The notification channel implementation
237
+ */
238
+ notifyVia(channel: NotificationChannel): Agenda;
239
+ /**
240
+ * Check if a notification channel is configured
241
+ */
242
+ hasNotificationChannel(): boolean;
243
+ /**
244
+ * Check if persistent job logging is enabled
245
+ */
246
+ hasJobLogger(): boolean;
247
+ /**
248
+ * Log a job lifecycle event to the persistent job logger (fire-and-forget).
249
+ * Does nothing if no job logger is configured or if logging is disabled
250
+ * for the job definition (respects per-definition `logging` and the global `loggingDefault`).
251
+ * @internal
252
+ */
253
+ logJobEvent(entry: Omit<JobLogEntry, '_id' | 'timestamp' | 'agendaName'>): void;
254
+ /**
255
+ * Query persistent job logs.
256
+ * Returns empty result if no job logger is configured.
257
+ */
258
+ getLogs(query?: JobLogQuery): Promise<JobLogQueryResult>;
259
+ /**
260
+ * Clear persistent job logs matching the query.
261
+ * Returns 0 if no job logger is configured.
262
+ */
263
+ clearLogs(query?: JobLogQuery): Promise<number>;
264
+ /**
265
+ * Publish a job notification to the notification channel
266
+ * @internal
267
+ */
268
+ publishJobNotification(job: Job): Promise<void>;
269
+ /**
270
+ * Publish a job state notification to the notification channel.
271
+ * This enables bi-directional communication so that all subscribers
272
+ * can receive job lifecycle events (start, success, fail, complete, etc.)
273
+ * @internal
274
+ */
275
+ publishJobStateNotification(job: Job, type: JobStateType, extra?: Partial<Omit<JobStateNotification, 'type' | 'jobId' | 'jobName' | 'timestamp' | 'source'>>): void;
276
+ /**
277
+ * Subscribe to state notifications and re-emit them as regular events.
278
+ * This allows `agenda.on('success:jobName', ...)` to work across processes.
279
+ * @internal
280
+ */
281
+ private subscribeToStateNotifications;
282
+ /**
283
+ * Query jobs with database-agnostic options.
284
+ * Returns jobs with computed states and supports filtering by state.
285
+ *
286
+ * @param options - Query options (name, state, search, pagination)
287
+ * @returns Jobs with computed states and total count
288
+ */
289
+ queryJobs(options?: JobsQueryOptions): Promise<JobsResult>;
290
+ /**
291
+ * Get overview statistics for jobs grouped by name.
292
+ * Returns counts of jobs in each state for each job name.
293
+ *
294
+ * @returns Array of job overviews with state counts
295
+ */
296
+ getJobsOverview(): Promise<JobsOverview[]>;
297
+ /**
298
+ * Removes all orphaned jobs (jobs whose names are not currently defined).
299
+ * @note: Only use after defining your jobs
300
+ */
301
+ purge(): Promise<number>;
302
+ /**
303
+ * Removes ALL jobs from the database unconditionally.
304
+ * Use with caution — this cannot be undone.
305
+ * @returns Number of jobs removed
306
+ */
307
+ cancelAll(): Promise<number>;
308
+ /**
309
+ * Setup definition for job
310
+ * Method is used by consumers of lib to setup their functions
311
+ * BREAKING CHANGE in v4: options moved from 2nd to 3rd parameter!
312
+ * @param name
313
+ * @param processor
314
+ * @param options
315
+ */
316
+ define<DATA = any>(name: string, processor: (agendaJob: Job<DATA>, done: (error?: Error) => void) => void, options?: Partial<Pick<JobDefinition, 'lockLimit' | 'lockLifetime' | 'concurrency' | 'backoff' | 'removeOnComplete' | 'logging'>> & {
317
+ priority?: JobPriority;
318
+ }): void;
319
+ define<DATA = any>(name: string, processor: (agendaJob: Job<DATA>) => Promise<void>, options?: Partial<Pick<JobDefinition, 'lockLimit' | 'lockLifetime' | 'concurrency' | 'backoff' | 'removeOnComplete' | 'logging'>> & {
320
+ priority?: JobPriority;
321
+ }): void;
322
+ /**
323
+ * Internal helper method that uses createJob to create jobs for an array of names
324
+ * @param names - Job names to schedule
325
+ * @param createJob - Factory function to create each job
326
+ * @returns Array of created jobs
327
+ */
328
+ private createJobs;
329
+ /**
330
+ * Given a name and some data, create a new job
331
+ * @param name
332
+ */
333
+ create(name: string): Job<void>;
334
+ create<DATA = unknown>(name: string, data: DATA): Job<DATA>;
335
+ /**
336
+ * Creates a scheduled job with given interval and name/names of the job to run
337
+ * @param interval
338
+ * @param names
339
+ * @param data
340
+ * @param options
341
+ */
342
+ every(interval: string | number, names: string[], data?: undefined, options?: {
343
+ timezone?: string;
344
+ skipImmediate?: boolean;
345
+ forkMode?: boolean;
346
+ startDate?: Date | string;
347
+ endDate?: Date | string;
348
+ skipDays?: number[];
349
+ }): Promise<Job<void>[]>;
350
+ every(interval: string | number, name: string, data?: undefined, options?: {
351
+ timezone?: string;
352
+ skipImmediate?: boolean;
353
+ forkMode?: boolean;
354
+ startDate?: Date | string;
355
+ endDate?: Date | string;
356
+ skipDays?: number[];
357
+ }): Promise<Job<void>>;
358
+ every<DATA = unknown>(interval: string | number, names: string[], data: DATA, options?: {
359
+ timezone?: string;
360
+ skipImmediate?: boolean;
361
+ forkMode?: boolean;
362
+ startDate?: Date | string;
363
+ endDate?: Date | string;
364
+ skipDays?: number[];
365
+ }): Promise<Job<DATA>[]>;
366
+ every<DATA = unknown>(interval: string | number, name: string, data: DATA, options?: {
367
+ timezone?: string;
368
+ skipImmediate?: boolean;
369
+ forkMode?: boolean;
370
+ startDate?: Date | string;
371
+ endDate?: Date | string;
372
+ skipDays?: number[];
373
+ }): Promise<Job<DATA>>;
374
+ /**
375
+ * Schedule a job or jobs at a specific time
376
+ * @param when
377
+ * @param names
378
+ * @param data
379
+ * @param options
380
+ */
381
+ schedule<DATA = void>(when: string | Date, names: string[], data?: undefined, options?: {
382
+ startDate?: Date | string;
383
+ endDate?: Date | string;
384
+ skipDays?: number[];
385
+ }): Promise<Job<DATA>[]>;
386
+ schedule<DATA = void>(when: string | Date, names: string, data?: undefined, options?: {
387
+ startDate?: Date | string;
388
+ endDate?: Date | string;
389
+ skipDays?: number[];
390
+ }): Promise<Job<DATA>>;
391
+ schedule<DATA = unknown>(when: string | Date, names: string[], data: DATA, options?: {
392
+ startDate?: Date | string;
393
+ endDate?: Date | string;
394
+ skipDays?: number[];
395
+ }): Promise<Job<DATA>[]>;
396
+ schedule<DATA = unknown>(when: string | Date, name: string, data: DATA, options?: {
397
+ startDate?: Date | string;
398
+ endDate?: Date | string;
399
+ skipDays?: number[];
400
+ }): Promise<Job<DATA>>;
401
+ /**
402
+ * Create a job for this exact moment
403
+ * @param name
404
+ */
405
+ now<DATA = void>(name: string): Promise<Job<DATA>>;
406
+ now<DATA = unknown>(name: string, data: DATA): Promise<Job<DATA>>;
407
+ /**
408
+ * Create a debounced job that combines rapid submissions into a single execution.
409
+ * Requires a unique key to identify which jobs should be debounced together.
410
+ *
411
+ * @param name - Job name
412
+ * @param data - Job data
413
+ * @param uniqueKey - Unique constraint to identify jobs (e.g., { 'data.userId': 123 })
414
+ * @param debounceMs - Debounce delay in milliseconds
415
+ * @param options - Optional debounce options (maxWait, strategy)
416
+ *
417
+ * @example
418
+ * ```ts
419
+ * // Debounce search index updates by entity type
420
+ * await agenda.nowDebounced(
421
+ * 'updateSearchIndex',
422
+ * { entityType: 'products' },
423
+ * { 'data.entityType': 'products' },
424
+ * 2000
425
+ * );
426
+ *
427
+ * // With maxWait to guarantee execution within 30s
428
+ * await agenda.nowDebounced(
429
+ * 'syncUser',
430
+ * { userId: 123 },
431
+ * { 'data.userId': 123 },
432
+ * 5000,
433
+ * { maxWait: 30000 }
434
+ * );
435
+ * ```
436
+ */
437
+ nowDebounced<DATA = unknown>(name: string, data: DATA, uniqueKey: Record<string, unknown>, debounceMs: number, options?: {
438
+ maxWait?: number;
439
+ strategy?: 'trailing' | 'leading';
440
+ }): Promise<Job<DATA>>;
441
+ /**
442
+ * Starts processing jobs using processJobs() methods, storing an interval ID
443
+ * This method will only resolve if a db has been set up beforehand.
444
+ */
445
+ start(): Promise<void>;
446
+ /**
447
+ * Clear the interval that processes the jobs and unlocks all currently locked jobs
448
+ * @param closeConnection - Whether to close the database connection.
449
+ * Defaults to backend.ownsConnection (true if backend created the connection,
450
+ * false if connection was passed in by user).
451
+ */
452
+ stop(closeConnection?: boolean): Promise<void>;
453
+ /**
454
+ * Waits for all currently running jobs to finish before stopping.
455
+ * This allows for a graceful shutdown where jobs complete their work.
456
+ * Unlike stop(), this method waits for running jobs to complete instead of unlocking them.
457
+ *
458
+ * @param options - Drain options or timeout in milliseconds
459
+ * - `timeout`: Maximum time to wait for jobs to complete
460
+ * - `signal`: AbortSignal to cancel the drain operation
461
+ * - `closeConnection`: Whether to close the database connection (default: backend.ownsConnection)
462
+ * @returns DrainResult with completion statistics
463
+ *
464
+ * @example
465
+ * // Wait indefinitely for all jobs to complete
466
+ * await agenda.drain();
467
+ *
468
+ * @example
469
+ * // Wait up to 30 seconds
470
+ * const result = await agenda.drain(30000);
471
+ * if (result.timedOut) console.log(`${result.running} jobs still running`);
472
+ *
473
+ * @example
474
+ * // Use AbortSignal for external control
475
+ * const controller = new AbortController();
476
+ * setTimeout(() => controller.abort(), 30000);
477
+ * await agenda.drain({ signal: controller.signal });
478
+ */
479
+ drain(options?: number | (DrainOptions & {
480
+ closeConnection?: boolean;
481
+ })): Promise<DrainResult>;
482
+ }
483
+ export * from './types/AgendaConfig.js';
484
+ export * from './types/JobDefinition.js';
485
+ export * from './types/JobParameters.js';
486
+ export * from './types/DbOptions.js';
487
+ export * from './Job.js';
488
+ export * from './types/JobQuery.js';
489
+ export * from './types/JobRepository.js';
490
+ export * from './types/NotificationChannel.js';
491
+ export * from './types/AgendaBackend.js';
492
+ export * from './types/AgendaStatus.js';
493
+ export * from './types/DrainOptions.js';
494
+ export * from './notifications/index.js';
495
+ export * from './types/JobLogger.js';
496
+ export { applyAllDateConstraints, applyDateRangeConstraints, applySkipDays, shouldSkipDay, isWithinDateRange } from './utils/dateConstraints.js';
497
+ export * from './decorators/index.js';
498
+ export { backoffStrategies, constant, linear, exponential, combine, when, type BackoffStrategy, type BackoffContext, type BackoffOptions, type ExponentialBackoffOptions, type LinearBackoffOptions } from './utils/backoff.js';