@abyss-project/monitor 1.0.81 → 1.2.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 (34) hide show
  1. package/.eslintrc.js +33 -33
  2. package/README.md +33 -33
  3. package/dist/__tests__/rate-limit.decorator.test.js +0 -59
  4. package/dist/__tests__/rate-limit.decorator.test.js.map +1 -1
  5. package/dist/__tests__/rate-limit.middleware.test.js +43 -64
  6. package/dist/__tests__/rate-limit.middleware.test.js.map +1 -1
  7. package/dist/frameworks/express/index.d.ts +2 -0
  8. package/dist/frameworks/express/index.js +12 -6
  9. package/dist/frameworks/express/index.js.map +1 -1
  10. package/dist/middlewares/rate-limit/index.d.ts +2 -3
  11. package/dist/middlewares/rate-limit/index.js +2 -4
  12. package/dist/middlewares/rate-limit/index.js.map +1 -1
  13. package/dist/middlewares/rate-limit/rate-limit.decorator.d.ts +0 -6
  14. package/dist/middlewares/rate-limit/rate-limit.decorator.js +1 -44
  15. package/dist/middlewares/rate-limit/rate-limit.decorator.js.map +1 -1
  16. package/dist/middlewares/rate-limit/rate-limit.lua.js +72 -72
  17. package/dist/middlewares/rate-limit/rate-limit.middleware.d.ts +8 -2
  18. package/dist/middlewares/rate-limit/rate-limit.middleware.js +5 -9
  19. package/dist/middlewares/rate-limit/rate-limit.middleware.js.map +1 -1
  20. package/dist/types/interface/api/index.d.ts +1 -0
  21. package/dist/types/interface/api/index.js +1 -0
  22. package/dist/types/interface/api/index.js.map +1 -1
  23. package/dist/types/interface/api/requests/application-log.admin.request.d.ts +2 -2
  24. package/dist/types/interface/api/requests/application-log.request.d.ts +2 -2
  25. package/dist/types/interface/api/responses/application-log.admin.response.d.ts +2 -2
  26. package/dist/types/interface/api/responses/application-log.response.d.ts +2 -2
  27. package/dist/types/interface/api/type-message/keyset-paginate.d.ts +10 -0
  28. package/dist/types/interface/api/type-message/keyset-paginate.js +3 -0
  29. package/dist/types/interface/api/type-message/keyset-paginate.js.map +1 -0
  30. package/dist/types/interface/rate-limit.d.ts +0 -4
  31. package/dist/types/interface/rate-limit.js.map +1 -1
  32. package/jest.config.ts +14 -14
  33. package/package.json +1 -1
  34. package/tsconfig.json +35 -35
package/.eslintrc.js CHANGED
@@ -1,34 +1,34 @@
1
- module.exports = {
2
- parser: '@typescript-eslint/parser',
3
- parserOptions: {
4
- project: 'tsconfig.json',
5
- tsconfigRootDir: __dirname,
6
- sourceType: 'module',
7
- },
8
- plugins: ['@typescript-eslint/eslint-plugin', 'filenames-simple'],
9
- extends: [
10
- 'plugin:@typescript-eslint/recommended',
11
- 'plugin:prettier/recommended',
12
- ],
13
- root: true,
14
- env: {
15
- node: true,
16
- jest: true,
17
- },
18
- ignorePatterns: ['.eslintrc.js'],
19
- rules: {
20
- '@typescript-eslint/interface-name-prefix': 'off',
21
- '@typescript-eslint/explicit-function-return-type': 'off',
22
- '@typescript-eslint/explicit-module-boundary-types': 'off',
23
- '@typescript-eslint/no-explicit-any': 'off',
24
- "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
25
- 'filenames-simple/naming-convention': [
26
- 'error',
27
- {
28
- // Use custom regexp to match migration file
29
- rule: '^([a-z0-9]*)(-[a-z0-9]+)*$',
30
- },
31
- ],
32
- },
33
- overrides: [],
1
+ module.exports = {
2
+ parser: '@typescript-eslint/parser',
3
+ parserOptions: {
4
+ project: 'tsconfig.json',
5
+ tsconfigRootDir: __dirname,
6
+ sourceType: 'module',
7
+ },
8
+ plugins: ['@typescript-eslint/eslint-plugin', 'filenames-simple'],
9
+ extends: [
10
+ 'plugin:@typescript-eslint/recommended',
11
+ 'plugin:prettier/recommended',
12
+ ],
13
+ root: true,
14
+ env: {
15
+ node: true,
16
+ jest: true,
17
+ },
18
+ ignorePatterns: ['.eslintrc.js'],
19
+ rules: {
20
+ '@typescript-eslint/interface-name-prefix': 'off',
21
+ '@typescript-eslint/explicit-function-return-type': 'off',
22
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
23
+ '@typescript-eslint/no-explicit-any': 'off',
24
+ "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
25
+ 'filenames-simple/naming-convention': [
26
+ 'error',
27
+ {
28
+ // Use custom regexp to match migration file
29
+ rule: '^([a-z0-9]*)(-[a-z0-9]+)*$',
30
+ },
31
+ ],
32
+ },
33
+ overrides: [],
34
34
  };
package/README.md CHANGED
@@ -1,33 +1,33 @@
1
- <img src="https://docs.abyss-project.fr/img/services/AbyssMonitor.svg" align="right" width="96" alt="" />
2
-
3
- # Abyss Monitor
4
-
5
- `@abyss-project/monitor`
6
-
7
- Supervision applicative : logs, événements, alertes, Sentinels et Cron Tasks.
8
-
9
- _Application monitoring: logs, events, alerts, Sentinels and Cron Tasks._
10
-
11
- ## Installation
12
-
13
- ```bash
14
- npm install @abyss-project/monitor
15
- # or
16
- pnpm add @abyss-project/monitor
17
- ```
18
-
19
- ## Liens
20
-
21
- - **Documentation** : [https://docs.abyss-project.fr/monitor](https://docs.abyss-project.fr/monitor)
22
- - **NPM** : [@abyss-project/monitor](https://www.npmjs.com/package/@abyss-project/monitor)
23
- - **Swagger** : [https://monitor-api.abyss-project.fr/swagger](https://monitor-api.abyss-project.fr/swagger)
24
- - **Application Abyss** : [app.abyss-project.fr](https://app.abyss-project.fr)
25
- - **Statut des services** : [status.abyss-project.fr](https://status.abyss-project.fr)
26
-
27
- ## Usage
28
-
29
- Voir la [documentation produit](https://docs.abyss-project.fr/monitor) pour les guides d'utilisation, la configuration du Core, les exemples d'appel et la référence des permissions.
30
-
31
- ## Support
32
-
33
- Pour toute demande, ouvrir un ticket depuis [l'application Abyss](https://app.abyss-project.fr/dashboard/my-account/ticket/create).
1
+ <img src="https://docs.abyss-project.fr/img/services/AbyssMonitor.svg" align="right" width="96" alt="" />
2
+
3
+ # Abyss Monitor
4
+
5
+ `@abyss-project/monitor`
6
+
7
+ Supervision applicative : logs, événements, alertes, Sentinels et Cron Tasks.
8
+
9
+ _Application monitoring: logs, events, alerts, Sentinels and Cron Tasks._
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ npm install @abyss-project/monitor
15
+ # or
16
+ pnpm add @abyss-project/monitor
17
+ ```
18
+
19
+ ## Liens
20
+
21
+ - **Documentation** : [https://docs.abyss-project.fr/monitor](https://docs.abyss-project.fr/monitor)
22
+ - **NPM** : [@abyss-project/monitor](https://www.npmjs.com/package/@abyss-project/monitor)
23
+ - **Swagger** : [https://monitor-api.abyss-project.fr/swagger](https://monitor-api.abyss-project.fr/swagger)
24
+ - **Application Abyss** : [app.abyss-project.fr](https://app.abyss-project.fr)
25
+ - **Statut des services** : [status.abyss-project.fr](https://status.abyss-project.fr)
26
+
27
+ ## Usage
28
+
29
+ Voir la [documentation produit](https://docs.abyss-project.fr/monitor) pour les guides d'utilisation, la configuration du Core, les exemples d'appel et la référence des permissions.
30
+
31
+ ## Support
32
+
33
+ Pour toute demande, ouvrir un ticket depuis [l'application Abyss](https://app.abyss-project.fr/dashboard/my-account/ticket/create).
@@ -11,7 +11,6 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  require("reflect-metadata");
13
13
  const rate_limit_decorator_1 = require("../middlewares/rate-limit/rate-limit.decorator");
14
- const express_1 = require("../frameworks/express");
15
14
  describe('@RateLimit decorator', () => {
16
15
  it('stores options as metadata on the method', () => {
17
16
  class Ctrl {
@@ -45,62 +44,4 @@ describe('@RateLimit decorator', () => {
45
44
  expect((0, rate_limit_decorator_1.readRateLimitOptions)(Ctrl.prototype, 'heavy')).toEqual({ cost: 10 });
46
45
  });
47
46
  });
48
- describe('buildRateLimitRouteRegistry', () => {
49
- it('emits one entry per @RateLimit-decorated route on a controller', () => {
50
- let FakeCtrl = class FakeCtrl {
51
- ping() { }
52
- heavy() { }
53
- free() { }
54
- };
55
- __decorate([
56
- (0, express_1.Get)('/ping'),
57
- (0, rate_limit_decorator_1.RateLimit)({ scope: 'ip', max: 1, window: '1m' }),
58
- __metadata("design:type", Function),
59
- __metadata("design:paramtypes", []),
60
- __metadata("design:returntype", void 0)
61
- ], FakeCtrl.prototype, "ping", null);
62
- __decorate([
63
- (0, express_1.Post)('/heavy'),
64
- (0, rate_limit_decorator_1.RateLimit)({ cost: 5 }),
65
- __metadata("design:type", Function),
66
- __metadata("design:paramtypes", []),
67
- __metadata("design:returntype", void 0)
68
- ], FakeCtrl.prototype, "heavy", null);
69
- __decorate([
70
- (0, express_1.Get)('/free'),
71
- __metadata("design:type", Function),
72
- __metadata("design:paramtypes", []),
73
- __metadata("design:returntype", void 0)
74
- ], FakeCtrl.prototype, "free", null);
75
- FakeCtrl = __decorate([
76
- (0, express_1.Controller)({ prefixPath: '/fake' })
77
- ], FakeCtrl);
78
- const entries = (0, rate_limit_decorator_1.buildRateLimitRouteRegistry)([FakeCtrl], '/api');
79
- expect(entries).toHaveLength(2);
80
- expect(entries).toContainEqual({
81
- method: 'GET',
82
- path: '/api/fake/ping',
83
- options: { scope: 'ip', max: 1, window: '1m' },
84
- });
85
- expect(entries).toContainEqual({
86
- method: 'POST',
87
- path: '/api/fake/heavy',
88
- options: { cost: 5 },
89
- });
90
- });
91
- it('skips classes that are not annotated with @Controller', () => {
92
- class Plain {
93
- ping() { }
94
- }
95
- __decorate([
96
- (0, express_1.Get)('/ping'),
97
- (0, rate_limit_decorator_1.RateLimit)({ max: 1, window: '1m' }),
98
- __metadata("design:type", Function),
99
- __metadata("design:paramtypes", []),
100
- __metadata("design:returntype", void 0)
101
- ], Plain.prototype, "ping", null);
102
- const entries = (0, rate_limit_decorator_1.buildRateLimitRouteRegistry)([Plain], '/api');
103
- expect(entries).toHaveLength(0);
104
- });
105
- });
106
47
  //# sourceMappingURL=rate-limit.decorator.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.decorator.test.js","sourceRoot":"","sources":["../../src/__tests__/rate-limit.decorator.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limit.decorator.test.js","sourceRoot":"","sources":["../../src/__tests__/rate-limit.decorator.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAA0B;AAC1B,yFAIwD;AAExD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI;YAER,KAAK,KAAI,CAAC;SACX;QADC;YADC,IAAA,gCAAS,EAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;;;yCACvC;QAGZ,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,2CAAoB,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI;YACR,IAAI,KAAI,CAAC;SACV;QACD,MAAM,CAAC,IAAA,2CAAoB,EAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI;YAER,KAAK,KAAI,CAAC;SACX;QADC;YADC,IAAA,gCAAS,EAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;;;;yCACd;QAEZ,MAAM,CAAC,IAAA,2CAAoB,EAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -22,14 +22,11 @@ function buildReqRes(opts = {}) {
22
22
  const req = {
23
23
  ip: opts.ip ?? '1.1.1.1',
24
24
  method: 'GET',
25
- path: '/x',
25
+ path: opts.path ?? '/x',
26
26
  headers,
27
27
  header(name) {
28
28
  return headers[name.toLowerCase()];
29
29
  },
30
- route: opts.route
31
- ? { stack: [{ name: opts.route.methodName, handle: opts.route.handler }] }
32
- : undefined,
33
30
  };
34
31
  const resHeaders = {};
35
32
  let statusCode = 200;
@@ -48,11 +45,16 @@ function buildReqRes(opts = {}) {
48
45
  return res;
49
46
  },
50
47
  };
51
- res.__captured = () => ({ headers: resHeaders, status: statusCode, body: jsonBody });
48
+ res.__captured = () => ({
49
+ headers: resHeaders,
50
+ status: statusCode,
51
+ body: jsonBody,
52
+ });
52
53
  const next = jest.fn();
53
54
  return { req, res, next };
54
55
  }
55
- describe('rate limit middleware', () => {
56
+ const captured = (res) => res.__captured();
57
+ describe('createRouteRateLimiter (per-route, scope- and param-aware)', () => {
56
58
  let redis;
57
59
  let store;
58
60
  beforeEach(async () => {
@@ -63,27 +65,26 @@ describe('rate limit middleware', () => {
63
65
  afterEach(async () => {
64
66
  await redis.quit();
65
67
  });
66
- it('bypasses when admin', async () => {
67
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({ redis, config: baseConfig }, store);
68
+ it('bypasses when the caller is admin (Defect A: scope resolves post-auth)', async () => {
69
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)(undefined, { store, config: baseConfig });
68
70
  const { req, res, next } = buildReqRes({ locals: { isAdmin: true } });
69
71
  await mw(req, res, next);
70
72
  expect(next).toHaveBeenCalled();
71
- expect(res.__captured().headers['RateLimit-Limit']).toBeUndefined();
73
+ expect(captured(res).headers['RateLimit-Limit']).toBeUndefined();
72
74
  });
73
- it('sets RateLimit-* headers on success and calls next', async () => {
74
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({ redis, config: baseConfig }, store);
75
+ it('resolves the user bucket for an authenticated request (Defect A fixed)', async () => {
76
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)(undefined, { store, config: baseConfig });
75
77
  const { req, res, next } = buildReqRes({
76
78
  locals: { currentUser: { id: 'u1' }, organization: { id: 'o1' } },
77
79
  });
78
80
  await mw(req, res, next);
79
- const captured = res.__captured();
80
81
  expect(next).toHaveBeenCalled();
81
- expect(captured.headers['RateLimit-Limit']).toBe(5);
82
- expect(captured.headers['RateLimit-Remaining']).toBe(4);
83
- expect(captured.headers['RateLimit-Policy']).toBe('5;w=60');
82
+ expect(captured(res).headers['RateLimit-Limit']).toBe(5);
83
+ expect(captured(res).headers['RateLimit-Remaining']).toBe(4);
84
+ expect(captured(res).headers['RateLimit-Policy']).toBe('5;w=60');
84
85
  });
85
- it('blocks with 429 when user bucket exhausted', async () => {
86
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({ redis, config: baseConfig }, store);
86
+ it('blocks with 429 when the user bucket is exhausted', async () => {
87
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)(undefined, { store, config: baseConfig });
87
88
  for (let i = 0; i < 5; i++) {
88
89
  const ctx = buildReqRes({
89
90
  locals: { currentUser: { id: 'u1' }, organization: { id: 'o1' } },
@@ -94,81 +95,59 @@ describe('rate limit middleware', () => {
94
95
  locals: { currentUser: { id: 'u1' }, organization: { id: 'o1' } },
95
96
  });
96
97
  await mw(blocked.req, blocked.res, blocked.next);
97
- const captured = blocked.res.__captured();
98
- expect(captured.status).toBe(429);
98
+ expect(captured(blocked.res).status).toBe(429);
99
99
  expect(blocked.next).not.toHaveBeenCalled();
100
- expect(captured.body).toMatchObject({
100
+ expect(captured(blocked.res).body).toMatchObject({
101
101
  error: { code: 'RATE_LIMIT_EXCEEDED', scope: 'user' },
102
102
  });
103
- expect(captured.headers['Retry-After']).toBeGreaterThan(0);
103
+ expect(captured(blocked.res).headers['Retry-After']).toBeGreaterThan(0);
104
104
  });
105
- it('uses decorator override from routeRegistry when route matches', async () => {
106
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({
107
- redis,
108
- config: baseConfig,
109
- routeRegistry: [
110
- { method: 'POST', path: '/auth/login', options: { scope: 'ip', max: 1, window: '1m' } },
111
- ],
112
- }, store);
113
- const ctx1 = buildReqRes({ ip: '5.5.5.5' });
114
- ctx1.req.method = 'POST';
115
- ctx1.req.path = '/auth/login';
105
+ it('applies the bound @RateLimit override on a PARAMETERIZED path (Defect B fixed)', async () => {
106
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)({ scope: 'ip', max: 1, window: '1m' }, { store, config: baseConfig });
107
+ const ctx1 = buildReqRes({ ip: '5.5.5.5', path: '/b/abc123def' });
116
108
  await mw(ctx1.req, ctx1.res, ctx1.next);
117
109
  expect(ctx1.next).toHaveBeenCalled();
118
- expect(ctx1.res.__captured().headers['RateLimit-Limit']).toBe(1);
119
- const ctx2 = buildReqRes({ ip: '5.5.5.5' });
120
- ctx2.req.method = 'POST';
121
- ctx2.req.path = '/auth/login';
110
+ expect(captured(ctx1.res).headers['RateLimit-Limit']).toBe(1);
111
+ const ctx2 = buildReqRes({ ip: '5.5.5.5', path: '/b/abc123def' });
122
112
  await mw(ctx2.req, ctx2.res, ctx2.next);
123
- expect(ctx2.res.__captured().status).toBe(429);
113
+ expect(captured(ctx2.res).status).toBe(429);
124
114
  });
125
- it('falls back to default config when route is not in registry', async () => {
126
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({
127
- redis,
128
- config: baseConfig,
129
- routeRegistry: [
130
- { method: 'POST', path: '/auth/login', options: { scope: 'ip', max: 1, window: '1m' } },
131
- ],
132
- }, store);
115
+ it('falls back to the scope default when the route has no override', async () => {
116
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)(undefined, { store, config: baseConfig });
133
117
  const { req, res, next } = buildReqRes({ locals: { currentUser: { id: 'u-fallback' } } });
134
- req.path = '/something-else';
135
- req.method = 'GET';
136
118
  await mw(req, res, next);
137
119
  expect(next).toHaveBeenCalled();
138
- expect(res.__captured().headers['RateLimit-Limit']).toBe(5);
120
+ expect(captured(res).headers['RateLimit-Limit']).toBe(5);
139
121
  });
140
- it('@RateLimit scope:ip forces ip bucket even on authenticated requests', async () => {
141
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({
142
- redis,
143
- config: baseConfig,
144
- routeRegistry: [
145
- { method: 'POST', path: '/auth/login', options: { scope: 'ip', max: 1, window: '1m' } },
146
- ],
147
- }, store);
122
+ it('@RateLimit scope:ip forces the ip bucket even for authenticated callers', async () => {
123
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)({ scope: 'ip', max: 1, window: '1m' }, { store, config: baseConfig });
148
124
  const ctx1 = buildReqRes({
149
125
  ip: '7.7.7.7',
150
126
  locals: { currentUser: { id: 'u-jwt' }, organization: { id: 'o-jwt' } },
151
127
  });
152
- ctx1.req.method = 'POST';
153
- ctx1.req.path = '/auth/login';
154
128
  await mw(ctx1.req, ctx1.res, ctx1.next);
155
129
  expect(ctx1.next).toHaveBeenCalled();
156
- expect(ctx1.res.__captured().headers['RateLimit-Limit']).toBe(1);
130
+ expect(captured(ctx1.res).headers['RateLimit-Limit']).toBe(1);
157
131
  const ctx2 = buildReqRes({
158
132
  ip: '7.7.7.7',
159
133
  locals: { currentUser: { id: 'u-jwt' }, organization: { id: 'o-jwt' } },
160
134
  });
161
- ctx2.req.method = 'POST';
162
- ctx2.req.path = '/auth/login';
163
135
  await mw(ctx2.req, ctx2.res, ctx2.next);
164
- expect(ctx2.res.__captured().status).toBe(429);
136
+ expect(captured(ctx2.res).status).toBe(429);
137
+ });
138
+ it('anonymous request resolves the ip bucket', async () => {
139
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)(undefined, { store, config: baseConfig });
140
+ const { req, res, next } = buildReqRes({ ip: '9.9.9.9' });
141
+ await mw(req, res, next);
142
+ expect(next).toHaveBeenCalled();
143
+ expect(captured(res).headers['RateLimit-Limit']).toBe(2);
165
144
  });
166
145
  it('returns next without enforcement when config.enabled is false', async () => {
167
- const mw = (0, rate_limit_middleware_1.createRateLimitMiddleware)({ redis, config: { ...baseConfig, enabled: false } }, store);
146
+ const mw = (0, rate_limit_middleware_1.createRouteRateLimiter)(undefined, { store, config: { ...baseConfig, enabled: false } });
168
147
  const { req, res, next } = buildReqRes({ locals: { currentUser: { id: 'u1' } } });
169
148
  await mw(req, res, next);
170
149
  expect(next).toHaveBeenCalled();
171
- expect(res.__captured().headers['RateLimit-Limit']).toBeUndefined();
150
+ expect(captured(res).headers['RateLimit-Limit']).toBeUndefined();
172
151
  });
173
152
  });
174
153
  //# sourceMappingURL=rate-limit.middleware.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/rate-limit.middleware.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limit.middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/rate-limit.middleware.test.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,14 @@ export * from './decorators';
2
2
  export * from './metadata';
3
3
  import 'reflect-metadata';
4
4
  import express, { Router } from 'express-serve-static-core';
5
+ import type { RouteRateLimiterContext } from '../../middlewares/rate-limit';
5
6
  type Options = {
6
7
  prefix: string;
7
8
  middlewares: any[];
8
9
  controllers: any[];
9
10
  router: (option: any) => Router;
10
11
  disableTrustProxy?: boolean;
12
+ rateLimit?: RouteRateLimiterContext;
11
13
  };
12
14
  export declare const controllerLoader: (app: express.Application, options: Options) => Promise<{
13
15
  swagger: {
@@ -20,10 +20,12 @@ __exportStar(require("./metadata"), exports);
20
20
  const metadata_1 = require("./metadata");
21
21
  require("reflect-metadata");
22
22
  const types_1 = require("../../types");
23
+ const rate_limit_1 = require("../../middlewares/rate-limit");
23
24
  const controllerLoader = async (app, options) => {
24
25
  try {
25
26
  if (options.disableTrustProxy !== true) {
26
- app.set('trust proxy', true);
27
+ const trustProxyHops = Number(process.env.TRUST_PROXY_HOPS ?? 2);
28
+ app.set('trust proxy', Number.isFinite(trustProxyHops) ? trustProxyHops : 2);
27
29
  }
28
30
  const middlewares = options.middlewares.map((middleware) => new middleware());
29
31
  const controllers = options.controllers;
@@ -104,32 +106,36 @@ const controllerLoader = async (app, options) => {
104
106
  }
105
107
  return middleware;
106
108
  });
109
+ const rlOpts = (0, rate_limit_1.readRateLimitOptions)(instance, method);
110
+ const rateLimitMw = options.rateLimit
111
+ ? [(0, rate_limit_1.createRouteRateLimiter)(rlOpts, options.rateLimit)]
112
+ : [];
107
113
  const routerToUse = routeOptions.shouldSkipController ? mainRouter : router;
108
114
  switch (apiMethod) {
109
115
  case types_1.APIMethod.DELETE:
110
116
  routerToUse.delete(path, ...(routeOptions.shouldSkipController
111
117
  ? []
112
- : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
118
+ : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), ...rateLimitMw, instance[method]);
113
119
  break;
114
120
  case types_1.APIMethod.GET:
115
121
  routerToUse.get(path, ...(routeOptions.shouldSkipController
116
122
  ? []
117
- : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
123
+ : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), ...rateLimitMw, instance[method]);
118
124
  break;
119
125
  case types_1.APIMethod.POST:
120
126
  routerToUse.post(path, ...(routeOptions.shouldSkipController
121
127
  ? []
122
- : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
128
+ : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), ...rateLimitMw, instance[method]);
123
129
  break;
124
130
  case types_1.APIMethod.PUT:
125
131
  routerToUse.put(path, ...(routeOptions.shouldSkipController
126
132
  ? []
127
- : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
133
+ : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), ...rateLimitMw, instance[method]);
128
134
  break;
129
135
  case types_1.APIMethod.PATCH:
130
136
  routerToUse.patch(path, ...(routeOptions.shouldSkipController
131
137
  ? []
132
- : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), instance[method]);
138
+ : middlewaresToUseOnController.map((middleware) => middleware.run)), setLocalsMiddleware(controller, options, fullPath, null, undefined, method), ...middlewaresToUseOnRoute.map((middleware) => middleware.run), ...rateLimitMw, instance[method]);
133
139
  break;
134
140
  default:
135
141
  console.error(`Method ${apiMethod} on route ${path} of controller ${controller} do not exist`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/express/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/express/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- export { createRateLimitMiddleware } from './rate-limit.middleware';
1
+ export { createRouteRateLimiter } from './rate-limit.middleware';
2
+ export type { RouteRateLimiterContext } from './rate-limit.middleware';
2
3
  export { RateLimit, readRateLimitOptions } from './rate-limit.decorator';
3
- export { buildRateLimitRouteRegistry } from './rate-limit.decorator';
4
- export type { RateLimitRouteRegistryEntry } from './rate-limit.decorator';
5
4
  export { TokenBucketStore } from './token-bucket.store';
6
5
  export type { ConsumeArgs, ConsumeDualArgs, SingleResult, DualResult } from './token-bucket.store';
7
6
  export { resolveIdentifiers } from './identifier-resolver';
@@ -1,13 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseWindow = exports.resolveIdentifiers = exports.TokenBucketStore = exports.buildRateLimitRouteRegistry = exports.readRateLimitOptions = exports.RateLimit = exports.createRateLimitMiddleware = void 0;
3
+ exports.parseWindow = exports.resolveIdentifiers = exports.TokenBucketStore = exports.readRateLimitOptions = exports.RateLimit = exports.createRouteRateLimiter = void 0;
4
4
  var rate_limit_middleware_1 = require("./rate-limit.middleware");
5
- Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_middleware_1.createRateLimitMiddleware; } });
5
+ Object.defineProperty(exports, "createRouteRateLimiter", { enumerable: true, get: function () { return rate_limit_middleware_1.createRouteRateLimiter; } });
6
6
  var rate_limit_decorator_1 = require("./rate-limit.decorator");
7
7
  Object.defineProperty(exports, "RateLimit", { enumerable: true, get: function () { return rate_limit_decorator_1.RateLimit; } });
8
8
  Object.defineProperty(exports, "readRateLimitOptions", { enumerable: true, get: function () { return rate_limit_decorator_1.readRateLimitOptions; } });
9
- var rate_limit_decorator_2 = require("./rate-limit.decorator");
10
- Object.defineProperty(exports, "buildRateLimitRouteRegistry", { enumerable: true, get: function () { return rate_limit_decorator_2.buildRateLimitRouteRegistry; } });
11
9
  var token_bucket_store_1 = require("./token-bucket.store");
12
10
  Object.defineProperty(exports, "TokenBucketStore", { enumerable: true, get: function () { return token_bucket_store_1.TokenBucketStore; } });
13
11
  var identifier_resolver_1 = require("./identifier-resolver");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/index.ts"],"names":[],"mappings":";;;AAAA,iEAAoE;AAA3D,kIAAA,yBAAyB,OAAA;AAClC,+DAAyE;AAAhE,iHAAA,SAAS,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AACxC,+DAAqE;AAA5D,mIAAA,2BAA2B,OAAA;AAEpC,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AAEzB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAE3B,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/index.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AAAxD,+HAAA,sBAAsB,OAAA;AAE/B,+DAAyE;AAAhE,iHAAA,SAAS,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AACxC,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AAEzB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAE3B,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -3,9 +3,3 @@ import type { RateLimitDecoratorOptions } from '../../types/interface/rate-limit
3
3
  export declare const RATE_LIMIT_WATERMARK: unique symbol;
4
4
  export declare function RateLimit(options: RateLimitDecoratorOptions): MethodDecorator;
5
5
  export declare function readRateLimitOptions(target: object, propertyKey: string | symbol): RateLimitDecoratorOptions | undefined;
6
- export interface RateLimitRouteRegistryEntry {
7
- method: string;
8
- path: string;
9
- options: RateLimitDecoratorOptions;
10
- }
11
- export declare function buildRateLimitRouteRegistry(controllers: ReadonlyArray<new (...args: any[]) => unknown>, controllerPrefix: string): RateLimitRouteRegistryEntry[];
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildRateLimitRouteRegistry = exports.readRateLimitOptions = exports.RateLimit = exports.RATE_LIMIT_WATERMARK = void 0;
3
+ exports.readRateLimitOptions = exports.RateLimit = exports.RATE_LIMIT_WATERMARK = void 0;
4
4
  require("reflect-metadata");
5
- const metadata_1 = require("../../frameworks/express/metadata");
6
- const types_1 = require("../../types");
7
5
  exports.RATE_LIMIT_WATERMARK = Symbol('abyss:rate-limit');
8
6
  function RateLimit(options) {
9
7
  return function (target, propertyKey) {
@@ -15,45 +13,4 @@ function readRateLimitOptions(target, propertyKey) {
15
13
  return Reflect.getMetadata(exports.RATE_LIMIT_WATERMARK, target, propertyKey);
16
14
  }
17
15
  exports.readRateLimitOptions = readRateLimitOptions;
18
- const HTTP_VERB_BY_API_METHOD = {
19
- [types_1.APIMethod.GET]: 'GET',
20
- [types_1.APIMethod.POST]: 'POST',
21
- [types_1.APIMethod.PUT]: 'PUT',
22
- [types_1.APIMethod.DELETE]: 'DELETE',
23
- [types_1.APIMethod.PATCH]: 'PATCH',
24
- };
25
- function buildRateLimitRouteRegistry(controllers, controllerPrefix) {
26
- const out = [];
27
- for (const ControllerClass of controllers) {
28
- const isController = Reflect.getMetadata(metadata_1.CONTROLLER_WATERMARK, ControllerClass) === true;
29
- if (!isController)
30
- continue;
31
- const controllerBasePath = Reflect.getMetadata(metadata_1.PATH_WATERMARK, ControllerClass) ?? '';
32
- const proto = ControllerClass.prototype;
33
- for (const key of Object.getOwnPropertyNames(proto)) {
34
- if (key === 'constructor')
35
- continue;
36
- const isRoute = Reflect.getMetadata(metadata_1.ROUTE_WATERMARK, proto, key) === true;
37
- if (!isRoute)
38
- continue;
39
- const opts = readRateLimitOptions(proto, key);
40
- if (!opts)
41
- continue;
42
- const apiMethod = Reflect.getMetadata(metadata_1.METHOD_WATERMARK, proto, key);
43
- if (apiMethod === undefined)
44
- continue;
45
- const subPath = Reflect.getMetadata(metadata_1.PATH_WATERMARK, proto, key) ?? '';
46
- const segments = [controllerPrefix, controllerBasePath, subPath]
47
- .map((part) => part.replace(/^\/+|\/+$/g, ''))
48
- .filter((part) => part.length > 0);
49
- out.push({
50
- method: HTTP_VERB_BY_API_METHOD[apiMethod],
51
- path: '/' + segments.join('/'),
52
- options: opts,
53
- });
54
- }
55
- }
56
- return out;
57
- }
58
- exports.buildRateLimitRouteRegistry = buildRateLimitRouteRegistry;
59
16
  //# sourceMappingURL=rate-limit.decorator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.decorator.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAE1B,gEAK2C;AAC3C,uCAAwC;AAE3B,QAAA,oBAAoB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE/D,SAAgB,SAAS,CAAC,OAAkC;IAC1D,OAAO,UAAU,MAAM,EAAE,WAAW;QAClC,OAAO,CAAC,cAAc,CAAC,4BAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC;AAJD,8BAIC;AAED,SAAgB,oBAAoB,CAClC,MAAc,EACd,WAA4B;IAE5B,OAAO,OAAO,CAAC,WAAW,CAAC,4BAAoB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AALD,oDAKC;AAED,MAAM,uBAAuB,GAA8B;IACzD,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,IAAI,CAAC,EAAE,MAAM;IACxB,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,KAAK;IACtB,CAAC,iBAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,iBAAS,CAAC,KAAK,CAAC,EAAE,OAAO;CAC3B,CAAC;AAQF,SAAgB,2BAA2B,CAEzC,WAA2D,EAC3D,gBAAwB;IAExB,MAAM,GAAG,GAAkC,EAAE,CAAC;IAE9C,KAAK,MAAM,eAAe,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAoB,EAAE,eAAe,CAAC,KAAK,IAAI,CAAC;QACzF,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,kBAAkB,GACrB,OAAO,CAAC,WAAW,CAAC,yBAAc,EAAE,eAAe,CAAwB,IAAI,EAAE,CAAC;QACrF,MAAM,KAAK,GAAI,eAAyC,CAAC,SAAS,CAAC;QAEnE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,KAAK,aAAa;gBAAE,SAAS;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,0BAAe,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;YAC1E,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,2BAAgB,EAAE,KAAK,EAAE,GAAG,CAA0B,CAAC;YAC7F,IAAI,SAAS,KAAK,SAAS;gBAAE,SAAS;YAEtC,MAAM,OAAO,GAAI,OAAO,CAAC,WAAW,CAAC,yBAAc,EAAE,KAAK,EAAE,GAAG,CAAwB,IAAI,EAAE,CAAC;YAC9F,MAAM,QAAQ,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,OAAO,CAAC;iBAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;iBAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErC,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,uBAAuB,CAAC,SAAS,CAAC;gBAC1C,IAAI,EAAE,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC9B,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAxCD,kEAwCC"}
1
+ {"version":3,"file":"rate-limit.decorator.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAGb,QAAA,oBAAoB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE/D,SAAgB,SAAS,CAAC,OAAkC;IAC1D,OAAO,UAAU,MAAM,EAAE,WAAW;QAClC,OAAO,CAAC,cAAc,CAAC,4BAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC;AAJD,8BAIC;AAED,SAAgB,oBAAoB,CAClC,MAAc,EACd,WAA4B;IAE5B,OAAO,OAAO,CAAC,WAAW,CAAC,4BAAoB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AALD,oDAKC"}
@@ -1,77 +1,77 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RATE_LIMIT_LUA = void 0;
4
- exports.RATE_LIMIT_LUA = `
5
- local function load_bucket(key, capacity, refill, now)
6
- local data = redis.call('HMGET', key, 'tokens', 'ts')
7
- local tokens = tonumber(data[1])
8
- local ts = tonumber(data[2])
9
- if tokens == nil then tokens = capacity end
10
- if ts == nil then ts = now end
11
- local elapsed = (now - ts) / 1000.0
12
- if elapsed < 0 then elapsed = 0 end
13
- tokens = math.min(capacity, tokens + elapsed * refill)
14
- return tokens
15
- end
16
-
17
- local function save_bucket(key, tokens, capacity, refill, now)
18
- redis.call('HSET', key, 'tokens', tokens, 'ts', now)
19
- local ttl = math.ceil(capacity / refill) * 2
20
- redis.call('EXPIRE', key, ttl)
21
- end
22
-
23
- local function reset_sec(tokens, capacity, refill, cost)
24
- if tokens >= cost then return 0 end
25
- return math.ceil((cost - tokens) / refill)
26
- end
27
-
28
- local primary_cap = tonumber(ARGV[1])
29
- local primary_rate = tonumber(ARGV[2])
30
- local secondary_cap = tonumber(ARGV[3])
31
- local secondary_rate = tonumber(ARGV[4])
32
- local now = tonumber(ARGV[5])
33
- local cost = tonumber(ARGV[6])
34
-
35
- local primary_tokens = load_bucket(KEYS[1], primary_cap, primary_rate, now)
36
- local secondary_tokens = 0
37
- local has_secondary = KEYS[2] ~= nil and KEYS[2] ~= ''
38
- if has_secondary then
39
- secondary_tokens = load_bucket(KEYS[2], secondary_cap, secondary_rate, now)
40
- end
41
-
42
- local allowed = 1
43
- if primary_tokens < cost then allowed = 0 end
44
- if has_secondary and secondary_tokens < cost then allowed = 0 end
45
-
46
- if allowed == 1 then
47
- primary_tokens = primary_tokens - cost
48
- save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
49
- if has_secondary then
50
- secondary_tokens = secondary_tokens - cost
51
- save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
52
- end
53
- else
54
- -- Refresh ts so refill math stays correct on next call without consuming tokens.
55
- save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
56
- if has_secondary then
57
- save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
58
- end
59
- end
60
-
61
- local primary_reset = reset_sec(primary_tokens, primary_cap, primary_rate, cost)
62
- local secondary_reset = 0
63
- if has_secondary then
64
- secondary_reset = reset_sec(secondary_tokens, secondary_cap, secondary_rate, cost)
65
- end
66
-
67
- return {
68
- allowed,
69
- math.floor(primary_tokens),
70
- primary_cap,
71
- primary_reset,
72
- math.floor(secondary_tokens),
73
- secondary_cap,
74
- secondary_reset,
75
- }
4
+ exports.RATE_LIMIT_LUA = `
5
+ local function load_bucket(key, capacity, refill, now)
6
+ local data = redis.call('HMGET', key, 'tokens', 'ts')
7
+ local tokens = tonumber(data[1])
8
+ local ts = tonumber(data[2])
9
+ if tokens == nil then tokens = capacity end
10
+ if ts == nil then ts = now end
11
+ local elapsed = (now - ts) / 1000.0
12
+ if elapsed < 0 then elapsed = 0 end
13
+ tokens = math.min(capacity, tokens + elapsed * refill)
14
+ return tokens
15
+ end
16
+
17
+ local function save_bucket(key, tokens, capacity, refill, now)
18
+ redis.call('HSET', key, 'tokens', tokens, 'ts', now)
19
+ local ttl = math.ceil(capacity / refill) * 2
20
+ redis.call('EXPIRE', key, ttl)
21
+ end
22
+
23
+ local function reset_sec(tokens, capacity, refill, cost)
24
+ if tokens >= cost then return 0 end
25
+ return math.ceil((cost - tokens) / refill)
26
+ end
27
+
28
+ local primary_cap = tonumber(ARGV[1])
29
+ local primary_rate = tonumber(ARGV[2])
30
+ local secondary_cap = tonumber(ARGV[3])
31
+ local secondary_rate = tonumber(ARGV[4])
32
+ local now = tonumber(ARGV[5])
33
+ local cost = tonumber(ARGV[6])
34
+
35
+ local primary_tokens = load_bucket(KEYS[1], primary_cap, primary_rate, now)
36
+ local secondary_tokens = 0
37
+ local has_secondary = KEYS[2] ~= nil and KEYS[2] ~= ''
38
+ if has_secondary then
39
+ secondary_tokens = load_bucket(KEYS[2], secondary_cap, secondary_rate, now)
40
+ end
41
+
42
+ local allowed = 1
43
+ if primary_tokens < cost then allowed = 0 end
44
+ if has_secondary and secondary_tokens < cost then allowed = 0 end
45
+
46
+ if allowed == 1 then
47
+ primary_tokens = primary_tokens - cost
48
+ save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
49
+ if has_secondary then
50
+ secondary_tokens = secondary_tokens - cost
51
+ save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
52
+ end
53
+ else
54
+ -- Refresh ts so refill math stays correct on next call without consuming tokens.
55
+ save_bucket(KEYS[1], primary_tokens, primary_cap, primary_rate, now)
56
+ if has_secondary then
57
+ save_bucket(KEYS[2], secondary_tokens, secondary_cap, secondary_rate, now)
58
+ end
59
+ end
60
+
61
+ local primary_reset = reset_sec(primary_tokens, primary_cap, primary_rate, cost)
62
+ local secondary_reset = 0
63
+ if has_secondary then
64
+ secondary_reset = reset_sec(secondary_tokens, secondary_cap, secondary_rate, cost)
65
+ end
66
+
67
+ return {
68
+ allowed,
69
+ math.floor(primary_tokens),
70
+ primary_cap,
71
+ primary_reset,
72
+ math.floor(secondary_tokens),
73
+ secondary_cap,
74
+ secondary_reset,
75
+ }
76
76
  `;
77
77
  //# sourceMappingURL=rate-limit.lua.js.map
@@ -1,4 +1,10 @@
1
1
  import type { Request, Response, NextFunction } from 'express-serve-static-core';
2
2
  import type { TokenBucketStore } from './token-bucket.store';
3
- import type { RateLimitMiddlewareOptions } from '../../types/interface/rate-limit';
4
- export declare function createRateLimitMiddleware(options: RateLimitMiddlewareOptions, store: TokenBucketStore): (req: Request, res: Response, next: NextFunction) => Promise<void>;
3
+ import type { RateLimitConfig, RateLimitDecoratorOptions, RateLimitMiddlewareOptions } from '../../types/interface/rate-limit';
4
+ export interface RouteRateLimiterContext {
5
+ store: TokenBucketStore;
6
+ config: RateLimitConfig;
7
+ logger?: RateLimitMiddlewareOptions['logger'];
8
+ onExceeded?: RateLimitMiddlewareOptions['onExceeded'];
9
+ }
10
+ export declare function createRouteRateLimiter(routeOptions: RateLimitDecoratorOptions | undefined, ctx: RouteRateLimiterContext): (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRateLimitMiddleware = void 0;
3
+ exports.createRouteRateLimiter = void 0;
4
4
  const identifier_resolver_1 = require("./identifier-resolver");
5
5
  const parse_window_1 = require("./parse-window");
6
6
  function buildKey(prefix, scope, id) {
@@ -75,12 +75,8 @@ function setSuccessHeaders(res, bucket, remaining, resetSec) {
75
75
  res.setHeader('RateLimit-Reset', resetSec);
76
76
  res.setHeader('RateLimit-Policy', `${bucket.max};w=${bucket.windowSec}`);
77
77
  }
78
- function createRateLimitMiddleware(options, store) {
79
- const { config, logger, onExceeded } = options;
80
- const routeOverrideLookup = new Map();
81
- for (const entry of options.routeRegistry ?? []) {
82
- routeOverrideLookup.set(`${entry.method}:${entry.path}`, entry.options);
83
- }
78
+ function createRouteRateLimiter(routeOptions, ctx) {
79
+ const { store, config, logger, onExceeded } = ctx;
84
80
  return async function rateLimitMiddleware(req, res, next) {
85
81
  if (!config.enabled) {
86
82
  next();
@@ -91,7 +87,7 @@ function createRateLimitMiddleware(options, store) {
91
87
  next();
92
88
  return;
93
89
  }
94
- const override = routeOverrideLookup.get(`${req.method}:${req.path}`);
90
+ const override = routeOptions;
95
91
  const cost = override?.cost ?? 1;
96
92
  let effectiveIdentifier = identifier;
97
93
  if (override?.scope === 'ip') {
@@ -145,7 +141,7 @@ function createRateLimitMiddleware(options, store) {
145
141
  next();
146
142
  };
147
143
  }
148
- exports.createRateLimitMiddleware = createRateLimitMiddleware;
144
+ exports.createRouteRateLimiter = createRouteRateLimiter;
149
145
  function respond429(res, bucket, resetSec) {
150
146
  res.setHeader('RateLimit-Limit', bucket.max);
151
147
  res.setHeader('RateLimit-Remaining', 0);
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.middleware.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limit.middleware.js","sourceRoot":"","sources":["../../../src/middlewares/rate-limit/rate-limit.middleware.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export * from './type-message/api-error';
2
2
  export * from './type-message/response';
3
3
  export * from './type-message/base-order';
4
4
  export * from './type-message/base-paginate';
5
+ export * from './type-message/keyset-paginate';
5
6
  export * from './requests/application.request';
6
7
  export * from './requests/application.admin.request';
7
8
  export * from './requests/application-stats.admin.request';
@@ -18,6 +18,7 @@ __exportStar(require("./type-message/api-error"), exports);
18
18
  __exportStar(require("./type-message/response"), exports);
19
19
  __exportStar(require("./type-message/base-order"), exports);
20
20
  __exportStar(require("./type-message/base-paginate"), exports);
21
+ __exportStar(require("./type-message/keyset-paginate"), exports);
21
22
  __exportStar(require("./requests/application.request"), exports);
22
23
  __exportStar(require("./requests/application.admin.request"), exports);
23
24
  __exportStar(require("./requests/application-stats.admin.request"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/types/interface/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,0DAAwC;AACxC,4DAA0C;AAC1C,+DAA6C;AAE7C,iEAA+C;AAC/C,uEAAqD;AACrD,6EAA2D;AAC3D,uEAAqD;AACrD,iFAA+D;AAC/D,2EAAyD;AACzD,2EAAyD;AACzD,qEAAmD;AACnD,uEAAqD;AACrD,6EAA2D;AAC3D,yEAAuD;AACvD,+EAA6D;AAC7D,uFAAqE;AACrE,iFAA+D;AAC/D,gFAA8D;AAC9D,0EAAwD;AACxD,6DAA2C;AAC3C,mEAAiD;AACjD,oEAAkD;AAClD,kEAAgD;AAChD,0EAAwD;AAExD,mEAAiD;AACjD,yEAAuD;AACvD,+EAA6D;AAC7D,yEAAuD;AACvD,mFAAiE;AACjE,6EAA2D;AAC3D,6EAA2D;AAC3D,uEAAqD;AACrD,+DAA6C;AAC7C,yEAAuD;AACvD,+EAA6D;AAC7D,2EAAyD;AACzD,iFAA+D;AAC/D,yFAAuE;AACvE,mFAAiE;AACjE,kFAAgE;AAChE,4EAA0D;AAC1D,+DAA6C;AAC7C,qEAAmD;AACnD,sEAAoD;AACpD,oEAAkD;AAClD,4EAA0D"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/types/interface/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,0DAAwC;AACxC,4DAA0C;AAC1C,+DAA6C;AAC7C,iEAA+C;AAE/C,iEAA+C;AAC/C,uEAAqD;AACrD,6EAA2D;AAC3D,uEAAqD;AACrD,iFAA+D;AAC/D,2EAAyD;AACzD,2EAAyD;AACzD,qEAAmD;AACnD,uEAAqD;AACrD,6EAA2D;AAC3D,yEAAuD;AACvD,+EAA6D;AAC7D,uFAAqE;AACrE,iFAA+D;AAC/D,gFAA8D;AAC9D,0EAAwD;AACxD,6DAA2C;AAC3C,mEAAiD;AACjD,oEAAkD;AAClD,kEAAgD;AAChD,0EAAwD;AAExD,mEAAiD;AACjD,yEAAuD;AACvD,+EAA6D;AAC7D,yEAAuD;AACvD,mFAAiE;AACjE,6EAA2D;AAC3D,6EAA2D;AAC3D,uEAAqD;AACrD,+DAA6C;AAC7C,yEAAuD;AACvD,+EAA6D;AAC7D,2EAAyD;AACzD,iFAA+D;AAC/D,yFAAuE;AACvE,mFAAiE;AACjE,kFAAgE;AAChE,4EAA0D;AAC1D,+DAA6C;AAC7C,qEAAmD;AACnD,sEAAoD;AACpD,oEAAkD;AAClD,4EAA0D"}
@@ -1,9 +1,9 @@
1
- import { QueryPaginate } from '..';
1
+ import { CursorQuery } from '..';
2
2
  import { LogLevel } from '../../../enum';
3
3
  export interface IGetApplicationLogAdminParams {
4
4
  applicationLogId: string;
5
5
  }
6
- export type IPaginateApplicationLogAdminQuery = QueryPaginate & {
6
+ export type IPaginateApplicationLogAdminQuery = CursorQuery & {
7
7
  title?: string;
8
8
  message?: string;
9
9
  level?: LogLevel[];
@@ -1,4 +1,4 @@
1
- import { QueryPaginate } from '..';
1
+ import { CursorQuery } from '..';
2
2
  import { APIMethod, LogLevel } from '../../../enum';
3
3
  export interface IGetApplicationLogParams {
4
4
  applicationId: string;
@@ -7,7 +7,7 @@ export interface IGetApplicationLogParams {
7
7
  export interface IPaginateApplicationLogParams {
8
8
  applicationId: string;
9
9
  }
10
- export type IPaginateApplicationLogQuery = QueryPaginate & {
10
+ export type IPaginateApplicationLogQuery = CursorQuery & {
11
11
  title?: string;
12
12
  message?: string;
13
13
  level?: LogLevel[];
@@ -1,5 +1,5 @@
1
- import { IResponse, IApplicationLog, BasePaginate } from '../..';
2
- export type IPaginateApplicationLogAdminResponse = IResponse<BasePaginate<IApplicationLog>>;
1
+ import { IResponse, IApplicationLog, KeysetPaginate } from '../..';
2
+ export type IPaginateApplicationLogAdminResponse = IResponse<KeysetPaginate<IApplicationLog>>;
3
3
  export interface IGetApplicationLogAdminData {
4
4
  applicationLog: IApplicationLog;
5
5
  }
@@ -1,5 +1,5 @@
1
- import { IResponse, IApplicationLog, BasePaginate } from '../..';
2
- export type IPaginateApplicationLogResponse = IResponse<BasePaginate<IApplicationLog>>;
1
+ import { IResponse, IApplicationLog, KeysetPaginate } from '../..';
2
+ export type IPaginateApplicationLogResponse = IResponse<KeysetPaginate<IApplicationLog>>;
3
3
  export interface IGetApplicationLogData {
4
4
  applicationLog: IApplicationLog;
5
5
  }
@@ -0,0 +1,10 @@
1
+ export interface CursorQuery {
2
+ cursor?: string;
3
+ limit?: number;
4
+ }
5
+ export interface KeysetPaginate<T> {
6
+ data: T[];
7
+ nextCursor: string | null;
8
+ prevCursor: string | null;
9
+ estimatedTotal: number;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=keyset-paginate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyset-paginate.js","sourceRoot":"","sources":["../../../../../src/types/interface/api/type-message/keyset-paginate.ts"],"names":[],"mappings":""}
@@ -1,7 +1,5 @@
1
- import type { Redis } from 'ioredis';
2
1
  import type { Logger } from '../../models';
3
2
  import type { RateLimitWindow } from '../../middlewares/rate-limit/parse-window';
4
- import type { RateLimitRouteRegistryEntry } from '../../middlewares/rate-limit/rate-limit.decorator';
5
3
  export type RateLimitScope = 'admin' | 'apikey' | 'user' | 'org' | 'ip';
6
4
  export interface RateLimitBucketConfig {
7
5
  max: number;
@@ -22,10 +20,8 @@ export interface RateLimitDecoratorOptions {
22
20
  cost?: number;
23
21
  }
24
22
  export interface RateLimitMiddlewareOptions {
25
- redis: Redis;
26
23
  config: RateLimitConfig;
27
24
  logger?: Logger;
28
- routeRegistry?: RateLimitRouteRegistryEntry[];
29
25
  onExceeded?: (info: RateLimitExceededInfo) => Promise<void> | void;
30
26
  }
31
27
  export interface RateLimitExceededInfo {
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/types/interface/rate-limit.ts"],"names":[],"mappings":";;;AAsDa,QAAA,mBAAmB,GAAqD;IACnF,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAChC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAChC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;CAC9B,CAAC"}
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/types/interface/rate-limit.ts"],"names":[],"mappings":";;;AAkDa,QAAA,mBAAmB,GAAqD;IACnF,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAChC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAChC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;CAC9B,CAAC"}
package/jest.config.ts CHANGED
@@ -1,14 +1,14 @@
1
- import type { Config } from '@jest/types';
2
-
3
- const config: Config.InitialOptions = {
4
- testEnvironment: 'node',
5
- testTimeout: 10000,
6
- verbose: true,
7
- transform: {
8
- '^.+\\.tsx?$': ['ts-jest', { isolatedModules: true }],
9
- },
10
- testMatch: ['<rootDir>/src/**/__tests__/**/*.test.ts'],
11
- modulePathIgnorePatterns: ['dist'],
12
- };
13
-
14
- export default config;
1
+ import type { Config } from '@jest/types';
2
+
3
+ const config: Config.InitialOptions = {
4
+ testEnvironment: 'node',
5
+ testTimeout: 10000,
6
+ verbose: true,
7
+ transform: {
8
+ '^.+\\.tsx?$': ['ts-jest', { isolatedModules: true }],
9
+ },
10
+ testMatch: ['<rootDir>/src/**/__tests__/**/*.test.ts'],
11
+ modulePathIgnorePatterns: ['dist'],
12
+ };
13
+
14
+ export default config;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abyss-project/monitor",
3
- "version": "1.0.81",
3
+ "version": "1.2.0",
4
4
  "description": "Core package to interact with Abyss-Monitor",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/tsconfig.json CHANGED
@@ -1,35 +1,35 @@
1
- {
2
- "compilerOptions": {
3
- "incremental": false,
4
- "target": "es2021",
5
- "lib": [
6
- "dom",
7
- "es2021"
8
- ],
9
- "experimentalDecorators": true,
10
- "emitDecoratorMetadata": true,
11
- "module": "commonjs",
12
- "rootDir": "src",
13
- "moduleResolution": "node",
14
- "resolveJsonModule": true,
15
- "allowJs": true,
16
- "declaration": true,
17
- "sourceMap": true,
18
- "outDir": "./dist",
19
- "removeComments": true,
20
- "allowSyntheticDefaultImports": true,
21
- "esModuleInterop": true,
22
- "forceConsistentCasingInFileNames": true,
23
- "strict": true,
24
- "strictNullChecks": true,
25
- "strictFunctionTypes": true,
26
- "strictPropertyInitialization": false,
27
- "skipLibCheck": true
28
- },
29
- "include": [
30
- "./src"
31
- ],
32
- "exclude": [
33
- "./dist/**/*"
34
- ]
35
- }
1
+ {
2
+ "compilerOptions": {
3
+ "incremental": false,
4
+ "target": "es2021",
5
+ "lib": [
6
+ "dom",
7
+ "es2021"
8
+ ],
9
+ "experimentalDecorators": true,
10
+ "emitDecoratorMetadata": true,
11
+ "module": "commonjs",
12
+ "rootDir": "src",
13
+ "moduleResolution": "node",
14
+ "resolveJsonModule": true,
15
+ "allowJs": true,
16
+ "declaration": true,
17
+ "sourceMap": true,
18
+ "outDir": "./dist",
19
+ "removeComments": true,
20
+ "allowSyntheticDefaultImports": true,
21
+ "esModuleInterop": true,
22
+ "forceConsistentCasingInFileNames": true,
23
+ "strict": true,
24
+ "strictNullChecks": true,
25
+ "strictFunctionTypes": true,
26
+ "strictPropertyInitialization": false,
27
+ "skipLibCheck": true
28
+ },
29
+ "include": [
30
+ "./src"
31
+ ],
32
+ "exclude": [
33
+ "./dist/**/*"
34
+ ]
35
+ }