Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
重构所有代码和文档中的项目名称,将OpenFang统一更新为ZCLAW。包括: - 配置文件中的项目名称 - 代码注释和文档引用 - 环境变量和路径 - 类型定义和接口名称 - 测试用例和模拟数据 同时优化部分代码结构,移除未使用的模块,并更新相关依赖项。
138 lines
3.1 KiB
TypeScript
138 lines
3.1 KiB
TypeScript
/**
|
|
* Health Check Library
|
|
*
|
|
* Provides Tauri health check command wrappers and utilities
|
|
* for monitoring the health status of the ZCLAW backend.
|
|
*/
|
|
|
|
import { invoke } from '@tauri-apps/api/core';
|
|
import { isTauriRuntime } from './tauri-gateway';
|
|
|
|
// === Types ===
|
|
|
|
export type HealthStatus = 'healthy' | 'unhealthy' | 'unknown';
|
|
|
|
export interface HealthCheckResult {
|
|
status: HealthStatus;
|
|
message?: string;
|
|
timestamp: number;
|
|
details?: Record<string, unknown>;
|
|
}
|
|
|
|
export interface ZclawHealthResponse {
|
|
healthy: boolean;
|
|
message?: string;
|
|
details?: Record<string, unknown>;
|
|
}
|
|
|
|
// === Health Check Functions ===
|
|
|
|
/**
|
|
* Perform a single health check via Tauri command.
|
|
* Returns a structured result with status, message, and timestamp.
|
|
*/
|
|
export async function performHealthCheck(): Promise<HealthCheckResult> {
|
|
const timestamp = Date.now();
|
|
|
|
if (!isTauriRuntime()) {
|
|
return {
|
|
status: 'unknown',
|
|
message: 'Not running in Tauri environment',
|
|
timestamp,
|
|
};
|
|
}
|
|
|
|
try {
|
|
const response = await invoke<ZclawHealthResponse>('zclaw_health_check');
|
|
|
|
return {
|
|
status: response.healthy ? 'healthy' : 'unhealthy',
|
|
message: response.message,
|
|
timestamp,
|
|
details: response.details,
|
|
};
|
|
} catch (error) {
|
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
return {
|
|
status: 'unhealthy',
|
|
message: `Health check failed: ${errorMessage}`,
|
|
timestamp,
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a periodic health check scheduler.
|
|
* Returns cleanup function to stop the interval.
|
|
*/
|
|
export function createHealthCheckScheduler(
|
|
callback: (result: HealthCheckResult) => void,
|
|
intervalMs: number = 30000 // Default: 30 seconds
|
|
): () => void {
|
|
let intervalId: ReturnType<typeof setInterval> | null = null;
|
|
let isChecking = false;
|
|
|
|
const check = async () => {
|
|
// Prevent overlapping checks
|
|
if (isChecking) return;
|
|
isChecking = true;
|
|
|
|
try {
|
|
const result = await performHealthCheck();
|
|
callback(result);
|
|
} catch (error) {
|
|
console.error('[HealthCheck] Scheduled check failed:', error);
|
|
callback({
|
|
status: 'unknown',
|
|
message: error instanceof Error ? error.message : 'Unknown error',
|
|
timestamp: Date.now(),
|
|
});
|
|
} finally {
|
|
isChecking = false;
|
|
}
|
|
};
|
|
|
|
// Perform initial check immediately
|
|
check();
|
|
|
|
// Schedule periodic checks
|
|
intervalId = setInterval(check, intervalMs);
|
|
|
|
// Return cleanup function
|
|
return () => {
|
|
if (intervalId !== null) {
|
|
clearInterval(intervalId);
|
|
intervalId = null;
|
|
}
|
|
};
|
|
}
|
|
|
|
// === Utility Functions ===
|
|
|
|
/**
|
|
* Get a human-readable label for a health status.
|
|
*/
|
|
export function getHealthStatusLabel(status: HealthStatus): string {
|
|
switch (status) {
|
|
case 'healthy':
|
|
return '健康';
|
|
case 'unhealthy':
|
|
return '异常';
|
|
case 'unknown':
|
|
default:
|
|
return '未知';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Format a timestamp for display.
|
|
*/
|
|
export function formatHealthCheckTime(timestamp: number): string {
|
|
const date = new Date(timestamp);
|
|
return date.toLocaleTimeString('zh-CN', {
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
second: '2-digit',
|
|
});
|
|
}
|