@anchan828/nest-redlock 0.0.6 → 0.0.9

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.
package/README.md CHANGED
@@ -18,12 +18,12 @@ $ npm i --save @anchan828/nest-redlock ioredis
18
18
  ### 1. Import module
19
19
 
20
20
  ```ts
21
- import { RedisRedlockModule } from "@anchan828/nest-redlock";
21
+ import { RedlockModule } from "@anchan828/nest-redlock";
22
22
  import Redis from "ioredis";
23
23
 
24
24
  @Module({
25
25
  imports: [
26
- RedisRedlockModule.register({
26
+ RedlockModule.register({
27
27
  // See https://github.com/mike-marcacci/node-redlock#configuration
28
28
  clients: [new Redis({ host: "localhost" })],
29
29
  settings: {
@@ -33,7 +33,7 @@ import Redis from "ioredis";
33
33
  retryJitter: 200,
34
34
  automaticExtensionThreshold: 500,
35
35
  },
36
- // Default duratiuon to use with RedisRedlock decorator
36
+ // Default duratiuon to use with Redlock decorator
37
37
  duration: 1000,
38
38
  }),
39
39
  ],
@@ -41,14 +41,14 @@ import Redis from "ioredis";
41
41
  export class AppModule {}
42
42
  ```
43
43
 
44
- ### 2. Add `RedisRedlock` decorator
44
+ ### 2. Add `Redlock` decorator
45
45
 
46
46
  ```ts
47
- import { RedisRedlock } from "@anchan828/nest-redlock";
47
+ import { Redlock } from "@anchan828/nest-redlock";
48
48
 
49
49
  @Injectable()
50
50
  export class ExampleService {
51
- @RedisRedlock("lock-key")
51
+ @Redlock("lock-key")
52
52
  public async addComment(projectId: number, comment: string): Promise<void> {}
53
53
  }
54
54
  ```
@@ -58,17 +58,17 @@ See [node-redlock](https://github.com/mike-marcacci/node-redlock) for more infor
58
58
 
59
59
  ## Define complex resources (lock keys)
60
60
 
61
- If you use a constant, it will be locked on all calls. Let's make the range a little smaller.
61
+ Using constants causes the same lock key to be used for all calls. Let's reduce the range a bit more.
62
62
 
63
63
  In this example, only certain projects are now locked.
64
64
 
65
65
  ```ts
66
- import { RedisRedlock } from "@anchan828/nest-redlock";
66
+ import { Redlock } from "@anchan828/nest-redlock";
67
67
 
68
68
  @Injectable()
69
69
  export class ExampleService {
70
70
  // The arguments define the class object to which the decorator is being added and the method arguments in order.
71
- @RedisRedlock((target: ExampleService, projectId: number, comment: string) => `projects/${projectId}/comments`)
71
+ @Redlock((target: ExampleService, projectId: number, comment: string) => `projects/${projectId}/comments`)
72
72
  public async addComment(projectId: number, comment: string): Promise<void> {}
73
73
  }
74
74
  ```
@@ -78,7 +78,7 @@ Of course, you can lock multiple keys.
78
78
  ```ts
79
79
  @Injectable()
80
80
  export class ExampleService {
81
- @RedisRedlock((target: ExampleService, projectId: number, args: Array<{ commentId: number; comment: string }>) =>
81
+ @Redlock((target: ExampleService, projectId: number, args: Array<{ commentId: number; comment: string }>) =>
82
82
  args.map((arg) => `projects/${projectId}/comments/${arg.commentId}`),
83
83
  )
84
84
  public async updateComments(projectId: number, args: Array<{ commentId: number; comment: string }>): Promise<void> {}
@@ -87,14 +87,14 @@ export class ExampleService {
87
87
 
88
88
  ## Using Redlock service
89
89
 
90
- If you want to use node-redlock as is, use RedisRedlockService.
90
+ If you want to use node-redlock as is, use RedlockService.
91
91
 
92
92
  ```ts
93
- import { RedisRedlockService } from "@anchan828/nest-redlock";
93
+ import { RedlockService } from "@anchan828/nest-redlock";
94
94
 
95
95
  @Injectable()
96
96
  export class ExampleService {
97
- constructor(private readonly redlock: RedisRedlockService) {}
97
+ constructor(private readonly redlock: RedlockService) {}
98
98
 
99
99
  public async addComment(projectId: number, comment: string): Promise<void> {
100
100
  await this.redlock.using([`projects/${projectId}/comments`], 5000, (signal) => {
@@ -108,29 +108,29 @@ export class ExampleService {
108
108
  }
109
109
  ```
110
110
 
111
- ## Using the RedisRedlockService mock
111
+ ## Using the RedlockService mock
112
112
 
113
- If you do not want to use Redis in your Unit tests, define the mock class as RedisRedlockService.
113
+ If you do not want to use Redis in your Unit tests, define the mock class as RedlockService.
114
114
 
115
115
  ```ts
116
116
  const app = await Test.createTestingModule({
117
- providers: [TestService, { provide: RedisRedlockService, useClass: MockRedisRedlockService }],
117
+ providers: [TestService, { provide: RedlockService, useClass: MockRedlockService }],
118
118
  }).compile();
119
119
  ```
120
120
 
121
121
  ## Troubleshooting
122
122
 
123
- ### Nest can't resolve dependencies of the XXX. Please make sure that the "@redisRedlockService" property is available in the current context.
123
+ ### Nest can't resolve dependencies of the XXX. Please make sure that the "@redlockService" property is available in the current context.
124
124
 
125
- This is the error output when using the RedisRedlock decorator without importing the RedisRedlockModule.
125
+ This is the error output when using the Redlock decorator without importing the RedlockModule.
126
126
 
127
127
  ```ts
128
- import { RedisRedlockModule } from "@anchan828/nest-redlock";
128
+ import { RedlockModule } from "@anchan828/nest-redlock";
129
129
  import Redis from "ioredis";
130
130
 
131
131
  @Module({
132
132
  imports: [
133
- RedisRedlockModule.register({
133
+ RedlockModule.register({
134
134
  clients: [new Redis({ host: "localhost" })],
135
135
  }),
136
136
  ],
@@ -140,11 +140,11 @@ export class AppModule {}
140
140
 
141
141
  #### What should I do with Unit tests, I don't want to use Redis.
142
142
 
143
- Use `MockRedisRedlockService` class. Register MockRedisRedlockService with the provider as RedisRedlockService.
143
+ Use `MockRedlockService` class. Register MockRedlockService with the provider as RedlockService.
144
144
 
145
145
  ```ts
146
146
  const app = await Test.createTestingModule({
147
- providers: [TestService, { provide: RedisRedlockService, useClass: MockRedisRedlockService }],
147
+ providers: [TestService, { provide: RedlockService, useClass: MockRedlockService }],
148
148
  }).compile();
149
149
  ```
150
150
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export { RedisRedlock } from "./redis-redlock.decorator";
2
- export { GenerateResourceFunc, RedisRedlockModuleOptions } from "./redis-redlock.interface";
3
- export { MockRedisRedlockService } from "./redis-redlock.mock-service";
4
- export { RedisRedlockModule } from "./redis-redlock.module";
5
- export { RedisRedlockService } from "./redis-redlock.service";
1
+ export { Redlock } from "./redlock.decorator";
2
+ export { GenerateResourceFunc, RedlockModuleOptions } from "./redlock.interface";
3
+ export { MockRedlockService } from "./redlock.mock-service";
4
+ export { RedlockModule } from "./redlock.module";
5
+ export { RedlockService } from "./redlock.service";
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RedisRedlockService = exports.RedisRedlockModule = exports.MockRedisRedlockService = exports.RedisRedlock = void 0;
4
- var redis_redlock_decorator_1 = require("./redis-redlock.decorator");
5
- Object.defineProperty(exports, "RedisRedlock", { enumerable: true, get: function () { return redis_redlock_decorator_1.RedisRedlock; } });
6
- var redis_redlock_mock_service_1 = require("./redis-redlock.mock-service");
7
- Object.defineProperty(exports, "MockRedisRedlockService", { enumerable: true, get: function () { return redis_redlock_mock_service_1.MockRedisRedlockService; } });
8
- var redis_redlock_module_1 = require("./redis-redlock.module");
9
- Object.defineProperty(exports, "RedisRedlockModule", { enumerable: true, get: function () { return redis_redlock_module_1.RedisRedlockModule; } });
10
- var redis_redlock_service_1 = require("./redis-redlock.service");
11
- Object.defineProperty(exports, "RedisRedlockService", { enumerable: true, get: function () { return redis_redlock_service_1.RedisRedlockService; } });
3
+ exports.RedlockService = exports.RedlockModule = exports.MockRedlockService = exports.Redlock = void 0;
4
+ var redlock_decorator_1 = require("./redlock.decorator");
5
+ Object.defineProperty(exports, "Redlock", { enumerable: true, get: function () { return redlock_decorator_1.Redlock; } });
6
+ var redlock_mock_service_1 = require("./redlock.mock-service");
7
+ Object.defineProperty(exports, "MockRedlockService", { enumerable: true, get: function () { return redlock_mock_service_1.MockRedlockService; } });
8
+ var redlock_module_1 = require("./redlock.module");
9
+ Object.defineProperty(exports, "RedlockModule", { enumerable: true, get: function () { return redlock_module_1.RedlockModule; } });
10
+ var redlock_service_1 = require("./redlock.service");
11
+ Object.defineProperty(exports, "RedlockService", { enumerable: true, get: function () { return redlock_service_1.RedlockService; } });
@@ -0,0 +1,3 @@
1
+ import { Settings } from "redlock";
2
+ import { GenerateResourceFunc } from "./redlock.interface";
3
+ export declare function Redlock(resource: string | string[] | GenerateResourceFunc, duration?: number, settings?: Partial<Settings>): MethodDecorator;
@@ -1,20 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RedisRedlock = void 0;
3
+ exports.Redlock = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
- const redis_redlock_service_1 = require("./redis-redlock.service");
6
- function RedisRedlock(resource, duration, settings = {}) {
7
- const injectRedisRedlockService = (0, common_1.Inject)(redis_redlock_service_1.RedisRedlockService);
5
+ const redlock_constants_1 = require("./redlock.constants");
6
+ const redlock_service_1 = require("./redlock.service");
7
+ function Redlock(resource, duration, settings = {}) {
8
+ const injectRedlockService = (0, common_1.Inject)(redlock_service_1.RedlockService);
8
9
  return (target, propertyKey, descriptor) => {
9
- const serviceSymbol = "@redisRedlockService";
10
- injectRedisRedlockService(target, serviceSymbol);
10
+ const serviceSymbol = "@redlockService";
11
+ injectRedlockService(target, serviceSymbol);
11
12
  const originalMethod = descriptor.value;
12
13
  descriptor.value = async function (...args) {
13
14
  // eslint-disable-next-line @typescript-eslint/no-this-alias
14
15
  const descriptorThis = this;
15
- const redisRedlockService = descriptorThis[serviceSymbol];
16
+ const redlockService = descriptorThis[serviceSymbol];
16
17
  const resources = getResources(resource, descriptorThis, args);
17
- return await redisRedlockService.using(resources, duration || redisRedlockService.options.duration || 5000, settings, async (signal) => {
18
+ return await redlockService.using(resources, duration || redlockService.options?.duration || redlock_constants_1.DEFAULT_DURATION, settings, async (signal) => {
18
19
  const result = await originalMethod.apply(descriptorThis, args);
19
20
  if (signal.aborted) {
20
21
  throw signal.error;
@@ -25,7 +26,7 @@ function RedisRedlock(resource, duration, settings = {}) {
25
26
  return descriptor;
26
27
  };
27
28
  }
28
- exports.RedisRedlock = RedisRedlock;
29
+ exports.Redlock = Redlock;
29
30
  function getResources(resource, descriptorThis, args) {
30
31
  if (typeof resource === "string") {
31
32
  return [resource];
@@ -1,6 +1,6 @@
1
1
  import Redis, { Cluster } from "ioredis";
2
2
  import { Settings } from "redlock";
3
- export declare type RedisRedlockModuleOptions = {
3
+ export declare type RedlockModuleOptions = {
4
4
  clients: Iterable<Redis | Cluster>;
5
5
  settings?: Partial<Settings>;
6
6
  scripts?: {
@@ -9,7 +9,7 @@ export declare type RedisRedlockModuleOptions = {
9
9
  readonly releaseScript?: string | ((script: string) => string);
10
10
  };
11
11
  /**
12
- * Default duratiuon to use with RedisRedlock decorator
12
+ * Default duratiuon to use with Redlock decorator
13
13
  *
14
14
  * @type {number}
15
15
  */
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { ExecutionResult, Lock, RedlockAbortSignal, Settings } from "redlock";
3
3
  import { EventEmitter } from "stream";
4
- export declare class MockRedisRedlockService extends EventEmitter {
4
+ export declare class MockRedlockService extends EventEmitter {
5
5
  quit(): Promise<void>;
6
6
  acquire(resources: string[], duration: number, settings?: Partial<Settings> | undefined): Promise<Lock>;
7
7
  release(lock: Lock, settings?: Partial<Settings> | undefined): Promise<ExecutionResult>;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MockRedisRedlockService = void 0;
3
+ exports.MockRedlockService = void 0;
4
4
  const stream_1 = require("stream");
5
- class MockRedisRedlockService extends stream_1.EventEmitter {
5
+ class MockRedlockService extends stream_1.EventEmitter {
6
6
  // eslint-disable-next-line @typescript-eslint/no-empty-function
7
7
  async quit() { }
8
8
  async acquire(resources, duration, settings) {
@@ -19,7 +19,7 @@ class MockRedisRedlockService extends stream_1.EventEmitter {
19
19
  return await routineFunc?.({ aborted: false });
20
20
  }
21
21
  }
22
- exports.MockRedisRedlockService = MockRedisRedlockService;
22
+ exports.MockRedlockService = MockRedlockService;
23
23
  function createLockMock() {
24
24
  let lock;
25
25
  // eslint-disable-next-line prefer-const
@@ -0,0 +1,2 @@
1
+ import { RedlockModuleOptions } from "./redlock.interface";
2
+ export declare const ConfigurableModuleClass: import("@nestjs/common").ConfigurableModuleCls<RedlockModuleOptions, "register", "create", {}>, MODULE_OPTIONS_TOKEN: string | symbol;
@@ -0,0 +1,8 @@
1
+ import { OnModuleDestroy } from "@nestjs/common";
2
+ import { RedlockModuleOptions } from "./redlock.interface";
3
+ import { ConfigurableModuleClass } from "./redlock.module-definition";
4
+ export declare class RedlockModule extends ConfigurableModuleClass implements OnModuleDestroy {
5
+ private readonly options;
6
+ constructor(options: RedlockModuleOptions);
7
+ onModuleDestroy(): Promise<void>;
8
+ }
@@ -12,11 +12,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.RedisRedlockModule = void 0;
15
+ exports.RedlockModule = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
- const redis_redlock_module_definition_1 = require("./redis-redlock.module-definition");
18
- const redis_redlock_service_1 = require("./redis-redlock.service");
19
- let RedisRedlockModule = class RedisRedlockModule extends redis_redlock_module_definition_1.ConfigurableModuleClass {
17
+ const redlock_module_definition_1 = require("./redlock.module-definition");
18
+ const redlock_service_1 = require("./redlock.service");
19
+ let RedlockModule = class RedlockModule extends redlock_module_definition_1.ConfigurableModuleClass {
20
20
  constructor(options) {
21
21
  super();
22
22
  this.options = options;
@@ -36,18 +36,18 @@ let RedisRedlockModule = class RedisRedlockModule extends redis_redlock_module_d
36
36
  }
37
37
  }
38
38
  };
39
- RedisRedlockModule = __decorate([
39
+ RedlockModule = __decorate([
40
40
  (0, common_1.Module)({
41
41
  providers: [
42
42
  {
43
- provide: redis_redlock_service_1.RedisRedlockService,
44
- inject: [redis_redlock_module_definition_1.MODULE_OPTIONS_TOKEN],
45
- useFactory: (options) => new redis_redlock_service_1.RedisRedlockService(options),
43
+ provide: redlock_service_1.RedlockService,
44
+ inject: [redlock_module_definition_1.MODULE_OPTIONS_TOKEN],
45
+ useFactory: (options) => new redlock_service_1.RedlockService(options),
46
46
  },
47
47
  ],
48
- exports: [redis_redlock_service_1.RedisRedlockService],
48
+ exports: [redlock_service_1.RedlockService],
49
49
  }),
50
- __param(0, (0, common_1.Inject)(redis_redlock_module_definition_1.MODULE_OPTIONS_TOKEN)),
50
+ __param(0, (0, common_1.Inject)(redlock_module_definition_1.MODULE_OPTIONS_TOKEN)),
51
51
  __metadata("design:paramtypes", [Object])
52
- ], RedisRedlockModule);
53
- exports.RedisRedlockModule = RedisRedlockModule;
52
+ ], RedlockModule);
53
+ exports.RedlockModule = RedlockModule;
@@ -0,0 +1,6 @@
1
+ import Redlock from "redlock";
2
+ import { RedlockModuleOptions } from "./redlock.interface";
3
+ export declare class RedlockService extends Redlock {
4
+ readonly options: RedlockModuleOptions;
5
+ constructor(options: RedlockModuleOptions);
6
+ }
@@ -12,19 +12,19 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.RedisRedlockService = void 0;
15
+ exports.RedlockService = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const redlock_1 = require("redlock");
18
- const redis_redlock_module_definition_1 = require("./redis-redlock.module-definition");
19
- let RedisRedlockService = class RedisRedlockService extends redlock_1.default {
18
+ const redlock_module_definition_1 = require("./redlock.module-definition");
19
+ let RedlockService = class RedlockService extends redlock_1.default {
20
20
  constructor(options) {
21
21
  super(options.clients, options.settings, options.scripts);
22
22
  this.options = options;
23
23
  }
24
24
  };
25
- RedisRedlockService = __decorate([
25
+ RedlockService = __decorate([
26
26
  (0, common_1.Injectable)(),
27
- __param(0, (0, common_1.Inject)(redis_redlock_module_definition_1.MODULE_OPTIONS_TOKEN)),
27
+ __param(0, (0, common_1.Inject)(redlock_module_definition_1.MODULE_OPTIONS_TOKEN)),
28
28
  __metadata("design:paramtypes", [Object])
29
- ], RedisRedlockService);
30
- exports.RedisRedlockService = RedisRedlockService;
29
+ ], RedlockService);
30
+ exports.RedlockService = RedlockService;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anchan828/nest-redlock",
3
- "version": "0.0.6",
3
+ "version": "0.0.9",
4
4
  "description": "This is a [Nest](https://github.com/nestjs/nest) implementation of the redlock algorithm for distributed redis locks.",
5
5
  "homepage": "https://github.com/anchan828/nest-redlock#readme",
6
6
  "bugs": {
@@ -41,7 +41,7 @@
41
41
  "eslint-config-prettier": "8.5.0",
42
42
  "eslint-plugin-prettier": "4.2.1",
43
43
  "husky": "8.0.1",
44
- "ioredis": "5.2.2",
44
+ "ioredis": "5.2.3",
45
45
  "jest": "28.1.3",
46
46
  "lint-staged": "13.0.3",
47
47
  "prettier": "2.7.1",
@@ -1,3 +0,0 @@
1
- import { Settings } from "redlock";
2
- import { GenerateResourceFunc } from "./redis-redlock.interface";
3
- export declare function RedisRedlock(resource: string | string[] | GenerateResourceFunc, duration?: number, settings?: Partial<Settings>): MethodDecorator;
@@ -1,2 +0,0 @@
1
- import { RedisRedlockModuleOptions } from "./redis-redlock.interface";
2
- export declare const ConfigurableModuleClass: import("@nestjs/common").ConfigurableModuleCls<RedisRedlockModuleOptions, "register", "create", {}>, MODULE_OPTIONS_TOKEN: string | symbol;
@@ -1,8 +0,0 @@
1
- import { OnModuleDestroy } from "@nestjs/common";
2
- import { RedisRedlockModuleOptions } from "./redis-redlock.interface";
3
- import { ConfigurableModuleClass } from "./redis-redlock.module-definition";
4
- export declare class RedisRedlockModule extends ConfigurableModuleClass implements OnModuleDestroy {
5
- private readonly options;
6
- constructor(options: RedisRedlockModuleOptions);
7
- onModuleDestroy(): Promise<void>;
8
- }
@@ -1,6 +0,0 @@
1
- import Redlock from "redlock";
2
- import { RedisRedlockModuleOptions } from "./redis-redlock.interface";
3
- export declare class RedisRedlockService extends Redlock {
4
- readonly options: RedisRedlockModuleOptions;
5
- constructor(options: RedisRedlockModuleOptions);
6
- }