UNPKG

solver-sdk

Version:

SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system

151 lines 6.7 kB
"use strict"; /** * Централизованный маппер ошибок * Преобразует Axios errors в типизированные SDK исключения */ Object.defineProperty(exports, "__esModule", { value: true }); exports.ErrorMapper = void 0; const sdk_errors_js_1 = require("../errors/sdk-errors.js"); /** * Класс для маппинга HTTP ошибок на типизированные исключения SDK */ class ErrorMapper { /** * Маппит Axios error на типизированное SDK исключение * @param axiosError Ошибка от Axios * @returns Типизированное исключение SDK */ static mapError(axiosError) { const response = axiosError.response; // 1. Network errors (нет ответа от сервера) if (!response) { return new sdk_errors_js_1.NetworkError(axiosError.message || 'Network error occurred', { originalError: axiosError }); } const status = response.status; const data = response.data || {}; // Извлекаем errorType из backend response // Backend структура: { success: false, error: { type, message, code }, requestId, timestamp } const errorType = data.error?.type || this.inferErrorType(status); const message = data.error?.message || data.message || axiosError.message || 'Unknown error'; const details = { ...data, originalError: axiosError, }; // 2. Специальные случаи (приоритет - проверяем первыми) // LimitExceededError: 403 + credits_limit_exceeded // Backend отправляет: { success: false, error: { type, message, details: { balance, action, plan } } } if (status === 403 && errorType === 'credits_limit_exceeded') { // Передаем data.error, т.к. LimitExceededError ожидает { message, details } return new sdk_errors_js_1.LimitExceededError(data.error || data); } // RateLimitError: 429 if (status === 429) { return new sdk_errors_js_1.RateLimitError(data.error || data); } // 3. Маппинг по errorType из backend switch (errorType) { case 'unauthorized': return new sdk_errors_js_1.AuthenticationError(message, details); case 'forbidden': return new sdk_errors_js_1.ForbiddenError(message, details); case 'validation_error': return new sdk_errors_js_1.ValidationError(message, details); case 'not_found': return new sdk_errors_js_1.NotFoundError(message, details); case 'conflict': return new sdk_errors_js_1.ConflictError(message, details); case 'bad_request': return new sdk_errors_js_1.BadRequestError(message, details); case 'database_error': return new sdk_errors_js_1.DatabaseError(message, details); case 'timeout_error': case 'gateway_timeout': return new sdk_errors_js_1.TimeoutError(message, details); case 'internal_server_error': case 'server_error': return new sdk_errors_js_1.InternalServerError(message, details); case 'service_unavailable': return new sdk_errors_js_1.ServiceUnavailableError(message, details); case 'rate_limit_exceeded': return new sdk_errors_js_1.RateLimitError(data.error || data); case 'credits_limit_exceeded': return new sdk_errors_js_1.LimitExceededError(data.error || data); default: // 4. Fallback по HTTP статусу return this.mapByStatusCode(status, message, details); } } /** * Определяет тип ошибки по HTTP статусу (fallback) */ static inferErrorType(status) { if (status === 401) return 'unauthorized'; if (status === 403) return 'forbidden'; if (status === 404) return 'not_found'; if (status === 422) return 'validation_error'; if (status === 409) return 'conflict'; if (status === 400) return 'bad_request'; if (status === 429) return 'rate_limit_exceeded'; if (status === 408) return 'timeout_error'; if (status === 503) return 'service_unavailable'; if (status === 504) return 'gateway_timeout'; if (status >= 500) return 'internal_server_error'; return 'unknown_error'; } /** * Маппит ошибку по HTTP статусу (fallback когда errorType неизвестен) */ static mapByStatusCode(status, message, details) { // 4xx Client Errors if (status === 401) { return new sdk_errors_js_1.AuthenticationError(message, details); } if (status === 403) { return new sdk_errors_js_1.ForbiddenError(message, details); } if (status === 404) { return new sdk_errors_js_1.NotFoundError(message, details); } if (status === 422) { return new sdk_errors_js_1.ValidationError(message, details); } if (status === 409) { return new sdk_errors_js_1.ConflictError(message, details); } if (status === 400) { return new sdk_errors_js_1.BadRequestError(message, details); } if (status === 408) { return new sdk_errors_js_1.TimeoutError(message, details); } if (status === 429) { // В details уже есть все данные response (включая error если есть) return new sdk_errors_js_1.RateLimitError(details.error || details); } // 5xx Server Errors if (status === 503) { return new sdk_errors_js_1.ServiceUnavailableError(message, details); } if (status === 504) { return new sdk_errors_js_1.GatewayTimeoutError(message, details); } if (status >= 500) { return new sdk_errors_js_1.InternalServerError(message, details); } // Unknown error - возвращаем базовый класс return new sdk_errors_js_1.BaseSDKError(status, 'unknown_error', message, details); } } exports.ErrorMapper = ErrorMapper; //# sourceMappingURL=error-mapper.js.map