From b153f13a1d561e7ee8c16d8f7e83bbfb59b6e183 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 20:48:06 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A1=EF=B8=8F=20Sentinel:=20[MEDIUM]=20?= =?UTF-8?q?Add=20missing=20timeouts=20to=20external=20API=20calls?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added explicit timeouts to `fetch()` calls in `src/lib/network.ts`, `src/lib/snap-market.ts`, and `scripts/sync-sources.mjs` using `AbortSignal.timeout()` to prevent hanging requests and potential server resource exhaustion. Co-authored-by: felirami <6752178+felirami@users.noreply.github.com> --- scripts/sync-sources.mjs | 3 +++ src/lib/network.ts | 1 + src/lib/snap-market.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/scripts/sync-sources.mjs b/scripts/sync-sources.mjs index 7dbc002..3f37eee 100644 --- a/scripts/sync-sources.mjs +++ b/scripts/sync-sources.mjs @@ -22,6 +22,7 @@ const SOURCE_REPO_ORDER = ["hypersnap", "hypersnap-docs-web", "snap", "protocol" const DOCS_LINK_LIMIT = 80; const README_HEADING_LIMIT = 10; +const GITHUB_FETCH_TIMEOUT_MS = 10_000; const githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN; @@ -32,6 +33,7 @@ async function fetchGithubJson(url, { optional = false } = {}) { "X-GitHub-Api-Version": "2022-11-28", ...(githubToken ? { Authorization: `Bearer ${githubToken}` } : {}), }, + signal: AbortSignal.timeout(GITHUB_FETCH_TIMEOUT_MS), }); if ((response.status === 404 || response.status === 409) && optional) { @@ -53,6 +55,7 @@ async function fetchGithubText(url, { optional = false } = {}) { "X-GitHub-Api-Version": "2022-11-28", ...(githubToken ? { Authorization: `Bearer ${githubToken}` } : {}), }, + signal: AbortSignal.timeout(GITHUB_FETCH_TIMEOUT_MS), }); if ((response.status === 404 || response.status === 409) && optional) { diff --git a/src/lib/network.ts b/src/lib/network.ts index 049cc1e..8a390b6 100644 --- a/src/lib/network.ts +++ b/src/lib/network.ts @@ -85,6 +85,7 @@ export async function getNetworkStatus(): Promise { headers: { Accept: "application/json", }, + signal: AbortSignal.timeout(NODE_PROBE_TIMEOUT_MS), }); if (!response.ok) { diff --git a/src/lib/snap-market.ts b/src/lib/snap-market.ts index 19b7c1a..7996ea4 100644 --- a/src/lib/snap-market.ts +++ b/src/lib/snap-market.ts @@ -1,6 +1,7 @@ import { SNAP, correctedSnapFdv } from "@/lib/snap"; export const SNAP_MARKET_REVALIDATE = 30; +export const SNAP_MARKET_TIMEOUT_MS = 10_000; type DexPeriod = { buys?: number; @@ -79,6 +80,7 @@ export async function getSnapMarketData(): Promise { "user-agent": "hypersnap.org market data checker", }, next: { revalidate: SNAP_MARKET_REVALIDATE }, + signal: AbortSignal.timeout(SNAP_MARKET_TIMEOUT_MS), }); if (!response.ok) {