1import fs from 'node:fs';
2import { getJson } from './http.js';
3
4const sources = [
5 {
6 file: "data/servers/ookla.json",
7 url: "https://www.speedtest.net/api/js/servers?limit=20",
8 format: (row) => ({
9 name: row.name,
10 sponsor: row.sponsor,
11 country: row.country,
12 cc: row.cc,
13 distance: row.distance,
14 host: row.host
15 }),
16 isCurrent: (entries) => entries.length === 0 || entries.every(([, value]) =>
17 value !== null && typeof value === "object" && "sponsor" in value && "name" in value)
18 },
19 {
20 file: "data/servers/librespeed.json",
21 url: "https://librespeed.org/backend-servers/servers.php",
22 format: (row) => row.name,
23 isCurrent: () => true
24 }
25];
26
27const isFileCurrent = (file, isCurrent) => {
28 try {
29 const parsed = JSON.parse(fs.readFileSync(file, "utf8"));
30 if (parsed === null || typeof parsed !== "object") return false;
31 return isCurrent(Object.entries(parsed));
32 } catch {
33 return false;
34 }
35};
36
37for (const {file, url, format, isCurrent} of sources) {
38 if (fs.existsSync(file) && isFileCurrent(file, isCurrent)) continue;
39
40 getJson(url)
41 .then((data) => {
42 const servers = Object.fromEntries((data ?? []).map((row) => [row.id, format(row)]));
43 fs.writeFileSync(file, JSON.stringify(servers, null, 4));
44 })
45 .catch(() => console.error("Could not load servers"));
46}
47