{"version":3,"sources":["../../../../src/lib/rest/ApiRequest.ts"],"sourcesContent":["import { RequestManager, HypixelAPIError, type HypixelAPIErrorResponse } from './index';\r\nimport { HypixelTSError } from '../errors/index';\r\nimport { Logger } from '../Logger';\r\n\r\nexport interface ApiRequestOptions {\r\n\tpath: string;\r\n\tmethod?: 'GET';\r\n\tsendAPIKey?: boolean;\r\n}\r\n\r\nexport class ApiRequest {\r\n\tpublic requests: RequestManager;\r\n\tpublic options: ApiRequestOptions;\r\n\tprivate logger: Logger;\r\n\r\n\tpublic constructor(requestManager: RequestManager, options: ApiRequestOptions, logger: Logger) {\r\n\t\tthis.requests = requestManager;\r\n\t\tthis.options = options;\r\n\t\tthis.logger = logger;\r\n\t}\r\n\r\n\t/**\r\n\t * Makes a request with the options provided.\r\n\t */\r\n\tpublic async make() {\r\n\t\tconst options = this.buildOptions();\r\n\r\n\t\tif (!this.options.sendAPIKey) {\r\n\t\t\treturn this.makeRequest(options);\r\n\t\t}\r\n\r\n\t\tconst apiKeys = this.requests.client.options?.apiKeys ?? [];\r\n\r\n\t\tif (!apiKeys.length) {\r\n\t\t\tthrow new HypixelTSError('CLIENT_OPTIONS_MISSING', 'apiKeys');\r\n\t\t}\r\n\r\n\t\treturn this.makeRequestWithKeys(options, apiKeys);\r\n\t}\r\n\r\n\t/**\r\n\t * Make a request with the provided API keys until successful request or exhaustion\r\n\t */\r\n\tprivate async makeRequestWithKeys(options: ReturnType<typeof this.buildOptions>, apiKeys: string[]) {\r\n\t\tconst errors: HypixelAPIError[] = [];\r\n\r\n\t\tfor (let i = 0; i < apiKeys.length; i++) {\r\n\t\t\ttry {\r\n\t\t\t\tconst requestOptions = {\r\n\t\t\t\t\t...options,\r\n\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t...options.headers,\r\n\t\t\t\t\t\t'API-Key': apiKeys[i]\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tthis.logger.trace(`Making request with API key ${i + 1}`);\r\n\r\n\t\t\t\tconst res = await this.makeRequest(requestOptions);\r\n\r\n\t\t\t\tif (!res.ok) {\r\n\t\t\t\t\tconst json = (await res.json()) as HypixelAPIErrorResponse;\r\n\t\t\t\t\tconst errorMessage = `${json.cause} [API key ${i + 1}]`;\r\n\r\n\t\t\t\t\tif (res.status === 403 || res.status === 429) {\r\n\t\t\t\t\t\tthrow new HypixelAPIError(errorMessage, res.status);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthrow new HypixelAPIError(json.cause, res.status);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.logger.trace(`Successful request with API key ${i + 1}`, res);\r\n\t\t\t\treturn res;\r\n\t\t\t} catch (error) {\r\n\t\t\t\tif (error instanceof HypixelAPIError && (error.code === 403 || error.code === 429)) {\r\n\t\t\t\t\tthis.logger.debug(`Encountered ${error.code} error with API key ${i + 1}. Moving on to the next one`);\r\n\t\t\t\t\terrors.push(error);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (errors.length > 0) {\r\n\t\t\tthrow new AggregateError(errors, `All ${apiKeys.length} API keys have been exhausted with no successful requests.`);\r\n\t\t}\r\n\r\n\t\tthrow new HypixelTSError('API_KEYS_EXHAUSTED', apiKeys.length);\r\n\t}\r\n\r\n\tprivate async makeRequest(options: ReturnType<typeof this.buildOptions>) {\r\n\t\treturn fetch(options.url, { ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an object containing the options to be passed to the request\r\n\t */\r\n\tprivate buildOptions() {\r\n\t\tconst headers: Record<string, string> = {\r\n\t\t\t'Content-Type': 'application/json'\r\n\t\t};\r\n\r\n\t\tconst options = {\r\n\t\t\turl: `${this.requests.baseApiUrl}${this.options.path}`,\r\n\t\t\tmethod: this.options.method ?? 'GET',\r\n\t\t\theaders\r\n\t\t};\r\n\r\n\t\treturn options;\r\n\t}\r\n}\r\n"],"mappings":";;;;AAAA,SAAyB,uBAAqD;AAC9E,SAAS,sBAAsB;AASxB,IAAM,aAAN,MAAiB;AAAA,EAVxB,OAUwB;AAAA;AAAA;AAAA,EAChB;AAAA,EACA;AAAA,EACC;AAAA,EAED,YAAY,gBAAgC,SAA4B,QAAgB;AAC9F,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO;AACnB,UAAM,UAAU,KAAK,aAAa;AAElC,QAAI,CAAC,KAAK,QAAQ,YAAY;AAC7B,aAAO,KAAK,YAAY,OAAO;AAAA,IAChC;AAEA,UAAM,UAAU,KAAK,SAAS,OAAO,SAAS,WAAW,CAAC;AAE1D,QAAI,CAAC,QAAQ,QAAQ;AACpB,YAAM,IAAI,eAAe,0BAA0B,SAAS;AAAA,IAC7D;AAEA,WAAO,KAAK,oBAAoB,SAAS,OAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,SAA+C,SAAmB;AACnG,UAAM,SAA4B,CAAC;AAEnC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,UAAI;AACH,cAAM,iBAAiB;AAAA,UACtB,GAAG;AAAA,UACH,SAAS;AAAA,YACR,GAAG,QAAQ;AAAA,YACX,WAAW,QAAQ,CAAC;AAAA,UACrB;AAAA,QACD;AACA,aAAK,OAAO,MAAM,+BAA+B,IAAI,CAAC,EAAE;AAExD,cAAM,MAAM,MAAM,KAAK,YAAY,cAAc;AAEjD,YAAI,CAAC,IAAI,IAAI;AACZ,gBAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,gBAAM,eAAe,GAAG,KAAK,KAAK,aAAa,IAAI,CAAC;AAEpD,cAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC7C,kBAAM,IAAI,gBAAgB,cAAc,IAAI,MAAM;AAAA,UACnD;AAEA,gBAAM,IAAI,gBAAgB,KAAK,OAAO,IAAI,MAAM;AAAA,QACjD;AAEA,aAAK,OAAO,MAAM,mCAAmC,IAAI,CAAC,IAAI,GAAG;AACjE,eAAO;AAAA,MACR,SAAS,OAAO;AACf,YAAI,iBAAiB,oBAAoB,MAAM,SAAS,OAAO,MAAM,SAAS,MAAM;AACnF,eAAK,OAAO,MAAM,eAAe,MAAM,IAAI,uBAAuB,IAAI,CAAC,6BAA6B;AACpG,iBAAO,KAAK,KAAK;AACjB;AAAA,QACD;AACA,cAAM;AAAA,MACP;AAAA,IACD;AAEA,QAAI,OAAO,SAAS,GAAG;AACtB,YAAM,IAAI,eAAe,QAAQ,OAAO,QAAQ,MAAM,4DAA4D;AAAA,IACnH;AAEA,UAAM,IAAI,eAAe,sBAAsB,QAAQ,MAAM;AAAA,EAC9D;AAAA,EAEA,MAAc,YAAY,SAA+C;AACxE,WAAO,MAAM,QAAQ,KAAK,EAAE,GAAG,QAAQ,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe;AACtB,UAAM,UAAkC;AAAA,MACvC,gBAAgB;AAAA,IACjB;AAEA,UAAM,UAAU;AAAA,MACf,KAAK,GAAG,KAAK,SAAS,UAAU,GAAG,KAAK,QAAQ,IAAI;AAAA,MACpD,QAAQ,KAAK,QAAQ,UAAU;AAAA,MAC/B;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;","names":[]}