n8n 2.35.2 → 2.35.3
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.
- package/dist/build.tsbuildinfo +1 -1
- package/dist/workflows/publication/workflow-publication-applier.d.ts +2 -2
- package/dist/workflows/publication/workflow-publication-applier.js +11 -8
- package/dist/workflows/publication/workflow-publication-applier.js.map +1 -1
- package/dist/workflows/publication/workflow-publication-outbox-consumer.d.ts +3 -1
- package/dist/workflows/publication/workflow-publication-outbox-consumer.js +60 -8
- package/dist/workflows/publication/workflow-publication-outbox-consumer.js.map +1 -1
- package/dist/workflows/triggers/trigger-activation-retry.d.ts +1 -1
- package/dist/workflows/triggers/trigger-activation-retry.js +4 -3
- package/dist/workflows/triggers/trigger-activation-retry.js.map +1 -1
- package/dist/workflows/triggers/workflow-trigger-activator.d.ts +6 -2
- package/dist/workflows/triggers/workflow-trigger-activator.js +63 -26
- package/dist/workflows/triggers/workflow-trigger-activator.js.map +1 -1
- package/package.json +30 -30
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Logger } from '@n8n/backend-common';
|
|
2
2
|
import { WorkflowHistoryRepository, WorkflowPublicationOutbox, WorkflowPublishedVersionRepository, WorkflowRepository } from '@n8n/db';
|
|
3
3
|
import type { PublicationResult } from '../../workflows/publication/publication-result';
|
|
4
|
-
import { WorkflowTriggerActivator } from '../../workflows/triggers/workflow-trigger-activator';
|
|
4
|
+
import { WorkflowTriggerActivator, type TriggerOperationAbort } from '../../workflows/triggers/workflow-trigger-activator';
|
|
5
5
|
import { WorkflowPublishedDataService } from '../../workflows/workflow-published-data.service';
|
|
6
6
|
export declare class WorkflowPublicationApplier {
|
|
7
7
|
private readonly logger;
|
|
@@ -11,7 +11,7 @@ export declare class WorkflowPublicationApplier {
|
|
|
11
11
|
private readonly workflowTriggerActivator;
|
|
12
12
|
private readonly workflowPublishedDataService;
|
|
13
13
|
constructor(logger: Logger, workflowRepository: WorkflowRepository, workflowHistoryRepository: WorkflowHistoryRepository, workflowPublishedVersionRepository: WorkflowPublishedVersionRepository, workflowTriggerActivator: WorkflowTriggerActivator, workflowPublishedDataService: WorkflowPublishedDataService);
|
|
14
|
-
apply(record: WorkflowPublicationOutbox): Promise<PublicationResult>;
|
|
14
|
+
apply(record: WorkflowPublicationOutbox, abort: TriggerOperationAbort): Promise<PublicationResult>;
|
|
15
15
|
private publish;
|
|
16
16
|
private unpublish;
|
|
17
17
|
private classifyActivationOutcome;
|
|
@@ -33,18 +33,18 @@ let WorkflowPublicationApplier = class WorkflowPublicationApplier {
|
|
|
33
33
|
this.workflowPublishedDataService = workflowPublishedDataService;
|
|
34
34
|
this.logger = this.logger.scoped('workflow-publication');
|
|
35
35
|
}
|
|
36
|
-
async apply(record) {
|
|
36
|
+
async apply(record, abort) {
|
|
37
37
|
const { workflow, oldVersion, newVersion } = await this.resolveVersions(record);
|
|
38
38
|
if (!workflow)
|
|
39
39
|
return { type: 'skipped', reason: 'workflow-not-found' };
|
|
40
40
|
if (workflow.activeVersionId === null) {
|
|
41
|
-
return await this.unpublish(workflow, oldVersion, record);
|
|
41
|
+
return await this.unpublish(workflow, oldVersion, record, abort);
|
|
42
42
|
}
|
|
43
43
|
if (!newVersion)
|
|
44
44
|
return { type: 'version-missing' };
|
|
45
|
-
return await this.publish(workflow, oldVersion, newVersion, record);
|
|
45
|
+
return await this.publish(workflow, oldVersion, newVersion, record, abort);
|
|
46
46
|
}
|
|
47
|
-
async publish(workflow, oldVersion, newVersion, record) {
|
|
47
|
+
async publish(workflow, oldVersion, newVersion, record, abort) {
|
|
48
48
|
const oldTriggerNodes = this.workflowTriggerActivator.getEnabledTriggerNodes(oldVersion);
|
|
49
49
|
const desiredTriggerNodes = this.workflowTriggerActivator.getEnabledTriggerNodes(newVersion);
|
|
50
50
|
const triggerKinds = this.workflowTriggerActivator.getTriggerKinds(desiredTriggerNodes);
|
|
@@ -70,14 +70,16 @@ let WorkflowPublicationApplier = class WorkflowPublicationApplier {
|
|
|
70
70
|
}),
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
|
+
abort.signal.throwIfAborted();
|
|
73
74
|
if (toRemove.size > 0 && oldVersion) {
|
|
74
|
-
await this.workflowTriggerActivator.deactivate(workflow, oldVersion, toRemove);
|
|
75
|
+
await this.workflowTriggerActivator.deactivate(workflow, oldVersion, toRemove, abort);
|
|
75
76
|
}
|
|
76
77
|
await this.advancePublishedVersion(record);
|
|
77
78
|
try {
|
|
79
|
+
abort.signal.throwIfAborted();
|
|
78
80
|
if (toAdd.size > 0) {
|
|
79
81
|
const activationMode = ACTIVATION_MODE_BY_REASON[record.reason ?? db_1.WorkflowPublicationReason.Publish];
|
|
80
|
-
const outcome = await this.workflowTriggerActivator.activate(workflow, newVersion, toAdd, activationMode);
|
|
82
|
+
const outcome = await this.workflowTriggerActivator.activate(workflow, newVersion, toAdd, activationMode, abort);
|
|
81
83
|
return this.classifyActivationOutcome(outcome, desiredTriggerNodes, triggerKinds);
|
|
82
84
|
}
|
|
83
85
|
if (toRemove.size > 0) {
|
|
@@ -95,10 +97,11 @@ let WorkflowPublicationApplier = class WorkflowPublicationApplier {
|
|
|
95
97
|
}),
|
|
96
98
|
};
|
|
97
99
|
}
|
|
98
|
-
async unpublish(workflow, oldVersion, record) {
|
|
100
|
+
async unpublish(workflow, oldVersion, record, abort) {
|
|
99
101
|
const toRemove = new Set(this.workflowTriggerActivator.getEnabledTriggerNodes(oldVersion).map((node) => node.id));
|
|
100
102
|
if (oldVersion && toRemove.size > 0) {
|
|
101
|
-
|
|
103
|
+
abort.signal.throwIfAborted();
|
|
104
|
+
await this.workflowTriggerActivator.deactivate(workflow, oldVersion, toRemove, abort);
|
|
102
105
|
}
|
|
103
106
|
await this.workflowPublishedDataService.invalidateCache(record.workflowId);
|
|
104
107
|
await this.workflowPublishedVersionRepository.removePublishedVersion(record.workflowId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-publication-applier.js","sourceRoot":"","sources":["../../../src/workflows/publication/workflow-publication-applier.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,gCASiB;AACjB,gCAAkC;AAClC,iEAA6D;AAO7D,uEAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"workflow-publication-applier.js","sourceRoot":"","sources":["../../../src/workflows/publication/workflow-publication-applier.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,6 +32,8 @@ export declare class WorkflowPublicationOutboxConsumer {
|
|
|
32
32
|
drainPending(): Promise<number>;
|
|
33
33
|
private runDrain;
|
|
34
34
|
private shouldKeepPolling;
|
|
35
|
-
|
|
35
|
+
private processRecordWithAbort;
|
|
36
|
+
private raceTimeout;
|
|
37
|
+
processRecord(record: WorkflowPublicationOutbox, signal: AbortSignal): Promise<void>;
|
|
36
38
|
private toOutcomeLabels;
|
|
37
39
|
}
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.WorkflowPublicationOutboxConsumer = void 0;
|
|
13
13
|
const backend_common_1 = require("@n8n/backend-common");
|
|
14
14
|
const config_1 = require("@n8n/config");
|
|
15
|
+
const constants_1 = require("@n8n/constants");
|
|
15
16
|
const db_1 = require("@n8n/db");
|
|
16
17
|
const decorators_1 = require("@n8n/decorators");
|
|
17
18
|
const di_1 = require("@n8n/di");
|
|
@@ -22,6 +23,10 @@ const event_service_1 = require("../../events/event.service");
|
|
|
22
23
|
const publication_status_reporter_1 = require("../../workflows/publication/publication-status-reporter");
|
|
23
24
|
const workflow_publication_lifecycle_lock_1 = require("../../workflows/publication/workflow-publication-lifecycle-lock");
|
|
24
25
|
const workflow_publication_applier_1 = require("../../workflows/publication/workflow-publication-applier");
|
|
26
|
+
const TIMED_OUT = Symbol('timed-out');
|
|
27
|
+
const ABORT_AFTER_LEASE_FRACTION = 0.7;
|
|
28
|
+
const ABANDON_GRACE_MS = 10 * constants_1.Time.seconds.toMilliseconds;
|
|
29
|
+
const ABANDON_GRACE_LEASE_FRACTION = 0.25;
|
|
25
30
|
let WorkflowPublicationOutboxConsumer = class WorkflowPublicationOutboxConsumer {
|
|
26
31
|
constructor(logger, workflowsConfig, errorReporter, outboxRepository, applier, reporter, instanceSettings, lifecycleLock, tracing, eventService) {
|
|
27
32
|
this.logger = logger;
|
|
@@ -116,19 +121,19 @@ let WorkflowPublicationOutboxConsumer = class WorkflowPublicationOutboxConsumer
|
|
|
116
121
|
attributes: { 'n8n.publication.consumer_concurrency': concurrency },
|
|
117
122
|
}, async (span) => {
|
|
118
123
|
let processed = 0;
|
|
119
|
-
let
|
|
124
|
+
let workerFailed = false;
|
|
120
125
|
const runWorker = async () => {
|
|
121
|
-
while (!
|
|
126
|
+
while (!workerFailed && this.shouldKeepPolling()) {
|
|
122
127
|
const record = await this.outboxRepository.claimNextPendingRecord();
|
|
123
128
|
if (!record)
|
|
124
129
|
break;
|
|
125
|
-
await this.
|
|
126
|
-
|
|
130
|
+
if (await this.processRecordWithAbort(record))
|
|
131
|
+
processed++;
|
|
127
132
|
}
|
|
128
133
|
};
|
|
129
134
|
const workerTasks = Array.from({ length: concurrency }, async () => {
|
|
130
135
|
await runWorker().catch((error) => {
|
|
131
|
-
|
|
136
|
+
workerFailed = true;
|
|
132
137
|
throw error;
|
|
133
138
|
});
|
|
134
139
|
});
|
|
@@ -144,7 +149,36 @@ let WorkflowPublicationOutboxConsumer = class WorkflowPublicationOutboxConsumer
|
|
|
144
149
|
shouldKeepPolling() {
|
|
145
150
|
return this.isPolling && !this.isShuttingDown;
|
|
146
151
|
}
|
|
147
|
-
async
|
|
152
|
+
async processRecordWithAbort(record) {
|
|
153
|
+
const leaseMs = this.workflowsConfig.publicationOutboxLeaseSeconds * constants_1.Time.seconds.toMilliseconds;
|
|
154
|
+
const abortAfterMs = leaseMs * ABORT_AFTER_LEASE_FRACTION;
|
|
155
|
+
const abandonGraceMs = Math.min(ABANDON_GRACE_MS, leaseMs * ABANDON_GRACE_LEASE_FRACTION);
|
|
156
|
+
const controller = new AbortController();
|
|
157
|
+
const work = this.processRecord(record, controller.signal);
|
|
158
|
+
if ((await this.raceTimeout(work, abortAfterMs)) !== TIMED_OUT)
|
|
159
|
+
return true;
|
|
160
|
+
controller.abort(new n8n_workflow_1.OperationalError('Workflow publication processing exceeded its deadline'));
|
|
161
|
+
if ((await this.raceTimeout(work, abandonGraceMs)) !== TIMED_OUT)
|
|
162
|
+
return true;
|
|
163
|
+
void work.catch((error) => this.errorReporter.error((0, ensure_error_1.ensureError)(error), { shouldBeLogged: true }));
|
|
164
|
+
this.errorReporter.error(new n8n_workflow_1.OperationalError('Abandoned workflow publication outbox record: processing did not stop after abort', { extra: { outboxId: record.id, workflowId: record.workflowId } }), { shouldBeLogged: true });
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
async raceTimeout(promise, timeoutMs) {
|
|
168
|
+
let timer;
|
|
169
|
+
try {
|
|
170
|
+
return await Promise.race([
|
|
171
|
+
promise,
|
|
172
|
+
new Promise((resolve) => {
|
|
173
|
+
timer = setTimeout(() => resolve(TIMED_OUT), timeoutMs);
|
|
174
|
+
}),
|
|
175
|
+
]);
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async processRecord(record, signal) {
|
|
148
182
|
await this.tracing.startSpan({
|
|
149
183
|
name: 'Publication outbox record',
|
|
150
184
|
op: 'publication.outbox.process_record',
|
|
@@ -163,6 +197,13 @@ let WorkflowPublicationOutboxConsumer = class WorkflowPublicationOutboxConsumer
|
|
|
163
197
|
});
|
|
164
198
|
return;
|
|
165
199
|
}
|
|
200
|
+
if (signal.aborted) {
|
|
201
|
+
this.logger.debug('Skipped applying publication outbox record: aborted', {
|
|
202
|
+
outboxId: record.id,
|
|
203
|
+
workflowId: record.workflowId,
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
166
207
|
this.logger.debug('Started processing workflow publication outbox record', {
|
|
167
208
|
outboxId: record.id,
|
|
168
209
|
workflowId: record.workflowId,
|
|
@@ -170,14 +211,21 @@ let WorkflowPublicationOutboxConsumer = class WorkflowPublicationOutboxConsumer
|
|
|
170
211
|
});
|
|
171
212
|
const startedAt = Date.now();
|
|
172
213
|
let result;
|
|
214
|
+
const detachedWork = [];
|
|
215
|
+
const abort = {
|
|
216
|
+
signal,
|
|
217
|
+
onDetached: (work) => detachedWork.push(work),
|
|
218
|
+
};
|
|
173
219
|
try {
|
|
174
|
-
result = await this.applier.apply(record);
|
|
220
|
+
result = await this.applier.apply(record, abort);
|
|
175
221
|
}
|
|
176
222
|
catch (error) {
|
|
177
223
|
const cause = (0, ensure_error_1.ensureError)(error);
|
|
178
224
|
result = {
|
|
179
225
|
type: 'failed',
|
|
180
|
-
error:
|
|
226
|
+
error: signal.aborted
|
|
227
|
+
? cause
|
|
228
|
+
: new n8n_workflow_1.UnexpectedError(`Unexpected: ${cause.message}`, { cause }),
|
|
181
229
|
};
|
|
182
230
|
}
|
|
183
231
|
let reporterFailed = false;
|
|
@@ -198,6 +246,10 @@ let WorkflowPublicationOutboxConsumer = class WorkflowPublicationOutboxConsumer
|
|
|
198
246
|
result: result.type,
|
|
199
247
|
});
|
|
200
248
|
span.setAttribute('n8n.publication.result', result.type);
|
|
249
|
+
if (detachedWork.length > 0) {
|
|
250
|
+
this.logger.warn('Keeping workflow publication lock held until abandoned trigger operations settle', { outboxId: record.id, workflowId: record.workflowId });
|
|
251
|
+
await Promise.allSettled(detachedWork);
|
|
252
|
+
}
|
|
201
253
|
});
|
|
202
254
|
span.setStatus({ code: 1 });
|
|
203
255
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-publication-outbox-consumer.js","sourceRoot":"","sources":["../../../src/workflows/publication/workflow-publication-outbox-consumer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,wCAA8C;AAC9C,gCAAyF;AACzF,gDAA8E;AAC9E,gCAAkC;AAClC,uCAAgF;AAChF,iEAA6D;AAC7D,+
|
|
1
|
+
{"version":3,"file":"workflow-publication-outbox-consumer.js","sourceRoot":"","sources":["../../../src/workflows/publication/workflow-publication-outbox-consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const isTransientActivationError: (error: Error) => boolean;
|
|
2
|
-
export declare function retryTriggerActivation(activate: () => Promise<void>, maxAttempts: number): Promise<void>;
|
|
2
|
+
export declare function retryTriggerActivation(activate: () => Promise<void>, maxAttempts: number, signal: AbortSignal): Promise<void>;
|
|
@@ -8,17 +8,18 @@ const n8n_workflow_1 = require("n8n-workflow");
|
|
|
8
8
|
const constants_1 = require("../../constants");
|
|
9
9
|
const isTransientActivationError = (error) => !(error instanceof n8n_workflow_1.WebhookPathTakenError);
|
|
10
10
|
exports.isTransientActivationError = isTransientActivationError;
|
|
11
|
-
async function retryTriggerActivation(activate, maxAttempts) {
|
|
11
|
+
async function retryTriggerActivation(activate, maxAttempts, signal) {
|
|
12
12
|
for (let attempt = 0;; attempt++) {
|
|
13
|
+
signal.throwIfAborted();
|
|
13
14
|
try {
|
|
14
15
|
await activate();
|
|
15
16
|
return;
|
|
16
17
|
}
|
|
17
18
|
catch (error) {
|
|
18
19
|
const isLastAttempt = attempt >= maxAttempts - 1;
|
|
19
|
-
if (!(0, exports.isTransientActivationError)((0, ensure_error_1.ensureError)(error)) || isLastAttempt)
|
|
20
|
+
if (!(0, exports.isTransientActivationError)((0, ensure_error_1.ensureError)(error)) || isLastAttempt || signal.aborted)
|
|
20
21
|
throw error;
|
|
21
|
-
await (0, sleep_1.sleep)(Math.min(constants_1.WORKFLOW_REACTIVATE_INITIAL_TIMEOUT * 2 ** attempt, constants_1.WORKFLOW_REACTIVATE_MAX_TIMEOUT));
|
|
22
|
+
await (0, sleep_1.sleep)(Math.min(constants_1.WORKFLOW_REACTIVATE_INITIAL_TIMEOUT * 2 ** attempt, constants_1.WORKFLOW_REACTIVATE_MAX_TIMEOUT), signal);
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-activation-retry.js","sourceRoot":"","sources":["../../../src/workflows/triggers/trigger-activation-retry.ts"],"names":[],"mappings":";;;;AAAA,iEAA6D;AAC7D,4CAAyC;AACzC,+CAAqD;AAErD,2CAAmG;AAK5F,MAAM,0BAA0B,GAAG,CAAC,KAAY,EAAW,EAAE,CACnE,CAAC,CAAC,KAAK,YAAY,oCAAqB,CAAC,CAAC;AAD9B,QAAA,0BAA0B,GAA1B,0BAA0B,CACI;
|
|
1
|
+
{"version":3,"file":"trigger-activation-retry.js","sourceRoot":"","sources":["../../../src/workflows/triggers/trigger-activation-retry.ts"],"names":[],"mappings":";;;;AAAA,iEAA6D;AAC7D,4CAAyC;AACzC,+CAAqD;AAErD,2CAAmG;AAK5F,MAAM,0BAA0B,GAAG,CAAC,KAAY,EAAW,EAAE,CACnE,CAAC,CAAC,KAAK,YAAY,oCAAqB,CAAC,CAAC;AAD9B,QAAA,0BAA0B,GAA1B,0BAA0B,CACI;AAWpC,KAAK,iCACX,QAA6B,EAC7B,WAAmB,EACnB,MAAmB;IAEnB,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,CAAC;YACJ,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,aAAa,GAAG,OAAO,IAAI,WAAW,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,IAAA,QAAA,0BAA0B,EAAC,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC,IAAI,aAAa,IAAI,MAAM,CAAC,OAAO;gBACrF,MAAM,KAAK,CAAC;YAKb,MAAM,IAAA,aAAK,EACV,IAAI,CAAC,GAAG,CACP,+CAAmC,GAAG,CAAC,IAAI,OAAO,EAClD,2CAA+B,CAC/B,EACD,MAAM,CACN,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -16,6 +16,10 @@ export type WorkflowTriggerVersion = {
|
|
|
16
16
|
nodes: INode[];
|
|
17
17
|
connections: IConnections;
|
|
18
18
|
};
|
|
19
|
+
export interface TriggerOperationAbort {
|
|
20
|
+
signal: AbortSignal;
|
|
21
|
+
onDetached: (work: Promise<unknown>) => void;
|
|
22
|
+
}
|
|
19
23
|
export type TriggerActivationFailure = {
|
|
20
24
|
nodeId: INode['id'];
|
|
21
25
|
nodeName: string;
|
|
@@ -45,9 +49,9 @@ export declare class WorkflowTriggerActivator {
|
|
|
45
49
|
getUnregisteredNonWebhookTriggerNodeIds(workflowId: WorkflowId, desiredNodes: INode[]): Set<INode['id']>;
|
|
46
50
|
getNodesWithUnregisteredWebhooks(dbWorkflow: WorkflowEntity, version: WorkflowTriggerVersion): Promise<Set<INode['id']>>;
|
|
47
51
|
private getNonWebhookTriggerNodeIds;
|
|
48
|
-
activate(dbWorkflow: WorkflowEntity, version: WorkflowTriggerVersion, nodeIds: Set<INode['id']>, activationMode: WorkflowActivateMode): Promise<TriggerActivationOutcome>;
|
|
52
|
+
activate(dbWorkflow: WorkflowEntity, version: WorkflowTriggerVersion, nodeIds: Set<INode['id']>, activationMode: WorkflowActivateMode, abort: TriggerOperationAbort): Promise<TriggerActivationOutcome>;
|
|
49
53
|
private activateInternal;
|
|
50
|
-
deactivate(dbWorkflow: WorkflowEntity, version: WorkflowTriggerVersion, nodeIds: Set<INode['id']
|
|
54
|
+
deactivate(dbWorkflow: WorkflowEntity, version: WorkflowTriggerVersion, nodeIds: Set<INode['id']>, abort: TriggerOperationAbort): Promise<void>;
|
|
51
55
|
private deactivateInternal;
|
|
52
56
|
updateTriggerCount(dbWorkflow: WorkflowEntity, version: WorkflowTriggerVersion): Promise<void>;
|
|
53
57
|
private emitTriggerOperation;
|
|
@@ -66,6 +66,29 @@ const trigger_count_service_1 = require("../../workflows/triggers/trigger-count.
|
|
|
66
66
|
const trigger_execution_context_factory_1 = require("../../workflows/triggers/trigger-execution-context.factory");
|
|
67
67
|
const webhook_trigger_registrar_1 = require("../../workflows/triggers/webhook-trigger-registrar");
|
|
68
68
|
const workflow_static_data_service_1 = require("../../workflows/workflow-static-data.service");
|
|
69
|
+
async function raceAbort(promise, abort) {
|
|
70
|
+
const { signal } = abort;
|
|
71
|
+
if (signal.aborted) {
|
|
72
|
+
abort.onDetached(promise);
|
|
73
|
+
throw (0, ensure_error_1.ensureError)(signal.reason);
|
|
74
|
+
}
|
|
75
|
+
let onAbort;
|
|
76
|
+
const aborted = new Promise((_resolve, reject) => {
|
|
77
|
+
onAbort = () => reject((0, ensure_error_1.ensureError)(signal.reason));
|
|
78
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
79
|
+
});
|
|
80
|
+
try {
|
|
81
|
+
return await Promise.race([promise, aborted]);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (signal.aborted)
|
|
85
|
+
abort.onDetached(promise);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
signal.removeEventListener('abort', onAbort);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
69
92
|
const PSEUDO_TRIGGER_NODE_TYPES = new Set([
|
|
70
93
|
n8n_workflow_1.MANUAL_TRIGGER_NODE_TYPE,
|
|
71
94
|
n8n_workflow_1.EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,
|
|
@@ -152,10 +175,10 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
152
175
|
});
|
|
153
176
|
return [...workflow.getTriggerNodes(), ...workflow.getPollNodes()].map((node) => node.id);
|
|
154
177
|
}
|
|
155
|
-
async activate(dbWorkflow, version, nodeIds, activationMode) {
|
|
178
|
+
async activate(dbWorkflow, version, nodeIds, activationMode, abort) {
|
|
156
179
|
const startedAt = Date.now();
|
|
157
180
|
try {
|
|
158
|
-
const outcome = await this.activateInternal(dbWorkflow, version, nodeIds, activationMode);
|
|
181
|
+
const outcome = await this.activateInternal(dbWorkflow, version, nodeIds, activationMode, abort);
|
|
159
182
|
this.emitTriggerOperation('activate', outcome.failures.length === 0 ? 'success' : 'failure', startedAt);
|
|
160
183
|
this.emitTriggerNodeOperations('activate', outcome.activated.length, outcome.failures.length);
|
|
161
184
|
return outcome;
|
|
@@ -165,7 +188,7 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
165
188
|
throw error;
|
|
166
189
|
}
|
|
167
190
|
}
|
|
168
|
-
async activateInternal(dbWorkflow, version, nodeIds, activationMode) {
|
|
191
|
+
async activateInternal(dbWorkflow, version, nodeIds, activationMode, abort) {
|
|
169
192
|
return await this.tracing.startSpan({
|
|
170
193
|
name: 'Trigger activation',
|
|
171
194
|
op: 'publication.trigger.activate',
|
|
@@ -186,8 +209,8 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
186
209
|
try {
|
|
187
210
|
const resolveWorkflowData = this.createWorkflowDataResolver(dbWorkflow);
|
|
188
211
|
const phaseResults = await Promise.allSettled([
|
|
189
|
-
this.registerWebhookTriggers(workflow, additionalData, nodeIds, outcome, activationMode),
|
|
190
|
-
this.registerNonWebhookTriggers(dbWorkflow, workflow, additionalData, resolveWorkflowData, nodeIds, outcome, activationMode),
|
|
212
|
+
this.registerWebhookTriggers(workflow, additionalData, nodeIds, outcome, activationMode, abort),
|
|
213
|
+
this.registerNonWebhookTriggers(dbWorkflow, workflow, additionalData, resolveWorkflowData, nodeIds, outcome, activationMode, abort),
|
|
191
214
|
]);
|
|
192
215
|
this.throwRejectedPhaseError(phaseResults);
|
|
193
216
|
triggerCount = this.triggerCountService.count(workflow, additionalData);
|
|
@@ -208,12 +231,12 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
208
231
|
return outcome;
|
|
209
232
|
});
|
|
210
233
|
}
|
|
211
|
-
async deactivate(dbWorkflow, version, nodeIds) {
|
|
234
|
+
async deactivate(dbWorkflow, version, nodeIds, abort) {
|
|
212
235
|
if (nodeIds.size === 0)
|
|
213
236
|
return;
|
|
214
237
|
const startedAt = Date.now();
|
|
215
238
|
try {
|
|
216
|
-
await this.deactivateInternal(dbWorkflow, version, nodeIds);
|
|
239
|
+
await this.deactivateInternal(dbWorkflow, version, nodeIds, abort);
|
|
217
240
|
this.emitTriggerOperation('deactivate', 'success', startedAt);
|
|
218
241
|
this.emitTriggerNodeOperations('deactivate', nodeIds.size, 0);
|
|
219
242
|
}
|
|
@@ -223,7 +246,7 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
223
246
|
throw error;
|
|
224
247
|
}
|
|
225
248
|
}
|
|
226
|
-
async deactivateInternal(dbWorkflow, version, nodeIds) {
|
|
249
|
+
async deactivateInternal(dbWorkflow, version, nodeIds, abort) {
|
|
227
250
|
await this.tracing.startSpan({
|
|
228
251
|
name: 'Trigger deactivation',
|
|
229
252
|
op: 'publication.trigger.deactivate',
|
|
@@ -239,8 +262,8 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
239
262
|
workflowSettings: dbWorkflow.settings,
|
|
240
263
|
});
|
|
241
264
|
const phaseResults = await Promise.allSettled([
|
|
242
|
-
this.deregisterWebhookTriggers(workflow, additionalData, nodeIds
|
|
243
|
-
this.deregisterNonWebhookTriggers(dbWorkflow.id, workflow, nodeIds),
|
|
265
|
+
this.deregisterWebhookTriggers(workflow, additionalData, nodeIds, abort),
|
|
266
|
+
this.deregisterNonWebhookTriggers(dbWorkflow.id, workflow, nodeIds, abort),
|
|
244
267
|
]);
|
|
245
268
|
this.throwRejectedPhaseError(phaseResults);
|
|
246
269
|
span.setStatus({ code: 1 });
|
|
@@ -310,9 +333,9 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
310
333
|
settings: dbWorkflow.settings,
|
|
311
334
|
});
|
|
312
335
|
}
|
|
313
|
-
async registerWebhookTriggers(workflow, additionalData, nodeIds, outcome, activationMode) {
|
|
336
|
+
async registerWebhookTriggers(workflow, additionalData, nodeIds, outcome, activationMode, abort) {
|
|
314
337
|
const webhooksByNode = this.groupWebhookTriggersByNode(workflow, additionalData, nodeIds);
|
|
315
|
-
const tasks = [...webhooksByNode].map(async ([nodeId, { nodeName, webhooks }]) => await this.registerWebhookTriggersForNode(workflow, nodeId, nodeName, webhooks, activationMode));
|
|
338
|
+
const tasks = [...webhooksByNode].map(async ([nodeId, { nodeName, webhooks }]) => await this.registerWebhookTriggersForNode(workflow, nodeId, nodeName, webhooks, activationMode, abort));
|
|
316
339
|
for (const result of await Promise.all(tasks)) {
|
|
317
340
|
if (result.ok)
|
|
318
341
|
outcome.activated.push(result.result.nodeId);
|
|
@@ -320,15 +343,15 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
320
343
|
outcome.failures.push(result.error);
|
|
321
344
|
}
|
|
322
345
|
}
|
|
323
|
-
async registerWebhookTriggersForNode(workflow, nodeId, nodeName, webhooks, activationMode) {
|
|
346
|
+
async registerWebhookTriggersForNode(workflow, nodeId, nodeName, webhooks, activationMode, abort) {
|
|
324
347
|
try {
|
|
325
348
|
for (const webhookData of webhooks) {
|
|
326
|
-
await (0, trigger_activation_retry_1.retryTriggerActivation)(async () => await this.webhookTriggerRegistrar.register({
|
|
349
|
+
await raceAbort((0, trigger_activation_retry_1.retryTriggerActivation)(async () => await this.webhookTriggerRegistrar.register({
|
|
327
350
|
workflow,
|
|
328
351
|
webhookData,
|
|
329
352
|
mode: 'trigger',
|
|
330
353
|
activation: activationMode,
|
|
331
|
-
}), constants_1.TRIGGER_ACTIVATION_MAX_ATTEMPTS);
|
|
354
|
+
}), constants_1.TRIGGER_ACTIVATION_MAX_ATTEMPTS, abort.signal), abort);
|
|
332
355
|
}
|
|
333
356
|
return (0, result_1.createResultOk)({ nodeId });
|
|
334
357
|
}
|
|
@@ -348,21 +371,35 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
348
371
|
}
|
|
349
372
|
return grouped;
|
|
350
373
|
}
|
|
351
|
-
async deregisterWebhookTriggers(workflow, additionalData, nodeIds) {
|
|
374
|
+
async deregisterWebhookTriggers(workflow, additionalData, nodeIds, abort) {
|
|
352
375
|
const removedNodeNames = [];
|
|
376
|
+
let firstFailure;
|
|
353
377
|
await workflow.expression.acquireIsolate();
|
|
354
378
|
try {
|
|
355
379
|
const webhooks = this.getWebhookTriggersForNodeIds(workflow, additionalData, nodeIds);
|
|
356
|
-
const deregistrationResults = await Promise.allSettled(webhooks.map(async (webhookData) => await this.webhookTriggerRegistrar.deregister({ workflow, webhookData })));
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
removedNodeNames.push(result.value);
|
|
380
|
+
const deregistrationResults = await Promise.allSettled(webhooks.map(async (webhookData) => await raceAbort(this.webhookTriggerRegistrar.deregister({ workflow, webhookData }), abort)));
|
|
381
|
+
const pendingWebhooksByNode = new Map();
|
|
382
|
+
for (const webhookData of webhooks) {
|
|
383
|
+
pendingWebhooksByNode.set(webhookData.node, (pendingWebhooksByNode.get(webhookData.node) ?? 0) + 1);
|
|
361
384
|
}
|
|
385
|
+
deregistrationResults.forEach((result, index) => {
|
|
386
|
+
if (result.status === 'rejected') {
|
|
387
|
+
firstFailure ??= (0, ensure_error_1.ensureError)(result.reason);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const nodeName = webhooks[index].node;
|
|
391
|
+
const pending = (pendingWebhooksByNode.get(nodeName) ?? 0) - 1;
|
|
392
|
+
pendingWebhooksByNode.set(nodeName, pending);
|
|
393
|
+
if (pending === 0)
|
|
394
|
+
removedNodeNames.push(nodeName);
|
|
395
|
+
});
|
|
362
396
|
}
|
|
363
397
|
finally {
|
|
364
398
|
await workflow.expression.releaseIsolate();
|
|
365
399
|
}
|
|
400
|
+
await this.webhookTriggerRegistrar.clearWorkflowWebhooksForNodes(workflow.id, removedNodeNames);
|
|
401
|
+
if (firstFailure)
|
|
402
|
+
throw firstFailure;
|
|
366
403
|
await this.workflowStaticDataService.saveStaticData(workflow);
|
|
367
404
|
return removedNodeNames;
|
|
368
405
|
}
|
|
@@ -371,7 +408,7 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
371
408
|
.getWebhookTriggers(workflow, additionalData)
|
|
372
409
|
.filter((webhookData) => nodeIds.has(workflow.getNode(webhookData.node)?.id ?? ''));
|
|
373
410
|
}
|
|
374
|
-
async registerNonWebhookTriggers(dbWorkflow, workflow, additionalData, resolveWorkflowData, nodeIds, outcome, activationMode) {
|
|
411
|
+
async registerNonWebhookTriggers(dbWorkflow, workflow, additionalData, resolveWorkflowData, nodeIds, outcome, activationMode, abort) {
|
|
375
412
|
const triggerNodeIds = this.getNonWebhookTriggerNodeIdsForNodeIds(workflow, nodeIds);
|
|
376
413
|
if (triggerNodeIds.length === 0)
|
|
377
414
|
return;
|
|
@@ -394,7 +431,7 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
394
431
|
});
|
|
395
432
|
const results = await Promise.all(triggerNodeIds.map(async (nodeId) => {
|
|
396
433
|
try {
|
|
397
|
-
await (0, trigger_activation_retry_1.retryTriggerActivation)(async () => await this.nonWebhookTriggerRegistrar.register(workflow, registration, nodeId), constants_1.TRIGGER_ACTIVATION_MAX_ATTEMPTS);
|
|
434
|
+
await raceAbort((0, trigger_activation_retry_1.retryTriggerActivation)(async () => await this.nonWebhookTriggerRegistrar.register(workflow, registration, nodeId), constants_1.TRIGGER_ACTIVATION_MAX_ATTEMPTS, abort.signal), abort);
|
|
398
435
|
return (0, result_1.createResultOk)(nodeId);
|
|
399
436
|
}
|
|
400
437
|
catch (error) {
|
|
@@ -421,9 +458,9 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
421
458
|
}
|
|
422
459
|
return nodeId;
|
|
423
460
|
}
|
|
424
|
-
async deregisterNonWebhookTriggers(workflowId, workflow, nodeIds) {
|
|
461
|
+
async deregisterNonWebhookTriggers(workflowId, workflow, nodeIds, abort) {
|
|
425
462
|
const triggerNodeIds = this.getNonWebhookTriggerNodeIdsForNodeIds(workflow, nodeIds);
|
|
426
|
-
await Promise.all(triggerNodeIds.map(async (nodeId) => await this.nonWebhookTriggerRegistrar.deregister(workflowId, nodeId)));
|
|
463
|
+
await Promise.all(triggerNodeIds.map(async (nodeId) => await raceAbort(this.nonWebhookTriggerRegistrar.deregister(workflowId, nodeId), abort)));
|
|
427
464
|
}
|
|
428
465
|
getNonWebhookTriggerNodeIdsForNodeIds(workflow, nodeIds) {
|
|
429
466
|
return this.nonWebhookTriggerRegistrar
|
|
@@ -457,7 +494,7 @@ let WorkflowTriggerActivator = class WorkflowTriggerActivator {
|
|
|
457
494
|
finally {
|
|
458
495
|
await workflow.expression.releaseIsolate();
|
|
459
496
|
}
|
|
460
|
-
}, constants_1.TRIGGER_ACTIVATION_MAX_ATTEMPTS);
|
|
497
|
+
}, constants_1.TRIGGER_ACTIVATION_MAX_ATTEMPTS, new AbortController().signal);
|
|
461
498
|
await this.workflowStaticDataService.saveStaticData(workflow);
|
|
462
499
|
await this.activationErrorsService.deregister(workflowId);
|
|
463
500
|
}
|