@n8n/scheduler 0.1.0 → 0.2.1

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 (100) hide show
  1. package/LICENSE_EE.md +27 -0
  2. package/README.md +2 -2
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/core/enums.d.ts +1 -0
  5. package/dist/core/enums.js +10 -0
  6. package/dist/core/enums.js.map +1 -0
  7. package/dist/core/errors.d.ts +9 -0
  8. package/dist/core/errors.js +25 -0
  9. package/dist/core/errors.js.map +1 -0
  10. package/dist/core/index.d.ts +10 -0
  11. package/dist/core/index.js +24 -0
  12. package/dist/core/index.js.map +1 -0
  13. package/dist/core/materializer/index.d.ts +4 -0
  14. package/dist/core/materializer/index.js +10 -0
  15. package/dist/core/materializer/index.js.map +1 -0
  16. package/dist/core/materializer/materialize.d.ts +11 -0
  17. package/dist/core/materializer/materialize.js +49 -0
  18. package/dist/core/materializer/materialize.js.map +1 -0
  19. package/dist/core/materializer/options.d.ts +7 -0
  20. package/dist/core/materializer/options.js +11 -0
  21. package/dist/core/materializer/options.js.map +1 -0
  22. package/dist/core/materializer/plan.d.ts +10 -0
  23. package/dist/core/materializer/plan.js +22 -0
  24. package/dist/core/materializer/plan.js.map +1 -0
  25. package/dist/core/materializer/transaction.d.ts +16 -0
  26. package/dist/core/materializer/transaction.js +3 -0
  27. package/dist/core/materializer/transaction.js.map +1 -0
  28. package/dist/core/recurrence/next-run.js.map +1 -0
  29. package/dist/core/recurrence/validate.js.map +1 -0
  30. package/dist/core/retention/index.d.ts +3 -0
  31. package/dist/core/retention/index.js +8 -0
  32. package/dist/core/retention/index.js.map +1 -0
  33. package/dist/core/retention/options.d.ts +7 -0
  34. package/dist/core/retention/options.js +11 -0
  35. package/dist/core/retention/options.js.map +1 -0
  36. package/dist/core/retention/prune.d.ts +7 -0
  37. package/dist/core/retention/prune.js +61 -0
  38. package/dist/core/retention/prune.js.map +1 -0
  39. package/dist/core/retention/store.d.ts +9 -0
  40. package/dist/{storage/storage.js → core/retention/store.js} +1 -1
  41. package/dist/core/retention/store.js.map +1 -0
  42. package/dist/core/types/index.d.ts +2 -0
  43. package/dist/core/types/index.js +3 -0
  44. package/dist/core/types/index.js.map +1 -0
  45. package/dist/{types → core/types}/schedule.d.ts +3 -2
  46. package/dist/core/types/schedule.js +3 -0
  47. package/dist/core/types/schedule.js.map +1 -0
  48. package/dist/core/types/task.d.ts +18 -0
  49. package/dist/core/types/task.js +3 -0
  50. package/dist/core/types/task.js.map +1 -0
  51. package/dist/executor/backoff.d.ts +6 -0
  52. package/dist/executor/backoff.js +15 -0
  53. package/dist/executor/backoff.js.map +1 -0
  54. package/dist/executor/executor.d.ts +23 -0
  55. package/dist/executor/executor.js +133 -0
  56. package/dist/executor/executor.js.map +1 -0
  57. package/dist/executor/precision-timer.d.ts +13 -0
  58. package/dist/executor/precision-timer.js +35 -0
  59. package/dist/executor/precision-timer.js.map +1 -0
  60. package/dist/executor/task-handler.d.ts +10 -0
  61. package/dist/executor/task-handler.js +23 -0
  62. package/dist/executor/task-handler.js.map +1 -0
  63. package/dist/index.d.ts +1 -6
  64. package/dist/index.js +15 -10
  65. package/dist/index.js.map +1 -1
  66. package/dist/reaper/reaper.d.ts +27 -0
  67. package/dist/reaper/reaper.js +37 -0
  68. package/dist/reaper/reaper.js.map +1 -0
  69. package/dist/storage/index.d.ts +3 -0
  70. package/dist/storage/index.js +12 -0
  71. package/dist/storage/index.js.map +1 -0
  72. package/dist/storage/mappers.d.ts +6 -0
  73. package/dist/storage/mappers.js +72 -0
  74. package/dist/storage/mappers.js.map +1 -0
  75. package/dist/storage/materializer-store.d.ts +14 -0
  76. package/dist/storage/materializer-store.js +83 -0
  77. package/dist/storage/materializer-store.js.map +1 -0
  78. package/dist/storage/scheduler.service.d.ts +16 -0
  79. package/dist/storage/scheduler.service.js +70 -0
  80. package/dist/storage/scheduler.service.js.map +1 -0
  81. package/package.json +41 -6
  82. package/dist/errors.d.ts +0 -3
  83. package/dist/errors.js +0 -11
  84. package/dist/errors.js.map +0 -1
  85. package/dist/recurrence/next-run.js.map +0 -1
  86. package/dist/recurrence/validate.js.map +0 -1
  87. package/dist/storage/storage.d.ts +0 -6
  88. package/dist/storage/storage.js.map +0 -1
  89. package/dist/types/index.d.ts +0 -2
  90. package/dist/types/index.js +0 -19
  91. package/dist/types/index.js.map +0 -1
  92. package/dist/types/schedule.js +0 -5
  93. package/dist/types/schedule.js.map +0 -1
  94. package/dist/types/task.d.ts +0 -13
  95. package/dist/types/task.js +0 -12
  96. package/dist/types/task.js.map +0 -1
  97. /package/dist/{recurrence → core/recurrence}/next-run.d.ts +0 -0
  98. /package/dist/{recurrence → core/recurrence}/next-run.js +0 -0
  99. /package/dist/{recurrence → core/recurrence}/validate.d.ts +0 -0
  100. /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,7 @@
1
+ export interface MaterializerOptions {
2
+ windowSeconds: number;
3
+ maxPerJob: number;
4
+ batchSize: number;
5
+ planRetrySeconds: number;
6
+ }
7
+ export declare const DEFAULT_MATERIALIZER_OPTIONS: MaterializerOptions;
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=transaction.js.map
@@ -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,3 @@
1
+ export { prune, type RetentionSummary } from './prune';
2
+ export { DEFAULT_RETENTION_OPTIONS, type RetentionOptions } from './options';
3
+ export type { RetentionBatch, RetentionStore } from './store';
@@ -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,7 @@
1
+ export interface RetentionOptions {
2
+ retentionSeconds: number;
3
+ failedRetentionSeconds: number;
4
+ batchSize: number;
5
+ maxBatchesPerPass: number;
6
+ }
7
+ export declare const DEFAULT_RETENTION_OPTIONS: RetentionOptions;
@@ -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
+ }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=storage.js.map
3
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/retention/store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export type * from './schedule';
2
+ export type * from './task';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schedule.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/core/types/task.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface BackoffOptions {
2
+ baseMs?: number;
3
+ factor?: number;
4
+ maxMs?: number;
5
+ }
6
+ export declare function backoff(attempts: number, opts?: BackoffOptions): number;
@@ -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
+ }