42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "::1"]);
|
|
|
|
function trimTrailingSlash(value: string) {
|
|
return value.replace(/\/+$/, "");
|
|
}
|
|
|
|
function getDefaultApiBaseUrl() {
|
|
if (typeof window === "undefined") {
|
|
return "http://localhost:5000";
|
|
}
|
|
|
|
const protocol = window.location.protocol === "https:" ? "https:" : "http:";
|
|
return `${protocol}//${window.location.hostname}:5000`;
|
|
}
|
|
|
|
function shouldUseBrowserHostForApi(url: URL) {
|
|
if (typeof window === "undefined") {
|
|
return false;
|
|
}
|
|
|
|
return LOOPBACK_HOSTS.has(url.hostname) && !LOOPBACK_HOSTS.has(window.location.hostname);
|
|
}
|
|
|
|
function resolveApiBaseUrl() {
|
|
const configuredApiUrl = import.meta.env.VITE_API_URL?.trim();
|
|
if (!configuredApiUrl) {
|
|
return getDefaultApiBaseUrl();
|
|
}
|
|
|
|
try {
|
|
const apiUrl = new URL(configuredApiUrl);
|
|
if (shouldUseBrowserHostForApi(apiUrl)) {
|
|
apiUrl.hostname = window.location.hostname;
|
|
}
|
|
return trimTrailingSlash(apiUrl.toString());
|
|
} catch {
|
|
return trimTrailingSlash(configuredApiUrl);
|
|
}
|
|
}
|
|
|
|
export const API_BASE_URL = resolveApiBaseUrl();
|