From 31ae1543ccb580f4f1648fd47567d0a868b2bdf9 Mon Sep 17 00:00:00 2001 From: OrbisK Date: Sat, 31 Jan 2026 13:16:15 +0100 Subject: [PATCH 1/3] perf: use `$fetch` timeout instead separate controller + timeout --- server/api/contributors.get.ts | 2 +- server/utils/docs/client.ts | 19 +++++-------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/server/api/contributors.get.ts b/server/api/contributors.get.ts index 7ce2c29fa1..5b54e4a08b 100644 --- a/server/api/contributors.get.ts +++ b/server/api/contributors.get.ts @@ -15,7 +15,7 @@ export default defineCachedEventHandler( { headers: { 'Accept': 'application/vnd.github.v3+json', - 'User-Agent': 'npmx.dev', + 'User-Agent': 'npmx', }, }, ) diff --git a/server/utils/docs/client.ts b/server/utils/docs/client.ts index 6cbcec44aa..eee2b337ad 100644 --- a/server/utils/docs/client.ts +++ b/server/utils/docs/client.ts @@ -88,15 +88,12 @@ function createLoader(): ( return undefined } - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS) - try { - const response = await fetch(url.toString(), { + const response = await $fetch.raw(url.toString(), { + method: 'GET', + timeout: FETCH_TIMEOUT_MS, redirect: 'follow', - signal: controller.signal, }) - clearTimeout(timeoutId) if (response.status !== 200) { return undefined @@ -115,7 +112,6 @@ function createLoader(): ( content, } } catch { - clearTimeout(timeoutId) return undefined } } @@ -156,18 +152,13 @@ function createResolver(): (specifier: string, referrer: string) => string { async function getTypesUrl(packageName: string, version: string): Promise { const url = `https://esm.sh/${packageName}@${version}` - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS) - try { - const response = await fetch(url, { + const response = await $fetch.raw(url, { method: 'HEAD', - signal: controller.signal, + timeout: FETCH_TIMEOUT_MS, }) - clearTimeout(timeoutId) return response.headers.get('x-typescript-types') } catch { - clearTimeout(timeoutId) return null } } From decdba619870e88e0f7c64ded6f7d5a5d58d3a1b Mon Sep 17 00:00:00 2001 From: OrbisK Date: Sat, 31 Jan 2026 17:04:24 +0100 Subject: [PATCH 2/3] fix: use `_data` instead of `text()` --- server/utils/docs/client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/utils/docs/client.ts b/server/utils/docs/client.ts index eee2b337ad..d8250bd82c 100644 --- a/server/utils/docs/client.ts +++ b/server/utils/docs/client.ts @@ -89,7 +89,7 @@ function createLoader(): ( } try { - const response = await $fetch.raw(url.toString(), { + const response = await $fetch.raw(url.toString(), { method: 'GET', timeout: FETCH_TIMEOUT_MS, redirect: 'follow', @@ -99,7 +99,7 @@ function createLoader(): ( return undefined } - const content = await response.text() + const content = response._data ?? '' const headers: Record = {} for (const [key, value] of response.headers) { headers[key.toLowerCase()] = value From 82711f79586d81dddb46c6e67ff5d3bbfcd2aa4f Mon Sep 17 00:00:00 2001 From: OrbisK Date: Sat, 31 Jan 2026 18:04:10 +0100 Subject: [PATCH 3/3] fix: extract text from blob --- server/utils/docs/client.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/server/utils/docs/client.ts b/server/utils/docs/client.ts index 11433ace5e..e347bb8e6e 100644 --- a/server/utils/docs/client.ts +++ b/server/utils/docs/client.ts @@ -84,7 +84,9 @@ function createLoader(): ( let url: URL try { url = new URL(specifier) - } catch { + } catch (e) { + // eslint-disable-next-line no-console + console.error(e) return undefined } @@ -94,7 +96,7 @@ function createLoader(): ( } try { - const response = await $fetch.raw(url.toString(), { + const response = await $fetch.raw(url.toString(), { method: 'GET', timeout: FETCH_TIMEOUT_MS, redirect: 'follow', @@ -104,7 +106,7 @@ function createLoader(): ( return undefined } - const content = response._data ?? '' + const content = (await response._data?.text()) ?? '' const headers: Record = {} for (const [key, value] of response.headers) { headers[key.toLowerCase()] = value @@ -116,7 +118,9 @@ function createLoader(): ( headers, content, } - } catch { + } catch (e) { + // eslint-disable-next-line no-console + console.error(e) return undefined } } @@ -163,7 +167,9 @@ async function getTypesUrl(packageName: string, version: string): Promise