From d1f7b043e87eedd271137a831fb13708cedd897e Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Fri, 23 May 2025 19:08:04 +0100 Subject: [PATCH] chore: Improve error handling for avatar API, shouldn't result in timeouts (#21493) --- .../auth/signup/utils/prefillAvatar.ts | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/packages/features/auth/signup/utils/prefillAvatar.ts b/packages/features/auth/signup/utils/prefillAvatar.ts index e94f29e4be..628c53a788 100644 --- a/packages/features/auth/signup/utils/prefillAvatar.ts +++ b/packages/features/auth/signup/utils/prefillAvatar.ts @@ -60,24 +60,42 @@ const getImageUrlAvatarAPI = async (email: string) => { return null; } - const response = await fetch("https://avatarapi.com/v2/api.aspx", { - method: "POST", - headers: { - "Content-Type": "text/plain", - }, - body: JSON.stringify({ - username: process.env.AVATARAPI_USERNAME, - password: process.env.AVATARAPI_PASSWORD, - email: email, - }), - }); + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 10_000); - const info = await response.json(); + try { + const response = await fetch("https://avatarapi.com/v2/api.aspx", { + method: "POST", + headers: { + "Content-Type": "text/plain", + }, + body: JSON.stringify({ + username: process.env.AVATARAPI_USERNAME, + password: process.env.AVATARAPI_PASSWORD, + email, + }), + signal: controller.signal, + }); - if (!info.Success) { - console.log("Error from avatar api: ", info.Error); + clearTimeout(timeout); + + const info = await response.json(); + + if (!info.Success) { + if (info.Error === "Not found") { + // Expected case: no avatar for this email + return null; + } + console.warn("Avatar API error:", info.Error); + return null; + } + return info.Image as string; + } catch (error: unknown) { + if (error instanceof DOMException && error.name === "AbortError") { + console.warn("Avatar API request timed out"); + } else { + console.error("Avatar API request failed:", error); + } return null; } - - return info.Image as string; };