sm-utility 2.4.22 → 2.4.24
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/package.json +3 -1
- package/request/axios-custom-client.js +6 -3
- package/request/index.d.ts +1 -0
- package/request/index.js +1 -0
- package/request/interceptors/error.interceptor.d.ts +2 -1
- package/request/interceptors/error.interceptor.js +2 -2
- package/request/interceptors/request.interceptor.d.ts +2 -1
- package/request/interceptors/request.interceptor.js +2 -2
- package/request/interceptors/response.interceptor.d.ts +2 -1
- package/request/interceptors/response.interceptor.js +2 -2
- package/request/loggers/error.logger.d.ts +2 -1
- package/request/loggers/error.logger.js +2 -2
- package/request/loggers/request.logger.d.ts +2 -1
- package/request/loggers/request.logger.js +2 -2
- package/request/loggers/response.logger.d.ts +2 -1
- package/request/loggers/response.logger.js +2 -2
- package/request/requestExtractor.d.ts +25 -0
- package/request/requestExtractor.js +49 -0
- package/request/types.d.ts +6 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sm-utility",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.24",
|
|
4
4
|
"description": "reusable utility codes for sm projects",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "./index.d.ts",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/express": "^4.17.11",
|
|
23
23
|
"@types/node": "^14.14.40",
|
|
24
|
+
"@types/request-ip": "0.0.41",
|
|
24
25
|
"@types/uuid": "^8.3.1",
|
|
25
26
|
"copyfiles": "^2.4.1",
|
|
26
27
|
"typescript": "^4.2.4"
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
"nanoid": "^3.3.6",
|
|
42
43
|
"node-xlsx": "^0.24.0",
|
|
43
44
|
"redis": "^4.1.0",
|
|
45
|
+
"request-ip": "3.3.0",
|
|
44
46
|
"ts-node": "^10.9.1",
|
|
45
47
|
"uuid": "^8.3.2",
|
|
46
48
|
"winston": "^3.3.3"
|
|
@@ -5,13 +5,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.createApi = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const logger_1 = require("../logger");
|
|
8
9
|
const request_interceptor_1 = require("./interceptors/request.interceptor");
|
|
9
10
|
const response_interceptor_1 = require("./interceptors/response.interceptor");
|
|
10
11
|
const error_interceptor_1 = require("./interceptors/error.interceptor");
|
|
11
12
|
function createApi(axiosConfig) {
|
|
12
|
-
const
|
|
13
|
-
axiosApi
|
|
14
|
-
|
|
13
|
+
const { logContext, ...axiosCreateConfig } = axiosConfig || {};
|
|
14
|
+
const axiosApi = axios_1.default.create(axiosCreateConfig);
|
|
15
|
+
const scopedLogger = logContext ? logger_1.logger.child(logContext) : logger_1.logger;
|
|
16
|
+
axiosApi.interceptors.request.use((0, request_interceptor_1.createRequestInterceptor)(scopedLogger), (0, error_interceptor_1.createErrorInterceptor)(scopedLogger));
|
|
17
|
+
axiosApi.interceptors.response.use((0, response_interceptor_1.createResponseInterceptor)(scopedLogger), (0, error_interceptor_1.createErrorInterceptor)(scopedLogger));
|
|
15
18
|
return axiosApi;
|
|
16
19
|
}
|
|
17
20
|
exports.createApi = createApi;
|
package/request/index.d.ts
CHANGED
package/request/index.js
CHANGED
|
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./axios-custom-client"), exports);
|
|
18
18
|
__exportStar(require("./axios"), exports);
|
|
19
19
|
__exportStar(require("./types"), exports);
|
|
20
|
+
__exportStar(require("./requestExtractor"), exports);
|
|
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createErrorInterceptor = void 0;
|
|
4
4
|
const loggers_1 = require("../loggers");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
|
-
function createErrorInterceptor() {
|
|
6
|
+
function createErrorInterceptor(log) {
|
|
7
7
|
return (error) => {
|
|
8
8
|
const { config, message, response } = error;
|
|
9
9
|
const { method, meta } = config || {};
|
|
10
10
|
const fullUrl = (0, utils_1.getFullUrlFromConfig)(config);
|
|
11
|
-
(0, loggers_1.logError)(meta === null || meta === void 0 ? void 0 : meta.requestId, method, fullUrl, response === null || response === void 0 ? void 0 : response.data, response === null || response === void 0 ? void 0 : response.status, message);
|
|
11
|
+
(0, loggers_1.logError)(meta === null || meta === void 0 ? void 0 : meta.requestId, method, fullUrl, response === null || response === void 0 ? void 0 : response.data, response === null || response === void 0 ? void 0 : response.status, message, log);
|
|
12
12
|
throw error;
|
|
13
13
|
};
|
|
14
14
|
}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { InternalAxiosRequestConfig } from "axios";
|
|
2
|
-
|
|
2
|
+
import type { Logger } from "winston";
|
|
3
|
+
export declare function createRequestInterceptor(log?: Logger): (request: InternalAxiosRequestConfig) => InternalAxiosRequestConfig<any>;
|
|
@@ -4,7 +4,7 @@ exports.createRequestInterceptor = void 0;
|
|
|
4
4
|
const uuid_1 = require("uuid");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
6
|
const loggers_1 = require("../loggers");
|
|
7
|
-
function createRequestInterceptor() {
|
|
7
|
+
function createRequestInterceptor(log) {
|
|
8
8
|
return (request) => {
|
|
9
9
|
if (request === null || request === void 0 ? void 0 : request.logRequest) {
|
|
10
10
|
const { data, params, method } = request;
|
|
@@ -12,7 +12,7 @@ function createRequestInterceptor() {
|
|
|
12
12
|
request.meta = request.meta || {};
|
|
13
13
|
request.meta.requestId = (0, uuid_1.v4)();
|
|
14
14
|
request.meta.requestStartedAt = new Date().getTime();
|
|
15
|
-
(0, loggers_1.logRequest)(request.meta.requestId, method, fullUrl, data, params);
|
|
15
|
+
(0, loggers_1.logRequest)(request.meta.requestId, method, fullUrl, data, params, log);
|
|
16
16
|
}
|
|
17
17
|
return request;
|
|
18
18
|
};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { AxiosResponse } from "axios";
|
|
2
|
-
|
|
2
|
+
import type { Logger } from "winston";
|
|
3
|
+
export declare function createResponseInterceptor(log?: Logger): (response: AxiosResponse) => AxiosResponse<any, any>;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createResponseInterceptor = void 0;
|
|
4
4
|
const loggers_1 = require("../loggers");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
|
-
function createResponseInterceptor() {
|
|
6
|
+
function createResponseInterceptor(log) {
|
|
7
7
|
return (response) => {
|
|
8
8
|
var _a;
|
|
9
9
|
if ((_a = response.config) === null || _a === void 0 ? void 0 : _a.logResponse) {
|
|
@@ -11,7 +11,7 @@ function createResponseInterceptor() {
|
|
|
11
11
|
const { method, meta } = config;
|
|
12
12
|
const fullUrl = (0, utils_1.getFullUrlFromConfig)(config);
|
|
13
13
|
const responseTime = (0, utils_1.getResponseTimeFromConfig)(config);
|
|
14
|
-
(0, loggers_1.logResponse)(meta === null || meta === void 0 ? void 0 : meta.requestId, method, fullUrl, data, status, responseTime);
|
|
14
|
+
(0, loggers_1.logResponse)(meta === null || meta === void 0 ? void 0 : meta.requestId, method, fullUrl, data, status, responseTime, log);
|
|
15
15
|
}
|
|
16
16
|
return response;
|
|
17
17
|
};
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Logger } from "winston";
|
|
2
|
+
export declare function logError(id: string, method: string | undefined, url: string | undefined, data: unknown, status: any, message: any, log?: Logger): void;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logError = void 0;
|
|
4
4
|
const logger_1 = require("../../logger");
|
|
5
|
-
function logError(id, method, url, data, status, message) {
|
|
5
|
+
function logError(id, method, url, data, status, message, log = logger_1.logger) {
|
|
6
6
|
const err = {
|
|
7
7
|
["context-id"]: id,
|
|
8
8
|
url,
|
|
@@ -11,6 +11,6 @@ function logError(id, method, url, data, status, message) {
|
|
|
11
11
|
status,
|
|
12
12
|
message,
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
log.error("sm-utility/api-error", { err });
|
|
15
15
|
}
|
|
16
16
|
exports.logError = logError;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Logger } from "winston";
|
|
2
|
+
export declare function logRequest(id: string, method: string | undefined, url: string | undefined, body: unknown, params: string, log?: Logger): void;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logRequest = void 0;
|
|
4
4
|
const logger_1 = require("../../logger");
|
|
5
|
-
function logRequest(id, method, url, body, params) {
|
|
5
|
+
function logRequest(id, method, url, body, params, log = logger_1.logger) {
|
|
6
6
|
const request = {
|
|
7
7
|
["context-id"]: id,
|
|
8
8
|
url,
|
|
@@ -10,6 +10,6 @@ function logRequest(id, method, url, body, params) {
|
|
|
10
10
|
params,
|
|
11
11
|
body,
|
|
12
12
|
};
|
|
13
|
-
|
|
13
|
+
log.info("sm-utility/api-request", { request });
|
|
14
14
|
}
|
|
15
15
|
exports.logRequest = logRequest;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Logger } from "winston";
|
|
2
|
+
export declare function logResponse(id: string, method: string | undefined, url: string | undefined, body: unknown, status: any, responseTime: string, log?: Logger): void;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logResponse = void 0;
|
|
4
4
|
const logger_1 = require("../../logger");
|
|
5
|
-
function logResponse(id, method, url, body, status, responseTime) {
|
|
5
|
+
function logResponse(id, method, url, body, status, responseTime, log = logger_1.logger) {
|
|
6
6
|
const response = {
|
|
7
7
|
["context-id"]: id,
|
|
8
8
|
url,
|
|
@@ -11,6 +11,6 @@ function logResponse(id, method, url, body, status, responseTime) {
|
|
|
11
11
|
status,
|
|
12
12
|
responseTime,
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
log.info("sm-utility/api-response", { response });
|
|
15
15
|
}
|
|
16
16
|
exports.logResponse = logResponse;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
export declare class IpAddress {
|
|
3
|
+
private readonly ip;
|
|
4
|
+
constructor(ip: string | null);
|
|
5
|
+
raw(): string;
|
|
6
|
+
sanitized(): string;
|
|
7
|
+
}
|
|
8
|
+
export declare class RequestExtractor {
|
|
9
|
+
private readonly req;
|
|
10
|
+
constructor(req: Request);
|
|
11
|
+
/**
|
|
12
|
+
* Extracts the ip address from the request headers.
|
|
13
|
+
*
|
|
14
|
+
* If the ip address is not in the cf-connecting-ip header (Cloudflare - HML and PROD), it will be extracted from the x-forwarded-for header (local development)
|
|
15
|
+
*/
|
|
16
|
+
extractIp(): IpAddress;
|
|
17
|
+
/**
|
|
18
|
+
* Extracts the trace id (x-ray trace id) from the request headers
|
|
19
|
+
*/
|
|
20
|
+
extractTraceId(): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Extracts the user agent from the request headers
|
|
23
|
+
*/
|
|
24
|
+
extractUserAgent(): string | undefined;
|
|
25
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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.RequestExtractor = exports.IpAddress = void 0;
|
|
7
|
+
const request_ip_1 = __importDefault(require("request-ip"));
|
|
8
|
+
class IpAddress {
|
|
9
|
+
constructor(ip) {
|
|
10
|
+
this.ip = ip;
|
|
11
|
+
}
|
|
12
|
+
raw() {
|
|
13
|
+
return this.ip || 'unknown';
|
|
14
|
+
}
|
|
15
|
+
sanitized() {
|
|
16
|
+
var _a;
|
|
17
|
+
return ((_a = this.ip) === null || _a === void 0 ? void 0 : _a.replace(/^::ffff:/, '')) || 'unknown';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.IpAddress = IpAddress;
|
|
21
|
+
class RequestExtractor {
|
|
22
|
+
constructor(req) {
|
|
23
|
+
this.req = req;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extracts the ip address from the request headers.
|
|
27
|
+
*
|
|
28
|
+
* If the ip address is not in the cf-connecting-ip header (Cloudflare - HML and PROD), it will be extracted from the x-forwarded-for header (local development)
|
|
29
|
+
*/
|
|
30
|
+
extractIp() {
|
|
31
|
+
const cloudflareIp = this.req.headers['cf-connecting-ip'];
|
|
32
|
+
const ip = cloudflareIp || request_ip_1.default.getClientIp(this.req);
|
|
33
|
+
return new IpAddress(ip);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Extracts the trace id (x-ray trace id) from the request headers
|
|
37
|
+
*/
|
|
38
|
+
extractTraceId() {
|
|
39
|
+
return this.req.headers['x-amzn-trace-id'];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extracts the user agent from the request headers
|
|
43
|
+
*/
|
|
44
|
+
extractUserAgent() {
|
|
45
|
+
var _a;
|
|
46
|
+
return (_a = this.req) === null || _a === void 0 ? void 0 : _a.headers['user-agent'];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.RequestExtractor = RequestExtractor;
|
package/request/types.d.ts
CHANGED
|
@@ -7,5 +7,10 @@ declare module 'axios' {
|
|
|
7
7
|
logResponse?: boolean;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
export type
|
|
10
|
+
export type LoggerContext = {
|
|
11
|
+
trace_id: string;
|
|
12
|
+
} & Record<string, any>;
|
|
13
|
+
export type CustomClientCreateApiParams = Omit<AxiosRequestConfig, 'meta'> & {
|
|
14
|
+
logContext?: LoggerContext;
|
|
15
|
+
};
|
|
11
16
|
export type SmAxiosInstance = ReturnType<typeof createApi>;
|