import { API_CONFIG } from '../config/api.config.js';
export class BackendDetector {
constructor() {
this.isBackendAvailable = null;
this.lastCheck = 0;
this.checkInterval = 30000;
this.sensingOnlyMode = false;
}
async checkBackendAvailability() {
const now = Date.now();
if (this.isBackendAvailable !== null && (now - this.lastCheck) < this.checkInterval) {
return this.isBackendAvailable;
}
try {
console.log('🔍 Checking backend availability...');
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 3000);
const response = await fetch(`${API_CONFIG.BASE_URL}/health/live`, {
method: 'GET',
signal: controller.signal,
headers: {
'Accept': 'application/json'
}
});
clearTimeout(timeoutId);
if (response.ok) {
this.isBackendAvailable = true;
this.lastCheck = now;
console.log('✅ Real backend is available');
return true;
} else {
throw new Error(`Backend responded with status ${response.status}`);
}
} catch (error) {
this.isBackendAvailable = false;
this.lastCheck = now;
if (error.name === 'AbortError') {
console.log('⏱️ Backend check timed out - assuming unavailable');
} else {
console.log(`❌ Backend unavailable: ${error.message}`);
}
return false;
}
}
async shouldUseMockServer() {
if (API_CONFIG.MOCK_SERVER.ENABLED) {
console.log('🧪 Using mock server (explicitly enabled)');
return true;
}
if (!API_CONFIG.MOCK_SERVER.AUTO_DETECT) {
console.log('🔌 Using real backend (auto-detection disabled)');
return false;
}
const backendAvailable = await this.checkBackendAvailability();
if (backendAvailable) {
console.log('🔌 Using real backend (detected and available)');
return false;
} else {
console.log('🧪 Using mock server (backend unavailable)');
return true;
}
}
async getBaseUrl() {
const useMock = await this.shouldUseMockServer();
return useMock ? window.location.origin : API_CONFIG.BASE_URL;
}
forceCheck() {
this.isBackendAvailable = null;
this.lastCheck = 0;
}
}
export const backendDetector = new BackendDetector();