@cedarjs/jobs 5.0.7-next.239 → 5.0.7-next.310

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.
@@ -29,6 +29,17 @@ export interface ErrorOptions<TJob extends BaseJob = BaseJob> {
29
29
  export interface FailureOptions<TJob extends BaseJob = BaseJob> {
30
30
  job: TJob;
31
31
  deleteJob?: boolean;
32
+ /**
33
+ * Present when the job is failed directly, without a preceding `error()`
34
+ * call for the same attempt (currently: when the job exceeded
35
+ * `maxRuntime`), so the adapter can record what went wrong in a single
36
+ * write
37
+ */
38
+ error?: Error;
39
+ }
40
+ export interface CancelOptions {
41
+ /** The id of the job to cancel, as returned by `schedule()` */
42
+ jobId: string | number;
32
43
  }
33
44
  /**
34
45
  * Base class for all job adapters. Provides a common interface for scheduling
@@ -58,12 +69,24 @@ export declare abstract class BaseAdapter<TOptions extends BaseAdapterOptions =
58
69
  */
59
70
  abstract error(options: ErrorOptions): void | Promise<void>;
60
71
  /**
61
- * Called when a job has errored more than maxAttempts and will not be retried
72
+ * Called when a job will not be retried: it has either errored more than
73
+ * maxAttempts times, or exceeded maxRuntime (in which case
74
+ * `options.error` contains the timeout error to record)
62
75
  */
63
76
  abstract failure(options: FailureOptions): void | Promise<void>;
64
77
  /**
65
78
  * Clear all jobs from storage
66
79
  */
67
80
  abstract clear(): void | Promise<void>;
81
+ /**
82
+ * Cancel a job so that it will not be run (if it's still queued) or not be
83
+ * retried or picked up by another worker (if it's currently running).
84
+ * Should return `true` if a job was cancelled and `false` if no cancellable
85
+ * job with the given id was found.
86
+ *
87
+ * This method is optional: adapters that don't implement it don't support
88
+ * cancellation and `later.cancel()` will throw a `CancelNotImplementedError`
89
+ */
90
+ cancel?(options: CancelOptions): boolean | Promise<boolean>;
68
91
  }
69
92
  //# sourceMappingURL=BaseAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/BaseAdapter/BaseAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAG3E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO;IAC5D,GAAG,EAAE,IAAI,CAAA;IACT,KAAK,EAAE,IAAI,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,YAAY,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO;IAC1D,GAAG,EAAE,IAAI,CAAA;IACT,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO;IAC5D,GAAG,EAAE,IAAI,CAAA;IACT,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;;;GAOG;AACH,8BAAsB,WAAW,CAC/B,QAAQ,SAAS,kBAAkB,GAAG,kBAAkB,EACxD,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtC,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAE3B,OAAO,EAAE,QAAQ;IAU7B,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe;IAE5D;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAEzE;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3D;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;OAEG;IACH,QAAQ,CAAC,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CACvC"}
1
+ {"version":3,"file":"BaseAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/BaseAdapter/BaseAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAG3E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO;IAC5D,GAAG,EAAE,IAAI,CAAA;IACT,KAAK,EAAE,IAAI,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,YAAY,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO;IAC1D,GAAG,EAAE,IAAI,CAAA;IACT,KAAK,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,OAAO,GAAG,OAAO;IAC5D,GAAG,EAAE,IAAI,CAAA;IACT,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB;AAED;;;;;;;GAOG;AACH,8BAAsB,WAAW,CAC/B,QAAQ,SAAS,kBAAkB,GAAG,kBAAkB,EACxD,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtC,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAE3B,OAAO,EAAE,QAAQ;IAU7B,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe;IAE5D;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAEzE;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3D;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;OAEG;IACH,QAAQ,CAAC,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtC;;;;;;;;OAQG;IACH,MAAM,CAAC,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAC5D"}
@@ -1,13 +1,16 @@
1
1
  import type { BaseJob } from '../../types.js';
2
- import type { BaseAdapterOptions, SchedulePayload, FindArgs, SuccessOptions, ErrorOptions, FailureOptions } from '../BaseAdapter/BaseAdapter.js';
2
+ import type { BaseAdapterOptions, SchedulePayload, FindArgs, SuccessOptions, ErrorOptions, FailureOptions, CancelOptions } from '../BaseAdapter/BaseAdapter.js';
3
3
  import { BaseAdapter } from '../BaseAdapter/BaseAdapter.js';
4
4
  export interface PrismaJob extends BaseJob {
5
5
  id: number;
6
6
  handler: string;
7
- runAt: Date;
7
+ /** Null once the job has completed or permanently failed */
8
+ runAt: Date | null;
8
9
  cron: string | null | undefined;
9
- lockedAt: Date;
10
- lockedBy: string;
10
+ /** Null unless the job is currently locked by a worker */
11
+ lockedAt: Date | null;
12
+ /** Null unless the job is currently locked by a worker */
13
+ lockedBy: string | null;
11
14
  lastError: string | null;
12
15
  failedAt: Date | null;
13
16
  createdAt: Date;
@@ -83,7 +86,7 @@ export interface PrismaAdapterOptions<TDb extends object = object> extends BaseA
83
86
  * }
84
87
  * ```
85
88
  */
86
- export declare class PrismaAdapter<TDb extends object = object> extends BaseAdapter<PrismaAdapterOptions<TDb>> {
89
+ export declare class PrismaAdapter<TDb extends object = object> extends BaseAdapter<PrismaAdapterOptions<TDb>, Promise<PrismaJob>> {
87
90
  db: TDb;
88
91
  model: DelegateKey<TDb> | string;
89
92
  accessor: PrismaAdapterDelegate;
@@ -98,8 +101,18 @@ export declare class PrismaAdapter<TDb extends object = object> extends BaseAdap
98
101
  find({ processName, maxRuntime, queues, }: FindArgs): Promise<PrismaJob | undefined>;
99
102
  success({ job, runAt, deleteJob }: SuccessOptions<PrismaJob>): Promise<void>;
100
103
  error({ job, runAt, error }: ErrorOptions<PrismaJob>): Promise<void>;
101
- failure({ job, deleteJob }: FailureOptions<PrismaJob>): Promise<void>;
102
- schedule({ name, path, args, runAt, cron, queue, priority, }: SchedulePayload): Promise<void>;
104
+ failure({ job, deleteJob, error }: FailureOptions<PrismaJob>): Promise<void>;
105
+ schedule({ name, path, args, runAt, cron, queue, priority, }: SchedulePayload): Promise<PrismaJob>;
106
+ /**
107
+ * Cancels a job by marking it as permanently failed so no worker will pick
108
+ * it up (or retry it, if it's currently being worked on).
109
+ *
110
+ * If the job is currently running, the in-progress attempt is not
111
+ * interrupted (the worker will stop it when `maxRuntime` is exceeded), but
112
+ * it will not be retried and will not be picked up by another worker once
113
+ * its lock goes stale.
114
+ */
115
+ cancel({ jobId }: CancelOptions): Promise<boolean>;
103
116
  clear(): Promise<void>;
104
117
  }
105
118
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"PrismaAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/PrismaAdapter/PrismaAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PrismaAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/PrismaAdapter/PrismaAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  import { camelCase } from "change-case";
2
- import { DEFAULT_MAX_RUNTIME, DEFAULT_MODEL_NAME } from "../../consts.js";
2
+ import {
3
+ DEFAULT_MAX_RUNTIME,
4
+ DEFAULT_MODEL_NAME,
5
+ MAX_RUNTIME_GRACE_PERIOD
6
+ } from "../../consts.js";
3
7
  import { BaseAdapter } from "../BaseAdapter/BaseAdapter.js";
4
8
  import { ModelNameError } from "./errors.js";
5
9
  function isPrismaAdapterDelegate(value) {
@@ -48,7 +52,7 @@ class PrismaAdapter extends BaseAdapter {
48
52
  queues
49
53
  }) {
50
54
  const maxRuntimeExpire = new Date(
51
- (/* @__PURE__ */ new Date()).getTime() + (maxRuntime || DEFAULT_MAX_RUNTIME * 1e3)
55
+ (/* @__PURE__ */ new Date()).getTime() - ((maxRuntime || DEFAULT_MAX_RUNTIME) + MAX_RUNTIME_GRACE_PERIOD) * 1e3
52
56
  );
53
57
  const where = {
54
58
  AND: [
@@ -110,13 +114,27 @@ class PrismaAdapter extends BaseAdapter {
110
114
  // Prisma queries are lazily evaluated and only sent to the db when they are
111
115
  // awaited, so do the await here to ensure they actually run (if the user
112
116
  // doesn't await the Promise then the queries will never be executed!)
117
+ //
118
+ // All of these updates/deletes are done with updateMany/deleteMany guarded
119
+ // on `failedAt: null` and on `attempts` still being this attempt's value,
120
+ // so the in-flight attempt's outcome can't overwrite or delete the row
121
+ // when:
122
+ // - the job was cancelled (or otherwise permanently failed) while this
123
+ // attempt was running (`failedAt` is no longer null), or
124
+ // - the job was reclaimed by another worker because this attempt stalled
125
+ // past `maxRuntime` plus the grace period (relocking increments
126
+ // `attempts`, so this attempt's remembered value no longer matches).
127
+ // `lockedBy` can't serve as that second fence because worker process names
128
+ // are deterministic and reused across restarts
113
129
  async success({ job, runAt, deleteJob }) {
114
130
  this.logger.debug(`[CedarJS Jobs] Job ${job.id} success`);
115
131
  if (deleteJob) {
116
- await this.accessor.delete({ where: { id: job.id } });
132
+ await this.accessor.deleteMany({
133
+ where: { id: job.id, failedAt: null, attempts: job.attempts }
134
+ });
117
135
  } else {
118
- await this.accessor.update({
119
- where: { id: job.id },
136
+ await this.accessor.updateMany({
137
+ where: { id: job.id, failedAt: null, attempts: job.attempts },
120
138
  data: {
121
139
  lockedAt: null,
122
140
  lockedBy: null,
@@ -138,23 +156,38 @@ class PrismaAdapter extends BaseAdapter {
138
156
  ${error.stack}`,
139
157
  runAt
140
158
  };
141
- await this.accessor.update({
142
- where: { id: job.id },
159
+ await this.accessor.updateMany({
160
+ where: { id: job.id, failedAt: null, attempts: job.attempts },
143
161
  data
144
162
  });
145
163
  }
146
- // Job has had too many attempts, it has now permanently failed.
147
- async failure({ job, deleteJob }) {
164
+ // The job will not be retried: it has either had too many attempts or
165
+ // exceeded maxRuntime (in which case `error` is set so the timeout can be
166
+ // recorded in the same single write that marks the job as failed)
167
+ async failure({ job, deleteJob, error }) {
148
168
  if (deleteJob) {
149
- await this.accessor.delete({ where: { id: job.id } });
169
+ await this.accessor.deleteMany({
170
+ where: { id: job.id, failedAt: null, attempts: job.attempts }
171
+ });
150
172
  } else {
151
- await this.accessor.update({
152
- where: { id: job.id },
153
- data: { failedAt: /* @__PURE__ */ new Date() }
173
+ const data = {
174
+ failedAt: /* @__PURE__ */ new Date(),
175
+ runAt: null
176
+ };
177
+ if (error) {
178
+ data.lastError = `${error.message}
179
+
180
+ ${error.stack}`;
181
+ }
182
+ await this.accessor.updateMany({
183
+ where: { id: job.id, failedAt: null, attempts: job.attempts },
184
+ data
154
185
  });
155
186
  }
156
187
  }
157
- // Schedules a job by creating a new record in the background job table
188
+ // Schedules a job by creating a new record in the background job table.
189
+ // Returns the created job so that callers get access to its `id` (to cancel
190
+ // it later, poll its status, etc.)
158
191
  async schedule({
159
192
  name,
160
193
  path,
@@ -164,7 +197,7 @@ ${error.stack}`,
164
197
  queue,
165
198
  priority
166
199
  }) {
167
- await this.accessor.create({
200
+ const data = await this.accessor.create({
168
201
  data: {
169
202
  handler: JSON.stringify({ name, path, args }),
170
203
  runAt,
@@ -173,6 +206,29 @@ ${error.stack}`,
173
206
  priority
174
207
  }
175
208
  });
209
+ const row = data;
210
+ return { ...row, name, path, args };
211
+ }
212
+ /**
213
+ * Cancels a job by marking it as permanently failed so no worker will pick
214
+ * it up (or retry it, if it's currently being worked on).
215
+ *
216
+ * If the job is currently running, the in-progress attempt is not
217
+ * interrupted (the worker will stop it when `maxRuntime` is exceeded), but
218
+ * it will not be retried and will not be picked up by another worker once
219
+ * its lock goes stale.
220
+ */
221
+ async cancel({ jobId }) {
222
+ this.logger.debug(`[CedarJS Jobs] Cancelling job ${jobId}`);
223
+ const { count } = await this.accessor.updateMany({
224
+ where: { id: jobId, failedAt: null, runAt: { not: null } },
225
+ data: {
226
+ failedAt: /* @__PURE__ */ new Date(),
227
+ lastError: "Job cancelled by user",
228
+ runAt: null
229
+ }
230
+ });
231
+ return count > 0;
176
232
  }
177
233
  async clear() {
178
234
  await this.accessor.deleteMany();
package/dist/consts.d.ts CHANGED
@@ -1,6 +1,15 @@
1
1
  export declare const DEFAULT_MAX_ATTEMPTS = 24;
2
2
  /** 4 hours in seconds */
3
3
  export declare const DEFAULT_MAX_RUNTIME = 14400;
4
+ /**
5
+ * Extra time, in seconds, beyond `maxRuntime` before another worker may treat
6
+ * a job's lock as abandoned. The worker that locked the job enforces its own
7
+ * `maxRuntime` timeout, so this grace period gives it time to record the
8
+ * timeout and mark the job as failed without a second worker claiming (and
9
+ * re-executing) the job while that's happening. Only jobs whose worker died
10
+ * without cleaning up after itself are ever claimed this way.
11
+ */
12
+ export declare const MAX_RUNTIME_GRACE_PERIOD = 60;
4
13
  /** 5 seconds */
5
14
  export declare const DEFAULT_SLEEP_DELAY = 5;
6
15
  export declare const DEFAULT_DELETE_SUCCESSFUL_JOBS = true;
@@ -1 +1 @@
1
- {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,yBAAyB;AACzB,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,eAAO,MAAM,8BAA8B,OAAO,CAAA;AAClD,eAAO,MAAM,0BAA0B,QAAQ,CAAA;AAC/C,eAAO,MAAM,cAAc,SAAU,CAAA;AACrC,eAAO,MAAM,aAAa,YAAY,CAAA;AACtC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,YAAY,IAAI,CAAA;AAC7B,eAAO,MAAM,kBAAkB,MAAO,CAAA;AACtC,eAAO,MAAM,oBAAoB,sBAAsB,CAAA;AAEvD,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAC7C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,WAAW,CAAA"}
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,yBAAyB;AACzB,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAC1C,gBAAgB;AAChB,eAAO,MAAM,mBAAmB,IAAI,CAAA;AAEpC,eAAO,MAAM,8BAA8B,OAAO,CAAA;AAClD,eAAO,MAAM,0BAA0B,QAAQ,CAAA;AAC/C,eAAO,MAAM,cAAc,SAAU,CAAA;AACrC,eAAO,MAAM,aAAa,YAAY,CAAA;AACtC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAClC,eAAO,MAAM,YAAY,IAAI,CAAA;AAC7B,eAAO,MAAM,kBAAkB,MAAO,CAAA;AACtC,eAAO,MAAM,oBAAoB,sBAAsB,CAAA;AAEvD,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAC7C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,WAAW,CAAA"}
package/dist/consts.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import console from "node:console";
2
2
  const DEFAULT_MAX_ATTEMPTS = 24;
3
3
  const DEFAULT_MAX_RUNTIME = 14400;
4
+ const MAX_RUNTIME_GRACE_PERIOD = 60;
4
5
  const DEFAULT_SLEEP_DELAY = 5;
5
6
  const DEFAULT_DELETE_SUCCESSFUL_JOBS = true;
6
7
  const DEFAULT_DELETE_FAILED_JOBS = false;
@@ -29,5 +30,6 @@ export {
29
30
  DEFAULT_WAIT,
30
31
  DEFAULT_WAIT_UNTIL,
31
32
  DEFAULT_WORK_QUEUE,
33
+ MAX_RUNTIME_GRACE_PERIOD,
32
34
  PROCESS_TITLE_PREFIX
33
35
  };
@@ -6,6 +6,11 @@ export interface ExecutorOptions {
6
6
  logger?: BasicLogger;
7
7
  /** Defaults to DEFAULT_MAX_ATTEMPTS */
8
8
  maxAttempts?: number;
9
+ /**
10
+ * The maximum amount of time, in seconds, that the job is allowed to run
11
+ * before it is marked as failed. Defaults to DEFAULT_MAX_RUNTIME
12
+ */
13
+ maxRuntime?: number;
9
14
  /** Defaults to DEFAULT_DELETE_FAILED_JOBS */
10
15
  deleteFailedJobs?: boolean;
11
16
  /** Defaults to DEFAULT_DELETE_SUCCESSFUL_JOBS */
@@ -14,6 +19,7 @@ export interface ExecutorOptions {
14
19
  export declare const DEFAULTS: {
15
20
  logger: Console;
16
21
  maxAttempts: number;
22
+ maxRuntime: number;
17
23
  deleteFailedJobs: boolean;
18
24
  deleteSuccessfulJobs: boolean;
19
25
  };
@@ -23,6 +29,7 @@ export declare class Executor {
23
29
  logger: NonNullable<ExecutorOptions['logger']>;
24
30
  job: BaseJob;
25
31
  maxAttempts: NonNullable<ExecutorOptions['maxAttempts']>;
32
+ maxRuntime: NonNullable<ExecutorOptions['maxRuntime']>;
26
33
  deleteFailedJobs: NonNullable<ExecutorOptions['deleteFailedJobs']>;
27
34
  deleteSuccessfulJobs: NonNullable<ExecutorOptions['deleteSuccessfulJobs']>;
28
35
  constructor(options: ExecutorOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"Executor.d.ts","sourceRoot":"","sources":["../../src/core/Executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AASzE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAA;IACpB,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAA;AAED,qBAAa,QAAQ;IACnB,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IAClC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,EAAE,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC9C,GAAG,EAAE,OAAO,CAAA;IACZ,WAAW,EAAE,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAA;IACxD,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAClE,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAA;gBAE9D,OAAO,EAAE,eAAe;IAmBpC,IAAI,aAAa,WAEhB;IAEK,OAAO;IA2Cb,mBAAmB,CAAC,QAAQ,EAAE,MAAM;CAGrC"}
1
+ {"version":3,"file":"Executor.d.ts","sourceRoot":"","sources":["../../src/core/Executor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AAczE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAIvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAA;IACpB,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,eAAO,MAAM,QAAQ;;;;;;CAMpB,CAAA;AAED,qBAAa,QAAQ;IACnB,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;IAClC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,EAAE,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC9C,GAAG,EAAE,OAAO,CAAA;IACZ,WAAW,EAAE,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAA;IACxD,UAAU,EAAE,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAA;IACtD,gBAAgB,EAAE,WAAW,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAClE,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAA;gBAE9D,OAAO,EAAE,eAAe;IAsBpC,IAAI,aAAa,WAEhB;IAEK,OAAO;IAuGb,mBAAmB,CAAC,QAAQ,EAAE,MAAM;CAGrC"}
@@ -1,15 +1,23 @@
1
+ import { setTimeout, clearTimeout } from "node:timers";
1
2
  import { CronExpressionParser } from "cron-parser";
2
3
  import {
3
4
  DEFAULT_MAX_ATTEMPTS,
5
+ DEFAULT_MAX_RUNTIME,
4
6
  DEFAULT_DELETE_FAILED_JOBS,
5
7
  DEFAULT_DELETE_SUCCESSFUL_JOBS,
6
8
  DEFAULT_LOGGER
7
9
  } from "../consts.js";
8
- import { AdapterRequiredError, JobRequiredError } from "../errors.js";
10
+ import {
11
+ AdapterRequiredError,
12
+ JobRequiredError,
13
+ JobTimeoutError
14
+ } from "../errors.js";
9
15
  import { loadJob } from "../loaders.js";
16
+ import { executionContext } from "./executionContext.js";
10
17
  const DEFAULTS = {
11
18
  logger: DEFAULT_LOGGER,
12
19
  maxAttempts: DEFAULT_MAX_ATTEMPTS,
20
+ maxRuntime: DEFAULT_MAX_RUNTIME,
13
21
  deleteFailedJobs: DEFAULT_DELETE_FAILED_JOBS,
14
22
  deleteSuccessfulJobs: DEFAULT_DELETE_SUCCESSFUL_JOBS
15
23
  };
@@ -19,6 +27,7 @@ class Executor {
19
27
  logger;
20
28
  job;
21
29
  maxAttempts;
30
+ maxRuntime;
22
31
  deleteFailedJobs;
23
32
  deleteSuccessfulJobs;
24
33
  constructor(options) {
@@ -33,6 +42,7 @@ class Executor {
33
42
  this.logger = this.options.logger;
34
43
  this.job = this.options.job;
35
44
  this.maxAttempts = this.options.maxAttempts;
45
+ this.maxRuntime = this.options.maxRuntime || DEFAULT_MAX_RUNTIME;
36
46
  this.deleteFailedJobs = this.options.deleteFailedJobs;
37
47
  this.deleteSuccessfulJobs = this.options.deleteSuccessfulJobs;
38
48
  }
@@ -41,34 +51,71 @@ class Executor {
41
51
  }
42
52
  async perform() {
43
53
  this.logger.info(`[CedarJS Jobs] Started job ${this.jobIdentifier}`);
54
+ const abortController = new AbortController();
55
+ let timeoutId;
56
+ let performPromise;
44
57
  try {
45
- const job = await loadJob({ name: this.job.name, path: this.job.path });
46
- await job.perform(...this.job.args);
58
+ const timeoutPromise = new Promise((_resolve, reject) => {
59
+ timeoutId = setTimeout(() => {
60
+ reject(new JobTimeoutError(this.jobIdentifier, this.maxRuntime));
61
+ }, this.maxRuntime * 1e3);
62
+ });
63
+ performPromise = (async () => {
64
+ const job = await loadJob({ name: this.job.name, path: this.job.path });
65
+ await executionContext.run(
66
+ { signal: abortController.signal, job: this.job },
67
+ () => job.perform(...this.job.args)
68
+ );
69
+ })();
70
+ await Promise.race([performPromise, timeoutPromise]);
47
71
  const runAt = this.job.cron ? CronExpressionParser.parse(this.job.cron).next().toDate() : void 0;
48
72
  await this.adapter.success({
49
73
  job: this.job,
50
74
  runAt,
51
75
  deleteJob: !runAt && this.deleteSuccessfulJobs
52
76
  });
53
- } catch (error) {
77
+ } catch (rawError) {
78
+ const error = rawError instanceof Error ? rawError : new Error(String(rawError));
79
+ const timedOut = error instanceof JobTimeoutError;
80
+ if (timedOut) {
81
+ abortController.abort(error);
82
+ performPromise?.catch(() => {
83
+ });
84
+ }
54
85
  const errorMessage = `[CedarJS Jobs] Error in job ${this.jobIdentifier}: ${error.message}`;
55
86
  this.logger.error(errorMessage);
56
87
  this.logger.error(error.stack);
57
- await this.adapter.error({
58
- job: this.job,
59
- runAt: new Date(
60
- (/* @__PURE__ */ new Date()).getTime() + this.backoffMilliseconds(this.job.attempts)
61
- ),
62
- error
63
- });
64
- if (this.job.attempts >= this.maxAttempts) {
65
- const maxAttemptsMessage = `[CedarJS Jobs] Failed job ${this.jobIdentifier}: reached max attempts (${this.maxAttempts})`;
66
- this.logger.warn(this.job, maxAttemptsMessage);
88
+ if (timedOut) {
89
+ this.logger.warn(
90
+ this.job,
91
+ `[CedarJS Jobs] Failed job ${this.jobIdentifier}: exceeded max runtime (${this.maxRuntime} seconds)`
92
+ );
67
93
  await this.adapter.failure({
68
94
  job: this.job,
69
- deleteJob: this.deleteFailedJobs
95
+ deleteJob: this.deleteFailedJobs,
96
+ error
97
+ });
98
+ } else {
99
+ await this.adapter.error({
100
+ job: this.job,
101
+ runAt: new Date(
102
+ (/* @__PURE__ */ new Date()).getTime() + this.backoffMilliseconds(this.job.attempts)
103
+ ),
104
+ error
70
105
  });
106
+ if (this.job.attempts >= this.maxAttempts) {
107
+ this.logger.warn(
108
+ this.job,
109
+ `[CedarJS Jobs] Failed job ${this.jobIdentifier}: reached max attempts (${this.maxAttempts})`
110
+ );
111
+ await this.adapter.failure({
112
+ job: this.job,
113
+ deleteJob: this.deleteFailedJobs
114
+ });
115
+ }
71
116
  }
117
+ } finally {
118
+ clearTimeout(timeoutId);
72
119
  }
73
120
  }
74
121
  backoffMilliseconds(attempts) {
@@ -13,7 +13,9 @@ export declare class JobManager<TAdapters extends Adapters, TQueues extends Queu
13
13
  logger: TLogger;
14
14
  workers: WorkerConfig<TAdapters, TQueues>[];
15
15
  constructor(config: JobManagerConfig<TAdapters, TQueues extends string[] ? never : TQueues, TLogger>);
16
- createScheduler(schedulerConfig: CreateSchedulerConfig<TAdapters>): <TJob extends Job<TQueues, any[]>>(job: TJob, ...argsAndOptions: CreateSchedulerArgs<TJob>) => Promise<boolean>;
16
+ createScheduler<TAdapterName extends keyof TAdapters>(schedulerConfig: CreateSchedulerConfig<TAdapters, TAdapterName>): (<TJob extends Job<TQueues, any[]>>(job: TJob, ...argsAndOptions: CreateSchedulerArgs<TJob>) => Promise<void>) & {
17
+ cancel: (jobId: string | number) => Promise<boolean>;
18
+ };
17
19
  createJob<TArgs extends unknown[]>(jobDefinition: JobDefinition<TQueues, TArgs>): Job<TQueues, TArgs>;
18
20
  createWorker({ index, workoff, clear, processName }: CreateWorkerArgs): Worker;
19
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"JobManager.d.ts","sourceRoot":"","sources":["../../src/core/JobManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,GAAG,EACH,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACjC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,UAAU,CACrB,SAAS,SAAS,QAAQ,EAC1B,OAAO,SAAS,UAAU,EAC1B,OAAO,SAAS,WAAW;IAE3B,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAA;gBAGzC,MAAM,EAAE,gBAAgB,CACtB,SAAS,EAGT,OAAO,SAAS,MAAM,EAAE,GAAG,KAAK,GAAG,OAAO,EAC1C,OAAO,CACR;IAQH,eAAe,CAAC,eAAe,EAAE,qBAAqB,CAAC,SAAS,CAAC,IAMvD,IAAI,SAAS,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EACtC,KAAK,IAAI,EACT,GAAG,gBAAgB,mBAAmB,CAAC,IAAI,CAAC;IAYhD,SAAS,CAAC,KAAK,SAAS,OAAO,EAAE,EAC/B,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,GAC3C,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IAOtB,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,gBAAgB;CAqBtE"}
1
+ {"version":3,"file":"JobManager.d.ts","sourceRoot":"","sources":["../../src/core/JobManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,GAAG,EACH,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACjC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,UAAU,CACrB,SAAS,SAAS,QAAQ,EAC1B,OAAO,SAAS,UAAU,EAC1B,OAAO,SAAS,WAAW;IAE3B,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAA;gBAGzC,MAAM,EAAE,gBAAgB,CACtB,SAAS,EAGT,OAAO,SAAS,MAAM,EAAE,GAAG,KAAK,GAAG,OAAO,EAC1C,OAAO,CACR;IAQH,eAAe,CAAC,YAAY,SAAS,MAAM,SAAS,EAClD,eAAe,EAAE,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,KAO7C,IAAI,SAAS,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAC3C,IAAI,qBACU,mBAAmB,CAAC,IAAI,CAAC;wBAc5B,MAAM,GAAG,MAAM;;IAInC,SAAS,CAAC,KAAK,SAAS,OAAO,EAAE,EAC/B,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,GAC3C,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IAOtB,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,gBAAgB;CAqBtE"}
@@ -17,13 +17,16 @@ class JobManager {
17
17
  adapter: this.adapters[schedulerConfig.adapter],
18
18
  logger: schedulerConfig.logger ?? this.logger
19
19
  });
20
- return (job, ...argsAndOptions) => {
20
+ const schedule = (job, ...argsAndOptions) => {
21
21
  const [possibleArgs, possibleOptions] = argsAndOptions;
22
22
  const didPassArgs = Array.isArray(possibleArgs);
23
23
  const args = didPassArgs ? possibleArgs : [];
24
24
  const options = didPassArgs ? possibleOptions : possibleArgs;
25
25
  return scheduler.schedule({ job, args, options });
26
26
  };
27
+ return Object.assign(schedule, {
28
+ cancel: (jobId) => scheduler.cancel(jobId)
29
+ });
27
30
  }
28
31
  createJob(jobDefinition) {
29
32
  return jobDefinition;
@@ -21,7 +21,17 @@ export declare class Scheduler<TAdapter extends BaseAdapter> {
21
21
  job: TJob;
22
22
  args: Parameters<TJob['perform']> | never[];
23
23
  options?: ScheduleJobOptions;
24
- }): Promise<boolean>;
24
+ }): Promise<void>;
25
+ /**
26
+ * Cancel a scheduled job so that it will not be run (if it's still queued)
27
+ * or not be retried (if it's currently running). Requires an adapter that
28
+ * implements the optional `cancel()` method, like the `PrismaAdapter`.
29
+ *
30
+ * Returns whatever the adapter's `cancel()` returns (for the
31
+ * `PrismaAdapter` that's `true` if a job was cancelled and `false` if no
32
+ * cancellable job with the given id was found)
33
+ */
34
+ cancel(jobId: string | number): Promise<boolean>;
25
35
  }
26
36
  export {};
27
37
  //# sourceMappingURL=Scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/core/Scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAY/C,OAAO,KAAK,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAEpB,UAAU,eAAe,CAAC,QAAQ,SAAS,WAAW;IACpD,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,SAAS,CAAC,QAAQ,SAAS,WAAW;IACjD,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,EAAE,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAE5C,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC;IAS1D,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE;IAU1E,YAAY,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EACpD,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAE;QACD,GAAG,EAAE,IAAI,CAAA;QACT,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;QAC3C,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAC7B,GAAG,eAAe;IA4Bb,QAAQ,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EACtD,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAE;QACD,GAAG,EAAE,IAAI,CAAA;QACT,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;QAC3C,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAC7B;CAmBF"}
1
+ {"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/core/Scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAa/C,OAAO,KAAK,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,kBAAkB,EACnB,MAAM,aAAa,CAAA;AAEpB,UAAU,eAAe,CAAC,QAAQ,SAAS,WAAW;IACpD,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,SAAS,CAAC,QAAQ,SAAS,WAAW;IACjD,OAAO,EAAE,QAAQ,CAAA;IACjB,MAAM,EAAE,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAE5C,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC;IAS1D,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE;IAU1E,YAAY,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EACpD,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAE;QACD,GAAG,EAAE,IAAI,CAAA;QACT,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;QAC3C,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAC7B,GAAG,eAAe;IA4Bb,QAAQ,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EACtD,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAE;QACD,GAAG,EAAE,IAAI,CAAA;QACT,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;QAC3C,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAC7B;IAqBD;;;;;;;;OAQG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CASpC"}
@@ -6,6 +6,7 @@ import {
6
6
  } from "../consts.js";
7
7
  import {
8
8
  AdapterNotConfiguredError,
9
+ CancelNotImplementedError,
9
10
  QueueNotDefinedError,
10
11
  SchedulingError
11
12
  } from "../errors.js";
@@ -68,15 +69,31 @@ class Scheduler {
68
69
  });
69
70
  this.logger.info(payload, `[CedarJS Jobs] Scheduling ${job.name}`);
70
71
  try {
71
- await this.adapter.schedule(payload);
72
- return true;
72
+ return await this.adapter.schedule(payload);
73
73
  } catch (e) {
74
+ const error = e instanceof Error ? e : new Error(String(e));
74
75
  throw new SchedulingError(
75
76
  `[CedarJS Jobs] Exception when scheduling ${payload.name}`,
76
- e
77
+ error
77
78
  );
78
79
  }
79
80
  }
81
+ /**
82
+ * Cancel a scheduled job so that it will not be run (if it's still queued)
83
+ * or not be retried (if it's currently running). Requires an adapter that
84
+ * implements the optional `cancel()` method, like the `PrismaAdapter`.
85
+ *
86
+ * Returns whatever the adapter's `cancel()` returns (for the
87
+ * `PrismaAdapter` that's `true` if a job was cancelled and `false` if no
88
+ * cancellable job with the given id was found)
89
+ */
90
+ async cancel(jobId) {
91
+ if (!this.adapter.cancel) {
92
+ throw new CancelNotImplementedError();
93
+ }
94
+ this.logger.info(`[CedarJS Jobs] Cancelling job ${jobId}`);
95
+ return await this.adapter.cancel({ jobId });
96
+ }
80
97
  }
81
98
  export {
82
99
  Scheduler
@@ -1 +1 @@
1
- {"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../../src/core/Worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AAUzE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAInE,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IAGxD,OAAO,EAAE,WAAW,CAAA;IACpB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAA;IAIhB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,KAAK,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;AAc9C,qBAAa,MAAM;;IACjB,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAC/B,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC3C,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC3C,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,oBAAoB,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAA;IAC7D,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAA;IACrD,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,aAAa,EAAE,IAAI,CAAA;gBAEP,OAAO,EAAE,aAAa;IA2ElC,GAAG;IAQH,IAAI,UAAU,WAMb;CAqDF"}
1
+ {"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../../src/core/Worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AAUzE,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAInE,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IAGxD,OAAO,EAAE,WAAW,CAAA;IACpB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAA;IAIhB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,KAAK,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA;AAc9C,qBAAa,MAAM;;IACjB,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAC/B,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC3C,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IACjC,WAAW,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC3C,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,oBAAoB,EAAE,eAAe,CAAC,sBAAsB,CAAC,CAAA;IAC7D,gBAAgB,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAA;IACrD,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACnC,aAAa,EAAE,IAAI,CAAA;gBAEP,OAAO,EAAE,aAAa;IA2ElC,GAAG;IAQH,IAAI,UAAU,WAMb;CAmDF"}
@@ -103,6 +103,7 @@ class Worker {
103
103
  logger: this.logger,
104
104
  job,
105
105
  maxAttempts: this.maxAttempts,
106
+ maxRuntime: this.maxRuntime,
106
107
  deleteSuccessfulJobs: this.deleteSuccessfulJobs,
107
108
  deleteFailedJobs: this.deleteFailedJobs
108
109
  }).perform();
@@ -0,0 +1,33 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import type { BaseJob } from '../types.js';
3
+ export interface JobExecutionContext {
4
+ /**
5
+ * Aborted when the job exceeds the worker's `maxRuntime` (or when the
6
+ * executor otherwise wants the job to stop). Pass this to `fetch()`, child
7
+ * processes, or check `signal.aborted` in long-running loops so the job can
8
+ * actually stop doing work when it times out — Node.js promises themselves
9
+ * cannot be forcefully killed.
10
+ */
11
+ signal: AbortSignal;
12
+ /** The job that is currently being executed */
13
+ job: BaseJob;
14
+ }
15
+ export declare const executionContext: AsyncLocalStorage<JobExecutionContext>;
16
+ /**
17
+ * Returns the execution context for the currently running job, or `undefined`
18
+ * when called outside of a job's `perform()` function.
19
+ *
20
+ * ```ts
21
+ * import { getJobExecutionContext } from '@cedarjs/jobs'
22
+ *
23
+ * export const SampleJob = jobs.createJob({
24
+ * queue: 'default',
25
+ * perform: async () => {
26
+ * const context = getJobExecutionContext()
27
+ * await fetch('https://example.com', { signal: context?.signal })
28
+ * },
29
+ * })
30
+ * ```
31
+ */
32
+ export declare function getJobExecutionContext(): JobExecutionContext | undefined;
33
+ //# sourceMappingURL=executionContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionContext.d.ts","sourceRoot":"","sources":["../../src/core/executionContext.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,MAAM,EAAE,WAAW,CAAA;IAEnB,+CAA+C;IAC/C,GAAG,EAAE,OAAO,CAAA;CACb;AAED,eAAO,MAAM,gBAAgB,wCAA+C,CAAA;AAE5E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,GAAG,SAAS,CAExE"}
@@ -0,0 +1,9 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const executionContext = new AsyncLocalStorage();
3
+ function getJobExecutionContext() {
4
+ return executionContext.getStore();
5
+ }
6
+ export {
7
+ executionContext,
8
+ getJobExecutionContext
9
+ };
package/dist/errors.d.ts CHANGED
@@ -95,6 +95,20 @@ export declare class SchedulingError extends RethrownJobError {
95
95
  export declare class PerformError extends RethrownJobError {
96
96
  constructor(message: string, error: Error);
97
97
  }
98
+ /**
99
+ * Thrown (and recorded as the job's error) when a job runs longer than the
100
+ * worker's `maxRuntime`
101
+ */
102
+ export declare class JobTimeoutError extends CedarJSJobsError {
103
+ constructor(jobIdentifier: string, maxRuntime: number);
104
+ }
105
+ /**
106
+ * Thrown when trying to cancel a job through an adapter that does not
107
+ * implement the optional `cancel()` method
108
+ */
109
+ export declare class CancelNotImplementedError extends CedarJSJobsError {
110
+ constructor();
111
+ }
98
112
  export declare class QueueNotDefinedError extends CedarJSJobsError {
99
113
  constructor();
100
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;;CAI9D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;;CAIzD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,gBAAgB;;CAIxD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;;CAIrD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;gBACxC,IAAI,EAAE,MAAM;CAGzB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC9C,IAAI,EAAE,MAAM;CAGzB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;;CASzD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,IAAI,EAAE,MAAM;CAKzB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,IAAI,EAAE,MAAM;CAKzB;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;gBACjD,IAAI,EAAE,MAAM;CAGzB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,aAAa,EAAE,KAAK,CAAA;IACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;gBAE1B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAqB1C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;gBACvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAG1C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;gBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAG1C;AAED,qBAAa,oBAAqB,SAAQ,gBAAgB;;CAIzD;AAED,qBAAa,8BAA+B,SAAQ,gBAAgB;gBACtD,KAAK,EAAE,MAAM;CAG1B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;;CAI9D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;;CAIzD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,gBAAgB;;CAIxD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;;CAIrD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;gBACxC,IAAI,EAAE,MAAM;CAGzB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC9C,IAAI,EAAE,MAAM;CAGzB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;;CASzD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,IAAI,EAAE,MAAM;CAKzB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,IAAI,EAAE,MAAM;CAKzB;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;gBACjD,IAAI,EAAE,MAAM;CAGzB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,aAAa,EAAE,KAAK,CAAA;IACpB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;gBAE1B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAqB1C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;gBACvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAG1C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;gBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAG1C;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;gBACvC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAMtD;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;;CAI9D;AAED,qBAAa,oBAAqB,SAAQ,gBAAgB;;CAIzD;AAED,qBAAa,8BAA+B,SAAQ,gBAAgB;gBACtD,KAAK,EAAE,MAAM;CAG1B"}
package/dist/errors.js CHANGED
@@ -87,6 +87,18 @@ class PerformError extends RethrownJobError {
87
87
  super(message, error);
88
88
  }
89
89
  }
90
+ class JobTimeoutError extends CedarJSJobsError {
91
+ constructor(jobIdentifier, maxRuntime) {
92
+ super(
93
+ `Job ${jobIdentifier} exceeded max runtime of ${maxRuntime} seconds and was marked as failed`
94
+ );
95
+ }
96
+ }
97
+ class CancelNotImplementedError extends CedarJSJobsError {
98
+ constructor() {
99
+ super("The configured adapter does not support cancelling jobs");
100
+ }
101
+ }
90
102
  class QueueNotDefinedError extends CedarJSJobsError {
91
103
  constructor() {
92
104
  super("Scheduler requires a named `queue` to place jobs in");
@@ -101,10 +113,12 @@ export {
101
113
  AdapterNotConfiguredError,
102
114
  AdapterNotFoundError,
103
115
  AdapterRequiredError,
116
+ CancelNotImplementedError,
104
117
  CedarJSJobsError,
105
118
  JobExportNotFoundError,
106
119
  JobNotFoundError,
107
120
  JobRequiredError,
121
+ JobTimeoutError,
108
122
  JobsLibNotFoundError,
109
123
  LoggerNotFoundError,
110
124
  PerformError,
package/dist/index.d.ts CHANGED
@@ -2,7 +2,11 @@ export * from './errors.js';
2
2
  export { JobManager } from './core/JobManager.js';
3
3
  export { Executor } from './core/Executor.js';
4
4
  export { Worker } from './core/Worker.js';
5
+ export { getJobExecutionContext } from './core/executionContext.js';
6
+ export type { JobExecutionContext } from './core/executionContext.js';
5
7
  export { BaseAdapter } from './adapters/BaseAdapter/BaseAdapter.js';
6
8
  export { PrismaAdapter } from './adapters/PrismaAdapter/PrismaAdapter.js';
9
+ export { loadJobsManager, setJobLoaderOverrides } from './loaders.js';
10
+ export type { JobLoaderOverrides } from './loaders.js';
7
11
  export type * from './types.js';
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AAEzE,mBAAmB,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AAEzE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACrE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD,mBAAmB,YAAY,CAAA"}
package/dist/index.js CHANGED
@@ -2,12 +2,17 @@ export * from "./errors.js";
2
2
  import { JobManager } from "./core/JobManager.js";
3
3
  import { Executor } from "./core/Executor.js";
4
4
  import { Worker } from "./core/Worker.js";
5
+ import { getJobExecutionContext } from "./core/executionContext.js";
5
6
  import { BaseAdapter } from "./adapters/BaseAdapter/BaseAdapter.js";
6
7
  import { PrismaAdapter } from "./adapters/PrismaAdapter/PrismaAdapter.js";
8
+ import { loadJobsManager, setJobLoaderOverrides } from "./loaders.js";
7
9
  export {
8
10
  BaseAdapter,
9
11
  Executor,
10
12
  JobManager,
11
13
  PrismaAdapter,
12
- Worker
14
+ Worker,
15
+ getJobExecutionContext,
16
+ loadJobsManager,
17
+ setJobLoaderOverrides
13
18
  };
package/dist/loaders.d.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  import type { JobManager } from './core/JobManager.js';
2
2
  import type { Adapters, BasicLogger, Job, JobComputedProperties, QueueNames } from './types.js';
3
+ export interface JobLoaderOverrides {
4
+ loadJobsManager: () => Promise<JobManager<Adapters, QueueNames, BasicLogger>>;
5
+ loadJob: (computedProperties: JobComputedProperties) => Promise<Job<QueueNames, unknown[]>>;
6
+ }
7
+ export declare const setJobLoaderOverrides: (newOverrides: JobLoaderOverrides | undefined) => void;
3
8
  /**
4
9
  * Loads the job manager from the users project
5
10
  *
@@ -9,5 +14,5 @@ export declare const loadJobsManager: () => Promise<JobManager<Adapters, QueueNa
9
14
  /**
10
15
  * Load a specific job implementation from the users project
11
16
  */
12
- export declare const loadJob: ({ name: jobName, path: jobPath, }: JobComputedProperties) => Promise<Job<QueueNames, unknown[]>>;
17
+ export declare const loadJob: (computedProperties: JobComputedProperties) => Promise<Job<QueueNames, unknown[]>>;
13
18
  //# sourceMappingURL=loaders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,GAAG,EACH,qBAAqB,EACrB,UAAU,EACX,MAAM,YAAY,CAAA;AAGnB;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAC9C,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAgB9C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,GAAU,mCAG3B,qBAAqB,KAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAgB5D,CAAA"}
1
+ {"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,GAAG,EACH,qBAAqB,EACrB,UAAU,EACX,MAAM,YAAY,CAAA;AAGnB,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IAC7E,OAAO,EAAE,CACP,kBAAkB,EAAE,qBAAqB,KACtC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;CACzC;AASD,eAAO,MAAM,qBAAqB,GAChC,cAAc,kBAAkB,GAAG,SAAS,SAG7C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAC9C,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAoB9C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,GAClB,oBAAoB,qBAAqB,KACxC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAsBpC,CAAA"}
package/dist/loaders.js CHANGED
@@ -3,7 +3,14 @@ import path from "node:path";
3
3
  import { getPaths } from "@cedarjs/project-config";
4
4
  import { JobsLibNotFoundError, JobNotFoundError } from "./errors.js";
5
5
  import { makeFilePath } from "./util.js";
6
+ let overrides;
7
+ const setJobLoaderOverrides = (newOverrides) => {
8
+ overrides = newOverrides;
9
+ };
6
10
  const loadJobsManager = async () => {
11
+ if (overrides) {
12
+ return overrides.loadJobsManager();
13
+ }
7
14
  const jobsConfigPath = getPaths().api.distJobsConfig;
8
15
  if (!jobsConfigPath) {
9
16
  throw new JobsLibNotFoundError();
@@ -15,10 +22,11 @@ const loadJobsManager = async () => {
15
22
  }
16
23
  return jobs;
17
24
  };
18
- const loadJob = async ({
19
- name: jobName,
20
- path: jobPath
21
- }) => {
25
+ const loadJob = async (computedProperties) => {
26
+ if (overrides) {
27
+ return overrides.loadJob(computedProperties);
28
+ }
29
+ const { name: jobName, path: jobPath } = computedProperties;
22
30
  const completeJobPath = path.join(getPaths().api.distJobs, jobPath) + ".js";
23
31
  if (!fs.existsSync(completeJobPath)) {
24
32
  throw new JobNotFoundError(jobName);
@@ -32,5 +40,6 @@ const loadJob = async ({
32
40
  };
33
41
  export {
34
42
  loadJob,
35
- loadJobsManager
43
+ loadJobsManager,
44
+ setJobLoaderOverrides
36
45
  };
package/dist/types.d.ts CHANGED
@@ -54,8 +54,13 @@ export interface WorkerSharedOptions {
54
54
  */
55
55
  maxAttempts?: number;
56
56
  /**
57
- * The maximum amount of time in seconds that a job can run before another
58
- * worker will attempt to retry it.
57
+ * The maximum amount of time in seconds that a job is allowed to run. A job
58
+ * that runs longer than this is marked as failed (it will not be retried)
59
+ * and the `AbortSignal` available inside the job via
60
+ * `getJobExecutionContext()` is aborted. This is also how long a job's lock
61
+ * can be held before another worker considers the lock stale and is allowed
62
+ * to pick the job up again (which only happens if the locking worker
63
+ * crashed and could not clean up after itself).
59
64
  *
60
65
  * @default 14,400 (4 hours)
61
66
  */
@@ -112,12 +117,12 @@ export interface JobManagerConfig<TAdapters extends Adapters, TQueues extends Qu
112
117
  */
113
118
  workers: WorkerConfig<TAdapters, TQueues>[];
114
119
  }
115
- export interface CreateSchedulerConfig<TAdapters extends Adapters> {
120
+ export interface CreateSchedulerConfig<TAdapters extends Adapters, TAdapterName extends keyof TAdapters = keyof TAdapters> {
116
121
  /**
117
122
  * The name of the adapter to use for this scheduler. This must be one of the
118
123
  * keys in the `adapters` object when you created the `JobManager`.
119
124
  */
120
- adapter: keyof TAdapters;
125
+ adapter: TAdapterName;
121
126
  /**
122
127
  * The logger to use for this scheduler. If not provided, the logger from the
123
128
  * `JobManager` will be used.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,CAAA;AAE9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AAExE,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IACxD,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IACvD,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IACvD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;CACjC;AACD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,CAAA;AAEjD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAElD,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAEvD,MAAM,WAAW,YAAY,CAC3B,SAAS,SAAS,QAAQ,EAC1B,OAAO,SAAS,UAAU,CAC1B,SAAQ,mBAAmB;IAC3B;;;OAGG;IACH,OAAO,EAAE,MAAM,SAAS,CAAA;IAExB;;;;OAIG;IACH,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAA;IAEhD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB,CAC/B,SAAS,SAAS,QAAQ,EAC1B,OAAO,SAAS,UAAU,EAC1B,OAAO,SAAS,WAAW;IAE3B;;;;OAIG;IACH,QAAQ,EAAE,SAAS,CAAA;IAEnB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;IAEf;;;;;;;;OAQG;IACH,MAAM,EAAE,OAAO,CAAA;IAEf;;OAEG;IACH,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAA;CAC5C;AAED,MAAM,WAAW,qBAAqB,CACpC,SAAS,SAAS,QAAQ,EAC1B,YAAY,SAAS,MAAM,SAAS,GAAG,MAAM,SAAS;IAEtD;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAA;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,aAAa,CAC5B,OAAO,SAAS,UAAU,EAC1B,KAAK,SAAS,OAAO,EAAE,GAAG,EAAE;IAE5B;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAA;IAExB;;;;OAIG;IACH,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAClD;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,GAAG,CACb,OAAO,SAAS,UAAU,EAC1B,KAAK,SAAS,OAAO,EAAE,GAAG,EAAE,IAC1B,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,qBAAqB,CAAA;AAEzD,MAAM,MAAM,kBAAkB,GAC1B;IACE;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB,IAAI,CAAC,EAAE,KAAK,CAAA;CACb,GACD;IACE,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ;;;OAGG;IACH,SAAS,EAAE,IAAI,CAAA;IACf,IAAI,CAAC,EAAE,KAAK,CAAA;CACb,GACD;IACE,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAEL,KAAK,aAAa,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAErC;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,CAAC,IAC1D,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,GAClC,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,GACjD,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cedarjs/jobs",
3
- "version": "5.0.7-next.239",
3
+ "version": "5.0.7-next.310",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/cedarjs/cedar.git",
@@ -37,13 +37,13 @@
37
37
  "test:watch": "vitest"
38
38
  },
39
39
  "dependencies": {
40
- "@cedarjs/cli-helpers": "5.0.7-next.239",
41
- "@cedarjs/project-config": "5.0.7-next.239",
42
- "cron-parser": "5.6.2",
40
+ "@cedarjs/cli-helpers": "5.0.7-next.310",
41
+ "@cedarjs/project-config": "5.0.7-next.310",
42
+ "cron-parser": "5.10.0",
43
43
  "type-fest": "5.6.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@cedarjs/framework-tools": "5.0.7-next.239",
46
+ "@cedarjs/framework-tools": "5.0.7-next.310",
47
47
  "@prisma/client": "7.8.0",
48
48
  "concurrently": "9.2.4",
49
49
  "publint": "0.3.23",