Skip to content

Commit 567390b

Browse files
committed
refactor: update Redis client types to RedisClientType for better compatibility
1 parent e49148c commit 567390b

File tree

16 files changed

+95
-77
lines changed

16 files changed

+95
-77
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,12 @@ export class AppModule {}
6161
```typescript
6262
// app.service.ts
6363
import { Injectable } from '@nestjs/common';
64-
import { InjectRedis, type Redis } from '@nestjs-redis/kit';
64+
import { InjectRedis } from '@nestjs-redis/kit';
65+
import type { RedisClientType } from 'redis';
6566

6667
@Injectable()
6768
export class AppService {
68-
constructor(@InjectRedis() private readonly redis: Redis) {}
69+
constructor(@InjectRedis() private readonly redis: RedisClientType) {}
6970

7071
async setValue(key: string, value: string) {
7172
await this.redis.set(key, value);

packages/client/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,12 @@ export class AppModule {}
6060
```typescript
6161
// app.service.ts
6262
import { Injectable } from '@nestjs/common';
63-
import { InjectRedis, type Redis } from '@nestjs-redis/kit';
63+
import { InjectRedis } from '@nestjs-redis/kit';
64+
import type { RedisClientType } from 'redis';
6465

6566
@Injectable()
6667
export class AppService {
67-
constructor(@InjectRedis() private readonly redis: Redis) {}
68+
constructor(@InjectRedis() private readonly redis: RedisClientType) {}
6869

6970
async setValue(key: string, value: string) {
7071
await this.redis.set(key, value);

packages/client/src/index.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
export { RedisModule } from './lib/module';
22
export { InjectRedis } from './lib/decorators';
33
export type {
4-
Redis,
5-
RedisClient,
6-
RedisCluster,
7-
RedisSentinel,
84
RedisModuleOptions,
95
RedisConnectionConfig,
6+
RedisModuleForRootOptions,
7+
RedisOptions,
108
} from './lib/types';
119
export { RedisToken } from './lib/tokens';
1210
export type {

packages/client/src/lib/module.int.spec.ts

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import {
88
} from '@nestjs/common';
99
import { ConfigModule, ConfigService } from '@nestjs/config';
1010
import { Test, TestingModule } from '@nestjs/testing';
11+
import type { RedisClientType } from 'redis';
1112
import { InjectRedis } from './decorators';
1213
import { RedisModule } from './module';
1314
import { RedisToken } from './tokens';
14-
import { Redis, RedisModuleOptions } from './types';
15+
import { RedisModuleOptions } from './types';
1516

1617
describe('RedisModule Integration forRoot', () => {
1718
let module: TestingModule;
18-
let redisClient: Redis;
19+
let redisClient: RedisClientType;
1920

2021
// Test Redis configuration - using default Redis instance
2122
const testRedisConfig: RedisModuleOptions = {
@@ -32,7 +33,7 @@ describe('RedisModule Integration forRoot', () => {
3233
}).compile();
3334
await module.init();
3435

35-
redisClient = module.get<Redis>(RedisToken());
36+
redisClient = module.get<RedisClientType>(RedisToken());
3637
});
3738

3839
afterEach(async () => {
@@ -190,7 +191,8 @@ describe('RedisModule Integration forRoot', () => {
190191
}).compile();
191192
await defaultModule.init();
192193

193-
const defaultRedisClient = defaultModule.get<Redis>(RedisToken());
194+
const defaultRedisClient =
195+
defaultModule.get<RedisClientType>(RedisToken());
194196

195197
// Test basic operation
196198
const ping = await defaultRedisClient.ping();
@@ -215,7 +217,7 @@ describe('RedisModule Integration forRoot', () => {
215217
}).compile();
216218
await customModule.init();
217219

218-
const customRedisClient = customModule.get<Redis>(RedisToken());
220+
const customRedisClient = customModule.get<RedisClientType>(RedisToken());
219221

220222
// Test basic operation
221223
const ping = await customRedisClient.ping();
@@ -270,7 +272,7 @@ describe('RedisModule Integration forRoot', () => {
270272

271273
describe('RedisModule Integration forRootAsync', () => {
272274
let module: TestingModule;
273-
let redisClient: Redis;
275+
let redisClient: RedisClientType;
274276

275277
beforeEach(async () => {
276278
module = await Test.createTestingModule({
@@ -288,7 +290,7 @@ describe('RedisModule Integration forRootAsync', () => {
288290

289291
await module.init();
290292

291-
redisClient = module.get<Redis>(RedisToken());
293+
redisClient = module.get<RedisClientType>(RedisToken());
292294
});
293295

294296
afterEach(async () => {
@@ -344,7 +346,8 @@ describe('RedisModule Integration forRootAsync', () => {
344346
}).compile();
345347
await defaultModule.init();
346348

347-
const defaultRedisClient = defaultModule.get<Redis>(RedisToken());
349+
const defaultRedisClient =
350+
defaultModule.get<RedisClientType>(RedisToken());
348351

349352
// Test basic operation
350353
const ping = await defaultRedisClient.ping();
@@ -373,7 +376,8 @@ describe('RedisModule Integration forRootAsync', () => {
373376
}).compile();
374377
await defaultModule.init();
375378

376-
const defaultRedisClient = defaultModule.get<Redis>(RedisToken());
379+
const defaultRedisClient =
380+
defaultModule.get<RedisClientType>(RedisToken());
377381

378382
// Test basic operation
379383
const ping = await defaultRedisClient.ping();
@@ -386,8 +390,8 @@ describe('RedisModule Integration forRootAsync', () => {
386390

387391
describe('Multi-connection Integration', () => {
388392
let module: TestingModule;
389-
let redisClient1: Redis;
390-
let redisClient2: Redis;
393+
let redisClient1: RedisClientType;
394+
let redisClient2: RedisClientType;
391395

392396
beforeAll(async () => {
393397
// Create module with multiple forRoot calls
@@ -411,8 +415,8 @@ describe('Multi-connection Integration', () => {
411415
],
412416
}).compile();
413417
await module.init();
414-
redisClient1 = module.get<Redis>(RedisToken());
415-
redisClient2 = module.get<Redis>(RedisToken('cache'));
418+
redisClient1 = module.get<RedisClientType>(RedisToken());
419+
redisClient2 = module.get<RedisClientType>(RedisToken('cache'));
416420
});
417421

418422
afterAll(async () => {
@@ -474,7 +478,7 @@ describe('RedisModule Service Lifecycle Integration', () => {
474478
BeforeApplicationShutdown
475479
{
476480
constructor(
477-
@InjectRedis() readonly redis: Redis,
481+
@InjectRedis() readonly redis: RedisClientType,
478482
private readonly prefix = 'root',
479483
) {}
480484

@@ -527,7 +531,8 @@ describe('RedisModule Service Lifecycle Integration', () => {
527531
{
528532
provide: TestLifecycleService,
529533
inject: [RedisToken()],
530-
useFactory: (redis: Redis) => new TestLifecycleService(redis, 'sync'),
534+
useFactory: (redis: RedisClientType) =>
535+
new TestLifecycleService(redis, 'sync'),
531536
},
532537
],
533538
}).compile();
@@ -543,7 +548,7 @@ describe('RedisModule Service Lifecycle Integration', () => {
543548
{
544549
provide: TestLifecycleService,
545550
inject: [RedisToken()],
546-
useFactory: (redis: Redis) =>
551+
useFactory: (redis: RedisClientType) =>
547552
new TestLifecycleService(redis, 'async'),
548553
},
549554
],

packages/client/src/lib/module.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ import {
1313
MODULE_OPTIONS_TOKEN,
1414
} from './redis-client.module-definition';
1515
import { RedisToken } from './tokens';
16-
import { Redis, RedisModuleForRootOptions, RedisModuleOptions } from './types';
16+
import { RedisModuleForRootOptions, RedisModuleOptions } from './types';
17+
18+
type RedisInstance =
19+
| ReturnType<typeof createClient>
20+
| ReturnType<typeof createCluster>
21+
| ReturnType<typeof createSentinel>;
1722

1823
@Module({})
1924
export class RedisModule
@@ -68,8 +73,10 @@ export class RedisModule
6873
): FactoryProvider {
6974
return {
7075
provide: RedisToken(connectionName),
71-
useFactory: async (config: RedisModuleOptions): Promise<Redis> => {
72-
function getClient(): Redis {
76+
useFactory: async (
77+
config: RedisModuleOptions,
78+
): Promise<RedisInstance> => {
79+
function getClient(): RedisInstance {
7380
switch (config?.type) {
7481
case 'client':
7582
case undefined:
@@ -86,7 +93,10 @@ export class RedisModule
8693
}
8794
}
8895

89-
function addListeners(client: Redis, connectionName?: string): void {
96+
function addListeners(
97+
client: RedisInstance,
98+
connectionName?: string,
99+
): void {
90100
client.on('connect', () => {
91101
RedisModule.log(
92102
`[Event=connect] Connection initiated to Redis server`,
@@ -137,7 +147,9 @@ export class RedisModule
137147

138148
async onApplicationShutdown() {
139149
RedisModule.log(`Closing Redis connection...`, this.connectionName);
140-
await this.moduleRef.get<Redis>(RedisToken(this.connectionName)).quit();
150+
await this.moduleRef
151+
.get<RedisInstance>(RedisToken(this.connectionName))
152+
.quit();
141153
RedisModule.log(`Redis connection closed`, this.connectionName);
142154
}
143155

packages/client/src/lib/types.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
import type { createClient, createCluster, createSentinel } from 'redis';
1+
import type {
2+
RedisClientOptions,
3+
RedisClusterOptions,
4+
RedisSentinelOptions,
5+
} from 'redis';
26

3-
export type RedisClient = ReturnType<typeof createClient>;
4-
export type RedisCluster = ReturnType<typeof createCluster>;
5-
export type RedisSentinel = ReturnType<typeof createSentinel>;
6-
export type Redis = RedisClient | RedisCluster | RedisSentinel;
7-
8-
export type RedisClientOptions = Parameters<typeof createClient>[0];
9-
export type RedisClusterOptions = Parameters<typeof createCluster>[0];
10-
export type RedisSentinelOptions = Parameters<typeof createSentinel>[0];
117
export type RedisOptions =
128
| RedisClientOptions
139
| RedisClusterOptions

packages/health-indicator/README.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,15 @@ export class AppModule {}
6464
// health.controller.ts
6565
import { Controller, Get } from '@nestjs/common';
6666
import { HealthCheck, HealthCheckService } from '@nestjs/terminus';
67-
import {
68-
InjectRedis,
69-
type Redis,
70-
RedisHealthIndicator,
71-
} from '@nestjs-redis/kit';
67+
import { InjectRedis, RedisHealthIndicator } from '@nestjs-redis/kit';
68+
import type { RedisClientType } from 'redis';
7269

7370
@Controller('health')
7471
export class HealthController {
7572
constructor(
7673
private readonly health: HealthCheckService,
7774
private readonly redis: RedisHealthIndicator,
78-
@InjectRedis() private readonly redisClient: Redis,
75+
@InjectRedis() private readonly redisClient: RedisClientType,
7976
) {}
8077

8178
@Get()
@@ -96,8 +93,8 @@ export class HealthController {
9693
constructor(
9794
private readonly health: HealthCheckService,
9895
private readonly redis: RedisHealthIndicator,
99-
@InjectRedis() private readonly mainRedis: Redis,
100-
@InjectRedis('cache') private readonly cacheRedis: Redis,
96+
@InjectRedis() private readonly mainRedis: RedisClientType,
97+
@InjectRedis('cache') private readonly cacheRedis: RedisClientType,
10198
) {}
10299

103100
@Get()
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
export * from './lib/health.indicator';
2-
export * from './lib/interfaces';

packages/health-indicator/src/lib/health.indicator.int.spec.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import { HealthIndicatorService } from '@nestjs/terminus';
22
import { Test, TestingModule } from '@nestjs/testing';
33
import { createClient } from 'redis';
4+
import type {
5+
RedisClientType,
6+
RedisClusterType,
7+
RedisSentinelType,
8+
} from 'redis';
49
import { RedisHealthIndicator } from './health.indicator';
5-
import { Redis } from './interfaces';
10+
11+
type RedisInstance = RedisClientType | RedisClusterType | RedisSentinelType;
612

713
// These tests require a running Redis instance
814
const REDIS_URL = process.env.REDIS_URL || 'redis://localhost:6379';
915

1016
describe('RedisHealthIndicator Integration Tests', () => {
1117
let healthIndicator: RedisHealthIndicator;
12-
let redisClient: Redis;
18+
let redisClient: RedisInstance;
1319

1420
beforeAll(async () => {
1521
const module: TestingModule = await Test.createTestingModule({

packages/health-indicator/src/lib/health.indicator.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import {
33
HealthIndicatorResult,
44
HealthIndicatorService,
55
} from '@nestjs/terminus';
6-
import { Redis } from './interfaces';
6+
import type { createClient, createCluster, createSentinel } from 'redis';
7+
8+
type Redis =
9+
| ReturnType<typeof createClient>
10+
| ReturnType<typeof createCluster>
11+
| ReturnType<typeof createSentinel>;
712

813
@Injectable()
914
export class RedisHealthIndicator {

0 commit comments

Comments
 (0)