@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.
- package/LICENSE.md +25 -0
- package/README.md +380 -0
- package/dist/Job.d.ts +190 -0
- package/dist/Job.js +689 -0
- package/dist/Job.js.map +1 -0
- package/dist/JobProcessingQueue.d.ts +47 -0
- package/dist/JobProcessingQueue.js +107 -0
- package/dist/JobProcessingQueue.js.map +1 -0
- package/dist/JobProcessor.d.ts +72 -0
- package/dist/JobProcessor.js +512 -0
- package/dist/JobProcessor.js.map +1 -0
- package/dist/backends/index.d.ts +18 -0
- package/dist/backends/index.js +20 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/cjs/Job.d.ts +190 -0
- package/dist/cjs/Job.js +696 -0
- package/dist/cjs/Job.js.map +1 -0
- package/dist/cjs/JobProcessingQueue.d.ts +47 -0
- package/dist/cjs/JobProcessingQueue.js +111 -0
- package/dist/cjs/JobProcessingQueue.js.map +1 -0
- package/dist/cjs/JobProcessor.d.ts +72 -0
- package/dist/cjs/JobProcessor.js +519 -0
- package/dist/cjs/JobProcessor.js.map +1 -0
- package/dist/cjs/backends/index.d.ts +17 -0
- package/dist/cjs/backends/index.js +20 -0
- package/dist/cjs/backends/index.js.map +1 -0
- package/dist/cjs/decorators/Define.d.ts +33 -0
- package/dist/cjs/decorators/Define.js +47 -0
- package/dist/cjs/decorators/Define.js.map +1 -0
- package/dist/cjs/decorators/Every.d.ts +43 -0
- package/dist/cjs/decorators/Every.js +58 -0
- package/dist/cjs/decorators/Every.js.map +1 -0
- package/dist/cjs/decorators/JobsController.d.ts +43 -0
- package/dist/cjs/decorators/JobsController.js +40 -0
- package/dist/cjs/decorators/JobsController.js.map +1 -0
- package/dist/cjs/decorators/index.d.ts +41 -0
- package/dist/cjs/decorators/index.js +57 -0
- package/dist/cjs/decorators/index.js.map +1 -0
- package/dist/cjs/decorators/metadata.d.ts +50 -0
- package/dist/cjs/decorators/metadata.js +41 -0
- package/dist/cjs/decorators/metadata.js.map +1 -0
- package/dist/cjs/decorators/register.d.ts +52 -0
- package/dist/cjs/decorators/register.js +145 -0
- package/dist/cjs/decorators/register.js.map +1 -0
- package/dist/cjs/index.d.ts +498 -0
- package/dist/cjs/index.js +776 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/notifications/BaseNotificationChannel.d.ts +47 -0
- package/dist/cjs/notifications/BaseNotificationChannel.js +112 -0
- package/dist/cjs/notifications/BaseNotificationChannel.js.map +1 -0
- package/dist/cjs/notifications/InMemoryNotificationChannel.d.ts +13 -0
- package/dist/cjs/notifications/InMemoryNotificationChannel.js +37 -0
- package/dist/cjs/notifications/InMemoryNotificationChannel.js.map +1 -0
- package/dist/cjs/notifications/index.d.ts +2 -0
- package/dist/cjs/notifications/index.js +8 -0
- package/dist/cjs/notifications/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/types/AgendaBackend.d.ts +61 -0
- package/dist/cjs/types/AgendaBackend.js +3 -0
- package/dist/cjs/types/AgendaBackend.js.map +1 -0
- package/dist/cjs/types/AgendaConfig.d.ts +10 -0
- package/dist/cjs/types/AgendaConfig.js +3 -0
- package/dist/cjs/types/AgendaConfig.js.map +1 -0
- package/dist/cjs/types/AgendaStatus.d.ts +32 -0
- package/dist/cjs/types/AgendaStatus.js +3 -0
- package/dist/cjs/types/AgendaStatus.js.map +1 -0
- package/dist/cjs/types/DbOptions.d.ts +4 -0
- package/dist/cjs/types/DbOptions.js +3 -0
- package/dist/cjs/types/DbOptions.js.map +1 -0
- package/dist/cjs/types/DrainOptions.d.ts +37 -0
- package/dist/cjs/types/DrainOptions.js +3 -0
- package/dist/cjs/types/DrainOptions.js.map +1 -0
- package/dist/cjs/types/JobDefinition.d.ts +49 -0
- package/dist/cjs/types/JobDefinition.js +3 -0
- package/dist/cjs/types/JobDefinition.js.map +1 -0
- package/dist/cjs/types/JobLogger.d.ts +111 -0
- package/dist/cjs/types/JobLogger.js +3 -0
- package/dist/cjs/types/JobLogger.js.map +1 -0
- package/dist/cjs/types/JobParameters.d.ts +106 -0
- package/dist/cjs/types/JobParameters.js +21 -0
- package/dist/cjs/types/JobParameters.js.map +1 -0
- package/dist/cjs/types/JobQuery.d.ts +79 -0
- package/dist/cjs/types/JobQuery.js +36 -0
- package/dist/cjs/types/JobQuery.js.map +1 -0
- package/dist/cjs/types/JobRepository.d.ts +101 -0
- package/dist/cjs/types/JobRepository.js +3 -0
- package/dist/cjs/types/JobRepository.js.map +1 -0
- package/dist/cjs/types/NotificationChannel.d.ts +120 -0
- package/dist/cjs/types/NotificationChannel.js +3 -0
- package/dist/cjs/types/NotificationChannel.js.map +1 -0
- package/dist/cjs/utils/backoff.d.ts +152 -0
- package/dist/cjs/utils/backoff.js +175 -0
- package/dist/cjs/utils/backoff.js.map +1 -0
- package/dist/cjs/utils/dateConstraints.d.ts +48 -0
- package/dist/cjs/utils/dateConstraints.js +127 -0
- package/dist/cjs/utils/dateConstraints.js.map +1 -0
- package/dist/cjs/utils/isValidDate.d.ts +1 -0
- package/dist/cjs/utils/isValidDate.js +8 -0
- package/dist/cjs/utils/isValidDate.js.map +1 -0
- package/dist/cjs/utils/nextRunAt.d.ts +10 -0
- package/dist/cjs/utils/nextRunAt.js +119 -0
- package/dist/cjs/utils/nextRunAt.js.map +1 -0
- package/dist/cjs/utils/priority.d.ts +13 -0
- package/dist/cjs/utils/priority.js +23 -0
- package/dist/cjs/utils/priority.js.map +1 -0
- package/dist/cjs/utils/processEvery.d.ts +1 -0
- package/dist/cjs/utils/processEvery.js +13 -0
- package/dist/cjs/utils/processEvery.js.map +1 -0
- package/dist/cjs/utils/stack.d.ts +1 -0
- package/dist/cjs/utils/stack.js +21 -0
- package/dist/cjs/utils/stack.js.map +1 -0
- package/dist/cjs/version.d.ts +9 -0
- package/dist/cjs/version.js +13 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/decorators/Define.d.ts +33 -0
- package/dist/decorators/Define.js +44 -0
- package/dist/decorators/Define.js.map +1 -0
- package/dist/decorators/Every.d.ts +43 -0
- package/dist/decorators/Every.js +55 -0
- package/dist/decorators/Every.js.map +1 -0
- package/dist/decorators/JobsController.d.ts +43 -0
- package/dist/decorators/JobsController.js +37 -0
- package/dist/decorators/JobsController.js.map +1 -0
- package/dist/decorators/index.d.ts +41 -0
- package/dist/decorators/index.js +46 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/metadata.d.ts +50 -0
- package/dist/decorators/metadata.js +35 -0
- package/dist/decorators/metadata.js.map +1 -0
- package/dist/decorators/register.d.ts +52 -0
- package/dist/decorators/register.js +139 -0
- package/dist/decorators/register.js.map +1 -0
- package/dist/index.d.ts +498 -0
- package/dist/index.js +744 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/BaseNotificationChannel.d.ts +47 -0
- package/dist/notifications/BaseNotificationChannel.js +108 -0
- package/dist/notifications/BaseNotificationChannel.js.map +1 -0
- package/dist/notifications/InMemoryNotificationChannel.d.ts +13 -0
- package/dist/notifications/InMemoryNotificationChannel.js +33 -0
- package/dist/notifications/InMemoryNotificationChannel.js.map +1 -0
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.js +3 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/types/AgendaBackend.d.ts +61 -0
- package/dist/types/AgendaBackend.js +2 -0
- package/dist/types/AgendaBackend.js.map +1 -0
- package/dist/types/AgendaConfig.d.ts +10 -0
- package/dist/types/AgendaConfig.js +2 -0
- package/dist/types/AgendaConfig.js.map +1 -0
- package/dist/types/AgendaStatus.d.ts +32 -0
- package/dist/types/AgendaStatus.js +2 -0
- package/dist/types/AgendaStatus.js.map +1 -0
- package/dist/types/DbOptions.d.ts +4 -0
- package/dist/types/DbOptions.js +2 -0
- package/dist/types/DbOptions.js.map +1 -0
- package/dist/types/DrainOptions.d.ts +37 -0
- package/dist/types/DrainOptions.js +2 -0
- package/dist/types/DrainOptions.js.map +1 -0
- package/dist/types/JobDefinition.d.ts +49 -0
- package/dist/types/JobDefinition.js +2 -0
- package/dist/types/JobDefinition.js.map +1 -0
- package/dist/types/JobLogger.d.ts +111 -0
- package/dist/types/JobLogger.js +2 -0
- package/dist/types/JobLogger.js.map +1 -0
- package/dist/types/JobParameters.d.ts +106 -0
- package/dist/types/JobParameters.js +17 -0
- package/dist/types/JobParameters.js.map +1 -0
- package/dist/types/JobQuery.d.ts +79 -0
- package/dist/types/JobQuery.js +33 -0
- package/dist/types/JobQuery.js.map +1 -0
- package/dist/types/JobRepository.d.ts +101 -0
- package/dist/types/JobRepository.js +2 -0
- package/dist/types/JobRepository.js.map +1 -0
- package/dist/types/NotificationChannel.d.ts +120 -0
- package/dist/types/NotificationChannel.js +2 -0
- package/dist/types/NotificationChannel.js.map +1 -0
- package/dist/utils/backoff.d.ts +152 -0
- package/dist/utils/backoff.js +167 -0
- package/dist/utils/backoff.js.map +1 -0
- package/dist/utils/dateConstraints.d.ts +48 -0
- package/dist/utils/dateConstraints.js +117 -0
- package/dist/utils/dateConstraints.js.map +1 -0
- package/dist/utils/isValidDate.d.ts +1 -0
- package/dist/utils/isValidDate.js +5 -0
- package/dist/utils/isValidDate.js.map +1 -0
- package/dist/utils/nextRunAt.d.ts +10 -0
- package/dist/utils/nextRunAt.js +110 -0
- package/dist/utils/nextRunAt.js.map +1 -0
- package/dist/utils/priority.d.ts +13 -0
- package/dist/utils/priority.js +20 -0
- package/dist/utils/priority.js.map +1 -0
- package/dist/utils/processEvery.d.ts +1 -0
- package/dist/utils/processEvery.js +7 -0
- package/dist/utils/processEvery.js.map +1 -0
- package/dist/utils/stack.d.ts +1 -0
- package/dist/utils/stack.js +18 -0
- package/dist/utils/stack.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +79 -0
- package/test/fixtures/forkHelper.js +40 -0
- package/test/fixtures/someJobDefinition.ts +12 -0
- package/test/shared/agenda-test-suite.ts +1876 -0
- package/test/shared/backoff-test-suite.ts +408 -0
- package/test/shared/debounce-test-suite.ts +377 -0
- package/test/shared/full-test-suite.ts +161 -0
- package/test/shared/index.ts +50 -0
- package/test/shared/joblogger-test-suite.ts +305 -0
- package/test/shared/jobprocessor-test-suite.ts +266 -0
- package/test/shared/notification-channel-test-suite.ts +471 -0
- package/test/shared/removeoncomplete-test-suite.ts +228 -0
- package/test/shared/repository-test-suite.ts +708 -0
- package/test/shared/retry-test-suite.ts +174 -0
- 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';
|