diff --git a/src/SASViyaApiClient.ts b/src/SASViyaApiClient.ts index 4f70e00..167fbf6 100644 --- a/src/SASViyaApiClient.ts +++ b/src/SASViyaApiClient.ts @@ -1018,7 +1018,10 @@ export class SASViyaApiClient { const { result: folder } = await this.request( `${this.serverUrl}${url}`, requestInfo - ); + ).catch((err) => { + return {result: null}; + }) + if (!folder) return undefined; return `/folders/folders/${folder.id}`; } diff --git a/src/utils/makeRequest.ts b/src/utils/makeRequest.ts index c92d1b1..c27ec4d 100644 --- a/src/utils/makeRequest.ts +++ b/src/utils/makeRequest.ts @@ -1,4 +1,8 @@ import { CsrfToken } from "../types"; +import { needsRetry } from "./needsRetry"; + +let retryCount: number = 0; +let retryLimit: number = 5; export async function makeRequest( url: string, @@ -6,6 +10,8 @@ export async function makeRequest( callback: (value: CsrfToken) => any, contentType: "text" | "json" = "json" ): Promise<{ result: T; etag: string | null }> { + let retryRequest: any = null; + const responseTransform = contentType === "json" ? (res: Response) => res.json() @@ -23,7 +29,7 @@ export async function makeRequest( value: token || "", }); - const retryRequest = { + retryRequest = { ...request, headers: { ...request.headers, [tokenHeader]: token }, }; @@ -37,12 +43,35 @@ export async function makeRequest( return Promise.reject({ status: response.status, body }); } } else { - if (response.redirected && response.url.includes("SASLogon/login")) { - const body = await response.text(); - return Promise.reject({ status: 401, body }); + const responseTransformed = responseTransform(response); + let responseText = ''; + + if (typeof responseTransformed === 'string') { + responseText = responseTransformed; + } else { + responseText = JSON.stringify(responseTransformed); } + + if (response.redirected && response.url.includes("SASLogon/login")) { + return Promise.reject({ status: 401, responseTransformed }); + } + + if (needsRetry(responseText)) { + if (retryCount < retryLimit) { + retryCount++; + let retryResponse = await makeRequest(url, retryRequest || request, callback, contentType); + retryCount = 0; + + return retryResponse; + } else { + retryCount = 0; + + throw new Error('Request retry limit exceeded'); + } + } + etag = response.headers.get("ETag"); - return responseTransform(response); + return responseTransformed; } }); return { result, etag };