coffee-core
Version:
Coffee IT API core library
123 lines • 5.52 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var AllExceptionsFilter_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AllExceptionsFilter = void 0;
const common_1 = require("@nestjs/common");
const rxjs_1 = require("rxjs");
const custom_logger_1 = require("../logger/custom-logger");
const status_exception_1 = require("./status-exception");
const UNKNOWN_ERROR_MESSAGE = 'Internal server error';
const UNKNOWN_ERROR_TYPE = 'unknown_error_type';
let AllExceptionsFilter = class AllExceptionsFilter {
static { AllExceptionsFilter_1 = this; }
logger = new custom_logger_1.CustomLogger(AllExceptionsFilter_1.name);
static statusCodeRegex = /^[1-5][0-9][0-9]$/;
static getStatusFromMessage(message) {
const status = message.replace(/(^\d+)(.+$)/i, '$1');
const defaultStatus = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
if (!this.isStatusCode(status)) {
return defaultStatus;
}
return parseInt(status, 10) || defaultStatus;
}
static isStatusCode(status) {
return this.statusCodeRegex.test(status);
}
static removeStatusFromMessage(statusCode, message) {
const statusCodeMessage = statusCode.toString();
const index = message.indexOf(statusCodeMessage);
if (index < 0) {
return message;
}
return message.substring(index + statusCodeMessage.length).trim();
}
catch(exception, host) {
if (typeof exception === 'object') {
this.logger.error(`Caught exception ${JSON.stringify(exception, null, 2)}`);
}
else {
this.logger.error(`Caught exception ${exception}`);
}
const ctx = host.switchToHttp();
const type = host.getType();
const response = ctx.getResponse();
const request = ctx.getRequest();
let requestInfo;
const date = new Date();
if (type === 'http') {
requestInfo = `Type: HTTPS, IP: ${request.ip}. User Agent: ${request.headers['user-agent']}`;
}
else if (type === 'rpc') {
requestInfo = 'Type: RPC';
}
console.log(date.toISOString(), ' - UnhandledError caught in coffee-core:', exception, 'Request info:', requestInfo);
if (exception instanceof common_1.HttpException) {
const exceptionStatusCode = exception.getStatus();
let resultMessage = exception.message;
let errorType = exception['response'].error || UNKNOWN_ERROR_TYPE;
const objectResponse = exception.getResponse();
const objectResponseMessage = objectResponse?.message;
if (objectResponseMessage) {
if (Array.isArray(objectResponseMessage)) {
resultMessage = objectResponseMessage[0];
}
else {
resultMessage = objectResponseMessage;
}
}
return this.handleExceptionResponse(response, {
code: exceptionStatusCode,
message: resultMessage || '',
type: errorType
});
}
if (exception instanceof status_exception_1.StatusException) {
return this.handleExceptionResponse(response, {
code: exception.status || common_1.HttpStatus.INTERNAL_SERVER_ERROR,
message: exception.message || UNKNOWN_ERROR_MESSAGE,
type: exception.type || UNKNOWN_ERROR_TYPE
});
}
return this.handleExceptionResponse(response, this.handleUnknownException(exception));
}
handleUnknownException(exception) {
const message = typeof exception === 'string' ? exception : exception.message;
if (message) {
const statusCode = AllExceptionsFilter_1.getStatusFromMessage(message) || common_1.HttpStatus.INTERNAL_SERVER_ERROR;
const newMessage = AllExceptionsFilter_1.removeStatusFromMessage(statusCode, message);
return {
code: statusCode,
message: newMessage,
type: UNKNOWN_ERROR_TYPE
};
}
return {
code: common_1.HttpStatus.INTERNAL_SERVER_ERROR,
message: UNKNOWN_ERROR_MESSAGE,
type: UNKNOWN_ERROR_TYPE
};
}
handleExceptionResponse(response, error) {
if (!response.status) {
return (0, rxjs_1.throwError)(() => `${error.code} ${error.message}`);
}
response.status(error.code).json({
...error,
type: this.formatErrorType(error.type)
});
}
formatErrorType(type) {
return type.trim().toLowerCase().replaceAll(' ', '_');
}
};
exports.AllExceptionsFilter = AllExceptionsFilter;
exports.AllExceptionsFilter = AllExceptionsFilter = AllExceptionsFilter_1 = __decorate([
(0, common_1.Catch)()
], AllExceptionsFilter);
//# sourceMappingURL=all-exceptions-filter.js.map