UNPKG

@krebinkkj/safe-fetch

Version:

A fetch wrapper on top of Rust's Result

1 lines 5.59 kB
{"version":3,"sources":["../../src/lib/HttpError.ts","../../src/lib/fetch.ts"],"names":["none","some","ok","err"],"mappings":"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","file":"index.cjs","sourcesContent":["// eslint-disable-next-line spaced-comment\n/// <reference lib=\"dom\" />\n\nimport { none, some, type Option } from '@sapphire/result';\n\nexport class HttpError extends Error {\n\tpublic readonly response: Response;\n\tpublic readonly body: string;\n\tprivate json: Option<unknown> = none;\n\n\tpublic constructor(response: Response, body: string) {\n\t\tsuper('Received a non-OK HTTP response code');\n\t\tthis.response = response;\n\t\tthis.body = body;\n\t}\n\n\tpublic get url() {\n\t\treturn this.response.url;\n\t}\n\n\tpublic get code() {\n\t\treturn this.response.status;\n\t}\n\n\tpublic get jsonBody(): unknown {\n\t\treturn this.json.match({\n\t\t\tsome: (value) => value,\n\t\t\tnone: () => (this.json = some(JSON.parse(this.body)).unwrap())\n\t\t});\n\t}\n}\n","// eslint-disable-next-line spaced-comment\n/// <reference lib=\"dom\" />\n\nimport { err, ok, type Result } from '@sapphire/result';\nimport { HttpError } from './HttpError';\n\nexport type Awaitable<T> = PromiseLike<T> | T;\n\nexport async function safeFetch(input: RequestInfo | URL, init?: RequestInit): Promise<FetchResult<Response>> {\n\ttry {\n\t\tconst response = await fetch(input, init);\n\t\tif (response.ok) return ok(response);\n\t\treturn err(new HttpError(response, await response.text()));\n\t} catch (error) {\n\t\treturn err(error as AbortError);\n\t}\n}\n\nexport async function safeTimedFetch(input: RequestInfo | URL, ms: number, init?: Omit<RequestInit, 'signal'>): Promise<FetchResult<Response>> {\n\tconst controller = new AbortController();\n\tconst timer = setTimeout(() => controller.abort(), ms);\n\tconst result = await safeFetch(input, { ...init, signal: controller.signal });\n\tclearTimeout(timer);\n\treturn result;\n}\n\nexport async function Text(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<string>> {\n\treturn (await result).map((response) => response.text()).intoPromise();\n}\n\nexport async function Json<T extends object>(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<T>> {\n\treturn (await result).map((response) => response.json()).intoPromise();\n}\n\nexport async function Blob(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<Blob>> {\n\treturn (await result).map((response) => response.blob()).intoPromise();\n}\n\nexport async function ArrayBuffer(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<ArrayBuffer>> {\n\treturn (await result).map((response) => response.arrayBuffer()).intoPromise();\n}\n\nexport async function FormData(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<FormData>> {\n\treturn (await result).map((response) => response.formData()).intoPromise();\n}\n\nexport function isAbortError(error: Error): error is AbortError {\n\treturn error.name === 'AbortError';\n}\n\nexport type AbortError = Error & { name: 'AbortError' };\nexport type FetchError = HttpError | AbortError;\nexport type FetchResult<T> = Result<T, FetchError>;\n"]}