n8n-nodes-base 2.7.0 → 2.7.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.
- package/dist/nodes/Kafka/KafkaTrigger.node.d.ts.map +1 -1
- package/dist/nodes/Kafka/KafkaTrigger.node.js +190 -179
- package/dist/nodes/Kafka/KafkaTrigger.node.js.map +1 -1
- package/dist/nodes/Kafka/utils.d.ts +96 -0
- package/dist/nodes/Kafka/utils.d.ts.map +1 -0
- package/dist/nodes/Kafka/utils.js +323 -0
- package/dist/nodes/Kafka/utils.js.map +1 -0
- package/dist/typecheck.tsbuildinfo +1 -1
- package/dist/types/nodes.json +3 -3
- package/package.json +7 -7
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createConfig = createConfig;
|
|
4
|
+
exports.createConsumerConfig = createConsumerConfig;
|
|
5
|
+
exports.configureMessageParser = configureMessageParser;
|
|
6
|
+
exports.connectEventListeners = connectEventListeners;
|
|
7
|
+
exports.disconnectEventListeners = disconnectEventListeners;
|
|
8
|
+
exports.setSchemaRegistry = setSchemaRegistry;
|
|
9
|
+
exports.configureDataEmitter = configureDataEmitter;
|
|
10
|
+
exports.getAutoCommitSettings = getAutoCommitSettings;
|
|
11
|
+
exports.runWithHeartbeat = runWithHeartbeat;
|
|
12
|
+
const kafkajs_1 = require("kafkajs");
|
|
13
|
+
const confluent_schema_registry_1 = require("@kafkajs/confluent-schema-registry");
|
|
14
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
15
|
+
// Default delay in milliseconds before retrying after a failed offset resolution.
|
|
16
|
+
// This prevents rapid retry loops that could overwhelm the Kafka broker
|
|
17
|
+
const DEFAULT_ERROR_RETRY_DELAY_MS = 5000;
|
|
18
|
+
/**
|
|
19
|
+
* Creates Kafka client configuration from n8n credentials
|
|
20
|
+
* @param ctx - The trigger function context
|
|
21
|
+
* @returns Kafka configuration object with authentication settings
|
|
22
|
+
*/
|
|
23
|
+
async function createConfig(ctx) {
|
|
24
|
+
const credentials = (await ctx.getCredentials('kafka'));
|
|
25
|
+
const clientId = credentials.clientId;
|
|
26
|
+
const brokers = (credentials.brokers ?? '').split(',').map((item) => item.trim());
|
|
27
|
+
const ssl = credentials.ssl;
|
|
28
|
+
const config = {
|
|
29
|
+
clientId,
|
|
30
|
+
brokers,
|
|
31
|
+
ssl,
|
|
32
|
+
logLevel: kafkajs_1.logLevel.ERROR,
|
|
33
|
+
};
|
|
34
|
+
if (credentials.authentication) {
|
|
35
|
+
if (!(credentials.username && credentials.password)) {
|
|
36
|
+
throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Username and password are required for authentication');
|
|
37
|
+
}
|
|
38
|
+
config.sasl = {
|
|
39
|
+
username: credentials.username,
|
|
40
|
+
password: credentials.password,
|
|
41
|
+
mechanism: credentials.saslMechanism,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return config;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates Kafka consumer configuration with session timeout and heartbeat settings
|
|
48
|
+
* @param ctx - The trigger function context
|
|
49
|
+
* @param options - Kafka trigger options from node parameters
|
|
50
|
+
* @param nodeVersion - The version of the Kafka trigger node
|
|
51
|
+
* @returns Consumer configuration object
|
|
52
|
+
*/
|
|
53
|
+
function createConsumerConfig(ctx, options, nodeVersion) {
|
|
54
|
+
const groupId = ctx.getNodeParameter('groupId');
|
|
55
|
+
const maxInFlightRequests = (ctx.getNodeParameter('options.maxInFlightRequests', null) === 0
|
|
56
|
+
? null
|
|
57
|
+
: ctx.getNodeParameter('options.maxInFlightRequests', null));
|
|
58
|
+
const sessionTimeout = options.sessionTimeout ?? 30000;
|
|
59
|
+
let heartbeatInterval;
|
|
60
|
+
if (nodeVersion < 1.3) {
|
|
61
|
+
heartbeatInterval = options.heartbeatInterval ?? 3000;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
heartbeatInterval = options.heartbeatInterval ?? 10000;
|
|
65
|
+
}
|
|
66
|
+
const rebalanceTimeout = options.rebalanceTimeout ?? 600000;
|
|
67
|
+
const maxBytesPerPartition = options.fetchMaxBytes;
|
|
68
|
+
const minBytes = options.fetchMinBytes;
|
|
69
|
+
const consumerConfig = {
|
|
70
|
+
groupId,
|
|
71
|
+
maxInFlightRequests,
|
|
72
|
+
sessionTimeout,
|
|
73
|
+
heartbeatInterval,
|
|
74
|
+
rebalanceTimeout,
|
|
75
|
+
};
|
|
76
|
+
if (maxBytesPerPartition !== undefined) {
|
|
77
|
+
consumerConfig.maxBytesPerPartition = maxBytesPerPartition;
|
|
78
|
+
}
|
|
79
|
+
if (minBytes !== undefined) {
|
|
80
|
+
consumerConfig.minBytes = minBytes;
|
|
81
|
+
}
|
|
82
|
+
return consumerConfig;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Configures a message parser function that processes Kafka messages based on node options
|
|
86
|
+
* @param options - Kafka trigger options for parsing behavior
|
|
87
|
+
* @param logger - Logger instance for warnings
|
|
88
|
+
* @param registry - Optional schema registry for message decoding
|
|
89
|
+
* @param prepareBinaryData - Helper function to prepare binary data
|
|
90
|
+
* @returns Async function that parses Kafka messages into n8n execution data
|
|
91
|
+
*/
|
|
92
|
+
function configureMessageParser(options, logger, registry, prepareBinaryData) {
|
|
93
|
+
return async (message, messageTopic) => {
|
|
94
|
+
let data = {};
|
|
95
|
+
let value = message.value?.toString();
|
|
96
|
+
const binary = {};
|
|
97
|
+
if (options.jsonParseMessage) {
|
|
98
|
+
try {
|
|
99
|
+
value = (0, n8n_workflow_1.jsonParse)(value);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
logger.warn('Could not parse message to JSON, returning as string', { error });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (registry) {
|
|
106
|
+
try {
|
|
107
|
+
value = await registry.decode(message.value);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger.warn('Could not decode message with Schema Registry, returning original message', {
|
|
111
|
+
error,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Preserve raw binary data for downstream processing (only in v1.2+)
|
|
116
|
+
if (options.keepBinaryData && message.value) {
|
|
117
|
+
const binaryData = await prepareBinaryData(message.value, 'message', 'application/octet-stream');
|
|
118
|
+
binary.data = binaryData;
|
|
119
|
+
}
|
|
120
|
+
if (options.returnHeaders && message.headers) {
|
|
121
|
+
data.headers = Object.fromEntries(Object.entries(message.headers).map(([headerKey, headerValue]) => [
|
|
122
|
+
headerKey,
|
|
123
|
+
headerValue?.toString('utf8') ?? '',
|
|
124
|
+
]));
|
|
125
|
+
}
|
|
126
|
+
data.message = value;
|
|
127
|
+
data.topic = messageTopic;
|
|
128
|
+
if (options.onlyMessage) {
|
|
129
|
+
data = value;
|
|
130
|
+
}
|
|
131
|
+
if (options.keepBinaryData && Object.keys(binary).length) {
|
|
132
|
+
return { json: data, binary };
|
|
133
|
+
}
|
|
134
|
+
return { json: data };
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Attaches event listeners to the Kafka consumer for monitoring and logging
|
|
139
|
+
* @param consumer - The Kafka consumer instance
|
|
140
|
+
* @param logger - Logger instance for event logging
|
|
141
|
+
* @returns Array of listener removal functions
|
|
142
|
+
*/
|
|
143
|
+
function connectEventListeners(consumer, logger) {
|
|
144
|
+
const onConnected = consumer.on(consumer.events.CONNECT, () => {
|
|
145
|
+
logger.debug('Kafka consumer connected');
|
|
146
|
+
});
|
|
147
|
+
const onGroupJoin = consumer.on(consumer.events.GROUP_JOIN, () => {
|
|
148
|
+
logger.debug('Consumer has joined the group');
|
|
149
|
+
});
|
|
150
|
+
const onRequestTimeout = consumer.on(consumer.events.REQUEST_TIMEOUT, () => {
|
|
151
|
+
logger.error('Consumer request timed out');
|
|
152
|
+
});
|
|
153
|
+
const onUnsubscribedtopicsReceived = consumer.on(consumer.events.RECEIVED_UNSUBSCRIBED_TOPICS, () => {
|
|
154
|
+
logger.warn('Consumer received messages for unsubscribed topics');
|
|
155
|
+
});
|
|
156
|
+
const onStop = consumer.on(consumer.events.STOP, async (error) => {
|
|
157
|
+
logger.error('Consumer has stopped', { error });
|
|
158
|
+
});
|
|
159
|
+
const onDisconnect = consumer.on(consumer.events.DISCONNECT, async (error) => {
|
|
160
|
+
logger.error('Consumer has disconnected', { error });
|
|
161
|
+
});
|
|
162
|
+
const onCommitOffsets = consumer.on(consumer.events.COMMIT_OFFSETS, () => {
|
|
163
|
+
logger.debug('Consumer offsets committed!');
|
|
164
|
+
});
|
|
165
|
+
const onRebalancing = consumer.on(consumer.events.REBALANCING, (payload) => {
|
|
166
|
+
logger.debug('Consumer is rebalancing', { payload });
|
|
167
|
+
});
|
|
168
|
+
const onCrash = consumer.on(consumer.events.CRASH, async (error) => {
|
|
169
|
+
logger.error('Consumer has crashed', { error });
|
|
170
|
+
});
|
|
171
|
+
return [
|
|
172
|
+
onConnected,
|
|
173
|
+
onGroupJoin,
|
|
174
|
+
onRequestTimeout,
|
|
175
|
+
onUnsubscribedtopicsReceived,
|
|
176
|
+
onStop,
|
|
177
|
+
onDisconnect,
|
|
178
|
+
onCommitOffsets,
|
|
179
|
+
onRebalancing,
|
|
180
|
+
onCrash,
|
|
181
|
+
];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Removes all event listeners from the Kafka consumer
|
|
185
|
+
* @param listeners - Array of listener removal functions
|
|
186
|
+
*/
|
|
187
|
+
function disconnectEventListeners(listeners) {
|
|
188
|
+
listeners.forEach((listener) => listener());
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Initializes Confluent Schema Registry if enabled in node parameters
|
|
192
|
+
* @param ctx - The trigger function context
|
|
193
|
+
* @returns Schema registry instance or undefined if not configured
|
|
194
|
+
*/
|
|
195
|
+
function setSchemaRegistry(ctx) {
|
|
196
|
+
const useSchemaRegistry = ctx.getNodeParameter('useSchemaRegistry', 0);
|
|
197
|
+
if (useSchemaRegistry) {
|
|
198
|
+
try {
|
|
199
|
+
const schemaRegistryUrl = ctx.getNodeParameter('schemaRegistryUrl', 0);
|
|
200
|
+
return new confluent_schema_registry_1.SchemaRegistry({ host: schemaRegistryUrl });
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
ctx.logger.warn('Could not connect to Schema Registry', { error });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Determines the offset resolution mode based on node version and configuration
|
|
210
|
+
* @param ctx - The trigger function context
|
|
211
|
+
* @param options - Kafka trigger options
|
|
212
|
+
* @param nodeVersion - The version of the Kafka trigger node
|
|
213
|
+
* @returns The offset resolution mode
|
|
214
|
+
*/
|
|
215
|
+
function getResolveOffsetMode(ctx, options, nodeVersion) {
|
|
216
|
+
if (nodeVersion === 1)
|
|
217
|
+
return 'immediately';
|
|
218
|
+
if (nodeVersion === 1.1) {
|
|
219
|
+
if (options.parallelProcessing)
|
|
220
|
+
return 'immediately';
|
|
221
|
+
return 'onCompletion';
|
|
222
|
+
}
|
|
223
|
+
return ctx.getNodeParameter('resolveOffset', 'immediately');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Configures a data emitter function that handles workflow execution and offset resolution
|
|
227
|
+
* @param ctx - The trigger function context
|
|
228
|
+
* @param options - Kafka trigger options
|
|
229
|
+
* @param nodeVersion - The version of the Kafka trigger node
|
|
230
|
+
* @returns Async function that emits data and waits for execution completion based on resolve mode
|
|
231
|
+
*/
|
|
232
|
+
function configureDataEmitter(ctx, options, nodeVersion) {
|
|
233
|
+
const resolveOffsetMode = getResolveOffsetMode(ctx, options, nodeVersion);
|
|
234
|
+
// For manual mode, always use immediate emit (no donePromise)
|
|
235
|
+
if (ctx.getMode() === 'manual' || resolveOffsetMode === 'immediately') {
|
|
236
|
+
return async (dataArray) => {
|
|
237
|
+
ctx.emit([dataArray]);
|
|
238
|
+
return { success: true };
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const executionTimeoutInSeconds = ctx.getWorkflowSettings().executionTimeout ?? 3600;
|
|
242
|
+
const errorRetryDelay = options.errorRetryDelay ?? DEFAULT_ERROR_RETRY_DELAY_MS;
|
|
243
|
+
const allowedStatuses = [];
|
|
244
|
+
if (resolveOffsetMode === 'onSuccess') {
|
|
245
|
+
allowedStatuses.push('success');
|
|
246
|
+
}
|
|
247
|
+
else if (resolveOffsetMode === 'onStatus') {
|
|
248
|
+
const selectedStatuses = ctx.getNodeParameter('allowedStatuses', []);
|
|
249
|
+
if (Array.isArray(selectedStatuses) && selectedStatuses.length) {
|
|
250
|
+
allowedStatuses.push(...selectedStatuses);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'At least one execution status must be selected to resolve offsets on selected statuses.');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return async (dataArray) => {
|
|
257
|
+
let timeoutId;
|
|
258
|
+
try {
|
|
259
|
+
const responsePromise = ctx.helpers.createDeferredPromise();
|
|
260
|
+
ctx.emit([dataArray], undefined, responsePromise);
|
|
261
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
262
|
+
timeoutId = setTimeout(() => {
|
|
263
|
+
reject(new n8n_workflow_1.NodeOperationError(ctx.getNode(), `Execution took longer than the configured workflow timeout of ${executionTimeoutInSeconds} seconds to complete, offsets not resolved.`));
|
|
264
|
+
}, executionTimeoutInSeconds * 1000);
|
|
265
|
+
});
|
|
266
|
+
const run = await Promise.race([responsePromise.promise, timeoutPromise]);
|
|
267
|
+
if (resolveOffsetMode !== 'onCompletion' && !allowedStatuses.includes(run.status)) {
|
|
268
|
+
throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Execution status is not allowed for resolving offsets, current status: ' + run.status);
|
|
269
|
+
}
|
|
270
|
+
return { success: true };
|
|
271
|
+
}
|
|
272
|
+
catch (e) {
|
|
273
|
+
await (0, n8n_workflow_1.sleep)(errorRetryDelay);
|
|
274
|
+
const error = (0, n8n_workflow_1.ensureError)(e);
|
|
275
|
+
ctx.logger.error(error.message, { error });
|
|
276
|
+
return { success: false };
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
if (timeoutId)
|
|
280
|
+
clearTimeout(timeoutId);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Determines auto-commit settings based on node's optons
|
|
286
|
+
* @param options - Kafka trigger options
|
|
287
|
+
* @returns Object with auto-commit configuration
|
|
288
|
+
*/
|
|
289
|
+
function getAutoCommitSettings(options) {
|
|
290
|
+
const eachBatchAutoResolve = options.eachBatchAutoResolve ?? false;
|
|
291
|
+
const autoCommitInterval = options.autoCommitInterval ?? undefined;
|
|
292
|
+
const autoCommitThreshold = options.autoCommitThreshold ?? undefined;
|
|
293
|
+
return {
|
|
294
|
+
autoCommit: true,
|
|
295
|
+
eachBatchAutoResolve,
|
|
296
|
+
autoCommitInterval,
|
|
297
|
+
autoCommitThreshold,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Runs a task while periodically invoking a heartbeat function
|
|
302
|
+
* at specified intervals to prevent session timeout
|
|
303
|
+
* @param task - The promise to execute
|
|
304
|
+
* @param heartbeat - The heartbeat function to call periodically
|
|
305
|
+
* @param intervalMs - The interval in milliseconds between heartbeat calls (default: 3000)
|
|
306
|
+
* @returns The result of the task promise
|
|
307
|
+
*/
|
|
308
|
+
async function runWithHeartbeat(task, heartbeat, intervalMs = 3000) {
|
|
309
|
+
let timer;
|
|
310
|
+
try {
|
|
311
|
+
timer = setInterval(async () => {
|
|
312
|
+
try {
|
|
313
|
+
await heartbeat();
|
|
314
|
+
}
|
|
315
|
+
catch (error) { }
|
|
316
|
+
}, intervalMs);
|
|
317
|
+
return await task;
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
clearInterval(timer);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../nodes/Kafka/utils.ts"],"names":[],"mappings":"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"}
|