1
0
mirror of https://github.com/sasjs/adapter.git synced 2026-01-08 21:10:05 +00:00
Files
adapter/src/utils/makeRequest.ts
2020-08-04 20:39:09 +02:00

79 lines
2.3 KiB
TypeScript

import { CsrfToken } from "../types";
import { needsRetry } from "./needsRetry";
let retryCount: number = 0;
let retryLimit: number = 5;
export async function makeRequest<T>(
url: string,
request: RequestInit,
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()
: (res: Response) => res.text();
let etag = null;
const result = await fetch(url, request).then(async (response) => {
if (!response.ok) {
if (response.status === 403) {
const tokenHeader = response.headers.get("X-CSRF-HEADER");
if (tokenHeader) {
const token = response.headers.get(tokenHeader);
callback({
headerName: tokenHeader,
value: token || "",
});
retryRequest = {
...request,
headers: { ...request.headers, [tokenHeader]: token },
};
return fetch(url, retryRequest).then((res) => {
etag = res.headers.get("ETag");
return responseTransform(res);
});
}
} else {
const body = await response.text();
return Promise.reject({ status: response.status, body });
}
} else {
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 responseTransformed;
}
});
return { result, etag };
}