mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
feat(core): Make Redis available for backend communication (#6719)
* support redis cluster * cleanup, fix config schema * set default prefix to bull * initial commit * improve logging * improve types and refactor * list support and refactor * fix redis service and tests * add comment * add redis and cache prefix * use injection * lint fix * clean schema comments * improve naming, tests, cluster client * merge master * cache returns unknown instead of T * update cache service, tests and doc * remove console.log * do not cache null or undefined values * fix merge * lint fix
This commit is contained in:
committed by
GitHub
parent
4ac4b850dd
commit
3cad60e918
74
packages/cli/src/services/redis/RedisServiceBaseClasses.ts
Normal file
74
packages/cli/src/services/redis/RedisServiceBaseClasses.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import type Redis from 'ioredis';
|
||||
import type { Cluster } from 'ioredis';
|
||||
import { getDefaultRedisClient } from './RedisServiceHelper';
|
||||
import { LoggerProxy } from 'n8n-workflow';
|
||||
|
||||
export type RedisClientType =
|
||||
| 'subscriber'
|
||||
| 'client'
|
||||
| 'bclient'
|
||||
| 'subscriber(bull)'
|
||||
| 'client(bull)'
|
||||
| 'bclient(bull)'
|
||||
| 'client(cache)'
|
||||
| 'publisher'
|
||||
| 'consumer'
|
||||
| 'producer'
|
||||
| 'list-sender'
|
||||
| 'list-receiver';
|
||||
|
||||
export type RedisServiceMessageHandler =
|
||||
| ((channel: string, message: string) => void)
|
||||
| ((stream: string, id: string, message: string[]) => void);
|
||||
|
||||
class RedisServiceBase {
|
||||
redisClient: Redis | Cluster | undefined;
|
||||
|
||||
isInitialized = false;
|
||||
|
||||
async init(type: RedisClientType = 'client'): Promise<void> {
|
||||
if (this.redisClient && this.isInitialized) {
|
||||
return;
|
||||
}
|
||||
this.redisClient = await getDefaultRedisClient(undefined, type);
|
||||
|
||||
this.redisClient.on('close', () => {
|
||||
LoggerProxy.warn('Redis unavailable - trying to reconnect...');
|
||||
});
|
||||
|
||||
this.redisClient.on('error', (error) => {
|
||||
if (!String(error).includes('ECONNREFUSED')) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
LoggerProxy.warn('Error with Redis: ', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async destroy(): Promise<void> {
|
||||
if (!this.redisClient) {
|
||||
return;
|
||||
}
|
||||
await this.redisClient.quit();
|
||||
this.redisClient = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export abstract class RedisServiceBaseSender extends RedisServiceBase {
|
||||
senderId: string;
|
||||
|
||||
setSenderId(senderId?: string): void {
|
||||
this.senderId = senderId ?? '';
|
||||
}
|
||||
}
|
||||
|
||||
export abstract class RedisServiceBaseReceiver extends RedisServiceBase {
|
||||
messageHandlers: Map<string, RedisServiceMessageHandler> = new Map();
|
||||
|
||||
addMessageHandler(handlerName: string, handler: RedisServiceMessageHandler): void {
|
||||
this.messageHandlers.set(handlerName, handler);
|
||||
}
|
||||
|
||||
removeMessageHandler(handlerName: string): void {
|
||||
this.messageHandlers.delete(handlerName);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user