@xnestjs/ioredis 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/{esm → cjs}/index.d.ts +0 -2
  2. package/cjs/index.js +1 -2
  3. package/cjs/index.js.map +1 -0
  4. package/cjs/redis-client.d.ts +10 -0
  5. package/cjs/redis-client.js +9 -67
  6. package/cjs/redis-client.js.map +1 -0
  7. package/cjs/redis-core.module.d.ts +15 -0
  8. package/cjs/redis-core.module.js +121 -61
  9. package/cjs/redis-core.module.js.map +1 -0
  10. package/{esm/redis-client.d.ts → cjs/redis-lock.d.ts} +8 -10
  11. package/cjs/redis-lock.js +68 -0
  12. package/cjs/redis-lock.js.map +1 -0
  13. package/cjs/redis.constants.js +1 -0
  14. package/cjs/redis.constants.js.map +1 -0
  15. package/cjs/redis.interface.d.ts +33 -0
  16. package/cjs/redis.interface.js +1 -0
  17. package/cjs/redis.interface.js.map +1 -0
  18. package/cjs/redis.module.d.ts +8 -0
  19. package/cjs/redis.module.js +19 -7
  20. package/cjs/redis.module.js.map +1 -0
  21. package/esm/index.js +1 -2
  22. package/esm/index.js.map +1 -0
  23. package/esm/redis-client.js +7 -66
  24. package/esm/redis-client.js.map +1 -0
  25. package/esm/redis-core.module.js +122 -62
  26. package/esm/redis-core.module.js.map +1 -0
  27. package/esm/redis-lock.js +64 -0
  28. package/esm/redis-lock.js.map +1 -0
  29. package/esm/redis.constants.js +1 -0
  30. package/esm/redis.constants.js.map +1 -0
  31. package/esm/redis.interface.js +1 -0
  32. package/esm/redis.interface.js.map +1 -0
  33. package/esm/redis.module.js +18 -6
  34. package/esm/redis.module.js.map +1 -0
  35. package/package.json +15 -16
  36. package/types/index.d.ts +3 -0
  37. package/types/redis-client.d.ts +10 -0
  38. package/types/redis-core.module.d.ts +15 -0
  39. package/types/redis-lock.d.ts +39 -0
  40. package/types/redis.constants.d.ts +2 -0
  41. package/types/redis.interface.d.ts +33 -0
  42. package/types/redis.module.d.ts +8 -0
  43. package/cjs/redis.decorators.js +0 -7
  44. package/cjs/redis.utils.js +0 -12
  45. package/esm/redis-core.module.d.ts +0 -14
  46. package/esm/redis.decorators.d.ts +0 -1
  47. package/esm/redis.decorators.js +0 -3
  48. package/esm/redis.interface.d.ts +0 -19
  49. package/esm/redis.module.d.ts +0 -6
  50. package/esm/redis.utils.d.ts +0 -3
  51. package/esm/redis.utils.js +0 -8
  52. /package/{esm → cjs}/redis.constants.d.ts +0 -0
@@ -1,5 +1,3 @@
1
- export * from './redis.decorators.js';
2
1
  export * from './redis.interface.js';
3
2
  export * from './redis.module.js';
4
- export * from './redis.utils.js';
5
3
  export * from './redis-client.js';
package/cjs/index.js CHANGED
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./redis.decorators.js"), exports);
5
4
  tslib_1.__exportStar(require("./redis.interface.js"), exports);
6
5
  tslib_1.__exportStar(require("./redis.module.js"), exports);
7
- tslib_1.__exportStar(require("./redis.utils.js"), exports);
8
6
  tslib_1.__exportStar(require("./redis-client.js"), exports);
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/ioredis/src/index.ts"],"names":[],"mappings":";;;AAAA,+DAAqC;AACrC,4DAAkC;AAClC,4DAAkC"}
@@ -0,0 +1,10 @@
1
+ import Redis, { Cluster } from 'ioredis';
2
+ import { RedisLock } from './redis-lock.js';
3
+ export interface RedisClient extends Redis, RedisLock {
4
+ }
5
+ export interface RedisCluster extends Cluster, RedisLock {
6
+ }
7
+ export declare class RedisClient extends Redis {
8
+ }
9
+ export declare class RedisCluster extends Cluster {
10
+ }
@@ -1,73 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RedisClient = void 0;
3
+ exports.RedisCluster = exports.RedisClient = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
6
- const putil_varhelpers_1 = require("putil-varhelpers");
5
+ const ioredis_1 = tslib_1.__importStar(require("ioredis"));
6
+ const redis_lock_js_1 = require("./redis-lock.js");
7
7
  class RedisClient extends ioredis_1.default {
8
- lockPrefix;
9
- /**
10
- * Try to lock once
11
- * @param {string} name redis-lock name
12
- * @param {number} [expire] milliseconds, TTL for the redis key
13
- * @returns {boolean} true: success, false: failed
14
- */
15
- async tryLock(name, expire) {
16
- const result = await this.set(this._getLockKey(name), '_lock_', 'PX', expire, 'NX');
17
- return result !== null;
18
- }
19
- /**
20
- * lock, automatically retrying if failed
21
- * @param {string} name redis-lock name
22
- * @param {object} [options] Options
23
- * @param {number} [options.expire=60000] TTL
24
- * @param {number} [options.retryInterval=100] milliseconds, the interval to retry if failed
25
- * @param {number} [options.maxRetries=10] max times to retry
26
- */
27
- async lock(name, options) {
28
- const expire = (0, putil_varhelpers_1.toNumberDef)(options?.expire, 60000);
29
- const retryInterval = (0, putil_varhelpers_1.toNumberDef)(options?.retryInterval, 100);
30
- const maxRetries = (0, putil_varhelpers_1.toNumberDef)(options?.maxRetries, 10);
31
- let retryTimes = 0;
32
- // eslint-disable-next-line no-constant-condition
33
- while (1) {
34
- if (await this.tryLock(name, expire)) {
35
- break;
36
- }
37
- else {
38
- await this._sleep(retryInterval);
39
- if (retryTimes >= maxRetries) {
40
- throw new Error(`Redis lock "${name}" timed out`);
41
- }
42
- retryTimes++;
43
- }
44
- }
45
- }
46
- /**
47
- * Unlock a redis-lock by name
48
- * @param {string} name redis-lock name
49
- */
50
- async unlock(name) {
51
- const s = 'if redis.call(\'get\', KEYS[1]) == ARGV[1] then return redis.call(\'del\', KEYS[1]) else return 0 end';
52
- await this.eval(s, 1, this._getLockKey(name), '_lock_');
53
- }
54
- /**
55
- * Set TTL for a redis-lock
56
- * @param {string} name redis-lock name
57
- * @param {number} milliseconds TTL
58
- */
59
- async setLockTTL(name, milliseconds) {
60
- const result = await this.pexpire(this._getLockKey(name), milliseconds);
61
- return !!result;
62
- }
63
- _getLockKey(name) {
64
- return (this.lockPrefix || 'lock:') + name;
65
- }
66
- /**
67
- * @param {number} ms milliseconds, the sleep interval
68
- */
69
- _sleep(ms) {
70
- return new Promise(resolve => setTimeout(resolve, Number(ms)));
71
- }
72
8
  }
73
9
  exports.RedisClient = RedisClient;
10
+ class RedisCluster extends ioredis_1.Cluster {
11
+ }
12
+ exports.RedisCluster = RedisCluster;
13
+ Object.assign(RedisClient.prototype, redis_lock_js_1.RedisLock.prototype);
14
+ Object.assign(RedisCluster.prototype, redis_lock_js_1.RedisLock.prototype);
15
+ //# sourceMappingURL=redis-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-client.js","sourceRoot":"","sources":["../../../packages/ioredis/src/redis-client.ts"],"names":[],"mappings":";;;;AAAA,2DAAyC;AACzC,mDAA4C;AAQ5C,MAAa,WAAY,SAAQ,iBAAK;CACrC;AADD,kCACC;AAED,MAAa,YAAa,SAAQ,iBAAO;CACxC;AADD,oCACC;AAED,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,yBAAS,CAAC,SAAS,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,yBAAS,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { DynamicModule, OnApplicationShutdown } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import { RedisClientAsyncOptions, RedisClientOptions, RedisClusterAsyncOptions, RedisClusterOptions } from './redis.interface.js';
4
+ export declare class RedisCoreModule implements OnApplicationShutdown {
5
+ private readonly options;
6
+ private readonly moduleRef;
7
+ constructor(options: RedisClientOptions | RedisClusterOptions, moduleRef: ModuleRef);
8
+ static registerClient(options?: RedisClientOptions): DynamicModule;
9
+ static registerClientAsync(asyncOptions: RedisClientAsyncOptions): DynamicModule;
10
+ static registerCluster(options: RedisClusterOptions): DynamicModule;
11
+ static registerClusterAsync(asyncOptions: RedisClusterAsyncOptions): DynamicModule;
12
+ private static _createClient;
13
+ private static _createCluster;
14
+ onApplicationShutdown(): Promise<void>;
15
+ }
@@ -7,23 +7,20 @@ const crypto = tslib_1.__importStar(require("crypto"));
7
7
  const common_1 = require("@nestjs/common");
8
8
  const core_1 = require("@nestjs/core");
9
9
  const redis_constants_js_1 = require("./redis.constants.js");
10
- const redis_utils_js_1 = require("./redis.utils.js");
11
10
  const redis_client_js_1 = require("./redis-client.js");
12
- let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule {
13
- options;
14
- moduleRef;
11
+ let RedisCoreModule = exports.RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule {
15
12
  constructor(options, moduleRef) {
16
13
  this.options = options;
17
14
  this.moduleRef = moduleRef;
18
15
  }
19
- static forRoot(options = {}) {
16
+ static registerClient(options = {}) {
20
17
  const optionsProvider = {
21
18
  provide: redis_constants_js_1.IOREDIS_MODULE_OPTIONS,
22
19
  useValue: options
23
20
  };
24
21
  const connectionProvider = {
25
- provide: (0, redis_utils_js_1.getRedisClientToken)(options.name),
26
- useFactory: () => this.createClient(options)
22
+ provide: options.token || redis_client_js_1.RedisClient,
23
+ useFactory: () => this._createClient(options)
27
24
  };
28
25
  return {
29
26
  module: RedisCoreModule_1,
@@ -31,88 +28,151 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule {
31
28
  exports: [connectionProvider]
32
29
  };
33
30
  }
34
- static forRootAsync(asyncOptions) {
31
+ static registerClientAsync(asyncOptions) {
32
+ if (!asyncOptions.useFactory)
33
+ throw new Error('Invalid configuration. Must provide "useFactory"');
35
34
  const connectionProvider = {
36
- provide: (0, redis_utils_js_1.getRedisClientToken)(asyncOptions.name),
35
+ provide: asyncOptions.token || redis_client_js_1.RedisClient,
37
36
  inject: [redis_constants_js_1.IOREDIS_MODULE_OPTIONS],
38
37
  useFactory: async (moduleOptions) => {
39
- const name = asyncOptions.name || moduleOptions.name;
40
- return this.createClient({
41
- ...moduleOptions,
42
- name
43
- });
38
+ return this._createClient(moduleOptions);
44
39
  }
45
40
  };
46
- const asyncProviders = this.createAsyncProviders(asyncOptions);
47
41
  return {
48
42
  module: RedisCoreModule_1,
49
43
  imports: asyncOptions.imports,
50
44
  providers: [
51
- ...asyncProviders,
52
- connectionProvider,
45
+ {
46
+ provide: redis_constants_js_1.IOREDIS_MODULE_OPTIONS,
47
+ useFactory: asyncOptions.useFactory,
48
+ inject: asyncOptions.inject || []
49
+ },
53
50
  {
54
51
  provide: redis_constants_js_1.IOREDIS_MODULE_TOKEN,
55
52
  useValue: crypto.randomUUID()
56
- }
53
+ },
54
+ connectionProvider
57
55
  ],
58
56
  exports: [connectionProvider]
59
57
  };
60
58
  }
61
- async onApplicationShutdown() {
62
- const client = this.moduleRef.get((0, redis_utils_js_1.getRedisClientToken)(this.options.name));
63
- if (client)
64
- await client.quit();
59
+ static registerCluster(options) {
60
+ const optionsProvider = {
61
+ provide: redis_constants_js_1.IOREDIS_MODULE_OPTIONS,
62
+ useValue: options
63
+ };
64
+ const connectionProvider = {
65
+ provide: options.token || redis_client_js_1.RedisCluster,
66
+ useFactory: () => this._createCluster(options)
67
+ };
68
+ return {
69
+ module: RedisCoreModule_1,
70
+ providers: [connectionProvider, optionsProvider],
71
+ exports: [connectionProvider]
72
+ };
65
73
  }
66
- static createAsyncProviders(asyncOptions) {
67
- if (asyncOptions.useExisting || asyncOptions.useFactory)
68
- return [this.createAsyncOptionsProvider(asyncOptions)];
69
- if (asyncOptions.useClass)
70
- return [
71
- this.createAsyncOptionsProvider(asyncOptions),
74
+ static registerClusterAsync(asyncOptions) {
75
+ if (!asyncOptions.useFactory)
76
+ throw new Error('Invalid configuration. Must provide "useFactory"');
77
+ const connectionProvider = {
78
+ provide: asyncOptions.token || redis_client_js_1.RedisCluster,
79
+ inject: [redis_constants_js_1.IOREDIS_MODULE_OPTIONS],
80
+ useFactory: async (moduleOptions) => {
81
+ return this._createCluster(moduleOptions);
82
+ }
83
+ };
84
+ return {
85
+ module: RedisCoreModule_1,
86
+ imports: asyncOptions.imports,
87
+ providers: [
72
88
  {
73
- provide: asyncOptions.useClass,
74
- useClass: asyncOptions.useClass
89
+ provide: redis_constants_js_1.IOREDIS_MODULE_OPTIONS,
90
+ useFactory: asyncOptions.useFactory,
91
+ inject: asyncOptions.inject || []
92
+ },
93
+ connectionProvider,
94
+ {
95
+ provide: redis_constants_js_1.IOREDIS_MODULE_TOKEN,
96
+ useValue: crypto.randomUUID()
75
97
  }
76
- ];
77
- throw new Error('Invalid configuration. Must provide useFactory, useClass or useExisting');
98
+ ],
99
+ exports: [connectionProvider]
100
+ };
78
101
  }
79
- static createAsyncOptionsProvider(asyncOptions) {
80
- if (asyncOptions.useFactory) {
81
- return {
82
- provide: redis_constants_js_1.IOREDIS_MODULE_OPTIONS,
83
- useFactory: asyncOptions.useFactory,
84
- inject: asyncOptions.inject || []
85
- };
86
- }
87
- const useClass = asyncOptions.useClass || asyncOptions.useExisting;
88
- if (useClass) {
89
- return {
90
- provide: redis_constants_js_1.IOREDIS_MODULE_OPTIONS,
91
- useFactory: (optionsFactory) => optionsFactory.createOptions(asyncOptions.name),
92
- inject: [useClass]
93
- };
102
+ static async _createClient(options) {
103
+ if (options.host && options.host.includes('://')) {
104
+ const url = new URL(options.host);
105
+ options.host = url.hostname;
106
+ if (url.port)
107
+ options.port = parseInt(url.port, 10);
108
+ if (url.username)
109
+ options.username = url.username;
110
+ if (url.password)
111
+ options.password = url.password;
112
+ if (url.protocol === 'rediss:') { // @ts-ignore
113
+ options.tls = true;
114
+ }
115
+ const db = parseInt(url.pathname.substring(1), 10);
116
+ if (db > 0)
117
+ options.db = db;
94
118
  }
95
- throw new Error('Invalid configuration. Must provide useFactory, useClass or useExisting');
96
- }
97
- static async createClient(options) {
98
119
  const client = new redis_client_js_1.RedisClient(options);
99
- await new Promise((resolve, reject) => {
100
- client.once('ready', () => {
101
- client.removeListener('error', reject);
102
- resolve();
103
- });
104
- client.once('error', (e) => {
105
- client.removeListener('ready', resolve);
106
- reject(e);
120
+ if (!options.lazyConnect) {
121
+ await new Promise((resolve, reject) => {
122
+ client.once('ready', () => {
123
+ client.removeListener('error', reject);
124
+ resolve();
125
+ });
126
+ client.once('error', (e) => {
127
+ client.removeListener('ready', resolve);
128
+ reject(e);
129
+ });
107
130
  });
108
- });
131
+ }
109
132
  return client;
110
133
  }
134
+ static async _createCluster(options) {
135
+ const clusterOptions = {
136
+ ...options
137
+ };
138
+ delete clusterOptions.name;
139
+ delete clusterOptions.nodes;
140
+ const cluster = new redis_client_js_1.RedisCluster(options.nodes, clusterOptions);
141
+ if (!options.lazyConnect) {
142
+ await new Promise((resolve, reject) => {
143
+ cluster.once('ready', () => {
144
+ cluster.removeListener('error', reject);
145
+ resolve();
146
+ });
147
+ cluster.once('error', (e) => {
148
+ cluster.removeListener('ready', resolve);
149
+ reject(e);
150
+ });
151
+ });
152
+ }
153
+ return cluster;
154
+ }
155
+ async onApplicationShutdown() {
156
+ try {
157
+ const client = this.moduleRef.get(this.options.token || redis_client_js_1.RedisClient);
158
+ await client.quit();
159
+ }
160
+ catch {
161
+ //
162
+ }
163
+ try {
164
+ const cluster = this.moduleRef.get(this.options.token || redis_client_js_1.RedisCluster);
165
+ await cluster.quit();
166
+ }
167
+ catch {
168
+ //
169
+ }
170
+ }
111
171
  };
112
- RedisCoreModule = RedisCoreModule_1 = tslib_1.__decorate([
172
+ exports.RedisCoreModule = RedisCoreModule = RedisCoreModule_1 = tslib_1.__decorate([
113
173
  (0, common_1.Global)(),
114
174
  (0, common_1.Module)({}),
115
175
  tslib_1.__param(0, (0, common_1.Inject)(redis_constants_js_1.IOREDIS_MODULE_OPTIONS)),
116
176
  tslib_1.__metadata("design:paramtypes", [Object, core_1.ModuleRef])
117
177
  ], RedisCoreModule);
118
- exports.RedisCoreModule = RedisCoreModule;
178
+ //# sourceMappingURL=redis-core.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-core.module.js","sourceRoot":"","sources":["../../../packages/ioredis/src/redis-core.module.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import Redis from 'ioredis';
1
+ import Redis, { Cluster } from 'ioredis';
2
2
  export interface LockOptions {
3
3
  expire?: number;
4
4
  retryInterval?: number;
5
5
  maxRetries?: number;
6
6
  }
7
- export declare class RedisClient extends Redis {
7
+ type This = RedisLock & (Redis | Cluster);
8
+ export declare class RedisLock {
8
9
  lockPrefix?: string;
9
10
  /**
10
11
  * Try to lock once
@@ -12,7 +13,7 @@ export declare class RedisClient extends Redis {
12
13
  * @param {number} [expire] milliseconds, TTL for the redis key
13
14
  * @returns {boolean} true: success, false: failed
14
15
  */
15
- tryLock(name: any, expire: any): Promise<boolean>;
16
+ tryLock(this: This, name: any, expire: any): Promise<boolean>;
16
17
  /**
17
18
  * lock, automatically retrying if failed
18
19
  * @param {string} name redis-lock name
@@ -21,21 +22,18 @@ export declare class RedisClient extends Redis {
21
22
  * @param {number} [options.retryInterval=100] milliseconds, the interval to retry if failed
22
23
  * @param {number} [options.maxRetries=10] max times to retry
23
24
  */
24
- lock(name: string, options?: LockOptions): Promise<void>;
25
+ lock(this: This, name: string, options?: LockOptions): Promise<void>;
25
26
  /**
26
27
  * Unlock a redis-lock by name
27
28
  * @param {string} name redis-lock name
28
29
  */
29
- unlock(name: any): Promise<void>;
30
+ unlock(this: This, name: any): Promise<void>;
30
31
  /**
31
32
  * Set TTL for a redis-lock
32
33
  * @param {string} name redis-lock name
33
34
  * @param {number} milliseconds TTL
34
35
  */
35
- setLockTTL(name: any, milliseconds: any): Promise<boolean>;
36
+ setLockTTL(this: This, name: any, milliseconds: any): Promise<boolean>;
36
37
  private _getLockKey;
37
- /**
38
- * @param {number} ms milliseconds, the sleep interval
39
- */
40
- private _sleep;
41
38
  }
39
+ export {};
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisLock = void 0;
4
+ const putil_varhelpers_1 = require("putil-varhelpers");
5
+ class RedisLock {
6
+ /**
7
+ * Try to lock once
8
+ * @param {string} name redis-lock name
9
+ * @param {number} [expire] milliseconds, TTL for the redis key
10
+ * @returns {boolean} true: success, false: failed
11
+ */
12
+ async tryLock(name, expire) {
13
+ const result = await this.set(this._getLockKey(name), '_lock_', 'PX', expire, 'NX');
14
+ return result !== null;
15
+ }
16
+ /**
17
+ * lock, automatically retrying if failed
18
+ * @param {string} name redis-lock name
19
+ * @param {object} [options] Options
20
+ * @param {number} [options.expire=60000] TTL
21
+ * @param {number} [options.retryInterval=100] milliseconds, the interval to retry if failed
22
+ * @param {number} [options.maxRetries=10] max times to retry
23
+ */
24
+ async lock(name, options) {
25
+ const expire = (0, putil_varhelpers_1.toNumberDef)(options?.expire, 60000);
26
+ const retryInterval = (0, putil_varhelpers_1.toNumberDef)(options?.retryInterval, 100);
27
+ const maxRetries = (0, putil_varhelpers_1.toNumberDef)(options?.maxRetries, 10);
28
+ let retryTimes = 0;
29
+ // eslint-disable-next-line no-constant-condition
30
+ while (1) {
31
+ if (await this.tryLock(name, expire)) {
32
+ break;
33
+ }
34
+ else {
35
+ await sleepAsync(retryInterval);
36
+ if (retryTimes >= maxRetries) {
37
+ throw new Error(`Redis lock "${name}" timed out`);
38
+ }
39
+ retryTimes++;
40
+ }
41
+ }
42
+ }
43
+ /**
44
+ * Unlock a redis-lock by name
45
+ * @param {string} name redis-lock name
46
+ */
47
+ async unlock(name) {
48
+ const s = 'if redis.call(\'get\', KEYS[1]) == ARGV[1] then return redis.call(\'del\', KEYS[1]) else return 0 end';
49
+ await this.eval(s, 1, this._getLockKey(name), '_lock_');
50
+ }
51
+ /**
52
+ * Set TTL for a redis-lock
53
+ * @param {string} name redis-lock name
54
+ * @param {number} milliseconds TTL
55
+ */
56
+ async setLockTTL(name, milliseconds) {
57
+ const result = await this.pexpire(this._getLockKey(name), milliseconds);
58
+ return !!result;
59
+ }
60
+ _getLockKey(name) {
61
+ return (this.lockPrefix || 'lock:') + name;
62
+ }
63
+ }
64
+ exports.RedisLock = RedisLock;
65
+ async function sleepAsync(ms) {
66
+ return new Promise(resolve => setTimeout(resolve, Number(ms)));
67
+ }
68
+ //# sourceMappingURL=redis-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-lock.js","sourceRoot":"","sources":["../../../packages/ioredis/src/redis-lock.ts"],"names":[],"mappings":";;;AACA,uDAA+C;AAU/C,MAAa,SAAS;IAIpB;;;;;OAKG;IACI,KAAK,CAAC,OAAO,CAAa,IAAI,EAAE,MAAM;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACpF,OAAO,MAAM,KAAK,IAAI,CAAC;IACzB,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,IAAI,CAAa,IAAY,EAAE,OAAqB;QAC/D,MAAM,MAAM,GAAG,IAAA,8BAAW,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,IAAA,8BAAW,EAAC,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAA,8BAAW,EAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAExD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,iDAAiD;QACjD,OAAO,CAAC,EAAE;YACR,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;gBACpC,MAAM;aACP;iBAAM;gBACL,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC;gBAChC,IAAI,UAAU,IAAI,UAAU,EAAE;oBAC5B,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,aAAa,CAAC,CAAC;iBACnD;gBACD,UAAU,EAAE,CAAC;aACd;SACF;IACH,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,MAAM,CAAa,IAAI;QAClC,MAAM,CAAC,GAAG,uGAAuG,CAAC;QAClH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,UAAU,CAAa,IAAI,EAAE,YAAY;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QACxE,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAEO,WAAW,CAAC,IAAI;QACtB,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,CAAC;CAEF;AAlED,8BAkEC;AAED,KAAK,UAAU,UAAU,CAAC,EAAU;IAClC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -3,3 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IOREDIS_MODULE_TOKEN = exports.IOREDIS_MODULE_OPTIONS = void 0;
4
4
  exports.IOREDIS_MODULE_OPTIONS = Symbol('IOREDIS_MODULE_OPTIONS');
5
5
  exports.IOREDIS_MODULE_TOKEN = Symbol('IOREDIS_MODULE_ID');
6
+ //# sourceMappingURL=redis.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.constants.js","sourceRoot":"","sources":["../../../packages/ioredis/src/redis.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC1D,QAAA,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { RedisOptions } from 'ioredis';
2
+ import type { ClusterOptions } from 'ioredis/built/cluster/ClusterOptions';
3
+ import type { ClusterNode } from 'ioredis/built/cluster/index.js';
4
+ import type { ModuleMetadata } from '@nestjs/common/interfaces';
5
+ export interface RedisClientOptions extends RedisOptions {
6
+ /**
7
+ * Injection token
8
+ */
9
+ token?: any;
10
+ }
11
+ export interface RedisClientAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
12
+ /**
13
+ * Injection token
14
+ */
15
+ token?: any;
16
+ useFactory?: (...args: any[]) => Promise<RedisClientOptions> | RedisClientOptions;
17
+ inject?: any[];
18
+ }
19
+ export interface RedisClusterOptions extends ClusterOptions {
20
+ /**
21
+ * Injection token
22
+ */
23
+ token?: any;
24
+ nodes: ClusterNode[];
25
+ }
26
+ export interface RedisClusterAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
27
+ /**
28
+ * Injection token
29
+ */
30
+ token?: any;
31
+ useFactory?: (...args: any[]) => Promise<RedisClusterOptions> | RedisClusterOptions;
32
+ inject?: any[];
33
+ }
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=redis.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.interface.js","sourceRoot":"","sources":["../../../packages/ioredis/src/redis.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { RedisClientAsyncOptions, RedisClientOptions, RedisClusterAsyncOptions, RedisClusterOptions } from './redis.interface.js';
3
+ export declare class RedisModule {
4
+ static registerClient(options: RedisClientOptions): DynamicModule;
5
+ static registerClientAsync(options: RedisClientAsyncOptions): DynamicModule;
6
+ static registerCluster(options: RedisClusterOptions): DynamicModule;
7
+ static registerClusterAsync(options: RedisClusterAsyncOptions): DynamicModule;
8
+ }
@@ -5,21 +5,33 @@ exports.RedisModule = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const common_1 = require("@nestjs/common");
7
7
  const redis_core_module_js_1 = require("./redis-core.module.js");
8
- let RedisModule = RedisModule_1 = class RedisModule {
9
- static forRoot(options) {
8
+ let RedisModule = exports.RedisModule = RedisModule_1 = class RedisModule {
9
+ static registerClient(options) {
10
10
  return {
11
11
  module: RedisModule_1,
12
- imports: [redis_core_module_js_1.RedisCoreModule.forRoot(options)]
12
+ imports: [redis_core_module_js_1.RedisCoreModule.registerClient(options)]
13
13
  };
14
14
  }
15
- static forRootAsync(options) {
15
+ static registerClientAsync(options) {
16
16
  return {
17
17
  module: RedisModule_1,
18
- imports: [redis_core_module_js_1.RedisCoreModule.forRootAsync(options)]
18
+ imports: [redis_core_module_js_1.RedisCoreModule.registerClientAsync(options)]
19
+ };
20
+ }
21
+ static registerCluster(options) {
22
+ return {
23
+ module: RedisModule_1,
24
+ imports: [redis_core_module_js_1.RedisCoreModule.registerCluster(options)]
25
+ };
26
+ }
27
+ static registerClusterAsync(options) {
28
+ return {
29
+ module: RedisModule_1,
30
+ imports: [redis_core_module_js_1.RedisCoreModule.registerClusterAsync(options)]
19
31
  };
20
32
  }
21
33
  };
22
- RedisModule = RedisModule_1 = tslib_1.__decorate([
34
+ exports.RedisModule = RedisModule = RedisModule_1 = tslib_1.__decorate([
23
35
  (0, common_1.Module)({})
24
36
  ], RedisModule);
25
- exports.RedisModule = RedisModule;
37
+ //# sourceMappingURL=redis.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../../../packages/ioredis/src/redis.module.ts"],"names":[],"mappings":";;;;;AAAA,2CAAuD;AAOvD,iEAAyD;AAGlD,IAAM,WAAW,yCAAjB,MAAM,WAAW;IACtB,MAAM,CAAC,cAAc,CAAC,OAA2B;QAC/C,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,sCAAe,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,OAAgC;QACzD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,sCAAe,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,OAA4B;QACjD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,sCAAe,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,OAAiC;QAC3D,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,sCAAe,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;SACzD,CAAC;IACJ,CAAC;CACF,CAAA;sBA5BY,WAAW;IADvB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,WAAW,CA4BvB"}
package/esm/index.js CHANGED
@@ -1,5 +1,4 @@
1
- export * from './redis.decorators.js';
2
1
  export * from './redis.interface.js';
3
2
  export * from './redis.module.js';
4
- export * from './redis.utils.js';
5
3
  export * from './redis-client.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/ioredis/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}