import { AxiosError, CanceledError } from 'axios'; import { ApiError, ApiTimeoutError } from '../errors'; import { parseAxiosErrorMessage } from './parseAxiosErrorMessage'; const withSourcePrefix = (message: string, source?: string): string => { if (!source) return message; return `[${source}] ${message}`; }; const parseAxiosError = (error: AxiosError, source?: string): ApiError => { // handle timeout from axios `timeout` config property // or from AbortController injected in callApi method if (error.code === 'ECONNABORTED' && error.message?.startsWith('timeout') || error instanceof CanceledError && (error.config?.signal as AbortSignal)?.reason instanceof ApiTimeoutError) { let errorMessage = 'Request timeout out'; const timeoutMs = error.config?.timeout; if (timeoutMs) errorMessage += ` after ${timeoutMs} ms`; return new ApiTimeoutError(withSourcePrefix(errorMessage, source), { cause: error, statusCode: error.status, }); } return new ApiError(withSourcePrefix(parseAxiosErrorMessage(error), source), { cause: error, statusCode: error.status, }); }; export default parseAxiosError;