import { createClient } from 'redis'; import * as appMetrics from './src/metrics.js'; // Create Redis client const redisClient = createClient({ socket: { host: process.env.REDIS_HOST || 'localhost', port: process.env.REDIS_PORT || 6379, reconnectStrategy: (retries) => { if (retries > 10) return new Error('Redis max retries reached'); return Math.min(retries * 100, 3000); } }, password: process.env.REDIS_PASSWORD || undefined }); // Error handler redisClient.on('error', (err) => { appMetrics.redisErrorsTotal.add(1); console.error('Redis Client Error:', err); }); // Connection handler redisClient.on('connect', () => { console.log('✅ Connected to Redis'); }); // Instrument get/setEx with command duration (used by the CIMA cache path). const origGet = redisClient.get.bind(redisClient); redisClient.get = async (...args) => { const start = performance.now(); try { return await origGet(...args); } finally { appMetrics.redisCmdDuration.record(performance.now() - start); } }; const origSetEx = redisClient.setEx.bind(redisClient); redisClient.setEx = async (...args) => { const start = performance.now(); try { return await origSetEx(...args); } finally { appMetrics.redisCmdDuration.record(performance.now() - start); } }; // Connect to Redis — skip in test (services are mocked) or when REDIS_URL is unset if (process.env.NODE_ENV !== 'test') { await redisClient.connect(); } export default redisClient;