* 轻量级服务器ping测试
(serverId: number)
| 810 | * 轻量级服务器ping测试 |
| 811 | */ |
| 812 | async function quickPingTest(serverId: number): Promise<{ available: boolean; ping?: number; error?: string }> { |
| 813 | try { |
| 814 | if (!fs.existsSync(SPEEDTEST_PATH)) { |
| 815 | await downloadCli(); |
| 816 | } |
| 817 | |
| 818 | // 只进行ping测试,不执行完整的速度测试 |
| 819 | const command = `"${SPEEDTEST_PATH}" --accept-license --accept-gdpr -f json -s ${serverId} --progress=no --selection-details`; |
| 820 | const { stdout, stderr } = await execAsync(command, { |
| 821 | timeout: 8000 // 8秒超时,只需要ping测试 |
| 822 | }); |
| 823 | |
| 824 | if (stderr) { |
| 825 | if (stderr.includes("NoServersException") || stderr.includes("Server not found")) { |
| 826 | return { available: false, error: "服务器不存在" }; |
| 827 | } |
| 828 | if (stderr.includes("Timeout") || stderr.includes("timeout")) { |
| 829 | return { available: false, error: "连接超时" }; |
| 830 | } |
| 831 | if (stderr.includes("Cannot read from socket")) { |
| 832 | return { available: false, error: "网络连接失败" }; |
| 833 | } |
| 834 | } |
| 835 | |
| 836 | // 如果能获取到输出,说明服务器基本可用 |
| 837 | if (stdout && stdout.trim()) { |
| 838 | try { |
| 839 | const result = JSON.parse(stdout); |
| 840 | if (result.ping && result.ping.latency) { |
| 841 | return { available: true, ping: result.ping.latency }; |
| 842 | } |
| 843 | if (result.server && result.server.id === serverId) { |
| 844 | return { available: true }; |
| 845 | } |
| 846 | } catch (parseError) { |
| 847 | // JSON解析失败,但有输出说明服务器响应了 |
| 848 | return { available: true }; |
| 849 | } |
| 850 | } |
| 851 | |
| 852 | return { available: true }; |
| 853 | } catch (error: any) { |
| 854 | console.error(`Server ${serverId} ping test failed:`, error); |
| 855 | |
| 856 | if (error.code === 'ETIMEDOUT') { |
| 857 | return { available: false, error: "连接超时" }; |
| 858 | } |
| 859 | if (error.message?.includes('NoServersException')) { |
| 860 | return { available: false, error: "服务器不可用" }; |
| 861 | } |
| 862 | |
| 863 | return { available: false, error: error.message || "未知错误" }; |
| 864 | } |
| 865 | } |
| 866 | |
| 867 | /** |
| 868 | * 简化的服务器可用性检测 - 仅检查服务器是否在列表中 |
nothing calls this directly
no test coverage detected