feat: Retry-Logik und Timeout für Verifizierung implementieren

- Neue .env Variable: CONTAINER_CREATE_TIMEOUT=10 (Sekunden)
- Frontend: Automatische Retries bei fehlgeschlagener Verifizierung
  - Max 5 Versuche mit 2 Sekunden Delay zwischen Versuchen
  - Gesamtzeit begrenzt auf 10 Sekunden (CONTAINER_CREATE_TIMEOUT)
  - Bessere Fehlermeldungen für Timeout-Situation

Behebt Problem dass Verifizierung multiple 400-Fehler zeigt bevor sie funktioniert.
Dies passiert weil Container beim Spawn noch nicht bereit ist.
Mit Retries warten wir jetzt automatisch bis Container ready ist (max 10 Sek).
This commit is contained in:
XPS\Micro 2026-02-03 16:17:42 +01:00
parent 5d2c556c33
commit 915c28a4e5
3 changed files with 75 additions and 20 deletions

View File

@ -110,6 +110,11 @@ LOG_LEVEL=INFO
# Container-Timeout in Sekunden (fuer Auto-Shutdown, noch nicht implementiert) # Container-Timeout in Sekunden (fuer Auto-Shutdown, noch nicht implementiert)
CONTAINER_IDLE_TIMEOUT=3600 CONTAINER_IDLE_TIMEOUT=3600
# Container-Erstellungs-Timeout in Sekunden
# Wie lange wartet das Frontend beim Verifizieren auf erfolgreichen Container-Spawn?
# (Standard: 10 Sekunden, dann Error-Message zeigen)
CONTAINER_CREATE_TIMEOUT=10
# ============================================================ # ============================================================
# PASSWORDLESS AUTH - Magic Links # PASSWORDLESS AUTH - Magic Links
# ============================================================ # ============================================================

View File

@ -32,6 +32,21 @@ function VerifyLoginContent() {
} }
const verify = async () => { const verify = async () => {
const maxRetries = 5;
const retryDelay = 2000; // 2 Sekunden
const maxTimeout = 10000; // 10 Sekunden Gesamtzeit
let attempt = 0;
const startTime = Date.now();
while (attempt < maxRetries) {
// Prüfe ob Timeout überschritten
if (Date.now() - startTime > maxTimeout) {
setStatus("error");
setError("Login hat zu lange gedauert. Bitte versuche es später erneut.");
return;
}
const result = await verifyLogin(token); const result = await verifyLogin(token);
if (result.success) { if (result.success) {
@ -40,10 +55,20 @@ function VerifyLoginContent() {
setTimeout(() => { setTimeout(() => {
router.push("/dashboard"); router.push("/dashboard");
}, 1000); }, 1000);
} else { return;
setStatus("error");
setError("Ungültiger oder abgelaufener Link");
} }
// Fehler - Versuche erneut (außer beim letzten Versuch)
attempt++;
if (attempt < maxRetries) {
// Warte vor nächstem Versuch
await new Promise(resolve => setTimeout(resolve, retryDelay));
}
}
// Alle Versuche fehlgeschlagen
setStatus("error");
setError("Login fehlgeschlagen. Bitte versuche den Link erneut anzufordern.");
}; };
verify(); verify();

View File

@ -32,6 +32,21 @@ function VerifySignupContent() {
} }
const verify = async () => { const verify = async () => {
const maxRetries = 5;
const retryDelay = 2000; // 2 Sekunden
const maxTimeout = 10000; // 10 Sekunden Gesamtzeit
let attempt = 0;
const startTime = Date.now();
while (attempt < maxRetries) {
// Prüfe ob Timeout überschritten
if (Date.now() - startTime > maxTimeout) {
setStatus("error");
setError("Verifizierung hat zu lange gedauert. Bitte versuche es später erneut.");
return;
}
const result = await verifySignup(token); const result = await verifySignup(token);
if (result.success) { if (result.success) {
@ -40,10 +55,20 @@ function VerifySignupContent() {
setTimeout(() => { setTimeout(() => {
router.push("/dashboard"); router.push("/dashboard");
}, 2000); }, 2000);
} else { return;
setStatus("error");
setError("Ungültiger oder abgelaufener Link");
} }
// Fehler - Versuche erneut (außer beim letzten Versuch)
attempt++;
if (attempt < maxRetries) {
// Warte vor nächstem Versuch
await new Promise(resolve => setTimeout(resolve, retryDelay));
}
}
// Alle Versuche fehlgeschlagen
setStatus("error");
setError("Verifizierung fehlgeschlagen. Bitte versuche den Link erneut anzufordern.");
}; };
verify(); verify();