@futdevpro/nts-dynamo 1.15.145 → 1.15.150

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.
Files changed (55) hide show
  1. package/.dynamo/logs/cicd-pipeline/output.log +1665 -1803
  2. package/.dynamo/logs/cicd-pipeline/status.json +33 -33
  3. package/README.md +16 -0
  4. package/__documentations/2026-08-21-distributed-rate-limit-bfr-ctm-010.md +59 -0
  5. package/build/_collections/npm-token-check.util.d.ts +139 -0
  6. package/build/_collections/npm-token-check.util.d.ts.map +1 -0
  7. package/build/_collections/npm-token-check.util.js +302 -0
  8. package/build/_collections/npm-token-check.util.js.map +1 -0
  9. package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.d.ts +6 -0
  10. package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.d.ts.map +1 -0
  11. package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.js +10 -0
  12. package/build/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.js.map +1 -0
  13. package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts +15 -6
  14. package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts.map +1 -1
  15. package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.d.ts +9 -0
  16. package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.d.ts.map +1 -0
  17. package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.js +3 -0
  18. package/build/_modules/rate-limit/_models/rate-limit-consume-request.interface.js.map +1 -0
  19. package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.d.ts +7 -0
  20. package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.d.ts.map +1 -0
  21. package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.js +3 -0
  22. package/build/_modules/rate-limit/_models/rate-limit-consume-result.interface.js.map +1 -0
  23. package/build/_modules/rate-limit/_models/rate-limit-store.interface.d.ts +9 -0
  24. package/build/_modules/rate-limit/_models/rate-limit-store.interface.d.ts.map +1 -0
  25. package/build/_modules/rate-limit/_models/rate-limit-store.interface.js +3 -0
  26. package/build/_modules/rate-limit/_models/rate-limit-store.interface.js.map +1 -0
  27. package/build/_modules/rate-limit/index.d.ts +5 -0
  28. package/build/_modules/rate-limit/index.d.ts.map +1 -1
  29. package/build/_modules/rate-limit/index.js +5 -1
  30. package/build/_modules/rate-limit/index.js.map +1 -1
  31. package/build/_modules/rate-limit/rate-limit-in-memory.store.d.ts +19 -0
  32. package/build/_modules/rate-limit/rate-limit-in-memory.store.d.ts.map +1 -0
  33. package/build/_modules/rate-limit/rate-limit-in-memory.store.js +71 -0
  34. package/build/_modules/rate-limit/rate-limit-in-memory.store.js.map +1 -0
  35. package/build/_modules/rate-limit/rate-limit.middleware.d.ts +39 -103
  36. package/build/_modules/rate-limit/rate-limit.middleware.d.ts.map +1 -1
  37. package/build/_modules/rate-limit/rate-limit.middleware.js +325 -236
  38. package/build/_modules/rate-limit/rate-limit.middleware.js.map +1 -1
  39. package/build/index.d.ts +1 -0
  40. package/build/index.d.ts.map +1 -1
  41. package/build/index.js +1 -0
  42. package/build/index.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/_collections/npm-token-check.util.spec.ts +218 -0
  45. package/src/_collections/npm-token-check.util.ts +327 -0
  46. package/src/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.ts +5 -0
  47. package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +19 -6
  48. package/src/_modules/rate-limit/_models/rate-limit-consume-request.interface.ts +9 -0
  49. package/src/_modules/rate-limit/_models/rate-limit-consume-result.interface.ts +6 -0
  50. package/src/_modules/rate-limit/_models/rate-limit-store.interface.ts +9 -0
  51. package/src/_modules/rate-limit/index.ts +5 -0
  52. package/src/_modules/rate-limit/rate-limit-in-memory.store.ts +91 -0
  53. package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +424 -200
  54. package/src/_modules/rate-limit/rate-limit.middleware.ts +436 -275
  55. package/src/index.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store-kind.type-enum.d.ts","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,oBAAY,6BAA6B;IACvC,QAAQ,cAAc;IACtB,MAAM,WAAW;CAClB"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_RateLimitStoreKind_Type = void 0;
4
+ /** Persistence scope advertised by a rate-limit store implementation. */
5
+ var DyNTS_RateLimitStoreKind_Type;
6
+ (function (DyNTS_RateLimitStoreKind_Type) {
7
+ DyNTS_RateLimitStoreKind_Type["inMemory"] = "in-memory";
8
+ DyNTS_RateLimitStoreKind_Type["shared"] = "shared";
9
+ })(DyNTS_RateLimitStoreKind_Type || (exports.DyNTS_RateLimitStoreKind_Type = DyNTS_RateLimitStoreKind_Type = {}));
10
+ //# sourceMappingURL=rate-limit-store-kind.type-enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store-kind.type-enum.js","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_enums/rate-limit-store-kind.type-enum.ts"],"names":[],"mappings":";;;AAAA,yEAAyE;AACzE,IAAY,6BAGX;AAHD,WAAY,6BAA6B;IACvC,uDAAsB,CAAA;IACtB,kDAAiB,CAAA;AACnB,CAAC,EAHW,6BAA6B,6CAA7B,6BAA6B,QAGxC"}
@@ -1,5 +1,6 @@
1
1
  import { Request } from 'express';
2
2
  import { DyNTS_RateLimit_Policy } from './rate-limit-policy.interface';
3
+ import { DyNTS_RateLimit_Store_Interface } from './rate-limit-store.interface';
3
4
  /**
4
5
  * Config a `DyNTS_RateLimit_Middleware.configure(...)`-hoz.
5
6
  *
@@ -21,22 +22,30 @@ export interface DyNTS_RateLimit_Config {
21
22
  * Rate-limit subject-extractor. Visszater a karakterlanccal, ami azonositja
22
23
  * a rate-limit alanyat (pl. IP-cim, API-kulcs ID, account ID).
23
24
  *
24
- * Default: a `req.headers['x-forwarded-for']` (csak az elso IP, ha lista)
25
- * vagy ha hianyzik akkor `req.ip` vagy `'unknown'`. Ez webszerver elotti
26
- * proxy/CDN-mentes setup-ra megfelelo; ha az nd-space mar identifikalja az
27
- * API-kulcsot a `req`-ben, a host adhat sajat extractort ami a key-ID-t
28
- * adja vissza.
25
+ * Default: az Express altal mar megbizhatonak minositett `req.ip`, vagy ha
26
+ * hianyzik akkor `'unknown'`. A middleware szandekosan nem olvassa kozvetlenul
27
+ * az ugyfel altal hamisithato `x-forwarded-for` headert. Production uzemben a
28
+ * shared-store gate explicit, opaque extractort kovetel.
29
29
  */
30
30
  keyExtractor?: (req: Request) => string;
31
31
  /**
32
32
  * Endpoint-csoportosito. Visszater a karakterlanccal, ami azonositja az
33
- * adott endpoint-csoportot. A storage-key `${subject}|${endpoint}` lesz.
33
+ * adott endpoint-csoportot. A storage-key egyertelmuen hossz-prefixelt
34
+ * subject + endpoint kompozicio lesz.
34
35
  *
35
36
  * Default: `req.path` — minden uri-path kulon vodorbe kerul. Csoportositas
36
37
  * mas szempontok szerint (pl. "datasets" csoport = `/api/datasets/*`)
37
38
  * a hostnal felulirhato.
38
39
  */
39
40
  endpointGrouper?: (req: Request) => string;
41
+ /** Optional permit cost per request. Default: one. */
42
+ costExtractor?: (req: Request) => number;
43
+ /** Atomic store. The default in-memory implementation is for tests and single-instance development only. */
44
+ store?: DyNTS_RateLimit_Store_Interface;
45
+ /** Fail configuration unless a shared store plus explicit opaque key/group extractors are supplied. */
46
+ requireSharedStore?: boolean;
47
+ /** Deterministic clock seam. Production callers normally omit it. */
48
+ clock?: () => number;
40
49
  /**
41
50
  * Beallitja-e a `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
42
51
  * `X-RateLimit-Reset` (es a 429-re `Retry-After`) response header-eket.
@@ -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;IAE5D;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CAClE"}
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;AACvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAExC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAE3C,sDAAsD;IACtD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAEzC,4GAA4G;IAC5G,KAAK,CAAC,EAAE,+BAA+B,CAAC;IAExC,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IAErB;;;;;;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"}
@@ -0,0 +1,9 @@
1
+ import { DyNTS_RateLimit_Policy } from './rate-limit-policy.interface';
2
+ /** Atomic permit request passed to a rate-limit store. */
3
+ export interface DyNTS_RateLimit_ConsumeRequest_Interface {
4
+ bucketKey: string;
5
+ policy: DyNTS_RateLimit_Policy;
6
+ cost: number;
7
+ now: number;
8
+ }
9
+ //# sourceMappingURL=rate-limit-consume-request.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-consume-request.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-consume-request.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,0DAA0D;AAC1D,MAAM,WAAW,wCAAwC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=rate-limit-consume-request.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-consume-request.interface.js","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-consume-request.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /** Content-free result of one atomically committed permit request. */
2
+ export interface DyNTS_RateLimit_ConsumeResult_Interface {
3
+ allowed: boolean;
4
+ remaining: number;
5
+ resetAt: number;
6
+ }
7
+ //# sourceMappingURL=rate-limit-consume-result.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-consume-result.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-consume-result.interface.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=rate-limit-consume-result.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-consume-result.interface.js","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-consume-result.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { DyNTS_RateLimitStoreKind_Type } from '../_enums/rate-limit-store-kind.type-enum';
2
+ import { DyNTS_RateLimit_ConsumeRequest_Interface } from './rate-limit-consume-request.interface';
3
+ import { DyNTS_RateLimit_ConsumeResult_Interface } from './rate-limit-consume-result.interface';
4
+ /** Atomic persistence seam. Production hosts can require `shared` scope at configuration time. */
5
+ export interface DyNTS_RateLimit_Store_Interface {
6
+ readonly storeKind: DyNTS_RateLimitStoreKind_Type;
7
+ consume(request: DyNTS_RateLimit_ConsumeRequest_Interface): Promise<DyNTS_RateLimit_ConsumeResult_Interface>;
8
+ }
9
+ //# sourceMappingURL=rate-limit-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-store.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAE,wCAAwC,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,uCAAuC,EAAE,MAAM,uCAAuC,CAAC;AAEhG,kGAAkG;AAClG,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;IAClD,OAAO,CAAC,OAAO,EAAE,wCAAwC,GAAG,OAAO,CAAC,uCAAuC,CAAC,CAAC;CAC9G"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=rate-limit-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store.interface.js","sourceRoot":"","sources":["../../../../src/_modules/rate-limit/_models/rate-limit-store.interface.ts"],"names":[],"mappings":""}
@@ -1,4 +1,9 @@
1
1
  export { DyNTS_RateLimit_Middleware } from './rate-limit.middleware';
2
+ export { DyNTS_RateLimit_InMemoryStore } from './rate-limit-in-memory.store';
2
3
  export { DyNTS_RateLimit_Config } from './_models/rate-limit-config.interface';
4
+ export { DyNTS_RateLimit_ConsumeRequest_Interface } from './_models/rate-limit-consume-request.interface';
5
+ export { DyNTS_RateLimit_ConsumeResult_Interface } from './_models/rate-limit-consume-result.interface';
3
6
  export { DyNTS_RateLimit_Policy } from './_models/rate-limit-policy.interface';
7
+ export { DyNTS_RateLimit_Store_Interface } from './_models/rate-limit-store.interface';
8
+ export { DyNTS_RateLimitStoreKind_Type } from './_enums/rate-limit-store-kind.type-enum';
4
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/rate-limit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/rate-limit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,wCAAwC,EAAE,MAAM,gDAAgD,CAAC;AAC1G,OAAO,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAC;AACxG,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC"}
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DyNTS_RateLimit_Middleware = void 0;
3
+ exports.DyNTS_RateLimitStoreKind_Type = exports.DyNTS_RateLimit_InMemoryStore = exports.DyNTS_RateLimit_Middleware = void 0;
4
4
  var rate_limit_middleware_1 = require("./rate-limit.middleware");
5
5
  Object.defineProperty(exports, "DyNTS_RateLimit_Middleware", { enumerable: true, get: function () { return rate_limit_middleware_1.DyNTS_RateLimit_Middleware; } });
6
+ var rate_limit_in_memory_store_1 = require("./rate-limit-in-memory.store");
7
+ Object.defineProperty(exports, "DyNTS_RateLimit_InMemoryStore", { enumerable: true, get: function () { return rate_limit_in_memory_store_1.DyNTS_RateLimit_InMemoryStore; } });
8
+ var rate_limit_store_kind_type_enum_1 = require("./_enums/rate-limit-store-kind.type-enum");
9
+ Object.defineProperty(exports, "DyNTS_RateLimitStoreKind_Type", { enumerable: true, get: function () { return rate_limit_store_kind_type_enum_1.DyNTS_RateLimitStoreKind_Type; } });
6
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/rate-limit/index.ts"],"names":[],"mappings":";;;AAAA,iEAAqE;AAA5D,mIAAA,0BAA0B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/rate-limit/index.ts"],"names":[],"mappings":";;;AAAA,iEAAqE;AAA5D,mIAAA,0BAA0B,OAAA;AACnC,2EAA6E;AAApE,2IAAA,6BAA6B,OAAA;AAMtC,4FAAyF;AAAhF,gJAAA,6BAA6B,OAAA"}
@@ -0,0 +1,19 @@
1
+ import { DyNTS_RateLimitStoreKind_Type } from './_enums/rate-limit-store-kind.type-enum';
2
+ import { DyNTS_RateLimit_ConsumeRequest_Interface } from './_models/rate-limit-consume-request.interface';
3
+ import { DyNTS_RateLimit_ConsumeResult_Interface } from './_models/rate-limit-consume-result.interface';
4
+ import { DyNTS_RateLimit_Store_Interface } from './_models/rate-limit-store.interface';
5
+ /** Deterministic single-process store for tests and explicitly single-instance development. */
6
+ export declare class DyNTS_RateLimit_InMemoryStore implements DyNTS_RateLimit_Store_Interface {
7
+ readonly storeKind: DyNTS_RateLimitStoreKind_Type;
8
+ private readonly records;
9
+ /** Consumes permit units with exact sliding-window semantics and no background cleanup task. */
10
+ consume(request: DyNTS_RateLimit_ConsumeRequest_Interface): Promise<DyNTS_RateLimit_ConsumeResult_Interface>;
11
+ /** Opportunistically removes expired local records when explicitly invoked by the host. */
12
+ cleanup(now: number): void;
13
+ /** Clears all local state for deterministic tests. */
14
+ reset(): void;
15
+ /** Returns only the aggregate local bucket count for diagnostics. */
16
+ getTrackedBucketCount(): number;
17
+ private assertRequest;
18
+ }
19
+ //# sourceMappingURL=rate-limit-in-memory.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-in-memory.store.d.ts","sourceRoot":"","sources":["../../../src/_modules/rate-limit/rate-limit-in-memory.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,wCAAwC,EAAE,MAAM,gDAAgD,CAAC;AAC1G,OAAO,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAC;AACxG,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAOvF,+FAA+F;AAC/F,qBAAa,6BAA8B,YAAW,+BAA+B;IACnF,SAAgB,SAAS,EAAE,6BAA6B,CAA0C;IAClG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoE;IAE5F,gGAAgG;IACnF,OAAO,CAClB,OAAO,EAAE,wCAAwC,GAChD,OAAO,CAAC,uCAAuC,CAAC;IA4BnD,2FAA2F;IACpF,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAgBjC,sDAAsD;IAC/C,KAAK,IAAI,IAAI;IAIpB,qEAAqE;IAC9D,qBAAqB,IAAI,MAAM;IAItC,OAAO,CAAC,aAAa;CAiBtB"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_RateLimit_InMemoryStore = void 0;
4
+ const rate_limit_store_kind_type_enum_1 = require("./_enums/rate-limit-store-kind.type-enum");
5
+ /** Deterministic single-process store for tests and explicitly single-instance development. */
6
+ class DyNTS_RateLimit_InMemoryStore {
7
+ storeKind = rate_limit_store_kind_type_enum_1.DyNTS_RateLimitStoreKind_Type.inMemory;
8
+ records = new Map();
9
+ /** Consumes permit units with exact sliding-window semantics and no background cleanup task. */
10
+ async consume(request) {
11
+ this.assertRequest(request);
12
+ const windowStart = request.now - request.policy.windowMs;
13
+ const existing = this.records.get(request.bucketKey);
14
+ const recent = (existing?.timestamps ?? []).filter((timestamp) => timestamp > windowStart);
15
+ const allowed = recent.length + request.cost <= request.policy.limit;
16
+ if (allowed) {
17
+ for (let index = 0; index < request.cost; index += 1) {
18
+ recent.push(request.now);
19
+ }
20
+ }
21
+ this.records.set(request.bucketKey, {
22
+ timestamps: recent,
23
+ windowMs: request.policy.windowMs,
24
+ });
25
+ return {
26
+ allowed: allowed,
27
+ remaining: Math.max(0, request.policy.limit - recent.length),
28
+ resetAt: (recent[0] ?? request.now) + request.policy.windowMs,
29
+ };
30
+ }
31
+ /** Opportunistically removes expired local records when explicitly invoked by the host. */
32
+ cleanup(now) {
33
+ for (const entry of this.records.entries()) {
34
+ const key = entry[0];
35
+ const record = entry[1];
36
+ const recent = record.timestamps.filter((timestamp) => timestamp > now - record.windowMs);
37
+ if (!recent.length) {
38
+ this.records.delete(key);
39
+ }
40
+ else {
41
+ this.records.set(key, { ...record, timestamps: recent });
42
+ }
43
+ }
44
+ }
45
+ /** Clears all local state for deterministic tests. */
46
+ reset() {
47
+ this.records.clear();
48
+ }
49
+ /** Returns only the aggregate local bucket count for diagnostics. */
50
+ getTrackedBucketCount() {
51
+ return this.records.size;
52
+ }
53
+ assertRequest(request) {
54
+ const isValid = Boolean(request.bucketKey.trim())
55
+ && request.bucketKey.length <= 512
56
+ && Number.isSafeInteger(request.now)
57
+ && request.now >= 0
58
+ && Number.isSafeInteger(request.cost)
59
+ && request.cost > 0
60
+ && Number.isSafeInteger(request.policy.limit)
61
+ && request.policy.limit > 0
62
+ && Number.isSafeInteger(request.policy.windowMs)
63
+ && request.policy.windowMs > 0
64
+ && request.cost <= request.policy.limit;
65
+ if (!isValid) {
66
+ throw new Error('DYNTS_RATE_LIMIT_STORE_REQUEST_INVALID');
67
+ }
68
+ }
69
+ }
70
+ exports.DyNTS_RateLimit_InMemoryStore = DyNTS_RateLimit_InMemoryStore;
71
+ //# sourceMappingURL=rate-limit-in-memory.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-in-memory.store.js","sourceRoot":"","sources":["../../../src/_modules/rate-limit/rate-limit-in-memory.store.ts"],"names":[],"mappings":"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"}
@@ -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 responseHeaders;
10
+ private isResponseHeadersEnabled;
11
+ private isSharedStoreRequired;
12
+ private isKeyExtractorExplicit;
13
+ private isEndpointGrouperExplicit;
49
14
  private keyExtractor;
50
15
  private endpointGrouper;
51
- /** request-log: storageKey → timestamp-tomb (Date.now() ms). */
52
- private requestLog;
53
- /** Per-kulcs egyedi policy-k. */
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
- /** GC timer handle. */
58
- private gcTimer;
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;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"}
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"}