n8n
Version:
n8n Workflow Automation Tool
111 lines • 5.5 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PollTriggerJobRegistrar = void 0;
const backend_common_1 = require("@n8n/backend-common");
const config_1 = require("@n8n/config");
const di_1 = require("@n8n/di");
const scheduler_1 = require("@n8n/scheduler");
const n8n_core_1 = require("n8n-core");
const node_crypto_1 = require("node:crypto");
const durable_job_provisioner_1 = require("../durable-job-provisioner");
const poll_trigger_task_1 = require("./poll-trigger-task");
let PollTriggerJobRegistrar = class PollTriggerJobRegistrar extends n8n_core_1.PollJobManager {
constructor(logger, globalConfig, jobProvisioner) {
super();
this.logger = logger;
this.jobProvisioner = jobProvisioner;
this.defaultTimezone = globalConfig.generic.timezone;
this.logger = this.logger.scoped('scheduler');
}
async register(workflowId, node, pollTimes, timezone) {
const resolvedTimezone = resolveTimezone(timezone, this.defaultTimezone);
const seed = `${workflowId}:${node.id}`;
const desired = this.toDesiredJobs(workflowId, node, pollTimes, seed, resolvedTimezone);
const payload = { workflowId, nodeId: node.id };
const summary = await this.jobProvisioner.provision(workflowId, node.id, poll_trigger_task_1.POLL_TRIGGER_TASK_TYPE, { ...payload }, desired);
this.logger.debug('Provisioned scheduler jobs for poll trigger node', {
workflowId,
nodeId: node.id,
inserted: summary.inserted.length,
redefined: summary.redefined.length,
unchanged: summary.unchanged.length,
removed: summary.removed.length,
});
return { inserted: summary.inserted.length > 0 };
}
toDesiredJobs(workflowId, node, pollTimes, seed, timezone) {
const seen = new Map();
return pollTimes.map((item) => {
const schedule = {
kind: 'cron',
cronExpression: seededCron(item, seed),
timezone,
};
const firstRunAt = (0, scheduler_1.computeFirstRunAt)(schedule, new Date());
const fingerprint = (0, scheduler_1.scheduleFingerprint)(schedule, firstRunAt !== null);
const occurrence = seen.get(fingerprint) ?? 0;
seen.set(fingerprint, occurrence + 1);
return {
name: `${workflowId}:${node.id}:${fingerprint}:${occurrence}`,
schedule,
firstRunAt,
};
});
}
async remove(workflowId, nodeId) {
await this.jobProvisioner.deprovision(workflowId, nodeId);
}
async removeWorkflow(workflowId) {
await this.jobProvisioner.deprovisionWorkflow(workflowId, poll_trigger_task_1.POLL_TRIGGER_TASK_TYPE);
}
async removeWorkflowInTransaction(manager, workflowId) {
await this.jobProvisioner.deprovisionWorkflowInTransaction(manager, workflowId, poll_trigger_task_1.POLL_TRIGGER_TASK_TYPE);
}
};
exports.PollTriggerJobRegistrar = PollTriggerJobRegistrar;
exports.PollTriggerJobRegistrar = PollTriggerJobRegistrar = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [backend_common_1.Logger, config_1.GlobalConfig, durable_job_provisioner_1.DurableJobProvisioner])
], PollTriggerJobRegistrar);
function resolveTimezone(timezone, defaultTimezone) {
return !timezone || timezone === 'DEFAULT' ? defaultTimezone : timezone;
}
function stableInt(seed, label, min, max) {
const hash = (0, node_crypto_1.createHash)('sha256').update(`${seed}:${label}`).digest();
return min + (hash.readUInt32BE(0) % (max - min));
}
function seededCron(item, seed) {
if (item.mode === 'custom') {
const trimmed = item.cronExpression.trim();
return (trimmed.split(/\s+/).length === 5 ? `0 ${trimmed}` : trimmed);
}
const second = stableInt(seed, 'second', 0, 60);
switch (item.mode) {
case 'everyMinute':
return `${second} * * * * *`;
case 'everyHour':
return `${second} ${item.minute} * * * *`;
case 'everyX': {
if (item.unit === 'minutes')
return `${second} */${item.value} * * * *`;
const minute = stableInt(seed, 'minute', 0, 60);
return `${second} ${minute} */${item.value} * * *`;
}
case 'everyDay':
return `${second} ${item.minute} ${item.hour} * * *`;
case 'everyWeek':
return `${second} ${item.minute} ${item.hour} * * ${item.weekday}`;
case 'everyMonth':
return `${second} ${item.minute} ${item.hour} ${item.dayOfMonth} * *`;
}
}
//# sourceMappingURL=poll-trigger-job-registrar.js.map