Files
ospab.host/ospabhost/frontend/src/config/api.ts
2026-01-01 16:56:34 +03:00

70 lines
2.0 KiB
TypeScript

/**
* Централизованная конфигурация API
*/
const PRODUCTION_API_ORIGIN = 'https://api.ospab.host';
const resolveDefaultApiUrl = () => {
return PRODUCTION_API_ORIGIN;
};
const resolveDefaultSocketUrl = (apiUrl: string) => {
if (!apiUrl) {
return import.meta.env.DEV ? 'ws://localhost:5000/ws' : 'wss://api.ospab.host/ws';
}
try {
const url = new URL(apiUrl);
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
url.pathname = '/ws';
url.search = '';
url.hash = '';
return url.toString();
} catch (error) {
console.warn('[config/api] Некорректный API_URL, используем ws://localhost:5000/ws');
return 'ws://localhost:5000/ws';
}
};
const normalizeSocketUrl = (value: string | undefined, fallbackApiUrl: string): string | undefined => {
if (value === undefined) return undefined;
const trimmed = value.trim();
if (!trimmed) return undefined;
const lowered = trimmed.toLowerCase();
if (lowered === 'disabled' || lowered === 'none' || lowered === 'off') {
return '';
}
try {
const url = new URL(trimmed);
if (!url.pathname || url.pathname === '/') {
url.pathname = '/ws';
}
url.search = '';
url.hash = '';
return url.toString();
} catch (error) {
console.warn('[config/api] Некорректный VITE_SOCKET_URL, используем значение по умолчанию', error);
try {
const base = new URL(fallbackApiUrl);
base.protocol = base.protocol === 'https:' ? 'wss:' : 'ws:';
base.pathname = '/ws';
base.search = '';
base.hash = '';
return base.toString();
} catch {
return undefined;
}
}
};
const RAW_API_URL = import.meta.env.VITE_API_URL;
export const API_URL = RAW_API_URL || resolveDefaultApiUrl();
const RAW_SOCKET_URL = import.meta.env.VITE_SOCKET_URL;
const defaultSocketUrl = resolveDefaultSocketUrl(API_URL);
const normalizedSocketUrl = normalizeSocketUrl(RAW_SOCKET_URL, API_URL);
export const SOCKET_URL = normalizedSocketUrl !== undefined ? normalizedSocketUrl : defaultSocketUrl;