@mondart/nestjs-common-module-bottleneck 3.2.10 → 3.2.12
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.
|
@@ -8,6 +8,8 @@ export declare class BottleneckService implements OnModuleDestroy {
|
|
|
8
8
|
private readonly cache;
|
|
9
9
|
constructor(options: BottleneckModuleOptions);
|
|
10
10
|
private getLimiter;
|
|
11
|
+
private isMissingSettingsKeyError;
|
|
12
|
+
private scheduleWithSettingsRecovery;
|
|
11
13
|
scheduleForKey<T>(key: string, task: () => Promise<T>, opts?: Bottleneck.ConstructorOptions): Promise<T>;
|
|
12
14
|
runQueuedTask<T>(key: string, fn: () => Promise<T>): Promise<T>;
|
|
13
15
|
onModuleDestroy(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bottleneck.service.d.ts","sourceRoot":"","sources":["../../src/services/bottleneck.service.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAEL,uBAAuB,EACxB,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"bottleneck.service.d.ts","sourceRoot":"","sources":["../../src/services/bottleneck.service.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAEL,uBAAuB,EACxB,MAAM,4CAA4C,CAAC;AA8BpD,qBACa,iBAAkB,YAAW,eAAe;IASrD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAEpB;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;gBAItC,OAAO,EAAE,uBAAuB;YAwCrC,UAAU;IAsBxB,OAAO,CAAC,yBAAyB;YAOnB,4BAA4B;IA6BpC,cAAc,CAAC,CAAC,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,IAAI,CAAC,EAAE,UAAU,CAAC,kBAAkB,GACnC,OAAO,CAAC,CAAC,CAAC;IAWP,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmB/D,eAAe;CAGtB"}
|
|
@@ -21,6 +21,17 @@ const common_1 = require("@nestjs/common");
|
|
|
21
21
|
const bottleneck_1 = __importDefault(require("bottleneck"));
|
|
22
22
|
const bottleneck_options_interface_1 = require("../interfaces/bottleneck-options.interface");
|
|
23
23
|
const ioredis_1 = __importDefault(require("ioredis"));
|
|
24
|
+
class BottleneckRedis extends ioredis_1.default {
|
|
25
|
+
sendCommand(...args) {
|
|
26
|
+
return Promise.resolve(super.sendCommand(...args)).catch((error) => {
|
|
27
|
+
if (error instanceof Error &&
|
|
28
|
+
/^ERR (UNKNOWN_CLIENT|SETTINGS_KEY_NOT_FOUND)$/.test(error.message)) {
|
|
29
|
+
error.message = error.message.slice(4);
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
24
35
|
let BottleneckService = BottleneckService_1 = class BottleneckService {
|
|
25
36
|
constructor(options) {
|
|
26
37
|
this.options = options;
|
|
@@ -32,7 +43,7 @@ let BottleneckService = BottleneckService_1 = class BottleneckService {
|
|
|
32
43
|
const redisOptions = useRedis && redis
|
|
33
44
|
? {
|
|
34
45
|
datastore: 'ioredis',
|
|
35
|
-
Redis:
|
|
46
|
+
Redis: BottleneckRedis,
|
|
36
47
|
clientOptions: {
|
|
37
48
|
host: redis.host,
|
|
38
49
|
port: redis.port,
|
|
@@ -61,18 +72,39 @@ let BottleneckService = BottleneckService_1 = class BottleneckService {
|
|
|
61
72
|
}
|
|
62
73
|
return limiter;
|
|
63
74
|
}
|
|
75
|
+
isMissingSettingsKeyError(error) {
|
|
76
|
+
return (error instanceof Error &&
|
|
77
|
+
/(?:^|\s)SETTINGS_KEY_NOT_FOUND$/.test(error.message));
|
|
78
|
+
}
|
|
79
|
+
async scheduleWithSettingsRecovery(key, task, opts) {
|
|
80
|
+
let taskStarted = false;
|
|
81
|
+
const guardedTask = () => {
|
|
82
|
+
taskStarted = true;
|
|
83
|
+
return task();
|
|
84
|
+
};
|
|
85
|
+
try {
|
|
86
|
+
const limiter = await this.getLimiter(key, opts);
|
|
87
|
+
return await limiter.schedule(guardedTask);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (taskStarted || !this.isMissingSettingsKeyError(error))
|
|
91
|
+
throw error;
|
|
92
|
+
this.logger.warn(`Recreating limiter for key ${key} after its Redis settings key disappeared`);
|
|
93
|
+
await this.group.deleteKey(key);
|
|
94
|
+
const limiter = await this.getLimiter(key, opts);
|
|
95
|
+
return limiter.schedule(task);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
64
98
|
async scheduleForKey(key, task, opts) {
|
|
65
|
-
const limiter = await this.getLimiter(key, opts);
|
|
66
99
|
this.logger.debug(`Scheduling task for key ${key}`);
|
|
67
|
-
return
|
|
100
|
+
return this.scheduleWithSettingsRecovery(key, task, opts);
|
|
68
101
|
}
|
|
69
102
|
async runQueuedTask(key, fn) {
|
|
70
103
|
if (this.cache.has(key)) {
|
|
71
104
|
this.logger.debug(`Cache hit for key ${key}`);
|
|
72
105
|
return this.cache.get(key);
|
|
73
106
|
}
|
|
74
|
-
const
|
|
75
|
-
const taskPromise = limiter.schedule(fn);
|
|
107
|
+
const taskPromise = this.scheduleWithSettingsRecovery(key, fn);
|
|
76
108
|
this.cache.set(key, taskPromise);
|
|
77
109
|
const clearCachedTask = () => {
|
|
78
110
|
if (this.cache.get(key) === taskPromise)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bottleneck.service.js","sourceRoot":"","sources":["../../src/services/bottleneck.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AACA,2CAA6E;AAC7E,4DAAoC;AACpC,6FAGoD;AACpD,sDAA4B;
|
|
1
|
+
{"version":3,"file":"bottleneck.service.js","sourceRoot":"","sources":["../../src/services/bottleneck.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AACA,2CAA6E;AAC7E,4DAAoC;AACpC,6FAGoD;AACpD,sDAA4B;AAG5B,MAAM,eAAgB,SAAQ,iBAAK;IACjC,WAAW,CACT,GAAG,IAAsC;QAEzC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CACtD,CAAC,KAAc,EAAE,EAAE;YACjB,IACE,KAAK,YAAY,KAAK;gBACtB,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EACnE,CAAC;gBACD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAWM,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAO5B,YAEE,OAAiD;QAAhC,YAAO,GAAP,OAAO,CAAyB;QARlC,WAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,EAAE;YAC3D,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEc,UAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;QAMvD,MAAM,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,cAAc,GAAG,KAAK,EACtB,GAAG,IAAI,EACR,GAAG,IAAI,CAAC,OAAO,CAAC;QAEjB,MAAM,YAAY,GAChB,QAAQ,IAAI,KAAK;YACf,CAAC,CAAC;gBACE,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,eAAe;gBACtB,aAAa,EAAE;oBACb,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,EAAE,EAAE,KAAK,CAAC,QAAQ;oBAClB,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;iBAChC;gBACD,OAAO,EAAE,KAAK,CAAC,GAAG;aACnB;YACH,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,KAAK,GAAG,IAAI,oBAAU,CAAC,KAAK,CAAC;YAChC,EAAE,EAAE,cAAc,OAAO,IAAI,KAAK,EAAE;YACpC,aAAa,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;YACV,cAAc;YACd,GAAG,YAAY;YACf,GAAG,IAAI;SACR,CAAC,CAAC;IACL,CAAC;IAKO,KAAK,CAAC,UAAU,CACtB,GAAW,EACX,IAAoC;QAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YAIT,MAAM,YAAY,GAAY,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,YAAY,CAAC;QACrB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IASO,yBAAyB,CAAC,KAAc;QAC9C,OAAO,CACL,KAAK,YAAY,KAAK;YACtB,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACtD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,4BAA4B,CACxC,GAAW,EACX,IAAsB,EACtB,IAAoC;QAEpC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAEvE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,8BAA8B,GAAG,2CAA2C,CAC7E,CAAC;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,cAAc,CAClB,GAAW,EACX,IAAsB,EACtB,IAAoC;QAEpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,4BAA4B,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAQD,KAAK,CAAC,aAAa,CAAI,GAAW,EAAE,EAAoB;QACtD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC9B,CAAC;QAID,MAAM,WAAW,GAAG,IAAI,CAAC,4BAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACjC,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,WAAW;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC;QACF,KAAK,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9D,OAAO,WAAW,CAAC;IACrB,CAAC;IAGD,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;CACF,CAAA;AAhJY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,wDAAyB,CAAC,CAAA;;GARzB,iBAAiB,CAgJ7B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondart/nestjs-common-module-bottleneck",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.12",
|
|
4
4
|
"description": "Bottleneck throttling and queue utilities for NestJS.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Mondart"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"build": "tsc -p tsconfig.json"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@mondart/nestjs-common-module-core": "3.2.
|
|
20
|
+
"@mondart/nestjs-common-module-core": "3.2.10",
|
|
21
21
|
"@nestjs/cqrs": "^11.0.1",
|
|
22
22
|
"bottleneck": "^2.19.5",
|
|
23
23
|
"ioredis": "^5.11.1"
|