@nestjs-redis/client
Version:
Flexible, production-ready Redis client module for NestJS with multi-connection support, built on the modern node-redis client
89 lines (88 loc) • 3.63 kB
JavaScript
;
var RedisModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RedisModule = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const core_1 = require("@nestjs/core");
const redis_1 = require("redis");
const redis_client_module_definition_1 = require("./redis-client.module-definition");
const tokens_1 = require("./tokens");
let RedisModule = RedisModule_1 = class RedisModule extends redis_client_module_definition_1.ConfigurableModuleClass {
constructor(moduleRef) {
super();
this.moduleRef = moduleRef;
}
static forRoot(options = {}) {
const baseModule = super.forRoot(options);
return {
global: options?.isGlobal ?? false,
module: class extends RedisModule_1 {
constructor() {
super(...arguments);
this.connectionToken = (0, tokens_1.RedisToken)(options?.connectionName);
}
},
providers: [
...(baseModule.providers || []),
this.getRedisClientProvider(options?.connectionName),
],
exports: [(0, tokens_1.RedisToken)(options?.connectionName)],
};
}
static forRootAsync(options) {
const baseModule = super.forRootAsync(options);
return {
global: options.isGlobal ?? false,
module: class extends RedisModule_1 {
constructor() {
super(...arguments);
this.connectionToken = (0, tokens_1.RedisToken)(options.connectionName);
}
},
imports: options.imports || [],
providers: [
...(baseModule.providers || []),
this.getRedisClientProvider(options.connectionName),
],
exports: [(0, tokens_1.RedisToken)(options.connectionName)],
};
}
static getRedisClientProvider(connectionName) {
return {
provide: (0, tokens_1.RedisToken)(connectionName),
useFactory: async (config) => {
function getClient() {
switch (config?.type) {
case 'client':
case undefined:
return (0, redis_1.createClient)(config?.options);
case 'cluster':
return (0, redis_1.createCluster)(config.options);
case 'sentinel':
return (0, redis_1.createSentinel)(config.options);
default:
throw new Error(
// @ts-expect-error check for config type
`Unsupported Redis type: ${config?.type}. Supported types are 'client', 'cluster' and 'sentinel'`);
}
}
const client = getClient();
await client.connect();
return client;
},
inject: [redis_client_module_definition_1.MODULE_OPTIONS_TOKEN],
};
}
async onApplicationShutdown() {
if (!this.connectionToken) {
throw new Error('Connection token is not defined. Ensure to call forRoot or forRootAsync.');
}
await this.moduleRef.get(this.connectionToken).quit();
}
};
exports.RedisModule = RedisModule;
exports.RedisModule = RedisModule = RedisModule_1 = tslib_1.__decorate([
(0, common_1.Module)({}),
tslib_1.__metadata("design:paramtypes", [core_1.ModuleRef])
], RedisModule);