@anchan828/nest-redlock 0.0.1 → 0.0.4
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 +11 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9 -0
- package/dist/redis-redlock.constants.d.ts +1 -0
- package/dist/redis-redlock.constants.js +4 -0
- package/dist/redis-redlock.decorator.d.ts +3 -0
- package/dist/redis-redlock.decorator.js +40 -0
- package/dist/redis-redlock.interface.d.ts +18 -0
- package/dist/redis-redlock.interface.js +2 -0
- package/dist/redis-redlock.module-definition.d.ts +2 -0
- package/dist/redis-redlock.module-definition.js +6 -0
- package/dist/redis-redlock.module.d.ts +8 -0
- package/dist/redis-redlock.module.js +44 -0
- package/dist/redis-redlock.service.d.ts +6 -0
- package/dist/redis-redlock.service.js +30 -0
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|

|
|
4
4
|

|
|
5
5
|
|
|
6
|
-
This is a [Nest](https://github.com/nestjs/nest) implementation of the redlock algorithm for distributed redis.
|
|
6
|
+
This is a [Nest](https://github.com/nestjs/nest) implementation of the redlock algorithm for distributed redis locks.
|
|
7
7
|
|
|
8
8
|
This package uses [node-redlock](https://github.com/mike-marcacci/node-redlock).
|
|
9
9
|
|
|
@@ -24,7 +24,17 @@ import Redis from "ioredis";
|
|
|
24
24
|
@Module({
|
|
25
25
|
imports: [
|
|
26
26
|
RedisRedlockModule.register({
|
|
27
|
+
// See https://github.com/mike-marcacci/node-redlock#configuration
|
|
27
28
|
clients: [new Redis({ host: "localhost" })],
|
|
29
|
+
settings: {
|
|
30
|
+
driftFactor: 0.01,
|
|
31
|
+
retryCount: 10,
|
|
32
|
+
retryDelay: 200,
|
|
33
|
+
retryJitter: 200,
|
|
34
|
+
automaticExtensionThreshold: 500,
|
|
35
|
+
},
|
|
36
|
+
// Default duratiuon to use with RedisRedlock decorator
|
|
37
|
+
duration: 1000,
|
|
28
38
|
}),
|
|
29
39
|
],
|
|
30
40
|
})
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RedisRedlock } from "./redis-redlock.decorator";
|
|
2
|
+
export { GenerateResourceFunc, RedisRedlockModuleOptions } from "./redis-redlock.interface";
|
|
3
|
+
export { RedisRedlockModule } from "./redis-redlock.module";
|
|
4
|
+
export { RedisRedlockService } from "./redis-redlock.service";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisRedlockService = exports.RedisRedlockModule = 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_module_1 = require("./redis-redlock.module");
|
|
7
|
+
Object.defineProperty(exports, "RedisRedlockModule", { enumerable: true, get: function () { return redis_redlock_module_1.RedisRedlockModule; } });
|
|
8
|
+
var redis_redlock_service_1 = require("./redis-redlock.service");
|
|
9
|
+
Object.defineProperty(exports, "RedisRedlockService", { enumerable: true, get: function () { return redis_redlock_service_1.RedisRedlockService; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DEFAULT_DURATION = 5000;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisRedlock = void 0;
|
|
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);
|
|
8
|
+
return (target, propertyKey, descriptor) => {
|
|
9
|
+
const serviceSymbol = "@redisRedlockService";
|
|
10
|
+
injectRedisRedlockService(target, serviceSymbol);
|
|
11
|
+
const originalMethod = descriptor.value;
|
|
12
|
+
descriptor.value = async function (...args) {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
14
|
+
const descriptorThis = this;
|
|
15
|
+
const redisRedlockService = descriptorThis[serviceSymbol];
|
|
16
|
+
const resources = getResources(resource, descriptorThis, args);
|
|
17
|
+
return await redisRedlockService.using(resources, duration || redisRedlockService.options.duration || 5000, settings, async (signal) => {
|
|
18
|
+
const result = await originalMethod.apply(descriptorThis, args);
|
|
19
|
+
if (signal.aborted) {
|
|
20
|
+
throw signal.error;
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
return descriptor;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
exports.RedisRedlock = RedisRedlock;
|
|
29
|
+
function getResources(resource, descriptorThis, args) {
|
|
30
|
+
if (typeof resource === "string") {
|
|
31
|
+
return [resource];
|
|
32
|
+
}
|
|
33
|
+
else if (Array.isArray(resource)) {
|
|
34
|
+
return resource;
|
|
35
|
+
}
|
|
36
|
+
else if (typeof resource === "function") {
|
|
37
|
+
return [resource(descriptorThis, ...args)].flat();
|
|
38
|
+
}
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Redis, { Cluster } from "ioredis";
|
|
2
|
+
import { Settings } from "redlock";
|
|
3
|
+
export declare type RedisRedlockModuleOptions = {
|
|
4
|
+
clients: Iterable<Redis | Cluster>;
|
|
5
|
+
settings?: Partial<Settings>;
|
|
6
|
+
scripts?: {
|
|
7
|
+
readonly acquireScript?: string | ((script: string) => string);
|
|
8
|
+
readonly extendScript?: string | ((script: string) => string);
|
|
9
|
+
readonly releaseScript?: string | ((script: string) => string);
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Default duratiuon to use with RedisRedlock decorator
|
|
13
|
+
*
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
duration?: number;
|
|
17
|
+
};
|
|
18
|
+
export declare type GenerateResourceFunc = (target: any, ...args: any[]) => string | string[];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.MODULE_OPTIONS_TOKEN = exports.ConfigurableModuleClass = void 0;
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
_a = new common_1.ConfigurableModuleBuilder().build(), exports.ConfigurableModuleClass = _a.ConfigurableModuleClass, exports.MODULE_OPTIONS_TOKEN = _a.MODULE_OPTIONS_TOKEN;
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.RedisRedlockModule = void 0;
|
|
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 {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
super();
|
|
22
|
+
this.options = options;
|
|
23
|
+
}
|
|
24
|
+
async onModuleDestroy() {
|
|
25
|
+
for (const client of this.options.clients) {
|
|
26
|
+
await client.quit();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
RedisRedlockModule = __decorate([
|
|
31
|
+
(0, common_1.Module)({
|
|
32
|
+
providers: [
|
|
33
|
+
{
|
|
34
|
+
provide: redis_redlock_service_1.RedisRedlockService,
|
|
35
|
+
inject: [redis_redlock_module_definition_1.MODULE_OPTIONS_TOKEN],
|
|
36
|
+
useFactory: (options) => new redis_redlock_service_1.RedisRedlockService(options),
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
exports: [redis_redlock_service_1.RedisRedlockService],
|
|
40
|
+
}),
|
|
41
|
+
__param(0, (0, common_1.Inject)(redis_redlock_module_definition_1.MODULE_OPTIONS_TOKEN)),
|
|
42
|
+
__metadata("design:paramtypes", [Object])
|
|
43
|
+
], RedisRedlockModule);
|
|
44
|
+
exports.RedisRedlockModule = RedisRedlockModule;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.RedisRedlockService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
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 {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
super(options.clients, options.settings, options.scripts);
|
|
22
|
+
this.options = options;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
RedisRedlockService = __decorate([
|
|
26
|
+
(0, common_1.Injectable)(),
|
|
27
|
+
__param(0, (0, common_1.Inject)(redis_redlock_module_definition_1.MODULE_OPTIONS_TOKEN)),
|
|
28
|
+
__metadata("design:paramtypes", [Object])
|
|
29
|
+
], RedisRedlockService);
|
|
30
|
+
exports.RedisRedlockService = RedisRedlockService;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anchan828/nest-redlock",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
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": {
|
|
@@ -17,11 +17,14 @@
|
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc -p tsconfig.build.json",
|
|
19
19
|
"format": "prettier --write '**/*.{js,json,yml,yaml,md}'",
|
|
20
|
-
"
|
|
20
|
+
"prepare": "husky install",
|
|
21
21
|
"lint": "TIMING=1 eslint --ignore-path .eslintignore '**/*.ts'",
|
|
22
22
|
"lint:fix": "npm run lint -- --fix",
|
|
23
23
|
"test": "jest --coverage --runInBand"
|
|
24
24
|
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"redlock": "^5.0.0-beta.2"
|
|
27
|
+
},
|
|
25
28
|
"devDependencies": {
|
|
26
29
|
"@commitlint/cli": "17.0.3",
|
|
27
30
|
"@commitlint/config-conventional": "17.0.3",
|
|
@@ -42,7 +45,6 @@
|
|
|
42
45
|
"jest": "28.1.3",
|
|
43
46
|
"lint-staged": "13.0.3",
|
|
44
47
|
"prettier": "2.7.1",
|
|
45
|
-
"redlock": "5.0.0-beta.2",
|
|
46
48
|
"reflect-metadata": "0.1.13",
|
|
47
49
|
"rxjs": "7.5.6",
|
|
48
50
|
"supertest": "6.2.4",
|