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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sm-utility",
3
- "version": "2.4.22",
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 axiosApi = axios_1.default.create(axiosConfig);
13
- axiosApi.interceptors.request.use((0, request_interceptor_1.createRequestInterceptor)(), (0, error_interceptor_1.createErrorInterceptor)());
14
- axiosApi.interceptors.response.use((0, response_interceptor_1.createResponseInterceptor)(), (0, error_interceptor_1.createErrorInterceptor)());
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;
@@ -1,3 +1,4 @@
1
1
  export * from './axios-custom-client';
2
2
  export * from './axios';
3
3
  export * from './types';
4
+ export * from './requestExtractor';
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);
@@ -1,2 +1,3 @@
1
1
  import { AxiosError } from "axios";
2
- export declare function createErrorInterceptor(): (error: AxiosError) => never;
2
+ import type { Logger } from "winston";
3
+ export declare function createErrorInterceptor(log?: Logger): (error: AxiosError) => never;
@@ -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
- export declare function createRequestInterceptor(): (request: InternalAxiosRequestConfig) => InternalAxiosRequestConfig<any>;
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
- export declare function createResponseInterceptor(): (response: AxiosResponse) => AxiosResponse<any, any>;
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
- export declare function logError(id: string, method: string | undefined, url: string | undefined, data: unknown, status: any, message: any): void;
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
- logger_1.logger.error("sm-utility/api-error", { err });
14
+ log.error("sm-utility/api-error", { err });
15
15
  }
16
16
  exports.logError = logError;
@@ -1 +1,2 @@
1
- export declare function logRequest(id: string, method: string | undefined, url: string | undefined, body: unknown, params: string): void;
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
- logger_1.logger.info("sm-utility/api-request", { request });
13
+ log.info("sm-utility/api-request", { request });
14
14
  }
15
15
  exports.logRequest = logRequest;
@@ -1 +1,2 @@
1
- export declare function logResponse(id: string, method: string | undefined, url: string | undefined, body: unknown, status: any, responseTime: string): void;
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
- logger_1.logger.info("sm-utility/api-response", { response });
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;
@@ -7,5 +7,10 @@ declare module 'axios' {
7
7
  logResponse?: boolean;
8
8
  }
9
9
  }
10
- export type CustomClientCreateApiParams = Omit<AxiosRequestConfig, 'meta'>;
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>;