返回 AiToEarn
redis.module.ts
根目录 / project / aitoearn-backend / libs / redis / src / redis.module.ts
1 import type { DynamicModule } from '@nestjs/common'
2 import { Cluster, Redis } from 'ioredis'
3 import { EventStreamExplorer } from './event-stream.explorer'
4 import { EventStreamService } from './event-stream.service'
5 import { RedisPubSubService } from './pub-sub.service'
6 import { RedisConfig } from './redis.config'
7 import { RedisService } from './redis.service'
8
9 const REDIS_PUBSUB_SUBSCRIBER = Symbol('REDIS_PUBSUB_SUBSCRIBER')
10 const REDIS_PUBSUB_PUBLISHER = Symbol('REDIS_PUBSUB_PUBLISHER')
11
12 function createRedisClient(config: RedisConfig, options?: { enableReadyCheck?: boolean }) {
13 if ('nodes' in config) {
14 return new Cluster(config.nodes, {
15 ...config.options,
16 dnsLookup: (address, callback) => callback(null, address),
17 })
18 }
19 const tls = config.tls ? {} : undefined
20 return new Redis({
21 ...config,
22 maxRetriesPerRequest: null,
23 tls,
24 enableReadyCheck: options?.enableReadyCheck ?? true,
25 })
26 }
27 export class RedisModule {
28 static forRoot(config: RedisConfig): DynamicModule {
29 return {
30 module: RedisModule,
31 providers: [
32 {
33 provide: Redis,
34 useFactory: () => createRedisClient(config),
35 },
36 {
37 provide: REDIS_PUBSUB_SUBSCRIBER,
38 useFactory: () => createRedisClient(config, { enableReadyCheck: false }),
39 },
40 {
41 provide: REDIS_PUBSUB_PUBLISHER,
42 useFactory: () => createRedisClient(config, { enableReadyCheck: false }),
43 },
44 {
45 provide: RedisService,
46 useFactory: (client: Redis) => new RedisService(client),
47 inject: [Redis],
48 },
49 {
50 provide: RedisPubSubService,
51 useFactory: (subscriber: Redis, publisher: Redis) => new RedisPubSubService(subscriber, publisher),
52 inject: [REDIS_PUBSUB_SUBSCRIBER, REDIS_PUBSUB_PUBLISHER],
53 },
54 {
55 provide: EventStreamService,
56 useFactory: (client: Redis) => new EventStreamService(client),
57 inject: [Redis],
58 },
59 EventStreamExplorer,
60 ],
61 exports: [RedisService, RedisPubSubService, EventStreamService, Redis],
62 global: true,
63 }
64 }
65 }
66
66 lines TYPESCRIPT