@edirect/rate-limit-module 11.0.44 → 11.0.45
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/package.json +3 -3
- package/dist/README.md +0 -499
- package/dist/package.json +0 -41
- package/dist/src/decorators/rate-limiting-rule.decorator.d.ts +0 -10
- package/dist/src/decorators/rate-limiting-rule.decorator.d.ts.map +0 -1
- package/dist/src/decorators/rate-limiting-rule.decorator.js +0 -7
- package/dist/src/guards/rate-limiting.guard.d.ts +0 -21
- package/dist/src/guards/rate-limiting.guard.d.ts.map +0 -1
- package/dist/src/guards/rate-limiting.guard.js +0 -248
- package/dist/src/index.d.ts +0 -11
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -14
- package/dist/src/main.d.ts +0 -2
- package/dist/src/main.d.ts.map +0 -1
- package/dist/src/main.js +0 -9
- package/dist/src/object.utils.d.ts +0 -3
- package/dist/src/object.utils.d.ts.map +0 -1
- package/dist/src/object.utils.js +0 -38
- package/dist/src/rate-limiting.module.d.ts +0 -3
- package/dist/src/rate-limiting.module.d.ts.map +0 -1
- package/dist/src/rate-limiting.module.js +0 -31
- package/dist/src/rules/dto/pagination.dto.d.ts +0 -6
- package/dist/src/rules/dto/pagination.dto.d.ts.map +0 -1
- package/dist/src/rules/dto/pagination.dto.js +0 -42
- package/dist/src/rules/dto/rule.dto.d.ts +0 -24
- package/dist/src/rules/dto/rule.dto.d.ts.map +0 -1
- package/dist/src/rules/dto/rule.dto.js +0 -198
- package/dist/src/rules/interface/pagination.interface.d.ts +0 -7
- package/dist/src/rules/interface/pagination.interface.d.ts.map +0 -1
- package/dist/src/rules/interface/pagination.interface.js +0 -2
- package/dist/src/rules/interface/rule.interface.d.ts +0 -29
- package/dist/src/rules/interface/rule.interface.d.ts.map +0 -1
- package/dist/src/rules/interface/rule.interface.js +0 -2
- package/dist/src/rules/rule.controller.d.ts +0 -14
- package/dist/src/rules/rule.controller.d.ts.map +0 -1
- package/dist/src/rules/rule.controller.js +0 -87
- package/dist/src/rules/rule.module.d.ts +0 -5
- package/dist/src/rules/rule.module.d.ts.map +0 -1
- package/dist/src/rules/rule.module.js +0 -38
- package/dist/src/rules/rule.repository.d.ts +0 -15
- package/dist/src/rules/rule.repository.d.ts.map +0 -1
- package/dist/src/rules/rule.repository.js +0 -79
- package/dist/src/rules/rule.schema.d.ts +0 -176
- package/dist/src/rules/rule.schema.d.ts.map +0 -1
- package/dist/src/rules/rule.schema.js +0 -150
- package/dist/src/rules/rule.service.d.ts +0 -26
- package/dist/src/rules/rule.service.d.ts.map +0 -1
- package/dist/src/rules/rule.service.js +0 -204
- package/dist/src/shared/cache/cache.service.d.ts +0 -10
- package/dist/src/shared/cache/cache.service.d.ts.map +0 -1
- package/dist/src/shared/cache/cache.service.js +0 -29
- package/dist/src/shared/dsl/dsl.interface.d.ts +0 -43
- package/dist/src/shared/dsl/dsl.interface.d.ts.map +0 -1
- package/dist/src/shared/dsl/dsl.interface.js +0 -9
- package/dist/src/shared/dsl/dsl.service.d.ts +0 -8
- package/dist/src/shared/dsl/dsl.service.d.ts.map +0 -1
- package/dist/src/shared/dsl/dsl.service.js +0 -87
- package/dist/src/shared/redis/redis.module.d.ts +0 -3
- package/dist/src/shared/redis/redis.module.d.ts.map +0 -1
- package/dist/src/shared/redis/redis.module.js +0 -32
- package/dist/src/shared/redis/redis.service.d.ts +0 -13
- package/dist/src/shared/redis/redis.service.d.ts.map +0 -1
- package/dist/src/shared/redis/redis.service.js +0 -53
- package/dist/src/shared/rule-engine/interface/rule-engine.interface.d.ts +0 -14
- package/dist/src/shared/rule-engine/interface/rule-engine.interface.d.ts.map +0 -1
- package/dist/src/shared/rule-engine/interface/rule-engine.interface.js +0 -2
- package/dist/src/shared/rule-engine/rule-engine.module.d.ts +0 -11
- package/dist/src/shared/rule-engine/rule-engine.module.d.ts.map +0 -1
- package/dist/src/shared/rule-engine/rule-engine.module.js +0 -51
- package/dist/src/shared/rule-engine/rule-engine.service.d.ts +0 -18
- package/dist/src/shared/rule-engine/rule-engine.service.d.ts.map +0 -1
- package/dist/src/shared/rule-engine/rule-engine.service.js +0 -134
- package/dist/src/shared/shared.module.d.ts +0 -3
- package/dist/src/shared/shared.module.d.ts.map +0 -1
- package/dist/src/shared/shared.module.js +0 -29
- package/dist/src/validators/rule.constraint.d.ts +0 -10
- package/dist/src/validators/rule.constraint.d.ts.map +0 -1
- package/dist/src/validators/rule.constraint.js +0 -49
- package/dist/src/validators/rule.validator.d.ts +0 -3
- package/dist/src/validators/rule.validator.d.ts.map +0 -1
- package/dist/src/validators/rule.validator.js +0 -16
- package/dist/tsconfig.lib.tsbuildinfo +0 -1
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RuleEngineService = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const jexl_1 = require("jexl");
|
|
6
|
-
class RuleEngineService {
|
|
7
|
-
fns;
|
|
8
|
-
jexl;
|
|
9
|
-
allowedFns = [];
|
|
10
|
-
constructor(fns = []) {
|
|
11
|
-
this.fns = fns;
|
|
12
|
-
this.jexl = new jexl_1.Jexl();
|
|
13
|
-
this.injectCustomFns();
|
|
14
|
-
}
|
|
15
|
-
async evaluate(expression, context) {
|
|
16
|
-
const functionCalls = this._extractFunctionCalls(expression);
|
|
17
|
-
const values = {};
|
|
18
|
-
for (const call of functionCalls) {
|
|
19
|
-
const { name, rawArgs, fullText } = call;
|
|
20
|
-
if (this.fns && this.fns.length) {
|
|
21
|
-
const rule = this.fns.find(fn => fn.name === name);
|
|
22
|
-
if (!rule || !rule.fn)
|
|
23
|
-
throw new common_1.BadRequestException(`Not known'${name}' function`);
|
|
24
|
-
const args = rawArgs.map(arg => this._resolveValue(arg, context));
|
|
25
|
-
const result = (await rule.fn(...args)) || 0;
|
|
26
|
-
expression = expression.replace(fullText, JSON.stringify(result));
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return this.jexl.eval(expression, values);
|
|
30
|
-
}
|
|
31
|
-
async getResultCustomFunction(fnName, context) {
|
|
32
|
-
const fns = this._extractFunctionCalls(fnName);
|
|
33
|
-
if (!fns || !fns.length)
|
|
34
|
-
return;
|
|
35
|
-
const { name, rawArgs } = fns[0];
|
|
36
|
-
const args = rawArgs.map(arg => this._resolveValue(arg, context));
|
|
37
|
-
const func = this.fns.find(fn => fn.name === name);
|
|
38
|
-
if (!func)
|
|
39
|
-
return;
|
|
40
|
-
return func.fn(...args) || 0;
|
|
41
|
-
}
|
|
42
|
-
async validateExpressionVariables(expression, context) {
|
|
43
|
-
const variables = this._extractVariables(expression);
|
|
44
|
-
const missingVariables = this._validateVariablesInContext(variables, context);
|
|
45
|
-
return missingVariables;
|
|
46
|
-
}
|
|
47
|
-
validateFunctionsAreValid(expression) {
|
|
48
|
-
if (!expression)
|
|
49
|
-
return [];
|
|
50
|
-
if (!this.allowedFns || !this.allowedFns?.length)
|
|
51
|
-
return [];
|
|
52
|
-
const usedFunctions = [
|
|
53
|
-
...expression.matchAll(/([a-zA-Z_][a-zA-Z0-9_]*)\s*\(/g),
|
|
54
|
-
].map(match => match[1]);
|
|
55
|
-
const invalidFunctions = usedFunctions.filter(fn => !this.allowedFns.includes(fn));
|
|
56
|
-
return invalidFunctions;
|
|
57
|
-
}
|
|
58
|
-
getAllowedFunctions() {
|
|
59
|
-
return this.allowedFns;
|
|
60
|
-
}
|
|
61
|
-
injectCustomFns() {
|
|
62
|
-
for (const { name, fn } of this.fns) {
|
|
63
|
-
this.jexl.addFunction(name, fn);
|
|
64
|
-
this.allowedFns.push(name);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
_extractVariables(expression) {
|
|
68
|
-
const regex = /[a-zA-Z_$][a-zA-Z0-9_$]*(?:\.[a-zA-Z_$][a-zA-Z0-9_$]*|\[\d+\](?:\.[a-zA-Z_$][a-zA-Z0-9_$]*)*)+|\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g;
|
|
69
|
-
const functionRegex = /\b[a-zA-Z_$][a-zA-Z0-9_$]*\s*\(/g;
|
|
70
|
-
const functionNames = [];
|
|
71
|
-
let match;
|
|
72
|
-
while ((match = functionRegex.exec(expression)) !== null) {
|
|
73
|
-
functionNames.push(match[0].replace('(', '').trim());
|
|
74
|
-
}
|
|
75
|
-
const allMatches = expression.match(regex) || [];
|
|
76
|
-
const variables = allMatches.filter(variable => {
|
|
77
|
-
if (functionNames.includes(variable))
|
|
78
|
-
return false;
|
|
79
|
-
return true;
|
|
80
|
-
});
|
|
81
|
-
return [...new Set(variables)];
|
|
82
|
-
}
|
|
83
|
-
_validateVariablesInContext(variables, context) {
|
|
84
|
-
const missingVariables = [];
|
|
85
|
-
const presentVariables = [];
|
|
86
|
-
for (const variable of variables) {
|
|
87
|
-
if (variable.includes('.') || variable.includes('[')) {
|
|
88
|
-
let exists = true;
|
|
89
|
-
let current = context;
|
|
90
|
-
const parts = variable.replace(/\[(\d+)\]/g, '.$1').split('.');
|
|
91
|
-
for (const part of parts) {
|
|
92
|
-
if (current && Object.prototype.hasOwnProperty.call(current, part)) {
|
|
93
|
-
current = current[part];
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
exists = false;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (exists) {
|
|
101
|
-
presentVariables.push(variable);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
missingVariables.push(variable);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
else if (Object.prototype.hasOwnProperty.call(context, variable)) {
|
|
108
|
-
presentVariables.push(variable);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
missingVariables.push(variable);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return missingVariables;
|
|
115
|
-
}
|
|
116
|
-
_extractFunctionCalls(expression) {
|
|
117
|
-
const regex = /([a-zA-Z0-9_]+)\(([^)]*)\)/g;
|
|
118
|
-
const calls = [];
|
|
119
|
-
let match;
|
|
120
|
-
while ((match = regex.exec(expression)) !== null) {
|
|
121
|
-
const name = match[1];
|
|
122
|
-
const raw = match[2].split(',').map(s => s.trim());
|
|
123
|
-
calls.push({ name, rawArgs: raw, fullText: match[0] });
|
|
124
|
-
}
|
|
125
|
-
return calls;
|
|
126
|
-
}
|
|
127
|
-
_resolveValue(path, context) {
|
|
128
|
-
const parts = path.match(/[^.[\]]+/g);
|
|
129
|
-
return parts?.reduce((obj, key) => obj && typeof obj === 'object'
|
|
130
|
-
? obj[key]
|
|
131
|
-
: undefined, context);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
exports.RuleEngineService = RuleEngineService;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared.module.d.ts","sourceRoot":"","sources":["../../../src/shared/shared.module.ts"],"names":[],"mappings":"AAOA,qBAca,YAAY;CAAG"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SharedModule = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
6
|
-
const common_1 = require("@nestjs/common");
|
|
7
|
-
const cache_manager_redis_store_1 = require("cache-manager-redis-store");
|
|
8
|
-
const cache_service_1 = require("../shared/cache/cache.service");
|
|
9
|
-
const redis_module_1 = require("./redis/redis.module");
|
|
10
|
-
const rule_engine_service_1 = require("./rule-engine/rule-engine.service");
|
|
11
|
-
let SharedModule = class SharedModule {
|
|
12
|
-
};
|
|
13
|
-
exports.SharedModule = SharedModule;
|
|
14
|
-
exports.SharedModule = SharedModule = tslib_1.__decorate([
|
|
15
|
-
(0, common_1.Module)({
|
|
16
|
-
imports: [
|
|
17
|
-
cache_manager_1.CacheModule.registerAsync({
|
|
18
|
-
useFactory: async () => ({
|
|
19
|
-
store: cache_manager_redis_store_1.redisStore,
|
|
20
|
-
host: process.env.REDIS_HOST,
|
|
21
|
-
port: Number(process.env.REDIS_PORT),
|
|
22
|
-
}),
|
|
23
|
-
}),
|
|
24
|
-
redis_module_1.RedisModule,
|
|
25
|
-
],
|
|
26
|
-
providers: [cache_service_1.CacheService, rule_engine_service_1.RuleEngineService],
|
|
27
|
-
exports: [cache_service_1.CacheService, rule_engine_service_1.RuleEngineService],
|
|
28
|
-
})
|
|
29
|
-
], SharedModule);
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ValidationArguments, ValidatorConstraintInterface } from 'class-validator';
|
|
2
|
-
import { RuleService } from '../rules/rule.service';
|
|
3
|
-
export declare class IsValidExpressionConstraint implements ValidatorConstraintInterface {
|
|
4
|
-
private readonly ruleService;
|
|
5
|
-
private errorMessage;
|
|
6
|
-
constructor(ruleService: RuleService);
|
|
7
|
-
validate(value: string, _args: ValidationArguments): boolean;
|
|
8
|
-
defaultMessage(_args: ValidationArguments): string;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=rule.constraint.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rule.constraint.d.ts","sourceRoot":"","sources":["../../../src/validators/rule.constraint.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EAEnB,4BAA4B,EAC7B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,qBAEa,2BAA4B,YAAW,4BAA4B;IAElE,OAAO,CAAC,QAAQ,CAAC,WAAW;IADxC,OAAO,CAAC,YAAY,CAAwB;gBACf,WAAW,EAAE,WAAW;IAErD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO;IA6B5D,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM;CAGnD"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IsValidExpressionConstraint = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const common_1 = require("@nestjs/common");
|
|
6
|
-
const class_validator_1 = require("class-validator");
|
|
7
|
-
const jexl_1 = require("jexl");
|
|
8
|
-
const rule_service_1 = require("../rules/rule.service");
|
|
9
|
-
let IsValidExpressionConstraint = class IsValidExpressionConstraint {
|
|
10
|
-
ruleService;
|
|
11
|
-
errorMessage = 'Invalid expression';
|
|
12
|
-
constructor(ruleService) {
|
|
13
|
-
this.ruleService = ruleService;
|
|
14
|
-
}
|
|
15
|
-
validate(value, _args) {
|
|
16
|
-
try {
|
|
17
|
-
const jexl = new jexl_1.Jexl();
|
|
18
|
-
if (typeof value !== 'string') {
|
|
19
|
-
this.errorMessage = 'Expression need to be string!';
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
const invalidExpressionMessage = this.ruleService.validateRuleExpression(value);
|
|
23
|
-
if (invalidExpressionMessage && invalidExpressionMessage.length) {
|
|
24
|
-
throw new common_1.BadRequestException(invalidExpressionMessage);
|
|
25
|
-
}
|
|
26
|
-
jexl.compile(value);
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
if (err instanceof Error) {
|
|
31
|
-
this.errorMessage = `Expression malformed ${err.message}`;
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
this.errorMessage = `Expression malformed ${String(err)}`;
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
defaultMessage(_args) {
|
|
41
|
-
return this.errorMessage;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
exports.IsValidExpressionConstraint = IsValidExpressionConstraint;
|
|
45
|
-
exports.IsValidExpressionConstraint = IsValidExpressionConstraint = tslib_1.__decorate([
|
|
46
|
-
(0, class_validator_1.ValidatorConstraint)({ name: 'IsValidExpression', async: false }),
|
|
47
|
-
(0, common_1.Injectable)(),
|
|
48
|
-
tslib_1.__metadata("design:paramtypes", [rule_service_1.RuleService])
|
|
49
|
-
], IsValidExpressionConstraint);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rule.validator.d.ts","sourceRoot":"","sources":["../../../src/validators/rule.validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,wBAAgB,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,IACpD,QAAQ,MAAM,EAAE,cAAc,MAAM,UAStD"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IsValidExpression = IsValidExpression;
|
|
4
|
-
const class_validator_1 = require("class-validator");
|
|
5
|
-
const rule_constraint_1 = require("./rule.constraint");
|
|
6
|
-
function IsValidExpression(validationOptions) {
|
|
7
|
-
return function (object, propertyName) {
|
|
8
|
-
(0, class_validator_1.registerDecorator)({
|
|
9
|
-
name: 'IsValidExpression',
|
|
10
|
-
target: object.constructor,
|
|
11
|
-
propertyName: propertyName,
|
|
12
|
-
options: validationOptions,
|
|
13
|
-
validator: rule_constraint_1.IsValidExpressionConstraint,
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":"5.9.3"}
|