@cryptexlabs/codex-nodejs-common 0.7.3 → 0.7.4
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/lib/package.json +1 -1
- package/lib/src/exception/friendly-http-exception.d.ts +2 -1
- package/lib/src/exception/friendly-http-exception.js +2 -1
- package/lib/src/exception/friendly-http-exception.js.map +1 -1
- package/lib/src/filter/app-http-exception-filter.js +29 -11
- package/lib/src/filter/app-http-exception-filter.js.map +1 -1
- package/lib/src/util/locale.util.js +4 -4
- package/lib/src/util/locale.util.js.map +1 -1
- package/package.json +1 -1
- package/src/exception/friendly-http-exception.ts +3 -1
- package/src/filter/app-http-exception-filter.ts +32 -12
- package/src/util/locale.util.ts +8 -4
package/lib/package.json
CHANGED
|
@@ -3,5 +3,6 @@ import { Context } from "../context";
|
|
|
3
3
|
export declare class FriendlyHttpException extends HttpException {
|
|
4
4
|
readonly context: Context;
|
|
5
5
|
readonly userMessage: string;
|
|
6
|
-
|
|
6
|
+
readonly stack: string;
|
|
7
|
+
constructor(response: string | Record<string, any>, context: Context, userMessage: string, status: HttpStatus, stack: string);
|
|
7
8
|
}
|
|
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.FriendlyHttpException = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
class FriendlyHttpException extends common_1.HttpException {
|
|
6
|
-
constructor(response, context, userMessage, status) {
|
|
6
|
+
constructor(response, context, userMessage, status, stack) {
|
|
7
7
|
super(response, status);
|
|
8
8
|
this.context = context;
|
|
9
9
|
this.userMessage = userMessage;
|
|
10
|
+
this.stack = stack;
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
exports.FriendlyHttpException = FriendlyHttpException;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"friendly-http-exception.js","sourceRoot":"","sources":["../../../src/exception/friendly-http-exception.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAG3D,MAAa,qBAAsB,SAAQ,sBAAa;IACtD,YACE,QAAsC,EACtB,OAAgB,EAChB,WAAmB,EACnC,MAAkB;
|
|
1
|
+
{"version":3,"file":"friendly-http-exception.js","sourceRoot":"","sources":["../../../src/exception/friendly-http-exception.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAG3D,MAAa,qBAAsB,SAAQ,sBAAa;IACtD,YACE,QAAsC,EACtB,OAAgB,EAChB,WAAmB,EACnC,MAAkB,EAEF,KAAa;QAE7B,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QANR,YAAO,GAAP,OAAO,CAAS;QAChB,gBAAW,GAAX,WAAW,CAAQ;QAGnB,UAAK,GAAL,KAAK,CAAQ;IAG/B,CAAC;CACF;AAXD,sDAWC"}
|
|
@@ -32,15 +32,30 @@ let AppHttpExceptionFilter = class AppHttpExceptionFilter extends core_1.BaseExc
|
|
|
32
32
|
const logger = exception instanceof exception_1.FriendlyHttpException
|
|
33
33
|
? exception.context.logger
|
|
34
34
|
: this.fallbackLogger;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
let developerText = this.getDeveloperText(exception, this.fallbackLocale);
|
|
36
|
+
const stack = exception.stack && typeof exception.stack === "string"
|
|
37
|
+
? exception.stack.split("\n").map((line) => line.trim())
|
|
38
|
+
: "No stack available. Very sad";
|
|
39
|
+
if (developerText) {
|
|
40
|
+
logger.error(developerText, {
|
|
41
|
+
request: {
|
|
42
|
+
headers: request.headers,
|
|
43
|
+
body: request.body,
|
|
44
|
+
url: request.url,
|
|
45
|
+
method: request.method,
|
|
46
|
+
stack,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
logger.error([
|
|
52
|
+
"Error not explained",
|
|
53
|
+
"This probably means someone wrote code that throws an error without an error message",
|
|
54
|
+
"This should never happen!",
|
|
55
|
+
].join(". "), {
|
|
56
|
+
stack,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
44
59
|
if (!(exception instanceof common_1.HttpException) && exception.stack) {
|
|
45
60
|
logger.error(exception.stack);
|
|
46
61
|
}
|
|
@@ -57,8 +72,8 @@ let AppHttpExceptionFilter = class AppHttpExceptionFilter extends core_1.BaseExc
|
|
|
57
72
|
const started = exception instanceof exception_1.FriendlyHttpException
|
|
58
73
|
? exception.context.started
|
|
59
74
|
: undefined;
|
|
60
|
-
|
|
61
|
-
const userMessage = exception
|
|
75
|
+
developerText = this.getDeveloperText(exception, locale);
|
|
76
|
+
const userMessage = exception.userMessage ? exception.userMessage : "";
|
|
62
77
|
const errorHttpResponse = new response_1.ErrorHttpResponse(status, locale, new response_1.ErrorMessage(locale, locales_1.i18nData, null, null, developerText, userMessage), exception.stack || null, this.config, correlationId, started);
|
|
63
78
|
response.status(status).json(errorHttpResponse);
|
|
64
79
|
}
|
|
@@ -80,6 +95,9 @@ let AppHttpExceptionFilter = class AppHttpExceptionFilter extends core_1.BaseExc
|
|
|
80
95
|
else if (exception.message.message) {
|
|
81
96
|
developerText = exception.message.message;
|
|
82
97
|
}
|
|
98
|
+
else if (exception.getResponse) {
|
|
99
|
+
developerText = exception.getResponse();
|
|
100
|
+
}
|
|
83
101
|
else {
|
|
84
102
|
developerText = exception.message;
|
|
85
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-http-exception-filter.js","sourceRoot":"","sources":["../../../src/filter/app-http-exception-filter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAQwB;AACxB,uCAAmD;AAEnD,0CAA8D;AAC9D,4CAAqD;AACrD,oEAAuD;AACvD,gDAA8C;AAC9C,0CAA8C;AAC9C,sCAA0C;AAI1C,IAAa,sBAAsB,GAAnC,MAAa,sBAAuB,SAAQ,0BAAmB;IAC7D,YACmB,cAAsB,EACtB,cAA6B,EAC7B,MAAqB,EACtC,cAA2B;QAE3B,KAAK,CAAC,cAAc,CAAC,CAAC;QALL,mBAAc,GAAd,cAAc,CAAQ;QACtB,mBAAc,GAAd,cAAc,CAAe;QAC7B,WAAM,GAAN,MAAM,CAAe;IAIxC,CAAC;IAED,KAAK,CAAC,SAAc,EAAE,IAAmB;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAW,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAEnC,MAAM,MAAM,GACV,SAAS,YAAY,iCAAqB;YACxC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM;YAC1B,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAE1B,MAAM,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"app-http-exception-filter.js","sourceRoot":"","sources":["../../../src/filter/app-http-exception-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ const locales_1 = require("../locales/locales");
|
|
|
8
8
|
class LocaleUtil {
|
|
9
9
|
static getLocaleFromAcceptLanguageHeader(context, langCode) {
|
|
10
10
|
if (!langCode) {
|
|
11
|
-
throw new exception_1.FriendlyHttpException(`Accept language header is not set`, context, locales_1.i18nData.__({ phrase: "an-error-occurred", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST);
|
|
11
|
+
throw new exception_1.FriendlyHttpException(`Accept language header is not set`, context, locales_1.i18nData.__({ phrase: "an-error-occurred", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
12
12
|
}
|
|
13
13
|
const parts = langCode.split("-");
|
|
14
14
|
let language;
|
|
@@ -23,7 +23,7 @@ class LocaleUtil {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
if (!language || !country) {
|
|
26
|
-
throw new exception_1.FriendlyHttpException(`Invalid Accept-Language header: ${langCode}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST);
|
|
26
|
+
throw new exception_1.FriendlyHttpException(`Invalid Accept-Language header: ${langCode}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.BAD_REQUEST, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
else {
|
|
@@ -39,10 +39,10 @@ class LocaleUtil {
|
|
|
39
39
|
}
|
|
40
40
|
country = country.split(",")[0];
|
|
41
41
|
if (!codex_data_model_1.ValidLanguageCodes.includes(language)) {
|
|
42
|
-
throw new exception_1.FriendlyHttpException(`Invalid language code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE);
|
|
42
|
+
throw new exception_1.FriendlyHttpException(`Invalid language code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
43
43
|
}
|
|
44
44
|
if (!codex_data_model_1.ValidCountryCodes.includes(country)) {
|
|
45
|
-
throw new exception_1.FriendlyHttpException(`Invalid country code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE);
|
|
45
|
+
throw new exception_1.FriendlyHttpException(`Invalid country code: ${country}`, context, locales_1.i18nData.__({ phrase: "language-not-supported", locale: "en-US" }), common_1.HttpStatus.NOT_ACCEPTABLE, "LocaleUtil\ngetLocaleFromAcceptLanguageHeader");
|
|
46
46
|
}
|
|
47
47
|
return new codex_data_model_1.Locale(language, country);
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale.util.js","sourceRoot":"","sources":["../../../src/util/locale.util.ts"],"names":[],"mappings":";;;AAAA,oEAOuC;AACvC,2CAA4C;AAC5C,4CAAqD;AAErD,gDAA8C;AAE9C,MAAa,UAAU;IACd,MAAM,CAAC,iCAAiC,CAC7C,OAAgB,EAChB,QAAgB;QAEhB,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,iCAAqB,CAC7B,mCAAmC,EACnC,OAAO,EACP,kBAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC7D,mBAAU,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"locale.util.js","sourceRoot":"","sources":["../../../src/util/locale.util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,9 @@ export class FriendlyHttpException extends HttpException {
|
|
|
6
6
|
response: string | Record<string, any>,
|
|
7
7
|
public readonly context: Context,
|
|
8
8
|
public readonly userMessage: string,
|
|
9
|
-
status: HttpStatus
|
|
9
|
+
status: HttpStatus,
|
|
10
|
+
|
|
11
|
+
public readonly stack: string
|
|
10
12
|
) {
|
|
11
13
|
super(response, status);
|
|
12
14
|
}
|
|
@@ -38,15 +38,34 @@ export class AppHttpExceptionFilter extends BaseExceptionFilter {
|
|
|
38
38
|
? exception.context.logger
|
|
39
39
|
: this.fallbackLogger;
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
41
|
+
let developerText = this.getDeveloperText(exception, this.fallbackLocale);
|
|
42
|
+
const stack =
|
|
43
|
+
exception.stack && typeof exception.stack === "string"
|
|
44
|
+
? exception.stack.split("\n").map((line) => line.trim())
|
|
45
|
+
: "No stack available. Very sad";
|
|
46
|
+
|
|
47
|
+
if (developerText) {
|
|
48
|
+
logger.error(developerText, {
|
|
49
|
+
request: {
|
|
50
|
+
headers: request.headers,
|
|
51
|
+
body: request.body,
|
|
52
|
+
url: request.url,
|
|
53
|
+
method: request.method,
|
|
54
|
+
stack,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
logger.error(
|
|
59
|
+
[
|
|
60
|
+
"Error not explained",
|
|
61
|
+
"This probably means someone wrote code that throws an error without an error message",
|
|
62
|
+
"This should never happen!",
|
|
63
|
+
].join(". "),
|
|
64
|
+
{
|
|
65
|
+
stack,
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
50
69
|
|
|
51
70
|
// If this is a normal error it means something random occurred and we want the stacktrace
|
|
52
71
|
if (!(exception instanceof HttpException) && exception.stack) {
|
|
@@ -74,10 +93,9 @@ export class AppHttpExceptionFilter extends BaseExceptionFilter {
|
|
|
74
93
|
? exception.context.started
|
|
75
94
|
: undefined;
|
|
76
95
|
|
|
77
|
-
|
|
96
|
+
developerText = this.getDeveloperText(exception, locale);
|
|
78
97
|
|
|
79
|
-
const userMessage =
|
|
80
|
-
exception instanceof FriendlyHttpException ? exception.userMessage : "";
|
|
98
|
+
const userMessage = exception.userMessage ? exception.userMessage : "";
|
|
81
99
|
|
|
82
100
|
const errorHttpResponse = new ErrorHttpResponse(
|
|
83
101
|
status,
|
|
@@ -114,6 +132,8 @@ export class AppHttpExceptionFilter extends BaseExceptionFilter {
|
|
|
114
132
|
}
|
|
115
133
|
} else if (exception.message.message) {
|
|
116
134
|
developerText = exception.message.message;
|
|
135
|
+
} else if (exception.getResponse) {
|
|
136
|
+
developerText = exception.getResponse();
|
|
117
137
|
} else {
|
|
118
138
|
developerText = exception.message;
|
|
119
139
|
}
|
package/src/util/locale.util.ts
CHANGED
|
@@ -21,7 +21,8 @@ export class LocaleUtil {
|
|
|
21
21
|
`Accept language header is not set`,
|
|
22
22
|
context,
|
|
23
23
|
i18nData.__({ phrase: "an-error-occurred", locale: "en-US" }),
|
|
24
|
-
HttpStatus.BAD_REQUEST
|
|
24
|
+
HttpStatus.BAD_REQUEST,
|
|
25
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
25
26
|
);
|
|
26
27
|
}
|
|
27
28
|
const parts = langCode.split("-");
|
|
@@ -43,7 +44,8 @@ export class LocaleUtil {
|
|
|
43
44
|
`Invalid Accept-Language header: ${langCode}`,
|
|
44
45
|
context,
|
|
45
46
|
i18nData.__({ phrase: "language-not-supported", locale: "en-US" }),
|
|
46
|
-
HttpStatus.BAD_REQUEST
|
|
47
|
+
HttpStatus.BAD_REQUEST,
|
|
48
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
47
49
|
);
|
|
48
50
|
}
|
|
49
51
|
} else {
|
|
@@ -65,7 +67,8 @@ export class LocaleUtil {
|
|
|
65
67
|
`Invalid language code: ${country}`,
|
|
66
68
|
context,
|
|
67
69
|
i18nData.__({ phrase: "language-not-supported", locale: "en-US" }),
|
|
68
|
-
HttpStatus.NOT_ACCEPTABLE
|
|
70
|
+
HttpStatus.NOT_ACCEPTABLE,
|
|
71
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
69
72
|
);
|
|
70
73
|
}
|
|
71
74
|
if (!ValidCountryCodes.includes(country)) {
|
|
@@ -73,7 +76,8 @@ export class LocaleUtil {
|
|
|
73
76
|
`Invalid country code: ${country}`,
|
|
74
77
|
context,
|
|
75
78
|
i18nData.__({ phrase: "language-not-supported", locale: "en-US" }),
|
|
76
|
-
HttpStatus.NOT_ACCEPTABLE
|
|
79
|
+
HttpStatus.NOT_ACCEPTABLE,
|
|
80
|
+
"LocaleUtil\ngetLocaleFromAcceptLanguageHeader"
|
|
77
81
|
);
|
|
78
82
|
}
|
|
79
83
|
|