redis.module.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // libs/db/src/redis/redis.module.ts
  2. import { DynamicModule, Module, Provider } from '@nestjs/common';
  3. import Redis from 'ioredis';
  4. import { REDIS_CLIENT, REDIS_OPTIONS } from './redis.constants';
  5. import {
  6. RedisModuleAsyncOptions,
  7. RedisModuleOptions,
  8. } from './redis.interfaces';
  9. import { RedisService } from './redis.service';
  10. @Module({})
  11. export class RedisModule {
  12. static forRootAsync(options: RedisModuleAsyncOptions): DynamicModule {
  13. const optionsProvider: Provider = {
  14. provide: REDIS_OPTIONS,
  15. useFactory: options.useFactory,
  16. inject: options.inject ?? [],
  17. };
  18. const clientProvider: Provider = {
  19. provide: REDIS_CLIENT,
  20. useFactory: async (opts: RedisModuleOptions) => {
  21. const client = new Redis({
  22. host: opts.host,
  23. port: opts.port,
  24. password: opts.password || undefined,
  25. db: opts.db ?? 0,
  26. keyPrefix: opts.keyPrefix,
  27. tls: opts.tls ? {} : undefined,
  28. });
  29. client.on('error', (err) => {
  30. // eslint-disable-next-line no-console
  31. console.error('[Redis] Error:', err?.message ?? err);
  32. });
  33. return client;
  34. },
  35. inject: [REDIS_OPTIONS],
  36. };
  37. return {
  38. module: RedisModule,
  39. global: true, // Make it globally available
  40. imports: options.imports ?? [],
  41. providers: [optionsProvider, clientProvider, RedisService],
  42. exports: [clientProvider, RedisService], // 👈 important
  43. };
  44. }
  45. }