The crawler subdirectory was the only active project. Moving it to the repo root simplifies paths and removes the unnecessary nesting. The vqa/ and immoweb/ directories were legacy/unused and have been removed. Updated .drone.yml, .gitignore, .claude/ docs, and skills to reflect the new flat structure.
74 lines
1.6 KiB
TypeScript
74 lines
1.6 KiB
TypeScript
// Health check service for backend connectivity
|
|
|
|
export type HealthStatus = 'checking' | 'healthy' | 'unhealthy';
|
|
|
|
export interface HealthCheckResult {
|
|
status: HealthStatus;
|
|
latencyMs?: number;
|
|
error?: string;
|
|
}
|
|
|
|
/**
|
|
* Check backend health by calling the /api/status endpoint
|
|
*/
|
|
export async function checkBackendHealth(): Promise<HealthCheckResult> {
|
|
const startTime = performance.now();
|
|
|
|
try {
|
|
const response = await fetch('/api/status', {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
// Short timeout for health checks
|
|
signal: AbortSignal.timeout(5000),
|
|
});
|
|
|
|
const latencyMs = Math.round(performance.now() - startTime);
|
|
|
|
if (!response.ok) {
|
|
return {
|
|
status: 'unhealthy',
|
|
latencyMs,
|
|
error: `HTTP ${response.status}`,
|
|
};
|
|
}
|
|
|
|
const data = await response.json();
|
|
if (data.status === 'OK') {
|
|
return {
|
|
status: 'healthy',
|
|
latencyMs,
|
|
};
|
|
}
|
|
|
|
return {
|
|
status: 'unhealthy',
|
|
latencyMs,
|
|
error: 'Unexpected response',
|
|
};
|
|
} catch (error) {
|
|
const latencyMs = Math.round(performance.now() - startTime);
|
|
|
|
if (error instanceof Error) {
|
|
if (error.name === 'TimeoutError' || error.name === 'AbortError') {
|
|
return {
|
|
status: 'unhealthy',
|
|
latencyMs,
|
|
error: 'Request timeout',
|
|
};
|
|
}
|
|
return {
|
|
status: 'unhealthy',
|
|
latencyMs,
|
|
error: error.message,
|
|
};
|
|
}
|
|
|
|
return {
|
|
status: 'unhealthy',
|
|
latencyMs,
|
|
error: 'Connection failed',
|
|
};
|
|
}
|
|
}
|