determineServer.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import axios from 'axios';
  2. import { API_URL } from 'src/constants';
  3. import { API } from 'src/types';
  4. const SERVER_LIST_URL = API_URL + '/' + API.GET_SERVERS;
  5. const TIMEOUT = 1500;
  6. const fetchWithTimeout = (url: string, timeout = TIMEOUT) => {
  7. return axios.get(url, { timeout, headers: {'Cache-Control': 'no-cache'} });
  8. };
  9. const testServerSpeed = async (serverUrl: string) => {
  10. const startTime = Date.now();
  11. try {
  12. await fetchWithTimeout(serverUrl);
  13. const endTime = Date.now();
  14. return endTime - startTime;
  15. } catch (error) {
  16. console.error(`Error fetching ${serverUrl}:`, error);
  17. return TIMEOUT;
  18. }
  19. };
  20. export const determineFastestServer = async () => {
  21. try {
  22. const response = await axios.get(SERVER_LIST_URL);
  23. const servers = response.data?.maps;
  24. const speedTests = await Promise.allSettled(
  25. servers?.map((server: string) => testServerSpeed(server + '/tiles_osm/2/2/2'))
  26. );
  27. let fastestServer = null;
  28. let fastestTime = TIMEOUT;
  29. speedTests.forEach((result, index) => {
  30. if (result.status === 'fulfilled' && result.value < fastestTime) {
  31. fastestTime = result.value;
  32. fastestServer = servers[index];
  33. }
  34. });
  35. if (fastestServer) {
  36. return fastestServer;
  37. } else {
  38. return null;
  39. }
  40. } catch (error) {
  41. console.error('Error determining fastest server:', error);
  42. throw error;
  43. }
  44. };