Files
zclaw_openfang/desktop/src/lib/health-check.ts
iven 0d4fa96b82
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
refactor: 统一项目名称从OpenFang到ZCLAW
重构所有代码和文档中的项目名称,将OpenFang统一更新为ZCLAW。包括:
- 配置文件中的项目名称
- 代码注释和文档引用
- 环境变量和路径
- 类型定义和接口名称
- 测试用例和模拟数据

同时优化部分代码结构,移除未使用的模块,并更新相关依赖项。
2026-03-27 07:36:03 +08:00

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',
});
}