Surface underlying network error instead of generic 'fetch failed'

undici's fetch() collapses DNS/TLS/connection-refused/timeout failures into a vague TypeError. Unwrap err.cause so Test Connection shows the real reason (e.g. ECONNREFUSED, certificate error) instead of just 'fetch failed'.
This commit is contained in:
Claude 2026-06-20 10:31:11 +00:00
parent 9157a2647a
commit cbd666fe60
No known key found for this signature in database

View file

@ -16,6 +16,17 @@ function authHeader(apiKey: string): Record<string, string> {
// Proxmox ships with a self-signed cert by default, which Node's fetch rejects out of the box. // Proxmox ships with a self-signed cert by default, which Node's fetch rejects out of the box.
const insecureDispatcher = new Agent({ connect: { rejectUnauthorized: false } }) const insecureDispatcher = new Agent({ connect: { rejectUnauthorized: false } })
// undici's fetch() wraps the real failure (DNS, TLS, connection refused/timed out) in a generic
// "fetch failed" TypeError — unwrap err.cause so the actual reason reaches the UI.
function describeFetchError(err: unknown): string {
if (err instanceof Error) {
const cause = (err as { cause?: unknown }).cause
if (cause instanceof Error) return `${err.message}: ${cause.message}`
return err.message
}
return 'Connection failed'
}
export const proxmox: IntegrationAdapter = { export const proxmox: IntegrationAdapter = {
async testConnection(config, secrets) { async testConnection(config, secrets) {
const baseUrl = config.baseUrl?.replace(/\/$/, '') const baseUrl = config.baseUrl?.replace(/\/$/, '')
@ -30,7 +41,7 @@ export const proxmox: IntegrationAdapter = {
if (!res.ok) return { ok: false, message: `HTTP ${res.status}` } if (!res.ok) return { ok: false, message: `HTTP ${res.status}` }
return { ok: true, message: 'Connected' } return { ok: true, message: 'Connected' }
} catch (err) { } catch (err) {
return { ok: false, message: err instanceof Error ? err.message : 'Connection failed' } return { ok: false, message: describeFetchError(err) }
} }
}, },