agenda-ts 1.6.9-beta.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 (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/dist/index.d.ts +7 -0
  4. package/dist/index.js +12 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/job/compute-next-run-at.d.ts +3 -0
  7. package/dist/job/compute-next-run-at.js +114 -0
  8. package/dist/job/compute-next-run-at.js.map +1 -0
  9. package/dist/job/disable.d.ts +3 -0
  10. package/dist/job/disable.js +9 -0
  11. package/dist/job/disable.js.map +1 -0
  12. package/dist/job/enable.d.ts +3 -0
  13. package/dist/job/enable.js +9 -0
  14. package/dist/job/enable.js.map +1 -0
  15. package/dist/job/fail.d.ts +3 -0
  16. package/dist/job/fail.js +28 -0
  17. package/dist/job/fail.js.map +1 -0
  18. package/dist/job/fetch-status.d.ts +10 -0
  19. package/dist/job/fetch-status.js +23 -0
  20. package/dist/job/fetch-status.js.map +1 -0
  21. package/dist/job/index.d.ts +89 -0
  22. package/dist/job/index.js +109 -0
  23. package/dist/job/index.js.map +1 -0
  24. package/dist/job/is-expired.d.ts +2 -0
  25. package/dist/job/is-expired.js +16 -0
  26. package/dist/job/is-expired.js.map +1 -0
  27. package/dist/job/is-running.d.ts +2 -0
  28. package/dist/job/is-running.js +21 -0
  29. package/dist/job/is-running.js.map +1 -0
  30. package/dist/job/priority.d.ts +3 -0
  31. package/dist/job/priority.js +10 -0
  32. package/dist/job/priority.js.map +1 -0
  33. package/dist/job/remove.d.ts +2 -0
  34. package/dist/job/remove.js +8 -0
  35. package/dist/job/remove.js.map +1 -0
  36. package/dist/job/repeat-at.d.ts +3 -0
  37. package/dist/job/repeat-at.js +9 -0
  38. package/dist/job/repeat-at.js.map +1 -0
  39. package/dist/job/repeat-every.d.ts +10 -0
  40. package/dist/job/repeat-every.js +21 -0
  41. package/dist/job/repeat-every.js.map +1 -0
  42. package/dist/job/run.d.ts +3 -0
  43. package/dist/job/run.js +92 -0
  44. package/dist/job/run.js.map +1 -0
  45. package/dist/job/save.d.ts +3 -0
  46. package/dist/job/save.js +8 -0
  47. package/dist/job/save.js.map +1 -0
  48. package/dist/job/schedule.d.ts +3 -0
  49. package/dist/job/schedule.js +12 -0
  50. package/dist/job/schedule.js.map +1 -0
  51. package/dist/job/set-shouldsaveresult.d.ts +3 -0
  52. package/dist/job/set-shouldsaveresult.js +9 -0
  53. package/dist/job/set-shouldsaveresult.js.map +1 -0
  54. package/dist/job/to-json.d.ts +3 -0
  55. package/dist/job/to-json.js +21 -0
  56. package/dist/job/to-json.js.map +1 -0
  57. package/dist/job/touch.d.ts +3 -0
  58. package/dist/job/touch.js +14 -0
  59. package/dist/job/touch.js.map +1 -0
  60. package/dist/job/unique.d.ts +6 -0
  61. package/dist/job/unique.js +10 -0
  62. package/dist/job/unique.js.map +1 -0
  63. package/dist/pulse/cancel.d.ts +3 -0
  64. package/dist/pulse/cancel.js +21 -0
  65. package/dist/pulse/cancel.js.map +1 -0
  66. package/dist/pulse/close.d.ts +5 -0
  67. package/dist/pulse/close.js +25 -0
  68. package/dist/pulse/close.js.map +1 -0
  69. package/dist/pulse/count-jobs.d.ts +5 -0
  70. package/dist/pulse/count-jobs.js +12 -0
  71. package/dist/pulse/count-jobs.js.map +1 -0
  72. package/dist/pulse/create.d.ts +3 -0
  73. package/dist/pulse/create.js +31 -0
  74. package/dist/pulse/create.js.map +1 -0
  75. package/dist/pulse/database.d.ts +4 -0
  76. package/dist/pulse/database.js +33 -0
  77. package/dist/pulse/database.js.map +1 -0
  78. package/dist/pulse/db-init.d.ts +3 -0
  79. package/dist/pulse/db-init.js +34 -0
  80. package/dist/pulse/db-init.js.map +1 -0
  81. package/dist/pulse/default-concurrency.d.ts +3 -0
  82. package/dist/pulse/default-concurrency.js +13 -0
  83. package/dist/pulse/default-concurrency.js.map +1 -0
  84. package/dist/pulse/default-lock-lifetime.d.ts +3 -0
  85. package/dist/pulse/default-lock-lifetime.js +13 -0
  86. package/dist/pulse/default-lock-lifetime.js.map +1 -0
  87. package/dist/pulse/default-lock-limit.d.ts +3 -0
  88. package/dist/pulse/default-lock-limit.js +13 -0
  89. package/dist/pulse/default-lock-limit.js.map +1 -0
  90. package/dist/pulse/define.d.ts +23 -0
  91. package/dist/pulse/define.js +34 -0
  92. package/dist/pulse/define.js.map +1 -0
  93. package/dist/pulse/disable.d.ts +3 -0
  94. package/dist/pulse/disable.js +22 -0
  95. package/dist/pulse/disable.js.map +1 -0
  96. package/dist/pulse/drain.d.ts +2 -0
  97. package/dist/pulse/drain.js +26 -0
  98. package/dist/pulse/drain.js.map +1 -0
  99. package/dist/pulse/enable.d.ts +3 -0
  100. package/dist/pulse/enable.js +22 -0
  101. package/dist/pulse/enable.js.map +1 -0
  102. package/dist/pulse/every.d.ts +4 -0
  103. package/dist/pulse/every.js +37 -0
  104. package/dist/pulse/every.js.map +1 -0
  105. package/dist/pulse/find-and-lock-next-job.d.ts +3 -0
  106. package/dist/pulse/find-and-lock-next-job.js +43 -0
  107. package/dist/pulse/find-and-lock-next-job.js.map +1 -0
  108. package/dist/pulse/has-mongo-protocol.d.ts +1 -0
  109. package/dist/pulse/has-mongo-protocol.js +8 -0
  110. package/dist/pulse/has-mongo-protocol.js.map +1 -0
  111. package/dist/pulse/index.d.ts +115 -0
  112. package/dist/pulse/index.js +208 -0
  113. package/dist/pulse/index.js.map +1 -0
  114. package/dist/pulse/job-processing-queue.d.ts +11 -0
  115. package/dist/pulse/job-processing-queue.js +51 -0
  116. package/dist/pulse/job-processing-queue.js.map +1 -0
  117. package/dist/pulse/jobs.d.ts +6 -0
  118. package/dist/pulse/jobs.js +14 -0
  119. package/dist/pulse/jobs.js.map +1 -0
  120. package/dist/pulse/lock-limit.d.ts +3 -0
  121. package/dist/pulse/lock-limit.js +13 -0
  122. package/dist/pulse/lock-limit.js.map +1 -0
  123. package/dist/pulse/max-concurrency.d.ts +3 -0
  124. package/dist/pulse/max-concurrency.js +13 -0
  125. package/dist/pulse/max-concurrency.js.map +1 -0
  126. package/dist/pulse/mongo.d.ts +4 -0
  127. package/dist/pulse/mongo.js +10 -0
  128. package/dist/pulse/mongo.js.map +1 -0
  129. package/dist/pulse/name.d.ts +3 -0
  130. package/dist/pulse/name.js +13 -0
  131. package/dist/pulse/name.js.map +1 -0
  132. package/dist/pulse/now.d.ts +3 -0
  133. package/dist/pulse/now.js +21 -0
  134. package/dist/pulse/now.js.map +1 -0
  135. package/dist/pulse/process-every.d.ts +3 -0
  136. package/dist/pulse/process-every.js +14 -0
  137. package/dist/pulse/process-every.js.map +1 -0
  138. package/dist/pulse/purge.d.ts +2 -0
  139. package/dist/pulse/purge.js +13 -0
  140. package/dist/pulse/purge.js.map +1 -0
  141. package/dist/pulse/resume-on-restart.d.ts +3 -0
  142. package/dist/pulse/resume-on-restart.js +39 -0
  143. package/dist/pulse/resume-on-restart.js.map +1 -0
  144. package/dist/pulse/save-job.d.ts +4 -0
  145. package/dist/pulse/save-job.js +104 -0
  146. package/dist/pulse/save-job.js.map +1 -0
  147. package/dist/pulse/schedule.d.ts +4 -0
  148. package/dist/pulse/schedule.js +36 -0
  149. package/dist/pulse/schedule.js.map +1 -0
  150. package/dist/pulse/sort.d.ts +3 -0
  151. package/dist/pulse/sort.js +13 -0
  152. package/dist/pulse/sort.js.map +1 -0
  153. package/dist/pulse/start.d.ts +2 -0
  154. package/dist/pulse/start.js +19 -0
  155. package/dist/pulse/start.js.map +1 -0
  156. package/dist/pulse/stop.d.ts +2 -0
  157. package/dist/pulse/stop.js +38 -0
  158. package/dist/pulse/stop.js.map +1 -0
  159. package/dist/utils/create-job.d.ts +3 -0
  160. package/dist/utils/create-job.js +10 -0
  161. package/dist/utils/create-job.js.map +1 -0
  162. package/dist/utils/error.d.ts +12 -0
  163. package/dist/utils/error.js +34 -0
  164. package/dist/utils/error.js.map +1 -0
  165. package/dist/utils/index.d.ts +4 -0
  166. package/dist/utils/index.js +8 -0
  167. package/dist/utils/index.js.map +1 -0
  168. package/dist/utils/parse-priority.d.ts +1 -0
  169. package/dist/utils/parse-priority.js +31 -0
  170. package/dist/utils/parse-priority.js.map +1 -0
  171. package/dist/utils/process-jobs.d.ts +3 -0
  172. package/dist/utils/process-jobs.js +203 -0
  173. package/dist/utils/process-jobs.js.map +1 -0
  174. package/package.json +99 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-on-restart.js","sourceRoot":"","sources":["../../src/pulse/resume-on-restart.ts"],"names":[],"mappings":";;;;AAAA,0DAAmC;AAGnC,MAAM,KAAK,GAAG,IAAA,eAAc,EAAC,uBAAuB,CAAC,CAAC;AAU/C,MAAM,eAAe,GAA0B,UAAuB,MAAM,GAAG,IAAI;IACxF,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEjC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IAE/B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW;aACb,UAAU,CACT;YACE,GAAG,EAAE;gBACH;oBACE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;oBAC3B,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;oBACxB,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;iBACnG;gBACD;oBACE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC5B,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;oBAClC,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;iBACpC;aACF;SACF,EACD;YACE,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;YAChF,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;SACzB,CACF;aACA,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,iCAAiC,EAAE,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AApCW,QAAA,eAAe,mBAoC1B"}
@@ -0,0 +1,4 @@
1
+ import { Job } from '../job';
2
+ export type ProcessDbResultMethod = (job: Job, result: any) => Promise<Job>;
3
+ export type SaveJobMethod = (job: Job) => Promise<Job>;
4
+ export declare const saveJob: SaveJobMethod;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveJob = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const debug_1 = tslib_1.__importDefault(require("debug"));
6
+ const utils_1 = require("../utils");
7
+ const debug = (0, debug_1.default)('pulse:saveJob');
8
+ const processDbResult = async function (job, result) {
9
+ debug('processDbResult() called with success, checking whether to process job immediately or not');
10
+ let resultValue = result.insertedId ? result.insertedId : result.value;
11
+ if (resultValue) {
12
+ let _id;
13
+ let nextRunAt;
14
+ if (result.insertedId) {
15
+ _id = result.insertedId;
16
+ const _job = await this._collection.findOne({ _id });
17
+ if (_job) {
18
+ nextRunAt = _job.nextRunAt;
19
+ }
20
+ }
21
+ else {
22
+ if (Array.isArray(resultValue)) {
23
+ resultValue = resultValue[0];
24
+ }
25
+ _id = resultValue._id;
26
+ nextRunAt = resultValue.nextRunAt;
27
+ }
28
+ job.attrs._id = _id;
29
+ job.attrs.nextRunAt = nextRunAt;
30
+ if (job.attrs.nextRunAt && job.attrs.nextRunAt < this._nextScanAt) {
31
+ debug('[%s:%s] job would have ran by nextScanAt, processing the job immediately', job.attrs.name, resultValue._id);
32
+ await utils_1.processJobs.call(this, job);
33
+ }
34
+ }
35
+ return job;
36
+ };
37
+ const saveJob = async function (job) {
38
+ try {
39
+ if (!this._collection) {
40
+ throw new utils_1.JobError('A db must be set up before you can save a job');
41
+ }
42
+ debug('attempting to save a job into Pulse instance');
43
+ const id = job.attrs._id;
44
+ const { uniqueQuery: unique, uniqueOpts } = job.attrs;
45
+ const props = job.toJSON();
46
+ delete props._id;
47
+ delete props.uniqueQuery;
48
+ delete props.uniqueOpts;
49
+ props.lastModifiedBy = this._name;
50
+ debug('[job %s] set job props: \n%O', id, props);
51
+ const now = new Date();
52
+ const protect = {};
53
+ let update = { $set: props };
54
+ debug('current time stored as %s', now.toISOString());
55
+ if (id) {
56
+ debug('job already has _id, calling findOneAndUpdate() using _id as query');
57
+ const result = await this._collection.findOneAndUpdate({ _id: id }, update, {
58
+ includeResultMetadata: true,
59
+ returnDocument: 'after',
60
+ });
61
+ return await processDbResult.call(this, job, result);
62
+ }
63
+ if (props.type === 'single') {
64
+ debug('job with type of "single" found');
65
+ if (props.nextRunAt && props.nextRunAt <= now) {
66
+ debug('job has a scheduled nextRunAt time, protecting that field from upsert');
67
+ protect.nextRunAt = props.nextRunAt;
68
+ delete props.nextRunAt;
69
+ }
70
+ if (Object.keys(protect).length > 0) {
71
+ update.$setOnInsert = protect;
72
+ }
73
+ debug('calling findOneAndUpdate() with job name and type of "single" as query');
74
+ const result = await this._collection.findOneAndUpdate({
75
+ name: props.name,
76
+ type: 'single',
77
+ }, update, { includeResultMetadata: true, upsert: true, returnDocument: 'after' });
78
+ return await processDbResult.call(this, job, result);
79
+ }
80
+ if (unique) {
81
+ const query = job.attrs.uniqueQuery;
82
+ query.name = props.name;
83
+ if (uniqueOpts?.insertOnly) {
84
+ update = { $setOnInsert: props };
85
+ }
86
+ debug('calling findOneAndUpdate() with unique object as query: \n%O', query);
87
+ const result = await this._collection.findOneAndUpdate(query, update, {
88
+ includeResultMetadata: true,
89
+ upsert: true,
90
+ returnDocument: 'after',
91
+ });
92
+ return await processDbResult.call(this, job, result);
93
+ }
94
+ debug('using default behavior, inserting new job via insertOne() with props that were set: \n%O', props);
95
+ const result = await this._collection.insertOne(props);
96
+ return await processDbResult.call(this, job, result);
97
+ }
98
+ catch (error) {
99
+ debug('processDbResult() received an error, job was not updated/created');
100
+ throw error;
101
+ }
102
+ };
103
+ exports.saveJob = saveJob;
104
+ //# sourceMappingURL=save-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-job.js","sourceRoot":"","sources":["../../src/pulse/save-job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Pulse } from '.';
2
+ import { Job, JobAttributesData } from '../job';
3
+ export declare const schedule: <T extends JobAttributesData>(this: Pulse, when: string | Date, names: string | string[], data?: T) => Promise<Job<T>> | Promise<Job<{}>[]>;
4
+ export type ScheduleMethod = typeof schedule;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schedule = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const debug_1 = tslib_1.__importDefault(require("debug"));
6
+ const debug = (0, debug_1.default)('pulse:schedule');
7
+ const schedule = function schedule(when, names, data) {
8
+ const createJob = async (when, name, data) => {
9
+ const job = this.create(name, data);
10
+ await job.schedule(when).save();
11
+ return job;
12
+ };
13
+ const createJobs = async (when, names, data) => {
14
+ try {
15
+ const createJobList = [];
16
+ names.map((name) => createJobList.push(createJob(when, name, data)));
17
+ debug('Pulse.schedule()::createJobs() -> all jobs created successfully');
18
+ return Promise.all(createJobList);
19
+ }
20
+ catch (error) {
21
+ debug('Pulse.schedule()::createJobs() -> error creating one or more of the jobs');
22
+ throw error;
23
+ }
24
+ };
25
+ if (typeof names === 'string') {
26
+ debug('Pulse.schedule(%s, %O, [%O], cb)', when, names);
27
+ return createJob(when, names, data || {});
28
+ }
29
+ if (Array.isArray(names)) {
30
+ debug('Pulse.schedule(%s, %O, [%O])', when, names);
31
+ return createJobs(when, names, data || {});
32
+ }
33
+ throw new TypeError('Name must be string or array of strings');
34
+ };
35
+ exports.schedule = schedule;
36
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/pulse/schedule.ts"],"names":[],"mappings":";;;;AAAA,0DAAmC;AAInC,MAAM,KAAK,GAAG,IAAA,eAAc,EAAC,gBAAgB,CAAC,CAAC;AAWxC,MAAM,QAAQ,GAAG,SAAS,QAAQ,CAEvC,IAAmB,EACnB,KAAwB,EACxB,IAAQ;IASR,MAAM,SAAS,GAAG,KAAK,EACrB,IAAmB,EACnB,IAAY,EACZ,IAAO,EACU,EAAE;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IASF,MAAM,UAAU,GAAG,KAAK,EACtB,IAAmB,EACnB,KAAe,EACf,IAAO,EACY,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,aAAa,GAA2B,EAAE,CAAC;YACjD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACzE,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAClF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,CAAC,kCAAkC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAK,EAAQ,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;AACjE,CAAC,CAAC;AA3DW,QAAA,QAAQ,YA2DnB"}
@@ -0,0 +1,3 @@
1
+ import { Pulse } from '.';
2
+ export type SortMethod = (query: any) => Pulse;
3
+ export declare const sort: SortMethod;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sort = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const debug_1 = tslib_1.__importDefault(require("debug"));
6
+ const debug = (0, debug_1.default)('pulse:sort');
7
+ const sort = function (query) {
8
+ debug('Pulse.sort([Object])');
9
+ this._sort = query;
10
+ return this;
11
+ };
12
+ exports.sort = sort;
13
+ //# sourceMappingURL=sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../src/pulse/sort.ts"],"names":[],"mappings":";;;;AAAA,0DAAmC;AAGnC,MAAM,KAAK,GAAG,IAAA,eAAc,EAAC,YAAY,CAAC,CAAC;AAUpC,MAAM,IAAI,GAAe,UAAuB,KAAK;IAC1D,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAJW,QAAA,IAAI,QAIf"}
@@ -0,0 +1,2 @@
1
+ export type StartMethod = () => Promise<void | unknown>;
2
+ export declare const start: StartMethod;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.start = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const debug_1 = tslib_1.__importDefault(require("debug"));
6
+ const utils_1 = require("../utils");
7
+ const debug = (0, debug_1.default)('pulse:start');
8
+ const start = async function () {
9
+ if (this._processInterval) {
10
+ debug('Pulse.start was already called, ignoring');
11
+ return this._ready;
12
+ }
13
+ await this._ready;
14
+ debug('Pulse.start called, creating interval to call processJobs every [%dms]', this._processEvery);
15
+ this._processInterval = setInterval(utils_1.processJobs.bind(this), this._processEvery);
16
+ process.nextTick(utils_1.processJobs.bind(this));
17
+ };
18
+ exports.start = start;
19
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/pulse/start.ts"],"names":[],"mappings":";;;;AAAA,0DAAmC;AAEnC,oCAAuC;AAEvC,MAAM,KAAK,GAAG,IAAA,eAAc,EAAC,aAAa,CAAC,CAAC;AAUrC,MAAM,KAAK,GAAgB,KAAK;IACrC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,CAAC,MAAM,CAAC;IAElB,KAAK,CAAC,wEAAwE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACpG,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,mBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAChF,OAAO,CAAC,QAAQ,CAAC,mBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC;AAXW,QAAA,KAAK,SAWhB"}
@@ -0,0 +1,2 @@
1
+ export type StopMethod = () => Promise<void>;
2
+ export declare const stop: StopMethod;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stop = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const debug_1 = tslib_1.__importDefault(require("debug"));
6
+ const debug = (0, debug_1.default)('pulse:stop');
7
+ const stop = async function () {
8
+ const _unlockJobs = async () => {
9
+ return new Promise((resolve, reject) => {
10
+ debug('Pulse._unlockJobs()');
11
+ const jobIds = this._lockedJobs.map((job) => job.attrs._id);
12
+ if (jobIds.length === 0) {
13
+ debug('no jobs to unlock');
14
+ resolve();
15
+ }
16
+ debug('about to unlock jobs with ids: %O', jobIds);
17
+ this._collection
18
+ .updateMany({ _id: { $in: jobIds } }, { $set: { lockedAt: null } })
19
+ .then(() => {
20
+ this._lockedJobs = [];
21
+ return resolve();
22
+ })
23
+ .catch((error) => {
24
+ if (error) {
25
+ return reject(error);
26
+ }
27
+ this._lockedJobs = [];
28
+ return resolve();
29
+ });
30
+ });
31
+ };
32
+ debug('Pulse.stop called, clearing interval for processJobs()');
33
+ clearInterval(this._processInterval);
34
+ this._processInterval = undefined;
35
+ return _unlockJobs();
36
+ };
37
+ exports.stop = stop;
38
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/pulse/stop.ts"],"names":[],"mappings":";;;;AAAA,0DAAmC;AAGnC,MAAM,KAAK,GAAG,IAAA,eAAc,EAAC,YAAY,CAAC,CAAC;AASpC,MAAM,IAAI,GAAe,KAAK;IAOnC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,KAAK,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW;iBACb,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;iBAClE,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;gBACtB,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBAED,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;gBACtB,OAAO,OAAO,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAChE,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAClC,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC,CAAC;AAvCW,QAAA,IAAI,QAuCf"}
@@ -0,0 +1,3 @@
1
+ import { Job, JobAttributes } from '../job';
2
+ import { Pulse } from '../pulse';
3
+ export declare const createJob: (pulse: Pulse, jobData: JobAttributes) => Job;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createJob = void 0;
4
+ const job_1 = require("../job");
5
+ const createJob = (pulse, jobData) => {
6
+ jobData.pulse = pulse;
7
+ return new job_1.Job(jobData);
8
+ };
9
+ exports.createJob = createJob;
10
+ //# sourceMappingURL=create-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-job.js","sourceRoot":"","sources":["../../src/utils/create-job.ts"],"names":[],"mappings":";;;AAAA,gCAA4C;AASrC,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,OAAsB,EAAO,EAAE;IACrE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;IACtB,OAAO,IAAI,SAAG,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC,CAAC;AAHW,QAAA,SAAS,aAGpB"}
@@ -0,0 +1,12 @@
1
+ export declare class BaseError extends Error {
2
+ message: string;
3
+ constructor(message: string);
4
+ }
5
+ export declare class PulseError extends BaseError {
6
+ message: string;
7
+ constructor(message: string);
8
+ }
9
+ export declare class JobError extends BaseError {
10
+ message: string;
11
+ constructor(message: string);
12
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JobError = exports.PulseError = exports.BaseError = void 0;
4
+ class BaseError extends Error {
5
+ message;
6
+ constructor(message) {
7
+ super(message);
8
+ this.message = message;
9
+ this.name = this.constructor.name;
10
+ Object.setPrototypeOf(this, new.target.prototype);
11
+ }
12
+ }
13
+ exports.BaseError = BaseError;
14
+ class PulseError extends BaseError {
15
+ message;
16
+ constructor(message) {
17
+ super(message);
18
+ this.message = message;
19
+ this.name = this.constructor.name;
20
+ Object.setPrototypeOf(this, new.target.prototype);
21
+ }
22
+ }
23
+ exports.PulseError = PulseError;
24
+ class JobError extends BaseError {
25
+ message;
26
+ constructor(message) {
27
+ super(message);
28
+ this.message = message;
29
+ this.name = this.constructor.name;
30
+ Object.setPrototypeOf(this, new.target.prototype);
31
+ }
32
+ }
33
+ exports.JobError = JobError;
34
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":";;;AAAA,MAAa,SAAU,SAAQ,KAAK;IACf;IAAnB,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,YAAO,GAAP,OAAO,CAAQ;QAEhC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,8BAMC;AAED,MAAa,UAAW,SAAQ,SAAS;IACpB;IAAnB,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,YAAO,GAAP,OAAO,CAAQ;QAEhC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,gCAMC;AAED,MAAa,QAAS,SAAQ,SAAS;IAClB;IAAnB,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,YAAO,GAAP,OAAO,CAAQ;QAEhC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,4BAMC"}
@@ -0,0 +1,4 @@
1
+ export * from './create-job';
2
+ export * from './error';
3
+ export * from './parse-priority';
4
+ export * from './process-jobs';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./create-job"), exports);
5
+ tslib_1.__exportStar(require("./error"), exports);
6
+ tslib_1.__exportStar(require("./parse-priority"), exports);
7
+ tslib_1.__exportStar(require("./process-jobs"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,kDAAwB;AACxB,2DAAiC;AACjC,yDAA+B"}
@@ -0,0 +1 @@
1
+ export declare const parsePriority: (priority: string | number) => number;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePriority = void 0;
4
+ const define_1 = require("../pulse/define");
5
+ const parsePriority = (priority) => {
6
+ if (typeof priority === 'number') {
7
+ return priority;
8
+ }
9
+ switch (priority) {
10
+ case 'lowest': {
11
+ return define_1.JobPriority.lowest;
12
+ }
13
+ case 'low': {
14
+ return define_1.JobPriority.low;
15
+ }
16
+ case 'normal': {
17
+ return define_1.JobPriority.normal;
18
+ }
19
+ case 'high': {
20
+ return define_1.JobPriority.high;
21
+ }
22
+ case 'highest': {
23
+ return define_1.JobPriority.highest;
24
+ }
25
+ default: {
26
+ return define_1.JobPriority.normal;
27
+ }
28
+ }
29
+ };
30
+ exports.parsePriority = parsePriority;
31
+ //# sourceMappingURL=parse-priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-priority.js","sourceRoot":"","sources":["../../src/utils/parse-priority.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAMvC,MAAM,aAAa,GAAG,CAAC,QAAyB,EAAU,EAAE;IACjE,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,oBAAW,CAAC,MAAM,CAAC;QAC5B,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,OAAO,oBAAW,CAAC,GAAG,CAAC;QACzB,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,oBAAW,CAAC,MAAM,CAAC;QAC5B,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,oBAAW,CAAC,IAAI,CAAC;QAC1B,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO,oBAAW,CAAC,OAAO,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,oBAAW,CAAC,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AA9BW,QAAA,aAAa,iBA8BxB"}
@@ -0,0 +1,3 @@
1
+ import { Job } from '../job';
2
+ import { Pulse } from '../pulse';
3
+ export declare const processJobs: (this: Pulse, extraJob: Job) => Promise<void>;
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processJobs = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const debug_1 = tslib_1.__importDefault(require("debug"));
6
+ const create_job_1 = require("./create-job");
7
+ const error_1 = require("./error");
8
+ const debug = (0, debug_1.default)('pulse:internal:processJobs');
9
+ const processJobs = async function (extraJob) {
10
+ debug('starting to process jobs: [%s:%s]', extraJob?.attrs?.name ?? 'unknownName', extraJob?.attrs?._id ?? 'unknownId');
11
+ if (!this._processInterval) {
12
+ debug('no _processInterval set when calling processJobs, returning');
13
+ return;
14
+ }
15
+ const self = this;
16
+ const definitions = this._definitions;
17
+ const jobQueue = this._jobQueue;
18
+ let jobName;
19
+ if (!extraJob) {
20
+ const parallelJobQueueing = [];
21
+ for (jobName in definitions) {
22
+ if ({}.hasOwnProperty.call(definitions, jobName)) {
23
+ debug('queuing up job to process: [%s]', jobName);
24
+ parallelJobQueueing.push(jobQueueFilling(jobName));
25
+ }
26
+ }
27
+ await Promise.all(parallelJobQueueing);
28
+ }
29
+ else if (definitions[extraJob.attrs.name]) {
30
+ debug('job [%s:%s] was passed directly to processJobs(), locking and running immediately', extraJob.attrs.name, extraJob.attrs._id);
31
+ self._jobsToLock.push(extraJob);
32
+ await lockOnTheFly();
33
+ }
34
+ function shouldLock(name) {
35
+ const jobDefinition = definitions[name];
36
+ let shouldLock = true;
37
+ if (self._lockLimit && self._lockLimit <= self._lockedJobs.length) {
38
+ shouldLock = false;
39
+ }
40
+ if (jobDefinition.lockLimit && jobDefinition.lockLimit <= jobDefinition.locked) {
41
+ shouldLock = false;
42
+ }
43
+ debug('job [%s] lock status: shouldLock = %s', name, shouldLock);
44
+ return shouldLock;
45
+ }
46
+ function enqueueJobs(jobs) {
47
+ if (!Array.isArray(jobs)) {
48
+ jobs = [jobs];
49
+ }
50
+ jobs.forEach((job) => {
51
+ jobQueue.insert(job);
52
+ });
53
+ }
54
+ async function lockOnTheFly() {
55
+ debug('lockOnTheFly: isLockingOnTheFly: %s', self._isLockingOnTheFly);
56
+ if (self._isLockingOnTheFly) {
57
+ debug('lockOnTheFly() already running, returning');
58
+ return;
59
+ }
60
+ self._isLockingOnTheFly = true;
61
+ if (self._jobsToLock.length === 0) {
62
+ debug('no jobs to current lock on the fly, returning');
63
+ self._isLockingOnTheFly = false;
64
+ return;
65
+ }
66
+ const now = new Date();
67
+ const job = self._jobsToLock.pop();
68
+ if (job === undefined) {
69
+ debug('no job was popped from _jobsToLock, extremly unlikely but not impossible concurrency issue');
70
+ self._isLockingOnTheFly = false;
71
+ return;
72
+ }
73
+ if (self._isJobQueueFilling.has(job.attrs.name)) {
74
+ debug('lockOnTheFly: jobQueueFilling already running for: %s', job.attrs.name);
75
+ self._isLockingOnTheFly = false;
76
+ return;
77
+ }
78
+ if (!shouldLock(job.attrs.name)) {
79
+ debug('lock limit hit for: [%s:%s]', job.attrs.name, job.attrs._id);
80
+ self._jobsToLock = [];
81
+ self._isLockingOnTheFly = false;
82
+ return;
83
+ }
84
+ const criteria = {
85
+ _id: job.attrs._id,
86
+ lockedAt: null,
87
+ nextRunAt: job.attrs.nextRunAt,
88
+ disabled: { $ne: true },
89
+ };
90
+ const update = { $set: { lockedAt: now } };
91
+ const resp = await self._collection.findOneAndUpdate(criteria, update, {
92
+ includeResultMetadata: true,
93
+ returnDocument: 'after',
94
+ });
95
+ if (resp?.value) {
96
+ const job = (0, create_job_1.createJob)(self, resp.value);
97
+ debug('found job [%s:%s] that can be locked on the fly', job.attrs.name, job.attrs._id);
98
+ self._lockedJobs.push(job);
99
+ definitions[job.attrs.name].locked++;
100
+ enqueueJobs(job);
101
+ jobProcessing();
102
+ }
103
+ self._isLockingOnTheFly = false;
104
+ await lockOnTheFly();
105
+ }
106
+ async function jobQueueFilling(name) {
107
+ debug('jobQueueFilling: %s isJobQueueFilling: %s', name, self._isJobQueueFilling.has(name));
108
+ self._isJobQueueFilling.set(name, true);
109
+ try {
110
+ if (!shouldLock(name)) {
111
+ debug('lock limit reached in queue filling for [%s]', name);
112
+ return;
113
+ }
114
+ const now = new Date();
115
+ self._nextScanAt = new Date(now.valueOf() + self._processEvery);
116
+ const job = await self._findAndLockNextJob(name, definitions[name]);
117
+ if (job) {
118
+ if (!shouldLock(name)) {
119
+ debug('lock limit reached before job was returned. Releasing lock on [%s]', name);
120
+ job.attrs.lockedAt = null;
121
+ await self.saveJob(job);
122
+ return;
123
+ }
124
+ debug('[%s:%s] job locked while filling queue', name, job.attrs._id);
125
+ self._lockedJobs.push(job);
126
+ definitions[job.attrs.name].locked++;
127
+ enqueueJobs(job);
128
+ await jobQueueFilling(name);
129
+ jobProcessing();
130
+ }
131
+ }
132
+ catch (error) {
133
+ debug('[%s] job lock failed while filling queue', name, error);
134
+ }
135
+ finally {
136
+ self._isJobQueueFilling.delete(name);
137
+ }
138
+ }
139
+ function jobProcessing() {
140
+ if (jobQueue.length === 0) {
141
+ return;
142
+ }
143
+ const now = new Date();
144
+ const job = jobQueue.returnNextConcurrencyFreeJob(definitions);
145
+ debug('[%s:%s] about to process job', job.attrs.name, job.attrs._id);
146
+ if (!job.attrs.nextRunAt || job.attrs.nextRunAt <= now) {
147
+ debug('[%s:%s] nextRunAt is in the past, run the job immediately', job.attrs.name, job.attrs._id);
148
+ runOrRetry();
149
+ }
150
+ else {
151
+ const runIn = job.attrs.nextRunAt - now;
152
+ debug('[%s:%s] nextRunAt is in the future, calling setTimeout(%d)', job.attrs.name, job.attrs._id, runIn);
153
+ setTimeout(jobProcessing, runIn);
154
+ }
155
+ function runOrRetry() {
156
+ if (self._processInterval) {
157
+ const job = jobQueue.pop();
158
+ const jobDefinition = definitions[job.attrs.name];
159
+ if (jobDefinition.concurrency > jobDefinition.running && self._runningJobs.length < self._maxConcurrency) {
160
+ const lockDeadline = new Date(Date.now() - jobDefinition.lockLifetime);
161
+ if (!job.attrs.lockedAt || job.attrs.lockedAt < lockDeadline) {
162
+ debug('[%s:%s] job lock has expired, freeing it up', job.attrs.name, job.attrs._id);
163
+ self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
164
+ jobDefinition.locked--;
165
+ setImmediate(jobProcessing);
166
+ return;
167
+ }
168
+ self._runningJobs.push(job);
169
+ jobDefinition.running++;
170
+ debug('[%s:%s] processing job', job.attrs.name, job.attrs._id);
171
+ job
172
+ .run()
173
+ .then((job) => processJobResult(job))
174
+ .catch((error) => {
175
+ return job.pulse.emit('error', error);
176
+ });
177
+ }
178
+ else {
179
+ debug('[%s:%s] concurrency preventing immediate run, pushing job to top of queue', job.attrs.name, job.attrs._id);
180
+ enqueueJobs(job);
181
+ }
182
+ }
183
+ }
184
+ }
185
+ function processJobResult(job) {
186
+ const { name } = job.attrs;
187
+ if (!self._runningJobs.includes(job)) {
188
+ debug('[%s] callback was called, job must have been marked as complete already', job.attrs._id);
189
+ throw new error_1.JobError(`callback already called - job ${name} already marked complete`);
190
+ }
191
+ self._runningJobs.splice(self._runningJobs.indexOf(job), 1);
192
+ if (definitions[name].running > 0) {
193
+ definitions[name].running--;
194
+ }
195
+ self._lockedJobs.splice(self._lockedJobs.indexOf(job), 1);
196
+ if (definitions[name].locked > 0) {
197
+ definitions[name].locked--;
198
+ }
199
+ jobProcessing();
200
+ }
201
+ };
202
+ exports.processJobs = processJobs;
203
+ //# sourceMappingURL=process-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-jobs.js","sourceRoot":"","sources":["../../src/utils/process-jobs.ts"],"names":[],"mappings":"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"}