diff --git a/src/Managing.Web3Proxy/src/routes/home.ts b/src/Managing.Web3Proxy/src/routes/home.ts index 2eac5f2e..1be3ebea 100644 --- a/src/Managing.Web3Proxy/src/routes/home.ts +++ b/src/Managing.Web3Proxy/src/routes/home.ts @@ -167,13 +167,20 @@ const plugin: FastifyPluginAsyncTypebox = async (fastify) => { const redisPassword = process.env.REDIS_PASSWORD; console.log('Redis URL:', redisUrl) - console.log('Redis Password:', redisPassword) + console.log('Redis Password:', redisPassword ? '***' : 'none') - // Create Redis client configuration - const redisConfig: any = { url: redisUrl }; - // if (redisPassword) { - // redisConfig.password = redisPassword; - // } + // Create Redis client configuration with timeout + const redisConfig: any = { + url: redisUrl, + socket: { + connectTimeout: 3000, // 3 second connection timeout + reconnectStrategy: false // Don't retry on health check + } + }; + + if (redisPassword) { + redisConfig.password = redisPassword; + } redisClient = createClient(redisConfig); @@ -182,9 +189,14 @@ const plugin: FastifyPluginAsyncTypebox = async (fastify) => { console.error('Redis health check error:', err); }); - // Connect to Redis + // Connect to Redis with timeout const startTime = Date.now(); - await redisClient.connect(); + await Promise.race([ + redisClient.connect(), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Connection timeout after 3s')), 3000) + ) + ]); const connectTime = Date.now() - startTime; // Test basic operations diff --git a/src/Managing.Web3Proxy/src/server.ts b/src/Managing.Web3Proxy/src/server.ts index 3ff01849..db3c2474 100644 --- a/src/Managing.Web3Proxy/src/server.ts +++ b/src/Managing.Web3Proxy/src/server.ts @@ -34,10 +34,23 @@ async function initializeRedis() { const redisPassword = process.env.REDIS_PASSWORD console.log('Redis URL:', redisUrl) - console.log('Redis Password:', redisPassword) + console.log('Redis Password:', redisPassword ? '***' : 'none') - // Create Redis client with password support - const redisConfig: any = { url: redisUrl } + // Create Redis client with password support and timeouts + const redisConfig: any = { + url: redisUrl, + socket: { + connectTimeout: 5000, // 5 second connection timeout + reconnectStrategy: (retries: number) => { + // Exponential backoff: 50ms, 100ms, 200ms, 400ms, etc., max 3000ms + if (retries > 10) { + console.error('Redis: Max reconnection attempts reached') + return new Error('Max reconnection attempts reached'); + } + return Math.min(retries * 50, 3000); + } + } + } if (redisPassword) { redisConfig.password = redisPassword @@ -57,7 +70,17 @@ async function initializeRedis() { console.log('Redis client ready for idempotency operations') }) - await redisClient.connect() + redisClient.on('reconnecting', () => { + console.log('Redis client reconnecting...') + }) + + // Connect with timeout + await Promise.race([ + redisClient.connect(), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Redis connection timeout after 5s')), 5000) + ) + ]) } catch (error) { console.error('Failed to connect to Redis:', error) // Fallback to in-memory storage if Redis is not available