From 0590e2a05efe8f0dc64fe01a548a22a37ba41d6e Mon Sep 17 00:00:00 2001 From: cialloo Date: Sun, 5 Oct 2025 08:58:09 +0800 Subject: [PATCH] Refactor server data fetching to batch query all servers in a single API call --- src/contexts/ServerContext.tsx | 70 ++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/src/contexts/ServerContext.tsx b/src/contexts/ServerContext.tsx index ccfe4bd..63c5578 100644 --- a/src/contexts/ServerContext.tsx +++ b/src/contexts/ServerContext.tsx @@ -57,38 +57,58 @@ export function ServerProvider({ children }: { children: ReactNode }) { const [lastUpdated, setLastUpdated] = useState(Date.now()) const fetchServerData = async () => { - const serverPromises = serverList.map(async (server) => { - try { - const response = await fetch('/api/server/statistics/a2s-query', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ + try { + // Batch query all servers in a single API call + const response = await fetch('/api/server/statistics/a2s-query', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + servers: serverList.map(server => ({ serverIP: server.ip, serverPort: server.port, timeout: 3000 - }) + })) }) + }) - if (!response.ok) { - throw new Error(`HTTP ${response.status}`) - } - - const a2sData: A2SResponse = await response.json() - return { ...server, a2sData, status: 'online' as const } - } catch (error) { - console.error(`Failed to fetch data for ${server.name}:`, error) - return { - ...server, - status: 'offline' as const, - error: error instanceof Error ? error.message : 'Unknown error' - } + if (!response.ok) { + throw new Error(`HTTP ${response.status}`) } - }) - const results = await Promise.all(serverPromises) - setServers(results) - setLoading(false) - setLastUpdated(Date.now()) + const data = await response.json() + const results: ServerData[] = serverList.map((server, index) => { + const a2sData = data.results?.[index] + + if (a2sData) { + return { + ...server, + a2sData, + status: 'online' as const + } + } else { + return { + ...server, + status: 'offline' as const, + error: 'No response from server' + } + } + }) + + setServers(results) + setLoading(false) + setLastUpdated(Date.now()) + } catch (error) { + console.error('Failed to fetch server data:', error) + // Set all servers to offline on error + const offlineServers: ServerData[] = serverList.map(server => ({ + ...server, + status: 'offline' as const, + error: error instanceof Error ? error.message : 'Unknown error' + })) + setServers(offlineServers) + setLoading(false) + setLastUpdated(Date.now()) + } } // Initial fetch and polling every 2 seconds