import Redis from "ioredis"; const globalForRedis = globalThis as unknown as { redis?: Redis | null }; function createRedis(): Redis | null { const url = process.env.REDIS_URL; if (!url) return null; try { const client = new Redis(url, { maxRetriesPerRequest: 3, retryStrategy(times) { if (times > 3) return null; return Math.min(times * 200, 2000); }, lazyConnect: true, }); client.on("error", () => {}); return client; } catch { return null; } } export const redis: Redis | null = globalForRedis.redis !== undefined ? globalForRedis.redis : (globalForRedis.redis = createRedis()); export async function withRedis( fallback: () => Promise, redisFn: (client: Redis) => Promise, ): Promise { if (redis) { try { return await redisFn(redis); } catch { return fallback(); } } return fallback(); }