/** * Redis connection wrapper. Provides one client for normal commands * and a separate one for pub/sub (Redis requires dedicated connections * for subscribe mode). */ import Redis from 'ioredis'; export interface RedisPair { /** For GET/SET/PUBLISH etc. */ client: Redis; /** For SUBSCRIBE only — must not be used for other commands. */ subscriber: Redis; close(): Promise; } export function createRedis(url: string): RedisPair { const client = new Redis(url, { lazyConnect: false, maxRetriesPerRequest: 3, enableReadyCheck: true, }); const subscriber = new Redis(url, { lazyConnect: false, maxRetriesPerRequest: null, // subscribers reconnect forever }); return { client, subscriber, async close() { await Promise.all([client.quit().catch(() => {}), subscriber.quit().catch(() => {})]); }, }; }