From 320629542dd6353ebc7b8a8e04640109e21018af Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Mon, 28 Aug 2023 15:13:16 +0200 Subject: [PATCH] status --- package-lock.json | 87 ++++++++++++++++++++++++++++++- package.json | 3 +- src/lib/index.ts | 1 + src/routes/+layout.svelte | 1 + src/routes/status/+page.server.ts | 73 ++++++++++++++++++++++++++ src/routes/status/+page.svelte | 25 +++++++++ 6 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 src/routes/status/+page.server.ts create mode 100644 src/routes/status/+page.svelte diff --git a/package-lock.json b/package-lock.json index 89b1c52..c67dcbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.1", "dependencies": { "date-fns": "^2.30.0", - "fuse.js": "^6.6.2" + "fuse.js": "^6.6.2", + "node-fetch": "^3.3.2" }, "devDependencies": { "@sveltejs/adapter-auto": "^2.1.0", @@ -1530,6 +1531,14 @@ "node": ">=4" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -1964,6 +1973,28 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2023,6 +2054,17 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -2597,6 +2639,41 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -3868,6 +3945,14 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 473abf5..8a555b9 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "type": "module", "dependencies": { "date-fns": "^2.30.0", - "fuse.js": "^6.6.2" + "fuse.js": "^6.6.2", + "node-fetch": "^3.3.2" } } diff --git a/src/lib/index.ts b/src/lib/index.ts index e249d4e..18d6ff8 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -55,6 +55,7 @@ export async function fetchMaster(fetch: Fetch): Promise { const controller = new AbortController(); const id = setTimeout(() => controller.abort(), 5000); const res = await fetch('https://master1.ddnet.org/ddnet/15/servers.json', { + mode: "cors", signal: controller.signal }); clearTimeout(id); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f403f1f..ed99381 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -23,6 +23,7 @@
+ Status Players Datasette
diff --git a/src/routes/status/+page.server.ts b/src/routes/status/+page.server.ts new file mode 100644 index 0000000..3318d54 --- /dev/null +++ b/src/routes/status/+page.server.ts @@ -0,0 +1,73 @@ +import { error } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; +import fetch from "node-fetch" + +async function fetchPing(url: string): Promise<{ ms: number, status: number } | null> { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), 10000); + const now = new Date().getTime(); + try { + const res = await fetch(url, { + signal: controller.signal + }); + clearTimeout(id); + const after = new Date().getTime(); + return { + ms: after - now, + status: res.status + }; + } catch (e) { + clearTimeout(id); + return null; + } +} + +let lastStatus: { + ddnet: { + ms: number; + status: number; + } | null; + forum: { + ms: number; + status: number; + } | null; + wiki: { + ms: number; + status: number; + } | null; + master1: { + ms: number; + status: number; + } | null; + master2: { + ms: number; + status: number; + } | null; + last: Date, +} = { + master1: null, + forum: null, + wiki: null, + master2: null, + ddnet: null, + last: new Date("01-01-2000") +} + + +export const load: PageServerLoad = async ({ params }) => { + const older = Date.now() - 1000 * 30; + if (lastStatus.last.getTime() < older) { + lastStatus = { + ddnet: await fetchPing('https://ddnet.org/'), + forum: await fetchPing('https://forum.ddnet.org/'), + wiki: await fetchPing('https://ddnet.org/'), + master1: await fetchPing('https://master1.ddnet.org/ddnet/15/servers.json'), + master2: await fetchPing('https://master2.ddnet.org/ddnet/15/servers.json'), + last: new Date() + } + } + + return { + status: lastStatus + }; +}; diff --git a/src/routes/status/+page.svelte b/src/routes/status/+page.svelte new file mode 100644 index 0000000..27314d5 --- /dev/null +++ b/src/routes/status/+page.svelte @@ -0,0 +1,25 @@ + + + + +

DDNet Status

+

Here you can see the DDNet servers status.

+ +

Ping is relative to Helsinki (europe)

+ +
    +
  • master1 ({data.status.master1?.status}) {data.status.master1?.ms} ms
  • +
  • master2 ({data.status.master2?.status}) {data.status.master2?.ms} ms
  • +
  • ddnet.org ({data.status.ddnet?.status}) {data.status.ddnet?.ms} ms
  • +
  • forum.ddnet.org ({data.status.forum?.status}) {data.status.forum?.ms} ms
  • +
  • wiki.ddnet.org ({data.status.wiki?.status}) {data.status.wiki?.ms} ms
  • +
+
+