import { createClient } from "redis" import { createAdapter } from "@socket.io/redis-adapter" function composeURL() { // support for auth let url = "redis://" url += process.env.REDIS_HOST ?? "localhost" if (process.env.REDIS_PORT) { url += ":" + process.env.REDIS_PORT } return url } export default ({ withWsAdapter = false } = {}) => { let clientOpts = { url: composeURL(), } if (!process.env.REDIS_NO_AUTH) { if (process.env.REDIS_PASSWORD) { clientOpts.password = process.env.REDIS_PASSWORD } if (process.env.REDIS_USERNAME) { clientOpts.username = process.env.REDIS_USERNAME } } let client = createClient(clientOpts) if (withWsAdapter) { client.subClient = client.duplicate() client.ioAdapter = global.ioAdapter = createAdapter(client, client.subClient) } client.initialize = async () => { console.log("🔌 Connecting to Redis client...") await client.connect() return client } // handle when client disconnects unexpectedly to avoid main crash client.on("error", (error) => { console.error("❌ Redis client error:", error) }) // handle when client connects client.on("connect", () => { console.log("✅ Redis client connected.", process.env.REDIS_HOST) }) return client }