n8n-nodes-bozonx-redis-sugar 1.17.0 → 1.20.0

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 (35) hide show
  1. package/README.md +157 -16
  2. package/dist/nodes/RedisCache/BozonxRedisCache.node.js +21 -6
  3. package/dist/nodes/RedisCache/BozonxRedisCache.node.js.map +1 -1
  4. package/dist/nodes/RedisCache/redisClient.js +19 -1
  5. package/dist/nodes/RedisCache/redisClient.js.map +1 -1
  6. package/dist/nodes/RedisQueueComplete/BozonxRedisQueueComplete.node.d.ts +5 -0
  7. package/dist/nodes/RedisQueueComplete/BozonxRedisQueueComplete.node.js +128 -0
  8. package/dist/nodes/RedisQueueComplete/BozonxRedisQueueComplete.node.js.map +1 -0
  9. package/dist/nodes/RedisQueueComplete/redis-queue-complete.svg +4 -0
  10. package/dist/nodes/RedisQueueComplete/redisClient.d.ts +9 -0
  11. package/dist/nodes/RedisQueueComplete/redisClient.js +93 -0
  12. package/dist/nodes/RedisQueueComplete/redisClient.js.map +1 -0
  13. package/dist/nodes/RedisQueueConsumer/BozonxRedisQueueConsumer.node.d.ts +5 -0
  14. package/dist/nodes/RedisQueueConsumer/BozonxRedisQueueConsumer.node.js +179 -0
  15. package/dist/nodes/RedisQueueConsumer/BozonxRedisQueueConsumer.node.js.map +1 -0
  16. package/dist/nodes/RedisQueueConsumer/redis-queue-consumer.svg +4 -0
  17. package/dist/nodes/RedisQueueConsumer/redisClient.d.ts +9 -0
  18. package/dist/nodes/RedisQueueConsumer/redisClient.js +93 -0
  19. package/dist/nodes/RedisQueueConsumer/redisClient.js.map +1 -0
  20. package/dist/nodes/RedisQueueProducer/BozonxRedisQueueProducer.node.d.ts +5 -0
  21. package/dist/nodes/RedisQueueProducer/BozonxRedisQueueProducer.node.js +224 -0
  22. package/dist/nodes/RedisQueueProducer/BozonxRedisQueueProducer.node.js.map +1 -0
  23. package/dist/nodes/RedisQueueProducer/redis-queue-producer.svg +4 -0
  24. package/dist/nodes/RedisQueueProducer/redisClient.d.ts +10 -0
  25. package/dist/nodes/RedisQueueProducer/redisClient.js +97 -0
  26. package/dist/nodes/RedisQueueProducer/redisClient.js.map +1 -0
  27. package/dist/nodes/RedisStreamProducer/BozonxRedisStreamProducer.node.js +54 -84
  28. package/dist/nodes/RedisStreamProducer/BozonxRedisStreamProducer.node.js.map +1 -1
  29. package/dist/nodes/RedisStreamProducer/redisClient.js +20 -2
  30. package/dist/nodes/RedisStreamProducer/redisClient.js.map +1 -1
  31. package/dist/nodes/RedisStreamTrigger/BozonxRedisStreamTrigger.node.js +4 -11
  32. package/dist/nodes/RedisStreamTrigger/BozonxRedisStreamTrigger.node.js.map +1 -1
  33. package/dist/package.json +12 -8
  34. package/dist/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +12 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redisClient.js","sourceRoot":"","sources":["../../../nodes/RedisQueueComplete/redisClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ITriggerFunctions, type INodeType, type INodeTypeDescription, type ITriggerResponse } from 'n8n-workflow';
2
+ export declare class BozonxRedisQueueConsumer implements INodeType {
3
+ description: INodeTypeDescription;
4
+ trigger(this: ITriggerFunctions): Promise<ITriggerResponse>;
5
+ }
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BozonxRedisQueueConsumer = void 0;
4
+ const redisClient_1 = require("./redisClient");
5
+ class BozonxRedisQueueConsumer {
6
+ constructor() {
7
+ this.description = {
8
+ displayName: 'Redis Queue Trigger',
9
+ name: 'bozonxRedisQueueConsumer',
10
+ group: ['trigger'],
11
+ version: 1,
12
+ description: 'Process jobs from a Redis-based queue',
13
+ defaults: { name: 'Redis Queue Trigger' },
14
+ icon: 'file:redis-queue-consumer.svg',
15
+ inputs: [],
16
+ outputs: ['main'],
17
+ credentials: [
18
+ {
19
+ name: 'bozonxRedis',
20
+ required: true,
21
+ },
22
+ ],
23
+ properties: [
24
+ {
25
+ displayName: 'Queue ID',
26
+ name: 'queueId',
27
+ type: 'string',
28
+ default: '',
29
+ placeholder: 'Leave empty to use current workflow ID',
30
+ description: 'Unique identifier for the queue to consume from. Leave empty to use the current workflow ID.',
31
+ },
32
+ {
33
+ displayName: 'Job Name',
34
+ name: 'jobName',
35
+ type: 'string',
36
+ default: '',
37
+ placeholder: 'e.g., user-123, order-456',
38
+ description: 'Optional job name to group jobs within the same queue (must match the Job Name used in Redis Queue Add)',
39
+ },
40
+ ],
41
+ usableAsTool: true,
42
+ };
43
+ }
44
+ async trigger() {
45
+ var _a, _b;
46
+ const creds = await this.getCredentials('bozonxRedis');
47
+ const host = (creds === null || creds === void 0 ? void 0 : creds.host) || 'localhost';
48
+ const port = (_a = creds === null || creds === void 0 ? void 0 : creds.port) !== null && _a !== void 0 ? _a : 6379;
49
+ const username = (creds === null || creds === void 0 ? void 0 : creds.username) || '';
50
+ const password = (creds === null || creds === void 0 ? void 0 : creds.password) || '';
51
+ const tls = (creds === null || creds === void 0 ? void 0 : creds.tls) || false;
52
+ const db = (_b = creds === null || creds === void 0 ? void 0 : creds.db) !== null && _b !== void 0 ? _b : 0;
53
+ const client = await (0, redisClient_1.getRedisClientConnected)({ host, port, username, password, tls, db });
54
+ const c = client;
55
+ let queueId = String(this.getNodeParameter('queueId', 0) || '').trim();
56
+ const jobName = String(this.getNodeParameter('jobName', 0) || '').trim();
57
+ const blpopTimeout = 60;
58
+ const lockTTL = 3600;
59
+ if (!queueId) {
60
+ const workflow = this.getWorkflow();
61
+ queueId = workflow.id || 'default-queue';
62
+ }
63
+ const queueKey = jobName ? `queue:${queueId}:${jobName}` : `queue:${queueId}`;
64
+ const lockKey = jobName ? `queue:${queueId}:${jobName}:lock` : `queue:${queueId}:lock`;
65
+ let running = true;
66
+ const readLoop = async () => {
67
+ var _a, _b, _c, _d;
68
+ while (running) {
69
+ try {
70
+ const lockExists = (await c.sendCommand(['EXISTS', lockKey]));
71
+ if (lockExists === 1) {
72
+ await new Promise((r) => setTimeout(r, 1000));
73
+ continue;
74
+ }
75
+ if (!running)
76
+ break;
77
+ const res = await c.sendCommand(['BLPOP', queueKey, String(blpopTimeout)]);
78
+ if (!res || !Array.isArray(res) || res.length < 2) {
79
+ continue;
80
+ }
81
+ const jobData = res[1];
82
+ let parsedPayload;
83
+ try {
84
+ parsedPayload = JSON.parse(jobData);
85
+ }
86
+ catch (parseError) {
87
+ (_a = this.logger) === null || _a === void 0 ? void 0 : _a.error(`Failed to parse job data from queue ${queueId}: ${parseError.message}`);
88
+ continue;
89
+ }
90
+ if (!parsedPayload.jobId) {
91
+ (_b = this.logger) === null || _b === void 0 ? void 0 : _b.error(`Missing jobId in job payload from queue ${queueId}`);
92
+ continue;
93
+ }
94
+ const effectiveLockTTL = (_c = parsedPayload.lockTTL) !== null && _c !== void 0 ? _c : lockTTL;
95
+ const acquired = await c.sendCommand([
96
+ 'SET',
97
+ lockKey,
98
+ '1',
99
+ 'NX',
100
+ 'EX',
101
+ String(effectiveLockTTL),
102
+ ]);
103
+ if (!acquired) {
104
+ await c.sendCommand(['LPUSH', queueKey, jobData]);
105
+ await new Promise((r) => setTimeout(r, 1000));
106
+ continue;
107
+ }
108
+ const result = {
109
+ data: parsedPayload.data,
110
+ queueId,
111
+ jobName: jobName || null,
112
+ jobId: parsedPayload.jobId,
113
+ };
114
+ this.emit([[{ json: { result } }]]);
115
+ }
116
+ catch (error) {
117
+ (_d = this.logger) === null || _d === void 0 ? void 0 : _d.error(`Error in queue consumer loop: ${error.message}`);
118
+ await new Promise((r) => setTimeout(r, 1000));
119
+ continue;
120
+ }
121
+ }
122
+ };
123
+ void readLoop();
124
+ return {
125
+ closeFunction: async () => {
126
+ running = false;
127
+ },
128
+ manualTriggerFunction: async () => {
129
+ var _a, _b;
130
+ try {
131
+ const lockExists = (await c.sendCommand(['EXISTS', lockKey]));
132
+ if (lockExists === 1) {
133
+ return;
134
+ }
135
+ const res = await c.sendCommand(['BLPOP', queueKey, String(blpopTimeout)]);
136
+ if (!res || !Array.isArray(res) || res.length < 2) {
137
+ return;
138
+ }
139
+ const jobData = res[1];
140
+ let parsedPayload;
141
+ try {
142
+ parsedPayload = JSON.parse(jobData);
143
+ }
144
+ catch {
145
+ return;
146
+ }
147
+ if (!parsedPayload.jobId) {
148
+ return;
149
+ }
150
+ const effectiveLockTTL = (_a = parsedPayload.lockTTL) !== null && _a !== void 0 ? _a : lockTTL;
151
+ const acquired = await c.sendCommand([
152
+ 'SET',
153
+ lockKey,
154
+ '1',
155
+ 'NX',
156
+ 'EX',
157
+ String(effectiveLockTTL),
158
+ ]);
159
+ if (!acquired) {
160
+ await c.sendCommand(['LPUSH', queueKey, jobData]);
161
+ return;
162
+ }
163
+ const result = {
164
+ data: parsedPayload.data,
165
+ queueId,
166
+ jobName: jobName || null,
167
+ jobId: parsedPayload.jobId,
168
+ };
169
+ this.emit([[{ json: { result } }]]);
170
+ }
171
+ catch (error) {
172
+ (_b = this.logger) === null || _b === void 0 ? void 0 : _b.error(`Error in manual trigger: ${error.message}`);
173
+ }
174
+ },
175
+ };
176
+ }
177
+ }
178
+ exports.BozonxRedisQueueConsumer = BozonxRedisQueueConsumer;
179
+ //# sourceMappingURL=BozonxRedisQueueConsumer.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BozonxRedisQueueConsumer.node.js","sourceRoot":"","sources":["../../../nodes/RedisQueueConsumer/BozonxRedisQueueConsumer.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2" fill="#DC382D" stroke="none"/>
3
+ <path d="M8 12l4 4 4-4M12 8v8" stroke="white" stroke-width="2"/>
4
+ </svg>
@@ -0,0 +1,9 @@
1
+ export interface RedisConnectionOptions {
2
+ host: string;
3
+ port: number;
4
+ username?: string;
5
+ password?: string;
6
+ tls?: boolean;
7
+ db?: number;
8
+ }
9
+ export declare function getRedisClientConnected(opts: RedisConnectionOptions): Promise<unknown>;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getRedisClientConnected = getRedisClientConnected;
37
+ const timers_1 = require("timers");
38
+ const REDIS_CONNECT_DEADLINE_MS = 10000;
39
+ function withTimeout(promise, timeoutMs, message) {
40
+ let timeout;
41
+ return Promise.race([
42
+ promise,
43
+ new Promise((_, reject) => {
44
+ timeout = (0, timers_1.setTimeout)(() => reject(new Error(message)), timeoutMs);
45
+ }),
46
+ ]).finally(() => {
47
+ if (timeout)
48
+ (0, timers_1.clearTimeout)(timeout);
49
+ });
50
+ }
51
+ const clients = new Map();
52
+ function buildUrl(opts) {
53
+ var _a;
54
+ const proto = opts.tls ? 'rediss' : 'redis';
55
+ const authPart = opts.username
56
+ ? `${encodeURIComponent(opts.username)}:${encodeURIComponent((_a = opts.password) !== null && _a !== void 0 ? _a : '')}@`
57
+ : opts.password
58
+ ? `:${encodeURIComponent(opts.password)}@`
59
+ : '';
60
+ const dbPath = typeof opts.db === 'number' ? `/${opts.db}` : '';
61
+ return `${proto}://${authPart}${opts.host}:${opts.port}${dbPath}`;
62
+ }
63
+ async function getRedisClientConnected(opts) {
64
+ const url = buildUrl(opts);
65
+ const cached = clients.get(url);
66
+ if (cached) {
67
+ if (cached.isOpen)
68
+ return cached;
69
+ try {
70
+ await withTimeout(cached.connect(), REDIS_CONNECT_DEADLINE_MS, `Redis reconnect timeout after ${REDIS_CONNECT_DEADLINE_MS}ms`);
71
+ return cached;
72
+ }
73
+ catch {
74
+ }
75
+ }
76
+ const { createClient } = await Promise.resolve().then(() => __importStar(require('redis')));
77
+ const client = createClient({
78
+ url,
79
+ disableOfflineQueue: true,
80
+ socket: {
81
+ connectTimeout: 10000,
82
+ reconnectStrategy: (retries) => {
83
+ return Math.min(retries * 100, 3000);
84
+ },
85
+ },
86
+ });
87
+ client.on('error', () => {
88
+ });
89
+ await withTimeout(client.connect(), REDIS_CONNECT_DEADLINE_MS, `Redis connect timeout after ${REDIS_CONNECT_DEADLINE_MS}ms`);
90
+ clients.set(url, client);
91
+ return client;
92
+ }
93
+ //# sourceMappingURL=redisClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redisClient.js","sourceRoot":"","sources":["../../../nodes/RedisQueueConsumer/redisClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type IExecuteFunctions, type INodeExecutionData, type INodeType, type INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class BozonxRedisQueueProducer implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BozonxRedisQueueProducer = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const js_yaml_1 = require("js-yaml");
6
+ const redisClient_1 = require("./redisClient");
7
+ class BozonxRedisQueueProducer {
8
+ constructor() {
9
+ this.description = {
10
+ displayName: 'Redis Queue Add',
11
+ name: 'bozonxRedisQueueProducer',
12
+ group: ['output'],
13
+ version: 1,
14
+ description: 'Add jobs to a Redis-based queue',
15
+ defaults: { name: 'Redis Queue Add' },
16
+ icon: 'file:redis-queue-producer.svg',
17
+ inputs: ['main'],
18
+ outputs: ['main'],
19
+ credentials: [
20
+ {
21
+ name: 'bozonxRedis',
22
+ required: true,
23
+ },
24
+ ],
25
+ properties: [
26
+ {
27
+ displayName: 'Queue ID',
28
+ name: 'queueId',
29
+ type: 'string',
30
+ default: '',
31
+ placeholder: 'Leave empty to use current workflow ID',
32
+ description: 'Unique identifier for the queue. Leave empty to use the current workflow ID.',
33
+ },
34
+ {
35
+ displayName: 'Job Name',
36
+ name: 'jobName',
37
+ type: 'string',
38
+ default: '',
39
+ placeholder: 'e.g., user-123, order-456',
40
+ description: 'Optional job name to group jobs within the same queue (e.g., separate queues per user)',
41
+ },
42
+ {
43
+ displayName: 'Data (YAML / JSON)',
44
+ name: 'data',
45
+ type: 'string',
46
+ typeOptions: {
47
+ rows: 5,
48
+ },
49
+ default: '',
50
+ placeholder: 'foo: bar\ncount: 42\n# or JSON: { "foo": "bar" }',
51
+ description: 'Data in YAML or JSON format. If a string is provided, it will first be parsed as YAML, then as JSON. If an expression returns a non-string value, it will be serialized to JSON. Leave empty to use the incoming item.',
52
+ },
53
+ {
54
+ displayName: 'Lock TTL (seconds)',
55
+ name: 'lockTTL',
56
+ type: 'number',
57
+ default: 3600,
58
+ typeOptions: { minValue: 1 },
59
+ description: 'Maximum allowed processing time for the job. If the job is picked up by a consumer but doesn\'t finish within this time, the producer will error out. Also used as TTL for the queue lock.',
60
+ },
61
+ {
62
+ displayName: 'Response Timeout (seconds)',
63
+ name: 'responseTimeout',
64
+ type: 'number',
65
+ default: 300,
66
+ typeOptions: { minValue: 1 },
67
+ description: 'Maximum time to wait for job completion response. If timeout is reached, an error will be thrown.',
68
+ },
69
+ {
70
+ displayName: 'Include Other Input Fields',
71
+ name: 'includeInputFields',
72
+ type: 'boolean',
73
+ default: false,
74
+ description: 'Whether to copy all input data to the output. When enabled, the node result will be placed in a "result" field.',
75
+ },
76
+ ],
77
+ usableAsTool: true,
78
+ };
79
+ }
80
+ async execute() {
81
+ var _a, _b;
82
+ const items = this.getInputData();
83
+ const returnData = [];
84
+ const creds = await this.getCredentials('bozonxRedis');
85
+ const host = (creds === null || creds === void 0 ? void 0 : creds.host) || 'localhost';
86
+ const port = (_a = creds === null || creds === void 0 ? void 0 : creds.port) !== null && _a !== void 0 ? _a : 6379;
87
+ const username = (creds === null || creds === void 0 ? void 0 : creds.username) || '';
88
+ const password = (creds === null || creds === void 0 ? void 0 : creds.password) || '';
89
+ const tls = (creds === null || creds === void 0 ? void 0 : creds.tls) || false;
90
+ const db = (_b = creds === null || creds === void 0 ? void 0 : creds.db) !== null && _b !== void 0 ? _b : 0;
91
+ const client = await (0, redisClient_1.getRedisClientConnected)({ host, port, username, password, tls, db });
92
+ for (let i = 0; i < items.length; i++) {
93
+ try {
94
+ let queueId = String(this.getNodeParameter('queueId', i, '') || '').trim();
95
+ const jobName = String(this.getNodeParameter('jobName', i, '') || '').trim();
96
+ const lockTTL = this.getNodeParameter('lockTTL', i);
97
+ const responseTimeout = this.getNodeParameter('responseTimeout', i);
98
+ const includeInputFields = this.getNodeParameter('includeInputFields', i, false);
99
+ if (!queueId) {
100
+ const workflow = this.getWorkflow();
101
+ queueId = workflow.id || 'default-queue';
102
+ }
103
+ if (lockTTL < 1) {
104
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Lock TTL must be at least 1 second', {
105
+ itemIndex: i,
106
+ });
107
+ }
108
+ const dataParam = this.getNodeParameter('data', i, undefined);
109
+ let dataObj;
110
+ if (dataParam === undefined || dataParam === '') {
111
+ dataObj = items[i].json;
112
+ }
113
+ else if (typeof dataParam === 'string') {
114
+ try {
115
+ dataObj = (0, js_yaml_1.load)(dataParam);
116
+ }
117
+ catch {
118
+ try {
119
+ dataObj = JSON.parse(dataParam);
120
+ }
121
+ catch (jsonError) {
122
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid YAML or JSON provided in Data: ${jsonError.message}`, { itemIndex: i });
123
+ }
124
+ }
125
+ }
126
+ else {
127
+ dataObj = dataParam;
128
+ }
129
+ const jobId = `${queueId}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
130
+ const jobPayload = {
131
+ jobId,
132
+ data: dataObj,
133
+ lockTTL,
134
+ };
135
+ const jobData = JSON.stringify(jobPayload);
136
+ const queueKey = jobName ? `queue:${queueId}:${jobName}` : `queue:${queueId}`;
137
+ const responseKey = `response:${queueId}:${jobId}`;
138
+ const queueTTL = (0, redisClient_1.calculateQueueTTL)(lockTTL);
139
+ const c = client;
140
+ const position = (await c.sendCommand(['RPUSH', queueKey, jobData]));
141
+ await c.sendCommand(['EXPIRE', queueKey, String(queueTTL)]);
142
+ const isFirst = position === 1;
143
+ const startTime = Date.now();
144
+ const timeoutMs = responseTimeout * 1000;
145
+ let executionStartTime = null;
146
+ const lockTTLMs = lockTTL * 1000;
147
+ while (true) {
148
+ const now = Date.now();
149
+ const elapsedTotal = now - startTime;
150
+ if (elapsedTotal >= timeoutMs) {
151
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Response timeout after ${responseTimeout} seconds for job ${jobId}`, { itemIndex: i });
152
+ }
153
+ if (executionStartTime !== null) {
154
+ const executionElapsed = now - executionStartTime;
155
+ if (executionElapsed >= lockTTLMs) {
156
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Execution timeout: Job ${jobId} exceeded Lock TTL (${lockTTL}s) during processing`, { itemIndex: i });
157
+ }
158
+ }
159
+ const remainingTotal = Math.ceil((timeoutMs - elapsedTotal) / 1000);
160
+ let blpopTimeout = Math.min(remainingTotal, 5);
161
+ if (executionStartTime !== null) {
162
+ const remainingExec = Math.ceil((lockTTLMs - (now - executionStartTime)) / 1000);
163
+ blpopTimeout = Math.min(blpopTimeout, remainingExec);
164
+ }
165
+ blpopTimeout = Math.max(blpopTimeout, 1);
166
+ const res = (await c.sendCommand([
167
+ 'BLPOP',
168
+ responseKey,
169
+ String(blpopTimeout),
170
+ ]));
171
+ if (res && Array.isArray(res) && res.length >= 2) {
172
+ const responseData = res[1];
173
+ let parsedResponse;
174
+ try {
175
+ parsedResponse = JSON.parse(responseData);
176
+ }
177
+ catch (parseError) {
178
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to parse response data: ${parseError.message}`, { itemIndex: i });
179
+ }
180
+ const result = {
181
+ queueId,
182
+ jobName: jobName || null,
183
+ jobId,
184
+ position,
185
+ isFirst,
186
+ data: parsedResponse.data,
187
+ isLast: parsedResponse.isLast,
188
+ };
189
+ returnData.push({
190
+ json: includeInputFields ? { ...items[i].json, result } : { result },
191
+ pairedItem: { item: i },
192
+ });
193
+ break;
194
+ }
195
+ const jobIndex = (await c.sendCommand(['LPOS', queueKey, jobData]));
196
+ if (jobIndex === null) {
197
+ if (executionStartTime === null) {
198
+ executionStartTime = Date.now();
199
+ }
200
+ }
201
+ else {
202
+ executionStartTime = null;
203
+ }
204
+ }
205
+ }
206
+ catch (error) {
207
+ if (this.continueOnFail()) {
208
+ returnData.push({
209
+ json: { error: error.message },
210
+ pairedItem: { item: i },
211
+ });
212
+ continue;
213
+ }
214
+ if (error instanceof n8n_workflow_1.NodeOperationError) {
215
+ throw error;
216
+ }
217
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex: i });
218
+ }
219
+ }
220
+ return [returnData];
221
+ }
222
+ }
223
+ exports.BozonxRedisQueueProducer = BozonxRedisQueueProducer;
224
+ //# sourceMappingURL=BozonxRedisQueueProducer.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BozonxRedisQueueProducer.node.js","sourceRoot":"","sources":["../../../nodes/RedisQueueProducer/BozonxRedisQueueProducer.node.ts"],"names":[],"mappings":";;;AAAA,+CAOsB;AACtB,qCAA2C;AAC3C,+CAA2E;AAE3E,MAAa,wBAAwB;IAArC;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,iBAAiB;YAC9B,IAAI,EAAE,0BAA0B;YAChC,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;YACrC,IAAI,EAAE,+BAA+B;YACrC,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,OAAO,EAAE,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE;gBACZ;oBACC,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,IAAI;iBACd;aACD;YACD,UAAU,EAAE;gBACX;oBACC,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,wCAAwC;oBACrD,WAAW,EAAE,8EAA8E;iBAC3F;gBACD;oBACC,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,2BAA2B;oBACxC,WAAW,EACV,wFAAwF;iBACzF;gBACD;oBACC,WAAW,EAAE,oBAAoB;oBACjC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE;wBACZ,IAAI,EAAE,CAAC;qBACP;oBACD,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,kDAAkD;oBAC/D,WAAW,EACV,wNAAwN;iBACzN;gBACD;oBACC,WAAW,EAAE,oBAAoB;oBACjC,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;oBAC5B,WAAW,EACV,4LAA4L;iBAC7L;gBACD;oBACC,WAAW,EAAE,4BAA4B;oBACzC,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,GAAG;oBACZ,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;oBAC5B,WAAW,EACV,mGAAmG;iBACpG;gBACD;oBACC,WAAW,EAAE,4BAA4B;oBACzC,IAAI,EAAE,oBAAoB;oBAC1B,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,KAAK;oBACd,WAAW,EACV,iHAAiH;iBAClH;aACD;YACD,YAAY,EAAE,IAAI;SAClB,CAAC;IA8LH,CAAC;IA5LA,KAAK,CAAC,OAAO;;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAe,KAAI,WAAW,CAAC;QACpD,MAAM,IAAI,GAAG,MAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAe,mCAAI,IAAI,CAAC;QAC7C,MAAM,QAAQ,GAAG,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAmB,KAAI,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAmB,KAAI,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAe,KAAI,KAAK,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,EAAa,mCAAI,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,IAAA,qCAAuB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAE1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,IAAI,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAW,CAAC;gBAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAW,CAAC;gBAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,EAAE,KAAK,CAAY,CAAC;gBAE5F,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBACpC,OAAO,GAAG,QAAQ,CAAC,EAAE,IAAI,eAAe,CAAC;gBAC1C,CAAC;gBAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBACjB,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,oCAAoC,EAAE;wBAClF,SAAS,EAAE,CAAC;qBACZ,CAAC,CAAC;gBACJ,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC9D,IAAI,OAAgB,CAAC;gBAErB,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;oBACjD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAmB,CAAC;gBACxC,CAAC;qBAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACJ,OAAO,GAAG,IAAA,cAAQ,EAAC,SAAS,CAAC,CAAC;oBAC/B,CAAC;oBAAC,MAAM,CAAC;wBACR,IAAI,CAAC;4BACJ,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBACjC,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACpB,MAAM,IAAI,iCAAkB,CAC3B,IAAI,CAAC,OAAO,EAAE,EACd,0CAA2C,SAAmB,CAAC,OAAO,EAAE,EACxE,EAAE,SAAS,EAAE,CAAC,EAAE,CAChB,CAAC;wBACH,CAAC;oBACF,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,OAAO,GAAG,SAAS,CAAC;gBACrB,CAAC;gBAED,MAAM,KAAK,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpF,MAAM,UAAU,GAAG;oBAClB,KAAK;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO;iBACP,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;gBAC9E,MAAM,WAAW,GAAG,YAAY,OAAO,IAAI,KAAK,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAG,IAAA,+BAAiB,EAAC,OAAO,CAAC,CAAC;gBAK5C,MAAM,CAAC,GAAG,MAAoC,CAAC;gBAE/C,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC;gBAC/E,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE5D,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC;gBAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,eAAe,GAAG,IAAI,CAAC;gBAEzC,IAAI,kBAAkB,GAAkB,IAAI,CAAC;gBAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;gBAEjC,OAAO,IAAI,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACvB,MAAM,YAAY,GAAG,GAAG,GAAG,SAAS,CAAC;oBAGrC,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;wBAC/B,MAAM,IAAI,iCAAkB,CAC3B,IAAI,CAAC,OAAO,EAAE,EACd,0BAA0B,eAAe,oBAAoB,KAAK,EAAE,EACpE,EAAE,SAAS,EAAE,CAAC,EAAE,CAChB,CAAC;oBACH,CAAC;oBAGD,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;wBACjC,MAAM,gBAAgB,GAAG,GAAG,GAAG,kBAAkB,CAAC;wBAClD,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;4BACnC,MAAM,IAAI,iCAAkB,CAC3B,IAAI,CAAC,OAAO,EAAE,EACd,0BAA0B,KAAK,uBAAuB,OAAO,sBAAsB,EACnF,EAAE,SAAS,EAAE,CAAC,EAAE,CAChB,CAAC;wBACH,CAAC;oBACF,CAAC;oBAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;oBACpE,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAG/C,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;wBACjC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,GAAG,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;wBACjF,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;oBACtD,CAAC;oBAED,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBAEzC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;wBAChC,OAAO;wBACP,WAAW;wBACX,MAAM,CAAC,YAAY,CAAC;qBACpB,CAAC,CAAoB,CAAC;oBAEvB,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBAClD,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC5B,IAAI,cAA2B,CAAC;wBAEhC,IAAI,CAAC;4BACJ,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAgB,CAAC;wBAC1D,CAAC;wBAAC,OAAO,UAAU,EAAE,CAAC;4BACrB,MAAM,IAAI,iCAAkB,CAC3B,IAAI,CAAC,OAAO,EAAE,EACd,kCAAmC,UAAoB,CAAC,OAAO,EAAE,EACjE,EAAE,SAAS,EAAE,CAAC,EAAE,CAChB,CAAC;wBACH,CAAC;wBAED,MAAM,MAAM,GAAgB;4BAC3B,OAAO;4BACP,OAAO,EAAE,OAAO,IAAI,IAAI;4BACxB,KAAK;4BACL,QAAQ;4BACR,OAAO;4BACP,IAAI,EAAE,cAAc,CAAC,IAAI;4BACzB,MAAM,EAAE,cAAc,CAAC,MAAM;yBAC7B,CAAC;wBAEF,UAAU,CAAC,IAAI,CAAC;4BACf,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE;4BACrF,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;yBACvB,CAAC,CAAC;wBAEH,MAAM;oBACP,CAAC;oBAID,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAkB,CAAC;oBAErF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBAEvB,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;4BACjC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBACjC,CAAC;oBACF,CAAC;yBAAM,CAAC;wBAEP,kBAAkB,GAAG,IAAI,CAAC;oBAC3B,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAiB;wBACxD,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,SAAS;gBACV,CAAC;gBACD,IAAI,KAAK,YAAY,iCAAkB,EAAE,CAAC;oBACzC,MAAM,KAAK,CAAC;gBACb,CAAC;gBACD,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC;CACD;AAzQD,4DAyQC"}
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2" fill="#DC382D" stroke="none"/>
3
+ <path d="M12 8v8m-4-4h8" stroke="white" stroke-width="2"/>
4
+ </svg>
@@ -0,0 +1,10 @@
1
+ export interface RedisConnectionOptions {
2
+ host: string;
3
+ port: number;
4
+ username?: string;
5
+ password?: string;
6
+ tls?: boolean;
7
+ db?: number;
8
+ }
9
+ export declare function getRedisClientConnected(opts: RedisConnectionOptions): Promise<unknown>;
10
+ export declare function calculateQueueTTL(timeoutSec: number): number;