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