limitly 1.0.2 → 2.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 (79) hide show
  1. package/README.md +291 -12
  2. package/dist/algorithms/factory.d.ts +3 -2
  3. package/dist/algorithms/factory.d.ts.map +1 -1
  4. package/dist/algorithms/factory.js +3 -3
  5. package/dist/algorithms/factory.js.map +1 -1
  6. package/dist/algorithms/sliding-window.d.ts +4 -4
  7. package/dist/algorithms/sliding-window.d.ts.map +1 -1
  8. package/dist/algorithms/sliding-window.js +3 -23
  9. package/dist/algorithms/sliding-window.js.map +1 -1
  10. package/dist/algorithms/token-bucket.d.ts +4 -4
  11. package/dist/algorithms/token-bucket.d.ts.map +1 -1
  12. package/dist/algorithms/token-bucket.js +3 -20
  13. package/dist/algorithms/token-bucket.js.map +1 -1
  14. package/dist/index.d.ts +15 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +32 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/limiter.d.ts +19 -7
  19. package/dist/limiter.d.ts.map +1 -1
  20. package/dist/limiter.js +66 -15
  21. package/dist/limiter.js.map +1 -1
  22. package/dist/middleware/bun.d.ts +9 -0
  23. package/dist/middleware/bun.d.ts.map +1 -0
  24. package/dist/middleware/bun.js +96 -0
  25. package/dist/middleware/bun.js.map +1 -0
  26. package/dist/middleware/express.d.ts.map +1 -1
  27. package/dist/middleware/express.js +11 -5
  28. package/dist/middleware/express.js.map +1 -1
  29. package/dist/middleware/fastify.d.ts +3 -3
  30. package/dist/middleware/fastify.d.ts.map +1 -1
  31. package/dist/middleware/fastify.js +19 -13
  32. package/dist/middleware/fastify.js.map +1 -1
  33. package/dist/middleware/hono.d.ts +5 -0
  34. package/dist/middleware/hono.d.ts.map +1 -0
  35. package/dist/middleware/hono.js +57 -0
  36. package/dist/middleware/hono.js.map +1 -0
  37. package/dist/middleware/koa.d.ts +5 -0
  38. package/dist/middleware/koa.d.ts.map +1 -0
  39. package/dist/middleware/koa.js +54 -0
  40. package/dist/middleware/koa.js.map +1 -0
  41. package/dist/middleware/nest.d.ts +14 -0
  42. package/dist/middleware/nest.d.ts.map +1 -0
  43. package/dist/middleware/nest.js +102 -0
  44. package/dist/middleware/nest.js.map +1 -0
  45. package/dist/stores/factory.d.ts +5 -0
  46. package/dist/stores/factory.d.ts.map +1 -0
  47. package/dist/stores/factory.js +36 -0
  48. package/dist/stores/factory.js.map +1 -0
  49. package/dist/stores/memcached-store.d.ts +13 -0
  50. package/dist/stores/memcached-store.d.ts.map +1 -0
  51. package/dist/stores/memcached-store.js +117 -0
  52. package/dist/stores/memcached-store.js.map +1 -0
  53. package/dist/stores/redis-store.d.ts +12 -0
  54. package/dist/stores/redis-store.d.ts.map +1 -0
  55. package/dist/stores/redis-store.js +54 -0
  56. package/dist/stores/redis-store.js.map +1 -0
  57. package/dist/stores/types.d.ts +8 -0
  58. package/dist/stores/types.d.ts.map +1 -0
  59. package/dist/stores/types.js +3 -0
  60. package/dist/stores/types.js.map +1 -0
  61. package/dist/types/index.d.ts +62 -1
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/dist/utils/defaults.d.ts +6 -0
  64. package/dist/utils/defaults.d.ts.map +1 -0
  65. package/dist/utils/defaults.js +59 -0
  66. package/dist/utils/defaults.js.map +1 -0
  67. package/dist/utils/memcached.d.ts +11 -0
  68. package/dist/utils/memcached.d.ts.map +1 -0
  69. package/dist/utils/memcached.js +91 -0
  70. package/dist/utils/memcached.js.map +1 -0
  71. package/dist/utils/metrics.d.ts +21 -0
  72. package/dist/utils/metrics.d.ts.map +1 -0
  73. package/dist/utils/metrics.js +60 -0
  74. package/dist/utils/metrics.js.map +1 -0
  75. package/dist/utils/redis.d.ts +1 -0
  76. package/dist/utils/redis.d.ts.map +1 -1
  77. package/dist/utils/redis.js +2 -0
  78. package/dist/utils/redis.js.map +1 -1
  79. package/package.json +60 -3
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createMemcachedClient = createMemcachedClient;
7
+ exports.memcachedGet = memcachedGet;
8
+ exports.memcachedGets = memcachedGets;
9
+ exports.memcachedIncr = memcachedIncr;
10
+ exports.memcachedAdd = memcachedAdd;
11
+ exports.memcachedCas = memcachedCas;
12
+ const memcached_1 = __importDefault(require("memcached"));
13
+ function createMemcachedClient(config) {
14
+ if (isMemcachedClient(config)) {
15
+ return config;
16
+ }
17
+ if (typeof config === "string" || Array.isArray(config)) {
18
+ return new memcached_1.default(config);
19
+ }
20
+ return new memcached_1.default(config.servers, config.options);
21
+ }
22
+ function isMemcachedClient(config) {
23
+ return (typeof config === "object" &&
24
+ config !== null &&
25
+ "incr" in config &&
26
+ typeof config.incr === "function");
27
+ }
28
+ function memcachedGet(client, key) {
29
+ return new Promise((resolve, reject) => {
30
+ client.get(key, (err, data) => {
31
+ if (err) {
32
+ reject(err);
33
+ return;
34
+ }
35
+ resolve(data?.toString());
36
+ });
37
+ });
38
+ }
39
+ function memcachedGets(client, key) {
40
+ return new Promise((resolve, reject) => {
41
+ client.gets(key, (err, data) => {
42
+ if (err) {
43
+ reject(err);
44
+ return;
45
+ }
46
+ if (!data?.value) {
47
+ resolve(undefined);
48
+ return;
49
+ }
50
+ resolve({ value: data.value.toString(), cas: String(data.cas) });
51
+ });
52
+ });
53
+ }
54
+ function memcachedIncr(client, key, amount = 1) {
55
+ return new Promise((resolve, reject) => {
56
+ client.incr(key, amount, (err, result) => {
57
+ if (err) {
58
+ reject(err);
59
+ return;
60
+ }
61
+ resolve(Number(result));
62
+ });
63
+ });
64
+ }
65
+ function memcachedAdd(client, key, value, ttl) {
66
+ return new Promise((resolve, reject) => {
67
+ client.add(key, value, ttl, (err) => {
68
+ if (err && err.code !== "EEXIST") {
69
+ reject(err);
70
+ return;
71
+ }
72
+ resolve();
73
+ });
74
+ });
75
+ }
76
+ function memcachedCas(client, key, value, cas, ttl) {
77
+ return new Promise((resolve, reject) => {
78
+ client.cas(key, value, cas, ttl, (err) => {
79
+ if (err) {
80
+ if (err.code === "EEXIST") {
81
+ resolve(false);
82
+ return;
83
+ }
84
+ reject(err);
85
+ return;
86
+ }
87
+ resolve(true);
88
+ });
89
+ });
90
+ }
91
+ //# sourceMappingURL=memcached.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memcached.js","sourceRoot":"","sources":["../../src/utils/memcached.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MiddlewareOptions, RateLimitResult, RateLimitStrategy, StoreType } from "../types";
2
+ export type RateLimitCheckOutcome = {
3
+ status: "allowed";
4
+ result: RateLimitResult;
5
+ } | {
6
+ status: "blocked";
7
+ result: RateLimitResult;
8
+ } | {
9
+ status: "error";
10
+ error: unknown;
11
+ failOpen: boolean;
12
+ };
13
+ export declare function consumeRateLimit(params: {
14
+ strategy: RateLimitStrategy;
15
+ key: string;
16
+ options: MiddlewareOptions;
17
+ failOpen: boolean;
18
+ storeType?: StoreType;
19
+ context?: unknown;
20
+ }): Promise<RateLimitCheckOutcome>;
21
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAGjB,eAAe,EACf,iBAAiB,EACjB,SAAS,EACV,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAkB3D,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAkDjC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.consumeRateLimit = consumeRateLimit;
4
+ function getAlgorithm(options) {
5
+ return options.algorithm;
6
+ }
7
+ async function emitMetrics(hooks, event) {
8
+ if (!hooks) {
9
+ return;
10
+ }
11
+ const handlers = Array.isArray(hooks) ? hooks : [hooks];
12
+ await Promise.all(handlers.map((hook) => hook(event)));
13
+ }
14
+ async function consumeRateLimit(params) {
15
+ const { strategy, key, options, failOpen, storeType, context } = params;
16
+ const algorithm = getAlgorithm(options);
17
+ const startedAt = performance.now();
18
+ try {
19
+ const result = await strategy.consume(key);
20
+ const durationMs = performance.now() - startedAt;
21
+ await emitMetrics(options.onMetrics, {
22
+ type: result.allowed ? "allowed" : "blocked",
23
+ key,
24
+ algorithm,
25
+ result,
26
+ durationMs,
27
+ store: storeType,
28
+ context,
29
+ });
30
+ return {
31
+ status: result.allowed ? "allowed" : "blocked",
32
+ result,
33
+ };
34
+ }
35
+ catch (error) {
36
+ const durationMs = performance.now() - startedAt;
37
+ await emitMetrics(options.onMetrics, {
38
+ type: "error",
39
+ key,
40
+ algorithm,
41
+ error,
42
+ durationMs,
43
+ failOpen,
44
+ store: storeType,
45
+ context,
46
+ });
47
+ if (failOpen) {
48
+ await emitMetrics(options.onMetrics, {
49
+ type: "fail_open",
50
+ key,
51
+ algorithm,
52
+ durationMs,
53
+ store: storeType,
54
+ context,
55
+ });
56
+ }
57
+ return { status: "error", error, failOpen };
58
+ }
59
+ }
60
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":";;AA+BA,4CAyDC;AAzED,SAAS,YAAY,CAAC,OAA0B;IAC9C,OAAO,OAAO,CAAC,SAAS,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,KAAgE,EAChE,KAA4B;IAE5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,MAOtC;IACC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEjD,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE;YACnC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC5C,GAAG;YACH,SAAS;YACT,MAAM;YACN,UAAU;YACV,KAAK,EAAE,SAAS;YAChB,OAAO;SACR,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC9C,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEjD,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE;YACnC,IAAI,EAAE,OAAO;YACb,GAAG;YACH,SAAS;YACT,KAAK;YACL,UAAU;YACV,QAAQ;YACR,KAAK,EAAE,SAAS;YAChB,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE;gBACnC,IAAI,EAAE,WAAW;gBACjB,GAAG;gBACH,SAAS;gBACT,UAAU;gBACV,KAAK,EAAE,SAAS;gBAChB,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { RedisClient, RedisConfig } from "../types";
2
+ export declare const DEFAULT_KEY_PREFIX = "limitly";
2
3
  export declare function createRedisClient(config: RedisConfig): RedisClient;
3
4
  export declare function buildKey(prefix: string, key: string): string;
4
5
  //# sourceMappingURL=redis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/utils/redis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEzD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAclE;AAiBD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D"}
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/utils/redis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEzD,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAclE;AAiBD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -33,9 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DEFAULT_KEY_PREFIX = void 0;
36
37
  exports.createRedisClient = createRedisClient;
37
38
  exports.buildKey = buildKey;
38
39
  const ioredis_1 = __importStar(require("ioredis"));
40
+ exports.DEFAULT_KEY_PREFIX = "limitly";
39
41
  function createRedisClient(config) {
40
42
  if (isRedisClient(config)) {
41
43
  return config;
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/utils/redis.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,8CAcC;AAiBD,4BAEC;AApCD,mDAA4D;AAG5D,SAAgB,iBAAiB,CAAC,MAAmB;IACnD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,IAAI,iBAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,iBAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,iBAAK,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB;IACxC,OAAO,MAAM,YAAY,iBAAK,IAAI,MAAM,YAAY,iBAAO,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CACtB,MAAmB;IAEnB,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,OAAO,IAAI,MAAM;QACjB,KAAK,CAAC,OAAO,CAAE,MAA6B,CAAC,KAAK,CAAC,CACpD,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,MAAc,EAAE,GAAW;IAClD,OAAO,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/utils/redis.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,8CAcC;AAiBD,4BAEC;AAtCD,mDAA4D;AAG/C,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAE5C,SAAgB,iBAAiB,CAAC,MAAmB;IACnD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,IAAI,iBAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,iBAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,iBAAK,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB;IACxC,OAAO,MAAM,YAAY,iBAAK,IAAI,MAAM,YAAY,iBAAO,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CACtB,MAAmB;IAEnB,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,OAAO,IAAI,MAAM;QACjB,KAAK,CAAC,OAAO,CAAE,MAA6B,CAAC,KAAK,CAAC,CACpD,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,MAAc,EAAE,GAAW;IAClD,OAAO,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;AAC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "limitly",
3
- "version": "1.0.2",
3
+ "version": "2.0.0",
4
4
  "description": "Express-rate-limit, but distributed, Redis-powered, and production ready.",
5
5
  "author": "Arpan Das <dasarpan471@gmail.com>",
6
6
  "license": "MIT",
@@ -30,6 +30,26 @@
30
30
  "types": "./dist/middleware/fastify.d.ts",
31
31
  "import": "./dist/middleware/fastify.js",
32
32
  "require": "./dist/middleware/fastify.js"
33
+ },
34
+ "./nest": {
35
+ "types": "./dist/middleware/nest.d.ts",
36
+ "import": "./dist/middleware/nest.js",
37
+ "require": "./dist/middleware/nest.js"
38
+ },
39
+ "./hono": {
40
+ "types": "./dist/middleware/hono.d.ts",
41
+ "import": "./dist/middleware/hono.js",
42
+ "require": "./dist/middleware/hono.js"
43
+ },
44
+ "./koa": {
45
+ "types": "./dist/middleware/koa.d.ts",
46
+ "import": "./dist/middleware/koa.js",
47
+ "require": "./dist/middleware/koa.js"
48
+ },
49
+ "./bun": {
50
+ "types": "./dist/middleware/bun.d.ts",
51
+ "import": "./dist/middleware/bun.js",
52
+ "require": "./dist/middleware/bun.js"
33
53
  }
34
54
  },
35
55
  "files": [
@@ -55,35 +75,72 @@
55
75
  "redis",
56
76
  "express",
57
77
  "fastify",
78
+ "hono",
79
+ "koa",
80
+ "bun",
81
+ "nestjs",
82
+ "nest",
58
83
  "sliding-window",
59
84
  "token-bucket",
60
85
  "distributed",
61
86
  "middleware",
62
- "ioredis"
87
+ "ioredis",
88
+ "valkey",
89
+ "dragonfly",
90
+ "dragonflydb",
91
+ "memcached"
63
92
  ],
64
93
  "publishConfig": {
65
94
  "access": "public",
66
95
  "registry": "https://registry.npmjs.org/"
67
96
  },
68
97
  "peerDependencies": {
98
+ "@nestjs/common": ">=9.0.0",
99
+ "@nestjs/core": ">=9.0.0",
69
100
  "express": ">=4.0.0",
70
101
  "fastify": ">=4.0.0",
71
- "ioredis": ">=5.0.0"
102
+ "hono": ">=4.0.0",
103
+ "ioredis": ">=5.0.0",
104
+ "koa": ">=2.14.0",
105
+ "memcached": ">=2.2.0"
72
106
  },
73
107
  "peerDependenciesMeta": {
108
+ "@nestjs/common": {
109
+ "optional": true
110
+ },
111
+ "@nestjs/core": {
112
+ "optional": true
113
+ },
74
114
  "express": {
75
115
  "optional": true
76
116
  },
77
117
  "fastify": {
78
118
  "optional": true
119
+ },
120
+ "hono": {
121
+ "optional": true
122
+ },
123
+ "koa": {
124
+ "optional": true
125
+ },
126
+ "memcached": {
127
+ "optional": true
79
128
  }
80
129
  },
81
130
  "devDependencies": {
131
+ "@nestjs/common": "^10.4.0",
132
+ "@nestjs/core": "^10.4.0",
133
+ "@nestjs/testing": "^10.4.0",
82
134
  "@types/express": "^4.17.21",
135
+ "@types/koa": "^2.15.0",
136
+ "@types/memcached": "^2.2.10",
83
137
  "@types/node": "^20.14.0",
84
138
  "express": "^4.19.2",
85
139
  "fastify": "^4.28.0",
140
+ "hono": "^4.6.0",
86
141
  "ioredis": "^5.4.1",
142
+ "koa": "^2.15.0",
143
+ "memcached": "^2.2.2",
87
144
  "typescript": "^5.5.0",
88
145
  "vitest": "^1.6.0"
89
146
  },