/* eslint-disable no-console */ import IoRedis from "ioredis"; import { getEnvs } from "@/libs/environment/env"; let instance: RedisRepository; let disable = true; const envs = getEnvs(); const ttlHour = envs.redisTTL ?? "24"; const PREFIX = `EVA-FRONTEND_`; class RedisRepository { private redis: IoRedis; constructor() { if (instance) { throw new Error("You can only create one instance!"); } this.redis = new IoRedis({ connectTimeout: 60000, host: envs.redisHost, port: Number(envs.redisPort), lazyConnect: true, reconnectOnError: () => false, tls: envs.redisTLS === "true" ? {} : undefined, password: envs.redisPassword === "" ? undefined : envs.redisPassword, }); this.redis.connect((err) => { if (err) { console.log("🚀", "Connection Redis", "Couldnt connect redis"); disable = true; } else { console.log("🚀", "Connection Redis", "Connected redis"); disable = false; } }); instance = this; } async set(key: string, data: any, ttl?: number) { if (disable) { return null; } const resp = await this.redis.set( PREFIX + key, data, "EX", ttl ?? 3600 * parseFloat(ttlHour ?? "1"), ); return resp; } async get(key: string) { console.log("Redis Get, disable", disable.valueOf()); if (disable) { return null; } const result = await this.redis.get(PREFIX + key); return result; } async delete(key: string) { if (disable) { return null; } const result = await this.redis.del(PREFIX + key); return result; } async purge() { if (disable) { return null; } const result = await this.redis.keys(`${PREFIX}*`).then((keys) => { const pipeline = this.redis.pipeline(); keys.forEach(function x(key) { console.log("KEY", key); pipeline.del(key); }); pipeline.exec(); return keys; }); return result; } async cacheList() { if (disable) { return null; } const result = await this.redis.keys(`${PREFIX}*`).then((keys) => { const pipeline = this.redis.pipeline(); keys.forEach(function x(key) { console.log("KEY", key); pipeline.get(key); }); return pipeline.exec(); }); return result; } } export const SingletonRedisRepository = Object.freeze(new RedisRepository()); export type SingletonRedisRepositoryType = typeof SingletonRedisRepository;