@futdevpro/nts-dynamo 1.15.145 → 1.15.151
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 +1806 -1957
- package/.dynamo/logs/cicd-pipeline/status.json +33 -33
- package/README.md +16 -0
- package/__documentations/2026-08-21-distributed-rate-limit-bfr-ctm-010.md +59 -0
- package/__documentations/2026-08-22-npm-token-state-classifier.md +92 -0
- package/build/_collections/npm-token-check.util.d.ts +139 -0
- package/build/_collections/npm-token-check.util.d.ts.map +1 -0
- package/build/_collections/npm-token-check.util.js +302 -0
- package/build/_collections/npm-token-check.util.js.map +1 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.d.ts +6 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.d.ts.map +1 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.js +10 -0
- package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.js.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts +15 -6
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts.map +1 -1
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.d.ts +9 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.d.ts.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.js +3 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.js.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.d.ts +7 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.d.ts.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.js +3 -0
- package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.js.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.d.ts +9 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.d.ts.map +1 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.js +3 -0
- package/build/_modules/rate-limit/_models/rate-limit-store.interface.js.map +1 -0
- package/build/_modules/rate-limit/index.d.ts +5 -0
- package/build/_modules/rate-limit/index.d.ts.map +1 -1
- package/build/_modules/rate-limit/index.js +5 -1
- package/build/_modules/rate-limit/index.js.map +1 -1
- package/build/_modules/rate-limit/rate-limit-in-memory.store.d.ts +19 -0
- package/build/_modules/rate-limit/rate-limit-in-memory.store.d.ts.map +1 -0
- package/build/_modules/rate-limit/rate-limit-in-memory.store.js +71 -0
- package/build/_modules/rate-limit/rate-limit-in-memory.store.js.map +1 -0
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts +39 -103
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts.map +1 -1
- package/build/_modules/rate-limit/rate-limit.middleware.js +325 -236
- package/build/_modules/rate-limit/rate-limit.middleware.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/package.json +2 -2
- package/src/_collections/npm-token-check.util.spec.ts +218 -0
- package/src/_collections/npm-token-check.util.ts +327 -0
- package/src/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.ts +5 -0
- package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +19 -6
- package/src/_modules/rate-limit/_models/rate-limit-consume-request.interface.ts +9 -0
- package/src/_modules/rate-limit/_models/rate-limit-consume-result.interface.ts +6 -0
- package/src/_modules/rate-limit/_models/rate-limit-store.interface.ts +9 -0
- package/src/_modules/rate-limit/index.ts +5 -0
- package/src/_modules/rate-limit/rate-limit-in-memory.store.ts +91 -0
- package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +424 -200
- package/src/_modules/rate-limit/rate-limit.middleware.ts +436 -275
- package/src/index.ts +1 -0
|
@@ -1,69 +1,28 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
2
|
import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base';
|
|
3
|
+
import { DyNTS_RateLimitStoreKind_Type } from './_enums/rate-limit-store-kind.type-enum';
|
|
3
4
|
import { DyNTS_RateLimit_Config } from './_models/rate-limit-config.interface';
|
|
4
5
|
import { DyNTS_RateLimit_Policy } from './_models/rate-limit-policy.interface';
|
|
5
|
-
/**
|
|
6
|
-
* Sliding-window HTTP rate-limit middleware — opt-in service-szel, a meglevo
|
|
7
|
-
* `DyNTS_Endpoint_Params.preProcesses` mechanizmus mellol mukodik.
|
|
8
|
-
*
|
|
9
|
-
* **Hasznalat (host app):**
|
|
10
|
-
* ```ts
|
|
11
|
-
* const rateLimit = DyNTS_RateLimit_Middleware.getInstance();
|
|
12
|
-
* rateLimit.configure({
|
|
13
|
-
* defaultLimit: 100, // 100 req/perc default
|
|
14
|
-
* defaultWindowMs: 60_000,
|
|
15
|
-
* keyExtractor: (req) => req.headers['x-api-key'] as string || req.ip,
|
|
16
|
-
* });
|
|
17
|
-
*
|
|
18
|
-
* new DyNTS_Endpoint_Params({
|
|
19
|
-
* ...,
|
|
20
|
-
* preProcesses: [rateLimit.check, ...other],
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* // subscription-tier-up: per-kulcs egyedi limit
|
|
24
|
-
* rateLimit.setPolicyForKey('subscriber-tier-key-123', {
|
|
25
|
-
* limit: 1000,
|
|
26
|
-
* windowMs: 60_000,
|
|
27
|
-
* });
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* **Viselkedes:**
|
|
31
|
-
* - Sliding-window algoritmus: minden request egy timestamp; a window-on
|
|
32
|
-
* kivuli timestamp-ek nem szamolnak. Tobb pontos mint a fix-bucket
|
|
33
|
-
* (boundary-burst nincs).
|
|
34
|
-
* - In-memory storage — single-instance MVP-nek megfelelo. Multi-instance
|
|
35
|
-
* prod-hoz Redis-backed extension kell (lasd a kozelebb dokumentumaltot).
|
|
36
|
-
* - Limit lepes: 429 DyFM_Error + `X-RateLimit-*` + `Retry-After` header-ek.
|
|
37
|
-
*
|
|
38
|
-
* **Storage:** `Map<storageKey, timestamps[]>` ahol storageKey = `${subject}|${endpoint}`.
|
|
39
|
-
* Periodikus GC takaritja a inaktiv kulcsokat.
|
|
40
|
-
*
|
|
41
|
-
* **Singleton:** `getInstance()`-szel hivd. A `.check` mezo binding-elve van
|
|
42
|
-
* `this`-re, igy direkt atadhato `preProcesses`-be ujracsomagolas nelkul.
|
|
43
|
-
*/
|
|
6
|
+
/** Atomic HTTP rate-limit boundary with an explicit shared-store production gate. */
|
|
44
7
|
export declare class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBase {
|
|
45
|
-
static getInstance(): DyNTS_RateLimit_Middleware;
|
|
46
8
|
private defaultLimit;
|
|
47
9
|
private defaultWindowMs;
|
|
48
|
-
private
|
|
10
|
+
private isResponseHeadersEnabled;
|
|
11
|
+
private isSharedStoreRequired;
|
|
12
|
+
private isKeyExtractorExplicit;
|
|
13
|
+
private isEndpointGrouperExplicit;
|
|
49
14
|
private keyExtractor;
|
|
50
15
|
private endpointGrouper;
|
|
51
|
-
|
|
52
|
-
private
|
|
53
|
-
|
|
16
|
+
private costExtractor;
|
|
17
|
+
private clock;
|
|
18
|
+
private store;
|
|
54
19
|
private keyPolicies;
|
|
55
|
-
/** Per-endpoint(-csoport) egyedi policy-k (a `endpointGrouper` outputjara kulcsolva). */
|
|
56
20
|
private endpointPolicies;
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Konfig override. Hianyzo mezok a default-okat orzik. Hivhato barmikor —
|
|
61
|
-
* a `check()` a friss config-ot olvassa.
|
|
62
|
-
*/
|
|
21
|
+
/** Returns the process-wide rate-limit middleware. */
|
|
22
|
+
static getInstance(): DyNTS_RateLimit_Middleware;
|
|
23
|
+
/** Applies a validated configuration atomically; invalid settings do not partially mutate the service. */
|
|
63
24
|
configure(config: DyNTS_RateLimit_Config): void;
|
|
64
|
-
/**
|
|
65
|
-
* Aktualis konfig olvasasa (diagnosztika celokra).
|
|
66
|
-
*/
|
|
25
|
+
/** Returns content-free configuration diagnostics. */
|
|
67
26
|
getConfig(): {
|
|
68
27
|
defaultLimit: number;
|
|
69
28
|
defaultWindowMs: number;
|
|
@@ -71,63 +30,40 @@ export declare class DyNTS_RateLimit_Middleware extends DyNTS_SingletonServiceBa
|
|
|
71
30
|
activeKeyPolicies: number;
|
|
72
31
|
activeEndpointPolicies: number;
|
|
73
32
|
trackedStorageKeys: number;
|
|
33
|
+
storeKind: DyNTS_RateLimitStoreKind_Type;
|
|
34
|
+
requireSharedStore: boolean;
|
|
74
35
|
};
|
|
75
|
-
/**
|
|
76
|
-
* Per-kulcs egyedi policy beallitas (pl. subscription-tier alapjan).
|
|
77
|
-
* A `key`-nek pontosan azzal a stringgel kell egyeznie, amit a `keyExtractor`
|
|
78
|
-
* visszaad.
|
|
79
|
-
*/
|
|
36
|
+
/** Sets one validated subject policy. */
|
|
80
37
|
setPolicyForKey(key: string, policy: DyNTS_RateLimit_Policy): void;
|
|
81
|
-
/**
|
|
82
|
-
* Per-kulcs policy torlese (visszaall a default-ra).
|
|
83
|
-
*/
|
|
38
|
+
/** Removes one subject policy. */
|
|
84
39
|
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
|
-
*/
|
|
40
|
+
/** Sets one validated endpoint-group policy. */
|
|
92
41
|
setPolicyForEndpoint(endpoint: string, policy: DyNTS_RateLimit_Policy): void;
|
|
93
|
-
/**
|
|
94
|
-
* Per-endpoint policy torlese (visszaall a default-ra).
|
|
95
|
-
*/
|
|
42
|
+
/** Removes one endpoint-group policy. */
|
|
96
43
|
clearPolicyForEndpoint(endpoint: string): void;
|
|
97
|
-
/**
|
|
98
|
-
* Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be.
|
|
99
|
-
*
|
|
100
|
-
* Throws:
|
|
101
|
-
* - 429 ha az aktualis request meghaladna a limit-et a sliding window-on
|
|
102
|
-
*
|
|
103
|
-
* Side-effect: ha `responseHeaders === true`, beallitja az `X-RateLimit-Limit`,
|
|
104
|
-
* `X-RateLimit-Remaining`, `X-RateLimit-Reset` header-eket; 429 eseten
|
|
105
|
-
* a `Retry-After` header-t is.
|
|
106
|
-
*/
|
|
44
|
+
/** Atomically consumes one request permit or raises a stable content-free error. */
|
|
107
45
|
readonly check: (req: Request, res: Response) => Promise<void>;
|
|
108
|
-
/**
|
|
109
|
-
* Default key-extractor: x-forwarded-for vagy req.ip vagy 'unknown'.
|
|
110
|
-
* Csak akkor hasznalt, ha a host nem allit be sajat extractort a configure-ben.
|
|
111
|
-
*/
|
|
112
|
-
private defaultKeyExtractor;
|
|
113
|
-
/**
|
|
114
|
-
* GC timer inditasa (idempotent). Periodikusan eltavolitja az inaktiv
|
|
115
|
-
* storage-key-eket a request-log-bol — memory-leak prevention.
|
|
116
|
-
*/
|
|
117
|
-
private startGcTimer;
|
|
118
|
-
/**
|
|
119
|
-
* GC sweep — minden storage-key-rol levagja a regi timestamp-eket, es
|
|
120
|
-
* eltavolitja az ureseket. Hivhato kulonosen test-bol.
|
|
121
|
-
*/
|
|
46
|
+
/** Performs explicit opportunistic cleanup only for the local test/development store. */
|
|
122
47
|
runGc(): void;
|
|
123
|
-
/**
|
|
124
|
-
* GC timer leallitasa (graceful shutdown vagy test-cleanup).
|
|
125
|
-
*/
|
|
48
|
+
/** Backward-compatible no-op: this implementation never starts a timer. */
|
|
126
49
|
stopGcTimer(): void;
|
|
127
|
-
/**
|
|
128
|
-
* Test-only: visszaallitja a default config-ot + uriti a state-et, hogy a
|
|
129
|
-
* specfajlok ne szivarogjak at egymas state-jet. Production code NE hivja.
|
|
130
|
-
*/
|
|
50
|
+
/** Resets all state to deterministic local defaults for tests. */
|
|
131
51
|
_resetForTesting(): void;
|
|
52
|
+
private buildConfigSnapshot;
|
|
53
|
+
private addInitialPolicies;
|
|
54
|
+
private assertPolicy;
|
|
55
|
+
private assertCost;
|
|
56
|
+
private assertConfigurationFunctions;
|
|
57
|
+
private assertStore;
|
|
58
|
+
private extractBucketPart;
|
|
59
|
+
private extractCost;
|
|
60
|
+
private buildBucketKey;
|
|
61
|
+
private getNow;
|
|
62
|
+
private assertBucketPart;
|
|
63
|
+
private throwBucketKeyInvalid;
|
|
64
|
+
private assertStoreResult;
|
|
65
|
+
private setResponseHeaders;
|
|
66
|
+
private getRetryAfterSeconds;
|
|
67
|
+
private throwRateLimitError;
|
|
132
68
|
}
|
|
133
69
|
//# sourceMappingURL=rate-limit.middleware.d.ts.map
|
|
@@ -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;
|
|
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;AAK5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAyC/E,qFAAqF;AACrF,qBAAa,0BAA2B,SAAQ,0BAA0B;IACxE,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,wBAAwB,CAAqC;IACrE,OAAO,CAAC,qBAAqB,CAAkB;IAC/C,OAAO,CAAC,sBAAsB,CAAkB;IAChD,OAAO,CAAC,yBAAyB,CAAkB;IACnD,OAAO,CAAC,YAAY,CAA2E;IAC/F,OAAO,CAAC,eAAe,CAAgE;IACvF,OAAO,CAAC,aAAa,CAInB;IACF,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,KAAK,CAAwE;IACrF,OAAO,CAAC,WAAW,CAAkD;IACrE,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,sDAAsD;WACxC,WAAW,IAAI,0BAA0B;IAIvD,0GAA0G;IACnG,SAAS,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAkBtD,sDAAsD;IAC/C,SAAS,IAAI;QAClB,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;QAC3B,SAAS,EAAE,6BAA6B,CAAC;QACzC,kBAAkB,EAAE,OAAO,CAAC;KAC3B;IAeH,yCAAyC;IAClC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAMzE,kCAAkC;IAC3B,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI3C,gDAAgD;IACzC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAMnF,yCAAyC;IAClC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD,oFAAoF;IACpF,SAAgB,KAAK,QAAe,OAAO,OAAO,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CAgDxE;IAEF,yFAAyF;IAClF,KAAK,IAAI,IAAI;IAMpB,2EAA2E;IACpE,WAAW,IAAI,IAAI;IAE1B,kEAAkE;IAC3D,gBAAgB,IAAI,IAAI;IAoB/B,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,4BAA4B;IAqBpC,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,mBAAmB;CAY5B"}
|