Events, Fehler und Retries
Event-System
TooLostClient erweitert einen typisierten EventEmitter mit vier Kanaelen:
requestresponseerrortokenRefresh
Listener-Methoden
ts
client.on(eventName, listener);
client.once(eventName, listener);
client.off(eventName, listener);Event-Payloads
request
ts
interface RequestEvent {
method: string;
path: string;
url: string;
headers: Record<string, string>;
body?: unknown;
attempt: number;
}response
ts
interface ResponseEvent {
method: string;
path: string;
url: string;
status: number;
ok: boolean;
durationMs: number;
}error
ts
interface ErrorEvent {
method: string;
path: string;
url: string;
status?: number;
message: string;
}tokenRefresh
ts
interface TokenRefreshEvent {
accessToken: string;
refreshToken: string;
expiresAt: number;
}Wichtige Semantik
errorwird fuer API- und Netzwerkfehler aus der REST-Schicht emittiert.error-Emission ist imTooLostClientabgesichert: ohne Listener wird nicht emittiert.responsewird fuer jede Fetch-Antwort emittiert, auch bei Nicht-2xx.request.attemptsteigt bei jedem Retry.
Fehlertypen
TooLostAPIError
ts
class TooLostAPIError extends Error {
readonly status: number;
readonly body?: unknown;
}Wird fuer Nicht-2xx-API-Antworten und bestimmte Token-Refresh-Fehler geworfen.
Strategie fuer Fehlermeldungen
Bei Nicht-2xx wird die Meldung in dieser Reihenfolge bestimmt:
body.messagebody.errorresponse.statusText- Fallback
"Request failed"
Retry-Verhalten
Retry ist in REST.request implementiert.
Standardwerte
- Client-Default:
2 - Pro Request ueberschreibbar:
RequestOptions.retry
Retry-Bedingungen
Es wird erneut versucht, wenn mindestens eines gilt:
- Response-Status ist
>= 500 - Response-Status ist
429 fetchwirft einen Fehler, der keinTooLostAPIErrorist
Backoff-Schema
Backoff nach Attempt-Index (attempt ist in REST nullbasiert):
- attempt 0 -> 1000 ms
- attempt 1 -> 2000 ms
- attempt 2+ -> maximal 3000 ms
Formel:
ts
Math.min(1000 * (attempt + 1), 3000);Token-Refresh-Verhalten
Pre-Request-Refresh
Vor jedem Request kann ein Refresh erfolgen, wenn:
autoRefreshaktiv istskipAuthfalse istrefreshTokenexistiertexpiresAtbekannt ist- Token in <= 30 Sekunden ablaeuft
401 Refresh-and-Retry
Nach einem fehlgeschlagenen Request wird genau einmal wiederholt, wenn:
- Fehler ist
TooLostAPIError - Status ist
401 autoRefreshist aktivskipAuthist falserefreshTokenist vorhanden
Danach wird der urspruengliche Request erneut gesendet.
Refresh-Deduplizierung
Parallel ausgeloeste Refreshes teilen sich ein gemeinsames Promise (inflightRefresh), damit keine doppelten Token-Refresh-Calls passieren.
Praktische Hinweise
- Fuer Observability in Produktion mindestens einen
error-Listener registrieren. - Schreiboperationen wenn moeglich idempotent halten, falls Retries aktiv sind.
- Fuer nicht wiederholbare Calls
retry: 0pro Request setzen.