@storyous/errors 1.0.6 → 1.0.8

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.
@@ -5,6 +5,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const lodash_1 = require("lodash");
7
7
  const appError_1 = __importDefault(require("./appError"));
8
+ /**
9
+ * recursively mask the 'Authorization' field in the meta object
10
+ */
11
+ const maskAuthorizationField = (obj) => {
12
+ try {
13
+ // Stringify the object
14
+ const jsonString = JSON.stringify(obj);
15
+ const maskedString = jsonString
16
+ .replaceAll(/("Authorization":\s?")[^"]*(")/g, '$1***$2')
17
+ .replaceAll(/(\\"Authorization\\":\s?\\"(?:Bearer\s?)?)[^"]*(\\")/ig, '$1***$2');
18
+ // Parse back into the object
19
+ return JSON.parse(maskedString);
20
+ }
21
+ catch (error) {
22
+ // eslint-disable-next-line no-console
23
+ console.error('Error stringifying or parsing object:', error);
24
+ return obj; // Fallback to original object in case of error
25
+ }
26
+ };
8
27
  const initErrHandler = (log) => async function (ctx, next) {
9
28
  try {
10
29
  await next();
@@ -50,14 +69,29 @@ const initErrHandler = (log) => async function (ctx, next) {
50
69
  metaData.meta = err.meta;
51
70
  }
52
71
  err.setMeta(metaData);
53
- if (err.httpStatus === 404 || err.httpStatus === 401 || err.httpStatus === 429) {
54
- log.warn(err);
72
+ const maskBearerToken = (error) => {
73
+ try {
74
+ const clonedError = (0, lodash_1.cloneDeep)(error);
75
+ if (clonedError.meta) {
76
+ // Recursively mask authorization fields within meta
77
+ clonedError.meta = maskAuthorizationField(clonedError.meta);
78
+ }
79
+ return clonedError;
80
+ }
81
+ catch (parseError) {
82
+ // eslint-disable-next-line no-console
83
+ log.warn('Failed to sanitize authorization fields', parseError);
84
+ return error;
85
+ }
86
+ };
87
+ if ([404, 401, 429].includes(err.httpStatus)) {
88
+ log.warn(maskBearerToken(err));
55
89
  }
56
- else if (err.httpStatus === 500 || err.httpStatus === 408) {
57
- log.error(err);
90
+ else if ([500, 408].includes(err.httpStatus)) {
91
+ log.error(maskBearerToken(err));
58
92
  }
59
93
  else {
60
- log.info(err);
94
+ log.info(maskBearerToken(err));
61
95
  }
62
96
  ctx.body = {
63
97
  code: err.code,
@@ -68,4 +102,4 @@ const initErrHandler = (log) => async function (ctx, next) {
68
102
  }
69
103
  };
70
104
  exports.default = initErrHandler;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2Vycm9ySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUF1QztBQUV2QywwREFBa0M7QUFFbEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEtBQUssV0FBVyxHQUFRLEVBQUUsSUFBYztJQUM1RSxJQUFJO1FBQ0EsTUFBTSxJQUFJLEVBQUUsQ0FBQztLQUNoQjtJQUFDLE9BQU8sYUFBaUIsRUFBRTtRQUV4QixJQUFJLEdBQUcsR0FBUSxhQUFhLENBQUM7UUFFN0IsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLGtCQUFRLENBQUMsRUFBRTtZQUU1QixJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUU7Z0JBQ3RCLGFBQWE7Z0JBQ2IsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUM7Z0JBQ3RDLEdBQUcsR0FBRyxJQUFJLGtCQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRCxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzthQUUzQjtpQkFBTSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtnQkFDaEMsR0FBRyxHQUFHLElBQUksa0JBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUUzQjtpQkFBTTtnQkFDSCxHQUFHLEdBQUcsSUFBSSxrQkFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQ3ZDO1lBRUQsR0FBRyxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO1NBQ25DO1FBRUQsTUFBTSxRQUFRLEdBQVE7WUFDbEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRztZQUNqQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQzVCLEtBQUssRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTTtZQUN0QixhQUFhLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWE7U0FDaEYsQ0FBQztRQUVGLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtZQUNWLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNoQyxRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDNUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDOUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7WUFDZCxRQUFRLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDcEM7UUFFRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBRTlCLElBQUksQ0FBQyxJQUFBLGdCQUFPLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztTQUM1QjtRQUVELEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEIsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRTtZQUM1RSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBRWpCO2FBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRTtZQUN6RCxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBRWxCO2FBQU07WUFDSCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO1FBRUQsR0FBRyxDQUFDLElBQUksR0FBRztZQUNQLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztZQUNwQixHQUFHLElBQUEsYUFBSSxFQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztTQUNoRCxDQUFDO1FBQ0YsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0tBQy9CO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsa0JBQWUsY0FBYyxDQUFDIn0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2Vycm9ySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUVnQjtBQUVoQiwwREFBa0M7QUFFbEM7O0lBRUk7QUFDSixNQUFNLHNCQUFzQixHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7SUFDeEMsSUFBSTtRQUNBLHVCQUF1QjtRQUN2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZDLE1BQU0sWUFBWSxHQUFHLFVBQVU7YUFDMUIsVUFBVSxDQUFDLGlDQUFpQyxFQUFFLFNBQVMsQ0FBQzthQUN4RCxVQUFVLENBQUMsd0RBQXdELEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckYsNkJBQTZCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUNuQztJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ1osc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsT0FBTyxHQUFHLENBQUMsQ0FBQywrQ0FBK0M7S0FDOUQ7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsS0FBSyxXQUFXLEdBQVEsRUFBRSxJQUFjO0lBQzVFLElBQUk7UUFDQSxNQUFNLElBQUksRUFBRSxDQUFDO0tBQ2hCO0lBQUMsT0FBTyxhQUFpQixFQUFFO1FBRXhCLElBQUksR0FBRyxHQUFRLGFBQWEsQ0FBQztRQUU3QixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksa0JBQVEsQ0FBQyxFQUFFO1lBRTVCLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtnQkFDdEIsYUFBYTtnQkFDYixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztnQkFDdEMs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
@@ -1,7 +1,30 @@
1
- import { isEmpty, pick } from 'lodash';
1
+ import {
2
+ cloneDeep, isEmpty, pick,
3
+ } from 'lodash';
2
4
  import { Logger } from 'winston';
3
5
  import AppError from './appError';
4
6
 
7
+ /**
8
+ * recursively mask the 'Authorization' field in the meta object
9
+ */
10
+ const maskAuthorizationField = (obj: any) => {
11
+ try {
12
+ // Stringify the object
13
+ const jsonString = JSON.stringify(obj);
14
+
15
+ const maskedString = jsonString
16
+ .replaceAll(/("Authorization":\s?")[^"]*(")/g, '$1***$2')
17
+ .replaceAll(/(\\"Authorization\\":\s?\\"(?:Bearer\s?)?)[^"]*(\\")/ig, '$1***$2');
18
+
19
+ // Parse back into the object
20
+ return JSON.parse(maskedString);
21
+ } catch (error) {
22
+ // eslint-disable-next-line no-console
23
+ console.error('Error stringifying or parsing object:', error);
24
+ return obj; // Fallback to original object in case of error
25
+ }
26
+ };
27
+
5
28
  const initErrHandler = (log: Logger) => async function (ctx: any, next: Function) {
6
29
  try {
7
30
  await next();
@@ -59,14 +82,41 @@ const initErrHandler = (log: Logger) => async function (ctx: any, next: Function
59
82
 
60
83
  err.setMeta(metaData);
61
84
 
62
- if (err.httpStatus === 404 || err.httpStatus === 401 || err.httpStatus === 429) {
63
- log.warn(err);
85
+ interface ErrorMeta {
86
+ request?: {
87
+ body?: any;
88
+ };
89
+ }
90
+
91
+ interface ErrorObject extends AppError {
92
+ meta?: ErrorMeta;
93
+ }
94
+
95
+ const maskBearerToken = (error: ErrorObject): ErrorObject => {
96
+ try {
97
+ const clonedError: ErrorObject = cloneDeep(error);
98
+
99
+ if (clonedError.meta) {
100
+ // Recursively mask authorization fields within meta
101
+ clonedError.meta = maskAuthorizationField(clonedError.meta);
102
+ }
103
+
104
+ return clonedError;
105
+ } catch (parseError) {
106
+ // eslint-disable-next-line no-console
107
+ log.warn('Failed to sanitize authorization fields', parseError);
108
+ return error;
109
+ }
110
+ };
111
+
112
+ if ([404, 401, 429].includes(err.httpStatus)) {
113
+ log.warn(maskBearerToken(err));
64
114
 
65
- } else if (err.httpStatus === 500 || err.httpStatus === 408) {
66
- log.error(err);
115
+ } else if ([500, 408].includes(err.httpStatus)) {
116
+ log.error(maskBearerToken(err));
67
117
 
68
118
  } else {
69
- log.info(err);
119
+ log.info(maskBearerToken(err));
70
120
  }
71
121
 
72
122
  ctx.body = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storyous/errors",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "",
5
5
  "homepage": "https://github.com/Storyous/mono-utils#readme",
6
6
  "license": "ISC",
@@ -41,5 +41,5 @@
41
41
  "devDependencies": {
42
42
  "@storyous/test-utils": "^2.0.1"
43
43
  },
44
- "gitHead": "3884746d0e2c36dd11a390e18f2eb05f5c9db510"
44
+ "gitHead": "be4c1cf7f6ec0a60ef04fe16cc4f75abc6644a2c"
45
45
  }
package/lib/appError.d.ts DELETED
@@ -1,15 +0,0 @@
1
- export default class AppError extends Error {
2
- code?: number;
3
- httpStatus: number | string;
4
- meta?: Record<string, any>;
5
- redirect?: string;
6
- constructor(message: string, meta?: any);
7
- setMeta(meta: Record<string, any>): AppError;
8
- static purifyStack(error: AppError): AppError;
9
- static notFound(message?: string, meta?: Record<string, any>): AppError;
10
- static badRequest(message?: string, meta?: Record<string, any>): AppError;
11
- static concurrentRequest(message?: string, meta?: Record<string, any>): AppError;
12
- static internal(message?: string, meta?: Record<string, any>): AppError;
13
- static unauthorized(message?: string, meta?: Record<string, any>): AppError;
14
- static isConcurrentRequestError(err: Error): boolean;
15
- }
package/lib/appError.js DELETED
@@ -1,85 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class AppError extends Error {
4
- constructor(message, meta) {
5
- super();
6
- this.message = message;
7
- this.code = (meta && meta.code) || null;
8
- this.httpStatus = (meta && meta.httpStatus) || 500;
9
- this.meta = meta || undefined;
10
- this.redirect = undefined;
11
- }
12
- setMeta(meta) {
13
- this.meta = meta;
14
- return this;
15
- }
16
- static purifyStack(error) {
17
- error.stack = error?.stack?.split('\n').filter((line, index) => index !== 1).join('\n');
18
- return error;
19
- }
20
- static notFound(message, meta) {
21
- let allMessage = 'Not found';
22
- if (message) {
23
- allMessage += `: ${message}`;
24
- }
25
- const error = new AppError(allMessage, ({
26
- code: 404,
27
- httpStatus: 404,
28
- ...meta,
29
- }));
30
- return AppError.purifyStack(error);
31
- }
32
- static badRequest(message, meta) {
33
- let allMessage = 'Bad request';
34
- if (message) {
35
- allMessage += `: ${message}`;
36
- }
37
- const error = new AppError(allMessage, ({
38
- code: 400,
39
- httpStatus: 400,
40
- ...meta,
41
- }));
42
- return AppError.purifyStack(error);
43
- }
44
- static concurrentRequest(message, meta) {
45
- let allMessage = 'Concurrent request';
46
- if (message) {
47
- allMessage += `: ${message}`;
48
- }
49
- const error = new AppError(allMessage, ({
50
- code: 409,
51
- httpStatus: 409,
52
- ...meta,
53
- }));
54
- return AppError.purifyStack(error);
55
- }
56
- static internal(message, meta) {
57
- let allMessage = 'Internal';
58
- if (message) {
59
- allMessage += `: ${message}`;
60
- }
61
- const error = new AppError(allMessage, ({
62
- code: 500,
63
- httpStatus: 500,
64
- ...meta,
65
- }));
66
- return AppError.purifyStack(error);
67
- }
68
- static unauthorized(message, meta) {
69
- let allMessage = 'Unauthorized';
70
- if (message) {
71
- allMessage += `: ${message}`;
72
- }
73
- const error = new AppError(allMessage, ({
74
- code: 401,
75
- httpStatus: 401,
76
- ...meta,
77
- }));
78
- return AppError.purifyStack(error);
79
- }
80
- static isConcurrentRequestError(err) {
81
- return err instanceof AppError && err.code === 409 && /^Concurrent request/.test(err.message);
82
- }
83
- }
84
- exports.default = AppError;
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwRXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcHBFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE1BQXFCLFFBQVMsU0FBUSxLQUFLO0lBVXZDLFlBQWEsT0FBZSxFQUFFLElBQVU7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDO1FBRW5ELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLFNBQVMsQ0FBQztRQUU5QixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTyxDQUFFLElBQXlCO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFFLEtBQWU7UUFDL0IsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhGLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFFLE9BQWdCLEVBQUUsSUFBMEI7UUFFekQsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksT0FBTyxFQUFFO1lBQ1QsVUFBVSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7U0FDaEM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxJQUFJLEVBQUUsR0FBRztZQUNULFVBQVUsRUFBRSxHQUFHO1lBQ2YsR0FBRyxJQUFJO1NBQ1YsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUUsT0FBZ0IsRUFBRSxJQUEwQjtRQUMzRCxJQUFJLFVBQVUsR0FBRyxhQUFhLENBQUM7UUFDL0IsSUFBSSxPQUFPLEVBQUU7WUFDVCxVQUFVLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztTQUNoQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLElBQUksRUFBRSxHQUFHO1lBQ1QsVUFBVSxFQUFFLEdBQUc7WUFDZixHQUFHLElBQUk7U0FDVixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFFLE9BQWdCLEVBQUUsSUFBMEI7UUFDbEUsSUFBSSxVQUFVLEdBQUcsb0JBQW9CLENBQUM7UUFDdEMsSUFBSSxPQUFPLEVBQUU7WUFDVCxVQUFVLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztTQUNoQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLElBQUksRUFBRSxHQUFHO1lBQ1QsVUFBVSxFQUFFLEdBQUc7WUFDZixHQUFHLElBQUk7U0FDVixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBRSxPQUFnQixFQUFFLElBQTBCO1FBQ3pELElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM1QixJQUFJLE9BQU8sRUFBRTtZQUNULFVBQVUsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1NBQ2hDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsSUFBSSxFQUFFLEdBQUc7WUFDVCxVQUFVLEVBQUUsR0FBRztZQUNmLEdBQUcsSUFBSTtTQUNWLENBQUMsQ0FBQyxDQUFDO1FBRUosT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFFLE9BQWdCLEVBQUUsSUFBMEI7UUFDN0QsSUFBSSxVQUFVLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLElBQUksT0FBTyxFQUFFO1lBQ1QsVUFBVSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7U0FDaEM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxJQUFJLEVBQUUsR0FBRztZQUNULFVBQVUsRUFBRSxHQUFHO1lBQ2YsR0FBRyxJQUFJO1NBQ1YsQ0FBQyxDQUFDLENBQUM7UUFFSixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyx3QkFBd0IsQ0FBRSxHQUFVO1FBQ3ZDLE9BQU8sR0FBRyxZQUFZLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xHLENBQUM7Q0FFSjtBQXBIRCwyQkFvSEMifQ==
@@ -1,3 +0,0 @@
1
- import { Logger } from 'winston';
2
- declare const initErrHandler: (log: Logger) => (ctx: any, next: Function) => Promise<void>;
3
- export default initErrHandler;
@@ -1,71 +0,0 @@
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
- const lodash_1 = require("lodash");
7
- const appError_1 = __importDefault(require("./appError"));
8
- const initErrHandler = (log) => async function (ctx, next) {
9
- try {
10
- await next();
11
- }
12
- catch (originalError) {
13
- let err = originalError;
14
- if (!(err instanceof appError_1.default)) {
15
- if (err instanceof Error) {
16
- // @ts-ignore
17
- const redirect = err.redirect || null;
18
- err = new appError_1.default(`${err.name}: ${err.message}`);
19
- err.redirect = redirect;
20
- }
21
- else if (typeof err === 'string') {
22
- err = new appError_1.default(err);
23
- }
24
- else {
25
- err = new appError_1.default('Unknown error');
26
- }
27
- err.stack = originalError.stack;
28
- }
29
- const metaData = {
30
- httpStatus: err.httpStatus || 500,
31
- url: ctx.request.originalUrl,
32
- query: ctx.request.query,
33
- method: ctx.req.method,
34
- remoteAddress: ctx.get('x-forwarded-for') || ctx.req.connection.remoteAddress,
35
- };
36
- if (err.code) {
37
- metaData.code = err.code;
38
- }
39
- if (!ctx.request.is('multipart/*')) {
40
- metaData.body = ctx.request.body;
41
- }
42
- if (ctx.req.headers && ctx.req.headers.referer) {
43
- metaData.referer = ctx.req.headers.referer;
44
- }
45
- if (err.redirect) {
46
- metaData.redirect = err.redirect;
47
- }
48
- const originalMeta = err.meta;
49
- if (!(0, lodash_1.isEmpty)(err.meta)) {
50
- metaData.meta = err.meta;
51
- }
52
- err.setMeta(metaData);
53
- if (err.httpStatus === 404 || err.httpStatus === 401 || err.httpStatus === 429) {
54
- log.warn(err);
55
- }
56
- else if (err.httpStatus === 500 || err.httpStatus === 408) {
57
- log.error(err);
58
- }
59
- else {
60
- log.info(err);
61
- }
62
- ctx.body = {
63
- code: err.code,
64
- message: err.message,
65
- ...(0, lodash_1.pick)(originalMeta, err.publicFields || []),
66
- };
67
- ctx.status = err.httpStatus;
68
- }
69
- };
70
- exports.default = initErrHandler;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXJyb3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQXVDO0FBRXZDLDBEQUFrQztBQUVsQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsS0FBSyxXQUFXLEdBQVEsRUFBRSxJQUFjO0lBQzVFLElBQUk7UUFDQSxNQUFNLElBQUksRUFBRSxDQUFDO0tBQ2hCO0lBQUMsT0FBTyxhQUFpQixFQUFFO1FBRXhCLElBQUksR0FBRyxHQUFRLGFBQWEsQ0FBQztRQUU3QixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksa0JBQVEsQ0FBQyxFQUFFO1lBRTVCLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtnQkFDdEIsYUFBYTtnQkFDYixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztnQkFDdEMsR0FBRyxHQUFHLElBQUksa0JBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2xELEdBQUcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO2FBRTNCO2lCQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUNoQyxHQUFHLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBRTNCO2lCQUFNO2dCQUNILEdBQUcsR0FBRyxJQUFJLGtCQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDdkM7WUFFRCxHQUFHLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7U0FDbkM7UUFFRCxNQUFNLFFBQVEsR0FBUTtZQUNsQixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHO1lBQ2pDLEdBQUcsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDNUIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQ3RCLGFBQWEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYTtTQUNoRixDQUFDO1FBRUYsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ1YsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2hDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7U0FDcEM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUM1QyxRQUFRLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUM5QztRQUVELElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNkLFFBQVEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztTQUNwQztRQUVELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFFOUIsSUFBSSxDQUFDLElBQUEsZ0JBQU8sRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEIsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1NBQzVCO1FBRUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0QixJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFO1lBQzVFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FFakI7YUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFO1lBQ3pELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7U0FFbEI7YUFBTTtZQUNILEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDakI7UUFFRCxHQUFHLENBQUMsSUFBSSxHQUFHO1lBQ1AsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1lBQ3BCLEdBQUcsSUFBQSxhQUFJLEVBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1NBQ2hELENBQUM7UUFDRixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7S0FDL0I7QUFDTCxDQUFDLENBQUM7QUFFRixrQkFBZSxjQUFjLENBQUMifQ==
package/lib/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import AppError from './appError';
2
- import initErrHandler from './errorHandler';
3
- export { AppError, initErrHandler };
package/lib/index.js DELETED
@@ -1,11 +0,0 @@
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.initErrHandler = exports.AppError = void 0;
7
- const appError_1 = __importDefault(require("./appError"));
8
- exports.AppError = appError_1.default;
9
- const errorHandler_1 = __importDefault(require("./errorHandler"));
10
- exports.initErrHandler = errorHandler_1.default;
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBa0M7QUFHekIsbUJBSEYsa0JBQVEsQ0FHRTtBQUZqQixrRUFBNEM7QUFFekIseUJBRlosc0JBQWMsQ0FFWSJ9