From 87e1aad7e02f2e8f13ee72275b707800936118a5 Mon Sep 17 00:00:00 2001 From: DjDeveloperr Date: Sun, 8 Nov 2020 16:50:11 +0530 Subject: [PATCH] feat(RESTManager): Better Errors --- src/models/rest.ts | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/models/rest.ts b/src/models/rest.ts index 599df21..7d1a529 100644 --- a/src/models/rest.ts +++ b/src/models/rest.ts @@ -252,41 +252,36 @@ export class RESTManager { return rateLimited ? bucket : undefined } - handleStatusCode( + async handleStatusCode( response: Response - ): undefined | boolean { + ): Promise { const status = response.status - if ( - (status >= 200 && status < 400) || - status === HttpResponseCode.TooManyRequests - ) { - return true - } + if ((status >= 200 && status < 400) || status === HttpResponseCode.TooManyRequests) return + + const body = await response.json() + const text = Deno.inspect(body.errors) if (status === HttpResponseCode.Unauthorized) - throw new Error('Request was not successful. Invalid Token.') + throw new Error(`Request was not successful (Unauthorized). Invalid Token.\n${text}`) - switch (status) { - case HttpResponseCode.BadRequest: - case HttpResponseCode.Unauthorized: - case HttpResponseCode.Forbidden: - case HttpResponseCode.NotFound: - case HttpResponseCode.MethodNotAllowed: - throw new Error('Request Client Error.') - case HttpResponseCode.GatewayUnavailable: - throw new Error('Request Server Error.') - } - - // left are all unknown - throw new Error('Request Unknown Error') + if ([ + HttpResponseCode.BadRequest, + HttpResponseCode.NotFound, + HttpResponseCode.Forbidden, + HttpResponseCode.MethodNotAllowed + ].includes(status)) { + throw new Error(`Request - Client Error. Code: ${status}\n${text}`) + } else if (status === HttpResponseCode.GatewayUnavailable) { + throw new Error(`Request - Server Error. Code: ${status}\n${text}`) + } else throw new Error('Request - Unknown Error') } async make( method: RequestMethods, url: string, body?: unknown, - retryCount = 0, + maxRetries = 0, bucket?: string | null ): Promise { return await new Promise((resolve, reject) => { @@ -324,6 +319,7 @@ export class RESTManager { const response = await fetch(urlToUse, requestData) const bucketFromHeaders = this.processHeaders(url, response.headers) + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.handleStatusCode(response) if (response.status === 204) return resolve(undefined) @@ -333,7 +329,7 @@ export class RESTManager { json.retry_after !== undefined || json.message === 'You are being rate limited.' ) { - if (retryCount > 10) { + if (maxRetries > 10) { throw new Error('Max RateLimit Retries hit') }