This commit is contained in:
Owen
2025-08-23 15:13:44 -07:00
parent 04077c53fd
commit 5df87641a1
3 changed files with 102 additions and 41 deletions

View File

@@ -21,11 +21,22 @@ async function getLatestNewtVersion(): Promise<string | null> {
return cachedVersion; return cachedVersion;
} }
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 1500); // Reduced timeout to 1.5 seconds
const response = await fetch( const response = await fetch(
"https://api.github.com/repos/fosrl/newt/tags" "https://api.github.com/repos/fosrl/newt/tags",
{
signal: controller.signal
}
); );
clearTimeout(timeoutId);
if (!response.ok) { if (!response.ok) {
logger.warn("Failed to fetch latest Newt version from GitHub"); logger.warn(
`Failed to fetch latest Newt version from GitHub: ${response.status} ${response.statusText}`
);
return null; return null;
} }
@@ -40,8 +51,21 @@ async function getLatestNewtVersion(): Promise<string | null> {
newtVersionCache.set("latestNewtVersion", latestVersion); newtVersionCache.set("latestNewtVersion", latestVersion);
return latestVersion; return latestVersion;
} catch (error) { } catch (error: any) {
logger.error("Error fetching latest Newt version:", error); if (error.name === "AbortError") {
logger.warn(
"Request to fetch latest Newt version timed out (1.5s)"
);
} else if (error.cause?.code === "UND_ERR_CONNECT_TIMEOUT") {
logger.warn(
"Connection timeout while fetching latest Newt version"
);
} else {
logger.warn(
"Error fetching latest Newt version:",
error.message || error
);
}
return null; return null;
} }
} }
@@ -190,33 +214,48 @@ export async function listSites(
const totalCountResult = await countQuery; const totalCountResult = await countQuery;
const totalCount = totalCountResult[0].count; const totalCount = totalCountResult[0].count;
const latestNewtVersion = await getLatestNewtVersion(); // Get latest version asynchronously without blocking the response
const latestNewtVersionPromise = getLatestNewtVersion();
const sitesWithUpdates: SiteWithUpdateAvailable[] = sitesList.map( const sitesWithUpdates: SiteWithUpdateAvailable[] = sitesList.map(
(site) => { (site) => {
const siteWithUpdate: SiteWithUpdateAvailable = { ...site }; const siteWithUpdate: SiteWithUpdateAvailable = { ...site };
// Initially set to false, will be updated if version check succeeds
if ( siteWithUpdate.newtUpdateAvailable = false;
site.type === "newt" &&
site.newtVersion &&
latestNewtVersion
) {
try {
siteWithUpdate.newtUpdateAvailable = semver.lt(
site.newtVersion,
latestNewtVersion
);
} catch (error) {
siteWithUpdate.newtUpdateAvailable = false;
}
} else {
siteWithUpdate.newtUpdateAvailable = false;
}
return siteWithUpdate; return siteWithUpdate;
} }
); );
// Try to get the latest version, but don't block if it fails
try {
const latestNewtVersion = await latestNewtVersionPromise;
if (latestNewtVersion) {
sitesWithUpdates.forEach((site) => {
if (
site.type === "newt" &&
site.newtVersion &&
latestNewtVersion
) {
try {
site.newtUpdateAvailable = semver.lt(
site.newtVersion,
latestNewtVersion
);
} catch (error) {
site.newtUpdateAvailable = false;
}
}
});
}
} catch (error) {
// Log the error but don't let it block the response
logger.warn(
"Failed to check for Newt updates, continuing without update info:",
error
);
}
return response<ListSitesResponse>(res, { return response<ListSitesResponse>(res, {
data: { data: {
sites: sitesWithUpdates, sites: sitesWithUpdates,

View File

@@ -331,9 +331,16 @@ export default function Page() {
let olmVersion = "latest"; let olmVersion = "latest";
try { try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 3000);
const response = await fetch( const response = await fetch(
`https://api.github.com/repos/fosrl/olm/releases/latest` `https://api.github.com/repos/fosrl/olm/releases/latest`,
{ signal: controller.signal }
); );
clearTimeout(timeoutId);
if (!response.ok) { if (!response.ok) {
throw new Error( throw new Error(
t("olmErrorFetchReleases", { t("olmErrorFetchReleases", {
@@ -345,14 +352,18 @@ export default function Page() {
const latestVersion = data.tag_name; const latestVersion = data.tag_name;
olmVersion = latestVersion; olmVersion = latestVersion;
} catch (error) { } catch (error) {
console.error( if (error instanceof Error && error.name === 'AbortError') {
t("olmErrorFetchLatest", { console.error(t("olmErrorFetchTimeout"));
err: } else {
error instanceof Error console.error(
? error.message t("olmErrorFetchLatest", {
: String(error) err:
}) error instanceof Error
); ? error.message
: String(error)
})
);
}
} }
await api await api

View File

@@ -488,9 +488,16 @@ WantedBy=default.target`
let currentNewtVersion = "latest"; let currentNewtVersion = "latest";
try { try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 3000);
const response = await fetch( const response = await fetch(
`https://api.github.com/repos/fosrl/newt/releases/latest` `https://api.github.com/repos/fosrl/newt/releases/latest`,
{ signal: controller.signal }
); );
clearTimeout(timeoutId);
if (!response.ok) { if (!response.ok) {
throw new Error( throw new Error(
t("newtErrorFetchReleases", { t("newtErrorFetchReleases", {
@@ -503,14 +510,18 @@ WantedBy=default.target`
currentNewtVersion = latestVersion; currentNewtVersion = latestVersion;
setNewtVersion(latestVersion); setNewtVersion(latestVersion);
} catch (error) { } catch (error) {
console.error( if (error instanceof Error && error.name === 'AbortError') {
t("newtErrorFetchLatest", { console.error(t("newtErrorFetchTimeout"));
err: } else {
error instanceof Error console.error(
? error.message t("newtErrorFetchLatest", {
: String(error) err:
}) error instanceof Error
); ? error.message
: String(error)
})
);
}
} }
const generatedKeypair = generateKeypair(); const generatedKeypair = generateKeypair();