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.
- package/LICENSE +21 -0
- package/README.md +353 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/job/compute-next-run-at.d.ts +3 -0
- package/dist/job/compute-next-run-at.js +114 -0
- package/dist/job/compute-next-run-at.js.map +1 -0
- package/dist/job/disable.d.ts +3 -0
- package/dist/job/disable.js +9 -0
- package/dist/job/disable.js.map +1 -0
- package/dist/job/enable.d.ts +3 -0
- package/dist/job/enable.js +9 -0
- package/dist/job/enable.js.map +1 -0
- package/dist/job/fail.d.ts +3 -0
- package/dist/job/fail.js +28 -0
- package/dist/job/fail.js.map +1 -0
- package/dist/job/fetch-status.d.ts +10 -0
- package/dist/job/fetch-status.js +23 -0
- package/dist/job/fetch-status.js.map +1 -0
- package/dist/job/index.d.ts +89 -0
- package/dist/job/index.js +109 -0
- package/dist/job/index.js.map +1 -0
- package/dist/job/is-expired.d.ts +2 -0
- package/dist/job/is-expired.js +16 -0
- package/dist/job/is-expired.js.map +1 -0
- package/dist/job/is-running.d.ts +2 -0
- package/dist/job/is-running.js +21 -0
- package/dist/job/is-running.js.map +1 -0
- package/dist/job/priority.d.ts +3 -0
- package/dist/job/priority.js +10 -0
- package/dist/job/priority.js.map +1 -0
- package/dist/job/remove.d.ts +2 -0
- package/dist/job/remove.js +8 -0
- package/dist/job/remove.js.map +1 -0
- package/dist/job/repeat-at.d.ts +3 -0
- package/dist/job/repeat-at.js +9 -0
- package/dist/job/repeat-at.js.map +1 -0
- package/dist/job/repeat-every.d.ts +10 -0
- package/dist/job/repeat-every.js +21 -0
- package/dist/job/repeat-every.js.map +1 -0
- package/dist/job/run.d.ts +3 -0
- package/dist/job/run.js +92 -0
- package/dist/job/run.js.map +1 -0
- package/dist/job/save.d.ts +3 -0
- package/dist/job/save.js +8 -0
- package/dist/job/save.js.map +1 -0
- package/dist/job/schedule.d.ts +3 -0
- package/dist/job/schedule.js +12 -0
- package/dist/job/schedule.js.map +1 -0
- package/dist/job/set-shouldsaveresult.d.ts +3 -0
- package/dist/job/set-shouldsaveresult.js +9 -0
- package/dist/job/set-shouldsaveresult.js.map +1 -0
- package/dist/job/to-json.d.ts +3 -0
- package/dist/job/to-json.js +21 -0
- package/dist/job/to-json.js.map +1 -0
- package/dist/job/touch.d.ts +3 -0
- package/dist/job/touch.js +14 -0
- package/dist/job/touch.js.map +1 -0
- package/dist/job/unique.d.ts +6 -0
- package/dist/job/unique.js +10 -0
- package/dist/job/unique.js.map +1 -0
- package/dist/pulse/cancel.d.ts +3 -0
- package/dist/pulse/cancel.js +21 -0
- package/dist/pulse/cancel.js.map +1 -0
- package/dist/pulse/close.d.ts +5 -0
- package/dist/pulse/close.js +25 -0
- package/dist/pulse/close.js.map +1 -0
- package/dist/pulse/count-jobs.d.ts +5 -0
- package/dist/pulse/count-jobs.js +12 -0
- package/dist/pulse/count-jobs.js.map +1 -0
- package/dist/pulse/create.d.ts +3 -0
- package/dist/pulse/create.js +31 -0
- package/dist/pulse/create.js.map +1 -0
- package/dist/pulse/database.d.ts +4 -0
- package/dist/pulse/database.js +33 -0
- package/dist/pulse/database.js.map +1 -0
- package/dist/pulse/db-init.d.ts +3 -0
- package/dist/pulse/db-init.js +34 -0
- package/dist/pulse/db-init.js.map +1 -0
- package/dist/pulse/default-concurrency.d.ts +3 -0
- package/dist/pulse/default-concurrency.js +13 -0
- package/dist/pulse/default-concurrency.js.map +1 -0
- package/dist/pulse/default-lock-lifetime.d.ts +3 -0
- package/dist/pulse/default-lock-lifetime.js +13 -0
- package/dist/pulse/default-lock-lifetime.js.map +1 -0
- package/dist/pulse/default-lock-limit.d.ts +3 -0
- package/dist/pulse/default-lock-limit.js +13 -0
- package/dist/pulse/default-lock-limit.js.map +1 -0
- package/dist/pulse/define.d.ts +23 -0
- package/dist/pulse/define.js +34 -0
- package/dist/pulse/define.js.map +1 -0
- package/dist/pulse/disable.d.ts +3 -0
- package/dist/pulse/disable.js +22 -0
- package/dist/pulse/disable.js.map +1 -0
- package/dist/pulse/drain.d.ts +2 -0
- package/dist/pulse/drain.js +26 -0
- package/dist/pulse/drain.js.map +1 -0
- package/dist/pulse/enable.d.ts +3 -0
- package/dist/pulse/enable.js +22 -0
- package/dist/pulse/enable.js.map +1 -0
- package/dist/pulse/every.d.ts +4 -0
- package/dist/pulse/every.js +37 -0
- package/dist/pulse/every.js.map +1 -0
- package/dist/pulse/find-and-lock-next-job.d.ts +3 -0
- package/dist/pulse/find-and-lock-next-job.js +43 -0
- package/dist/pulse/find-and-lock-next-job.js.map +1 -0
- package/dist/pulse/has-mongo-protocol.d.ts +1 -0
- package/dist/pulse/has-mongo-protocol.js +8 -0
- package/dist/pulse/has-mongo-protocol.js.map +1 -0
- package/dist/pulse/index.d.ts +115 -0
- package/dist/pulse/index.js +208 -0
- package/dist/pulse/index.js.map +1 -0
- package/dist/pulse/job-processing-queue.d.ts +11 -0
- package/dist/pulse/job-processing-queue.js +51 -0
- package/dist/pulse/job-processing-queue.js.map +1 -0
- package/dist/pulse/jobs.d.ts +6 -0
- package/dist/pulse/jobs.js +14 -0
- package/dist/pulse/jobs.js.map +1 -0
- package/dist/pulse/lock-limit.d.ts +3 -0
- package/dist/pulse/lock-limit.js +13 -0
- package/dist/pulse/lock-limit.js.map +1 -0
- package/dist/pulse/max-concurrency.d.ts +3 -0
- package/dist/pulse/max-concurrency.js +13 -0
- package/dist/pulse/max-concurrency.js.map +1 -0
- package/dist/pulse/mongo.d.ts +4 -0
- package/dist/pulse/mongo.js +10 -0
- package/dist/pulse/mongo.js.map +1 -0
- package/dist/pulse/name.d.ts +3 -0
- package/dist/pulse/name.js +13 -0
- package/dist/pulse/name.js.map +1 -0
- package/dist/pulse/now.d.ts +3 -0
- package/dist/pulse/now.js +21 -0
- package/dist/pulse/now.js.map +1 -0
- package/dist/pulse/process-every.d.ts +3 -0
- package/dist/pulse/process-every.js +14 -0
- package/dist/pulse/process-every.js.map +1 -0
- package/dist/pulse/purge.d.ts +2 -0
- package/dist/pulse/purge.js +13 -0
- package/dist/pulse/purge.js.map +1 -0
- package/dist/pulse/resume-on-restart.d.ts +3 -0
- package/dist/pulse/resume-on-restart.js +39 -0
- package/dist/pulse/resume-on-restart.js.map +1 -0
- package/dist/pulse/save-job.d.ts +4 -0
- package/dist/pulse/save-job.js +104 -0
- package/dist/pulse/save-job.js.map +1 -0
- package/dist/pulse/schedule.d.ts +4 -0
- package/dist/pulse/schedule.js +36 -0
- package/dist/pulse/schedule.js.map +1 -0
- package/dist/pulse/sort.d.ts +3 -0
- package/dist/pulse/sort.js +13 -0
- package/dist/pulse/sort.js.map +1 -0
- package/dist/pulse/start.d.ts +2 -0
- package/dist/pulse/start.js +19 -0
- package/dist/pulse/start.js.map +1 -0
- package/dist/pulse/stop.d.ts +2 -0
- package/dist/pulse/stop.js +38 -0
- package/dist/pulse/stop.js.map +1 -0
- package/dist/utils/create-job.d.ts +3 -0
- package/dist/utils/create-job.js +10 -0
- package/dist/utils/create-job.js.map +1 -0
- package/dist/utils/error.d.ts +12 -0
- package/dist/utils/error.js +34 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/parse-priority.d.ts +1 -0
- package/dist/utils/parse-priority.js +31 -0
- package/dist/utils/parse-priority.js.map +1 -0
- package/dist/utils/process-jobs.d.ts +3 -0
- package/dist/utils/process-jobs.js +203 -0
- package/dist/utils/process-jobs.js.map +1 -0
- 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,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,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,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,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,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,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,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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"}
|