const API_URL = import.meta.env.VITE_API_URL || 'http://localhost/api'; // Track if we're currently refreshing to avoid multiple simultaneous refreshes let isRefreshing = false; let refreshPromise = null; // Attempt to refresh the access token async function attemptTokenRefresh() { if (isRefreshing) { // Wait for the existing refresh to complete return refreshPromise; } isRefreshing = true; refreshPromise = fetch('/api/auth/refresh', { method: 'POST', credentials: 'include' }).then(response => { isRefreshing = false; return response.ok; }).catch(() => { isRefreshing = false; return false; }); return refreshPromise; } async function fetchAPI(endpoint, options = {}, retryAfterRefresh = true) { const response = await fetch(`${API_URL}${endpoint}`, { ...options, headers: { 'Content-Type': 'application/json', ...options.headers, }, credentials: 'include', // Always include credentials }); // If we get a 401 and haven't already retried, attempt token refresh if (response.status === 401 && retryAfterRefresh) { const refreshed = await attemptTokenRefresh(); if (refreshed) { // Retry the original request (but don't retry again if it fails) return fetchAPI(endpoint, options, false); } } if (!response.ok) { throw new Error(`API error: ${response.statusText}`); } return response.json(); } export async function getStreamKey() { return fetchAPI('/stream/key'); } export async function regenerateStreamKey() { return fetchAPI('/stream/key/regenerate', { method: 'POST', }); } export async function validateStreamKey(key) { return fetchAPI(`/stream/validate/${key}`); } export async function getStreamStats(streamKey) { return fetchAPI(`/stream/stats/${streamKey}`); }