{"version":3,"file":"request.mjs","names":["request"],"sources":["../src/request.ts"],"sourcesContent":["import isNetworkError from \"is-network-error\";\n\nimport { err, ok, type Result } from \"./result.ts\";\nimport { wait } from \"./wait.ts\";\n\nexport type ResponseType =\n\t| \"arrayBuffer\"\n\t| \"blob\"\n\t| \"formData\"\n\t| \"json\"\n\t| \"raw\"\n\t| \"stream\"\n\t| \"text\"\n\t| \"void\";\n\nexport type HttpMethod = \"delete\" | \"get\" | \"head\" | \"options\" | \"patch\" | \"post\" | \"put\" | \"trace\";\n\n/**\n * We rely on `JSON.stringify` semantics for treating `undefined`, and don't want type errors for\n * `undefined` values in objects.\n */\ntype JsonPrimitive = string | number | boolean | null | undefined;\ntype JsonValue = JsonPrimitive | Array<JsonValue> | { [key: string]: JsonValue };\n\nexport type RequestBody = BodyInit | JsonValue | null;\n\nexport interface RequestOptions<TResponseType extends ResponseType> extends Omit<\n\tRequestInit,\n\t\"body\" | \"method\"\n> {\n\tbody?: RequestBody;\n\tfetch?: typeof globalThis.fetch;\n\tmethod?: HttpMethod;\n\tresponseType: TResponseType;\n\t/**\n\t * @default 0\n\t */\n\tretries?: number;\n\t/**\n\t * Timeout in milliseconds.\n\t *\n\t * @default 10_000\n\t */\n\ttimeout?: number | false;\n}\n\nexport type RequestError = AbortError | HttpError | NetworkError | TimeoutError;\n\nexport type RequestResult<TData> = Result<{ data: TData; headers: Headers }, RequestError>;\n\n/** ===============================================================================================\n * Request.\n =============================================================================================== */\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"arrayBuffer\">,\n): Promise<RequestResult<ArrayBuffer>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"blob\">,\n): Promise<RequestResult<Blob>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"formData\">,\n): Promise<RequestResult<FormData>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"json\">,\n): Promise<RequestResult<unknown>>;\n\nexport async function request<TData>(\n\turl: URL | string,\n\toptions: RequestOptions<\"json\">,\n): Promise<RequestResult<TData>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"raw\">,\n): Promise<RequestResult<Response>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"stream\">,\n): Promise<RequestResult<ReadableStream<Uint8Array> | null>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"text\">,\n): Promise<RequestResult<string>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<\"void\">,\n): Promise<RequestResult<null>>;\n\nexport async function request(\n\turl: URL | string,\n\toptions: RequestOptions<ResponseType>,\n): Promise<RequestResult<unknown>> {\n\tconst {\n\t\tbody: initBody,\n\t\tfetch = globalThis.fetch,\n\t\theaders: initHeaders,\n\t\tmethod: initMethod,\n\t\tresponseType,\n\t\tretries = 0,\n\t\tsignal: externalSignal,\n\t\ttimeout = 10_000,\n\t\t...fetchOptions\n\t} = options;\n\n\tconst method = initMethod != null ? (initMethod.toUpperCase() as Uppercase<HttpMethod>) : \"GET\";\n\n\tconst headers = new Headers(initHeaders);\n\n\tif (!headers.has(\"accept\")) {\n\t\tif (responseType === \"json\") {\n\t\t\theaders.set(\"accept\", \"application/json\");\n\t\t} else if (responseType === \"text\") {\n\t\t\theaders.set(\"accept\", \"text/plain\");\n\t\t} else {\n\t\t\theaders.set(\"accept\", \"*/*\");\n\t\t}\n\t}\n\n\tlet body: BodyInit | null = null;\n\n\tif (initBody !== undefined) {\n\t\tif (isJsonBody(initBody)) {\n\t\t\tbody = JSON.stringify(initBody);\n\n\t\t\tif (!headers.has(\"content-type\")) {\n\t\t\t\theaders.set(\"content-type\", \"application/json\");\n\t\t\t}\n\t\t} else {\n\t\t\tbody = initBody;\n\t\t}\n\t}\n\n\tlet attempts = 0;\n\n\t// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n\twhile (true) {\n\t\tconst timeoutSignal = timeout === false ? undefined : AbortSignal.timeout(timeout);\n\n\t\tconst signal =\n\t\t\texternalSignal && timeoutSignal\n\t\t\t\t? AbortSignal.any([externalSignal, timeoutSignal])\n\t\t\t\t: (externalSignal ?? timeoutSignal ?? null);\n\n\t\tconst request = new Request(url, { ...fetchOptions, body, headers, method, signal });\n\n\t\ttry {\n\t\t\tconst response = await fetch(request);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new HttpError(request, response);\n\t\t\t}\n\n\t\t\tif (method === \"HEAD\") {\n\t\t\t\tconst data = null;\n\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t}\n\n\t\t\tswitch (responseType) {\n\t\t\t\tcase \"json\": {\n\t\t\t\t\tif (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n\t\t\t\t\t\tawait response.body?.cancel();\n\t\t\t\t\t\tconst data = null;\n\t\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t\t}\n\n\t\t\t\t\tconst data = (await response.json()) as unknown;\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"void\": {\n\t\t\t\t\tawait response.body?.cancel();\n\t\t\t\t\tconst data = null;\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"raw\": {\n\t\t\t\t\tconst data = response;\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"stream\": {\n\t\t\t\t\tconst data = response.body;\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"text\": {\n\t\t\t\t\tconst data = await response.text();\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"arrayBuffer\": {\n\t\t\t\t\tconst data = await response.arrayBuffer();\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"blob\": {\n\t\t\t\t\tconst data = await response.blob();\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\n\t\t\t\tcase \"formData\": {\n\t\t\t\t\tconst data = await response.formData();\n\t\t\t\t\treturn ok({ data, headers: response.headers });\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tattempts += 1;\n\n\t\t\tif (error instanceof Error) {\n\t\t\t\t/** error instanceof DOMException */\n\t\t\t\tif (\n\t\t\t\t\terror.name === \"TimeoutError\" ||\n\t\t\t\t\t/** Older implementations did not use \"TimeoutError\". */\n\t\t\t\t\ttimeoutSignal?.aborted\n\t\t\t\t) {\n\t\t\t\t\treturn err(new TimeoutError(request, undefined, error));\n\t\t\t\t}\n\n\t\t\t\t/** error instanceof DOMException */\n\t\t\t\tif (error.name === \"AbortError\") {\n\t\t\t\t\treturn err(new AbortError(request, undefined, error));\n\t\t\t\t}\n\n\t\t\t\tconst retry = shouldRetry(error, attempts, retries);\n\n\t\t\t\tif (retry != null) {\n\t\t\t\t\tawait wait(retry.delay, externalSignal ?? undefined);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (error instanceof HttpError) {\n\t\t\t\t\treturn err(error);\n\t\t\t\t}\n\n\t\t\t\tif (isNetworkError(error)) {\n\t\t\t\t\treturn err(new NetworkError(request, undefined, error));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\n/** ===============================================================================================\n * Errors.\n =============================================================================================== */\n\n/** HttpError. */\nexport class HttpError extends Error {\n\tstatic readonly type = \"HttpError\";\n\trequest: Request;\n\tresponse: Response;\n\n\tstatic is(error: unknown): error is HttpError {\n\t\tif (error instanceof HttpError) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn error instanceof Error && error.name === HttpError.type;\n\t}\n\n\tconstructor(\n\t\trequest: Request,\n\t\tresponse: Response,\n\t\tmessage = `${response.statusText} (${String(response.status)}) for ${request.method} ${request.url}`,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, { cause });\n\n\t\tthis.name = HttpError.type;\n\t\tthis.request = request;\n\t\tthis.response = response;\n\t}\n}\n\n/** AbortError. */\nexport class AbortError extends Error {\n\tstatic readonly type = \"AbortError\";\n\trequest: Request;\n\n\tstatic is(error: unknown): error is AbortError {\n\t\tif (error instanceof AbortError) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn error instanceof Error && error.name === AbortError.type;\n\t}\n\n\tconstructor(\n\t\trequest: Request,\n\t\tmessage = `Request aborted for ${request.method} ${request.url}`,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, { cause });\n\n\t\tthis.name = AbortError.type;\n\t\tthis.request = request;\n\t}\n}\n\n/** TimeoutError. */\nexport class TimeoutError extends Error {\n\tstatic readonly type = \"TimeoutError\";\n\trequest: Request;\n\n\tstatic is(error: unknown): error is TimeoutError {\n\t\tif (error instanceof TimeoutError) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn error instanceof Error && error.name === TimeoutError.type;\n\t}\n\n\tconstructor(\n\t\trequest: Request,\n\t\tmessage = `Request timed out for ${request.method} ${request.url}`,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, { cause });\n\n\t\tthis.name = TimeoutError.type;\n\t\tthis.request = request;\n\t}\n}\n\n/** NetworkError. */\nexport class NetworkError extends Error {\n\tstatic readonly type = \"NetworkError\";\n\trequest: Request;\n\n\tstatic is(error: unknown): error is NetworkError {\n\t\tif (error instanceof NetworkError) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn error instanceof Error && error.name === NetworkError.type;\n\t}\n\n\tconstructor(\n\t\trequest: Request,\n\t\tmessage = `Network error for ${request.method} ${request.url}`,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, { cause });\n\n\t\tthis.name = NetworkError.type;\n\t\tthis.request = request;\n\t}\n}\n\n/** ===============================================================================================\n * Utilities.\n =============================================================================================== */\n\nfunction isJsonBody(body: unknown): body is JsonValue {\n\tif (body === null) {\n\t\treturn true;\n\t}\n\n\tif (typeof body !== \"object\") {\n\t\treturn false;\n\t}\n\n\t/** BodyInit. */\n\tif (\n\t\tbody instanceof ArrayBuffer ||\n\t\tbody instanceof Blob ||\n\t\tbody instanceof FormData ||\n\t\tbody instanceof URLSearchParams ||\n\t\tbody instanceof ReadableStream\n\t) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction backoff(attempts: number): number {\n\treturn 1000 * Math.pow(2, attempts - 1) * 0.3;\n}\n\n/**\n * In rest apis, only `patch` and `post` are not idempotent.\n * However, in rpc apis, `delete` and `put` may have side-effects as well.\n */\nconst retryMethods = new Set<Uppercase<HttpMethod>>([\n\t// \"DELETE\",\n\t\"GET\",\n\t\"HEAD\",\n\t\"OPTIONS\",\n\t// \"PATCH\",\n\t// \"POST\",\n\t// \"PUT\",\n\t\"TRACE\",\n]);\n\nconst retryStatusCodes = new Set([\n\t408, 413, 429, 500, 502, 503, 504, /** The following are cloudflare-specific status codes. */ 521,\n\t522, 524,\n]);\n\nconst retryAfterStatusCodes = new Set([413, 429, 503]);\n\nfunction getRetryAfterDelay(response: Response): number | null {\n\tif (!retryAfterStatusCodes.has(response.status)) {\n\t\treturn null;\n\t}\n\n\tconst retryAfter = response.headers.get(\"retry-after\");\n\n\tif (retryAfter == null) {\n\t\treturn null;\n\t}\n\n\t/** The `retry-after` header can be specified as a date, or in seconds. */\n\tconst seconds = Number(retryAfter);\n\n\tif (!Number.isNaN(seconds)) {\n\t\treturn 1000 * seconds;\n\t}\n\n\tconst timestamp = new Date(retryAfter).getTime();\n\n\tif (!Number.isNaN(timestamp)) {\n\t\treturn timestamp - Date.now();\n\t}\n\n\treturn null;\n}\n\nfunction shouldRetry(error: unknown, attempt: number, retries: number): { delay: number } | null {\n\tif (attempt >= retries + 1) {\n\t\treturn null;\n\t}\n\n\tif (error instanceof HttpError) {\n\t\tif (\n\t\t\tretryMethods.has(error.request.method as Uppercase<HttpMethod>) &&\n\t\t\tretryStatusCodes.has(error.response.status)\n\t\t) {\n\t\t\tconst retryAfter = getRetryAfterDelay(error.response);\n\n\t\t\tif (retryAfter != null) {\n\t\t\t\treturn { delay: retryAfter };\n\t\t\t}\n\n\t\t\tif (error.response.status === 413) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn { delay: backoff(attempt) };\n\t\t}\n\t}\n\n\tif (isNetworkError(error)) {\n\t\treturn { delay: backoff(attempt) };\n\t}\n\n\treturn null;\n}\n\nexport function getContentType(response: Response): string | null {\n\tconst contentTypeHeader = response.headers.get(\"content-type\");\n\n\treturn contentTypeHeader?.split(\";\").at(0)?.trim() ?? null;\n}\n\n/** ===============================================================================================\n * Polyfills.\n *\n * @see {@link https://caniuse.com/mdn-api_abortsignal_any_static}\n * @see {@link https://caniuse.com/mdn-api_abortsignal_timeout_static}\n =============================================================================================== */\n\nif (!Object.prototype.hasOwnProperty.call(AbortSignal, \"timeout\")) {\n\tAbortSignal.timeout = function timeout(ms: number): AbortSignal {\n\t\tconst controller = new AbortController();\n\n\t\tsetTimeout(() => {\n\t\t\tcontroller.abort(new DOMException(\"TimeoutError\", \"TimeoutError\"));\n\t\t}, ms);\n\n\t\treturn controller.signal;\n\t};\n}\n\nif (!Object.prototype.hasOwnProperty.call(AbortSignal, \"any\")) {\n\tAbortSignal.any = function any(signals: Array<AbortSignal>): AbortSignal {\n\t\tconst controller = new AbortController();\n\n\t\tfunction onAbort(this: AbortSignal) {\n\t\t\tcontroller.abort(this.reason);\n\t\t\tcleanup();\n\t\t}\n\n\t\tfunction cleanup() {\n\t\t\tfor (const signal of signals) {\n\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tif (signal.aborted) {\n\t\t\t\tcontroller.abort(signal.reason);\n\t\t\t\tcleanup();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t}\n\n\t\treturn controller.signal;\n\t};\n}\n"],"mappings":"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"}