@futdevpro/nts-dynamo 1.15.46 → 1.15.47
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/.dynamo/logs/cicd-pipeline/output.log +1943 -1929
- package/.dynamo/logs/cicd-pipeline/status.json +208 -206
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts +8 -0
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts.map +1 -1
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts +15 -0
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts.map +1 -1
- package/build/_modules/rate-limit/rate-limit.middleware.js +32 -4
- package/build/_modules/rate-limit/rate-limit.middleware.js.map +1 -1
- package/package.json +2 -2
- package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +9 -0
- package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +53 -0
- package/src/_modules/rate-limit/rate-limit.middleware.ts +42 -9
|
@@ -50,5 +50,13 @@ export interface DyNTS_RateLimit_Config {
|
|
|
50
50
|
* felulhatja ezeket.
|
|
51
51
|
*/
|
|
52
52
|
initialKeyPolicies?: Record<string, DyNTS_RateLimit_Policy>;
|
|
53
|
+
/**
|
|
54
|
+
* Per-endpoint(-csoport) policy override-ok az induloskor. A `setPolicyForEndpoint()`
|
|
55
|
+
* runtime-ban is felulhatja ezeket. A kulcs annak felel meg, amit az `endpointGrouper`
|
|
56
|
+
* visszaad (default: `req.path`). Akkor hasznos, ha kulonbozo endpointoknak kulonbozo
|
|
57
|
+
* limit kell (pl. egy webhook nagy burst-toleranciat igenyel a legit forgalomhoz, mig
|
|
58
|
+
* egy admin-endpoint szuk limitet). Precedencia: per-kulcs policy > per-endpoint policy > default.
|
|
59
|
+
*/
|
|
60
|
+
initialEndpointPolicies?: Record<string, DyNTS_RateLimit_Policy>;
|
|
53
61
|
}
|
|
54
62
|
//# sourceMappingURL=rate-limit-config.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit-config.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-config.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAExC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAE3C;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit-config.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-config.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAExC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAE3C;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAE5D;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CAClE"}
|
|
@@ -52,6 +52,8 @@ export declare class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBa
|
|
|
52
52
|
private requestLog;
|
|
53
53
|
/** Per-kulcs egyedi policy-k. */
|
|
54
54
|
private keyPolicies;
|
|
55
|
+
/** Per-endpoint(-csoport) egyedi policy-k (a `endpointGrouper` outputjara kulcsolva). */
|
|
56
|
+
private endpointPolicies;
|
|
55
57
|
/** GC timer handle. */
|
|
56
58
|
private gcTimer;
|
|
57
59
|
/**
|
|
@@ -67,6 +69,7 @@ export declare class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBa
|
|
|
67
69
|
defaultWindowMs: number;
|
|
68
70
|
responseHeaders: boolean;
|
|
69
71
|
activeKeyPolicies: number;
|
|
72
|
+
activeEndpointPolicies: number;
|
|
70
73
|
trackedStorageKeys: number;
|
|
71
74
|
};
|
|
72
75
|
/**
|
|
@@ -79,6 +82,18 @@ export declare class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBa
|
|
|
79
82
|
* Per-kulcs policy torlese (visszaall a default-ra).
|
|
80
83
|
*/
|
|
81
84
|
clearPolicyForKey(key: string): void;
|
|
85
|
+
/**
|
|
86
|
+
* Per-endpoint(-csoport) egyedi policy beallitas. Az `endpoint`-nek pontosan
|
|
87
|
+
* azzal a stringgel kell egyeznie, amit az `endpointGrouper` visszaad (default: `req.path`).
|
|
88
|
+
* Akkor hasznos, ha egy endpointnak a globalis default-tol eltero limit kell — pl. egy
|
|
89
|
+
* webhook nagy burst-toleranciat igenyel (a legit, distributed forgalom ne bukjon), mig
|
|
90
|
+
* egy admin-endpoint szuk limitet. Precedencia: per-kulcs policy > per-endpoint policy > default.
|
|
91
|
+
*/
|
|
92
|
+
setPolicyForEndpoint(endpoint: string, policy: DyNTS_RateLimit_Policy): void;
|
|
93
|
+
/**
|
|
94
|
+
* Per-endpoint policy torlese (visszaall a default-ra).
|
|
95
|
+
*/
|
|
96
|
+
clearPolicyForEndpoint(endpoint: string): void;
|
|
82
97
|
/**
|
|
83
98
|
* Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be.
|
|
84
99
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.middleware.d.ts","sourceRoot":"","sources":["../../../src/_modules/rate-limit/rate-limit.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAGzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AA2B/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,0BAA2B,SAAQ,0BAA0B;IAExE,MAAM,CAAC,WAAW,IAAI,0BAA0B;IAIhD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,eAAe,CAAqC;IAE5D,OAAO,CAAC,YAAY,CACsC;IAC1D,OAAO,CAAC,eAAe,CACc;IAErC,gEAAgE;IAChE,OAAO,CAAC,UAAU,CAAoC;IAEtD,iCAAiC;IACjC,OAAO,CAAC,WAAW,CAAkD;IAErE,uBAAuB;IACvB,OAAO,CAAC,OAAO,CAA+B;IAG9C;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"rate-limit.middleware.d.ts","sourceRoot":"","sources":["../../../src/_modules/rate-limit/rate-limit.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAGzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AA2B/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,0BAA2B,SAAQ,0BAA0B;IAExE,MAAM,CAAC,WAAW,IAAI,0BAA0B;IAIhD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,eAAe,CAAqC;IAE5D,OAAO,CAAC,YAAY,CACsC;IAC1D,OAAO,CAAC,eAAe,CACc;IAErC,gEAAgE;IAChE,OAAO,CAAC,UAAU,CAAoC;IAEtD,iCAAiC;IACjC,OAAO,CAAC,WAAW,CAAkD;IAErE,yFAAyF;IACzF,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,uBAAuB;IACvB,OAAO,CAAC,OAAO,CAA+B;IAG9C;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IA6B/C;;OAEG;IACH,SAAS,IAAI;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,OAAO,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,kBAAkB,EAAE,MAAM,CAAC;KAC5B;IAWD;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAIlE;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;;;OAMG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAI5E;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK9C;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,QAAe,OAAO,OAAO,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CAuDjE;IAGF;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAapB;;;OAGG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;;OAGG;IACH,gBAAgB,IAAI,IAAI;CAWzB"}
|
|
@@ -73,6 +73,8 @@ class DyNTS_RateLimit_Middleware extends singleton_service_base_1.DyNTS_Singleto
|
|
|
73
73
|
requestLog = new Map();
|
|
74
74
|
/** Per-kulcs egyedi policy-k. */
|
|
75
75
|
keyPolicies = new Map();
|
|
76
|
+
/** Per-endpoint(-csoport) egyedi policy-k (a `endpointGrouper` outputjara kulcsolva). */
|
|
77
|
+
endpointPolicies = new Map();
|
|
76
78
|
/** GC timer handle. */
|
|
77
79
|
gcTimer = null;
|
|
78
80
|
/**
|
|
@@ -100,6 +102,11 @@ class DyNTS_RateLimit_Middleware extends singleton_service_base_1.DyNTS_Singleto
|
|
|
100
102
|
this.keyPolicies.set(key, policy);
|
|
101
103
|
}
|
|
102
104
|
}
|
|
105
|
+
if (config.initialEndpointPolicies !== undefined) {
|
|
106
|
+
for (const [endpoint, policy] of Object.entries(config.initialEndpointPolicies)) {
|
|
107
|
+
this.endpointPolicies.set(endpoint, policy);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
103
110
|
this.startGcTimer();
|
|
104
111
|
}
|
|
105
112
|
/**
|
|
@@ -111,6 +118,7 @@ class DyNTS_RateLimit_Middleware extends singleton_service_base_1.DyNTS_Singleto
|
|
|
111
118
|
defaultWindowMs: this.defaultWindowMs,
|
|
112
119
|
responseHeaders: this.responseHeaders,
|
|
113
120
|
activeKeyPolicies: this.keyPolicies.size,
|
|
121
|
+
activeEndpointPolicies: this.endpointPolicies.size,
|
|
114
122
|
trackedStorageKeys: this.requestLog.size,
|
|
115
123
|
};
|
|
116
124
|
}
|
|
@@ -128,6 +136,22 @@ class DyNTS_RateLimit_Middleware extends singleton_service_base_1.DyNTS_Singleto
|
|
|
128
136
|
clearPolicyForKey(key) {
|
|
129
137
|
this.keyPolicies.delete(key);
|
|
130
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Per-endpoint(-csoport) egyedi policy beallitas. Az `endpoint`-nek pontosan
|
|
141
|
+
* azzal a stringgel kell egyeznie, amit az `endpointGrouper` visszaad (default: `req.path`).
|
|
142
|
+
* Akkor hasznos, ha egy endpointnak a globalis default-tol eltero limit kell — pl. egy
|
|
143
|
+
* webhook nagy burst-toleranciat igenyel (a legit, distributed forgalom ne bukjon), mig
|
|
144
|
+
* egy admin-endpoint szuk limitet. Precedencia: per-kulcs policy > per-endpoint policy > default.
|
|
145
|
+
*/
|
|
146
|
+
setPolicyForEndpoint(endpoint, policy) {
|
|
147
|
+
this.endpointPolicies.set(endpoint, policy);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Per-endpoint policy torlese (visszaall a default-ra).
|
|
151
|
+
*/
|
|
152
|
+
clearPolicyForEndpoint(endpoint) {
|
|
153
|
+
this.endpointPolicies.delete(endpoint);
|
|
154
|
+
}
|
|
131
155
|
/**
|
|
132
156
|
* Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be.
|
|
133
157
|
*
|
|
@@ -142,10 +166,13 @@ class DyNTS_RateLimit_Middleware extends singleton_service_base_1.DyNTS_Singleto
|
|
|
142
166
|
const subject = this.keyExtractor(req);
|
|
143
167
|
const endpoint = this.endpointGrouper(req);
|
|
144
168
|
const storageKey = `${subject}|${endpoint}`;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
169
|
+
// precedencia: per-kulcs policy (legspecifikusabb, pl. subscriber-tier) > per-endpoint policy > default
|
|
170
|
+
const policy = this.keyPolicies.get(subject) ??
|
|
171
|
+
this.endpointPolicies.get(endpoint) ??
|
|
172
|
+
{
|
|
173
|
+
limit: this.defaultLimit,
|
|
174
|
+
windowMs: this.defaultWindowMs,
|
|
175
|
+
};
|
|
149
176
|
const now = Date.now();
|
|
150
177
|
const windowStart = now - policy.windowMs;
|
|
151
178
|
// sliding-window: tartomanyon kivuli timestamp-eket eldobjuk
|
|
@@ -255,6 +282,7 @@ class DyNTS_RateLimit_Middleware extends singleton_service_base_1.DyNTS_Singleto
|
|
|
255
282
|
this.endpointGrouper = (req) => req.path;
|
|
256
283
|
this.requestLog.clear();
|
|
257
284
|
this.keyPolicies.clear();
|
|
285
|
+
this.endpointPolicies.clear();
|
|
258
286
|
this.stopGcTimer();
|
|
259
287
|
}
|
|
260
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.middleware.js","sourceRoot":"","sources":["../../../src/_modules/rate-limit/rate-limit.middleware.ts"],"names":[],"mappings":";;;AAEA,sDAAmD;AAEnD,wFAAyF;AACzF,oFAAiF;AAMjF,gDAAgD;AAChD,MAAM,aAAa,GAAW,GAAG,CAAC;AAElC,qDAAqD;AACrD,MAAM,iBAAiB,GAAW,KAAK,CAAC;AAExC,uCAAuC;AACvC,MAAM,wBAAwB,GAAY,IAAI,CAAC;AAE/C;;GAEG;AACH,MAAM,cAAc,GAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,kCAAkC;AAClC,MAAM,YAAY,GAAW,4BAA4B,CAAC;AAE1D,wDAAwD;AACxD,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE;IACjD,MAAM,GAAG,GAAW,6CAAqB,CAAC,mBAAmB,IAAI,OAAO,CAAC;IACzE,OAAO,GAAG,GAAG,aAAa,OAAO,EAAE,CAAC;AACtC,CAAC,CAAC;AAGF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAa,0BAA2B,SAAQ,mDAA0B;IAExE,MAAM,CAAC,WAAW;QAChB,OAAO,0BAA0B,CAAC,oBAAoB,EAAgC,CAAC;IACzF,CAAC;IAEO,YAAY,GAAW,aAAa,CAAC;IACrC,eAAe,GAAW,iBAAiB,CAAC;IAC5C,eAAe,GAAY,wBAAwB,CAAC;IAEpD,YAAY,GAClB,CAAC,GAAY,EAAU,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClD,eAAe,GACrB,CAAC,GAAY,EAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;IAErC,gEAAgE;IACxD,UAAU,GAA0B,IAAI,GAAG,EAAE,CAAC;IAEtD,iCAAiC;IACzB,WAAW,GAAwC,IAAI,GAAG,EAAE,CAAC;IAErE,uBAAuB;IACf,OAAO,GAA0B,IAAI,CAAC;IAG9C;;;OAGG;IACH,SAAS,CAAC,MAA8B;QACtC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAE,GAAG,EAAE,MAAM,CAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACxE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,SAAS;
|
|
1
|
+
{"version":3,"file":"rate-limit.middleware.js","sourceRoot":"","sources":["../../../src/_modules/rate-limit/rate-limit.middleware.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/nts-dynamo",
|
|
3
|
-
"version": "01.15.
|
|
3
|
+
"version": "01.15.47",
|
|
4
4
|
"description": "Dynamic NodeTS (NodeJS-Typescript), MongoDB Backend System Framework by Future Development Program Ltd.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "server-package",
|
|
@@ -317,7 +317,7 @@
|
|
|
317
317
|
"empty": ""
|
|
318
318
|
},
|
|
319
319
|
"peerDependencies": {
|
|
320
|
-
"@futdevpro/fsm-dynamo": "1.15.
|
|
320
|
+
"@futdevpro/fsm-dynamo": "1.15.23",
|
|
321
321
|
"@types/express": "4.17.21",
|
|
322
322
|
"@types/geoip-lite": "~1.4.1",
|
|
323
323
|
"@types/node": "~24.1.0",
|
|
@@ -57,4 +57,13 @@ export interface DyNTS_RateLimit_Config {
|
|
|
57
57
|
* felulhatja ezeket.
|
|
58
58
|
*/
|
|
59
59
|
initialKeyPolicies?: Record<string, DyNTS_RateLimit_Policy>;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Per-endpoint(-csoport) policy override-ok az induloskor. A `setPolicyForEndpoint()`
|
|
63
|
+
* runtime-ban is felulhatja ezeket. A kulcs annak felel meg, amit az `endpointGrouper`
|
|
64
|
+
* visszaad (default: `req.path`). Akkor hasznos, ha kulonbozo endpointoknak kulonbozo
|
|
65
|
+
* limit kell (pl. egy webhook nagy burst-toleranciat igenyel a legit forgalomhoz, mig
|
|
66
|
+
* egy admin-endpoint szuk limitet). Precedencia: per-kulcs policy > per-endpoint policy > default.
|
|
67
|
+
*/
|
|
68
|
+
initialEndpointPolicies?: Record<string, DyNTS_RateLimit_Policy>;
|
|
60
69
|
}
|
|
@@ -163,6 +163,59 @@ describe('| DyNTS_RateLimit_Middleware', (): void => {
|
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
|
|
166
|
+
describe('| setPolicyForEndpoint() — per-endpoint limit', (): void => {
|
|
167
|
+
it('| egyedi limit az endpointra felulhatja a default-ot, mas endpoint nem erintett', async (): Promise<void> => {
|
|
168
|
+
svc.configure({ defaultLimit: 2, defaultWindowMs: 10000 });
|
|
169
|
+
svc.setPolicyForEndpoint('/webhook', { limit: 5, windowMs: 10000 });
|
|
170
|
+
|
|
171
|
+
// /webhook 5-ot kap a default 2 helyett
|
|
172
|
+
for (let i: number = 0; i < 5; i++) {
|
|
173
|
+
await svc.check(mockReq({ path: '/webhook' }), mockRes());
|
|
174
|
+
}
|
|
175
|
+
let webhookThrown: any = null;
|
|
176
|
+
try { await svc.check(mockReq({ path: '/webhook' }), mockRes()); } catch (e) { webhookThrown = e; }
|
|
177
|
+
expect(webhookThrown).not.toBeNull();
|
|
178
|
+
expect(DyFM_Error.getErrorStatus(webhookThrown)).toBe(429);
|
|
179
|
+
|
|
180
|
+
// egy masik endpoint tovabbra is a default 2-t kapja (a per-endpoint policy izolalt)
|
|
181
|
+
await svc.check(mockReq({ path: '/admin/refund' }), mockRes());
|
|
182
|
+
await svc.check(mockReq({ path: '/admin/refund' }), mockRes());
|
|
183
|
+
let refundThrown: any = null;
|
|
184
|
+
try { await svc.check(mockReq({ path: '/admin/refund' }), mockRes()); } catch (e) { refundThrown = e; }
|
|
185
|
+
expect(refundThrown).not.toBeNull();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('| clearPolicyForEndpoint visszaallit a default-ra', async (): Promise<void> => {
|
|
189
|
+
svc.configure({ defaultLimit: 1, defaultWindowMs: 10000 });
|
|
190
|
+
svc.setPolicyForEndpoint('/webhook', { limit: 5, windowMs: 10000 });
|
|
191
|
+
svc.clearPolicyForEndpoint('/webhook');
|
|
192
|
+
|
|
193
|
+
await svc.check(mockReq({ path: '/webhook' }), mockRes());
|
|
194
|
+
let thrown: any = null;
|
|
195
|
+
try { await svc.check(mockReq({ path: '/webhook' }), mockRes()); } catch (e) { thrown = e; }
|
|
196
|
+
expect(thrown).not.toBeNull();
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('| precedencia: per-kulcs policy felulirja a per-endpoint policy-t', async (): Promise<void> => {
|
|
200
|
+
svc.configure({
|
|
201
|
+
defaultLimit: 2,
|
|
202
|
+
defaultWindowMs: 10000,
|
|
203
|
+
keyExtractor: (req: Request): string => (req.headers['x-api-key'] as string) ?? req.ip ?? 'anon',
|
|
204
|
+
});
|
|
205
|
+
svc.setPolicyForEndpoint('/webhook', { limit: 5, windowMs: 10000 });
|
|
206
|
+
svc.setPolicyForKey('throttled-key', { limit: 1, windowMs: 10000 });
|
|
207
|
+
|
|
208
|
+
// a kulcs-policy (1) gyoz az endpoint-policy (5) felett
|
|
209
|
+
await svc.check(mockReq({ path: '/webhook', headers: { 'x-api-key': 'throttled-key' } }), mockRes());
|
|
210
|
+
let thrown: any = null;
|
|
211
|
+
try {
|
|
212
|
+
await svc.check(mockReq({ path: '/webhook', headers: { 'x-api-key': 'throttled-key' } }), mockRes());
|
|
213
|
+
} catch (e) { thrown = e; }
|
|
214
|
+
expect(thrown).not.toBeNull();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
|
|
166
219
|
describe('| keyExtractor override', (): void => {
|
|
167
220
|
it('| custom keyExtractor felulhatja a default IP-alapu-t', async (): Promise<void> => {
|
|
168
221
|
svc.configure({
|
|
@@ -93,6 +93,9 @@ export class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
|
93
93
|
/** Per-kulcs egyedi policy-k. */
|
|
94
94
|
private keyPolicies: Map<string, DyNTS_RateLimit_Policy> = new Map();
|
|
95
95
|
|
|
96
|
+
/** Per-endpoint(-csoport) egyedi policy-k (a `endpointGrouper` outputjara kulcsolva). */
|
|
97
|
+
private endpointPolicies: Map<string, DyNTS_RateLimit_Policy> = new Map();
|
|
98
|
+
|
|
96
99
|
/** GC timer handle. */
|
|
97
100
|
private gcTimer: NodeJS.Timeout | null = null;
|
|
98
101
|
|
|
@@ -122,6 +125,11 @@ export class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
|
122
125
|
this.keyPolicies.set(key, policy);
|
|
123
126
|
}
|
|
124
127
|
}
|
|
128
|
+
if (config.initialEndpointPolicies !== undefined) {
|
|
129
|
+
for (const [ endpoint, policy ] of Object.entries(config.initialEndpointPolicies)) {
|
|
130
|
+
this.endpointPolicies.set(endpoint, policy);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
125
133
|
this.startGcTimer();
|
|
126
134
|
}
|
|
127
135
|
|
|
@@ -133,14 +141,16 @@ export class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
|
133
141
|
defaultWindowMs: number;
|
|
134
142
|
responseHeaders: boolean;
|
|
135
143
|
activeKeyPolicies: number;
|
|
144
|
+
activeEndpointPolicies: number;
|
|
136
145
|
trackedStorageKeys: number;
|
|
137
146
|
} {
|
|
138
147
|
return {
|
|
139
|
-
defaultLimit:
|
|
140
|
-
defaultWindowMs:
|
|
141
|
-
responseHeaders:
|
|
142
|
-
activeKeyPolicies:
|
|
143
|
-
|
|
148
|
+
defaultLimit: this.defaultLimit,
|
|
149
|
+
defaultWindowMs: this.defaultWindowMs,
|
|
150
|
+
responseHeaders: this.responseHeaders,
|
|
151
|
+
activeKeyPolicies: this.keyPolicies.size,
|
|
152
|
+
activeEndpointPolicies: this.endpointPolicies.size,
|
|
153
|
+
trackedStorageKeys: this.requestLog.size,
|
|
144
154
|
};
|
|
145
155
|
}
|
|
146
156
|
|
|
@@ -160,6 +170,24 @@ export class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
|
160
170
|
this.keyPolicies.delete(key);
|
|
161
171
|
}
|
|
162
172
|
|
|
173
|
+
/**
|
|
174
|
+
* Per-endpoint(-csoport) egyedi policy beallitas. Az `endpoint`-nek pontosan
|
|
175
|
+
* azzal a stringgel kell egyeznie, amit az `endpointGrouper` visszaad (default: `req.path`).
|
|
176
|
+
* Akkor hasznos, ha egy endpointnak a globalis default-tol eltero limit kell — pl. egy
|
|
177
|
+
* webhook nagy burst-toleranciat igenyel (a legit, distributed forgalom ne bukjon), mig
|
|
178
|
+
* egy admin-endpoint szuk limitet. Precedencia: per-kulcs policy > per-endpoint policy > default.
|
|
179
|
+
*/
|
|
180
|
+
setPolicyForEndpoint(endpoint: string, policy: DyNTS_RateLimit_Policy): void {
|
|
181
|
+
this.endpointPolicies.set(endpoint, policy);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Per-endpoint policy torlese (visszaall a default-ra).
|
|
186
|
+
*/
|
|
187
|
+
clearPolicyForEndpoint(endpoint: string): void {
|
|
188
|
+
this.endpointPolicies.delete(endpoint);
|
|
189
|
+
}
|
|
190
|
+
|
|
163
191
|
|
|
164
192
|
/**
|
|
165
193
|
* Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be.
|
|
@@ -176,10 +204,14 @@ export class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
|
176
204
|
const endpoint: string = this.endpointGrouper(req);
|
|
177
205
|
const storageKey: string = `${subject}|${endpoint}`;
|
|
178
206
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
207
|
+
// precedencia: per-kulcs policy (legspecifikusabb, pl. subscriber-tier) > per-endpoint policy > default
|
|
208
|
+
const policy: DyNTS_RateLimit_Policy =
|
|
209
|
+
this.keyPolicies.get(subject) ??
|
|
210
|
+
this.endpointPolicies.get(endpoint) ??
|
|
211
|
+
{
|
|
212
|
+
limit: this.defaultLimit,
|
|
213
|
+
windowMs: this.defaultWindowMs,
|
|
214
|
+
};
|
|
183
215
|
|
|
184
216
|
const now: number = Date.now();
|
|
185
217
|
const windowStart: number = now - policy.windowMs;
|
|
@@ -305,6 +337,7 @@ export class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
|
305
337
|
this.endpointGrouper = (req: Request): string => req.path;
|
|
306
338
|
this.requestLog.clear();
|
|
307
339
|
this.keyPolicies.clear();
|
|
340
|
+
this.endpointPolicies.clear();
|
|
308
341
|
this.stopGcTimer();
|
|
309
342
|
}
|
|
310
343
|
}
|