n8n 2.19.2 → 2.19.4

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 (32) hide show
  1. package/dist/build.tsbuildinfo +1 -1
  2. package/dist/commands/webhook.js +2 -0
  3. package/dist/commands/webhook.js.map +1 -1
  4. package/dist/modules/quick-connect/quick-connect.config.d.ts +176 -0
  5. package/dist/modules/quick-connect/quick-connect.config.js +8 -0
  6. package/dist/modules/quick-connect/quick-connect.config.js.map +1 -1
  7. package/dist/modules/quick-connect/quick-connect.module.d.ts +15 -0
  8. package/dist/modules/source-control.ee/source-control-git.service.ee.js +4 -1
  9. package/dist/modules/source-control.ee/source-control-git.service.ee.js.map +1 -1
  10. package/dist/scaling/leader-election-client.d.ts +28 -0
  11. package/dist/scaling/leader-election-client.js +102 -0
  12. package/dist/scaling/leader-election-client.js.map +1 -0
  13. package/dist/scaling/multi-main-setup-legacy.d.ts +25 -0
  14. package/dist/scaling/multi-main-setup-legacy.js +75 -0
  15. package/dist/scaling/multi-main-setup-legacy.js.map +1 -0
  16. package/dist/scaling/multi-main-setup-v2.d.ts +25 -0
  17. package/dist/scaling/multi-main-setup-v2.js +143 -0
  18. package/dist/scaling/multi-main-setup-v2.js.map +1 -0
  19. package/dist/scaling/multi-main-setup.ee.d.ts +5 -8
  20. package/dist/scaling/multi-main-setup.ee.js +22 -61
  21. package/dist/scaling/multi-main-setup.ee.js.map +1 -1
  22. package/dist/scaling/multi-main-setup.types.d.ts +6 -0
  23. package/dist/scaling/multi-main-setup.types.js +3 -0
  24. package/dist/scaling/multi-main-setup.types.js.map +1 -0
  25. package/dist/scaling/pubsub/publisher.service.js.map +1 -1
  26. package/dist/scaling/redis/redis.types.d.ts +1 -1
  27. package/dist/services/dynamic-node-parameters.service.d.ts +1 -0
  28. package/dist/services/dynamic-node-parameters.service.js +29 -12
  29. package/dist/services/dynamic-node-parameters.service.js.map +1 -1
  30. package/dist/services/user.service.js +0 -9
  31. package/dist/services/user.service.js.map +1 -1
  32. package/package.json +22 -22
@@ -0,0 +1,25 @@
1
+ import type { Logger } from '@n8n/backend-common';
2
+ import type { GlobalConfig } from '@n8n/config';
3
+ import type { ErrorReporter, InstanceSettings } from 'n8n-core';
4
+ import type { Publisher } from '../scaling/pubsub/publisher.service';
5
+ import type { RedisClientService } from '../services/redis-client.service';
6
+ import type { MultiMainStrategy } from './multi-main-setup.types';
7
+ type EmitFn = (event: 'leader-takeover' | 'leader-stepdown') => void;
8
+ export declare class MultiMainSetupLegacy implements MultiMainStrategy {
9
+ private readonly logger;
10
+ private readonly instanceSettings;
11
+ private readonly publisher;
12
+ private readonly redisClientService;
13
+ private readonly globalConfig;
14
+ private readonly errorReporter;
15
+ private readonly emit;
16
+ private leaderKey;
17
+ private readonly leaderKeyTtl;
18
+ constructor(logger: Logger, instanceSettings: InstanceSettings, publisher: Publisher, redisClientService: RedisClientService, globalConfig: GlobalConfig, errorReporter: ErrorReporter, emit: EmitFn);
19
+ init(): Promise<void>;
20
+ shutdown(): Promise<void>;
21
+ checkLeader(): Promise<void>;
22
+ private tryBecomeLeader;
23
+ fetchLeaderKey(): Promise<string | null>;
24
+ }
25
+ export {};
@@ -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":"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"}
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":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,wCAA6D;AAC7D,gCAAkC;AAElC,uCAA4C;AAG5C,0EAAqE;AAGrE,4CAMsB;AAOf,IAAM,SAAS,GAAf,MAAM,SAAS;IAWrB,YACkB,MAAc,EACd,kBAAsC,EACtC,gBAAkC,EAClC,gBAAkC,EAClC,YAA0B;QAJ1B,WAAM,GAAN,MAAM,CAAQ;QACd,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,iBAAY,GAAZ,YAAY,CAAc;QAG3C,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QAEnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAGxD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,GAAG,MAAM,IAAI,kCAAsB,EAAE,CAAC;QAC5D,IAAI,CAAC,qBAAqB,GAAG,GAAG,MAAM,IAAI,0CAA8B,EAAE,CAAC;QAC3E,IAAI,CAAC,eAAe,GAAG,GAAG,MAAM,IAAI,oCAAwB,EAAE,CAAC;QAE/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAGD,QAAQ;QACP,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAOD,KAAK,CAAC,cAAc,CAAC,GAAmB;QAEvC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QAEnD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CAAC;YACd,GAAG,GAAG;YACN,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM;YACtC,QAAQ,EAAE,8BAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7C,QAAQ,EAAE,CAAC,8BAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;SAC9C,CAAC,CACF,CAAC;QAEF,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAE1B,MAAM,QAAQ,GAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QAEjF,IAAI,GAAG,CAAC,OAAO,KAAK,iCAAiC,EAAE,CAAC;YACvD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;YACnC,OAAO,IAAI,KAAK,IAAI,GAAG,CAAC;YACxB,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;YACrB,IAAI,aAAa,IAAI,IAAI;gBAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAGD,KAAK,CAAC,qBAAqB,CAAC,GAA0B;QACrD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,QAAQ,6BAA6B,CAAC,CAAC;IAC3E,CAAC;IAGD,KAAK,CAAC,eAAe,CAAC,GAAoB;QAEzC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QAEnD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAChD,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,IAAI,CAAC,eAAe;SAC7B,CAAC,CAAC;IACJ,CAAC;IAMD,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAClE,OAAO,MAAM,KAAK,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAW;QAChD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,GAAW;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACpB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CAGD,CAAA;AAzHY,8BAAS;oBAAT,SAAS;IADrB,IAAA,YAAO,GAAE;qCAaiB,uBAAM;QACM,yCAAkB;QACpB,2BAAgB;QAChB,yBAAgB;QACpB,qBAAY;GAhBhC,SAAS,CAyHrB"}
@@ -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 {};
@@ -22,6 +22,7 @@ export declare class DynamicNodeParametersService {
22
22
  getResourceMappingFields(methodName: string, path: string, additionalData: IWorkflowExecuteAdditionalData, nodeTypeAndVersion: INodeTypeNameVersion, currentNodeParameters: INodeParameters, credentials?: INodeCredentials): Promise<ResourceMapperFields>;
23
23
  getLocalResourceMappingFields(methodName: string, path: string, additionalData: IWorkflowExecuteAdditionalData, nodeTypeAndVersion: INodeTypeNameVersion): Promise<ResourceMapperFields>;
24
24
  getActionResult(handler: string, path: string, additionalData: IWorkflowExecuteAdditionalData, nodeTypeAndVersion: INodeTypeNameVersion, currentNodeParameters: INodeParameters, payload: IDataObject | string | undefined, credentials?: INodeCredentials): Promise<NodeParameterValueType>;
25
+ private withExpressionIsolate;
25
26
  private getMethod;
26
27
  private getNodeType;
27
28
  private getWorkflow;
@@ -67,7 +67,9 @@ let DynamicNodeParametersService = class DynamicNodeParametersService {
67
67
  const method = this.getMethod('loadOptions', methodName, nodeType);
68
68
  const workflow = this.getWorkflow(nodeTypeAndVersion, currentNodeParameters, credentials);
69
69
  const thisArgs = this.getThisArg(path, additionalData, workflow);
70
- return await method.call(thisArgs);
70
+ return await this.withExpressionIsolate(workflow, async () => {
71
+ return await method.call(thisArgs);
72
+ });
71
73
  }
72
74
  async getOptionsViaLoadOptions(loadOptions, additionalData, nodeTypeAndVersion, currentNodeParameters, credentials) {
73
75
  const nodeType = this.getNodeType(nodeTypeAndVersion);
@@ -107,28 +109,32 @@ let DynamicNodeParametersService = class DynamicNodeParametersService {
107
109
  };
108
110
  const executeFunctions = new n8n_core_1.ExecuteContext(workflow, node, additionalData, mode, runExecutionData, runIndex, connectionInputData, inputData, executeData, []);
109
111
  const routingNode = new n8n_core_1.RoutingNode(executeFunctions, tempNodeType);
110
- const optionsData = await routingNode.runNode();
111
- if (optionsData?.length === 0) {
112
- return [];
113
- }
114
- if (!Array.isArray(optionsData)) {
115
- throw new n8n_workflow_1.UnexpectedError('The returned data is not an array');
116
- }
117
- return optionsData[0].map((item) => item.json);
112
+ return await this.withExpressionIsolate(workflow, async () => {
113
+ const optionsData = await routingNode.runNode();
114
+ if (optionsData?.length === 0) {
115
+ return [];
116
+ }
117
+ if (!Array.isArray(optionsData)) {
118
+ throw new n8n_workflow_1.UnexpectedError('The returned data is not an array');
119
+ }
120
+ return optionsData[0].map((item) => item.json);
121
+ });
118
122
  }
119
123
  async getResourceLocatorResults(methodName, path, additionalData, nodeTypeAndVersion, currentNodeParameters, credentials, filter, paginationToken) {
120
124
  const nodeType = this.getNodeType(nodeTypeAndVersion);
121
125
  const method = this.getMethod('listSearch', methodName, nodeType);
122
126
  const workflow = this.getWorkflow(nodeTypeAndVersion, currentNodeParameters, credentials);
123
127
  const thisArgs = this.getThisArg(path, additionalData, workflow);
124
- return await method.call(thisArgs, filter, paginationToken);
128
+ return await this.withExpressionIsolate(workflow, async () => {
129
+ return await method.call(thisArgs, filter, paginationToken);
130
+ });
125
131
  }
126
132
  async getResourceMappingFields(methodName, path, additionalData, nodeTypeAndVersion, currentNodeParameters, credentials) {
127
133
  const nodeType = this.getNodeType(nodeTypeAndVersion);
128
134
  const method = this.getMethod('resourceMapping', methodName, nodeType);
129
135
  const workflow = this.getWorkflow(nodeTypeAndVersion, currentNodeParameters, credentials);
130
136
  const thisArgs = this.getThisArg(path, additionalData, workflow);
131
- return this.removeDuplicateResourceMappingFields(await method.call(thisArgs));
137
+ return await this.withExpressionIsolate(workflow, async () => this.removeDuplicateResourceMappingFields(await method.call(thisArgs)));
132
138
  }
133
139
  async getLocalResourceMappingFields(methodName, path, additionalData, nodeTypeAndVersion) {
134
140
  const nodeType = this.getNodeType(nodeTypeAndVersion);
@@ -141,7 +147,18 @@ let DynamicNodeParametersService = class DynamicNodeParametersService {
141
147
  const method = this.getMethod('actionHandler', handler, nodeType);
142
148
  const workflow = this.getWorkflow(nodeTypeAndVersion, currentNodeParameters, credentials);
143
149
  const thisArgs = this.getThisArg(path, additionalData, workflow);
144
- return await method.call(thisArgs, payload);
150
+ return await this.withExpressionIsolate(workflow, async () => {
151
+ return await method.call(thisArgs, payload);
152
+ });
153
+ }
154
+ async withExpressionIsolate(workflow, fn) {
155
+ await workflow.expression.acquireIsolate();
156
+ try {
157
+ return await fn();
158
+ }
159
+ finally {
160
+ await workflow.expression.releaseIsolate();
161
+ }
145
162
  }
146
163
  getMethod(type, methodName, nodeType) {
147
164
  const methodsOfType = nodeType.methods?.[type];