Diese Mini-Doku erklärt in 2-3 Minuten, wie Live-Daten im Projekt funktionieren.
Es gibt zwei relevante Live-Daten-Pfade:
- Home Live Counter (
src/scripts/app/live-counters.ts) - Statistik-KPI Summary (
src/features/stats/hooks/useStatsData.ts)
Beide nutzen das gemeinsame Cache-Modul src/lib/live/cache.ts und gemeinsame Live-States aus src/lib/live/types.ts.
Zentrale States (LiveDataStatus in src/lib/live/types.ts):
loading: Noch keine verwertbaren Daten verfügbar.ok: Erfolgreiche Antwort mit Daten.empty: Erfolgreiche Antwort, aber "0/leer" als fachlich gültiges Ergebnis.stale: Es gibt noch alte Daten, aber Revalidierung läuft oder ist fehlgeschlagen.error: Kein nutzbarer Stand verfügbar.
Fehlerarten (LiveDataErrorKind):
networktimeoutrate_limitinvalidunknown
Wichtig: stale bedeutet bewusst "alte Daten zeigen statt hart auszufallen".
Implementierung in src/lib/live/cache.ts:
- Zweistufiger Cache:
- In-Memory Map (schnell innerhalb der Session)
- Optional
localStorage(persist: true)
- Nur
okundemptywerden persistiert. - Deduplizierung paralleler Requests über
inFlightRequestspro Cache-Key.
Alterung:
staleAfterMs: Danach wird ein Cache-Eintrag alsstalemarkiert.maxCacheAgeMs: Danach wird der Eintrag verworfen.
Standardwerte pro Widget (LIVE_WIDGET_THRESHOLDS in src/lib/live/types.ts):
mc-online: stale nach 60s, max 30mindiscord-online: stale nach 60s, max 30mindiscord-members: stale nach 5min, max 60minstats-kpi: stale nach 5min, max 60min
Fallback-Verhalten:
- Wenn Revalidierung fehlschlägt, aber Cache noch nicht zu alt ist:
- Rückgabe als
staleinkl. Fehlerinfo.
- Rückgabe als
- Wenn Cache zu alt und Fetch fehlschlägt:
- Rückgabe
error.
- Rückgabe
- Timeout je Request:
6_500ms(viasrc/lib/live/fetchJson.ts). - Automatischer Retry bei
network/timeout:- Basis: 1s
- maximal 1 Wiederholungsversuch
429wird alsrate_limitklassifiziert.Retry-AfterHeader wird ausgewertet (Sekunden oder HTTP-Datum).- Für Live-Tiles mit Retry-Button:
- Manuelles Revalidate ist während Cooldown/Busy gesperrt.
- Debounce für manuelle Revalidierung: 2s.
- Nutzt
getLiveResource(...)für Cache + Revalidierung. - Kein separates Auto-Retry-Backoff wie bei Home-Countern.
- User-Flow "Erneut laden" triggert neue Revalidierung über
retrySummary.
Quellwerte kommen aus src/config/minecraftGilde.ts (Export browserAppConfig) und werden in src/layouts/BaseLayout.astro als data-* Attribute am <html> gesetzt.
Gelesen werden sie in src/scripts/app-config.ts.
Relevante Felder:
serverIp-> Minecraft Status APIdiscordGuildId-> Discord Widget APIdiscordInviteCode-> Discord Invite API
Frontend ruft relative Endpunkte auf:
src/features/stats/api.ts(/api/summary,/api/metrics,/api/leaderboard,/api/players)src/features/stats-core/api.ts(/api/player)
Die API-Runtime liegt in src/pages/api/[...path].ts und implementiert die
Statistik-API direkt im Worker (src/lib/http/server/statsApiProxy.ts).
Die Daten kommen direkt aus MariaDB bzw. für Skin/Cape aus Mojang.
Siehe auch docs/stats-api.md für Endpunkte, Caching und lokales Setup.
Wenn du Live-Daten anpasst, prüfe mindestens:
- Passende Thresholds in
src/lib/live/types.ts - Gewünschten Cache-Key/Prefix (
src/lib/live/cache.tsund Aufrufer) - Fehler- und Retry-Verhalten im UI (
src/scripts/app/live-counters.tsoder Stats Hooks)