@swan-io/request
Version:
Wrapper for XMLHttpRequest with better data-structures
1 lines • 10.4 kB
Source Map (JSON)
{"version":3,"file":"Request.mjs","sources":["../src/Request.ts"],"sourcesContent":["import { Future, Option, Result } from \"@swan-io/boxed\";\n\n// The type system allows us infer the response type from the requested `responseType`\ntype ResponseType = \"text\" | \"arraybuffer\" | \"blob\" | \"json\";\n\ntype ResponseTypeMap = {\n text: string;\n arraybuffer: ArrayBuffer;\n blob: Blob;\n json: unknown;\n};\n\ntype Method = \"GET\" | \"POST\" | \"OPTIONS\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n\nexport class NetworkError extends Error {\n url: string;\n constructor(url: string) {\n super(`Request to ${url} failed`);\n Object.setPrototypeOf(this, NetworkError.prototype);\n this.name = \"NetworkError\";\n this.url = url;\n }\n}\n\nexport class TimeoutError extends Error {\n url: string;\n timeout: number | undefined;\n constructor(url: string, timeout?: number) {\n if (timeout == undefined) {\n super(`Request to ${url} timed out`);\n } else {\n super(`Request to ${url} timed out (> ${timeout}ms)`);\n }\n Object.setPrototypeOf(this, TimeoutError.prototype);\n this.name = \"TimeoutError\";\n this.url = url;\n this.timeout = timeout;\n }\n}\n\nexport class CanceledError extends Error {\n constructor() {\n super();\n Object.setPrototypeOf(this, CanceledError.prototype);\n this.name = \"CanceledError\";\n }\n}\n\ntype Config<T extends ResponseType> = {\n url: string;\n method?: Method;\n type: T;\n body?: BodyInit | null;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n timeout?: number;\n cache?: RequestCache;\n integrity?: string;\n keepalive?: boolean;\n mode?: RequestMode;\n priority?: RequestPriority;\n redirect?: RequestRedirect;\n referrer?: string;\n referrerPolicy?: ReferrerPolicy;\n window?: null;\n};\n\nexport type Response<T> = {\n status: number;\n ok: boolean;\n response: Option<T>;\n url: string;\n headers: Headers;\n};\n\nconst resolvedPromise = Promise.resolve();\n\nconst make = <T extends ResponseType>({\n url,\n method,\n type,\n body,\n headers,\n credentials,\n timeout,\n cache,\n integrity,\n keepalive,\n mode,\n priority,\n redirect,\n referrer,\n referrerPolicy,\n window,\n}: Config<T>): Future<\n Result<Response<ResponseTypeMap[T]>, NetworkError | TimeoutError>\n> => {\n return Future.make<\n Result<Response<ResponseTypeMap[T]>, NetworkError | TimeoutError>\n >((resolve) => {\n const controller = new AbortController();\n\n if (timeout) {\n setTimeout(() => {\n controller.abort(new TimeoutError(url, timeout));\n }, timeout);\n }\n\n const init = async () => {\n const res = await fetch(url, {\n method,\n credentials,\n headers,\n signal: controller.signal,\n body,\n cache,\n integrity,\n keepalive,\n mode,\n priority,\n redirect,\n referrer,\n referrerPolicy,\n window,\n });\n\n let payload;\n try {\n if (type === \"arraybuffer\") {\n payload = Option.Some(await res.arrayBuffer());\n }\n if (type === \"blob\") {\n payload = Option.Some(await res.blob());\n }\n if (type === \"json\") {\n payload = Option.Some(await res.json());\n }\n if (type === \"text\") {\n payload = Option.Some(await res.text());\n }\n } catch {\n payload = Option.None();\n }\n\n const response: Response<ResponseTypeMap[T]> = {\n url,\n status: res.status,\n ok: res.ok,\n headers: res.headers,\n response: payload as Option<ResponseTypeMap[T]>,\n };\n return response;\n };\n\n init().then(\n (response) => resolve(Result.Ok(response)),\n (error) => {\n if (error instanceof CanceledError) {\n return resolvedPromise;\n }\n if (error instanceof TimeoutError) {\n resolve(Result.Error(error));\n return resolvedPromise;\n }\n resolve(Result.Error(new NetworkError(url)));\n return resolvedPromise;\n },\n );\n\n return () => {\n controller.abort(new CanceledError());\n };\n });\n};\n\nexport class BadStatusError extends Error {\n url: string;\n status: number;\n response: unknown;\n constructor(url: string, status: number, response?: unknown) {\n super(`Request to ${url} gave status ${status}`);\n Object.setPrototypeOf(this, BadStatusError.prototype);\n this.name = \"BadStatusError\";\n this.url = url;\n this.status = status;\n this.response = response;\n }\n}\n\nexport const badStatusToError = <T>(\n response: Response<T>,\n): Result<Response<T>, BadStatusError> => {\n return response.ok\n ? Result.Ok(response)\n : Result.Error(\n new BadStatusError(\n response.url,\n response.status,\n response.response.toUndefined(),\n ),\n );\n};\n\nexport class EmptyResponseError extends Error {\n url: string;\n constructor(url: string) {\n super(`Request to ${url} gave an empty response`);\n Object.setPrototypeOf(this, EmptyResponseError.prototype);\n this.name = \"EmptyResponseError\";\n this.url = url;\n }\n}\n\nexport const emptyToError = <T>(response: Response<T>) => {\n return response.response.toResult(new EmptyResponseError(response.url));\n};\n\nexport const Request = {\n make,\n};\n"],"names":["NetworkError","_Error","url","_this","call","this","Object","setPrototypeOf","_assertThisInitialized","prototype","name","_inheritsLoose","_wrapNativeSuper","Error","TimeoutError","_Error2","timeout","_this2","undefined","CanceledError","_Error3","_this3","resolvedPromise","Promise","resolve","BadStatusError","_Error4","status","response","_this4","badStatusToError","ok","Result","Ok","toUndefined","EmptyResponseError","_Error5","_this5","emptyToError","toResult","Request","make","_ref","method","type","body","headers","credentials","cache","integrity","keepalive","mode","priority","redirect","referrer","referrerPolicy","window","Future","controller","AbortController","setTimeout","abort","fetch","signal","then","res","_temp9","payload","_temp8","_temp7","_temp5","_temp3","_temp","_Some4","Option","Some","text","_res$text","_temp2","_Some3","json","_res$json","_temp4","_Some2","blob","_res$blob","_temp6","_Some","arrayBuffer","_res$arrayBuffer","_catch","None","e","reject","init","error"],"mappings":"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"}