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.
- package/README.md +471 -22
- package/dist/algorithms/concurrency.d.ts +11 -0
- package/dist/algorithms/concurrency.d.ts.map +1 -0
- package/dist/algorithms/concurrency.js +19 -0
- package/dist/algorithms/concurrency.js.map +1 -0
- package/dist/algorithms/factory.d.ts +3 -2
- package/dist/algorithms/factory.d.ts.map +1 -1
- package/dist/algorithms/factory.js +9 -3
- package/dist/algorithms/factory.js.map +1 -1
- package/dist/algorithms/gcra.d.ts +10 -0
- package/dist/algorithms/gcra.d.ts.map +1 -0
- package/dist/algorithms/gcra.js +15 -0
- package/dist/algorithms/gcra.js.map +1 -0
- package/dist/algorithms/sliding-window.d.ts +4 -4
- package/dist/algorithms/sliding-window.d.ts.map +1 -1
- package/dist/algorithms/sliding-window.js +3 -23
- package/dist/algorithms/sliding-window.js.map +1 -1
- package/dist/algorithms/token-bucket.d.ts +4 -4
- package/dist/algorithms/token-bucket.d.ts.map +1 -1
- package/dist/algorithms/token-bucket.js +3 -20
- package/dist/algorithms/token-bucket.js.map +1 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -1
- package/dist/index.js.map +1 -1
- package/dist/limiter.d.ts +23 -7
- package/dist/limiter.d.ts.map +1 -1
- package/dist/limiter.js +86 -16
- package/dist/limiter.js.map +1 -1
- package/dist/middleware/bun.d.ts +9 -0
- package/dist/middleware/bun.d.ts.map +1 -0
- package/dist/middleware/bun.js +107 -0
- package/dist/middleware/bun.js.map +1 -0
- package/dist/middleware/express.d.ts.map +1 -1
- package/dist/middleware/express.js +30 -14
- package/dist/middleware/express.js.map +1 -1
- package/dist/middleware/fastify.d.ts +3 -3
- package/dist/middleware/fastify.d.ts.map +1 -1
- package/dist/middleware/fastify.js +34 -17
- package/dist/middleware/fastify.js.map +1 -1
- package/dist/middleware/hono.d.ts +5 -0
- package/dist/middleware/hono.d.ts.map +1 -0
- package/dist/middleware/hono.js +71 -0
- package/dist/middleware/hono.js.map +1 -0
- package/dist/middleware/koa.d.ts +5 -0
- package/dist/middleware/koa.d.ts.map +1 -0
- package/dist/middleware/koa.js +65 -0
- package/dist/middleware/koa.js.map +1 -0
- package/dist/middleware/nest.d.ts +14 -0
- package/dist/middleware/nest.d.ts.map +1 -0
- package/dist/middleware/nest.js +112 -0
- package/dist/middleware/nest.js.map +1 -0
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/opentelemetry.d.ts +28 -0
- package/dist/observability/opentelemetry.d.ts.map +1 -0
- package/dist/observability/opentelemetry.js +85 -0
- package/dist/observability/opentelemetry.js.map +1 -0
- package/dist/observability/prometheus.d.ts +27 -0
- package/dist/observability/prometheus.d.ts.map +1 -0
- package/dist/observability/prometheus.js +88 -0
- package/dist/observability/prometheus.js.map +1 -0
- package/dist/observability/types.d.ts +9 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +3 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/prometheus.d.ts +3 -0
- package/dist/prometheus.d.ts.map +1 -0
- package/dist/prometheus.js +9 -0
- package/dist/prometheus.js.map +1 -0
- package/dist/scripts/concurrencyAcquire.lua +34 -0
- package/dist/scripts/concurrencyRelease.lua +9 -0
- package/dist/scripts/gcra.lua +38 -0
- package/dist/stores/factory.d.ts +5 -0
- package/dist/stores/factory.d.ts.map +1 -0
- package/dist/stores/factory.js +40 -0
- package/dist/stores/factory.js.map +1 -0
- package/dist/stores/memcached-store.d.ts +16 -0
- package/dist/stores/memcached-store.d.ts.map +1 -0
- package/dist/stores/memcached-store.js +211 -0
- package/dist/stores/memcached-store.js.map +1 -0
- package/dist/stores/redis-store.d.ts +19 -0
- package/dist/stores/redis-store.d.ts.map +1 -0
- package/dist/stores/redis-store.js +97 -0
- package/dist/stores/redis-store.js.map +1 -0
- package/dist/stores/types.d.ts +11 -0
- package/dist/stores/types.d.ts.map +1 -0
- package/dist/stores/types.js +3 -0
- package/dist/stores/types.js.map +1 -0
- package/dist/types/index.d.ts +94 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/defaults.d.ts +8 -0
- package/dist/utils/defaults.d.ts.map +1 -0
- package/dist/utils/defaults.js +100 -0
- package/dist/utils/defaults.js.map +1 -0
- package/dist/utils/limit-execution.d.ts +40 -0
- package/dist/utils/limit-execution.d.ts.map +1 -0
- package/dist/utils/limit-execution.js +50 -0
- package/dist/utils/limit-execution.js.map +1 -0
- package/dist/utils/memcached.d.ts +12 -0
- package/dist/utils/memcached.d.ts.map +1 -0
- package/dist/utils/memcached.js +103 -0
- package/dist/utils/memcached.js.map +1 -0
- package/dist/utils/metrics.d.ts +21 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +99 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/redis.d.ts +5 -1
- package/dist/utils/redis.d.ts.map +1 -1
- package/dist/utils/redis.js +38 -3
- package/dist/utils/redis.js.map +1 -1
- package/dist/utils/scripts.d.ts +16 -2
- package/dist/utils/scripts.d.ts.map +1 -1
- package/dist/utils/scripts.js +79 -33
- package/dist/utils/scripts.js.map +1 -1
- package/package.json +86 -3
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { RateLimitResult, RateLimitStrategy,
|
|
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
|
|
4
|
+
private readonly store;
|
|
4
5
|
private readonly limit;
|
|
5
6
|
private readonly window;
|
|
6
|
-
|
|
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":"
|
|
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(
|
|
9
|
-
this.
|
|
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
|
-
|
|
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":";;;
|
|
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,
|
|
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
|
|
4
|
+
private readonly store;
|
|
4
5
|
private readonly capacity;
|
|
5
6
|
private readonly refillRate;
|
|
6
|
-
|
|
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,
|
|
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(
|
|
8
|
-
this.
|
|
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
|
-
|
|
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":";;;
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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 {
|
|
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
|
|
6
|
+
private readonly store;
|
|
5
7
|
private readonly failOpen;
|
|
6
|
-
private readonly
|
|
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
|
-
|
|
17
|
+
createStrategyFromOptions(options?: MiddlewareOptionsInput): RateLimitStrategy;
|
|
18
|
+
acquire(key: string, config?: MiddlewareOptionsInput, options?: {
|
|
11
19
|
failOpen?: boolean;
|
|
12
20
|
}): Promise<RateLimitResult>;
|
|
13
|
-
|
|
14
|
-
|
|
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
|
package/dist/limiter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limiter.d.ts","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"
|
|
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
|
|
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.
|
|
17
|
+
this.store = (0, factory_2.createStore)(options);
|
|
12
18
|
this.failOpen = options.failOpen ?? true;
|
|
13
|
-
this.
|
|
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
|
-
|
|
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.
|
|
50
|
+
return (0, factory_1.createStrategy)(this.store, config);
|
|
20
51
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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(
|
|
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"
|
|
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,
|
package/dist/limiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"limiter.js","sourceRoot":"","sources":["../src/limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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"}
|