{"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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"}