import Redis from 'ioredis'; import { loadConfig } from '../util/configLoader.js'; const config = loadConfig(); const redis = new Redis(config.redisConnectionString); class RedisError extends Error { constructor( message: string, public originalError?: Error, ) { super(message); this.name = 'RedisError'; } } redis.on('error', (error) => { console.error('Redis connection error:', error); throw new RedisError('Failed to connect to Redis instance: ', error); }); redis.on('connect', () => { console.log('Successfully connected to Redis'); }); export async function set( key: string, value: string, ttl?: number, ): Promise<'OK'> { try { await redis.set(key, value); if (ttl) await redis.expire(key, ttl); } catch (error) { console.error('Redis set error: ', error); throw new RedisError(`Failed to set key: ${key}, `, error as Error); } return Promise.resolve('OK'); } export async function setJson( key: string, value: T, ttl?: number, ): Promise<'OK'> { return await set(key, JSON.stringify(value), ttl); } export async function incr(key: string): Promise { try { return await redis.incr(key); } catch (error) { console.error('Redis increment error: ', error); throw new RedisError(`Failed to increment key: ${key}, `, error as Error); } } export async function exists(key: string): Promise { try { return (await redis.exists(key)) === 1; } catch (error) { console.error('Redis exists error: ', error); throw new RedisError( `Failed to check if key exists: ${key}, `, error as Error, ); } } export async function get(key: string): Promise { try { return await redis.get(key); } catch (error) { console.error('Redis get error: ', error); throw new RedisError(`Failed to get key: ${key}, `, error as Error); } } export async function mget(...keys: string[]): Promise<(string | null)[]> { try { return await redis.mget(keys); } catch (error) { console.error('Redis mget error: ', error); throw new RedisError(`Failed to get keys: ${keys}, `, error as Error); } } export async function getJson(key: string): Promise { const value = await get(key); if (!value) return null; try { return JSON.parse(value) as T; } catch { return null; } } export async function del(key: string): Promise { try { return await redis.del(key); } catch (error) { console.error('Redis del error: ', error); throw new RedisError(`Failed to delete key: ${key}, `, error as Error); } }