{"version":3,"sources":["../src/utils/apiHelpers.ts"],"sourcesContent":["import { backendAPIPrefix } from \"../config\"\nimport { SDKGlobalContext } from \"../xlinkSdkUtils/types.internal\"\nimport { BigNumber } from \"./BigNumber\"\n\nexport async function requestAPI<T>(\n  sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n  options: {\n    path: string\n    method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\"\n    query?: Record<string, string>\n    body?: Record<string, unknown>\n  },\n): Promise<T> {\n  const queryPairs = Object.entries(options.query ?? {})\n  const querystring = new URLSearchParams(queryPairs as string[][]).toString()\n\n  const res = await fetch(\n    `${backendAPIPrefix}${options.path}`.replace(/(\\w)\\/\\//g, \"$1/\") +\n      (querystring ? \"?\" + querystring : \"\"),\n    {\n      method: options.method,\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-Xlink-Runtime-Env\": sdkContext.backendAPI.runtimeEnv,\n      },\n      body: JSON.stringify(options.body, (k, v) => {\n        if (typeof v === \"bigint\") {\n          return v.toString()\n        }\n        if (BigNumber.isBigNumber(v)) {\n          return BigNumber.toString(v)\n        }\n        return v\n      }),\n    },\n  )\n\n  return readAPIResponse(res)\n}\n\nexport const readAPIResponse = async <T>(resp: Response): Promise<T> => {\n  if (resp.status >= 200 && resp.status < 300) {\n    return resp.json() as any\n  }\n\n  if (resp.status === 429) {\n    throw new TooManyRequestsError(resp)\n  }\n\n  const respText = await resp.text()\n  let respData: null | any = null\n  try {\n    respData = JSON.parse(respText)\n  } catch {\n    respData = respText\n  }\n\n  const thirdPartyError = ThirdPartyRequestError.fromSerializedError(respData)\n  if (thirdPartyError != null) {\n    throw thirdPartyError\n  }\n\n  throw new RequestError(\n    {\n      url: resp.url,\n      status: resp.status,\n      body: respText,\n    },\n    {\n      cause: respData,\n    },\n  )\n}\n\nexport class TooManyRequestsError extends Error {\n  requestUrl: string\n  retryAfter?: number\n\n  constructor(resp: Response, options?: ErrorConstructorOptions) {\n    const _retryAfter = Number(resp.headers.get(\"Retry-After\"))\n    const retryAfter = Number.isNaN(_retryAfter) ? undefined : _retryAfter\n\n    let errMsg = `Too many requests to SDK API server`\n    if (retryAfter != null) {\n      errMsg += `; retry after ${retryAfter} seconds`\n    }\n\n    super(errMsg, {\n      ...options,\n      cause: options?.cause ?? resp,\n    })\n\n    this.requestUrl = resp.url\n    this.retryAfter = retryAfter\n  }\n}\n\nexport class ThirdPartyRequestError extends Error {\n  isThirdPartyRequestError = true\n\n  static fromSerializedError(err: any): undefined | ThirdPartyRequestError {\n    if (!err.isThirdPartyRequestError) return\n    return new ThirdPartyRequestError(err.serviceName, {\n      cause: err.cause,\n    })\n  }\n\n  constructor(\n    public serviceName: string,\n    options?: ErrorConstructorOptions,\n  ) {\n    super(`Request service ${serviceName} failed`, options)\n  }\n}\n\nexport class RequestError extends Error {\n  constructor(\n    public response: {\n      url: string\n      status: number\n      body: string\n    },\n    options?: ErrorConstructorOptions,\n  ) {\n    super(\n      `Request failed:\nurl: ${response.url}\ndetail: ${response.body}`,\n      options,\n    )\n  }\n}\n"],"mappings":";;;;;;;;AAIA,eAAsB,WACpB,YACA,SAMY;AACZ,QAAM,aAAa,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC;AACrD,QAAM,cAAc,IAAI,gBAAgB,UAAwB,EAAE,SAAS;AAE3E,QAAM,MAAM,MAAM;AAAA,IAChB,GAAG,gBAAgB,GAAG,QAAQ,IAAI,GAAG,QAAQ,aAAa,KAAK,KAC5D,cAAc,MAAM,cAAc;AAAA,IACrC;AAAA,MACE,QAAQ,QAAQ;AAAA,MAChB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,uBAAuB,WAAW,WAAW;AAAA,MAC/C;AAAA,MACA,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,MAAM;AAC3C,YAAI,OAAO,MAAM,UAAU;AACzB,iBAAO,EAAE,SAAS;AAAA,QACpB;AACA,YAAI,UAAU,YAAY,CAAC,GAAG;AAC5B,iBAAO,UAAU,SAAS,CAAC;AAAA,QAC7B;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,gBAAgB,GAAG;AAC5B;AAEO,IAAM,kBAAkB,OAAU,SAA+B;AACtE,MAAI,KAAK,UAAU,OAAO,KAAK,SAAS,KAAK;AAC3C,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,MAAI,KAAK,WAAW,KAAK;AACvB,UAAM,IAAI,qBAAqB,IAAI;AAAA,EACrC;AAEA,QAAM,WAAW,MAAM,KAAK,KAAK;AACjC,MAAI,WAAuB;AAC3B,MAAI;AACF,eAAW,KAAK,MAAM,QAAQ;AAAA,EAChC,QAAQ;AACN,eAAW;AAAA,EACb;AAEA,QAAM,kBAAkB,uBAAuB,oBAAoB,QAAQ;AAC3E,MAAI,mBAAmB,MAAM;AAC3B,UAAM;AAAA,EACR;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,MACE,KAAK,KAAK;AAAA,MACV,QAAQ,KAAK;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C;AAAA,EACA;AAAA,EAEA,YAAY,MAAgB,SAAmC;AAC7D,UAAM,cAAc,OAAO,KAAK,QAAQ,IAAI,aAAa,CAAC;AAC1D,UAAM,aAAa,OAAO,MAAM,WAAW,IAAI,SAAY;AAE3D,QAAI,SAAS;AACb,QAAI,cAAc,MAAM;AACtB,gBAAU,iBAAiB,UAAU;AAAA,IACvC;AAEA,UAAM,QAAQ;AAAA,MACZ,GAAG;AAAA,MACH,OAAO,SAAS,SAAS;AAAA,IAC3B,CAAC;AAED,SAAK,aAAa,KAAK;AACvB,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,yBAAN,MAAM,gCAA+B,MAAM;AAAA,EAUhD,YACS,aACP,SACA;AACA,UAAM,mBAAmB,WAAW,WAAW,OAAO;AAH/C;AAAA,EAIT;AAAA,EAdA,2BAA2B;AAAA,EAE3B,OAAO,oBAAoB,KAA8C;AACvE,QAAI,CAAC,IAAI,yBAA0B;AACnC,WAAO,IAAI,wBAAuB,IAAI,aAAa;AAAA,MACjD,OAAO,IAAI;AAAA,IACb,CAAC;AAAA,EACH;AAQF;AAEO,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACS,UAKP,SACA;AACA;AAAA,MACE;AAAA,OACC,SAAS,GAAG;AAAA,UACT,SAAS,IAAI;AAAA,MACjB;AAAA,IACF;AAZO;AAAA,EAaT;AACF;","names":[]}