@n8n/scheduler 0.1.0 → 0.2.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_EE.md +27 -0
- package/README.md +2 -2
- package/dist/build.tsbuildinfo +1 -1
- package/dist/core/enums.d.ts +1 -0
- package/dist/core/enums.js +10 -0
- package/dist/core/enums.js.map +1 -0
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.js +25 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.js +24 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/materializer/index.d.ts +4 -0
- package/dist/core/materializer/index.js +10 -0
- package/dist/core/materializer/index.js.map +1 -0
- package/dist/core/materializer/materialize.d.ts +11 -0
- package/dist/core/materializer/materialize.js +49 -0
- package/dist/core/materializer/materialize.js.map +1 -0
- package/dist/core/materializer/options.d.ts +7 -0
- package/dist/core/materializer/options.js +11 -0
- package/dist/core/materializer/options.js.map +1 -0
- package/dist/core/materializer/plan.d.ts +10 -0
- package/dist/core/materializer/plan.js +22 -0
- package/dist/core/materializer/plan.js.map +1 -0
- package/dist/core/materializer/transaction.d.ts +16 -0
- package/dist/core/materializer/transaction.js +3 -0
- package/dist/core/materializer/transaction.js.map +1 -0
- package/dist/core/recurrence/next-run.js.map +1 -0
- package/dist/core/recurrence/validate.js.map +1 -0
- package/dist/core/retention/index.d.ts +3 -0
- package/dist/core/retention/index.js +8 -0
- package/dist/core/retention/index.js.map +1 -0
- package/dist/core/retention/options.d.ts +7 -0
- package/dist/core/retention/options.js +11 -0
- package/dist/core/retention/options.js.map +1 -0
- package/dist/core/retention/prune.d.ts +7 -0
- package/dist/core/retention/prune.js +61 -0
- package/dist/core/retention/prune.js.map +1 -0
- package/dist/core/retention/store.d.ts +9 -0
- package/dist/{storage/storage.js → core/retention/store.js} +1 -1
- package/dist/core/retention/store.js.map +1 -0
- package/dist/core/types/index.d.ts +2 -0
- package/dist/core/types/index.js +3 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/{types → core/types}/schedule.d.ts +3 -2
- package/dist/core/types/schedule.js +3 -0
- package/dist/core/types/schedule.js.map +1 -0
- package/dist/core/types/task.d.ts +18 -0
- package/dist/core/types/task.js +3 -0
- package/dist/core/types/task.js.map +1 -0
- package/dist/executor/backoff.d.ts +6 -0
- package/dist/executor/backoff.js +15 -0
- package/dist/executor/backoff.js.map +1 -0
- package/dist/executor/executor.d.ts +23 -0
- package/dist/executor/executor.js +133 -0
- package/dist/executor/executor.js.map +1 -0
- package/dist/executor/precision-timer.d.ts +13 -0
- package/dist/executor/precision-timer.js +35 -0
- package/dist/executor/precision-timer.js.map +1 -0
- package/dist/executor/task-handler.d.ts +10 -0
- package/dist/executor/task-handler.js +23 -0
- package/dist/executor/task-handler.js.map +1 -0
- package/dist/index.d.ts +1 -6
- package/dist/index.js +15 -10
- package/dist/index.js.map +1 -1
- package/dist/reaper/reaper.d.ts +27 -0
- package/dist/reaper/reaper.js +37 -0
- package/dist/reaper/reaper.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.js +12 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/mappers.d.ts +6 -0
- package/dist/storage/mappers.js +72 -0
- package/dist/storage/mappers.js.map +1 -0
- package/dist/storage/materializer-store.d.ts +14 -0
- package/dist/storage/materializer-store.js +83 -0
- package/dist/storage/materializer-store.js.map +1 -0
- package/dist/storage/scheduler.service.d.ts +16 -0
- package/dist/storage/scheduler.service.js +70 -0
- package/dist/storage/scheduler.service.js.map +1 -0
- package/package.json +41 -6
- package/dist/errors.d.ts +0 -3
- package/dist/errors.js +0 -11
- package/dist/errors.js.map +0 -1
- package/dist/recurrence/next-run.js.map +0 -1
- package/dist/recurrence/validate.js.map +0 -1
- package/dist/storage/storage.d.ts +0 -6
- package/dist/storage/storage.js.map +0 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.js +0 -19
- package/dist/types/index.js.map +0 -1
- package/dist/types/schedule.js +0 -5
- package/dist/types/schedule.js.map +0 -1
- package/dist/types/task.d.ts +0 -13
- package/dist/types/task.js +0 -12
- package/dist/types/task.js.map +0 -1
- /package/dist/{recurrence → core/recurrence}/next-run.d.ts +0 -0
- /package/dist/{recurrence → core/recurrence}/next-run.js +0 -0
- /package/dist/{recurrence → core/recurrence}/validate.d.ts +0 -0
- /package/dist/{recurrence → core/recurrence}/validate.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ScheduledJobKind, ScheduledJobKindList, ScheduledTaskStatus, ScheduledTaskStatusList, type TerminalTaskStatus, TerminalTaskStatusList, } from '@n8n/db';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TerminalTaskStatusList = exports.ScheduledTaskStatusList = exports.ScheduledTaskStatus = exports.ScheduledJobKindList = exports.ScheduledJobKind = void 0;
|
|
4
|
+
var db_1 = require("@n8n/db");
|
|
5
|
+
Object.defineProperty(exports, "ScheduledJobKind", { enumerable: true, get: function () { return db_1.ScheduledJobKind; } });
|
|
6
|
+
Object.defineProperty(exports, "ScheduledJobKindList", { enumerable: true, get: function () { return db_1.ScheduledJobKindList; } });
|
|
7
|
+
Object.defineProperty(exports, "ScheduledTaskStatus", { enumerable: true, get: function () { return db_1.ScheduledTaskStatus; } });
|
|
8
|
+
Object.defineProperty(exports, "ScheduledTaskStatusList", { enumerable: true, get: function () { return db_1.ScheduledTaskStatusList; } });
|
|
9
|
+
Object.defineProperty(exports, "TerminalTaskStatusList", { enumerable: true, get: function () { return db_1.TerminalTaskStatusList; } });
|
|
10
|
+
//# sourceMappingURL=enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../src/core/enums.ts"],"names":[],"mappings":";;;AAIA,8BAOiB;AANhB,sGAAA,gBAAgB,OAAA;AAChB,0GAAA,oBAAoB,OAAA;AACpB,yGAAA,mBAAmB,OAAA;AACnB,6GAAA,uBAAuB,OAAA;AAEvB,4GAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class InvalidScheduleError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class InvalidRetentionOptionsError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class CorruptStorageRowError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CorruptStorageRowError = exports.InvalidRetentionOptionsError = exports.InvalidScheduleError = void 0;
|
|
4
|
+
class InvalidScheduleError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'InvalidScheduleError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.InvalidScheduleError = InvalidScheduleError;
|
|
11
|
+
class InvalidRetentionOptionsError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'InvalidRetentionOptionsError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.InvalidRetentionOptionsError = InvalidRetentionOptionsError;
|
|
18
|
+
class CorruptStorageRowError extends Error {
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'CorruptStorageRowError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.CorruptStorageRowError = CorruptStorageRowError;
|
|
25
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":";;;AAQA,MAAa,oBAAqB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACpC,CAAC;CACD;AALD,oDAKC;AAMD,MAAa,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC5C,CAAC;CACD;AALD,oEAKC;AAOD,MAAa,sBAAuB,SAAQ,KAAK;IAChD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACtC,CAAC;CACD;AALD,wDAKC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { ScheduledJobKind, ScheduledJobKindList, ScheduledTaskStatus, ScheduledTaskStatusList, type TerminalTaskStatus, TerminalTaskStatusList, } from './enums';
|
|
2
|
+
export type { CronSchedule, IntervalSchedule, OneOffSchedule, Schedule, ScheduledJob, ScheduledTask, } from './types';
|
|
3
|
+
export { InvalidScheduleError, InvalidRetentionOptionsError, CorruptStorageRowError, } from './errors';
|
|
4
|
+
export { computeNextRunAt } from './recurrence/next-run';
|
|
5
|
+
export { validateSchedule } from './recurrence/validate';
|
|
6
|
+
export { materialize, DEFAULT_MATERIALIZER_OPTIONS } from './materializer';
|
|
7
|
+
export type { MaterializerSummary, MaterializerOptions, OnJobPlanError, } from './materializer';
|
|
8
|
+
export type { DueJobs, PlannedJob, RunInTransaction, MaterializerTransaction, } from './materializer';
|
|
9
|
+
export { prune, DEFAULT_RETENTION_OPTIONS } from './retention';
|
|
10
|
+
export type { RetentionSummary, RetentionOptions, RetentionBatch, RetentionStore, } from './retention';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RETENTION_OPTIONS = exports.prune = exports.DEFAULT_MATERIALIZER_OPTIONS = exports.materialize = exports.validateSchedule = exports.computeNextRunAt = exports.CorruptStorageRowError = exports.InvalidRetentionOptionsError = exports.InvalidScheduleError = exports.TerminalTaskStatusList = exports.ScheduledTaskStatusList = exports.ScheduledTaskStatus = exports.ScheduledJobKindList = exports.ScheduledJobKind = void 0;
|
|
4
|
+
var enums_1 = require("./enums");
|
|
5
|
+
Object.defineProperty(exports, "ScheduledJobKind", { enumerable: true, get: function () { return enums_1.ScheduledJobKind; } });
|
|
6
|
+
Object.defineProperty(exports, "ScheduledJobKindList", { enumerable: true, get: function () { return enums_1.ScheduledJobKindList; } });
|
|
7
|
+
Object.defineProperty(exports, "ScheduledTaskStatus", { enumerable: true, get: function () { return enums_1.ScheduledTaskStatus; } });
|
|
8
|
+
Object.defineProperty(exports, "ScheduledTaskStatusList", { enumerable: true, get: function () { return enums_1.ScheduledTaskStatusList; } });
|
|
9
|
+
Object.defineProperty(exports, "TerminalTaskStatusList", { enumerable: true, get: function () { return enums_1.TerminalTaskStatusList; } });
|
|
10
|
+
var errors_1 = require("./errors");
|
|
11
|
+
Object.defineProperty(exports, "InvalidScheduleError", { enumerable: true, get: function () { return errors_1.InvalidScheduleError; } });
|
|
12
|
+
Object.defineProperty(exports, "InvalidRetentionOptionsError", { enumerable: true, get: function () { return errors_1.InvalidRetentionOptionsError; } });
|
|
13
|
+
Object.defineProperty(exports, "CorruptStorageRowError", { enumerable: true, get: function () { return errors_1.CorruptStorageRowError; } });
|
|
14
|
+
var next_run_1 = require("./recurrence/next-run");
|
|
15
|
+
Object.defineProperty(exports, "computeNextRunAt", { enumerable: true, get: function () { return next_run_1.computeNextRunAt; } });
|
|
16
|
+
var validate_1 = require("./recurrence/validate");
|
|
17
|
+
Object.defineProperty(exports, "validateSchedule", { enumerable: true, get: function () { return validate_1.validateSchedule; } });
|
|
18
|
+
var materializer_1 = require("./materializer");
|
|
19
|
+
Object.defineProperty(exports, "materialize", { enumerable: true, get: function () { return materializer_1.materialize; } });
|
|
20
|
+
Object.defineProperty(exports, "DEFAULT_MATERIALIZER_OPTIONS", { enumerable: true, get: function () { return materializer_1.DEFAULT_MATERIALIZER_OPTIONS; } });
|
|
21
|
+
var retention_1 = require("./retention");
|
|
22
|
+
Object.defineProperty(exports, "prune", { enumerable: true, get: function () { return retention_1.prune; } });
|
|
23
|
+
Object.defineProperty(exports, "DEFAULT_RETENTION_OPTIONS", { enumerable: true, get: function () { return retention_1.DEFAULT_RETENTION_OPTIONS; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAqBA,iCAOiB;AANhB,yGAAA,gBAAgB,OAAA;AAChB,6GAAA,oBAAoB,OAAA;AACpB,4GAAA,mBAAmB,OAAA;AACnB,gHAAA,uBAAuB,OAAA;AAEvB,+GAAA,sBAAsB,OAAA;AAYvB,mCAIkB;AAHjB,8GAAA,oBAAoB,OAAA;AACpB,sHAAA,4BAA4B,OAAA;AAC5B,gHAAA,sBAAsB,OAAA;AAGvB,kDAAyD;AAAhD,4GAAA,gBAAgB,OAAA;AACzB,kDAAyD;AAAhD,4GAAA,gBAAgB,OAAA;AAEzB,+CAA2E;AAAlE,2GAAA,WAAW,OAAA;AAAE,4HAAA,4BAA4B,OAAA;AAclD,yCAA+D;AAAtD,kGAAA,KAAK,OAAA;AAAE,sHAAA,yBAAyB,OAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { materialize, type MaterializerSummary, type MaterializerOptions, type OnJobPlanError, } from './materialize';
|
|
2
|
+
export { DEFAULT_MATERIALIZER_OPTIONS } from './options';
|
|
3
|
+
export { planOccurrences, type OccurrencePlan } from './plan';
|
|
4
|
+
export type { DueJobs, PlannedJob, RunInTransaction, MaterializerTransaction } from './transaction';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.planOccurrences = exports.DEFAULT_MATERIALIZER_OPTIONS = exports.materialize = void 0;
|
|
4
|
+
var materialize_1 = require("./materialize");
|
|
5
|
+
Object.defineProperty(exports, "materialize", { enumerable: true, get: function () { return materialize_1.materialize; } });
|
|
6
|
+
var options_1 = require("./options");
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_MATERIALIZER_OPTIONS", { enumerable: true, get: function () { return options_1.DEFAULT_MATERIALIZER_OPTIONS; } });
|
|
8
|
+
var plan_1 = require("./plan");
|
|
9
|
+
Object.defineProperty(exports, "planOccurrences", { enumerable: true, get: function () { return plan_1.planOccurrences; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/materializer/index.ts"],"names":[],"mappings":";;;AAAA,6CAKuB;AAJtB,0GAAA,WAAW,OAAA;AAKZ,qCAAyD;AAAhD,uHAAA,4BAA4B,OAAA;AACrC,+BAA8D;AAArD,uGAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ScheduledJob } from '../types';
|
|
2
|
+
import { type MaterializerOptions } from './options';
|
|
3
|
+
import type { RunInTransaction } from './transaction';
|
|
4
|
+
export type { MaterializerOptions } from './options';
|
|
5
|
+
export interface MaterializerSummary {
|
|
6
|
+
claimedJobs: number;
|
|
7
|
+
occurrences: number;
|
|
8
|
+
deferredJobs: number;
|
|
9
|
+
}
|
|
10
|
+
export type OnJobPlanError = (job: ScheduledJob, error: unknown) => void;
|
|
11
|
+
export declare function materialize(runInTransaction: RunInTransaction, options?: MaterializerOptions, onPlanError?: OnJobPlanError): Promise<MaterializerSummary>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.materialize = materialize;
|
|
4
|
+
const constants_1 = require("@n8n/constants");
|
|
5
|
+
const options_1 = require("./options");
|
|
6
|
+
const plan_1 = require("./plan");
|
|
7
|
+
async function materialize(runInTransaction, options = options_1.DEFAULT_MATERIALIZER_OPTIONS, onPlanError) {
|
|
8
|
+
return await runInTransaction(async (tx) => {
|
|
9
|
+
const claimed = await tx.claimDueJobs(options.batchSize);
|
|
10
|
+
if (claimed === undefined) {
|
|
11
|
+
return { claimedJobs: 0, occurrences: 0, deferredJobs: 0 };
|
|
12
|
+
}
|
|
13
|
+
const { occurrencesPlanned, numberOfJobsDeferred } = planOrDeferJobs(claimed, options, onPlanError);
|
|
14
|
+
const occurrences = await tx.recordOccurrences(occurrencesPlanned);
|
|
15
|
+
await tx.advanceJobs(occurrencesPlanned);
|
|
16
|
+
return {
|
|
17
|
+
claimedJobs: claimed.jobs.length,
|
|
18
|
+
occurrences,
|
|
19
|
+
deferredJobs: numberOfJobsDeferred,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function planOrDeferJobs(dueJobs, options, onPlanError) {
|
|
24
|
+
const plans = dueJobs.jobs.map((job) => planOrDeferJob(job, dueJobs.now, options, onPlanError));
|
|
25
|
+
return {
|
|
26
|
+
occurrencesPlanned: plans.map(({ plannedJob }) => plannedJob),
|
|
27
|
+
numberOfJobsDeferred: plans.filter(({ deferred }) => deferred).length,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function planOrDeferJob(job, now, options, onPlanError) {
|
|
31
|
+
try {
|
|
32
|
+
return {
|
|
33
|
+
plannedJob: { job, plan: (0, plan_1.planOccurrences)(job, now, options) },
|
|
34
|
+
deferred: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
onPlanError?.(job, error);
|
|
39
|
+
const retryAt = new Date(now.getTime() + options.planRetrySeconds * constants_1.Time.seconds.toMilliseconds);
|
|
40
|
+
return {
|
|
41
|
+
plannedJob: {
|
|
42
|
+
job,
|
|
43
|
+
plan: { occurrences: [], nextRunAt: retryAt, lastFiredAt: job.lastFiredAt },
|
|
44
|
+
},
|
|
45
|
+
deferred: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=materialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../../src/core/materializer/materialize.ts"],"names":[],"mappings":";;AAqDA,kCAwBC;AA7ED,8CAAsC;AAGtC,uCAAmF;AACnF,iCAAyC;AAiDlC,KAAK,UAAU,WAAW,CAChC,gBAAkC,EAClC,UAA+B,sCAA4B,EAC3D,WAA4B;IAE5B,OAAO,MAAM,gBAAgB,CAAsB,KAAK,EAAE,EAAE,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,GAAG,eAAe,CACnE,OAAO,EACP,OAAO,EACP,WAAW,CACX,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAEzC,OAAO;YACN,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;YAChC,WAAW;YACX,YAAY,EAAE,oBAAoB;SAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACvB,OAAgB,EAChB,OAA4B,EAC5B,WAA4B;IAK5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAChG,OAAO;QACN,kBAAkB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC;QAC7D,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,MAAM;KACrE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACtB,GAAiB,EACjB,GAAS,EACT,OAA4B,EAC5B,WAA4B;IAK5B,IAAI,CAAC;QACJ,OAAO;YACN,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAA,sBAAe,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;YAC7D,QAAQ,EAAE,KAAK;SACf,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAO1B,MAAM,OAAO,GAAG,IAAI,IAAI,CACvB,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,gBAAgB,GAAG,gBAAI,CAAC,OAAO,CAAC,cAAc,CACtE,CAAC;QACF,OAAO;YACN,UAAU,EAAE;gBACX,GAAG;gBACH,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;aAC3E;YACD,QAAQ,EAAE,IAAI;SACd,CAAC;IACH,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MATERIALIZER_OPTIONS = void 0;
|
|
4
|
+
const constants_1 = require("@n8n/constants");
|
|
5
|
+
exports.DEFAULT_MATERIALIZER_OPTIONS = {
|
|
6
|
+
windowSeconds: 60,
|
|
7
|
+
batchSize: 100,
|
|
8
|
+
maxPerJob: 1000,
|
|
9
|
+
planRetrySeconds: constants_1.Time.hours.toSeconds,
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/core/materializer/options.ts"],"names":[],"mappings":";;;AAAA,8CAAsC;AA+BzB,QAAA,4BAA4B,GAAwB;IAChE,aAAa,EAAE,EAAE;IACjB,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,IAAI;IACf,gBAAgB,EAAE,gBAAI,CAAC,KAAK,CAAC,SAAS;CACtC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScheduledJob } from '../types';
|
|
2
|
+
export interface OccurrencePlan {
|
|
3
|
+
occurrences: Date[];
|
|
4
|
+
nextRunAt: Date | null;
|
|
5
|
+
lastFiredAt: Date | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function planOccurrences(job: ScheduledJob, now: Date, options: {
|
|
8
|
+
windowSeconds: number;
|
|
9
|
+
maxPerJob: number;
|
|
10
|
+
}): OccurrencePlan;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.planOccurrences = planOccurrences;
|
|
4
|
+
const constants_1 = require("@n8n/constants");
|
|
5
|
+
const next_run_1 = require("../recurrence/next-run");
|
|
6
|
+
function planOccurrences(job, now, options) {
|
|
7
|
+
const windowEnd = now.getTime() + options.windowSeconds * constants_1.Time.seconds.toMilliseconds;
|
|
8
|
+
const occurrences = [];
|
|
9
|
+
let cursor = job.nextRunAt;
|
|
10
|
+
while (cursor !== null &&
|
|
11
|
+
cursor.getTime() <= windowEnd &&
|
|
12
|
+
occurrences.length < options.maxPerJob) {
|
|
13
|
+
occurrences.push(cursor);
|
|
14
|
+
cursor = (0, next_run_1.computeNextRunAt)(job.schedule, cursor);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
occurrences,
|
|
18
|
+
nextRunAt: cursor,
|
|
19
|
+
lastFiredAt: occurrences.at(-1) ?? job.lastFiredAt,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/core/materializer/plan.ts"],"names":[],"mappings":";;AA+BA,0CAuBC;AAtDD,8CAAsC;AAEtC,qDAA0D;AA6B1D,SAAgB,eAAe,CAC9B,GAAiB,EACjB,GAAS,EACT,OAAqD;IAErD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,GAAG,gBAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAEtF,MAAM,WAAW,GAAW,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;IAC3B,OACC,MAAM,KAAK,IAAI;QACf,MAAM,CAAC,OAAO,EAAE,IAAI,SAAS;QAC7B,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,EACrC,CAAC;QACF,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,GAAG,IAAA,2BAAgB,EAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACN,WAAW;QACX,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW;KAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { OccurrencePlan } from './plan';
|
|
2
|
+
import type { ScheduledJob } from '../types';
|
|
3
|
+
export interface PlannedJob {
|
|
4
|
+
job: ScheduledJob;
|
|
5
|
+
plan: OccurrencePlan;
|
|
6
|
+
}
|
|
7
|
+
export interface DueJobs {
|
|
8
|
+
now: Date;
|
|
9
|
+
jobs: ScheduledJob[];
|
|
10
|
+
}
|
|
11
|
+
export interface MaterializerTransaction {
|
|
12
|
+
claimDueJobs(limit: number): Promise<DueJobs | undefined>;
|
|
13
|
+
recordOccurrences(planned: PlannedJob[]): Promise<number>;
|
|
14
|
+
advanceJobs(planned: PlannedJob[]): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export type RunInTransaction = <T>(work: (tx: MaterializerTransaction) => Promise<T>) => Promise<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/core/materializer/transaction.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-run.js","sourceRoot":"","sources":["../../../src/core/recurrence/next-run.ts"],"names":[],"mappings":";;AAwDA,4CAsBC;AA9ED,6CAAmD;AAEnD,sCAAiD;AAEjD,yCAA8C;AAE9C,MAAM,aAAa,GAAG,IAAI,CAAC;AAU3B,SAAS,WAAW,CAAC,QAAsB,EAAE,KAAW,EAAE,QAAgB;IACzE,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,kCAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE;YAC9D,WAAW,EAAE,KAAK;YAClB,EAAE,EAAE,QAAQ;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,6BAAoB,CAC7B,sCAAsC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAM,KAAe,CAAC,OAAO,EAAE,CACpJ,CAAC;IACH,CAAC;AACF,CAAC;AAOD,SAAS,eAAe,CAAC,QAA0B,EAAE,KAAW;IAC/D,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC;AAC7E,CAAC;AAGD,SAAS,aAAa,CAAC,QAAwB,EAAE,KAAW;IAC3D,OAAO,KAAK,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAcD,SAAgB,gBAAgB,CAAC,QAAkB,EAAE,KAAW;IAC/D,IAAA,2BAAgB,EAAC,QAAQ,CAAC,CAAC;IAE3B,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM;YACV,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAChC,MAAM,IAAI,6BAAoB,CAC7B,2FAA2F,CAC3F,CAAC;YACH,CAAC;YACD,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxD,KAAK,UAAU;YACd,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzC,KAAK,SAAS;YACb,OAAO,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,UAAU,GAAU,QAAQ,CAAC;YACnC,MAAM,IAAI,6BAAoB,CAC7B,0BAA0B,IAAI,CAAC,SAAS,CAAE,UAAuB,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/core/recurrence/validate.ts"],"names":[],"mappings":";;AA8DA,4CAeC;AA7ED,6CAAmD;AACnD,iCAAiC;AAEjC,sCAAiD;AAIjD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,SAAS,YAAY,CAAC,QAAsB;IAG3C,MAAM,UAAU,GAAY,QAAQ,CAAC,cAAc,CAAC;IACpD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,6BAAoB,CAC7B,6CAA6C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACzE,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACzD,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;QACrC,MAAM,IAAI,6BAAoB,CAC7B,6BAA6B,gBAAgB,mCAAmC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAC3H,CAAC;IACH,CAAC;IAGD,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,gBAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,6BAAoB,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,IAAI,CAAC;QACJ,kCAAoB,CAAC,KAAK,CAAC,UAAU,EAAE;YACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,IAAI,KAAK;SAC9B,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,6BAAoB,CAC7B,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAM,KAAe,CAAC,OAAO,EAAE,CACpF,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA0B;IACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,6BAAoB,CAC7B,4DAA4D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CACtG,CAAC;IACH,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB;IAC/C,MAAM,MAAM,GAAY,QAAQ,CAAC,MAAM,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,6BAAoB,CAAC,qCAAqC,CAAC,CAAC;IACvE,CAAC;AACF,CAAC;AAOD,SAAgB,gBAAgB,CAAC,QAAkB;IAClD,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM;YACV,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC/B,KAAK,UAAU;YACd,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACnC,KAAK,SAAS;YACb,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,UAAU,GAAU,QAAQ,CAAC;YACnC,MAAM,IAAI,6BAAoB,CAC7B,0BAA0B,IAAI,CAAC,SAAS,CAAE,UAAuB,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RETENTION_OPTIONS = exports.prune = void 0;
|
|
4
|
+
var prune_1 = require("./prune");
|
|
5
|
+
Object.defineProperty(exports, "prune", { enumerable: true, get: function () { return prune_1.prune; } });
|
|
6
|
+
var options_1 = require("./options");
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_RETENTION_OPTIONS", { enumerable: true, get: function () { return options_1.DEFAULT_RETENTION_OPTIONS; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/retention/index.ts"],"names":[],"mappings":";;;AAAA,iCAAuD;AAA9C,8FAAA,KAAK,OAAA;AACd,qCAA6E;AAApE,oHAAA,yBAAyB,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RETENTION_OPTIONS = void 0;
|
|
4
|
+
const constants_1 = require("@n8n/constants");
|
|
5
|
+
exports.DEFAULT_RETENTION_OPTIONS = {
|
|
6
|
+
retentionSeconds: constants_1.Time.days.toSeconds,
|
|
7
|
+
failedRetentionSeconds: 7 * constants_1.Time.days.toSeconds,
|
|
8
|
+
batchSize: 1000,
|
|
9
|
+
maxBatchesPerPass: 1000,
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/core/retention/options.ts"],"names":[],"mappings":";;;AAAA,8CAAsC;AAgCzB,QAAA,yBAAyB,GAAqB;IAC1D,gBAAgB,EAAE,gBAAI,CAAC,IAAI,CAAC,SAAS;IACrC,sBAAsB,EAAE,CAAC,GAAG,gBAAI,CAAC,IAAI,CAAC,SAAS;IAC/C,SAAS,EAAE,IAAI;IACf,iBAAiB,EAAE,IAAI;CACvB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type RetentionOptions } from './options';
|
|
2
|
+
import type { RetentionStore } from './store';
|
|
3
|
+
export interface RetentionSummary {
|
|
4
|
+
deleted: number;
|
|
5
|
+
drained: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function prune(store: RetentionStore, options?: RetentionOptions): Promise<RetentionSummary>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prune = prune;
|
|
4
|
+
const constants_1 = require("@n8n/constants");
|
|
5
|
+
const enums_1 = require("../enums");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const options_1 = require("./options");
|
|
8
|
+
function retentionWindows(options) {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
statuses: [enums_1.ScheduledTaskStatus.Succeeded, enums_1.ScheduledTaskStatus.Cancelled],
|
|
12
|
+
olderThanSeconds: options.retentionSeconds,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
statuses: [enums_1.ScheduledTaskStatus.Failed, enums_1.ScheduledTaskStatus.Missed],
|
|
16
|
+
olderThanSeconds: options.failedRetentionSeconds,
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
async function prune(store, options = options_1.DEFAULT_RETENTION_OPTIONS) {
|
|
21
|
+
if (!Number.isInteger(options.batchSize) || options.batchSize <= 0) {
|
|
22
|
+
throw new errors_1.InvalidRetentionOptionsError(`batchSize must be a positive integer, got ${options.batchSize}`);
|
|
23
|
+
}
|
|
24
|
+
const { deleted, drained } = await pruneWindows(store, retentionWindows(options), options, {
|
|
25
|
+
deleted: 0,
|
|
26
|
+
budget: options.maxBatchesPerPass,
|
|
27
|
+
drained: true,
|
|
28
|
+
});
|
|
29
|
+
return { deleted, drained };
|
|
30
|
+
}
|
|
31
|
+
async function pruneWindows(store, windows, options, state) {
|
|
32
|
+
const [window, ...rest] = windows;
|
|
33
|
+
if (window === undefined) {
|
|
34
|
+
return state;
|
|
35
|
+
}
|
|
36
|
+
const windowBudget = state.budget <= 0 ? 0 : Math.max(state.budget - rest.length, 1);
|
|
37
|
+
const pruned = await pruneWindow(store, window, options.batchSize, windowBudget);
|
|
38
|
+
return await pruneWindows(store, rest, options, {
|
|
39
|
+
deleted: state.deleted + pruned.deleted,
|
|
40
|
+
budget: state.budget - pruned.batches,
|
|
41
|
+
drained: state.drained && pruned.drained,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function pruneWindow(store, window, batchSize, budget) {
|
|
45
|
+
let deleted = 0;
|
|
46
|
+
let batches = 0;
|
|
47
|
+
while (batches < budget) {
|
|
48
|
+
const affected = await store.deleteFinishedOlderThan({
|
|
49
|
+
statuses: window.statuses,
|
|
50
|
+
olderThanMs: window.olderThanSeconds * constants_1.Time.seconds.toMilliseconds,
|
|
51
|
+
limit: batchSize,
|
|
52
|
+
});
|
|
53
|
+
batches += 1;
|
|
54
|
+
deleted += affected;
|
|
55
|
+
if (affected < batchSize) {
|
|
56
|
+
return { deleted, batches, drained: true };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { deleted, batches, drained: false };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/core/retention/prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TerminalTaskStatus } from '../enums';
|
|
2
|
+
export interface RetentionBatch {
|
|
3
|
+
statuses: TerminalTaskStatus[];
|
|
4
|
+
olderThanMs: number;
|
|
5
|
+
limit: number;
|
|
6
|
+
}
|
|
7
|
+
export interface RetentionStore {
|
|
8
|
+
deleteFinishedOlderThan(batch: RetentionBatch): Promise<number>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/retention/store.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { CronExpression } from 'n8n-workflow';
|
|
2
|
-
export declare const ScheduleKindList: readonly ["cron", "interval", "one_off"];
|
|
3
|
-
export type ScheduleKind = (typeof ScheduleKindList)[number];
|
|
4
2
|
export interface CronSchedule {
|
|
5
3
|
kind: 'cron';
|
|
6
4
|
cronExpression: CronExpression;
|
|
@@ -17,8 +15,11 @@ export interface OneOffSchedule {
|
|
|
17
15
|
export type Schedule = CronSchedule | IntervalSchedule | OneOffSchedule;
|
|
18
16
|
export interface ScheduledJob {
|
|
19
17
|
id: string;
|
|
18
|
+
taskType: string;
|
|
19
|
+
payload: Record<string, unknown>;
|
|
20
20
|
schedule: Schedule;
|
|
21
21
|
enabled: boolean;
|
|
22
22
|
nextRunAt: Date | null;
|
|
23
23
|
lastFiredAt: Date | null;
|
|
24
|
+
maxAttempts: number;
|
|
24
25
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../../src/core/types/schedule.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ScheduledTaskStatus } from '../enums';
|
|
2
|
+
export interface ScheduledTask {
|
|
3
|
+
id: string;
|
|
4
|
+
jobId: string;
|
|
5
|
+
taskType: string;
|
|
6
|
+
payload: Record<string, unknown>;
|
|
7
|
+
scheduledFor: Date;
|
|
8
|
+
runAt: Date;
|
|
9
|
+
status: ScheduledTaskStatus;
|
|
10
|
+
attempts: number;
|
|
11
|
+
maxAttempts: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ClaimedTask extends ScheduledTask {
|
|
14
|
+
claimedBy: string;
|
|
15
|
+
leaseExpiresAt: Date;
|
|
16
|
+
leaseEpoch: number;
|
|
17
|
+
startedAt: Date | null;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/core/types/task.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.backoff = backoff;
|
|
4
|
+
const constants_1 = require("@n8n/constants");
|
|
5
|
+
const DEFAULT_BASE_MS = 5 * constants_1.Time.seconds.toMilliseconds;
|
|
6
|
+
const DEFAULT_FACTOR = 2;
|
|
7
|
+
const DEFAULT_MAX_MS = 5 * constants_1.Time.minutes.toMilliseconds;
|
|
8
|
+
function backoff(attempts, opts = {}) {
|
|
9
|
+
const { baseMs = DEFAULT_BASE_MS, factor = DEFAULT_FACTOR, maxMs = DEFAULT_MAX_MS } = opts;
|
|
10
|
+
if (attempts < 1)
|
|
11
|
+
return 0;
|
|
12
|
+
const raw = baseMs * factor ** (attempts - 1);
|
|
13
|
+
return Math.min(raw, maxMs);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/executor/backoff.ts"],"names":[],"mappings":";;AAuBA,0BAKC;AA5BD,8CAAsC;AAmBtC,MAAM,eAAe,GAAG,CAAC,GAAG,gBAAI,CAAC,OAAO,CAAC,cAAc,CAAC;AACxD,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,cAAc,GAAG,CAAC,GAAG,gBAAI,CAAC,OAAO,CAAC,cAAc,CAAC;AAEvD,SAAgB,OAAO,CAAC,QAAgB,EAAE,OAAuB,EAAE;IAClE,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE,KAAK,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC;IAC3F,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Logger } from '@n8n/backend-common';
|
|
2
|
+
import type { SchedulerConfig } from '@n8n/config';
|
|
3
|
+
import type { ScheduledTaskRepository } from '@n8n/db';
|
|
4
|
+
import type { PrecisionTimer } from './precision-timer';
|
|
5
|
+
import type { TaskHandlerRegistry } from './task-handler';
|
|
6
|
+
import type { ClaimedTask } from '../core/types';
|
|
7
|
+
export declare class Executor {
|
|
8
|
+
private readonly taskRepository;
|
|
9
|
+
private readonly registry;
|
|
10
|
+
private readonly timer;
|
|
11
|
+
private readonly leaseMs;
|
|
12
|
+
private readonly lookaheadMs;
|
|
13
|
+
private readonly batchSize;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly claimedTaskById;
|
|
16
|
+
constructor(taskRepository: ScheduledTaskRepository, registry: TaskHandlerRegistry, timer: PrecisionTimer, logger: Logger, config: SchedulerConfig);
|
|
17
|
+
claimAndSchedule(host: string): Promise<ClaimedTask[]>;
|
|
18
|
+
private scheduleClaimed;
|
|
19
|
+
fire(host: string, task: ClaimedTask): Promise<void>;
|
|
20
|
+
private releaseUnmappableRow;
|
|
21
|
+
private releaseClaimBestEffort;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
}
|