limitly 1.0.2 → 3.0.0

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 (118) hide show
  1. package/README.md +471 -22
  2. package/dist/algorithms/concurrency.d.ts +11 -0
  3. package/dist/algorithms/concurrency.d.ts.map +1 -0
  4. package/dist/algorithms/concurrency.js +19 -0
  5. package/dist/algorithms/concurrency.js.map +1 -0
  6. package/dist/algorithms/factory.d.ts +3 -2
  7. package/dist/algorithms/factory.d.ts.map +1 -1
  8. package/dist/algorithms/factory.js +9 -3
  9. package/dist/algorithms/factory.js.map +1 -1
  10. package/dist/algorithms/gcra.d.ts +10 -0
  11. package/dist/algorithms/gcra.d.ts.map +1 -0
  12. package/dist/algorithms/gcra.js +15 -0
  13. package/dist/algorithms/gcra.js.map +1 -0
  14. package/dist/algorithms/sliding-window.d.ts +4 -4
  15. package/dist/algorithms/sliding-window.d.ts.map +1 -1
  16. package/dist/algorithms/sliding-window.js +3 -23
  17. package/dist/algorithms/sliding-window.js.map +1 -1
  18. package/dist/algorithms/token-bucket.d.ts +4 -4
  19. package/dist/algorithms/token-bucket.d.ts.map +1 -1
  20. package/dist/algorithms/token-bucket.js +3 -20
  21. package/dist/algorithms/token-bucket.js.map +1 -1
  22. package/dist/index.d.ts +19 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +46 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/limiter.d.ts +23 -7
  27. package/dist/limiter.d.ts.map +1 -1
  28. package/dist/limiter.js +86 -16
  29. package/dist/limiter.js.map +1 -1
  30. package/dist/middleware/bun.d.ts +9 -0
  31. package/dist/middleware/bun.d.ts.map +1 -0
  32. package/dist/middleware/bun.js +107 -0
  33. package/dist/middleware/bun.js.map +1 -0
  34. package/dist/middleware/express.d.ts.map +1 -1
  35. package/dist/middleware/express.js +30 -14
  36. package/dist/middleware/express.js.map +1 -1
  37. package/dist/middleware/fastify.d.ts +3 -3
  38. package/dist/middleware/fastify.d.ts.map +1 -1
  39. package/dist/middleware/fastify.js +34 -17
  40. package/dist/middleware/fastify.js.map +1 -1
  41. package/dist/middleware/hono.d.ts +5 -0
  42. package/dist/middleware/hono.d.ts.map +1 -0
  43. package/dist/middleware/hono.js +71 -0
  44. package/dist/middleware/hono.js.map +1 -0
  45. package/dist/middleware/koa.d.ts +5 -0
  46. package/dist/middleware/koa.d.ts.map +1 -0
  47. package/dist/middleware/koa.js +65 -0
  48. package/dist/middleware/koa.js.map +1 -0
  49. package/dist/middleware/nest.d.ts +14 -0
  50. package/dist/middleware/nest.d.ts.map +1 -0
  51. package/dist/middleware/nest.js +112 -0
  52. package/dist/middleware/nest.js.map +1 -0
  53. package/dist/observability/index.d.ts +4 -0
  54. package/dist/observability/index.d.ts.map +1 -0
  55. package/dist/observability/index.js +10 -0
  56. package/dist/observability/index.js.map +1 -0
  57. package/dist/observability/opentelemetry.d.ts +28 -0
  58. package/dist/observability/opentelemetry.d.ts.map +1 -0
  59. package/dist/observability/opentelemetry.js +85 -0
  60. package/dist/observability/opentelemetry.js.map +1 -0
  61. package/dist/observability/prometheus.d.ts +27 -0
  62. package/dist/observability/prometheus.d.ts.map +1 -0
  63. package/dist/observability/prometheus.js +88 -0
  64. package/dist/observability/prometheus.js.map +1 -0
  65. package/dist/observability/types.d.ts +9 -0
  66. package/dist/observability/types.d.ts.map +1 -0
  67. package/dist/observability/types.js +3 -0
  68. package/dist/observability/types.js.map +1 -0
  69. package/dist/prometheus.d.ts +3 -0
  70. package/dist/prometheus.d.ts.map +1 -0
  71. package/dist/prometheus.js +9 -0
  72. package/dist/prometheus.js.map +1 -0
  73. package/dist/scripts/concurrencyAcquire.lua +34 -0
  74. package/dist/scripts/concurrencyRelease.lua +9 -0
  75. package/dist/scripts/gcra.lua +38 -0
  76. package/dist/stores/factory.d.ts +5 -0
  77. package/dist/stores/factory.d.ts.map +1 -0
  78. package/dist/stores/factory.js +40 -0
  79. package/dist/stores/factory.js.map +1 -0
  80. package/dist/stores/memcached-store.d.ts +16 -0
  81. package/dist/stores/memcached-store.d.ts.map +1 -0
  82. package/dist/stores/memcached-store.js +211 -0
  83. package/dist/stores/memcached-store.js.map +1 -0
  84. package/dist/stores/redis-store.d.ts +19 -0
  85. package/dist/stores/redis-store.d.ts.map +1 -0
  86. package/dist/stores/redis-store.js +97 -0
  87. package/dist/stores/redis-store.js.map +1 -0
  88. package/dist/stores/types.d.ts +11 -0
  89. package/dist/stores/types.d.ts.map +1 -0
  90. package/dist/stores/types.js +3 -0
  91. package/dist/stores/types.js.map +1 -0
  92. package/dist/types/index.d.ts +94 -5
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/utils/defaults.d.ts +8 -0
  95. package/dist/utils/defaults.d.ts.map +1 -0
  96. package/dist/utils/defaults.js +100 -0
  97. package/dist/utils/defaults.js.map +1 -0
  98. package/dist/utils/limit-execution.d.ts +40 -0
  99. package/dist/utils/limit-execution.d.ts.map +1 -0
  100. package/dist/utils/limit-execution.js +50 -0
  101. package/dist/utils/limit-execution.js.map +1 -0
  102. package/dist/utils/memcached.d.ts +12 -0
  103. package/dist/utils/memcached.d.ts.map +1 -0
  104. package/dist/utils/memcached.js +103 -0
  105. package/dist/utils/memcached.js.map +1 -0
  106. package/dist/utils/metrics.d.ts +21 -0
  107. package/dist/utils/metrics.d.ts.map +1 -0
  108. package/dist/utils/metrics.js +99 -0
  109. package/dist/utils/metrics.js.map +1 -0
  110. package/dist/utils/redis.d.ts +5 -1
  111. package/dist/utils/redis.d.ts.map +1 -1
  112. package/dist/utils/redis.js +38 -3
  113. package/dist/utils/redis.js.map +1 -1
  114. package/dist/utils/scripts.d.ts +16 -2
  115. package/dist/utils/scripts.d.ts.map +1 -1
  116. package/dist/utils/scripts.js +79 -33
  117. package/dist/utils/scripts.js.map +1 -1
  118. package/package.json +86 -3
@@ -1,10 +1,10 @@
1
- import type { RateLimitResult, RateLimitStrategy, RedisClient, SlidingWindowConfig } from "../types";
1
+ import type { RateLimitResult, RateLimitStrategy, SlidingWindowConfig } from "../types";
2
+ import type { RateLimitStore } from "../stores/types";
2
3
  export declare class SlidingWindowStrategy implements RateLimitStrategy {
3
- private readonly redis;
4
+ private readonly store;
4
5
  private readonly limit;
5
6
  private readonly window;
6
- private readonly keyPrefix;
7
- constructor(redis: RedisClient, config: SlidingWindowConfig, keyPrefix?: string);
7
+ constructor(store: RateLimitStore, config: SlidingWindowConfig);
8
8
  consume(key: string): Promise<RateLimitResult>;
9
9
  }
10
10
  //# sourceMappingURL=sliding-window.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sliding-window.d.ts","sourceRoot":"","sources":["../../src/algorithms/sliding-window.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAIlB,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,mBAAmB,EAC3B,SAAS,SAAe;IAQpB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAsBrD"}
1
+ {"version":3,"file":"sliding-window.d.ts","sourceRoot":"","sources":["../../src/algorithms/sliding-window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,mBAAmB;IAMxD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAGrD"}
@@ -1,34 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SlidingWindowStrategy = void 0;
4
- const crypto_1 = require("crypto");
5
- const redis_1 = require("../utils/redis");
6
- const scripts_1 = require("../utils/scripts");
7
4
  class SlidingWindowStrategy {
8
- constructor(redis, config, keyPrefix = "redislimit") {
9
- this.redis = redis;
5
+ constructor(store, config) {
6
+ this.store = store;
10
7
  this.limit = config.limit;
11
8
  this.window = config.window;
12
- this.keyPrefix = keyPrefix;
13
9
  }
14
10
  async consume(key) {
15
- const redisKey = (0, redis_1.buildKey)(this.keyPrefix, `sw:${key}`);
16
- const now = Date.now();
17
- const requestId = (0, crypto_1.randomUUID)();
18
- const result = await (0, scripts_1.evalScript)(this.redis, "sliding", [redisKey], [
19
- this.limit,
20
- this.window,
21
- now,
22
- requestId,
23
- ]);
24
- const parsed = (0, scripts_1.parseScriptResult)(result);
25
- return {
26
- allowed: parsed.allowed,
27
- limit: parsed.limit,
28
- remaining: parsed.remaining,
29
- reset: parsed.reset,
30
- retryAfter: parsed.retryAfter || undefined,
31
- };
11
+ return this.store.slidingWindow(key, this.limit, this.window);
32
12
  }
33
13
  }
34
14
  exports.SlidingWindowStrategy = SlidingWindowStrategy;
@@ -1 +1 @@
1
- {"version":3,"file":"sliding-window.js","sourceRoot":"","sources":["../../src/algorithms/sliding-window.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAOpC,0CAA0C;AAC1C,8CAAiE;AAEjE,MAAa,qBAAqB;IAMhC,YACE,KAAkB,EAClB,MAA2B,EAC3B,SAAS,GAAG,YAAY;QAExB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,QAAQ,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;YACjE,IAAI,CAAC,KAAK;YACV,IAAI,CAAC,MAAM;YACX,GAAG;YACH,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAA,2BAAiB,EAAC,MAAM,CAAC,CAAC;QAEzC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;SAC3C,CAAC;IACJ,CAAC;CACF;AAvCD,sDAuCC"}
1
+ {"version":3,"file":"sliding-window.js","sourceRoot":"","sources":["../../src/algorithms/sliding-window.ts"],"names":[],"mappings":";;;AAOA,MAAa,qBAAqB;IAKhC,YAAY,KAAqB,EAAE,MAA2B;QAC5D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;CACF;AAdD,sDAcC"}
@@ -1,10 +1,10 @@
1
- import type { RateLimitResult, RateLimitStrategy, RedisClient, TokenBucketConfig } from "../types";
1
+ import type { RateLimitResult, RateLimitStrategy, TokenBucketConfig } from "../types";
2
+ import type { RateLimitStore } from "../stores/types";
2
3
  export declare class TokenBucketStrategy implements RateLimitStrategy {
3
- private readonly redis;
4
+ private readonly store;
4
5
  private readonly capacity;
5
6
  private readonly refillRate;
6
- private readonly keyPrefix;
7
- constructor(redis: RedisClient, config: TokenBucketConfig, keyPrefix?: string);
7
+ constructor(store: RateLimitStore, config: TokenBucketConfig);
8
8
  consume(key: string): Promise<RateLimitResult>;
9
9
  }
10
10
  //# sourceMappingURL=token-bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-bucket.d.ts","sourceRoot":"","sources":["../../src/algorithms/token-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,iBAAiB,EACzB,SAAS,SAAe;IAQpB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAoBrD"}
1
+ {"version":3,"file":"token-bucket.d.ts","sourceRoot":"","sources":["../../src/algorithms/token-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAa,mBAAoB,YAAW,iBAAiB;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB;IAMtD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAGrD"}
@@ -1,31 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TokenBucketStrategy = void 0;
4
- const redis_1 = require("../utils/redis");
5
- const scripts_1 = require("../utils/scripts");
6
4
  class TokenBucketStrategy {
7
- constructor(redis, config, keyPrefix = "redislimit") {
8
- this.redis = redis;
5
+ constructor(store, config) {
6
+ this.store = store;
9
7
  this.capacity = config.capacity;
10
8
  this.refillRate = config.refillRate;
11
- this.keyPrefix = keyPrefix;
12
9
  }
13
10
  async consume(key) {
14
- const redisKey = (0, redis_1.buildKey)(this.keyPrefix, `tb:${key}`);
15
- const now = Date.now();
16
- const result = await (0, scripts_1.evalScript)(this.redis, "token", [redisKey], [
17
- this.capacity,
18
- this.refillRate,
19
- now,
20
- ]);
21
- const parsed = (0, scripts_1.parseScriptResult)(result);
22
- return {
23
- allowed: parsed.allowed,
24
- limit: parsed.limit,
25
- remaining: parsed.remaining,
26
- reset: parsed.reset,
27
- retryAfter: parsed.retryAfter || undefined,
28
- };
11
+ return this.store.tokenBucket(key, this.capacity, this.refillRate);
29
12
  }
30
13
  }
31
14
  exports.TokenBucketStrategy = TokenBucketStrategy;
@@ -1 +1 @@
1
- {"version":3,"file":"token-bucket.js","sourceRoot":"","sources":["../../src/algorithms/token-bucket.ts"],"names":[],"mappings":";;;AAMA,0CAA0C;AAC1C,8CAAiE;AAEjE,MAAa,mBAAmB;IAM9B,YACE,KAAkB,EAClB,MAAyB,EACzB,SAAS,GAAG,YAAY;QAExB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,QAAQ,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAU,EAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;YAC/D,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,UAAU;YACf,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAA,2BAAiB,EAAC,MAAM,CAAC,CAAC;QAEzC,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;SAC3C,CAAC;IACJ,CAAC;CACF;AArCD,kDAqCC"}
1
+ {"version":3,"file":"token-bucket.js","sourceRoot":"","sources":["../../src/algorithms/token-bucket.ts"],"names":[],"mappings":";;;AAOA,MAAa,mBAAmB;IAK9B,YAAY,KAAqB,EAAE,MAAyB;QAC1D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC;CACF;AAdD,kDAcC"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,26 @@
1
1
  export { RedisLimit, createLimiter } from "./limiter";
2
2
  export { createExpressMiddleware } from "./middleware/express";
3
3
  export { createFastifyPlugin, redisLimitPlugin } from "./middleware/fastify";
4
+ export { createHonoMiddleware } from "./middleware/hono";
5
+ export { createKoaMiddleware } from "./middleware/koa";
6
+ export { applyRateLimitHeaders, composeBunHandler, createBunMiddleware, jsonResponse, } from "./middleware/bun";
7
+ export type { BunMiddleware, BunNext } from "./middleware/bun";
8
+ export { createNestGuard, limitlyNestModule, LimitlyModule, RateLimit, RATE_LIMIT_KEY, } from "./middleware/nest";
9
+ export type { NestRateLimitOptions } from "./middleware/nest";
10
+ export { ConcurrencyStrategy } from "./algorithms/concurrency";
11
+ export { GcraStrategy } from "./algorithms/gcra";
4
12
  export { SlidingWindowStrategy } from "./algorithms/sliding-window";
5
13
  export { TokenBucketStrategy } from "./algorithms/token-bucket";
6
14
  export type { RateLimitStrategy } from "./algorithms/strategy";
7
- export type { AlgorithmConfig, BaseMiddlewareOptions, MiddlewareOptions, RateLimitHeaders, RateLimitResult, RedisClient, RedisConfig, RedisLimitOptions, SlidingWindowConfig, TokenBucketConfig, } from "./types";
15
+ export { DEFAULT_CLUSTER_OPTIONS, DEFAULT_KEY_PREFIX, buildKey, createRedisClient, isRedisCluster, } from "./utils/redis";
16
+ export { getClusterScriptDefinitions, registerRedisScripts, warmupRedisScripts, } from "./utils/scripts";
17
+ export { DEFAULT_CONCURRENCY, DEFAULT_GCRA, DEFAULT_SLIDING_WINDOW, DEFAULT_TOKEN_BUCKET, resolveAlgorithmConfig, resolveMiddlewareOptions, } from "./utils/defaults";
18
+ export { consumeRateLimit } from "./utils/metrics";
19
+ export type { RateLimitCheckOutcome } from "./utils/metrics";
20
+ export type { RateLimitSpan, RateLimitTracer } from "./observability/types";
21
+ export { createStore, resolveStoreType } from "./stores/factory";
22
+ export { RedisStore } from "./stores/redis-store";
23
+ export { MemcachedStore } from "./stores/memcached-store";
24
+ export type { RateLimitStore, StoreType } from "./stores/types";
25
+ export type { AlgorithmConfig, ConcurrencyConfig, GcraConfig, BaseMiddlewareOptions, MemcachedClient, MemcachedConfig, MemcachedOptions, MiddlewareOptions, MiddlewareOptionsInput, RateLimitHeaders, RateLimitMetricsEvent, RateLimitMetricsHook, RateLimitResult, RedisClient, RedisClusterConfig, RedisConfig, RedisLimitOptions, SlidingWindowConfig, TokenBucketConfig, } from "./types";
8
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,EACjB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TokenBucketStrategy = exports.SlidingWindowStrategy = exports.redisLimitPlugin = exports.createFastifyPlugin = exports.createExpressMiddleware = exports.createLimiter = exports.RedisLimit = void 0;
3
+ exports.MemcachedStore = exports.RedisStore = exports.resolveStoreType = exports.createStore = exports.consumeRateLimit = exports.resolveMiddlewareOptions = exports.resolveAlgorithmConfig = exports.DEFAULT_TOKEN_BUCKET = exports.DEFAULT_SLIDING_WINDOW = exports.DEFAULT_GCRA = exports.DEFAULT_CONCURRENCY = exports.warmupRedisScripts = exports.registerRedisScripts = exports.getClusterScriptDefinitions = exports.isRedisCluster = exports.createRedisClient = exports.buildKey = exports.DEFAULT_KEY_PREFIX = exports.DEFAULT_CLUSTER_OPTIONS = exports.TokenBucketStrategy = exports.SlidingWindowStrategy = exports.GcraStrategy = exports.ConcurrencyStrategy = exports.RATE_LIMIT_KEY = exports.RateLimit = exports.LimitlyModule = exports.limitlyNestModule = exports.createNestGuard = exports.jsonResponse = exports.createBunMiddleware = exports.composeBunHandler = exports.applyRateLimitHeaders = exports.createKoaMiddleware = exports.createHonoMiddleware = exports.redisLimitPlugin = exports.createFastifyPlugin = exports.createExpressMiddleware = exports.createLimiter = exports.RedisLimit = void 0;
4
4
  var limiter_1 = require("./limiter");
5
5
  Object.defineProperty(exports, "RedisLimit", { enumerable: true, get: function () { return limiter_1.RedisLimit; } });
6
6
  Object.defineProperty(exports, "createLimiter", { enumerable: true, get: function () { return limiter_1.createLimiter; } });
@@ -9,8 +9,53 @@ Object.defineProperty(exports, "createExpressMiddleware", { enumerable: true, ge
9
9
  var fastify_1 = require("./middleware/fastify");
10
10
  Object.defineProperty(exports, "createFastifyPlugin", { enumerable: true, get: function () { return fastify_1.createFastifyPlugin; } });
11
11
  Object.defineProperty(exports, "redisLimitPlugin", { enumerable: true, get: function () { return fastify_1.redisLimitPlugin; } });
12
+ var hono_1 = require("./middleware/hono");
13
+ Object.defineProperty(exports, "createHonoMiddleware", { enumerable: true, get: function () { return hono_1.createHonoMiddleware; } });
14
+ var koa_1 = require("./middleware/koa");
15
+ Object.defineProperty(exports, "createKoaMiddleware", { enumerable: true, get: function () { return koa_1.createKoaMiddleware; } });
16
+ var bun_1 = require("./middleware/bun");
17
+ Object.defineProperty(exports, "applyRateLimitHeaders", { enumerable: true, get: function () { return bun_1.applyRateLimitHeaders; } });
18
+ Object.defineProperty(exports, "composeBunHandler", { enumerable: true, get: function () { return bun_1.composeBunHandler; } });
19
+ Object.defineProperty(exports, "createBunMiddleware", { enumerable: true, get: function () { return bun_1.createBunMiddleware; } });
20
+ Object.defineProperty(exports, "jsonResponse", { enumerable: true, get: function () { return bun_1.jsonResponse; } });
21
+ var nest_1 = require("./middleware/nest");
22
+ Object.defineProperty(exports, "createNestGuard", { enumerable: true, get: function () { return nest_1.createNestGuard; } });
23
+ Object.defineProperty(exports, "limitlyNestModule", { enumerable: true, get: function () { return nest_1.limitlyNestModule; } });
24
+ Object.defineProperty(exports, "LimitlyModule", { enumerable: true, get: function () { return nest_1.LimitlyModule; } });
25
+ Object.defineProperty(exports, "RateLimit", { enumerable: true, get: function () { return nest_1.RateLimit; } });
26
+ Object.defineProperty(exports, "RATE_LIMIT_KEY", { enumerable: true, get: function () { return nest_1.RATE_LIMIT_KEY; } });
27
+ var concurrency_1 = require("./algorithms/concurrency");
28
+ Object.defineProperty(exports, "ConcurrencyStrategy", { enumerable: true, get: function () { return concurrency_1.ConcurrencyStrategy; } });
29
+ var gcra_1 = require("./algorithms/gcra");
30
+ Object.defineProperty(exports, "GcraStrategy", { enumerable: true, get: function () { return gcra_1.GcraStrategy; } });
12
31
  var sliding_window_1 = require("./algorithms/sliding-window");
13
32
  Object.defineProperty(exports, "SlidingWindowStrategy", { enumerable: true, get: function () { return sliding_window_1.SlidingWindowStrategy; } });
14
33
  var token_bucket_1 = require("./algorithms/token-bucket");
15
34
  Object.defineProperty(exports, "TokenBucketStrategy", { enumerable: true, get: function () { return token_bucket_1.TokenBucketStrategy; } });
35
+ var redis_1 = require("./utils/redis");
36
+ Object.defineProperty(exports, "DEFAULT_CLUSTER_OPTIONS", { enumerable: true, get: function () { return redis_1.DEFAULT_CLUSTER_OPTIONS; } });
37
+ Object.defineProperty(exports, "DEFAULT_KEY_PREFIX", { enumerable: true, get: function () { return redis_1.DEFAULT_KEY_PREFIX; } });
38
+ Object.defineProperty(exports, "buildKey", { enumerable: true, get: function () { return redis_1.buildKey; } });
39
+ Object.defineProperty(exports, "createRedisClient", { enumerable: true, get: function () { return redis_1.createRedisClient; } });
40
+ Object.defineProperty(exports, "isRedisCluster", { enumerable: true, get: function () { return redis_1.isRedisCluster; } });
41
+ var scripts_1 = require("./utils/scripts");
42
+ Object.defineProperty(exports, "getClusterScriptDefinitions", { enumerable: true, get: function () { return scripts_1.getClusterScriptDefinitions; } });
43
+ Object.defineProperty(exports, "registerRedisScripts", { enumerable: true, get: function () { return scripts_1.registerRedisScripts; } });
44
+ Object.defineProperty(exports, "warmupRedisScripts", { enumerable: true, get: function () { return scripts_1.warmupRedisScripts; } });
45
+ var defaults_1 = require("./utils/defaults");
46
+ Object.defineProperty(exports, "DEFAULT_CONCURRENCY", { enumerable: true, get: function () { return defaults_1.DEFAULT_CONCURRENCY; } });
47
+ Object.defineProperty(exports, "DEFAULT_GCRA", { enumerable: true, get: function () { return defaults_1.DEFAULT_GCRA; } });
48
+ Object.defineProperty(exports, "DEFAULT_SLIDING_WINDOW", { enumerable: true, get: function () { return defaults_1.DEFAULT_SLIDING_WINDOW; } });
49
+ Object.defineProperty(exports, "DEFAULT_TOKEN_BUCKET", { enumerable: true, get: function () { return defaults_1.DEFAULT_TOKEN_BUCKET; } });
50
+ Object.defineProperty(exports, "resolveAlgorithmConfig", { enumerable: true, get: function () { return defaults_1.resolveAlgorithmConfig; } });
51
+ Object.defineProperty(exports, "resolveMiddlewareOptions", { enumerable: true, get: function () { return defaults_1.resolveMiddlewareOptions; } });
52
+ var metrics_1 = require("./utils/metrics");
53
+ Object.defineProperty(exports, "consumeRateLimit", { enumerable: true, get: function () { return metrics_1.consumeRateLimit; } });
54
+ var factory_1 = require("./stores/factory");
55
+ Object.defineProperty(exports, "createStore", { enumerable: true, get: function () { return factory_1.createStore; } });
56
+ Object.defineProperty(exports, "resolveStoreType", { enumerable: true, get: function () { return factory_1.resolveStoreType; } });
57
+ var redis_store_1 = require("./stores/redis-store");
58
+ Object.defineProperty(exports, "RedisStore", { enumerable: true, get: function () { return redis_store_1.RedisStore; } });
59
+ var memcached_store_1 = require("./stores/memcached-store");
60
+ Object.defineProperty(exports, "MemcachedStore", { enumerable: true, get: function () { return memcached_store_1.MemcachedStore; } });
16
61
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAsD;AAA7C,qGAAA,UAAU,OAAA;AAAE,wGAAA,aAAa,OAAA;AAClC,gDAA+D;AAAtD,kHAAA,uBAAuB,OAAA;AAChC,gDAA6E;AAApE,8GAAA,mBAAmB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC9C,8DAAoE;AAA3D,uHAAA,qBAAqB,OAAA;AAC9B,0DAAgE;AAAvD,mHAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qCAAsD;AAA7C,qGAAA,UAAU,OAAA;AAAE,wGAAA,aAAa,OAAA;AAClC,gDAA+D;AAAtD,kHAAA,uBAAuB,OAAA;AAChC,gDAA6E;AAApE,8GAAA,mBAAmB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC9C,0CAAyD;AAAhD,4GAAA,oBAAoB,OAAA;AAC7B,wCAAuD;AAA9C,0GAAA,mBAAmB,OAAA;AAC5B,wCAK0B;AAJxB,4GAAA,qBAAqB,OAAA;AACrB,wGAAA,iBAAiB,OAAA;AACjB,0GAAA,mBAAmB,OAAA;AACnB,mGAAA,YAAY,OAAA;AAGd,0CAM2B;AALzB,uGAAA,eAAe,OAAA;AACf,yGAAA,iBAAiB,OAAA;AACjB,qGAAA,aAAa,OAAA;AACb,iGAAA,SAAS,OAAA;AACT,sGAAA,cAAc,OAAA;AAGhB,wDAA+D;AAAtD,kHAAA,mBAAmB,OAAA;AAC5B,0CAAiD;AAAxC,oGAAA,YAAY,OAAA;AACrB,8DAAoE;AAA3D,uHAAA,qBAAqB,OAAA;AAC9B,0DAAgE;AAAvD,mHAAA,mBAAmB,OAAA;AAE5B,uCAMuB;AALrB,gHAAA,uBAAuB,OAAA;AACvB,2GAAA,kBAAkB,OAAA;AAClB,iGAAA,QAAQ,OAAA;AACR,0GAAA,iBAAiB,OAAA;AACjB,uGAAA,cAAc,OAAA;AAEhB,2CAIyB;AAHvB,sHAAA,2BAA2B,OAAA;AAC3B,+GAAA,oBAAoB,OAAA;AACpB,6GAAA,kBAAkB,OAAA;AAEpB,6CAO0B;AANxB,+GAAA,mBAAmB,OAAA;AACnB,wGAAA,YAAY,OAAA;AACZ,kHAAA,sBAAsB,OAAA;AACtB,gHAAA,oBAAoB,OAAA;AACpB,kHAAA,sBAAsB,OAAA;AACtB,oHAAA,wBAAwB,OAAA;AAE1B,2CAAmD;AAA1C,2GAAA,gBAAgB,OAAA;AAGzB,4CAAiE;AAAxD,sGAAA,WAAW,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AACtC,oDAAkD;AAAzC,yGAAA,UAAU,OAAA;AACnB,4DAA0D;AAAjD,iHAAA,cAAc,OAAA"}
package/dist/limiter.d.ts CHANGED
@@ -1,19 +1,35 @@
1
+ import type { RateLimitStore } from "./stores/types";
1
2
  import type { FastifyPluginAsync } from "fastify";
2
- import type { AlgorithmConfig, MiddlewareOptions, RateLimitResult, RateLimitStrategy, RedisClient, RedisLimitOptions } from "./types";
3
+ import type { CanActivate, Type } from "@nestjs/common";
4
+ import type { AlgorithmConfig, MemcachedClient, MiddlewareOptions, MiddlewareOptionsInput, RateLimitResult, RateLimitStrategy, RedisClient, RedisLimitOptions } from "./types";
3
5
  export declare class RedisLimit {
4
- private readonly redis;
6
+ private readonly store;
5
7
  private readonly failOpen;
6
- private readonly keyPrefix;
8
+ private readonly defaultOptions;
7
9
  constructor(options: RedisLimitOptions);
10
+ getStore(): RateLimitStore;
11
+ getStoreType(): RateLimitStore["type"];
12
+ getDefaultOptions(): MiddlewareOptionsInput;
13
+ resolveOptions(options?: MiddlewareOptionsInput): MiddlewareOptions;
8
14
  getRedis(): RedisClient;
15
+ getMemcached(): MemcachedClient;
9
16
  createStrategy(config: AlgorithmConfig): RateLimitStrategy;
10
- check(key: string, config: AlgorithmConfig, options?: {
17
+ createStrategyFromOptions(options?: MiddlewareOptionsInput): RateLimitStrategy;
18
+ acquire(key: string, config?: MiddlewareOptionsInput, options?: {
11
19
  failOpen?: boolean;
12
20
  }): Promise<RateLimitResult>;
13
- middleware(options: MiddlewareOptions): (req: import("express").Request, res: import("express").Response, next: import("express").NextFunction) => Promise<void>;
14
- get fastifyPlugin(): FastifyPluginAsync<MiddlewareOptions>;
21
+ release(key: string, slotId: string, config?: MiddlewareOptionsInput): Promise<void>;
22
+ check(key: string, config?: MiddlewareOptionsInput, options?: {
23
+ failOpen?: boolean;
24
+ }): Promise<RateLimitResult>;
25
+ middleware(options?: MiddlewareOptionsInput): (req: import("express").Request, res: import("express").Response, next: import("express").NextFunction) => Promise<void>;
26
+ honoMiddleware(options?: MiddlewareOptionsInput): (c: import("hono").Context, next: import("hono").Next) => Promise<Response | void>;
27
+ koaMiddleware(options?: MiddlewareOptionsInput): (ctx: import("koa").Context, next: import("koa").Next) => Promise<void>;
28
+ bunMiddleware(options?: MiddlewareOptionsInput): import("./middleware/bun").BunMiddleware;
29
+ get fastifyPlugin(): FastifyPluginAsync<MiddlewareOptionsInput>;
30
+ nestGuard(defaultOptions?: MiddlewareOptionsInput): Type<CanActivate>;
15
31
  private createFailOpenResult;
16
32
  }
17
33
  export declare function createLimiter(options: RedisLimitOptions): RedisLimit;
18
- export type { MiddlewareOptions };
34
+ export type { MiddlewareOptions, MiddlewareOptionsInput };
19
35
  //# sourceMappingURL=limiter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"limiter.d.ts","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAGjB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,iBAAiB;IAMtC,QAAQ,IAAI,WAAW;IAIvB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB;IAIpD,KAAK,CACT,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,eAAe,CAAC;IAc3B,UAAU,CAAC,OAAO,EAAE,iBAAiB;IAIrC,IAAI,aAAa,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAEzD;IAED,OAAO,CAAC,oBAAoB;CAW7B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAEpE;AAED,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"limiter.d.ts","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;gBAE5C,OAAO,EAAE,iBAAiB;IAUtC,QAAQ,IAAI,cAAc;IAI1B,YAAY,IAAI,cAAc,CAAC,MAAM,CAAC;IAItC,iBAAiB,IAAI,sBAAsB;IAI3C,cAAc,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB;IAIvE,QAAQ,IAAI,WAAW;IASvB,YAAY,IAAI,eAAe;IAS/B,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB;IAI1D,yBAAyB,CACvB,OAAO,GAAE,sBAA2B,GACnC,iBAAiB;IAOd,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,sBAA2B,EACnC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,eAAe,CAAC;IAIrB,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,sBAA2B,GAClC,OAAO,CAAC,IAAI,CAAC;IAgBV,KAAK,CACT,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,sBAA2B,EACnC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,eAAe,CAAC;IAwB3B,UAAU,CAAC,OAAO,GAAE,sBAA2B;IAI/C,cAAc,CAAC,OAAO,GAAE,sBAA2B;IAInD,aAAa,CAAC,OAAO,GAAE,sBAA2B;IAIlD,aAAa,CAAC,OAAO,GAAE,sBAA2B;IAIlD,IAAI,aAAa,IAAI,kBAAkB,CAAC,sBAAsB,CAAC,CAE9D;IAED,SAAS,CAAC,cAAc,GAAE,sBAA2B,GAAG,IAAI,CAAC,WAAW,CAAC;IAIzE,OAAO,CAAC,oBAAoB;CAe7B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAEpE;AAED,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,CAAC"}
package/dist/limiter.js CHANGED
@@ -5,40 +5,110 @@ exports.createLimiter = createLimiter;
5
5
  const factory_1 = require("./algorithms/factory");
6
6
  const express_1 = require("./middleware/express");
7
7
  const fastify_1 = require("./middleware/fastify");
8
- const redis_1 = require("./utils/redis");
8
+ const hono_1 = require("./middleware/hono");
9
+ const bun_1 = require("./middleware/bun");
10
+ const koa_1 = require("./middleware/koa");
11
+ const nest_1 = require("./middleware/nest");
12
+ const factory_2 = require("./stores/factory");
13
+ const defaults_1 = require("./utils/defaults");
14
+ const metrics_1 = require("./utils/metrics");
9
15
  class RedisLimit {
10
16
  constructor(options) {
11
- this.redis = (0, redis_1.createRedisClient)(options.redis);
17
+ this.store = (0, factory_2.createStore)(options);
12
18
  this.failOpen = options.failOpen ?? true;
13
- this.keyPrefix = options.keyPrefix ?? "redislimit";
19
+ this.defaultOptions = {
20
+ onMetrics: options.onMetrics,
21
+ tracer: options.tracer,
22
+ ...options.default,
23
+ };
24
+ }
25
+ getStore() {
26
+ return this.store;
27
+ }
28
+ getStoreType() {
29
+ return this.store.type;
30
+ }
31
+ getDefaultOptions() {
32
+ return this.defaultOptions;
33
+ }
34
+ resolveOptions(options = {}) {
35
+ return (0, defaults_1.resolveMiddlewareOptions)(options, this.defaultOptions);
14
36
  }
15
37
  getRedis() {
16
- return this.redis;
38
+ if (this.store.type === "memcached") {
39
+ throw new Error(`getRedis() is not available when using the "${this.store.type}" store`);
40
+ }
41
+ return this.store.getClient();
42
+ }
43
+ getMemcached() {
44
+ if (this.store.type !== "memcached") {
45
+ throw new Error(`getMemcached() is only available when using the "memcached" store`);
46
+ }
47
+ return this.store.getClient();
17
48
  }
18
49
  createStrategy(config) {
19
- return (0, factory_1.createStrategy)(this.redis, config, this.keyPrefix);
50
+ return (0, factory_1.createStrategy)(this.store, config);
20
51
  }
21
- async check(key, config, options) {
22
- const strategy = this.createStrategy(config);
23
- const shouldFailOpen = options?.failOpen ?? this.failOpen;
24
- try {
25
- return await strategy.consume(key);
52
+ createStrategyFromOptions(options = {}) {
53
+ return (0, factory_1.createStrategy)(this.store, (0, defaults_1.resolveAlgorithmConfig)(options, this.defaultOptions));
54
+ }
55
+ async acquire(key, config = {}, options) {
56
+ return this.check(key, config, options);
57
+ }
58
+ async release(key, slotId, config = {}) {
59
+ const resolved = this.resolveOptions(config);
60
+ if (resolved.algorithm !== "concurrency") {
61
+ throw new Error('release() requires algorithm: "concurrency"');
62
+ }
63
+ const strategy = this.createStrategy((0, defaults_1.resolveAlgorithmConfig)(config, this.defaultOptions));
64
+ if (!strategy.release) {
65
+ throw new Error("Configured strategy does not support release()");
26
66
  }
27
- catch (error) {
67
+ await strategy.release(key, slotId);
68
+ }
69
+ async check(key, config = {}, options) {
70
+ const resolved = this.resolveOptions(config);
71
+ const strategy = this.createStrategy((0, defaults_1.resolveAlgorithmConfig)(config, this.defaultOptions));
72
+ const shouldFailOpen = options?.failOpen ?? this.failOpen;
73
+ const outcome = await (0, metrics_1.consumeRateLimit)({
74
+ strategy,
75
+ key,
76
+ options: resolved,
77
+ failOpen: shouldFailOpen,
78
+ storeType: this.store.type,
79
+ });
80
+ if (outcome.status === "error") {
28
81
  if (shouldFailOpen) {
29
- return this.createFailOpenResult(config);
82
+ return this.createFailOpenResult(resolved);
30
83
  }
31
- throw error;
84
+ throw outcome.error;
32
85
  }
86
+ return outcome.result;
33
87
  }
34
- middleware(options) {
35
- return (0, express_1.createExpressMiddleware)(this)(options);
88
+ middleware(options = {}) {
89
+ return (0, express_1.createExpressMiddleware)(this)(this.resolveOptions(options));
90
+ }
91
+ honoMiddleware(options = {}) {
92
+ return (0, hono_1.createHonoMiddleware)(this)(this.resolveOptions(options));
93
+ }
94
+ koaMiddleware(options = {}) {
95
+ return (0, koa_1.createKoaMiddleware)(this)(this.resolveOptions(options));
96
+ }
97
+ bunMiddleware(options = {}) {
98
+ return (0, bun_1.createBunMiddleware)(this)(this.resolveOptions(options));
36
99
  }
37
100
  get fastifyPlugin() {
38
101
  return (0, fastify_1.createFastifyPlugin)(this);
39
102
  }
103
+ nestGuard(defaultOptions = {}) {
104
+ return (0, nest_1.createNestGuard)(this)(defaultOptions);
105
+ }
40
106
  createFailOpenResult(config) {
41
- const limit = config.algorithm === "sliding-window" ? config.limit : config.capacity;
107
+ const limit = config.algorithm === "sliding-window" ||
108
+ config.algorithm === "concurrency" ||
109
+ config.algorithm === "gcra"
110
+ ? config.limit
111
+ : config.capacity;
42
112
  return {
43
113
  allowed: true,
44
114
  limit,
@@ -1 +1 @@
1
- {"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":";;;AAwEA,sCAEC;AA1ED,kDAAsD;AACtD,kDAA+D;AAC/D,kDAA2D;AAU3D,yCAAkD;AAElD,MAAa,UAAU;IAKrB,YAAY,OAA0B;QACpC,IAAI,CAAC,KAAK,GAAG,IAAA,yBAAiB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,YAAY,CAAC;IACrD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,cAAc,CAAC,MAAuB;QACpC,OAAO,IAAA,wBAAc,EAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,KAAK,CACT,GAAW,EACX,MAAuB,EACvB,OAAgC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE1D,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAA0B;QACnC,OAAO,IAAA,iCAAuB,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAA,6BAAmB,EAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEO,oBAAoB,CAAC,MAAuB;QAClD,MAAM,KAAK,GACT,MAAM,CAAC,SAAS,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAEzE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK;YACL,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;SACzC,CAAC;IACJ,CAAC;CACF;AAxDD,gCAwDC;AAED,SAAgB,aAAa,CAAC,OAA0B;IACtD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":";;;AA4LA,sCAEC;AA9LD,kDAAsD;AACtD,kDAA+D;AAC/D,kDAA2D;AAC3D,4CAAyD;AACzD,0CAAuD;AACvD,0CAAuD;AACvD,4CAAoD;AACpD,8CAA+C;AAI/C,+CAG0B;AAC1B,6CAAmD;AAcnD,MAAa,UAAU;IAKrB,YAAY,OAA0B;QACpC,IAAI,CAAC,KAAK,GAAG,IAAA,qBAAW,EAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,OAAO,CAAC,OAAO;SACnB,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,UAAkC,EAAE;QACjD,OAAO,IAAA,mCAAwB,EAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,+CAA+C,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CACxE,CAAC;QACJ,CAAC;QACD,OAAQ,IAAI,CAAC,KAAoB,CAAC,SAAS,EAAE,CAAC;IAChD,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,OAAQ,IAAI,CAAC,KAAwB,CAAC,SAAS,EAAE,CAAC;IACpD,CAAC;IAED,cAAc,CAAC,MAAuB;QACpC,OAAO,IAAA,wBAAc,EAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,yBAAyB,CACvB,UAAkC,EAAE;QAEpC,OAAO,IAAA,wBAAc,EACnB,IAAI,CAAC,KAAK,EACV,IAAA,iCAAsB,EAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CACrD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAW,EACX,SAAiC,EAAE,EACnC,OAAgC;QAEhC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,GAAW,EACX,MAAc,EACd,SAAiC,EAAE;QAEnC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAClC,IAAA,iCAAsB,EAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CACpD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,GAAW,EACX,SAAiC,EAAE,EACnC,OAAgC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAClC,IAAA,iCAAsB,EAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,CACpD,CAAC;QACF,MAAM,cAAc,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAgB,EAAC;YACrC,QAAQ;YACR,GAAG;YACH,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;SAC3B,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,OAAO,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,UAAkC,EAAE;QAC7C,OAAO,IAAA,iCAAuB,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,cAAc,CAAC,UAAkC,EAAE;QACjD,OAAO,IAAA,2BAAoB,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,aAAa,CAAC,UAAkC,EAAE;QAChD,OAAO,IAAA,yBAAmB,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,aAAa,CAAC,UAAkC,EAAE;QAChD,OAAO,IAAA,yBAAmB,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAA,6BAAmB,EAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,iBAAyC,EAAE;QACnD,OAAO,IAAA,sBAAe,EAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAEO,oBAAoB,CAAC,MAAuB;QAClD,MAAM,KAAK,GACT,MAAM,CAAC,SAAS,KAAK,gBAAgB;YACrC,MAAM,CAAC,SAAS,KAAK,aAAa;YAClC,MAAM,CAAC,SAAS,KAAK,MAAM;YACzB,CAAC,CAAC,MAAM,CAAC,KAAK;YACd,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAEtB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK;YACL,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;SACzC,CAAC;IACJ,CAAC;CACF;AA7JD,gCA6JC;AAED,SAAgB,aAAa,CAAC,OAA0B;IACtD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RedisLimit } from "../limiter";
2
+ import type { MiddlewareOptions, RateLimitHeaders } from "../types";
3
+ export type BunNext = () => Promise<Response>;
4
+ export type BunMiddleware = (req: Request, next: BunNext) => Promise<Response>;
5
+ export declare function applyRateLimitHeaders(response: Response, headers: RateLimitHeaders): Response;
6
+ export declare function jsonResponse(body: unknown, status: number, headers?: RateLimitHeaders): Response;
7
+ export declare function createBunMiddleware(limiter: RedisLimit): (options: MiddlewareOptions) => BunMiddleware;
8
+ export declare function composeBunHandler(middlewares: BunMiddleware[], handler: (req: Request) => Response | Promise<Response>): (req: Request) => Promise<Response>;
9
+ //# sourceMappingURL=bun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../../src/middleware/bun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAOpE,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAoB/E,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,GACxB,QAAQ,CAaV;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,GACzB,QAAQ,CAKV;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,IAC1B,SAAS,iBAAiB,KAAG,aAAa,CAiEtE;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,aAAa,EAAE,EAC5B,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GACtD,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAcrC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyRateLimitHeaders = applyRateLimitHeaders;
4
+ exports.jsonResponse = jsonResponse;
5
+ exports.createBunMiddleware = createBunMiddleware;
6
+ exports.composeBunHandler = composeBunHandler;
7
+ const headers_1 = require("../utils/headers");
8
+ const limit_execution_1 = require("../utils/limit-execution");
9
+ const DEFAULT_KEY = (req) => {
10
+ const forwarded = req.headers.get("x-forwarded-for");
11
+ if (forwarded) {
12
+ return forwarded.split(",")[0].trim();
13
+ }
14
+ return req.headers.get("x-real-ip") ?? "unknown";
15
+ };
16
+ function toHeaderRecord(headers) {
17
+ const record = {};
18
+ for (const [name, value] of Object.entries(headers)) {
19
+ if (value !== undefined) {
20
+ record[name] = value;
21
+ }
22
+ }
23
+ return record;
24
+ }
25
+ function applyRateLimitHeaders(response, headers) {
26
+ const nextHeaders = new Headers(response.headers);
27
+ for (const [name, value] of Object.entries(headers)) {
28
+ if (value !== undefined) {
29
+ nextHeaders.set(name, value);
30
+ }
31
+ }
32
+ return new Response(response.body, {
33
+ status: response.status,
34
+ statusText: response.statusText,
35
+ headers: nextHeaders,
36
+ });
37
+ }
38
+ function jsonResponse(body, status, headers) {
39
+ return Response.json(body, headers ? { status, headers: toHeaderRecord(headers) } : { status });
40
+ }
41
+ function createBunMiddleware(limiter) {
42
+ return function middleware(options) {
43
+ const strategy = limiter.createStrategy(options);
44
+ const keyExtractor = (options.key ?? DEFAULT_KEY);
45
+ const sendHeaders = options.headers !== false;
46
+ const failOpen = options.failOpen ?? true;
47
+ return async (req, next) => {
48
+ const key = keyExtractor(req) ?? "unknown";
49
+ const outcome = await (0, limit_execution_1.processLimitRequest)({
50
+ limiter,
51
+ strategy,
52
+ key,
53
+ options,
54
+ failOpen,
55
+ context: req,
56
+ });
57
+ if (outcome.status === "error") {
58
+ if (failOpen) {
59
+ return next();
60
+ }
61
+ return jsonResponse({ error: "Service Unavailable" }, 503);
62
+ }
63
+ if (outcome.status === "blocked") {
64
+ const rateLimitHeaders = (0, headers_1.buildRateLimitHeaders)(outcome.result);
65
+ if (options.onLimitReached) {
66
+ await options.onLimitReached(req, { headers: rateLimitHeaders });
67
+ return new Response(null, {
68
+ status: 429,
69
+ headers: sendHeaders ? toHeaderRecord(rateLimitHeaders) : undefined,
70
+ });
71
+ }
72
+ return jsonResponse({ error: "Too Many Requests" }, 429, sendHeaders ? rateLimitHeaders : undefined);
73
+ }
74
+ const rateLimitHeaders = (0, headers_1.buildRateLimitHeaders)(outcome.result);
75
+ try {
76
+ const response = await next();
77
+ if (sendHeaders) {
78
+ return applyRateLimitHeaders(response, rateLimitHeaders);
79
+ }
80
+ return response;
81
+ }
82
+ finally {
83
+ if (outcome.slotId) {
84
+ await (0, limit_execution_1.releaseConcurrencySlot)({
85
+ strategy,
86
+ key,
87
+ slotId: outcome.slotId,
88
+ });
89
+ }
90
+ }
91
+ };
92
+ };
93
+ }
94
+ function composeBunHandler(middlewares, handler) {
95
+ return async (req) => {
96
+ let index = 0;
97
+ const dispatch = async () => {
98
+ if (index < middlewares.length) {
99
+ const middleware = middlewares[index++];
100
+ return middleware(req, dispatch);
101
+ }
102
+ return handler(req);
103
+ };
104
+ return dispatch();
105
+ };
106
+ }
107
+ //# sourceMappingURL=bun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.js","sourceRoot":"","sources":["../../src/middleware/bun.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKlD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,IAC9B,SAAS,iBAAiB,MASjD,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CA+BnB"}
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/middleware/express.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AASlD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,IAC9B,SAAS,iBAAiB,MASjD,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAiDnB"}