import { DynamicModule, ForwardReference, Module, Provider, Type } from "@nestjs/common"; import { RedisClientOptions, RedisModules, RedisScripts } from "redis"; import { REDIS_CONFIG } from "./constants"; import { RedisModuleInitializationException } from "./exceptions"; import { RedisService } from "./redis.service"; export type RedisModuleOptions = RedisClientOptions; export interface AsyncModuleOptions { imports?: (DynamicModule | Type | Promise | ForwardReference)[], useFactory?: (...args: any[]) => Promise | T; inject?: any[]; } @Module({}) export class RedisModule { static register(options: RedisModuleOptions): DynamicModule { return { module: RedisModule, providers: [{ provide: REDIS_CONFIG, useValue: options }, RedisService], exports: [RedisService] } } static registerAsync(options: AsyncModuleOptions): DynamicModule { return { module: RedisModule, imports: [...(options.imports || [])], providers: [RedisModule.createAsyncRedisConfigProvider(options), RedisService], exports: [RedisService], } } private static createAsyncRedisConfigProvider(options: AsyncModuleOptions): Provider { if (options.useFactory) { return { provide: REDIS_CONFIG, useFactory: options.useFactory, inject: [...(options.inject || [])] } } throw new RedisModuleInitializationException('Redis Module asynchronous registrations MUST `useFactory`'); } }