fix(service-party-app): 修复Kava API健康检查逻辑
问题: Kava API检测失败,原因是使用测试地址查询余额的方式不可靠 解决方案: 1. 添加 healthCheck() 方法到 KavaTxService,查询最新区块 2. 添加 kava:healthCheck IPC 处理器 3. 更新 appStore 使用 healthCheck API 而非 getBalance 修改的文件: - kava-tx-service.ts: 添加 healthCheck() 方法 - main.ts: 添加 kava:healthCheck IPC 处理器 - preload.ts: 暴露 healthCheck API - appStore.ts: 使用 healthCheck 检测 Kava API - electron.d.ts: 添加 KavaHealthCheckResult 类型 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
a2508ab0fd
commit
81c8db9d50
|
|
@ -536,6 +536,16 @@ function setupIpcHandlers() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Kava 健康检查
|
||||||
|
ipcMain.handle('kava:healthCheck', async () => {
|
||||||
|
try {
|
||||||
|
const result = await kavaTxService?.healthCheck();
|
||||||
|
return { success: result?.ok ?? false, data: result };
|
||||||
|
} catch (error) {
|
||||||
|
return { success: false, error: (error as Error).message };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// 对话框相关
|
// 对话框相关
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
|
|
||||||
|
|
@ -500,6 +500,43 @@ export class KavaTxService {
|
||||||
disconnect(): void {
|
disconnect(): void {
|
||||||
// REST API 无需断开连接
|
// REST API 无需断开连接
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 健康检查 - 验证 API 是否可用
|
||||||
|
*/
|
||||||
|
async healthCheck(): Promise<{ ok: boolean; latency?: number; error?: string }> {
|
||||||
|
const startTime = Date.now();
|
||||||
|
try {
|
||||||
|
// 查询链的最新区块,这是最轻量级的检查
|
||||||
|
const response = await this.request<{
|
||||||
|
block: {
|
||||||
|
header: {
|
||||||
|
height: string;
|
||||||
|
chain_id: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}>('/cosmos/base/tendermint/v1beta1/blocks/latest');
|
||||||
|
|
||||||
|
const latency = Date.now() - startTime;
|
||||||
|
|
||||||
|
if (response?.block?.header?.height) {
|
||||||
|
return {
|
||||||
|
ok: true,
|
||||||
|
latency,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
ok: false,
|
||||||
|
error: 'Invalid response format',
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
return {
|
||||||
|
ok: false,
|
||||||
|
error: error instanceof Error ? error.message : String(error),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出默认服务实例
|
// 导出默认服务实例
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,9 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||||
rpcEndpoint?: string;
|
rpcEndpoint?: string;
|
||||||
chainId?: string;
|
chainId?: string;
|
||||||
}) => ipcRenderer.invoke('kava:updateConfig', { config }),
|
}) => ipcRenderer.invoke('kava:updateConfig', { config }),
|
||||||
|
|
||||||
|
// 健康检查
|
||||||
|
healthCheck: () => ipcRenderer.invoke('kava:healthCheck'),
|
||||||
},
|
},
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
|
|
||||||
|
|
@ -139,21 +139,20 @@ export const useAppStore = create<AppState>((set, get) => ({
|
||||||
setKavaApiStatus({ status: 'checking', message: '正在检测...' });
|
setKavaApiStatus({ status: 'checking', message: '正在检测...' });
|
||||||
try {
|
try {
|
||||||
if (window.electronAPI) {
|
if (window.electronAPI) {
|
||||||
// 使用一个已知的测试地址查询余额来验证 API
|
// 使用健康检查 API (查询最新区块)
|
||||||
const testAddress = 'kava1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnxwpql';
|
const result = await window.electronAPI.kava.healthCheck();
|
||||||
const result = await window.electronAPI.kava.getBalance(testAddress);
|
if (result.success && result.data?.ok) {
|
||||||
if (result.success || result.error?.includes('account')) {
|
|
||||||
// 即使账户不存在,API 能响应也说明连接正常
|
|
||||||
const config = await window.electronAPI.kava.getConfig();
|
const config = await window.electronAPI.kava.getConfig();
|
||||||
|
const latencyMsg = result.data.latency ? ` (${result.data.latency}ms)` : '';
|
||||||
setKavaApiStatus({
|
setKavaApiStatus({
|
||||||
status: 'connected',
|
status: 'connected',
|
||||||
message: config?.lcdEndpoint || 'Kava Mainnet',
|
message: (config?.lcdEndpoint || 'Kava Mainnet') + latencyMsg,
|
||||||
lastChecked: new Date(),
|
lastChecked: new Date(),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
setKavaApiStatus({
|
setKavaApiStatus({
|
||||||
status: 'error',
|
status: 'error',
|
||||||
message: result.error || 'API 响应异常',
|
message: result.data?.error || result.error || 'API 响应异常',
|
||||||
lastChecked: new Date(),
|
lastChecked: new Date(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -331,6 +331,16 @@ interface GetKavaTxStatusResult {
|
||||||
error?: string;
|
error?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface KavaHealthCheckResult {
|
||||||
|
success: boolean;
|
||||||
|
data?: {
|
||||||
|
ok: boolean;
|
||||||
|
latency?: number;
|
||||||
|
error?: string;
|
||||||
|
};
|
||||||
|
error?: string;
|
||||||
|
}
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
// Electron API 接口
|
// Electron API 接口
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
|
|
@ -403,6 +413,7 @@ interface ElectronAPI {
|
||||||
getTxStatus: (txHash: string) => Promise<GetKavaTxStatusResult>;
|
getTxStatus: (txHash: string) => Promise<GetKavaTxStatusResult>;
|
||||||
getConfig: () => Promise<KavaConfig>;
|
getConfig: () => Promise<KavaConfig>;
|
||||||
updateConfig: (config: Partial<KavaConfig>) => Promise<{ success: boolean; error?: string }>;
|
updateConfig: (config: Partial<KavaConfig>) => Promise<{ success: boolean; error?: string }>;
|
||||||
|
healthCheck: () => Promise<KavaHealthCheckResult>;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 对话框相关
|
// 对话框相关
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue