From 1b45ce1652c9761611a1bad709da96e29c0d863c Mon Sep 17 00:00:00 2001 From: Islam0953 Date: Wed, 25 Mar 2026 19:30:37 +0000 Subject: [PATCH] fix: add 10s timeout to registry URL validation to prevent indefinite hang When --registry-url points to an unreachable host, the CLI hangs forever because fetch() has no timeout. Add AbortController with 10s timeout, switch to HEAD method, and provide distinct error messages for timeout vs other network failures. Closes #2027 https://claude.ai/code/session_01K5UYcnS3skK6SKhFz3dcZs --- src/utils/generate/registry.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/utils/generate/registry.ts b/src/utils/generate/registry.ts index 16fdda2e5..96a669583 100644 --- a/src/utils/generate/registry.ts +++ b/src/utils/generate/registry.ts @@ -8,12 +8,22 @@ export function registryURLParser(input?: string) { export async function registryValidation(registryUrl?: string, registryAuth?: string, registryToken?: string) { if (!registryUrl) { return; } + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), 10000); try { - const response = await fetch(registryUrl as string); + const response = await fetch(registryUrl as string, { + method: 'HEAD', + signal: controller.signal, + }); if (response.status === 401 && !registryAuth && !registryToken) { throw new Error('You Need to pass either registryAuth in username:password encoded in Base64 or need to pass registryToken'); } - } catch { + } catch (error: unknown) { + if (error instanceof Error && error.name === 'AbortError') { + throw new Error(`Connection to registryURL timed out after 10s: ${registryUrl}`); + } throw new Error(`Can't fetch registryURL: ${registryUrl}`); + } finally { + clearTimeout(timer); } }