// libs/db/src/redis/redis.module.ts import { DynamicModule, Module, Provider } from '@nestjs/common'; import Redis from 'ioredis'; import { REDIS_CLIENT, REDIS_OPTIONS } from './redis.constants'; import { RedisModuleAsyncOptions, RedisModuleOptions, } from './redis.interfaces'; import { RedisService } from './redis.service'; @Module({}) export class RedisModule { static forRootAsync(options: RedisModuleAsyncOptions): DynamicModule { const optionsProvider: Provider = { provide: REDIS_OPTIONS, useFactory: options.useFactory, inject: options.inject ?? [], }; const clientProvider: Provider = { provide: REDIS_CLIENT, useFactory: async (opts: RedisModuleOptions) => { const client = new Redis({ host: opts.host, port: opts.port, password: opts.password || undefined, db: opts.db ?? 0, keyPrefix: opts.keyPrefix, tls: opts.tls ? {} : undefined, }); client.on('error', (err) => { // eslint-disable-next-line no-console console.error('[Redis] Error:', err?.message ?? err); }); return client; }, inject: [REDIS_OPTIONS], }; return { module: RedisModule, global: true, // Make it globally available imports: options.imports ?? [], providers: [optionsProvider, clientProvider, RedisService], exports: [clientProvider, RedisService], // 👈 important }; } }