agenda 5.0.0 → 6.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 (358) hide show
  1. package/LICENSE.md +4 -0
  2. package/README.md +222 -1063
  3. package/dist/Job.d.ts +190 -0
  4. package/dist/Job.js +568 -0
  5. package/dist/Job.js.map +1 -0
  6. package/dist/JobProcessingQueue.d.ts +47 -0
  7. package/dist/JobProcessingQueue.js +101 -0
  8. package/dist/JobProcessingQueue.js.map +1 -0
  9. package/dist/JobProcessor.d.ts +70 -0
  10. package/dist/JobProcessor.js +458 -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/decorators/Define.d.ts +33 -0
  16. package/dist/decorators/Define.js +44 -0
  17. package/dist/decorators/Define.js.map +1 -0
  18. package/dist/decorators/Every.d.ts +43 -0
  19. package/dist/decorators/Every.js +55 -0
  20. package/dist/decorators/Every.js.map +1 -0
  21. package/dist/decorators/JobsController.d.ts +43 -0
  22. package/dist/decorators/JobsController.js +37 -0
  23. package/dist/decorators/JobsController.js.map +1 -0
  24. package/dist/decorators/index.d.ts +41 -0
  25. package/dist/decorators/index.js +46 -0
  26. package/dist/decorators/index.js.map +1 -0
  27. package/dist/decorators/metadata.d.ts +50 -0
  28. package/dist/decorators/metadata.js +35 -0
  29. package/dist/decorators/metadata.js.map +1 -0
  30. package/dist/decorators/register.d.ts +52 -0
  31. package/dist/decorators/register.js +139 -0
  32. package/dist/decorators/register.js.map +1 -0
  33. package/dist/index.d.ts +359 -8
  34. package/dist/index.js +532 -20
  35. package/dist/index.js.map +1 -1
  36. package/dist/notifications/BaseNotificationChannel.d.ts +36 -0
  37. package/dist/notifications/BaseNotificationChannel.js +80 -0
  38. package/dist/notifications/BaseNotificationChannel.js.map +1 -0
  39. package/dist/notifications/InMemoryNotificationChannel.d.ts +12 -0
  40. package/dist/notifications/InMemoryNotificationChannel.js +26 -0
  41. package/dist/notifications/InMemoryNotificationChannel.js.map +1 -0
  42. package/dist/notifications/index.d.ts +2 -0
  43. package/dist/notifications/index.js +3 -0
  44. package/dist/notifications/index.js.map +1 -0
  45. package/dist/types/AgendaBackend.d.ts +53 -0
  46. package/dist/types/AgendaBackend.js +2 -0
  47. package/dist/types/AgendaBackend.js.map +1 -0
  48. package/dist/types/AgendaConfig.d.ts +9 -0
  49. package/dist/types/AgendaConfig.js +2 -0
  50. package/dist/types/AgendaConfig.js.map +1 -0
  51. package/dist/types/AgendaStatus.d.ts +32 -0
  52. package/dist/types/AgendaStatus.js +2 -0
  53. package/dist/types/AgendaStatus.js.map +1 -0
  54. package/dist/types/DbOptions.d.ts +4 -0
  55. package/dist/types/DbOptions.js +2 -0
  56. package/dist/types/DbOptions.js.map +1 -0
  57. package/dist/types/JobDefinition.d.ts +40 -0
  58. package/dist/types/JobDefinition.js +2 -0
  59. package/dist/types/JobDefinition.js.map +1 -0
  60. package/dist/types/JobParameters.d.ts +106 -0
  61. package/dist/types/JobParameters.js +17 -0
  62. package/dist/types/JobParameters.js.map +1 -0
  63. package/dist/types/JobQuery.d.ts +79 -0
  64. package/dist/types/JobQuery.js +33 -0
  65. package/dist/types/JobQuery.js.map +1 -0
  66. package/dist/types/JobRepository.d.ts +96 -0
  67. package/dist/types/JobRepository.js +2 -0
  68. package/dist/types/JobRepository.js.map +1 -0
  69. package/dist/types/NotificationChannel.d.ts +71 -0
  70. package/dist/types/NotificationChannel.js +2 -0
  71. package/dist/types/NotificationChannel.js.map +1 -0
  72. package/dist/utils/backoff.d.ts +152 -0
  73. package/dist/utils/backoff.js +167 -0
  74. package/dist/utils/backoff.js.map +1 -0
  75. package/dist/utils/dateConstraints.d.ts +48 -0
  76. package/dist/utils/dateConstraints.js +128 -0
  77. package/dist/utils/dateConstraints.js.map +1 -0
  78. package/dist/utils/isValidDate.d.ts +1 -0
  79. package/dist/utils/isValidDate.js +5 -0
  80. package/dist/utils/isValidDate.js.map +1 -0
  81. package/dist/utils/nextRunAt.d.ts +10 -0
  82. package/dist/utils/nextRunAt.js +110 -0
  83. package/dist/utils/nextRunAt.js.map +1 -0
  84. package/dist/utils/priority.d.ts +13 -0
  85. package/dist/utils/priority.js +20 -0
  86. package/dist/utils/priority.js.map +1 -0
  87. package/dist/utils/processEvery.d.ts +1 -0
  88. package/dist/utils/processEvery.js +7 -0
  89. package/dist/utils/processEvery.js.map +1 -0
  90. package/dist/utils/stack.d.ts +1 -0
  91. package/dist/utils/stack.js +18 -0
  92. package/dist/utils/stack.js.map +1 -0
  93. package/package.json +40 -76
  94. package/History.md +0 -617
  95. package/dist/agenda/cancel.d.ts +0 -11
  96. package/dist/agenda/cancel.d.ts.map +0 -1
  97. package/dist/agenda/cancel.js +0 -41
  98. package/dist/agenda/cancel.js.map +0 -1
  99. package/dist/agenda/close.d.ts +0 -17
  100. package/dist/agenda/close.d.ts.map +0 -1
  101. package/dist/agenda/close.js +0 -47
  102. package/dist/agenda/close.js.map +0 -1
  103. package/dist/agenda/create.d.ts +0 -11
  104. package/dist/agenda/create.d.ts.map +0 -1
  105. package/dist/agenda/create.js +0 -27
  106. package/dist/agenda/create.js.map +0 -1
  107. package/dist/agenda/database.d.ts +0 -20
  108. package/dist/agenda/database.d.ts.map +0 -1
  109. package/dist/agenda/database.js +0 -56
  110. package/dist/agenda/database.js.map +0 -1
  111. package/dist/agenda/db-init.d.ts +0 -11
  112. package/dist/agenda/db-init.d.ts.map +0 -1
  113. package/dist/agenda/db-init.js +0 -40
  114. package/dist/agenda/db-init.js.map +0 -1
  115. package/dist/agenda/default-concurrency.d.ts +0 -9
  116. package/dist/agenda/default-concurrency.d.ts.map +0 -1
  117. package/dist/agenda/default-concurrency.js +0 -21
  118. package/dist/agenda/default-concurrency.js.map +0 -1
  119. package/dist/agenda/default-lock-lifetime.d.ts +0 -10
  120. package/dist/agenda/default-lock-lifetime.d.ts.map +0 -1
  121. package/dist/agenda/default-lock-lifetime.js +0 -22
  122. package/dist/agenda/default-lock-lifetime.js.map +0 -1
  123. package/dist/agenda/default-lock-limit.d.ts +0 -10
  124. package/dist/agenda/default-lock-limit.d.ts.map +0 -1
  125. package/dist/agenda/default-lock-limit.js +0 -22
  126. package/dist/agenda/default-lock-limit.js.map +0 -1
  127. package/dist/agenda/define.d.ts +0 -45
  128. package/dist/agenda/define.d.ts.map +0 -1
  129. package/dist/agenda/define.js +0 -44
  130. package/dist/agenda/define.js.map +0 -1
  131. package/dist/agenda/disable.d.ts +0 -11
  132. package/dist/agenda/disable.d.ts.map +0 -1
  133. package/dist/agenda/disable.js +0 -42
  134. package/dist/agenda/disable.js.map +0 -1
  135. package/dist/agenda/drain.d.ts +0 -9
  136. package/dist/agenda/drain.d.ts.map +0 -1
  137. package/dist/agenda/drain.js +0 -46
  138. package/dist/agenda/drain.js.map +0 -1
  139. package/dist/agenda/enable.d.ts +0 -12
  140. package/dist/agenda/enable.d.ts.map +0 -1
  141. package/dist/agenda/enable.js +0 -43
  142. package/dist/agenda/enable.js.map +0 -1
  143. package/dist/agenda/every.d.ts +0 -15
  144. package/dist/agenda/every.d.ts.map +0 -1
  145. package/dist/agenda/every.js +0 -77
  146. package/dist/agenda/every.js.map +0 -1
  147. package/dist/agenda/find-and-lock-next-job.d.ts +0 -13
  148. package/dist/agenda/find-and-lock-next-job.d.ts.map +0 -1
  149. package/dist/agenda/find-and-lock-next-job.js +0 -75
  150. package/dist/agenda/find-and-lock-next-job.js.map +0 -1
  151. package/dist/agenda/has-mongo-protocol.d.ts +0 -7
  152. package/dist/agenda/has-mongo-protocol.d.ts.map +0 -1
  153. package/dist/agenda/has-mongo-protocol.js +0 -13
  154. package/dist/agenda/has-mongo-protocol.js.map +0 -1
  155. package/dist/agenda/index.d.ts +0 -130
  156. package/dist/agenda/index.d.ts.map +0 -1
  157. package/dist/agenda/index.js +0 -128
  158. package/dist/agenda/index.js.map +0 -1
  159. package/dist/agenda/job-processing-queue.d.ts +0 -18
  160. package/dist/agenda/job-processing-queue.d.ts.map +0 -1
  161. package/dist/agenda/job-processing-queue.js +0 -76
  162. package/dist/agenda/job-processing-queue.js.map +0 -1
  163. package/dist/agenda/jobs.d.ts +0 -15
  164. package/dist/agenda/jobs.d.ts.map +0 -1
  165. package/dist/agenda/jobs.js +0 -36
  166. package/dist/agenda/jobs.js.map +0 -1
  167. package/dist/agenda/lock-limit.d.ts +0 -9
  168. package/dist/agenda/lock-limit.d.ts.map +0 -1
  169. package/dist/agenda/lock-limit.js +0 -22
  170. package/dist/agenda/lock-limit.js.map +0 -1
  171. package/dist/agenda/max-concurrency.d.ts +0 -10
  172. package/dist/agenda/max-concurrency.d.ts.map +0 -1
  173. package/dist/agenda/max-concurrency.js +0 -22
  174. package/dist/agenda/max-concurrency.js.map +0 -1
  175. package/dist/agenda/mongo.d.ts +0 -12
  176. package/dist/agenda/mongo.d.ts.map +0 -1
  177. package/dist/agenda/mongo.js +0 -18
  178. package/dist/agenda/mongo.js.map +0 -1
  179. package/dist/agenda/name.d.ts +0 -9
  180. package/dist/agenda/name.d.ts.map +0 -1
  181. package/dist/agenda/name.js +0 -21
  182. package/dist/agenda/name.js.map +0 -1
  183. package/dist/agenda/now.d.ts +0 -11
  184. package/dist/agenda/now.d.ts.map +0 -1
  185. package/dist/agenda/now.js +0 -41
  186. package/dist/agenda/now.js.map +0 -1
  187. package/dist/agenda/process-every.d.ts +0 -9
  188. package/dist/agenda/process-every.d.ts.map +0 -1
  189. package/dist/agenda/process-every.js +0 -23
  190. package/dist/agenda/process-every.js.map +0 -1
  191. package/dist/agenda/purge.d.ts +0 -9
  192. package/dist/agenda/purge.d.ts.map +0 -1
  193. package/dist/agenda/purge.js +0 -33
  194. package/dist/agenda/purge.js.map +0 -1
  195. package/dist/agenda/save-job.d.ts +0 -11
  196. package/dist/agenda/save-job.d.ts.map +0 -1
  197. package/dist/agenda/save-job.js +0 -156
  198. package/dist/agenda/save-job.js.map +0 -1
  199. package/dist/agenda/schedule.d.ts +0 -14
  200. package/dist/agenda/schedule.d.ts.map +0 -1
  201. package/dist/agenda/schedule.js +0 -62
  202. package/dist/agenda/schedule.js.map +0 -1
  203. package/dist/agenda/sort.d.ts +0 -10
  204. package/dist/agenda/sort.d.ts.map +0 -1
  205. package/dist/agenda/sort.js +0 -22
  206. package/dist/agenda/sort.js.map +0 -1
  207. package/dist/agenda/start.d.ts +0 -10
  208. package/dist/agenda/start.d.ts.map +0 -1
  209. package/dist/agenda/start.js +0 -39
  210. package/dist/agenda/start.js.map +0 -1
  211. package/dist/agenda/stop.d.ts +0 -9
  212. package/dist/agenda/stop.d.ts.map +0 -1
  213. package/dist/agenda/stop.js +0 -57
  214. package/dist/agenda/stop.js.map +0 -1
  215. package/dist/cjs.d.ts +0 -2
  216. package/dist/cjs.d.ts.map +0 -1
  217. package/dist/cjs.js +0 -7
  218. package/dist/cjs.js.map +0 -1
  219. package/dist/index.d.ts.map +0 -1
  220. package/dist/job/compute-next-run-at.d.ts +0 -8
  221. package/dist/job/compute-next-run-at.d.ts.map +0 -1
  222. package/dist/job/compute-next-run-at.js +0 -162
  223. package/dist/job/compute-next-run-at.js.map +0 -1
  224. package/dist/job/disable.d.ts +0 -8
  225. package/dist/job/disable.d.ts.map +0 -1
  226. package/dist/job/disable.js +0 -14
  227. package/dist/job/disable.js.map +0 -1
  228. package/dist/job/enable.d.ts +0 -8
  229. package/dist/job/enable.d.ts.map +0 -1
  230. package/dist/job/enable.js +0 -14
  231. package/dist/job/enable.js.map +0 -1
  232. package/dist/job/fail.d.ts +0 -9
  233. package/dist/job/fail.d.ts.map +0 -1
  234. package/dist/job/fail.js +0 -28
  235. package/dist/job/fail.js.map +0 -1
  236. package/dist/job/index.d.ts +0 -142
  237. package/dist/job/index.d.ts.map +0 -1
  238. package/dist/job/index.js +0 -82
  239. package/dist/job/index.js.map +0 -1
  240. package/dist/job/is-running.d.ts +0 -12
  241. package/dist/job/is-running.d.ts.map +0 -1
  242. package/dist/job/is-running.js +0 -27
  243. package/dist/job/is-running.js.map +0 -1
  244. package/dist/job/priority.d.ts +0 -7
  245. package/dist/job/priority.d.ts.map +0 -1
  246. package/dist/job/priority.js +0 -14
  247. package/dist/job/priority.js.map +0 -1
  248. package/dist/job/remove.d.ts +0 -8
  249. package/dist/job/remove.d.ts.map +0 -1
  250. package/dist/job/remove.js +0 -24
  251. package/dist/job/remove.js.map +0 -1
  252. package/dist/job/repeat-at.d.ts +0 -9
  253. package/dist/job/repeat-at.d.ts.map +0 -1
  254. package/dist/job/repeat-at.js +0 -15
  255. package/dist/job/repeat-at.js.map +0 -1
  256. package/dist/job/repeat-every.d.ts +0 -17
  257. package/dist/job/repeat-every.d.ts.map +0 -1
  258. package/dist/job/repeat-every.js +0 -32
  259. package/dist/job/repeat-every.js.map +0 -1
  260. package/dist/job/run.d.ts +0 -8
  261. package/dist/job/run.d.ts.map +0 -1
  262. package/dist/job/run.js +0 -99
  263. package/dist/job/run.js.map +0 -1
  264. package/dist/job/save.d.ts +0 -9
  265. package/dist/job/save.d.ts.map +0 -1
  266. package/dist/job/save.js +0 -25
  267. package/dist/job/save.js.map +0 -1
  268. package/dist/job/schedule.d.ts +0 -9
  269. package/dist/job/schedule.d.ts.map +0 -1
  270. package/dist/job/schedule.js +0 -21
  271. package/dist/job/schedule.js.map +0 -1
  272. package/dist/job/set-shouldsaveresult.d.ts +0 -7
  273. package/dist/job/set-shouldsaveresult.d.ts.map +0 -1
  274. package/dist/job/set-shouldsaveresult.js +0 -13
  275. package/dist/job/set-shouldsaveresult.js.map +0 -1
  276. package/dist/job/to-json.d.ts +0 -9
  277. package/dist/job/to-json.d.ts.map +0 -1
  278. package/dist/job/to-json.js +0 -36
  279. package/dist/job/to-json.js.map +0 -1
  280. package/dist/job/touch.d.ts +0 -8
  281. package/dist/job/touch.d.ts.map +0 -1
  282. package/dist/job/touch.js +0 -25
  283. package/dist/job/touch.js.map +0 -1
  284. package/dist/job/unique.d.ts +0 -12
  285. package/dist/job/unique.d.ts.map +0 -1
  286. package/dist/job/unique.js +0 -17
  287. package/dist/job/unique.js.map +0 -1
  288. package/dist/utils/create-job.d.ts +0 -10
  289. package/dist/utils/create-job.d.ts.map +0 -1
  290. package/dist/utils/create-job.js +0 -16
  291. package/dist/utils/create-job.js.map +0 -1
  292. package/dist/utils/index.d.ts +0 -4
  293. package/dist/utils/index.d.ts.map +0 -1
  294. package/dist/utils/index.js +0 -16
  295. package/dist/utils/index.js.map +0 -1
  296. package/dist/utils/parse-priority.d.ts +0 -6
  297. package/dist/utils/parse-priority.d.ts.map +0 -1
  298. package/dist/utils/parse-priority.js +0 -35
  299. package/dist/utils/parse-priority.js.map +0 -1
  300. package/dist/utils/process-jobs.d.ts +0 -8
  301. package/dist/utils/process-jobs.d.ts.map +0 -1
  302. package/dist/utils/process-jobs.js +0 -308
  303. package/dist/utils/process-jobs.js.map +0 -1
  304. package/es.js +0 -1
  305. package/lib/agenda/cancel.ts +0 -28
  306. package/lib/agenda/close.ts +0 -37
  307. package/lib/agenda/create.ts +0 -22
  308. package/lib/agenda/database.ts +0 -63
  309. package/lib/agenda/db-init.ts +0 -45
  310. package/lib/agenda/default-concurrency.ts +0 -19
  311. package/lib/agenda/default-lock-lifetime.ts +0 -17
  312. package/lib/agenda/default-lock-limit.ts +0 -17
  313. package/lib/agenda/define.ts +0 -85
  314. package/lib/agenda/disable.ts +0 -28
  315. package/lib/agenda/drain.ts +0 -30
  316. package/lib/agenda/enable.ts +0 -29
  317. package/lib/agenda/every.ts +0 -86
  318. package/lib/agenda/find-and-lock-next-job.ts +0 -78
  319. package/lib/agenda/has-mongo-protocol.ts +0 -8
  320. package/lib/agenda/index.ts +0 -227
  321. package/lib/agenda/job-processing-queue.ts +0 -99
  322. package/lib/agenda/jobs.ts +0 -31
  323. package/lib/agenda/lock-limit.ts +0 -17
  324. package/lib/agenda/max-concurrency.ts +0 -20
  325. package/lib/agenda/mongo.ts +0 -21
  326. package/lib/agenda/name.ts +0 -16
  327. package/lib/agenda/now.ts +0 -31
  328. package/lib/agenda/process-every.ts +0 -18
  329. package/lib/agenda/purge.ts +0 -19
  330. package/lib/agenda/save-job.ts +0 -185
  331. package/lib/agenda/schedule.ts +0 -79
  332. package/lib/agenda/sort.ts +0 -17
  333. package/lib/agenda/start.ts +0 -30
  334. package/lib/agenda/stop.ts +0 -49
  335. package/lib/cjs.ts +0 -5
  336. package/lib/index.ts +0 -11
  337. package/lib/job/compute-next-run-at.ts +0 -191
  338. package/lib/job/disable.ts +0 -11
  339. package/lib/job/enable.ts +0 -11
  340. package/lib/job/fail.ts +0 -29
  341. package/lib/job/index.ts +0 -221
  342. package/lib/job/is-running.ts +0 -29
  343. package/lib/job/priority.ts +0 -11
  344. package/lib/job/remove.ts +0 -10
  345. package/lib/job/repeat-at.ts +0 -12
  346. package/lib/job/repeat-every.ts +0 -40
  347. package/lib/job/run.ts +0 -125
  348. package/lib/job/save.ts +0 -11
  349. package/lib/job/schedule.ts +0 -15
  350. package/lib/job/set-shouldsaveresult.ts +0 -10
  351. package/lib/job/to-json.ts +0 -36
  352. package/lib/job/touch.ts +0 -11
  353. package/lib/job/unique.ts +0 -18
  354. package/lib/utils/create-job.ts +0 -13
  355. package/lib/utils/index.ts +0 -3
  356. package/lib/utils/parse-priority.ts +0 -37
  357. package/lib/utils/process-jobs.ts +0 -379
  358. package/tsconfig.json +0 -72
package/dist/Job.js ADDED
@@ -0,0 +1,568 @@
1
+ import date from 'date.js';
2
+ import debug from 'debug';
3
+ import { fork } from 'child_process';
4
+ import { datefields } from './types/JobParameters.js';
5
+ import { parsePriority } from './utils/priority.js';
6
+ import { computeFromInterval, computeFromRepeatAt } from './utils/nextRunAt.js';
7
+ import { applyAllDateConstraints } from './utils/dateConstraints.js';
8
+ const log = debug('agenda:job');
9
+ /**
10
+ * @class
11
+ */
12
+ export class Job {
13
+ agenda;
14
+ byJobProcessor;
15
+ attrs;
16
+ /** this flag is set to true, if a job got canceled (e.g. due to a timeout or other exception),
17
+ * you can use it for long running tasks to periodically check if canceled is true,
18
+ * also touch will check if and throws that the job got canceled
19
+ */
20
+ canceled;
21
+ getCanceledMessage() {
22
+ return typeof this.canceled === 'object'
23
+ ? this.canceled?.message || this.canceled
24
+ : this.canceled;
25
+ }
26
+ forkedChild;
27
+ cancel(error) {
28
+ this.canceled = error || true;
29
+ if (this.forkedChild) {
30
+ try {
31
+ this.forkedChild.send('cancel');
32
+ log('canceled child', this.attrs.name, this.attrs._id);
33
+ }
34
+ catch {
35
+ log('cannot send cancel to child');
36
+ }
37
+ }
38
+ }
39
+ /** internal variable to ensure a job does not set unlimited numbers of setTimeouts if the job is not processed
40
+ * immediately */
41
+ gotTimerToExecute;
42
+ constructor(agenda, args, byJobProcessor = false) {
43
+ this.agenda = agenda;
44
+ this.byJobProcessor = byJobProcessor;
45
+ this.attrs = {
46
+ ...args,
47
+ // Set defaults if undefined
48
+ nextRunAt: args.nextRunAt === undefined ? new Date() : args.nextRunAt,
49
+ priority: parsePriority(args.priority),
50
+ type: args.type
51
+ };
52
+ }
53
+ /**
54
+ * Fields managed by the job processor that should not be saved by user code.
55
+ * These are excluded in save() to prevent race conditions between user code and the processor.
56
+ */
57
+ static PROCESSOR_MANAGED_FIELDS = new Set([
58
+ 'lockedAt',
59
+ 'lastRunAt',
60
+ 'lastFinishedAt',
61
+ 'failedAt',
62
+ 'failCount',
63
+ 'failReason',
64
+ 'progress'
65
+ ]);
66
+ /**
67
+ * Given a job, turn it into an JobParameters object
68
+ * @param excludeProcessorFields - If true, excludes fields managed by the job processor
69
+ */
70
+ toJson(excludeProcessorFields = false) {
71
+ const result = {};
72
+ const attrs = this.attrs;
73
+ for (const key of Object.keys(attrs)) {
74
+ if (Object.hasOwnProperty.call(attrs, key)) {
75
+ // Skip processor-managed fields if requested
76
+ if (excludeProcessorFields && Job.PROCESSOR_MANAGED_FIELDS.has(key)) {
77
+ continue;
78
+ }
79
+ result[key] =
80
+ datefields.includes(key) && attrs[key]
81
+ ? new Date(attrs[key])
82
+ : attrs[key];
83
+ }
84
+ }
85
+ return result;
86
+ }
87
+ /**
88
+ * Sets a job to repeat every X amount of time
89
+ * @param interval
90
+ * @param options
91
+ */
92
+ repeatEvery(interval, options = {}) {
93
+ this.attrs.repeatInterval = interval;
94
+ this.attrs.repeatTimezone = options.timezone;
95
+ if (options.skipImmediate) {
96
+ // Set the lastRunAt time to the nextRunAt so that the new nextRunAt will be computed in reference to the current value.
97
+ this.attrs.lastRunAt = this.attrs.nextRunAt || new Date();
98
+ this.computeNextRunAt();
99
+ this.attrs.lastRunAt = undefined;
100
+ }
101
+ else {
102
+ this.computeNextRunAt();
103
+ }
104
+ return this;
105
+ }
106
+ /**
107
+ * Sets a job to repeat at a specific time
108
+ * @param time
109
+ */
110
+ repeatAt(time) {
111
+ this.attrs.repeatAt = time;
112
+ return this;
113
+ }
114
+ /**
115
+ * Sets the start date for the job.
116
+ * The job will not run before this date.
117
+ * @param date - The start date (Date object or string parseable by Date constructor)
118
+ */
119
+ startDate(dateInput) {
120
+ const d = new Date(dateInput);
121
+ if (Number.isNaN(d.getTime())) {
122
+ throw new Error(`Invalid start date: ${dateInput}`);
123
+ }
124
+ this.attrs.startDate = d;
125
+ return this;
126
+ }
127
+ /**
128
+ * Sets the end date for the job.
129
+ * The job will not run after this date (nextRunAt will be set to null).
130
+ * @param date - The end date (Date object or string parseable by Date constructor)
131
+ */
132
+ endDate(dateInput) {
133
+ const d = new Date(dateInput);
134
+ if (Number.isNaN(d.getTime())) {
135
+ throw new Error(`Invalid end date: ${dateInput}`);
136
+ }
137
+ this.attrs.endDate = d;
138
+ return this;
139
+ }
140
+ /**
141
+ * Sets the days of the week to skip.
142
+ * The job will not run on these days.
143
+ * @param days - Array of days to skip (0 = Sunday, 1 = Monday, ..., 6 = Saturday)
144
+ */
145
+ skipDays(days) {
146
+ // Validate days
147
+ for (const day of days) {
148
+ if (day < 0 || day > 6 || !Number.isInteger(day)) {
149
+ throw new Error(`Invalid skip day: ${day}. Must be an integer 0-6 (0=Sunday, 6=Saturday)`);
150
+ }
151
+ }
152
+ this.attrs.skipDays = [...new Set(days)]; // Remove duplicates
153
+ return this;
154
+ }
155
+ /**
156
+ * if set, a job is forked via node child process and runs in a seperate/own
157
+ * thread
158
+ * @param enableForkMode
159
+ */
160
+ forkMode(enableForkMode) {
161
+ this.attrs.fork = enableForkMode;
162
+ return this;
163
+ }
164
+ /**
165
+ * Prevents the job from running
166
+ */
167
+ disable() {
168
+ this.attrs.disabled = true;
169
+ return this;
170
+ }
171
+ /**
172
+ * Allows job to run
173
+ */
174
+ enable() {
175
+ this.attrs.disabled = false;
176
+ return this;
177
+ }
178
+ /**
179
+ * Data to ensure is unique for job to be created
180
+ * @param unique
181
+ * @param opts
182
+ */
183
+ unique(unique, opts) {
184
+ this.attrs.unique = unique;
185
+ this.attrs.uniqueOpts = opts;
186
+ return this;
187
+ }
188
+ /**
189
+ * Configure debounce behavior for this job.
190
+ * Debouncing delays job execution and resets the timer on subsequent saves,
191
+ * ensuring the job only runs once after a quiet period.
192
+ *
193
+ * IMPORTANT: Requires a unique constraint to be set via `.unique()`.
194
+ * The unique constraint identifies which jobs should be debounced together.
195
+ *
196
+ * @param delay - Debounce window in milliseconds
197
+ * @param options - Optional configuration (maxWait, strategy)
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * // Basic trailing debounce - execute 2s after last save
202
+ * await agenda.create('updateIndex', { entityId: 123 })
203
+ * .unique({ 'data.entityId': 123 })
204
+ * .debounce(2000)
205
+ * .save();
206
+ *
207
+ * // With maxWait - guarantee execution within 30s
208
+ * await agenda.create('syncUser', { userId: 456 })
209
+ * .unique({ 'data.userId': 456 })
210
+ * .debounce(5000, { maxWait: 30000 })
211
+ * .save();
212
+ *
213
+ * // Leading strategy - execute immediately, ignore subsequent calls
214
+ * await agenda.create('notify', { channel: '#alerts' })
215
+ * .unique({ 'data.channel': '#alerts' })
216
+ * .debounce(60000, { strategy: 'leading' })
217
+ * .save();
218
+ * ```
219
+ */
220
+ debounce(delay, options) {
221
+ const debounceOpts = {
222
+ delay,
223
+ maxWait: options?.maxWait,
224
+ strategy: options?.strategy ?? 'trailing'
225
+ };
226
+ this.attrs.uniqueOpts = {
227
+ ...this.attrs.uniqueOpts,
228
+ debounce: debounceOpts
229
+ };
230
+ return this;
231
+ }
232
+ /**
233
+ * Schedules a job to run at specified time.
234
+ * Date constraints (startDate, endDate, skipDays) are applied if set.
235
+ * @param time
236
+ */
237
+ schedule(time) {
238
+ const d = new Date(time);
239
+ let nextRunAt = Number.isNaN(d.getTime()) ? date(time) : d;
240
+ // Apply date constraints if any are set
241
+ if (this.attrs.startDate || this.attrs.endDate || this.attrs.skipDays) {
242
+ nextRunAt = applyAllDateConstraints(nextRunAt, {
243
+ startDate: this.attrs.startDate,
244
+ endDate: this.attrs.endDate,
245
+ skipDays: this.attrs.skipDays,
246
+ timezone: this.attrs.repeatTimezone
247
+ });
248
+ }
249
+ this.attrs.nextRunAt = nextRunAt;
250
+ return this;
251
+ }
252
+ /**
253
+ * Sets priority of the job
254
+ * @param priority priority of when job should be queued
255
+ */
256
+ priority(priority) {
257
+ this.attrs.priority = parsePriority(priority);
258
+ return this;
259
+ }
260
+ /**
261
+ * Fails the job with a reason (error) specified
262
+ *
263
+ * @param reason
264
+ */
265
+ fail(reason) {
266
+ this.attrs.failReason = reason instanceof Error ? reason.message : reason;
267
+ this.attrs.failCount = (this.attrs.failCount || 0) + 1;
268
+ const now = new Date();
269
+ this.attrs.failedAt = now;
270
+ this.attrs.lastFinishedAt = now;
271
+ log('[%s:%s] fail() called [%d] times so far', this.attrs.name, this.attrs._id, this.attrs.failCount);
272
+ return this;
273
+ }
274
+ async fetchStatus() {
275
+ const result = await this.agenda.db.queryJobs({ id: this.attrs._id?.toString() });
276
+ if (!result.jobs || result.jobs.length === 0) {
277
+ // @todo: should we just return false instead? a finished job could have been removed from database,
278
+ // and then this would throw...
279
+ throw new Error(`job with id ${this.attrs._id} not found in database`);
280
+ }
281
+ this.attrs.lastRunAt = result.jobs[0].lastRunAt;
282
+ this.attrs.lockedAt = result.jobs[0].lockedAt;
283
+ this.attrs.lastFinishedAt = result.jobs[0].lastFinishedAt;
284
+ }
285
+ /**
286
+ * A job is running if:
287
+ * (lastRunAt exists AND lastFinishedAt does not exist)
288
+ * OR
289
+ * (lastRunAt exists AND lastFinishedAt exists but the lastRunAt is newer [in time] than lastFinishedAt)
290
+ * @returns Whether or not job is running at the moment (true for running)
291
+ */
292
+ async isRunning() {
293
+ if (!this.byJobProcessor || this.attrs.fork) {
294
+ // we have no job definition, therfore we are not the job processor, but a client call
295
+ // so we get the real state from database
296
+ await this.fetchStatus();
297
+ }
298
+ if (!this.attrs.lastRunAt) {
299
+ return false;
300
+ }
301
+ if (!this.attrs.lastFinishedAt) {
302
+ return true;
303
+ }
304
+ if (this.attrs.lockedAt &&
305
+ this.attrs.lastRunAt.getTime() > this.attrs.lastFinishedAt.getTime()) {
306
+ return true;
307
+ }
308
+ return false;
309
+ }
310
+ /**
311
+ * Saves a job to database
312
+ */
313
+ async save() {
314
+ if (this.agenda.forkedWorker) {
315
+ const warning = new Error('calling save() on a Job during a forkedWorker has no effect!');
316
+ log('WARNING: %s %s', warning.message, warning.stack);
317
+ return this;
318
+ }
319
+ // ensure db connection is ready
320
+ await this.agenda.ready;
321
+ // save() is only called by user code (the job processor uses saveJobState() directly),
322
+ // so we always exclude processor-managed fields to prevent race conditions
323
+ const result = await this.agenda.db.saveJob(this.toJson(true), {
324
+ lastModifiedBy: this.agenda.attrs.name || undefined
325
+ });
326
+ // Update attrs from result
327
+ this.attrs._id = result._id;
328
+ this.attrs.nextRunAt = result.nextRunAt;
329
+ this.attrs.debounceStartedAt = result.debounceStartedAt;
330
+ // Publish notification for real-time processing if channel is configured
331
+ if (this.agenda.hasNotificationChannel()) {
332
+ await this.agenda.publishJobNotification(this);
333
+ }
334
+ return this;
335
+ }
336
+ /**
337
+ * Remove the job from database
338
+ */
339
+ remove() {
340
+ return this.agenda.cancel({ id: this.attrs._id });
341
+ }
342
+ async isDead() {
343
+ return this.isExpired();
344
+ }
345
+ async isExpired() {
346
+ if (!this.byJobProcessor || this.attrs.fork) {
347
+ // we have no job definition, therfore we are not the job processor, but a client call
348
+ // so we get the real state from database
349
+ await this.fetchStatus();
350
+ }
351
+ const definition = this.agenda.definitions[this.attrs.name];
352
+ const lockDeadline = new Date(Date.now() - definition.lockLifetime);
353
+ // This means a job has "expired", as in it has not been "touched" within the lockoutTime
354
+ // Remove from local lock
355
+ if (this.attrs.lockedAt && this.attrs.lockedAt < lockDeadline) {
356
+ return true;
357
+ }
358
+ return false;
359
+ }
360
+ /**
361
+ * Updates "lockedAt" time so the job does not get picked up again
362
+ * @param progress 0 to 100
363
+ */
364
+ async touch(progress) {
365
+ if (this.canceled) {
366
+ throw new Error(`job ${this.attrs.name} got canceled already: ${this.canceled}!`);
367
+ }
368
+ this.attrs.lockedAt = new Date();
369
+ this.attrs.progress = progress;
370
+ await this.agenda.db.saveJobState(this.attrs, {
371
+ lastModifiedBy: this.agenda.attrs.name || undefined
372
+ });
373
+ }
374
+ computeNextRunAt() {
375
+ try {
376
+ if (this.attrs.repeatInterval) {
377
+ const nextRunAt = computeFromInterval(this.attrs);
378
+ this.attrs.nextRunAt = nextRunAt;
379
+ if (nextRunAt) {
380
+ log('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, nextRunAt.toISOString());
381
+ }
382
+ else {
383
+ log('[%s:%s] nextRunAt set to null (date constraints)', this.attrs.name, this.attrs._id);
384
+ }
385
+ }
386
+ else if (this.attrs.repeatAt) {
387
+ const nextRunAt = computeFromRepeatAt(this.attrs);
388
+ this.attrs.nextRunAt = nextRunAt;
389
+ if (nextRunAt) {
390
+ log('[%s:%s] nextRunAt set to [%s]', this.attrs.name, this.attrs._id, nextRunAt.toISOString());
391
+ }
392
+ else {
393
+ log('[%s:%s] nextRunAt set to null (date constraints)', this.attrs.name, this.attrs._id);
394
+ }
395
+ }
396
+ else {
397
+ this.attrs.nextRunAt = null;
398
+ }
399
+ }
400
+ catch (error) {
401
+ this.attrs.nextRunAt = null;
402
+ this.fail(error);
403
+ }
404
+ return this;
405
+ }
406
+ /**
407
+ * Handle automatic retry with backoff strategy
408
+ * @param error - The error that caused the failure
409
+ */
410
+ async handleRetry(error) {
411
+ const definition = this.agenda.definitions[this.attrs.name];
412
+ // No backoff strategy configured - skip auto-retry
413
+ if (!definition?.backoff) {
414
+ return;
415
+ }
416
+ const context = {
417
+ attempt: this.attrs.failCount || 1,
418
+ error,
419
+ jobName: this.attrs.name,
420
+ jobData: this.attrs.data
421
+ };
422
+ const retryDelay = definition.backoff(context);
423
+ if (retryDelay === null) {
424
+ // No more retries - emit exhausted event
425
+ log('[%s:%s] retry attempts exhausted after %d failures', this.attrs.name, this.attrs._id, this.attrs.failCount);
426
+ this.agenda.emit('retry exhausted', error, this);
427
+ this.agenda.emit(`retry exhausted:${this.attrs.name}`, error, this);
428
+ return;
429
+ }
430
+ // Schedule retry
431
+ const nextRunAt = new Date(Date.now() + retryDelay);
432
+ this.attrs.nextRunAt = nextRunAt;
433
+ log('[%s:%s] scheduling retry #%d in %dms (at %s)', this.attrs.name, this.attrs._id, this.attrs.failCount, retryDelay, nextRunAt.toISOString());
434
+ this.agenda.emit('retry', this, {
435
+ attempt: this.attrs.failCount,
436
+ delay: retryDelay,
437
+ nextRunAt,
438
+ error
439
+ });
440
+ this.agenda.emit(`retry:${this.attrs.name}`, this, {
441
+ attempt: this.attrs.failCount,
442
+ delay: retryDelay,
443
+ nextRunAt,
444
+ error
445
+ });
446
+ }
447
+ async run() {
448
+ this.attrs.lastRunAt = new Date();
449
+ log('[%s:%s] setting lastRunAt to: %s', this.attrs.name, this.attrs._id, this.attrs.lastRunAt.toISOString());
450
+ this.computeNextRunAt();
451
+ await this.agenda.db.saveJobState(this.attrs, {
452
+ lastModifiedBy: this.agenda.attrs.name || undefined
453
+ });
454
+ try {
455
+ this.agenda.emit('start', this);
456
+ this.agenda.emit(`start:${this.attrs.name}`, this);
457
+ log('[%s:%s] starting job', this.attrs.name, this.attrs._id);
458
+ if (this.attrs.fork) {
459
+ if (!this.agenda.forkHelper) {
460
+ throw new Error('no forkHelper specified, you need to set a path to a helper script');
461
+ }
462
+ const { forkHelper } = this.agenda;
463
+ await new Promise((resolve, reject) => {
464
+ this.forkedChild = fork(forkHelper.path, [
465
+ this.attrs.name,
466
+ this.attrs._id.toString(),
467
+ this.agenda.definitions[this.attrs.name].filePath || ''
468
+ ], forkHelper.options);
469
+ let childError;
470
+ this.forkedChild.on('close', code => {
471
+ if (code) {
472
+ log('fork parameters: %O name=%s id=%s filePath=%s', forkHelper, this.attrs.name, this.attrs._id, this.agenda.definitions[this.attrs.name].filePath);
473
+ const error = new Error(`child process exited with code: ${code}`);
474
+ log('fork child error: %s %O', error.message, childError || this.canceled);
475
+ reject(childError || this.canceled || error);
476
+ }
477
+ else {
478
+ resolve();
479
+ }
480
+ });
481
+ this.forkedChild.on('message', message => {
482
+ // console.log(`Message from child.js: ${message}`, JSON.stringify(message));
483
+ if (typeof message === 'string') {
484
+ try {
485
+ childError = JSON.parse(message);
486
+ }
487
+ catch {
488
+ childError = message;
489
+ }
490
+ }
491
+ else {
492
+ childError = message;
493
+ }
494
+ });
495
+ });
496
+ }
497
+ else {
498
+ await this.runJob();
499
+ }
500
+ this.attrs.lastFinishedAt = new Date();
501
+ this.agenda.emit('success', this);
502
+ this.agenda.emit(`success:${this.attrs.name}`, this);
503
+ log('[%s:%s] has succeeded', this.attrs.name, this.attrs._id);
504
+ }
505
+ catch (error) {
506
+ log('[%s:%s] unknown error occurred', this.attrs.name, this.attrs._id);
507
+ this.fail(error);
508
+ this.agenda.emit('fail', error, this);
509
+ this.agenda.emit(`fail:${this.attrs.name}`, error, this);
510
+ log('[%s:%s] has failed [%s]', this.attrs.name, this.attrs._id, error.message);
511
+ // Handle automatic retry with backoff strategy
512
+ await this.handleRetry(error);
513
+ }
514
+ finally {
515
+ this.forkedChild = undefined;
516
+ this.attrs.lockedAt = undefined;
517
+ try {
518
+ await this.agenda.db.saveJobState(this.attrs, {
519
+ lastModifiedBy: this.agenda.attrs.name || undefined
520
+ });
521
+ log('[%s:%s] was saved successfully to database', this.attrs.name, this.attrs._id);
522
+ }
523
+ catch (err) {
524
+ // in case this fails, we ignore it
525
+ // this can e.g. happen if the job gets removed during the execution
526
+ log('[%s:%s] was not saved to database', this.attrs.name, this.attrs._id, err);
527
+ }
528
+ this.agenda.emit('complete', this);
529
+ this.agenda.emit(`complete:${this.attrs.name}`, this);
530
+ log('[%s:%s] job finished at [%s] and was unlocked', this.attrs.name, this.attrs._id, this.attrs.lastFinishedAt);
531
+ }
532
+ }
533
+ async runJob() {
534
+ const definition = this.agenda.definitions[this.attrs.name];
535
+ if (!definition) {
536
+ log('[%s:%s] has no definition, can not run', this.attrs.name, this.attrs._id);
537
+ throw new Error('Undefined job');
538
+ }
539
+ if (definition.fn.length === 2) {
540
+ log('[%s:%s] process function being called', this.attrs.name, this.attrs._id);
541
+ await new Promise((resolve, reject) => {
542
+ try {
543
+ const result = definition.fn(this, error => {
544
+ if (error) {
545
+ reject(error);
546
+ return;
547
+ }
548
+ resolve();
549
+ });
550
+ if (this.isPromise(result)) {
551
+ result.catch((error) => reject(error));
552
+ }
553
+ }
554
+ catch (error) {
555
+ reject(error);
556
+ }
557
+ });
558
+ }
559
+ else {
560
+ log('[%s:%s] process function being called', this.attrs.name, this.attrs._id);
561
+ await definition.fn(this);
562
+ }
563
+ }
564
+ isPromise(value) {
565
+ return !!(value && typeof value.then === 'function');
566
+ }
567
+ }
568
+ //# sourceMappingURL=Job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Job.js","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { Job, JobWithId } from './Job.js';
2
+ import type { JobParameters } from './types/JobParameters.js';
3
+ import type { Agenda } from './index.js';
4
+ /**
5
+ * @class
6
+ */
7
+ export declare class JobProcessingQueue {
8
+ private agenda;
9
+ private _queue;
10
+ constructor(agenda: Agenda);
11
+ get length(): number;
12
+ getQueue(): Job[];
13
+ /**
14
+ * Pops and returns last queue element (next job to be processed) without checking concurrency.
15
+ * @returns {Job} Next Job to be processed
16
+ */
17
+ pop(): Job | undefined;
18
+ /**
19
+ * Inserts job in first queue position
20
+ * @param {Job} job job to add to queue
21
+ * @returns {undefined}
22
+ */
23
+ remove(job: Job): void;
24
+ /**
25
+ * Inserts job in queue where it will be order from left to right in decreasing
26
+ * order of nextRunAt and priority (in case of same nextRunAt), if all values
27
+ * are even the first jobs to be introduced will have priority
28
+ * @param {Job} job job to add to queue
29
+ * @returns {undefined}
30
+ */
31
+ insert(job: Job): void;
32
+ /**
33
+ * Returns (does not pop, element remains in queue) first element (always from the right)
34
+ * that can be processed (not blocked by concurrency execution)
35
+ * @param {Object} jobStatus current status of jobs
36
+ * @returns {Job} Next Job to be processed
37
+ */
38
+ returnNextConcurrencyFreeJob(jobStatus: {
39
+ [jobName: string]: {
40
+ running: number;
41
+ } | undefined;
42
+ }, handledJobs: JobParameters['_id'][]): (JobWithId & {
43
+ attrs: JobParameters & {
44
+ nextRunAt?: Date | null;
45
+ };
46
+ }) | undefined;
47
+ }