@konplit-services/common 1.0.255 → 1.0.256
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/errors/index.d.ts +1 -0
- package/build/errors/index.js +1 -0
- package/build/errors/toomany-request.errors.d.ts +17 -0
- package/build/errors/toomany-request.errors.js +28 -0
- package/build/helper/errorCodes/error-codes.d.ts +4 -0
- package/build/helper/errorCodes/error-codes.js +4 -0
- package/build/middlewares/index.d.ts +1 -0
- package/build/middlewares/index.js +1 -0
- package/build/middlewares/rate-limit.d.ts +2 -0
- package/build/middlewares/rate-limit.js +39 -0
- package/build/middlewares/request-log.js +2 -0
- package/package.json +1 -1
package/build/errors/index.d.ts
CHANGED
package/build/errors/index.js
CHANGED
|
@@ -26,3 +26,4 @@ __exportStar(require("./invalid-input-error"), exports);
|
|
|
26
26
|
__exportStar(require("./service-not-available"), exports);
|
|
27
27
|
__exportStar(require("./axios-request-error"), exports);
|
|
28
28
|
__exportStar(require("./gateway-error"), exports);
|
|
29
|
+
__exportStar(require("./toomany-request.errors"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Status } from "../helper/status";
|
|
2
|
+
import { CustomError } from "./custom-error";
|
|
3
|
+
import { ErrorReturn } from "./error.interface";
|
|
4
|
+
export declare class TooManyRequestError extends CustomError {
|
|
5
|
+
message: string;
|
|
6
|
+
private error_data;
|
|
7
|
+
readonly statusCode: number;
|
|
8
|
+
constructor(message: string, error_data: ErrorReturn);
|
|
9
|
+
sequalizeErrors(): {
|
|
10
|
+
status: Status;
|
|
11
|
+
errors: {
|
|
12
|
+
message: string;
|
|
13
|
+
error_code: string;
|
|
14
|
+
code: number;
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TooManyRequestError = void 0;
|
|
4
|
+
const status_1 = require("../helper/status");
|
|
5
|
+
const custom_error_1 = require("./custom-error");
|
|
6
|
+
class TooManyRequestError extends custom_error_1.CustomError {
|
|
7
|
+
constructor(message, error_data) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.message = message;
|
|
10
|
+
this.error_data = error_data;
|
|
11
|
+
this.statusCode = 429;
|
|
12
|
+
this.error_data = error_data;
|
|
13
|
+
Object.setPrototypeOf(this, TooManyRequestError.prototype);
|
|
14
|
+
}
|
|
15
|
+
sequalizeErrors() {
|
|
16
|
+
return {
|
|
17
|
+
status: status_1.Status.Failed,
|
|
18
|
+
errors: [
|
|
19
|
+
{
|
|
20
|
+
message: this.message,
|
|
21
|
+
error_code: this.error_data.error_code,
|
|
22
|
+
code: this.error_data.code,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.TooManyRequestError = TooManyRequestError;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.konplitRateLimit = void 0;
|
|
13
|
+
const error_codes_1 = require("../helper/errorCodes/error-codes");
|
|
14
|
+
const errors_1 = require("../errors");
|
|
15
|
+
const redis_1 = require("../redis");
|
|
16
|
+
//durations in seconds
|
|
17
|
+
const konplitRateLimit = (duration) => {
|
|
18
|
+
return (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
const clientIp = req.ip || req.socket.remoteAddress || "";
|
|
20
|
+
const key = `rate_limit:${clientIp}`;
|
|
21
|
+
try {
|
|
22
|
+
const lastRequestTime = yield redis_1.redisWrapper.get(key);
|
|
23
|
+
if (lastRequestTime) {
|
|
24
|
+
throw new errors_1.TooManyRequestError(`Too many requests, please wait ${duration} seconds.`, error_codes_1.error_codes.TOO_MANY_REQUEST);
|
|
25
|
+
}
|
|
26
|
+
// Set the rate limit key with an expiry of 6 seconds
|
|
27
|
+
yield redis_1.redisWrapper.client.set(key, Date.now(), "EX", duration);
|
|
28
|
+
next();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error("Redis error:", error);
|
|
32
|
+
if (error instanceof errors_1.CustomError) {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
throw new errors_1.ServiceNotAvailableError("Please try again server error", error_codes_1.error_codes.SERVER_ERROR);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
exports.konplitRateLimit = konplitRateLimit;
|
|
@@ -7,6 +7,8 @@ exports.useMorgan = void 0;
|
|
|
7
7
|
const morgan_1 = __importDefault(require("morgan"));
|
|
8
8
|
// Create a custom Morgan logging function
|
|
9
9
|
exports.useMorgan = (0, morgan_1.default)((tokens, req, res) => {
|
|
10
|
+
const clientIp = req.ip || req.socket.remoteAddress || "";
|
|
11
|
+
console.log("user ip log", clientIp);
|
|
10
12
|
return [
|
|
11
13
|
tokens["remote-addr"](req, res),
|
|
12
14
|
tokens.method(req, res),
|