(error: unknown)
| 33 | * Extract structured error information from an unknown error |
| 34 | */ |
| 35 | export function extractErrorInfo(error: unknown): ErrorInfo { |
| 36 | const message = error instanceof Error ? error.message : 'Unknown error' |
| 37 | const messageLower = message.toLowerCase() |
| 38 | |
| 39 | if (typeof error !== 'object' || error === null) { |
| 40 | return { message, messageLower, responseErrorText: '' } |
| 41 | } |
| 42 | |
| 43 | const record = error as Record<string, unknown> |
| 44 | const axiosCode = typeof record.code === 'string' ? record.code : undefined |
| 45 | const response = typeof record.response === 'object' && record.response !== null |
| 46 | ? (record.response as Record<string, unknown>) |
| 47 | : undefined |
| 48 | const httpStatus = typeof response?.status === 'number' ? response.status : undefined |
| 49 | const responseData = response?.data |
| 50 | const responseError = typeof responseData === 'object' && responseData !== null |
| 51 | ? (responseData as Record<string, unknown>).error |
| 52 | : undefined |
| 53 | const responseErrorText = typeof responseError === 'string' ? responseError : '' |
| 54 | |
| 55 | // Protocol version: prefer direct property (set by apiValidationError), |
| 56 | // fall back to axios response header (set by server on error responses) |
| 57 | let serverProtocolVersion: number | undefined |
| 58 | if (typeof record.serverProtocolVersion === 'number' && Number.isFinite(record.serverProtocolVersion)) { |
| 59 | serverProtocolVersion = record.serverProtocolVersion |
| 60 | } else { |
| 61 | const headers = typeof response?.headers === 'object' && response.headers !== null |
| 62 | ? (response.headers as Record<string, unknown>) |
| 63 | : undefined |
| 64 | const protocolHeader = headers?.['x-hapi-protocol-version'] |
| 65 | if (typeof protocolHeader === 'string' && protocolHeader !== '') { |
| 66 | const pv = Number(protocolHeader) |
| 67 | if (Number.isFinite(pv)) serverProtocolVersion = pv |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | return { |
| 72 | message, |
| 73 | messageLower, |
| 74 | axiosCode, |
| 75 | httpStatus, |
| 76 | responseErrorText, |
| 77 | serverProtocolVersion |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | /** |
| 82 | * Check if an error is a retryable connection error |
no outgoing calls
no test coverage detected