server/util/loadServers.js
Rama development · réplica de lectura del repositorio original.
import fs from 'node:fs';
import { getJson } from './http.js';
const sources = [
{
file: "data/servers/ookla.json",
url: "https://www.speedtest.net/api/js/servers?limit=20",
format: (row) => ({
name: row.name,
sponsor: row.sponsor,
country: row.country,
cc: row.cc,
distance: row.distance,
host: row.host
}),
isCurrent: (entries) => entries.length === 0 || entries.every(([, value]) =>
value !== null && typeof value === "object" && "sponsor" in value && "name" in value)
},
{
file: "data/servers/librespeed.json",
url: "https://librespeed.org/backend-servers/servers.php",
format: (row) => row.name,
isCurrent: () => true
}
];
const isFileCurrent = (file, isCurrent) => {
try {
const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
if (parsed === null || typeof parsed !== "object") return false;
return isCurrent(Object.entries(parsed));
} catch {
return false;
}
};
for (const {file, url, format, isCurrent} of sources) {
if (fs.existsSync(file) && isFileCurrent(file, isCurrent)) continue;
getJson(url)
.then((data) => {
const servers = Object.fromEntries((data ?? []).map((row) => [row.id, format(row)]));
fs.writeFileSync(file, JSON.stringify(servers, null, 4));
})
.catch(() => console.error("Could not load servers"));
}