n8n-nodes-message-debounce 0.1.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/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/credentials/RedisApi.credentials.d.ts +16 -0
- package/dist/credentials/RedisApi.credentials.d.ts.map +1 -0
- package/dist/credentials/RedisApi.credentials.js +70 -0
- package/dist/credentials/RedisApi.credentials.js.map +1 -0
- package/dist/credentials/redisApi.svg +17 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.description.d.ts +8 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.description.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.description.js +247 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.description.js.map +1 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.node.d.ts +19 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.node.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.node.js +102 -0
- package/dist/nodes/MessageDebounce/MessageDebounce.node.js.map +1 -0
- package/dist/nodes/MessageDebounce/constants.d.ts +17 -0
- package/dist/nodes/MessageDebounce/constants.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/constants.js +42 -0
- package/dist/nodes/MessageDebounce/constants.js.map +1 -0
- package/dist/nodes/MessageDebounce/execute.d.ts +13 -0
- package/dist/nodes/MessageDebounce/execute.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/execute.js +217 -0
- package/dist/nodes/MessageDebounce/execute.js.map +1 -0
- package/dist/nodes/MessageDebounce/helpers.d.ts +19 -0
- package/dist/nodes/MessageDebounce/helpers.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/helpers.js +43 -0
- package/dist/nodes/MessageDebounce/helpers.js.map +1 -0
- package/dist/nodes/MessageDebounce/messageDebounce.svg +17 -0
- package/dist/nodes/MessageDebounce/types.d.ts +30 -0
- package/dist/nodes/MessageDebounce/types.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/types.js +7 -0
- package/dist/nodes/MessageDebounce/types.js.map +1 -0
- package/dist/nodes/MessageDebounce/utils/RedisClient.d.ts +59 -0
- package/dist/nodes/MessageDebounce/utils/RedisClient.d.ts.map +1 -0
- package/dist/nodes/MessageDebounce/utils/RedisClient.js +270 -0
- package/dist/nodes/MessageDebounce/utils/RedisClient.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal Redis client using the native Node.js `net` module.
|
|
4
|
+
* Implements the RESP2 (REdis Serialization Protocol) specification.
|
|
5
|
+
* Zero external dependencies — required for n8n verified community nodes.
|
|
6
|
+
*
|
|
7
|
+
* Supported commands: AUTH, SELECT, RPUSH, LLEN, LINDEX, LRANGE, DEL, EXPIRE, SET, GET, EVAL
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.RedisClient = void 0;
|
|
34
|
+
const net = __importStar(require("net"));
|
|
35
|
+
const tls = __importStar(require("tls"));
|
|
36
|
+
const CRLF = '\r\n';
|
|
37
|
+
const CONN_TIMEOUT_MS = 10000;
|
|
38
|
+
/** Encodes a command array into the RESP bulk string array format. */
|
|
39
|
+
function encodeCommand(args) {
|
|
40
|
+
let cmd = `*${args.length}${CRLF}`;
|
|
41
|
+
for (const arg of args) {
|
|
42
|
+
const str = String(arg);
|
|
43
|
+
cmd += `$${Buffer.byteLength(str, 'utf8')}${CRLF}${str}${CRLF}`;
|
|
44
|
+
}
|
|
45
|
+
return cmd;
|
|
46
|
+
}
|
|
47
|
+
/** RESP2 parser — processes a raw Buffer and returns typed values. */
|
|
48
|
+
class RespParser {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.buffer = '';
|
|
51
|
+
}
|
|
52
|
+
feed(data) {
|
|
53
|
+
this.buffer += data.toString('utf8');
|
|
54
|
+
}
|
|
55
|
+
/** Attempt to parse one complete value from the buffer. Returns undefined if incomplete. */
|
|
56
|
+
tryParse() {
|
|
57
|
+
const result = this.parseValue(this.buffer, 0);
|
|
58
|
+
if (result === undefined)
|
|
59
|
+
return undefined;
|
|
60
|
+
this.buffer = this.buffer.slice(result.pos);
|
|
61
|
+
return { value: result.value, remainder: this.buffer };
|
|
62
|
+
}
|
|
63
|
+
parseValue(buf, pos) {
|
|
64
|
+
if (pos >= buf.length)
|
|
65
|
+
return undefined;
|
|
66
|
+
const type = buf[pos];
|
|
67
|
+
const lineEnd = buf.indexOf(CRLF, pos + 1);
|
|
68
|
+
if (lineEnd === -1)
|
|
69
|
+
return undefined;
|
|
70
|
+
const line = buf.slice(pos + 1, lineEnd);
|
|
71
|
+
const afterLine = lineEnd + 2;
|
|
72
|
+
switch (type) {
|
|
73
|
+
case '+': // Simple string
|
|
74
|
+
return { value: line, pos: afterLine };
|
|
75
|
+
case '-': // Error
|
|
76
|
+
throw new Error(line);
|
|
77
|
+
case ':': // Integer
|
|
78
|
+
return { value: parseInt(line, 10), pos: afterLine };
|
|
79
|
+
case '$': { // Bulk string
|
|
80
|
+
const len = parseInt(line, 10);
|
|
81
|
+
if (len === -1)
|
|
82
|
+
return { value: null, pos: afterLine };
|
|
83
|
+
const end = afterLine + len + 2; // +2 for trailing CRLF
|
|
84
|
+
if (buf.length < end)
|
|
85
|
+
return undefined;
|
|
86
|
+
return { value: buf.slice(afterLine, afterLine + len), pos: end };
|
|
87
|
+
}
|
|
88
|
+
case '*': { // Array
|
|
89
|
+
const count = parseInt(line, 10);
|
|
90
|
+
if (count === -1)
|
|
91
|
+
return { value: null, pos: afterLine };
|
|
92
|
+
const arr = [];
|
|
93
|
+
let cur = afterLine;
|
|
94
|
+
for (let i = 0; i < count; i++) {
|
|
95
|
+
const item = this.parseValue(buf, cur);
|
|
96
|
+
if (item === undefined)
|
|
97
|
+
return undefined;
|
|
98
|
+
arr.push(item.value);
|
|
99
|
+
cur = item.pos;
|
|
100
|
+
}
|
|
101
|
+
return { value: arr, pos: cur };
|
|
102
|
+
}
|
|
103
|
+
default:
|
|
104
|
+
throw new Error(`Unknown RESP type byte: "${type}"`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
class RedisClient {
|
|
109
|
+
constructor(credentials) {
|
|
110
|
+
this.socket = null;
|
|
111
|
+
this.pendingCallbacks = [];
|
|
112
|
+
this.parser = new RespParser();
|
|
113
|
+
this.host = credentials.host || 'localhost';
|
|
114
|
+
this.port = credentials.port || 6379;
|
|
115
|
+
this.username = credentials.username || '';
|
|
116
|
+
this.password = credentials.password || '';
|
|
117
|
+
this.database = credentials.database ?? 0;
|
|
118
|
+
this.useTls = credentials.tls ?? false;
|
|
119
|
+
}
|
|
120
|
+
/** Establish connection and authenticate. */
|
|
121
|
+
async connect() {
|
|
122
|
+
const rawSocket = await this.openSocket();
|
|
123
|
+
this.socket = rawSocket;
|
|
124
|
+
this.socket.on('data', (data) => {
|
|
125
|
+
this.parser.feed(data);
|
|
126
|
+
this.drainParser();
|
|
127
|
+
});
|
|
128
|
+
this.socket.on('error', (err) => {
|
|
129
|
+
const pending = this.pendingCallbacks.splice(0);
|
|
130
|
+
for (const cb of pending) {
|
|
131
|
+
cb.reject(err);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
this.socket.on('close', () => {
|
|
135
|
+
const pending = this.pendingCallbacks.splice(0);
|
|
136
|
+
const err = new Error('Redis connection closed unexpectedly');
|
|
137
|
+
for (const cb of pending) {
|
|
138
|
+
cb.reject(err);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
// Redis 6+ ACL: AUTH username password
|
|
142
|
+
// Redis 5 and below: AUTH password
|
|
143
|
+
if (this.password) {
|
|
144
|
+
if (this.username) {
|
|
145
|
+
await this.send(['AUTH', this.username, this.password]);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
await this.send(['AUTH', this.password]);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (this.database !== 0) {
|
|
152
|
+
await this.send(['SELECT', this.database]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Close the socket gracefully. */
|
|
156
|
+
disconnect() {
|
|
157
|
+
if (this.socket) {
|
|
158
|
+
this.socket.destroy();
|
|
159
|
+
this.socket = null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
// Public Redis commands
|
|
164
|
+
// -------------------------------------------------------------------------
|
|
165
|
+
async rpush(key, value) {
|
|
166
|
+
return (await this.send(['RPUSH', key, value]));
|
|
167
|
+
}
|
|
168
|
+
async llen(key) {
|
|
169
|
+
return (await this.send(['LLEN', key]));
|
|
170
|
+
}
|
|
171
|
+
async lindex(key, index) {
|
|
172
|
+
return (await this.send(['LINDEX', key, index]));
|
|
173
|
+
}
|
|
174
|
+
async lrange(key, start, stop) {
|
|
175
|
+
const result = await this.send(['LRANGE', key, start, stop]);
|
|
176
|
+
return result.map((v) => v);
|
|
177
|
+
}
|
|
178
|
+
async del(...keys) {
|
|
179
|
+
return (await this.send(['DEL', ...keys]));
|
|
180
|
+
}
|
|
181
|
+
async expire(key, seconds) {
|
|
182
|
+
return (await this.send(['EXPIRE', key, seconds]));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* SET with optional NX and EX flags.
|
|
186
|
+
* Returns 'OK' on success, null if NX condition was not met.
|
|
187
|
+
*/
|
|
188
|
+
async set(key, value, options) {
|
|
189
|
+
const args = ['SET', key, value];
|
|
190
|
+
if (options?.ex !== undefined) {
|
|
191
|
+
args.push('EX', options.ex);
|
|
192
|
+
}
|
|
193
|
+
if (options?.nx) {
|
|
194
|
+
args.push('NX');
|
|
195
|
+
}
|
|
196
|
+
return (await this.send(args));
|
|
197
|
+
}
|
|
198
|
+
async get(key) {
|
|
199
|
+
return (await this.send(['GET', key]));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Execute a Lua script atomically.
|
|
203
|
+
* @param script Lua source code
|
|
204
|
+
* @param keys KEYS array
|
|
205
|
+
* @param args ARGV array
|
|
206
|
+
*/
|
|
207
|
+
async eval(script, keys, args) {
|
|
208
|
+
return this.send(['EVAL', script, keys.length, ...keys, ...args]);
|
|
209
|
+
}
|
|
210
|
+
// -------------------------------------------------------------------------
|
|
211
|
+
// Private internals
|
|
212
|
+
// -------------------------------------------------------------------------
|
|
213
|
+
openSocket() {
|
|
214
|
+
return new Promise((resolve, reject) => {
|
|
215
|
+
const onError = (err) => {
|
|
216
|
+
reject(new Error(`Redis connection failed: ${err.message}`));
|
|
217
|
+
};
|
|
218
|
+
let socket;
|
|
219
|
+
if (this.useTls) {
|
|
220
|
+
socket = tls.connect({ host: this.host, port: this.port, rejectUnauthorized: true }, () => {
|
|
221
|
+
socket.removeListener('error', onError);
|
|
222
|
+
resolve(socket);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
socket = net.createConnection({ host: this.host, port: this.port }, () => {
|
|
227
|
+
socket.removeListener('error', onError);
|
|
228
|
+
resolve(socket);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
socket.setTimeout(CONN_TIMEOUT_MS);
|
|
232
|
+
socket.once('error', onError);
|
|
233
|
+
socket.once('timeout', () => {
|
|
234
|
+
socket.destroy();
|
|
235
|
+
reject(new Error(`Redis connection timed out after ${CONN_TIMEOUT_MS}ms`));
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
send(args) {
|
|
240
|
+
return new Promise((resolve, reject) => {
|
|
241
|
+
if (!this.socket || this.socket.destroyed) {
|
|
242
|
+
reject(new Error('Redis socket is not connected'));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
this.pendingCallbacks.push({ resolve, reject });
|
|
246
|
+
this.socket.write(encodeCommand(args));
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
drainParser() {
|
|
250
|
+
while (this.pendingCallbacks.length > 0) {
|
|
251
|
+
let parsed;
|
|
252
|
+
try {
|
|
253
|
+
parsed = this.parser.tryParse();
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
const cb = this.pendingCallbacks.shift();
|
|
257
|
+
if (cb)
|
|
258
|
+
cb.reject(err instanceof Error ? err : new Error(String(err)));
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (parsed === undefined)
|
|
262
|
+
break;
|
|
263
|
+
const cb = this.pendingCallbacks.shift();
|
|
264
|
+
if (cb)
|
|
265
|
+
cb.resolve(parsed.value);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
exports.RedisClient = RedisClient;
|
|
270
|
+
//# sourceMappingURL=RedisClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisClient.js","sourceRoot":"","sources":["../../../../nodes/MessageDebounce/utils/RedisClient.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAA2B;AAC3B,yCAA2B;AAa3B,MAAM,IAAI,GAAG,MAAM,CAAC;AACpB,MAAM,eAAe,GAAG,KAAM,CAAC;AAE/B,sEAAsE;AACtE,SAAS,aAAa,CAAC,IAA4B;IAC/C,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,GAAG,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU;IAAhB;QACY,WAAM,GAAG,EAAE,CAAC;IA4DxB,CAAC;IA1DG,IAAI,CAAC,IAAY;QACb,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,4FAA4F;IAC5F,QAAQ;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3D,CAAC;IAEO,UAAU,CAAC,GAAW,EAAE,GAAW;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAErC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;QAE9B,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,gBAAgB;gBACtB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YAE3C,KAAK,GAAG,EAAE,QAAQ;gBACd,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;YAE1B,KAAK,GAAG,EAAE,UAAU;gBAChB,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YAEzD,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc;gBACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/B,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBACvD,MAAM,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,uBAAuB;gBACxD,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;oBAAE,OAAO,SAAS,CAAC;gBACvC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACtE,CAAC;YAED,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACjC,IAAI,KAAK,KAAK,CAAC,CAAC;oBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBACzD,MAAM,GAAG,GAAgB,EAAE,CAAC;gBAC5B,IAAI,GAAG,GAAG,SAAS,CAAC;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACvC,IAAI,IAAI,KAAK,SAAS;wBAAE,OAAO,SAAS,CAAC;oBACzC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;gBACnB,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,CAAC;YAED;gBACI,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;CACJ;AAED,MAAa,WAAW;IAapB,YAAY,WAA6B;QAZjC,WAAM,GAAsB,IAAI,CAAC;QAQjC,qBAAgB,GACpB,EAAE,CAAC;QACC,WAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAG9B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI,KAAK,CAAC;IAC3C,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,OAAO;QACT,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAExB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACvB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC9D,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACvB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,mCAAmC;QACnC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,UAAU;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,wBAAwB;IACxB,4EAA4E;IAE5E,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,KAAa;QAClC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAW,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QAClB,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAW,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAa;QACnC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAkB,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAa,EAAE,IAAY;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,OAAQ,MAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAW,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAG,IAAc;QACvB,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAe;QACrC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAW,CAAC;IACjE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CACL,GAAW,EACX,KAAa,EACb,OAAuC;QAEvC,MAAM,IAAI,GAA2B,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,OAAO,EAAE,EAAE,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAkB,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAkB,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAc,EAAE,IAAc;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAEpE,UAAU;QACd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC;YAEF,IAAI,MAAkB,CAAC;YAEvB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,CAAC,OAAO,CAChB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAC9D,GAAG,EAAE;oBACD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACxC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC,CACJ,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;oBACrE,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACxC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;YACP,CAAC;YAED,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,eAAe,IAAI,CAAC,CAAC,CAAC;YAC/E,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,IAAI,CAAC,IAA4B;QACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;gBACnD,OAAO;YACX,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,WAAW;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,MAA2D,CAAC;YAChE,IAAI,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBACzC,IAAI,EAAE;oBAAE,EAAE,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvE,SAAS;YACb,CAAC;YACD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM;YAChC,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YACzC,IAAI,EAAE;gBAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;CACJ;AAlMD,kCAkMC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-message-debounce",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "n8n community node that groups messages from the same session within a time window, waiting for silence before passing them along as a single consolidated output.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/uaiautomacao/n8n-nodes-message-debounce",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"n8n-community-node-package",
|
|
9
|
+
"n8n",
|
|
10
|
+
"debounce",
|
|
11
|
+
"buffer",
|
|
12
|
+
"message",
|
|
13
|
+
"redis",
|
|
14
|
+
"chatbot",
|
|
15
|
+
"whatsapp",
|
|
16
|
+
"telegram"
|
|
17
|
+
],
|
|
18
|
+
"author": {
|
|
19
|
+
"name": "U.ai Automação",
|
|
20
|
+
"email": "contato@uaiautomacao.com"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/uaiautomacao/n8n-nodes-message-debounce.git"
|
|
25
|
+
},
|
|
26
|
+
"main": "index.js",
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "n8n-node build",
|
|
29
|
+
"dev": "n8n-node dev",
|
|
30
|
+
"lint": "n8n-node lint",
|
|
31
|
+
"lint:fix": "n8n-node lint --fix",
|
|
32
|
+
"release": "n8n-node release"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist"
|
|
36
|
+
],
|
|
37
|
+
"n8n": {
|
|
38
|
+
"n8nNodesApiVersion": 1,
|
|
39
|
+
"strict": false,
|
|
40
|
+
"credentials": [
|
|
41
|
+
"dist/credentials/RedisApi.credentials.js"
|
|
42
|
+
],
|
|
43
|
+
"nodes": [
|
|
44
|
+
"dist/nodes/MessageDebounce/MessageDebounce.node.js"
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@n8n/node-cli": "^0.21.0",
|
|
49
|
+
"typescript": "~5.6.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"n8n-workflow": "*"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18.10",
|
|
56
|
+
"npm": ">=8.11.0"
|
|
57
|
+
}
|
|
58
|
+
}
|