@bitzonegaming/roleplay-engine-framework
Version:
Roleplay Engine Framework
68 lines (67 loc) • 2.76 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createErrorHandler = createErrorHandler;
const roleplay_engine_sdk_1 = require("@bitzonegaming/roleplay-engine-sdk");
const errors_1 = require("../../core/errors");
const service_1 = require("../../domains/localization/service");
/**
* Creates an error handler with access to the server context for localization
* @param context - The server context for accessing services
* @returns The error handler function
*/
function createErrorHandler(context) {
return async function errorHandler(error, request, reply) {
if (error instanceof roleplay_engine_sdk_1.EngineError) {
context.logger.error(`[EngineError] Http request failed for [${request.method}] ${request.url}`, error);
reply.status(error.statusCode).send({
key: error.key,
message: error.message,
params: error.params,
});
return;
}
if (error instanceof errors_1.GamemodeServerError) {
const acceptLanguage = request.headers['accept-language'];
const locale = acceptLanguage ? acceptLanguage.split(',')[0].split(';')[0].trim() : undefined;
const localizationService = context.getService(service_1.LocalizationService);
const translatedErrorMessage = localizationService.translateError(error.key, error.params, locale);
const message = error.message && translatedErrorMessage === error.key
? error.message
: translatedErrorMessage;
reply.status(error.statusCode).send({
key: error.key,
message: message,
params: error.params,
});
return;
}
// Handle validation errors
if ('validation' in error && error.validation) {
reply.status(400).send({
key: 'VALIDATION_ERROR',
message: 'Request validation failed',
params: {
details: JSON.stringify(error.validation),
},
});
return;
}
// Handle other Fastify errors
if ('statusCode' in error && typeof error.statusCode === 'number') {
reply.status(error.statusCode).send({
key: 'HTTP_ERROR',
message: error.message,
params: {},
});
return;
}
// Default to 500 for unknown errors
reply.status(500).send({
key: 'INTERNAL_SERVER_ERROR',
message: 'An unexpected error occurred',
params: {
message: error.message,
},
});
};
}