import { IoAdapter } from '@nestjs/platform-socket.io'; import { INestApplicationContext, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { ServerOptions } from 'socket.io'; import { createAdapter } from '@socket.io/redis-adapter'; import Redis from 'ioredis'; export class RedisIoAdapter extends IoAdapter { private readonly logger = new Logger(RedisIoAdapter.name); private adapterConstructor: ReturnType; constructor( app: INestApplicationContext, private readonly configService: ConfigService, ) { super(app); } async connectToRedis(): Promise { const host = this.configService.get('redis.host', 'localhost'); const port = this.configService.get('redis.port', 6379); const password = this.configService.get('redis.password') || undefined; const db = this.configService.get('redis.db', 0); const pubClient = new Redis({ host, port, password, db }); const subClient = new Redis({ host, port, password, db }); await Promise.all([ new Promise((resolve) => pubClient.on('connect', resolve)), new Promise((resolve) => subClient.on('connect', resolve)), ]); this.adapterConstructor = createAdapter(pubClient, subClient); this.logger.log(`Redis adapter connected to ${host}:${port}`); } createIOServer(port: number, options?: ServerOptions) { const server = super.createIOServer(port, options); server.adapter(this.adapterConstructor); return server; } }