Enhance server status handling by adding normalized URL support and retry logic for fetching status
This commit is contained in:
parent
f3fae8ae51
commit
0e15466eee
@ -99,21 +99,18 @@ document.querySelectorAll('.card').forEach(card => {
|
|||||||
const cards = Array.from(document.querySelectorAll('.card[data-status-url]'));
|
const cards = Array.from(document.querySelectorAll('.card[data-status-url]'));
|
||||||
if (cards.length === 0) return;
|
if (cards.length === 0) return;
|
||||||
|
|
||||||
try {
|
const normalize = (url) => {
|
||||||
const res = await fetch('/server_status.php', { cache: 'no-store' });
|
if (!url) return '';
|
||||||
if (!res.ok) return;
|
return String(url).replace(/\/+$/, '');
|
||||||
const payload = await res.json();
|
};
|
||||||
const byUrl = payload && payload.byUrl ? payload.byUrl : {};
|
|
||||||
|
|
||||||
// Normalisierung muss zur PHP-Normalisierung passen (Trailing Slash entfernen)
|
const applyPayload = (payload) => {
|
||||||
const normalize = (url) => {
|
const byUrl = payload && payload.byUrl ? payload.byUrl : {};
|
||||||
if (!url) return '';
|
const byUrlNormalized = payload && payload.byUrlNormalized ? payload.byUrlNormalized : {};
|
||||||
return String(url).replace(/\/+$/, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const card of cards) {
|
for (const card of cards) {
|
||||||
const key = normalize(card.getAttribute('data-status-url'));
|
const key = normalize(card.getAttribute('data-status-url'));
|
||||||
const svc = byUrl[key] || byUrl[key + '/'] || null;
|
const svc = byUrl[key] || byUrl[key + '/'] || byUrlNormalized[key] || null;
|
||||||
if (!svc) continue;
|
if (!svc) continue;
|
||||||
|
|
||||||
const state = svc.state || 'unknown';
|
const state = svc.state || 'unknown';
|
||||||
@ -134,7 +131,25 @@ document.querySelectorAll('.card').forEach(card => {
|
|||||||
badge.title = svc.detail || 'Unbekannt';
|
badge.title = svc.detail || 'Unbekannt';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
};
|
||||||
// still fine: keep "Unbekannt"
|
|
||||||
|
const fetchAndApply = async () => {
|
||||||
|
const res = await fetch('/server_status.php', { cache: 'no-store' });
|
||||||
|
if (!res.ok) throw new Error('status_fetch_failed');
|
||||||
|
const payload = await res.json();
|
||||||
|
applyPayload(payload);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Ziel: nach ~1s sichtbar springen (nicht sofort beim ersten Paint).
|
||||||
|
// Falls der Endpoint kurz hängt, probieren wir 1-2x nochmal.
|
||||||
|
const attempts = [1000, 2000, 3500];
|
||||||
|
for (let i = 0; i < attempts.length; i++) {
|
||||||
|
await new Promise(r => setTimeout(r, attempts[i]));
|
||||||
|
try {
|
||||||
|
await fetchAndApply();
|
||||||
|
break;
|
||||||
|
} catch (e) {
|
||||||
|
// keep unknown and retry
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@ -40,11 +40,14 @@ if (!is_array($serverStatus)) {
|
|||||||
@file_put_contents($cacheFile, json_encode(['ts' => time(), 'data' => $serverStatus], JSON_UNESCAPED_SLASHES));
|
@file_put_contents($cacheFile, json_encode(['ts' => time(), 'data' => $serverStatus], JSON_UNESCAPED_SLASHES));
|
||||||
}
|
}
|
||||||
|
|
||||||
// index by (normalized-ish) url
|
// index by url + normalized url (trailing slash removed)
|
||||||
$byUrl = [];
|
$byUrl = [];
|
||||||
|
$byUrlNormalized = [];
|
||||||
foreach ($serverStatus as $svc) {
|
foreach ($serverStatus as $svc) {
|
||||||
if (!empty($svc['url']) && is_string($svc['url'])) {
|
if (!empty($svc['url']) && is_string($svc['url'])) {
|
||||||
$byUrl[$svc['url']] = $svc;
|
$u = $svc['url'];
|
||||||
|
$byUrl[$u] = $svc;
|
||||||
|
$byUrlNormalized[rtrim($u, '/')] = $svc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,6 +55,7 @@ $json = json_encode([
|
|||||||
'ts' => time(),
|
'ts' => time(),
|
||||||
'data' => $serverStatus,
|
'data' => $serverStatus,
|
||||||
'byUrl' => $byUrl,
|
'byUrl' => $byUrl,
|
||||||
|
'byUrlNormalized' => $byUrlNormalized,
|
||||||
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
||||||
|
|
||||||
if ($json === false) {
|
if ($json === false) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user