@renegade-fi/core
Version:
VanillaJS library for Renegade
54 lines (48 loc) • 1.85 kB
text/typescript
import axios, { type AxiosError } from 'axios'
export class PriceReporterError extends Error {
constructor(message: string) {
super(`PriceReporterError: ${message}`)
Object.setPrototypeOf(this, PriceReporterError.prototype)
}
}
export class HttpError extends PriceReporterError {
public status?: number
public details?: unknown
/**
* Creates a new HttpError with detailed error information
* @param error - The original error (typically an AxiosError)
* @param url - The URL that was being accessed
* @param method - The HTTP method that was being used
* @param customMessage - Optional custom message prefix (defaults to "HTTP request failed")
*/
constructor(
error: unknown,
url: string,
method: string,
customMessage = 'HTTP request failed',
) {
const requestInfo = `[${method.toUpperCase()}] ${url}`
let finalMessage = `${customMessage} - ${requestInfo}`
if (axios.isAxiosError(error)) {
const axiosError = error as AxiosError
if (axiosError.response) {
const { status, statusText, data } = axiosError.response
const errorCode = axiosError.code ? ` (${axiosError.code})` : ''
const errorMessage = typeof data === 'string' ? `: ${data}` : ''
finalMessage = `${finalMessage} - Received ${status} ${statusText}${errorCode}${errorMessage}`
} else if (axiosError.request) {
finalMessage = `${finalMessage} - No response received from server`
} else {
finalMessage = `${finalMessage} - Request failed: ${axiosError.message}`
}
}
super(finalMessage)
Object.setPrototypeOf(this, HttpError.prototype)
if (axios.isAxiosError(error) && error.response) {
this.status = error.response.status
this.details = error.response.data
} else {
this.details = error
}
}
}