UNPKG

n8n

Version:

n8n Workflow Automation Tool

111 lines 5.5 kB
"use strict"; 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