n8n 2.20.0 → 2.20.2

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.
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiMainSetupLegacy = void 0;
4
+ class MultiMainSetupLegacy {
5
+ constructor(logger, instanceSettings, publisher, redisClientService, globalConfig, errorReporter, emit) {
6
+ this.logger = logger;
7
+ this.instanceSettings = instanceSettings;
8
+ this.publisher = publisher;
9
+ this.redisClientService = redisClientService;
10
+ this.globalConfig = globalConfig;
11
+ this.errorReporter = errorReporter;
12
+ this.emit = emit;
13
+ this.leaderKeyTtl = this.globalConfig.multiMainSetup.ttl;
14
+ }
15
+ async init() {
16
+ const prefix = this.globalConfig.redis.prefix;
17
+ const validPrefix = this.redisClientService.toValidPrefix(prefix);
18
+ this.leaderKey = validPrefix + ':main_instance_leader';
19
+ await this.tryBecomeLeader();
20
+ }
21
+ async shutdown() {
22
+ const { isLeader } = this.instanceSettings;
23
+ if (isLeader)
24
+ await this.publisher.clear(this.leaderKey);
25
+ }
26
+ async checkLeader() {
27
+ const leaderId = await this.publisher.get(this.leaderKey);
28
+ const { hostId } = this.instanceSettings;
29
+ if (leaderId === hostId) {
30
+ if (!this.instanceSettings.isLeader) {
31
+ this.errorReporter.info(`[Instance ID ${hostId}] Remote/Local leadership mismatch, marking self as leader`, {
32
+ shouldBeLogged: true,
33
+ shouldReport: true,
34
+ });
35
+ this.instanceSettings.markAsLeader();
36
+ this.emit('leader-takeover');
37
+ }
38
+ this.logger.debug(`[Instance ID ${hostId}] Leader is this instance`);
39
+ await this.publisher.setExpiration(this.leaderKey, this.leaderKeyTtl);
40
+ return;
41
+ }
42
+ if (leaderId && leaderId !== hostId) {
43
+ this.logger.debug(`[Instance ID ${hostId}] Leader is other instance "${leaderId}"`);
44
+ if (this.instanceSettings.isLeader) {
45
+ this.instanceSettings.markAsFollower();
46
+ this.emit('leader-stepdown');
47
+ this.logger.warn('[Multi-main setup] Leader failed to renew leader key');
48
+ }
49
+ return;
50
+ }
51
+ if (!leaderId) {
52
+ this.logger.debug(`[Instance ID ${hostId}] Leadership vacant, attempting to become leader...`);
53
+ this.instanceSettings.markAsFollower();
54
+ this.emit('leader-stepdown');
55
+ await this.tryBecomeLeader();
56
+ }
57
+ }
58
+ async tryBecomeLeader() {
59
+ const { hostId } = this.instanceSettings;
60
+ const keySetSuccessfully = await this.publisher.setIfNotExists(this.leaderKey, hostId, this.leaderKeyTtl);
61
+ if (keySetSuccessfully) {
62
+ this.logger.info(`[Instance ID ${hostId}] Leader is now this instance`);
63
+ this.instanceSettings.markAsLeader();
64
+ this.emit('leader-takeover');
65
+ }
66
+ else {
67
+ this.instanceSettings.markAsFollower();
68
+ }
69
+ }
70
+ async fetchLeaderKey() {
71
+ return await this.publisher.get(this.leaderKey);
72
+ }
73
+ }
74
+ exports.MultiMainSetupLegacy = MultiMainSetupLegacy;
75
+ //# sourceMappingURL=multi-main-setup-legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-main-setup-legacy.js","sourceRoot":"","sources":["../../src/scaling/multi-main-setup-legacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { LeaderElectionClient } from '../scaling/leader-election-client';
2
+ import type { Logger } from '@n8n/backend-common';
3
+ import type { ErrorReporter, InstanceSettings } from 'n8n-core';
4
+ import type { MultiMainStrategy } from './multi-main-setup.types';
5
+ type EmitFn = (event: 'leader-takeover' | 'leader-stepdown') => void;
6
+ export declare class MultiMainSetupV2 implements MultiMainStrategy {
7
+ private readonly logger;
8
+ private readonly instanceSettings;
9
+ private readonly errorReporter;
10
+ private readonly client;
11
+ private readonly emit;
12
+ private leaderCheckInProgress;
13
+ private get hostId();
14
+ constructor(logger: Logger, instanceSettings: InstanceSettings, errorReporter: ErrorReporter, client: LeaderElectionClient, emit: EmitFn);
15
+ init(): Promise<void>;
16
+ shutdown(): Promise<void>;
17
+ checkLeader(): Promise<void>;
18
+ private checkAreWeStillLeader;
19
+ private checkCanBecomeLeader;
20
+ private takeOverAsLeader;
21
+ private stepDownToFollower;
22
+ fetchLeaderKey(): Promise<string | null>;
23
+ private logRedisCommandFailure;
24
+ }
25
+ export {};
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MultiMainSetupV2 = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ class MultiMainSetupV2 {
9
+ get hostId() {
10
+ return this.instanceSettings.hostId;
11
+ }
12
+ constructor(logger, instanceSettings, errorReporter, client, emit) {
13
+ this.logger = logger;
14
+ this.instanceSettings = instanceSettings;
15
+ this.errorReporter = errorReporter;
16
+ this.client = client;
17
+ this.emit = emit;
18
+ this.leaderCheckInProgress = false;
19
+ }
20
+ async init() {
21
+ const result = await this.client.setLeaderIfNotExists();
22
+ if (!result.ok) {
23
+ this.logRedisCommandFailure('Failed to set leader key in Redis during init', result.error);
24
+ this.instanceSettings.markAsFollower();
25
+ }
26
+ else if (result.result) {
27
+ this.takeOverAsLeader();
28
+ }
29
+ else {
30
+ this.instanceSettings.markAsFollower();
31
+ }
32
+ }
33
+ async shutdown() {
34
+ const { isLeader } = this.instanceSettings;
35
+ if (isLeader) {
36
+ const result = await this.client.clearLeader();
37
+ if (!result.ok) {
38
+ this.logger.warn('Failed to clear leader key from Redis', { error: result.error });
39
+ }
40
+ }
41
+ this.client.destroy();
42
+ }
43
+ async checkLeader() {
44
+ if (this.leaderCheckInProgress) {
45
+ this.logger.warn('Previous leader check is still in progress, skipping this check');
46
+ return;
47
+ }
48
+ this.leaderCheckInProgress = true;
49
+ try {
50
+ if (this.instanceSettings.isLeader) {
51
+ await this.checkAreWeStillLeader();
52
+ }
53
+ else {
54
+ await this.checkCanBecomeLeader();
55
+ }
56
+ }
57
+ finally {
58
+ this.leaderCheckInProgress = false;
59
+ }
60
+ }
61
+ async checkAreWeStillLeader() {
62
+ (0, node_assert_1.default)(this.instanceSettings.isLeader);
63
+ const renewTtlResult = await this.client.tryRenewLeaderTtl();
64
+ if (!renewTtlResult.ok) {
65
+ this.logRedisCommandFailure('Failed to renew leader TTL', renewTtlResult.error);
66
+ return;
67
+ }
68
+ const renewalResult = renewTtlResult.result;
69
+ if (renewalResult.id === 'success') {
70
+ this.logger.debug(`[Instance ID ${this.hostId}] Leader is this instance`);
71
+ return;
72
+ }
73
+ this.logger.warn('[Multi-main setup] Leader failed to renew leader key');
74
+ if (renewalResult.id === 'other-host-is-leader') {
75
+ this.logger.debug(`[Instance ID ${this.hostId}] Leader is other instance "${renewalResult.currentLeaderId}"`);
76
+ this.stepDownToFollower();
77
+ return;
78
+ }
79
+ (0, node_assert_1.default)(renewalResult.id === 'key-missing');
80
+ const result = await this.client.setLeaderIfNotExists();
81
+ if (!result.ok) {
82
+ this.logRedisCommandFailure('Failed to set leader key in Redis', result.error);
83
+ this.stepDownToFollower();
84
+ return;
85
+ }
86
+ const wasSet = result.result;
87
+ if (!wasSet) {
88
+ this.stepDownToFollower();
89
+ }
90
+ }
91
+ async checkCanBecomeLeader() {
92
+ (0, node_assert_1.default)(!this.instanceSettings.isLeader);
93
+ const getResult = await this.client.getLeader();
94
+ if (!getResult.ok) {
95
+ this.logRedisCommandFailure('Failed to get leader key from Redis', getResult.error);
96
+ return;
97
+ }
98
+ const leaderId = getResult.result;
99
+ if (leaderId && leaderId === this.hostId) {
100
+ this.errorReporter.info(`[Instance ID ${this.hostId}] Remote/Local leadership mismatch, marking self as leader`, {
101
+ shouldBeLogged: true,
102
+ shouldReport: true,
103
+ });
104
+ this.takeOverAsLeader();
105
+ return;
106
+ }
107
+ if (leaderId) {
108
+ this.logger.debug(`[Instance ID ${this.hostId}] Leader is other instance "${leaderId}"`);
109
+ return;
110
+ }
111
+ this.logger.debug(`[Instance ID ${this.hostId}] Leadership vacant, attempting to become leader...`);
112
+ const result = await this.client.setLeaderIfNotExists();
113
+ if (!result.ok) {
114
+ this.logger.warn('Failed to try leader key set in Redis', { error: result.error });
115
+ return;
116
+ }
117
+ const wasSet = result.result;
118
+ if (wasSet) {
119
+ this.takeOverAsLeader();
120
+ }
121
+ }
122
+ takeOverAsLeader() {
123
+ (0, node_assert_1.default)(!this.instanceSettings.isLeader);
124
+ this.logger.info(`[Instance ID ${this.hostId}] Leader is now this instance`);
125
+ this.instanceSettings.markAsLeader();
126
+ this.emit('leader-takeover');
127
+ }
128
+ stepDownToFollower() {
129
+ (0, node_assert_1.default)(this.instanceSettings.isLeader);
130
+ this.logger.info(`[Instance ID ${this.hostId}] This is now a follower instance`);
131
+ this.instanceSettings.markAsFollower();
132
+ this.emit('leader-stepdown');
133
+ }
134
+ async fetchLeaderKey() {
135
+ const result = await this.client.getLeader();
136
+ return result.ok ? result.result : null;
137
+ }
138
+ logRedisCommandFailure(message, error) {
139
+ this.logger.warn(`${message}: ${error.message}`, { error });
140
+ }
141
+ }
142
+ exports.MultiMainSetupV2 = MultiMainSetupV2;
143
+ //# sourceMappingURL=multi-main-setup-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-main-setup-v2.js","sourceRoot":"","sources":["../../src/scaling/multi-main-setup-v2.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
+ import { TypedEmitter } from '../typed-emitter';
1
2
  import { Logger } from '@n8n/backend-common';
2
3
  import { GlobalConfig } from '@n8n/config';
3
4
  import { MultiMainMetadata } from '@n8n/decorators';
4
5
  import { ErrorReporter, InstanceSettings } from 'n8n-core';
5
6
  import { Publisher } from '../scaling/pubsub/publisher.service';
6
7
  import { RedisClientService } from '../services/redis-client.service';
7
- import { TypedEmitter } from '../typed-emitter';
8
8
  type MultiMainEvents = {
9
9
  'leader-stepdown': never;
10
10
  'leader-takeover': never;
@@ -12,19 +12,16 @@ type MultiMainEvents = {
12
12
  export declare class MultiMainSetup extends TypedEmitter<MultiMainEvents> {
13
13
  private readonly logger;
14
14
  private readonly instanceSettings;
15
- private readonly publisher;
16
- private readonly redisClientService;
17
15
  private readonly globalConfig;
18
16
  private readonly metadata;
19
17
  private readonly errorReporter;
20
- constructor(logger: Logger, instanceSettings: InstanceSettings, publisher: Publisher, redisClientService: RedisClientService, globalConfig: GlobalConfig, metadata: MultiMainMetadata, errorReporter: ErrorReporter);
21
- private leaderKey;
22
- private readonly leaderKeyTtl;
18
+ private readonly publisher;
19
+ private readonly redisClientService;
20
+ private readonly strategy;
23
21
  private leaderCheckInterval;
22
+ constructor(logger: Logger, instanceSettings: InstanceSettings, globalConfig: GlobalConfig, metadata: MultiMainMetadata, errorReporter: ErrorReporter, publisher: Publisher, redisClientService: RedisClientService);
24
23
  init(): Promise<void>;
25
24
  shutdown(): Promise<void>;
26
- private checkLeader;
27
- private tryBecomeLeader;
28
25
  fetchLeaderKey(): Promise<string | null>;
29
26
  registerEventHandlers(): void;
30
27
  }
@@ -10,6 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.MultiMainSetup = void 0;
13
+ const typed_emitter_1 = require("../typed-emitter");
13
14
  const backend_common_1 = require("@n8n/backend-common");
14
15
  const config_1 = require("@n8n/config");
15
16
  const constants_1 = require("@n8n/constants");
@@ -18,81 +19,41 @@ const di_1 = require("@n8n/di");
18
19
  const n8n_core_1 = require("n8n-core");
19
20
  const publisher_service_1 = require("../scaling/pubsub/publisher.service");
20
21
  const redis_client_service_1 = require("../services/redis-client.service");
21
- const typed_emitter_1 = require("../typed-emitter");
22
+ const multi_main_setup_legacy_1 = require("./multi-main-setup-legacy");
23
+ const multi_main_setup_v2_1 = require("./multi-main-setup-v2");
22
24
  let MultiMainSetup = class MultiMainSetup extends typed_emitter_1.TypedEmitter {
23
- constructor(logger, instanceSettings, publisher, redisClientService, globalConfig, metadata, errorReporter) {
25
+ constructor(logger, instanceSettings, globalConfig, metadata, errorReporter, publisher, redisClientService) {
24
26
  super();
25
27
  this.logger = logger;
26
28
  this.instanceSettings = instanceSettings;
27
- this.publisher = publisher;
28
- this.redisClientService = redisClientService;
29
29
  this.globalConfig = globalConfig;
30
30
  this.metadata = metadata;
31
31
  this.errorReporter = errorReporter;
32
- this.leaderKeyTtl = this.globalConfig.multiMainSetup.ttl;
32
+ this.publisher = publisher;
33
+ this.redisClientService = redisClientService;
33
34
  this.logger = this.logger.scoped(['scaling', 'multi-main-setup']);
35
+ const emitFn = (event) => this.emit(event);
36
+ if (this.globalConfig.multiMainSetup.newLeaderElection) {
37
+ const { LeaderElectionClient } = require('../scaling/leader-election-client');
38
+ const client = di_1.Container.get(LeaderElectionClient);
39
+ this.strategy = new multi_main_setup_v2_1.MultiMainSetupV2(this.logger, this.instanceSettings, this.errorReporter, client, emitFn);
40
+ }
41
+ else {
42
+ this.strategy = new multi_main_setup_legacy_1.MultiMainSetupLegacy(this.logger, this.instanceSettings, this.publisher, this.redisClientService, this.globalConfig, this.errorReporter, emitFn);
43
+ }
34
44
  }
35
45
  async init() {
36
- const prefix = this.globalConfig.redis.prefix;
37
- const validPrefix = this.redisClientService.toValidPrefix(prefix);
38
- this.leaderKey = validPrefix + ':main_instance_leader';
39
- await this.tryBecomeLeader();
46
+ await this.strategy.init();
40
47
  this.leaderCheckInterval = setInterval(async () => {
41
- await this.checkLeader();
48
+ await this.strategy.checkLeader();
42
49
  }, this.globalConfig.multiMainSetup.interval * constants_1.Time.seconds.toMilliseconds);
43
50
  }
44
51
  async shutdown() {
45
52
  clearInterval(this.leaderCheckInterval);
46
- const { isLeader } = this.instanceSettings;
47
- if (isLeader)
48
- await this.publisher.clear(this.leaderKey);
49
- }
50
- async checkLeader() {
51
- const leaderId = await this.publisher.get(this.leaderKey);
52
- const { hostId } = this.instanceSettings;
53
- if (leaderId === hostId) {
54
- if (!this.instanceSettings.isLeader) {
55
- this.errorReporter.info(`[Instance ID ${hostId}] Remote/Local leadership mismatch, marking self as leader`, {
56
- shouldBeLogged: true,
57
- shouldReport: true,
58
- });
59
- this.instanceSettings.markAsLeader();
60
- this.emit('leader-takeover');
61
- }
62
- this.logger.debug(`[Instance ID ${hostId}] Leader is this instance`);
63
- await this.publisher.setExpiration(this.leaderKey, this.leaderKeyTtl);
64
- return;
65
- }
66
- if (leaderId && leaderId !== hostId) {
67
- this.logger.debug(`[Instance ID ${hostId}] Leader is other instance "${leaderId}"`);
68
- if (this.instanceSettings.isLeader) {
69
- this.instanceSettings.markAsFollower();
70
- this.emit('leader-stepdown');
71
- this.logger.warn('[Multi-main setup] Leader failed to renew leader key');
72
- }
73
- return;
74
- }
75
- if (!leaderId) {
76
- this.logger.debug(`[Instance ID ${hostId}] Leadership vacant, attempting to become leader...`);
77
- this.instanceSettings.markAsFollower();
78
- this.emit('leader-stepdown');
79
- await this.tryBecomeLeader();
80
- }
81
- }
82
- async tryBecomeLeader() {
83
- const { hostId } = this.instanceSettings;
84
- const keySetSuccessfully = await this.publisher.setIfNotExists(this.leaderKey, hostId, this.leaderKeyTtl);
85
- if (keySetSuccessfully) {
86
- this.logger.info(`[Instance ID ${hostId}] Leader is now this instance`);
87
- this.instanceSettings.markAsLeader();
88
- this.emit('leader-takeover');
89
- }
90
- else {
91
- this.instanceSettings.markAsFollower();
92
- }
53
+ await this.strategy.shutdown();
93
54
  }
94
55
  async fetchLeaderKey() {
95
- return await this.publisher.get(this.leaderKey);
56
+ return await this.strategy.fetchLeaderKey();
96
57
  }
97
58
  registerEventHandlers() {
98
59
  const handlers = this.metadata.getHandlers();
@@ -109,10 +70,10 @@ exports.MultiMainSetup = MultiMainSetup = __decorate([
109
70
  (0, di_1.Service)(),
110
71
  __metadata("design:paramtypes", [backend_common_1.Logger,
111
72
  n8n_core_1.InstanceSettings,
112
- publisher_service_1.Publisher,
113
- redis_client_service_1.RedisClientService,
114
73
  config_1.GlobalConfig,
115
74
  decorators_1.MultiMainMetadata,
116
- n8n_core_1.ErrorReporter])
75
+ n8n_core_1.ErrorReporter,
76
+ publisher_service_1.Publisher,
77
+ redis_client_service_1.RedisClientService])
117
78
  ], MultiMainSetup);
118
79
  //# sourceMappingURL=multi-main-setup.ee.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-main-setup.ee.js","sourceRoot":"","sources":["../../src/scaling/multi-main-setup.ee.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,wCAA2C;AAC3C,8CAAsC;AACtC,gDAAoD;AACpD,gCAA6C;AAC7C,uCAA2D;AAE3D,0EAA+D;AAC/D,0EAAqE;AACrE,mDAA+C;AAoBxC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,4BAA6B;IAChE,YACkB,MAAc,EACd,gBAAkC,EAClC,SAAoB,EACpB,kBAAsC,EACtC,YAA0B,EAC1B,QAA2B,EAC3B,aAA4B;QAE7C,KAAK,EAAE,CAAC;QARS,WAAM,GAAN,MAAM,CAAQ;QACd,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,cAAS,GAAT,SAAS,CAAW;QACpB,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,iBAAY,GAAZ,YAAY,CAAc;QAC1B,aAAQ,GAAR,QAAQ,CAAmB;QAC3B,kBAAa,GAAb,aAAa,CAAe;QAQ7B,iBAAY,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC;QALpE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACnE,CAAC;IAQD,KAAK,CAAC,IAAI;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,uBAAuB,CAAC;QAEvD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7B,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACjD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,GAAG,gBAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC;IAGD,KAAK,CAAC,QAAQ;QACb,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAExC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAE3C,IAAI,QAAQ;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,WAAW;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAEzC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBAGrC,IAAI,CAAC,aAAa,CAAC,IAAI,CACtB,gBAAgB,MAAM,4DAA4D,EAClF;oBACC,cAAc,EAAE,IAAI;oBACpB,YAAY,EAAE,IAAI;iBAClB,CACD,CAAC;gBAEF,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;gBAErC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,2BAA2B,CAAC,CAAC;YAErE,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAEtE,OAAO;QACR,CAAC;QAED,IAAI,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,+BAA+B,QAAQ,GAAG,CAAC,CAAC;YAEpF,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;gBAEvC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAE7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAChB,gBAAgB,MAAM,qDAAqD,CAC3E,CAAC;YAEF,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;YAEvC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAE7B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,eAAe;QAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAGzC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAC7D,IAAI,CAAC,SAAS,EACd,MAAM,EACN,IAAI,CAAC,YAAY,CACjB,CAAC;QAEF,IAAI,kBAAkB,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,+BAA+B,CAAC,CAAC;YAExE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;QACxC,CAAC;IACF,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,qBAAqB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE7C,KAAK,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,QAAQ,EAAE,CAAC;YACrE,MAAM,QAAQ,GAAG,cAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAClD,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;gBAE7B,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;CACD,CAAA;AArIY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,YAAO,GAAE;qCAGiB,uBAAM;QACI,2BAAgB;QACvB,6BAAS;QACA,yCAAkB;QACxB,qBAAY;QAChB,8BAAiB;QACZ,wBAAa;GARlC,cAAc,CAqI1B"}
1
+ {"version":3,"file":"multi-main-setup.ee.js","sourceRoot":"","sources":["../../src/scaling/multi-main-setup.ee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface MultiMainStrategy {
2
+ init(): Promise<void>;
3
+ shutdown(): Promise<void>;
4
+ checkLeader(): Promise<void>;
5
+ fetchLeaderKey(): Promise<string | null>;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=multi-main-setup.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-main-setup.types.js","sourceRoot":"","sources":["../../src/scaling/multi-main-setup.types.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"publisher.service.js","sourceRoot":"","sources":["../../../src/scaling/pubsub/publisher.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publisher.service.js","sourceRoot":"","sources":["../../../src/scaling/pubsub/publisher.service.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export type RedisClientType = N8nRedisClientType | BullRedisClientType;
2
- type N8nRedisClientType = 'subscriber(n8n)' | 'publisher(n8n)' | 'cache(n8n)' | 'registry(n8n)';
2
+ type N8nRedisClientType = 'subscriber(n8n)' | 'publisher(n8n)' | 'cache(n8n)' | 'registry(n8n)' | 'leader(n8n)';
3
3
  type BullRedisClientType = 'subscriber(bull)' | 'client(bull)' | 'bclient(bull)';
4
4
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n",
3
- "version": "2.20.0",
3
+ "version": "2.20.2",
4
4
  "description": "n8n Workflow Automation Tool",
5
5
  "main": "dist/index",
6
6
  "types": "dist/index.d.ts",
@@ -22,8 +22,8 @@
22
22
  "bin",
23
23
  "templates",
24
24
  "dist",
25
- "LICENSE_EE.md",
26
- "LICENSE.md"
25
+ "LICENSE.md",
26
+ "LICENSE_EE.md"
27
27
  ],
28
28
  "devDependencies": {
29
29
  "@redocly/cli": "^1.28.5",
@@ -56,9 +56,9 @@
56
56
  "mjml": "^4.15.3",
57
57
  "openapi-types": "^12.1.3",
58
58
  "ts-essentials": "^7.0.3",
59
- "@n8n/backend-test-utils": "1.20.0",
60
- "n8n-containers": "1.0.0",
61
- "@n8n/typescript-config": "1.4.0"
59
+ "@n8n/backend-test-utils": "1.20.1",
60
+ "@n8n/typescript-config": "1.4.0",
61
+ "n8n-containers": "1.0.0"
62
62
  },
63
63
  "dependencies": {
64
64
  "@1password/connect": "1.4.2",
@@ -138,7 +138,7 @@
138
138
  "samlify": "2.10.0",
139
139
  "semver": "7.5.4",
140
140
  "shelljs": "0.8.5",
141
- "simple-git": "3.32.3",
141
+ "simple-git": "3.36.0",
142
142
  "source-map-support": "0.5.21",
143
143
  "sqlite3": "5.1.7",
144
144
  "sshpk": "1.18.0",
@@ -153,31 +153,31 @@
153
153
  "yaml": "2.8.3",
154
154
  "yargs-parser": "21.1.1",
155
155
  "zod": "3.25.67",
156
- "@n8n/ai-node-sdk": "0.11.0",
157
- "@n8n/ai-workflow-builder": "1.20.0",
158
- "@n8n/ai-utilities": "0.14.0",
159
- "@n8n/backend-common": "1.20.0",
156
+ "@n8n/ai-node-sdk": "0.11.1",
157
+ "@n8n/ai-utilities": "0.14.1",
158
+ "@n8n/ai-workflow-builder": "1.20.1",
159
+ "@n8n/backend-common": "1.20.1",
160
160
  "@n8n/client-oauth2": "1.4.0",
161
- "@n8n/api-types": "1.20.0",
162
161
  "@n8n/chat-hub": "1.13.0",
163
- "@n8n/db": "1.20.0",
164
- "@n8n/config": "2.19.0",
162
+ "@n8n/constants": "0.23.0",
163
+ "@n8n/config": "2.19.1",
164
+ "@n8n/db": "1.20.1",
165
+ "@n8n/api-types": "1.20.0",
165
166
  "@n8n/di": "0.11.0",
167
+ "@n8n/decorators": "1.20.0",
166
168
  "@n8n/errors": "0.8.0",
167
- "@n8n/instance-ai": "1.5.0",
168
169
  "@n8n/expression-runtime": "0.12.0",
169
- "@n8n/n8n-nodes-langchain": "2.20.0",
170
+ "@n8n/instance-ai": "1.5.0",
171
+ "@n8n/n8n-nodes-langchain": "2.20.1",
170
172
  "@n8n/permissions": "0.58.0",
171
- "@n8n/constants": "0.23.0",
172
- "@n8n/task-runner": "2.20.0",
173
173
  "@n8n/syslog-client": "1.3.0",
174
+ "@n8n/task-runner": "2.20.1",
174
175
  "@n8n/utils": "1.30.0",
175
- "@n8n/decorators": "1.20.0",
176
- "@n8n/workflow-sdk": "0.13.0",
176
+ "n8n-core": "2.20.1",
177
177
  "n8n-editor-ui": "2.20.0",
178
- "n8n-workflow": "2.20.0",
179
- "n8n-core": "2.20.0",
180
- "n8n-nodes-base": "2.20.0"
178
+ "@n8n/workflow-sdk": "0.13.0",
179
+ "n8n-nodes-base": "2.20.1",
180
+ "n8n-workflow": "2.20.0"
181
181
  },
182
182
  "license": "SEE LICENSE IN LICENSE.md",
183
183
  "homepage": "https://n8n.io",