UNPKG

@moeenn/fetch

Version:

Native Fetch with better ergonomics and error reporting

51 lines (50 loc) 1.5 kB
var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); // src/index.ts var DEFAULT_TIMEOUT = 1e4; async function fetchJSON(url, options) { const headers = new Headers(options.headers); if (!headers.has("Content-Type") && !(options.body instanceof FormData)) { headers.set("Content-Type", "application/json"); } let res; try { res = await fetch(url, { ...options, headers, signal: AbortSignal.timeout(options.timeout || DEFAULT_TIMEOUT) }); } catch (err) { if (err instanceof DOMException) { throw new Error("The request to the server timed-out"); } throw err; } let parseError = null; let parsedResponse; try { parsedResponse = await res.json(); } catch (err) { parseError = err; } if (!res.ok) { if (parseError !== null) { throw new Error("Unexpected response sent from the server"); } if (typeof parsedResponse === "object" && parsedResponse != null) { if ("message" in parsedResponse && typeof parsedResponse.message === "string") { throw new Error(parsedResponse.message); } if ("error" in parsedResponse && typeof parsedResponse.error === "string") { throw new Error(parsedResponse.error); } } throw new Error(`${res.status} ${res.statusText}`); } return parsedResponse; } __name(fetchJSON, "fetchJSON"); export { fetchJSON }; //# sourceMappingURL=index.mjs.map