@dima_aryze/reforge
Version:
TypeScript/JavaScript SDK for Reforge - Cross-chain token operations
160 lines • 5.56 kB
JavaScript
"use strict";
/**
* Error transformation utilities for HTTP client
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ErrorTransformer = void 0;
const errors_1 = require("../errors");
/**
* Transforms various error types into Reforge SDK errors
*/
class ErrorTransformer {
/**
* Transform an error into a Reforge SDK error
*/
transform(error) {
// If already a Reforge error, return as-is
if (error instanceof errors_1.ReforgeError) {
return error;
}
// Handle timeout errors
if (this.isTimeoutError(error)) {
return errors_1.ReforgeNetworkError.timeout(error.config?.url);
}
// Handle connection errors
if (this.isConnectionError(error)) {
return errors_1.ReforgeNetworkError.connection(error.config?.url, error);
}
// Handle HTTP response errors
if (this.isHttpResponseError(error)) {
return this.transformHttpError(error);
}
// Handle axios request errors
if (this.isAxiosError(error)) {
return this.transformAxiosError(error);
}
// Generic error fallback
return new errors_1.ReforgeError(error?.message || 'An unknown error occurred', error);
}
/**
* Check if error is a timeout error
*/
isTimeoutError(error) {
return error.code === 'ECONNABORTED' || (error.message && error.message.includes('timeout'));
}
/**
* Check if error is a connection error
*/
isConnectionError(error) {
return (error.code === 'ENOTFOUND' ||
error.code === 'ECONNREFUSED' ||
error.code === 'ECONNRESET' ||
error.code === 'ENETUNREACH');
}
/**
* Check if error has HTTP response
*/
isHttpResponseError(error) {
return error.response && error.response.status;
}
/**
* Check if error is an axios error
*/
isAxiosError(error) {
return error.isAxiosError === true;
}
/**
* Transform HTTP response error
*/
transformHttpError(error) {
const { status, data } = error.response;
// Try to extract structured error from response
if (data && typeof data === 'object') {
return this.createApiErrorFromResponse(data, status);
}
// Create generic API error
return new errors_1.ReforgeApiError(error.message || `HTTP ${status} Error`, status, `HTTP_${status}`, data);
}
/**
* Transform axios-specific error
*/
transformAxiosError(error) {
if (error.request && !error.response) {
// Request was made but no response received
return new errors_1.ReforgeNetworkError('No response received from server', error.config?.url, false, error);
}
// Request setup error
return new errors_1.ReforgeError(error.message || 'Request configuration error', error);
}
/**
* Create API error from structured response data
*/
createApiErrorFromResponse(data, status) {
// Check for common error response formats
if (this.isStandardApiError(data)) {
return errors_1.ReforgeApiError.fromApiError(data, status);
}
// Handle various response formats
const message = this.extractErrorMessage(data);
const code = this.extractErrorCode(data, status);
const details = this.extractErrorDetails(data);
return new errors_1.ReforgeApiError(message, status, code, details);
}
/**
* Check if data matches standard API error format
*/
isStandardApiError(data) {
return (data &&
typeof data === 'object' &&
typeof data.code === 'string' &&
typeof data.message === 'string');
}
/**
* Extract error message from response data
*/
extractErrorMessage(data) {
// Try common message fields
const messageFields = ['message', 'error', 'detail', 'description'];
for (const field of messageFields) {
if (data[field] && typeof data[field] === 'string') {
return data[field];
}
}
// Handle error arrays
if (Array.isArray(data.errors) && data.errors.length > 0) {
const firstError = data.errors[0];
if (typeof firstError === 'string') {
return firstError;
}
if (firstError.message) {
return firstError.message;
}
}
return 'An API error occurred';
}
/**
* Extract error code from response data
*/
extractErrorCode(data, status) {
// Try common code fields
const codeFields = ['code', 'error_code', 'type', 'kind'];
for (const field of codeFields) {
if (data[field] && typeof data[field] === 'string') {
return data[field];
}
}
return `HTTP_${status}`;
}
/**
* Extract error details from response data
*/
extractErrorDetails(data) {
// Filter out known message/code fields to avoid duplication
/* eslint-disable no-unused-vars */
const { message: _message, error: _error, code: _code, error_code: _error_code, type: _type, kind: _kind, ...details } = data;
/* eslint-enable no-unused-vars */
return Object.keys(details).length > 0 ? details : undefined;
}
}
exports.ErrorTransformer = ErrorTransformer;
//# sourceMappingURL=errors.js.map