import { IoAdapter } from '@nestjs/platform-socket.io';
import { createClient, RedisClientType } from 'redis';
import { ServerOptions } from 'socket.io';
import { createAdapter } from '@socket.io/redis-adapter';

export class RedisIoAdapter extends IoAdapter {
  private pubClient: RedisClientType;
  private subClient: RedisClientType;

  async connectToRedis() {
    this.pubClient = createClient({
      url: process.env.REDIS_URL,
    });

    this.subClient = this.pubClient.duplicate();

    await Promise.all([
      this.pubClient.connect(),
      this.subClient.connect(),
    ]);
  }

  createIOServer(port: number, options?: ServerOptions) {
    const server = super.createIOServer(port, {
      cors: {
        origin: '*',
      },
      ...options,
    });

    server.adapter(createAdapter(this.pubClient, this.subClient));

    return server;
  }
}