n8n-nodes-chat2crm 0.1.21 → 0.1.22
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.
|
@@ -170,6 +170,38 @@ class Chat2CrmTrigger {
|
|
|
170
170
|
});
|
|
171
171
|
// Флаг для отслеживания состояния закрытия
|
|
172
172
|
let isClosing = false;
|
|
173
|
+
// Функция для проверки и переподключения при необходимости
|
|
174
|
+
const ensureConnection = async (db) => {
|
|
175
|
+
const redis = redisConnections.get(db);
|
|
176
|
+
if (!redis)
|
|
177
|
+
return false;
|
|
178
|
+
// Проверяем статус соединения
|
|
179
|
+
const status = redis.status;
|
|
180
|
+
if (status === 'ready') {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
// Если соединение не готово, пытаемся переподключиться
|
|
184
|
+
if (status === 'end' || status === 'close') {
|
|
185
|
+
console.log(`[Chat2Crm Trigger] Redis connection for DB ${db} is ${status}, attempting to reconnect...`);
|
|
186
|
+
try {
|
|
187
|
+
redis.disconnect();
|
|
188
|
+
// Пересоздаем соединение
|
|
189
|
+
const newRedis = await RedisConnection_1.createRedisConnection.call(this, credentials, db);
|
|
190
|
+
redisConnections.set(db, newRedis);
|
|
191
|
+
console.log(`[Chat2Crm Trigger] Successfully reconnected to Redis DB ${db}`);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
console.error(`[Chat2Crm Trigger] Failed to reconnect to Redis DB ${db}:`, error.message);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Если соединение в процессе подключения, ждем
|
|
200
|
+
if (status === 'connecting' || status === 'reconnecting') {
|
|
201
|
+
return false; // Пропускаем эту итерацию
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
};
|
|
173
205
|
// Функция для чтения сообщений
|
|
174
206
|
const readMessages = async () => {
|
|
175
207
|
// Проверяем, не закрывается ли триггер
|
|
@@ -181,6 +213,10 @@ class Chat2CrmTrigger {
|
|
|
181
213
|
if (isClosing) {
|
|
182
214
|
break;
|
|
183
215
|
}
|
|
216
|
+
// Проверяем и переподключаемся при необходимости
|
|
217
|
+
if (!(await ensureConnection(db))) {
|
|
218
|
+
continue; // Пропускаем эту итерацию, если соединение не готово
|
|
219
|
+
}
|
|
184
220
|
const redis = redisConnections.get(db);
|
|
185
221
|
// Читаем каждый stream отдельно через XREAD
|
|
186
222
|
// XREAD читает напрямую из stream, независимо от consumer groups
|
|
@@ -251,6 +287,26 @@ class Chat2CrmTrigger {
|
|
|
251
287
|
if (error.message?.includes('Invalid stream ID') || error.message?.includes('no such key')) {
|
|
252
288
|
continue;
|
|
253
289
|
}
|
|
290
|
+
// При ошибке соединения помечаем соединение как требующее переподключения
|
|
291
|
+
if (error.message?.includes('Connection is closed') ||
|
|
292
|
+
error.message?.includes('ECONNRESET') ||
|
|
293
|
+
error.message?.includes('ETIMEDOUT') ||
|
|
294
|
+
error.message?.includes('socket hang up') ||
|
|
295
|
+
error.message?.includes('read ECONNRESET') ||
|
|
296
|
+
error.message?.includes('write ECONNRESET')) {
|
|
297
|
+
console.error(`[Chat2Crm Trigger] Connection error for DB ${db}, will attempt reconnect:`, error.message);
|
|
298
|
+
// Сбрасываем соединение, чтобы на следующей итерации оно переподключилось
|
|
299
|
+
const redis = redisConnections.get(db);
|
|
300
|
+
if (redis) {
|
|
301
|
+
try {
|
|
302
|
+
redis.disconnect();
|
|
303
|
+
}
|
|
304
|
+
catch (e) {
|
|
305
|
+
// Игнорируем ошибки при отключении
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
254
310
|
// Логируем только критические ошибки
|
|
255
311
|
console.error(`[Chat2Crm Trigger] Error reading stream ${stream} from Redis DB ${db}:`, error);
|
|
256
312
|
}
|
|
@@ -270,6 +326,13 @@ class Chat2CrmTrigger {
|
|
|
270
326
|
for (const [db, redis] of redisConnections.entries()) {
|
|
271
327
|
if (isClosing)
|
|
272
328
|
return;
|
|
329
|
+
// Проверяем статус перед PING
|
|
330
|
+
if (redis.status !== 'ready') {
|
|
331
|
+
if (isDebug) {
|
|
332
|
+
console.log(`[Chat2Crm Trigger] Redis DB ${db} status is ${redis.status}, skipping keepalive`);
|
|
333
|
+
}
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
273
336
|
try {
|
|
274
337
|
await redis.ping();
|
|
275
338
|
if (isDebug) {
|
|
@@ -277,8 +340,15 @@ class Chat2CrmTrigger {
|
|
|
277
340
|
}
|
|
278
341
|
}
|
|
279
342
|
catch (error) {
|
|
280
|
-
//
|
|
343
|
+
// При ошибке PING помечаем соединение как требующее переподключения
|
|
281
344
|
console.error(`[Chat2Crm Trigger] Keepalive PING failed (DB ${db}):`, error?.message ?? error);
|
|
345
|
+
// Сбрасываем соединение, чтобы на следующей итерации оно переподключилось
|
|
346
|
+
try {
|
|
347
|
+
redis.disconnect();
|
|
348
|
+
}
|
|
349
|
+
catch (e) {
|
|
350
|
+
// Игнорируем ошибки при отключении
|
|
351
|
+
}
|
|
282
352
|
}
|
|
283
353
|
}
|
|
284
354
|
};
|
|
@@ -220,5 +220,8 @@ async function createRedisConnection(credentials, db = 0) {
|
|
|
220
220
|
redis.on('close', () => {
|
|
221
221
|
console.log(`[Redis Connection] Redis connection closed: ${redisHost}:${redisPort}, DB ${selectedDb}`);
|
|
222
222
|
});
|
|
223
|
+
redis.on('end', () => {
|
|
224
|
+
console.log(`[Redis Connection] Redis connection ended: ${redisHost}:${redisPort}, DB ${selectedDb}`);
|
|
225
|
+
});
|
|
223
226
|
return redis;
|
|
224
227
|
}
|