Files
wehub-resource-sync 70bf21e064
Deploy (to testing) and Test Playground Preview Worker / Deploy Playground Preview Worker (testing) (push) Has been skipped
Deploy Workers Shared Staging / Deploy Workers Shared Staging (push) Failing after 0s
Prerelease / build (push) Has been skipped
Handle Changesets / Handle Changesets (push) Has been cancelled
Semgrep OSS scan / semgrep-oss (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:11 +08:00

30 lines
858 B
TypeScript

import { fetch, Request } from "undici";
import { waitForLong } from "./wait-for";
import type { RequestInit } from "undici";
/**
* Fetch a URL, parse the response as JSON, and retry until it succeeds.
* Uses `waitForLong` internally so it will keep retrying on network errors
* or non-JSON responses until the timeout is reached.
*/
export async function fetchJson<T>(
url: string,
info?: RequestInit
): Promise<T> {
return waitForLong(async () => {
const request = new Request(url, info);
const headers = new Headers(request.headers);
headers.set("MF-Disable-Pretty-Error", "true");
const text: string = await fetch(request, {
headers,
}).then((r) => r.text());
try {
return JSON.parse(text) as T;
} catch (cause) {
const err = new Error(`Failed to parse JSON from:\n${text}`);
err.cause = cause;
throw err;
}
});
}