<!-- .github/pull_request_template.md --> ## Description <!-- Please provide a clear, human-generated description of the changes in this PR. DO NOT use AI-generated descriptions. We want to understand your thought process and reasoning. --> ## Type of Change <!-- Please check the relevant option --> - [x] Bug fix (non-breaking change that fixes an issue) - [x] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Code refactoring - [ ] Performance improvement - [ ] Other (please specify): ## Changes Made <!-- List the specific changes made in this PR --> - - - ## Testing <!-- Describe how you tested your changes --> ## Screenshots/Videos (if applicable) <!-- Add screenshots or videos to help explain your changes --> ## Pre-submission Checklist <!-- Please check all boxes that apply before submitting your PR --> - [ ] **I have tested my changes thoroughly before submitting this PR** - [ ] **This PR contains minimal changes necessary to address the issue/feature** - [ ] My code follows the project's coding standards and style guidelines - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added necessary documentation (if applicable) - [ ] All new and existing tests pass - [ ] I have searched existing PRs to ensure this change hasn't been submitted already - [ ] I have linked any relevant issues in the description - [ ] My commits have clear and descriptive messages ## Related Issues <!-- Link any related issues using "Fixes #issue_number" or "Relates to #issue_number" --> ## Additional Notes <!-- Add any additional notes, concerns, or context for reviewers --> ## DCO Affirmation I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin.
75 lines
2 KiB
TypeScript
75 lines
2 KiB
TypeScript
import handleServerErrors from "./handleServerErrors";
|
|
import isCloudEnvironment from "./isCloudEnvironment";
|
|
|
|
let numberOfRetries = 0;
|
|
|
|
const isAuth0Enabled = process.env.USE_AUTH0_AUTHORIZATION?.toLowerCase() === "true";
|
|
|
|
const backendApiUrl = process.env.NEXT_PUBLIC_BACKEND_API_URL || "http://localhost:8000";
|
|
|
|
const cloudApiUrl = process.env.NEXT_PUBLIC_CLOUD_API_URL || "http://localhost:8001";
|
|
|
|
let apiKey: string | null = process.env.NEXT_PUBLIC_COGWIT_API_KEY || null;
|
|
let accessToken: string | null = null;
|
|
|
|
export default async function fetch(url: string, options: RequestInit = {}, useCloud = false): Promise<Response> {
|
|
function retry(lastError: Response) {
|
|
if (!isAuth0Enabled) {
|
|
return Promise.reject(lastError);
|
|
}
|
|
|
|
if (numberOfRetries >= 1) {
|
|
return Promise.reject(lastError);
|
|
}
|
|
|
|
numberOfRetries += 1;
|
|
|
|
return global.fetch("/auth/token")
|
|
.then(() => {
|
|
return fetch(url, options);
|
|
});
|
|
}
|
|
|
|
const authHeaders = useCloud && (!isCloudEnvironment() || !accessToken) ? {
|
|
"X-Api-Key": apiKey,
|
|
} : {
|
|
"Authorization": `Bearer ${accessToken}`,
|
|
}
|
|
|
|
return global.fetch(
|
|
(useCloud ? cloudApiUrl : backendApiUrl) + "/api" + (useCloud ? url.replace("/v1", "") : url),
|
|
{
|
|
...options,
|
|
headers: {
|
|
...options.headers,
|
|
...authHeaders,
|
|
} as HeadersInit,
|
|
credentials: "include",
|
|
},
|
|
)
|
|
.then((response) => handleServerErrors(response, retry, useCloud))
|
|
.catch((error) => {
|
|
if (error.detail === undefined) {
|
|
return Promise.reject(
|
|
new Error("No connection to the server.")
|
|
);
|
|
}
|
|
|
|
return Promise.reject(error);
|
|
})
|
|
.finally(() => {
|
|
numberOfRetries = 0;
|
|
});
|
|
}
|
|
|
|
fetch.checkHealth = () => {
|
|
return global.fetch(`${backendApiUrl.replace("/api", "")}/health`);
|
|
};
|
|
|
|
fetch.setApiKey = (newApiKey: string) => {
|
|
apiKey = newApiKey;
|
|
};
|
|
|
|
fetch.setAccessToken = (newAccessToken: string) => {
|
|
accessToken = newAccessToken;
|
|
};
|