@futdevpro/nts-dynamo 1.15.46 → 1.15.48
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 +1618 -1541
- package/.dynamo/logs/cicd-pipeline/status.json +210 -208
- 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/build/_modules/server/server-status/server-status.control-service.d.ts +30 -0
- package/build/_modules/server/server-status/server-status.control-service.d.ts.map +1 -1
- package/build/_modules/server/server-status/server-status.control-service.js +40 -0
- package/build/_modules/server/server-status/server-status.control-service.js.map +1 -1
- package/build/_modules/server/server-status/server-status.controller.d.ts.map +1 -1
- package/build/_modules/server/server-status/server-status.controller.js +13 -0
- package/build/_modules/server/server-status/server-status.controller.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
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +52 -0
- package/src/_modules/server/server-status/server-status.control-service.ts +60 -0
- package/src/_modules/server/server-status/server-status.controller.ts +16 -1
|
@@ -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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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DyFM_RelativeDate, DyFM_ServerStatus, DyFM_Error, DyFM_Error_Statistics, DyFM_Errors, DyFM_ServerConnectionCheckResult } from '@futdevpro/fsm-dynamo';
|
|
2
2
|
import { Subscription } from 'rxjs';
|
|
3
|
+
import * as mongoose from 'mongoose';
|
|
3
4
|
import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
|
|
4
5
|
import { DyNTS_Errors_ControlService } from '../errors/errors.control-service';
|
|
5
6
|
import { DyNTS_ServerStatusSnapshot_ControlService } from './server-status-snapshot.control-service';
|
|
@@ -10,6 +11,22 @@ export interface DyNTS_ServerConnection {
|
|
|
10
11
|
accessible?: boolean;
|
|
11
12
|
lastCheck?: Date;
|
|
12
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* A readiness-probe ({@link DyNTS_ServerStatus_ControlService.checkDbReadiness}) eredménye.
|
|
16
|
+
* `ready=true` CSAK ha a DB-connection él (readyState=1) ÉS a valós ping round-trip sikerült.
|
|
17
|
+
*/
|
|
18
|
+
export interface DyNTS_DbReadiness {
|
|
19
|
+
/** ready: a DB elérhető (readyState=1 + sikeres ping). Erre adjon az endpoint 200-at, különben 503-at. */
|
|
20
|
+
ready: boolean;
|
|
21
|
+
/** mongoose connection.readyState: 0=disconnected, 1=connected, 2=connecting, 3=disconnecting. */
|
|
22
|
+
dbReadyState: number;
|
|
23
|
+
/** Sikerült-e a valós DB ping round-trip (csak readyState=1-nél próbáljuk). */
|
|
24
|
+
dbPingOk: boolean;
|
|
25
|
+
/** A szerver uptime ms-ban. */
|
|
26
|
+
uptime: number;
|
|
27
|
+
/** A szerver verziója. */
|
|
28
|
+
serverVersion: string;
|
|
29
|
+
}
|
|
13
30
|
export declare abstract class DyNTS_ServerStatus_ControlService<T_ServerStatus extends DyFM_ServerStatus, T_Error extends DyFM_Error, T_Errors extends DyFM_Errors<T_Error>, T_Errors_ControlService extends DyNTS_Errors_ControlService<T_Error, T_Errors>, T_ServerStatusSnapshot extends DyFM_ServerStatus, T_ServerStatusSnapshot_ControlService extends DyNTS_ServerStatusSnapshot_ControlService<T_ServerStatusSnapshot>> extends DyNTS_SingletonService {
|
|
14
31
|
protected abstract getErrorControlService?(set?: {
|
|
15
32
|
data?: T_Errors;
|
|
@@ -35,6 +52,19 @@ export declare abstract class DyNTS_ServerStatus_ControlService<T_ServerStatus e
|
|
|
35
52
|
protected constructor();
|
|
36
53
|
getServerStatus(issuer: string, clientVersion?: string): Promise<DyFM_ServerStatus>;
|
|
37
54
|
checkServerConnections(issuer: string): Promise<DyFM_ServerConnectionCheckResult>;
|
|
55
|
+
/**
|
|
56
|
+
* A mongoose default-connection. Külön metódus = teszt-seam (spy-jal felülírható, hogy a
|
|
57
|
+
* {@link checkDbReadiness} DB nélkül is tesztelhető legyen).
|
|
58
|
+
*/
|
|
59
|
+
protected getMongooseConnection(): mongoose.Connection;
|
|
60
|
+
/**
|
|
61
|
+
* Readiness-probe: a `/health` (liveness — "a process fut + kiszolgál") MELLETT a DB-elérhetőséget
|
|
62
|
+
* ellenőrzi. A readyState (mongoose driver-állapot) + egy valós `ping` round-trip → így a "connected
|
|
63
|
+
* de a DB nem válaszol" eset is kibukik. **Sosem dob** (a probe-nak determinisztikusan kell válaszolnia);
|
|
64
|
+
* hiba esetén `ready=false`. Az endpoint 503-at adjon, ha nem ready → az orchestrátor (k8s/docker/LB)
|
|
65
|
+
* ne irányítson forgalmat a DB-vesztett instance-ra.
|
|
66
|
+
*/
|
|
67
|
+
checkDbReadiness(): Promise<DyNTS_DbReadiness>;
|
|
38
68
|
getErrorStatistics(range: DyFM_RelativeDate, issuer: string): Promise<DyFM_Error_Statistics>;
|
|
39
69
|
protected getVersionNumeric(version: string): number;
|
|
40
70
|
protected clientVersionIsLatest(clientVersion: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-status.control-service.d.ts","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.control-service.ts"],"names":[],"mappings":"AAEA,OAAO,EACU,iBAAiB,EAAa,iBAAiB,EAC9D,UAAU,EAAE,qBAAqB,EAAE,WAAW,EAG9C,gCAAgC,EAGjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAS,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"server-status.control-service.d.ts","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.control-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DyNTS_ServerStatus_ControlService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
4
5
|
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
5
6
|
const rxjs_1 = require("rxjs");
|
|
7
|
+
const mongoose = tslib_1.__importStar(require("mongoose"));
|
|
6
8
|
const package_json_1 = require("../../../../package.json");
|
|
7
9
|
const singleton_service_1 = require("../../../_services/base/singleton.service");
|
|
8
10
|
const global_settings_const_1 = require("../../../_collections/global-settings.const");
|
|
@@ -97,6 +99,44 @@ class DyNTS_ServerStatus_ControlService extends singleton_service_1.DyNTS_Single
|
|
|
97
99
|
});
|
|
98
100
|
}
|
|
99
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* A mongoose default-connection. Külön metódus = teszt-seam (spy-jal felülírható, hogy a
|
|
104
|
+
* {@link checkDbReadiness} DB nélkül is tesztelhető legyen).
|
|
105
|
+
*/
|
|
106
|
+
getMongooseConnection() {
|
|
107
|
+
return mongoose.connection;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Readiness-probe: a `/health` (liveness — "a process fut + kiszolgál") MELLETT a DB-elérhetőséget
|
|
111
|
+
* ellenőrzi. A readyState (mongoose driver-állapot) + egy valós `ping` round-trip → így a "connected
|
|
112
|
+
* de a DB nem válaszol" eset is kibukik. **Sosem dob** (a probe-nak determinisztikusan kell válaszolnia);
|
|
113
|
+
* hiba esetén `ready=false`. Az endpoint 503-at adjon, ha nem ready → az orchestrátor (k8s/docker/LB)
|
|
114
|
+
* ne irányítson forgalmat a DB-vesztett instance-ra.
|
|
115
|
+
*/
|
|
116
|
+
async checkDbReadiness() {
|
|
117
|
+
let dbReadyState = 0;
|
|
118
|
+
let dbPingOk = false;
|
|
119
|
+
try {
|
|
120
|
+
const connection = this.getMongooseConnection();
|
|
121
|
+
// readyState: 0=disconnected, 1=connected, 2=connecting, 3=disconnecting
|
|
122
|
+
dbReadyState = connection?.readyState ?? 0;
|
|
123
|
+
if (dbReadyState === 1) {
|
|
124
|
+
await connection.db?.admin().ping();
|
|
125
|
+
dbPingOk = true;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
fsm_dynamo_1.DyFM_Log.warn('(checkDbReadiness) DB readiness check failed', error);
|
|
130
|
+
dbPingOk = false;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
ready: dbReadyState === 1 && dbPingOk,
|
|
134
|
+
dbReadyState: dbReadyState,
|
|
135
|
+
dbPingOk: dbPingOk,
|
|
136
|
+
uptime: +new Date() - +this.up,
|
|
137
|
+
serverVersion: this.serverVersion,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
100
140
|
async getErrorStatistics(range, issuer) {
|
|
101
141
|
try {
|
|
102
142
|
const error_DS = this.getErrorControlService({ issuer: issuer });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-status.control-service.js","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.control-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-status.control-service.js","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.control-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-status.controller.d.ts","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.controller.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAwC,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AAEtG,OAAO,
|
|
1
|
+
{"version":3,"file":"server-status.controller.d.ts","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.controller.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAwC,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzH,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AAEtG,OAAO,EAAqB,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AACvG,OAAO,EAAE,yCAAyC,EAAE,MAAM,0CAA0C,CAAC;AAGrG;;;;;;;;;;;;GAYG;AACH,8BAAsB,6BAA6B,CACjD,cAAc,SAAS,iBAAiB,EACxC,OAAO,SAAS,UAAU,EAC1B,QAAQ,SAAS,WAAW,CAAC,OAAO,CAAC,EACrC,uBAAuB,SAAS,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC9E,sBAAsB,SAAS,iBAAiB,EAChD,qCAAqC,SAAS,yCAAyC,CAAC,sBAAsB,CAAC,EAC/G,6BAA6B,SAAS,iCAAiC,CACrE,cAAc,EACd,OAAO,EACP,QAAQ,EACR,uBAAuB,EACvB,sBAAsB,EACtB,qCAAqC,CACtC,CACD,SAAQ,gBAAgB;IAMxB,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;IAGrE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,qBAAqB,EAAE,CAAM;IAErE,cAAc,IAAI,IAAI;CA6FvB"}
|
|
@@ -56,6 +56,19 @@ class DyNTS_ServerStatus_Controller extends controller_service_1.DyNTS_Controlle
|
|
|
56
56
|
},
|
|
57
57
|
],
|
|
58
58
|
}),
|
|
59
|
+
// Readiness-probe: a /health-tel (liveness) szemben a DB-elérhetőséget is ellenőrzi.
|
|
60
|
+
// Public (mint a /health) — orchestrátor/LB hívja; 503 ha a DB nem ready → no traffic.
|
|
61
|
+
new endpoint_params_control_model_1.DyNTS_Endpoint_Params({
|
|
62
|
+
name: 'getServerReadiness',
|
|
63
|
+
type: fsm_dynamo_1.DyFM_HttpCallType.get,
|
|
64
|
+
endpoint: '/readiness',
|
|
65
|
+
tasks: [
|
|
66
|
+
async (req, res, issuer) => {
|
|
67
|
+
const readiness = await this.server_CS.checkDbReadiness();
|
|
68
|
+
res.status(readiness.ready ? 200 : 503).send(readiness);
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
}),
|
|
59
72
|
new endpoint_params_control_model_1.DyNTS_Endpoint_Params({
|
|
60
73
|
name: 'getServerStatusForClient',
|
|
61
74
|
type: fsm_dynamo_1.DyFM_HttpCallType.get,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-status.controller.js","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.controller.ts"],"names":[],"mappings":";;;AAGA,sDAAyH;AAEzH,oFAA+E;AAC/E,iHAAsG;AACtG,uFAAoF;AAKpF;;;;;;;;;;;;GAYG;AACH,MAAsB,6BAepB,SAAQ,qCAAgB;IAQxB,mEAAmE;IAChD,mBAAmB,GAA4B,EAAE,CAAC;IAErE,cAAc;QACZ;;;;;YAKI;QAEJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,MAAM,IAAI,uBAAU,CAAC;gBACnB,OAAO,EAAE,iEAAiE;gBAC1E,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;aACxE,CAAC,CAAC;QACL,CAAC;QAED,mDAAmD;QAEnD,IAAI,CAAC,SAAS,GAAG;YACf,IAAI,qDAAqB,CAAC;gBACxB,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,8BAAiB,CAAC,GAAG;gBAC3B,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE;oBACL,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,MAAc,EAAiB,EAAE;wBACnE,GAAG,CAAC,IAAI,CACN,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAC7C,CAAC;oBACJ,CAAC;iBACF;aACF,CAAC;YAEF,IAAI,qDAAqB,CAAC;gBACxB,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,8BAAiB,CAAC,GAAG;gBAC3B,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE;oBACL,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,MAAc,EAAiB,EAAE;wBACnE,GAAG,CAAC,IAAI,CACN,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAC7C,CAAC;oBACJ,CAAC;iBACF;aACF,CAAC;YAEF,IAAI,qDAAqB,CAAC;gBACxB,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,8BAAiB,CAAC,GAAG;gBAC3B,QAAQ,EAAE,kBAAkB;gBAC5B,KAAK,EAAE;oBACL,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,MAAc,EAAiB,EAAE;wBAEnE,GAAG,CAAC,IAAI,CACN,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CACjE,CAAC;oBACJ,CAAC;iBACF;aACF,CAAC;YAEF,IAAI,qDAAqB,CAAC;gBACxB,IAAI,EAAE,oBAAoB;gBAC1B,IAAI,EAAE,8BAAiB,CAAC,GAAG;gBAC3B,QAAQ,EAAE,0BAA0B;gBACpC,KAAK,EAAE;oBACL,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,MAAc,EAAkB,EAAE;wBAEpE,GAAG,CAAC,IAAI,CACN,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACrC,GAAG,CAAC,MAAM,CAAC,KAA0B,EACrC,MAAM,CACP,CACF,CAAC;oBACJ,CAAC;iBACF;aACF,CAAC;YAEF,GAAG,IAAI,CAAC,mBAAmB;SAC5B,CAAC;IACJ,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"server-status.controller.js","sourceRoot":"","sources":["../../../../src/_modules/server/server-status/server-status.controller.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.48",
|
|
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
|
}
|
|
@@ -493,6 +493,58 @@ describe('| DyNTS_ServerStatus_ControlService', () => {
|
|
|
493
493
|
});
|
|
494
494
|
});
|
|
495
495
|
|
|
496
|
+
describe('| checkDbReadiness', () => {
|
|
497
|
+
it('| should be ready when connected (readyState=1) and ping succeeds', async () => {
|
|
498
|
+
const fakeConnection = {
|
|
499
|
+
readyState: 1,
|
|
500
|
+
db: { admin: () => ({ ping: async () => ({ ok: 1 }) }) },
|
|
501
|
+
};
|
|
502
|
+
spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
|
|
503
|
+
|
|
504
|
+
const result = await service.checkDbReadiness();
|
|
505
|
+
|
|
506
|
+
expect(result.ready).toBe(true);
|
|
507
|
+
expect(result.dbReadyState).toBe(1);
|
|
508
|
+
expect(result.dbPingOk).toBe(true);
|
|
509
|
+
expect(result.serverVersion).toBe(service.serverVersion);
|
|
510
|
+
expect(result.uptime).toBeGreaterThanOrEqual(0);
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
it('| should NOT be ready when disconnected (readyState=0) — no ping attempted', async () => {
|
|
514
|
+
const fakeConnection = { readyState: 0, db: undefined };
|
|
515
|
+
spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
|
|
516
|
+
|
|
517
|
+
const result = await service.checkDbReadiness();
|
|
518
|
+
|
|
519
|
+
expect(result.ready).toBe(false);
|
|
520
|
+
expect(result.dbReadyState).toBe(0);
|
|
521
|
+
expect(result.dbPingOk).toBe(false);
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
it('| should NOT be ready when connected but ping fails (DB unresponsive)', async () => {
|
|
525
|
+
const fakeConnection = {
|
|
526
|
+
readyState: 1,
|
|
527
|
+
db: { admin: () => ({ ping: async () => { throw new Error('no pong'); } }) },
|
|
528
|
+
};
|
|
529
|
+
spyOn(service as any, 'getMongooseConnection').and.returnValue(fakeConnection);
|
|
530
|
+
|
|
531
|
+
const result = await service.checkDbReadiness();
|
|
532
|
+
|
|
533
|
+
expect(result.ready).toBe(false);
|
|
534
|
+
expect(result.dbReadyState).toBe(1);
|
|
535
|
+
expect(result.dbPingOk).toBe(false);
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
it('| should never throw — returns not-ready on internal error', async () => {
|
|
539
|
+
spyOn(service as any, 'getMongooseConnection').and.throwError(new Error('boom'));
|
|
540
|
+
|
|
541
|
+
const result = await service.checkDbReadiness();
|
|
542
|
+
|
|
543
|
+
expect(result.ready).toBe(false);
|
|
544
|
+
expect(result.dbReadyState).toBe(0);
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
|
|
496
548
|
describe('| getServerStatusSnapshot', () => {
|
|
497
549
|
it('| should return server status snapshot', async () => {
|
|
498
550
|
const mockStatus: TestServerStatus = new TestServerStatus({
|