@adaptivestone/framework 4.4.0 → 4.6.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 (87) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/controllers/Auth.test.js +2 -0
  3. package/controllers/Home.test.js +2 -0
  4. package/controllers/index.js +20 -17
  5. package/coverage/base.css +224 -0
  6. package/coverage/block-navigation.js +87 -0
  7. package/coverage/clover.xml +3433 -0
  8. package/coverage/coverage-final.json +41 -0
  9. package/coverage/favicon.png +0 -0
  10. package/coverage/framework/config/auth.js.html +100 -0
  11. package/coverage/framework/config/http.js.html +112 -0
  12. package/coverage/framework/config/i18n.js.html +121 -0
  13. package/coverage/framework/config/index.html +236 -0
  14. package/coverage/framework/config/log.js.html +151 -0
  15. package/coverage/framework/config/mail.js.html +172 -0
  16. package/coverage/framework/config/mongo.js.html +94 -0
  17. package/coverage/framework/config/rateLimiter.js.html +133 -0
  18. package/coverage/framework/config/redis.js.html +97 -0
  19. package/coverage/framework/config/validate.js.html +94 -0
  20. package/coverage/framework/controllers/Auth.js.html +721 -0
  21. package/coverage/framework/controllers/Home.js.html +169 -0
  22. package/coverage/framework/controllers/index.html +146 -0
  23. package/coverage/framework/controllers/index.js.html +268 -0
  24. package/coverage/framework/controllers/test/SomeController.js.html +616 -0
  25. package/coverage/framework/controllers/test/index.html +116 -0
  26. package/coverage/framework/helpers/redis/clearNamespace.js.html +127 -0
  27. package/coverage/framework/helpers/redis/index.html +116 -0
  28. package/coverage/framework/index.html +116 -0
  29. package/coverage/framework/models/Sequence.js.html +151 -0
  30. package/coverage/framework/models/User.js.html +859 -0
  31. package/coverage/framework/models/index.html +131 -0
  32. package/coverage/framework/modules/AbstractController.js.html +1315 -0
  33. package/coverage/framework/modules/AbstractModel.js.html +268 -0
  34. package/coverage/framework/modules/Base.js.html +577 -0
  35. package/coverage/framework/modules/index.html +146 -0
  36. package/coverage/framework/server.js.html +820 -0
  37. package/coverage/framework/services/cache/Cache.js.html +430 -0
  38. package/coverage/framework/services/cache/index.html +116 -0
  39. package/coverage/framework/services/documentation/DocumentationGenerator.js.html +598 -0
  40. package/coverage/framework/services/documentation/index.html +116 -0
  41. package/coverage/framework/services/http/HttpServer.js.html +373 -0
  42. package/coverage/framework/services/http/index.html +116 -0
  43. package/coverage/framework/services/http/middleware/AbstractMiddleware.js.html +238 -0
  44. package/coverage/framework/services/http/middleware/Auth.js.html +145 -0
  45. package/coverage/framework/services/http/middleware/GetUserByToken.js.html +223 -0
  46. package/coverage/framework/services/http/middleware/I18n.js.html +442 -0
  47. package/coverage/framework/services/http/middleware/Pagination.js.html +253 -0
  48. package/coverage/framework/services/http/middleware/PrepareAppInfo.js.html +139 -0
  49. package/coverage/framework/services/http/middleware/RateLimiter.js.html +472 -0
  50. package/coverage/framework/services/http/middleware/RequestLogger.js.html +151 -0
  51. package/coverage/framework/services/http/middleware/RequestParser.js.html +199 -0
  52. package/coverage/framework/services/http/middleware/Role.js.html +172 -0
  53. package/coverage/framework/services/http/middleware/index.html +251 -0
  54. package/coverage/framework/services/http/middleware/test/CheckFlag.js.html +139 -0
  55. package/coverage/framework/services/http/middleware/test/index.html +116 -0
  56. package/coverage/framework/services/messaging/email/index.html +116 -0
  57. package/coverage/framework/services/messaging/email/index.js.html +739 -0
  58. package/coverage/framework/services/messaging/index.html +116 -0
  59. package/coverage/framework/services/messaging/index.js.html +100 -0
  60. package/coverage/framework/services/validate/ValidateService.js.html +568 -0
  61. package/coverage/framework/services/validate/drivers/AbstractValidator.js.html +196 -0
  62. package/coverage/framework/services/validate/drivers/CustomValidator.js.html +241 -0
  63. package/coverage/framework/services/validate/drivers/YupValidator.js.html +394 -0
  64. package/coverage/framework/services/validate/drivers/index.html +146 -0
  65. package/coverage/framework/services/validate/index.html +116 -0
  66. package/coverage/index.html +341 -0
  67. package/coverage/prettify.css +1 -0
  68. package/coverage/prettify.js +2 -0
  69. package/coverage/sort-arrow-sprite.png +0 -0
  70. package/coverage/sorter.js +196 -0
  71. package/models/Sequence.test.js +2 -0
  72. package/models/User.js +8 -8
  73. package/models/User.test.js +2 -0
  74. package/modules/AbstractModel.js +1 -0
  75. package/modules/BaseCli.js +2 -2
  76. package/modules/Modules.test.js +3 -2
  77. package/package.json +7 -18
  78. package/server.js +9 -9
  79. package/services/http/middleware/I18n.test.js +12 -5
  80. package/services/http/middleware/PrepareAppInfo.test.js +7 -3
  81. package/services/http/middleware/RateLimiter.js +5 -6
  82. package/services/http/middleware/RateLimiter.test.js +184 -1
  83. package/services/http/middleware/RequestParser.test.js +7 -4
  84. package/services/validate/ValidateService.test.js +2 -0
  85. package/tests/setup.js +2 -2
  86. package/tests/setupVitest.js +119 -0
  87. package/vitest.config.js +9 -0
@@ -0,0 +1,196 @@
1
+ /* eslint-disable */
2
+ var addSorting = (function() {
3
+ 'use strict';
4
+ var cols,
5
+ currentSort = {
6
+ index: 0,
7
+ desc: false
8
+ };
9
+
10
+ // returns the summary table element
11
+ function getTable() {
12
+ return document.querySelector('.coverage-summary');
13
+ }
14
+ // returns the thead element of the summary table
15
+ function getTableHeader() {
16
+ return getTable().querySelector('thead tr');
17
+ }
18
+ // returns the tbody element of the summary table
19
+ function getTableBody() {
20
+ return getTable().querySelector('tbody');
21
+ }
22
+ // returns the th element for nth column
23
+ function getNthColumn(n) {
24
+ return getTableHeader().querySelectorAll('th')[n];
25
+ }
26
+
27
+ function onFilterInput() {
28
+ const searchValue = document.getElementById('fileSearch').value;
29
+ const rows = document.getElementsByTagName('tbody')[0].children;
30
+ for (let i = 0; i < rows.length; i++) {
31
+ const row = rows[i];
32
+ if (
33
+ row.textContent
34
+ .toLowerCase()
35
+ .includes(searchValue.toLowerCase())
36
+ ) {
37
+ row.style.display = '';
38
+ } else {
39
+ row.style.display = 'none';
40
+ }
41
+ }
42
+ }
43
+
44
+ // loads the search box
45
+ function addSearchBox() {
46
+ var template = document.getElementById('filterTemplate');
47
+ var templateClone = template.content.cloneNode(true);
48
+ templateClone.getElementById('fileSearch').oninput = onFilterInput;
49
+ template.parentElement.appendChild(templateClone);
50
+ }
51
+
52
+ // loads all columns
53
+ function loadColumns() {
54
+ var colNodes = getTableHeader().querySelectorAll('th'),
55
+ colNode,
56
+ cols = [],
57
+ col,
58
+ i;
59
+
60
+ for (i = 0; i < colNodes.length; i += 1) {
61
+ colNode = colNodes[i];
62
+ col = {
63
+ key: colNode.getAttribute('data-col'),
64
+ sortable: !colNode.getAttribute('data-nosort'),
65
+ type: colNode.getAttribute('data-type') || 'string'
66
+ };
67
+ cols.push(col);
68
+ if (col.sortable) {
69
+ col.defaultDescSort = col.type === 'number';
70
+ colNode.innerHTML =
71
+ colNode.innerHTML + '<span class="sorter"></span>';
72
+ }
73
+ }
74
+ return cols;
75
+ }
76
+ // attaches a data attribute to every tr element with an object
77
+ // of data values keyed by column name
78
+ function loadRowData(tableRow) {
79
+ var tableCols = tableRow.querySelectorAll('td'),
80
+ colNode,
81
+ col,
82
+ data = {},
83
+ i,
84
+ val;
85
+ for (i = 0; i < tableCols.length; i += 1) {
86
+ colNode = tableCols[i];
87
+ col = cols[i];
88
+ val = colNode.getAttribute('data-value');
89
+ if (col.type === 'number') {
90
+ val = Number(val);
91
+ }
92
+ data[col.key] = val;
93
+ }
94
+ return data;
95
+ }
96
+ // loads all row data
97
+ function loadData() {
98
+ var rows = getTableBody().querySelectorAll('tr'),
99
+ i;
100
+
101
+ for (i = 0; i < rows.length; i += 1) {
102
+ rows[i].data = loadRowData(rows[i]);
103
+ }
104
+ }
105
+ // sorts the table using the data for the ith column
106
+ function sortByIndex(index, desc) {
107
+ var key = cols[index].key,
108
+ sorter = function(a, b) {
109
+ a = a.data[key];
110
+ b = b.data[key];
111
+ return a < b ? -1 : a > b ? 1 : 0;
112
+ },
113
+ finalSorter = sorter,
114
+ tableBody = document.querySelector('.coverage-summary tbody'),
115
+ rowNodes = tableBody.querySelectorAll('tr'),
116
+ rows = [],
117
+ i;
118
+
119
+ if (desc) {
120
+ finalSorter = function(a, b) {
121
+ return -1 * sorter(a, b);
122
+ };
123
+ }
124
+
125
+ for (i = 0; i < rowNodes.length; i += 1) {
126
+ rows.push(rowNodes[i]);
127
+ tableBody.removeChild(rowNodes[i]);
128
+ }
129
+
130
+ rows.sort(finalSorter);
131
+
132
+ for (i = 0; i < rows.length; i += 1) {
133
+ tableBody.appendChild(rows[i]);
134
+ }
135
+ }
136
+ // removes sort indicators for current column being sorted
137
+ function removeSortIndicators() {
138
+ var col = getNthColumn(currentSort.index),
139
+ cls = col.className;
140
+
141
+ cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
142
+ col.className = cls;
143
+ }
144
+ // adds sort indicators for current column being sorted
145
+ function addSortIndicators() {
146
+ getNthColumn(currentSort.index).className += currentSort.desc
147
+ ? ' sorted-desc'
148
+ : ' sorted';
149
+ }
150
+ // adds event listeners for all sorter widgets
151
+ function enableUI() {
152
+ var i,
153
+ el,
154
+ ithSorter = function ithSorter(i) {
155
+ var col = cols[i];
156
+
157
+ return function() {
158
+ var desc = col.defaultDescSort;
159
+
160
+ if (currentSort.index === i) {
161
+ desc = !currentSort.desc;
162
+ }
163
+ sortByIndex(i, desc);
164
+ removeSortIndicators();
165
+ currentSort.index = i;
166
+ currentSort.desc = desc;
167
+ addSortIndicators();
168
+ };
169
+ };
170
+ for (i = 0; i < cols.length; i += 1) {
171
+ if (cols[i].sortable) {
172
+ // add the click event handler on the th so users
173
+ // dont have to click on those tiny arrows
174
+ el = getNthColumn(i).querySelector('.sorter').parentElement;
175
+ if (el.addEventListener) {
176
+ el.addEventListener('click', ithSorter(i));
177
+ } else {
178
+ el.attachEvent('onclick', ithSorter(i));
179
+ }
180
+ }
181
+ }
182
+ }
183
+ // adds sorting functionality to the UI
184
+ return function() {
185
+ if (!getTable()) {
186
+ return;
187
+ }
188
+ cols = loadColumns();
189
+ loadData();
190
+ addSearchBox();
191
+ addSortIndicators();
192
+ enableUI();
193
+ };
194
+ })();
195
+
196
+ window.addEventListener('load', addSorting);
@@ -1,3 +1,5 @@
1
+ import { describe, it, expect } from 'vitest';
2
+
1
3
  describe('sequence model', () => {
2
4
  it('should produce sequence', async () => {
3
5
  expect.assertions(1);
package/models/User.js CHANGED
@@ -88,8 +88,8 @@ class User extends AbstractModel {
88
88
  const scryptAsync = promisify(scrypt);
89
89
  const data = await scryptAsync(
90
90
  this.email + Date.now(),
91
- this.constructor.getSuper().saltSecret,
92
- this.constructor.getSuper().hashRounds,
91
+ this.getSuper().saltSecret,
92
+ this.getSuper().hashRounds,
93
93
  );
94
94
  const token = data.toString('base64url');
95
95
  this.sessionTokens.push({ token, valid: timestamp });
@@ -138,8 +138,8 @@ class User extends AbstractModel {
138
138
  const scryptAsync = promisify(scrypt);
139
139
  const data = await scryptAsync(
140
140
  userMongoose.email + Date.now(),
141
- userMongoose.constructor.getSuper().saltSecret,
142
- userMongoose.constructor.getSuper().hashRounds,
141
+ userMongoose.getSuper().saltSecret,
142
+ userMongoose.getSuper().hashRounds,
143
143
  );
144
144
  const token = data.toString('base64url');
145
145
  // if (err) {
@@ -177,7 +177,7 @@ class User extends AbstractModel {
177
177
  const passwordRecoveryToken =
178
178
  await User.generateUserPasswordRecoveryToken(this);
179
179
  const mail = new Mailer(
180
- this.constructor.getSuper().app,
180
+ this.getSuper().app,
181
181
  'recovery',
182
182
  {
183
183
  link: `${i18n.language}/auth/recovery?password_recovery_token=${passwordRecoveryToken.token}`,
@@ -194,8 +194,8 @@ class User extends AbstractModel {
194
194
  const scryptAsync = promisify(scrypt);
195
195
  const data = await scryptAsync(
196
196
  userMongoose.email + Date.now(),
197
- userMongoose.constructor.getSuper().saltSecret,
198
- userMongoose.constructor.getSuper().hashRounds,
197
+ userMongoose.getSuper().saltSecret,
198
+ userMongoose.getSuper().hashRounds,
199
199
  );
200
200
  const token = data.toString('base64url');
201
201
  // if (err) {
@@ -243,7 +243,7 @@ class User extends AbstractModel {
243
243
  async sendVerificationEmail(i18n) {
244
244
  const verificationToken = await User.generateUserVerificationToken(this);
245
245
  const mail = new Mailer(
246
- this.constructor.getSuper().app,
246
+ this.getSuper().app,
247
247
  'verification',
248
248
  {
249
249
  link: `${i18n.language}/auth/login?verification_token=${verificationToken.token}`,
@@ -1,3 +1,5 @@
1
+ import { describe, it, expect } from 'vitest';
2
+
1
3
  const userEmail = 'testing@test.com';
2
4
  const userPassword = 'SuperNiceSecret123$';
3
5
 
@@ -14,6 +14,7 @@ class AbstractModel extends Base {
14
14
  this.mongooseSchema.set('minimize', false);
15
15
  this.mongooseSchema.loadClass(this.constructor);
16
16
  this.mongooseSchema.statics.getSuper = () => this;
17
+ this.mongooseSchema.methods.getSuper = () => this;
17
18
  this.initHooks();
18
19
  this.mongooseModel = mongoose.model(
19
20
  this.constructor.name,
@@ -48,10 +48,10 @@ class Cli extends Base {
48
48
  return false;
49
49
  }
50
50
  // TODO wait until https://github.com/nodejs/node/issues/35889
51
- // const { default: Command } = await import(this.commands[command]);
51
+ const { default: Command } = await import(this.commands[command]);
52
52
 
53
53
  // eslint-disable-next-line import/no-dynamic-require, global-require
54
- const Command = require(this.commands[command]);
54
+ // const Command = require(this.commands[command]);
55
55
 
56
56
  const c = new Command(this.app, this.commands, args);
57
57
  let result = false;
@@ -1,5 +1,6 @@
1
- const SomeController = require('../controllers/test/SomeController');
2
- const AbstractController = require('./AbstractController');
1
+ import { describe, it, expect } from 'vitest';
2
+ import SomeController from '../controllers/test/SomeController';
3
+ import AbstractController from './AbstractController';
3
4
 
4
5
  describe('abstract controller methods', () => {
5
6
  it('can get routes', async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptivestone/framework",
3
- "version": "4.4.0",
3
+ "version": "4.6.0",
4
4
  "description": "Adaptive stone node js framework",
5
5
  "main": "index.js",
6
6
  "engines": {
@@ -14,7 +14,7 @@
14
14
  "scripts": {
15
15
  "dev": "nodemon ./index.js",
16
16
  "prod": "nodemon ./cluster.js",
17
- "test": "jest --coverage=true",
17
+ "test": "vitest run --coverage",
18
18
  "prettier": "prettier --check '**/*.(js|jsx|ts|tsx|json|css|scss|md)'",
19
19
  "lint": "eslint '**/*.js'",
20
20
  "lint:fix": "eslint '**/*.js' --fix",
@@ -25,18 +25,6 @@
25
25
  "benchmark2": "h2load -n 10000 -c 50 https://localhost:3300/",
26
26
  "redis:docker": "docker run --rm -p 6379:6379 redis"
27
27
  },
28
- "jest": {
29
- "setupFilesAfterEnv": [
30
- "./tests/setup.js"
31
- ],
32
- "testEnvironment": "node",
33
- "verbose": true,
34
- "collectCoverage": true,
35
- "coverageReporters": [
36
- "text",
37
- "text-summary"
38
- ]
39
- },
40
28
  "author": "Andrey Logunov",
41
29
  "license": "MIT",
42
30
  "dependencies": {
@@ -56,23 +44,24 @@
56
44
  "nodemailer-sendmail-transport": "^1.0.2",
57
45
  "nodemailer-stub-transport": "^1.1.0",
58
46
  "pug": "^3.0.2",
59
- "rate-limiter-flexible": "^2.2.4",
47
+ "rate-limiter-flexible": "^3.0.0",
60
48
  "redis": "^4.3.1",
61
49
  "winston": "^3.3.3",
62
50
  "winston-transport-sentry-node": "^2.0.0",
63
51
  "yup": "^1.0.0"
64
52
  },
65
53
  "devDependencies": {
54
+ "@vitest/coverage-v8": "^0.34.3",
66
55
  "eslint": "^8.0.0",
67
56
  "eslint-config-airbnb-base": "^15.0.0",
68
57
  "eslint-config-prettier": "^9.0.0",
69
- "eslint-plugin-jest": "^27.0.0",
58
+ "eslint-plugin-vitest": "^0.3.1",
70
59
  "husky": "^8.0.0",
71
- "jest": "^29.0.0",
72
60
  "lint-staged": "^14.0.0",
73
61
  "mongodb-memory-server": "^8.0.2",
74
62
  "nodemon": "^3.0.1",
75
- "prettier": "^3.0.0"
63
+ "prettier": "^3.0.0",
64
+ "vitest": "^0.34.3"
76
65
  },
77
66
  "lint-staged": {
78
67
  "**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
package/server.js CHANGED
@@ -52,17 +52,17 @@ class Server {
52
52
  */
53
53
  async startServer(callbackBefore404 = async () => Promise.resolve()) {
54
54
  // eslint-disable-next-line global-require
55
- const HttpServer = require('./services/http/HttpServer');
55
+ // const HttpServer = require('./services/http/HttpServer');
56
56
  // eslint-disable-next-line global-require
57
- const ControllerManager = require('./controllers/index');
57
+ // const ControllerManager = require('./controllers/index');
58
58
  // TODO wait until https://github.com/nodejs/node/issues/35889
59
- // const [{ default: HttpServer }, { default: ControllerManager }] =
60
- // await Promise.all([
61
- // // eslint-disable-next-line import/extensions
62
- // import('./services/http/HttpServer.js'), // Speed optimisation
63
- // // eslint-disable-next-line import/extensions
64
- // import('./controllers/index.js'), // Speed optimisation
65
- // ]);
59
+ const [{ default: HttpServer }, { default: ControllerManager }] =
60
+ await Promise.all([
61
+ // eslint-disable-next-line import/extensions
62
+ import('./services/http/HttpServer.js'), // Speed optimisation
63
+ // eslint-disable-next-line import/extensions
64
+ import('./controllers/index.js'), // Speed optimisation
65
+ ]);
66
66
 
67
67
  this.addErrorHandling();
68
68
 
@@ -1,4 +1,5 @@
1
- const I18n = require('./I18n');
1
+ import { beforeAll, describe, it, expect } from 'vitest';
2
+ import I18n from './I18n';
2
3
 
3
4
  describe('i18n middleware methods', () => {
4
5
  let middleware;
@@ -45,13 +46,16 @@ describe('i18n middleware methods', () => {
45
46
 
46
47
  it('middleware that works', async () => {
47
48
  expect.assertions(4);
48
- const nextFunction = jest.fn(() => {});
49
+ let isCalled = false;
50
+ const nextFunction = () => {
51
+ isCalled = true;
52
+ };
49
53
  const req = {
50
54
  get: () => 'en',
51
55
  appInfo: {},
52
56
  };
53
57
  await middleware.middleware(req, {}, nextFunction);
54
- expect(nextFunction).toHaveBeenCalledWith();
58
+ expect(isCalled).toBe(true);
55
59
  expect(req.appInfo.i18n).toBeDefined();
56
60
  expect(req.appInfo.i18n.t('aaaaa')).toBe('aaaaa');
57
61
  expect(req.i18n.t('aaaaa')).toBe('aaaaa'); // proxy test
@@ -62,13 +66,16 @@ describe('i18n middleware methods', () => {
62
66
  global.server.app.updateConfig('i18n', { enabled: false });
63
67
  middleware = new I18n(global.server.app);
64
68
 
65
- const nextFunction = jest.fn(() => {});
69
+ let isCalled = false;
70
+ const nextFunction = () => {
71
+ isCalled = true;
72
+ };
66
73
  const req = {
67
74
  get: () => 'en',
68
75
  appInfo: {},
69
76
  };
70
77
  await middleware.middleware(req, {}, nextFunction);
71
- expect(nextFunction).toHaveBeenCalledWith();
78
+ expect(isCalled).toBe(true);
72
79
  expect(req.appInfo.i18n).toBeDefined();
73
80
  expect(req.appInfo.i18n.t('aaaaa')).toBe('aaaaa');
74
81
  expect(req.i18n.t('aaaaa')).toBe('aaaaa'); // proxy test
@@ -1,4 +1,5 @@
1
- const PrepareAppInfo = require('./PrepareAppInfo');
1
+ import { describe, it, expect } from 'vitest';
2
+ import PrepareAppInfo from './PrepareAppInfo';
2
3
 
3
4
  describe('prepareAppInfo methods', () => {
4
5
  it('have description fields', async () => {
@@ -10,10 +11,13 @@ describe('prepareAppInfo methods', () => {
10
11
  it('middleware that works', async () => {
11
12
  expect.assertions(3);
12
13
  const middleware = new PrepareAppInfo(global.server.app);
13
- const nextFunction = jest.fn(() => {});
14
+ let isCalled = false;
15
+ const nextFunction = () => {
16
+ isCalled = true;
17
+ };
14
18
  const req = {};
15
19
  await middleware.middleware(req, {}, nextFunction);
16
- expect(nextFunction).toHaveBeenCalledWith();
20
+ expect(isCalled).toBe(true);
17
21
  expect(req.appInfo).toBeDefined();
18
22
  req.appInfo.test = 5;
19
23
  await middleware.middleware(req, {}, nextFunction);
@@ -16,10 +16,9 @@ class RateLimiter extends AbstractMiddleware {
16
16
 
17
17
  constructor(app, params) {
18
18
  super(app, params);
19
- const routeParams = params;
20
19
  const limiterOptions = this.app.getConfig('rateLimiter');
21
20
 
22
- this.finalOptions = merge(limiterOptions, routeParams);
21
+ this.finalOptions = merge(limiterOptions, params);
23
22
  this.limiter = null;
24
23
 
25
24
  switch (this.finalOptions.driver) {
@@ -32,7 +31,7 @@ class RateLimiter extends AbstractMiddleware {
32
31
  break;
33
32
 
34
33
  case 'mongo':
35
- this.limiter = RateLimiterMongo({
34
+ this.limiter = new RateLimiterMongo({
36
35
  storeClient: mongoose.connection,
37
36
  ...this.finalOptions.limiterOptions,
38
37
  });
@@ -50,7 +49,6 @@ class RateLimiter extends AbstractMiddleware {
50
49
  const redisConfig = this.app.getConfig('redis');
51
50
  const redisClient = redis.createClient({
52
51
  url: redisConfig.url,
53
- legacyMode: true,
54
52
  });
55
53
 
56
54
  // TODO: change it
@@ -71,6 +69,7 @@ class RateLimiter extends AbstractMiddleware {
71
69
 
72
70
  return new RateLimiterRedis({
73
71
  storeClient: redisClient,
72
+ useRedisPackage: true,
74
73
  ...this.finalOptions.limiterOptions,
75
74
  });
76
75
  }
@@ -91,7 +90,7 @@ class RateLimiter extends AbstractMiddleware {
91
90
 
92
91
  if (request && request.length) {
93
92
  request.forEach((val) => {
94
- if (req.body[val]) {
93
+ if (req.body && req.body[val]) {
95
94
  key.push(req.body[val]);
96
95
  }
97
96
  // if (req.appInfo.request && req.appInfo.request[val]) {
@@ -108,6 +107,7 @@ class RateLimiter extends AbstractMiddleware {
108
107
  this.logger.info(
109
108
  `RateLimmiter not inited correclty! Please check init logs `,
110
109
  );
110
+ return res.status(500).send('');
111
111
  }
112
112
 
113
113
  const { namespace } = this.app.getConfig('redis');
@@ -119,7 +119,6 @@ class RateLimiter extends AbstractMiddleware {
119
119
  .catch(() => {
120
120
  this.logger.warn(`Too many requests. Consume key: ${consumeKey}`);
121
121
  });
122
-
123
122
  if (consumeResult) {
124
123
  return next();
125
124
  }