@xlink-network/xlink-sdk
Version:
1 lines • 4.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils/apiHelpers.ts"],"sourcesContent":["import { backendAPIPrefix } from \"../config\"\nimport { SDKGlobalContext } from \"../xlinkSdkUtils/types.internal\"\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),\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":";;;;;AAGA,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,IAAI;AAAA,IACnC;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":[]}