feat: implement rate limiting handling in JMAPClient #104

This commit is contained in:
Linus Rath
2026-03-27 00:22:40 +01:00
parent 6696636df8
commit a46fb9c8af
17 changed files with 481 additions and 67 deletions
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "Nein",
"unknown": "Unbekannt",
"app_title": "Webmail",
"reconnecting": "Verbindung verloren. Verbindung wird wiederhergestellt…"
"reconnecting": "Verbindung verloren. Verbindung wird wiederhergestellt…",
"rate_limited_title": "Die Serverauthentifizierung ist vorubergehend begrenzt.",
"rate_limited_detail": "Bulwark hat Hintergrundanfragen pausiert, um eine Sperre zu vermeiden. Neuer Versuch in {seconds}s.",
"rate_limited_action_title": "Anfrage pausiert, um eine Sperre zu vermeiden.",
"rate_limited_action_detail": "Bulwark wartet, bis die Serverabklingzeit endet, bevor weitere authentifizierte Anfragen gesendet werden. Versuchen Sie es in {seconds}s erneut."
},
"notifications": {
"email_sent": "E-Mail erfolgreich gesendet",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "No",
"unknown": "Unknown",
"app_title": "Webmail",
"reconnecting": "Connection lost. Attempting to reconnect…"
"reconnecting": "Connection lost. Attempting to reconnect…",
"rate_limited_title": "Server authentication is temporarily rate limited.",
"rate_limited_detail": "Bulwark has paused background requests to avoid lockout. Retrying in {seconds}s.",
"rate_limited_action_title": "Request paused to avoid lockout.",
"rate_limited_action_detail": "Bulwark is waiting for the server cooldown to end before sending more authenticated requests. Try again in {seconds}s."
},
"notifications": {
"email_sent": "Email sent successfully",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "No",
"unknown": "Desconocido",
"app_title": "Correo Web",
"reconnecting": "Conexión perdida. Intentando reconectar…"
"reconnecting": "Conexión perdida. Intentando reconectar…",
"rate_limited_title": "La autenticación del servidor está limitada temporalmente.",
"rate_limited_detail": "Bulwark ha pausado las solicitudes en segundo plano para evitar un bloqueo. Reintentando en {seconds}s.",
"rate_limited_action_title": "Solicitud pausada para evitar el bloqueo.",
"rate_limited_action_detail": "Bulwark está esperando a que termine el enfriamiento del servidor antes de enviar más solicitudes autenticadas. Inténtalo de nuevo en {seconds}s."
},
"notifications": {
"email_sent": "Correo enviado exitosamente",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "Non",
"unknown": "Inconnu",
"app_title": "Webmail",
"reconnecting": "Connexion perdue. Tentative de reconnexion…"
"reconnecting": "Connexion perdue. Tentative de reconnexion…",
"rate_limited_title": "L'authentification du serveur est temporairement limitee.",
"rate_limited_detail": "Bulwark a suspendu les requetes en arriere-plan pour eviter un blocage. Nouvelle tentative dans {seconds}s.",
"rate_limited_action_title": "Requete suspendue pour eviter le blocage.",
"rate_limited_action_detail": "Bulwark attend la fin du delai impose par le serveur avant d'envoyer d'autres requetes authentifiees. Reessayez dans {seconds}s."
},
"notifications": {
"email_sent": "Email envoyé avec succès",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "No",
"unknown": "Sconosciuto",
"app_title": "Webmail",
"reconnecting": "Connessione persa. Tentativo di riconnessione…"
"reconnecting": "Connessione persa. Tentativo di riconnessione…",
"rate_limited_title": "L'autenticazione del server e temporaneamente limitata.",
"rate_limited_detail": "Bulwark ha sospeso le richieste in background per evitare il blocco. Nuovo tentativo tra {seconds}s.",
"rate_limited_action_title": "Richiesta sospesa per evitare il blocco.",
"rate_limited_action_detail": "Bulwark attende che termini il cooldown del server prima di inviare altre richieste autenticate. Riprova tra {seconds}s."
},
"notifications": {
"email_sent": "Messaggio inviato con successo",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "いいえ",
"unknown": "不明",
"app_title": "ウェブメール",
"reconnecting": "接続が切れました。再接続を試みています…"
"reconnecting": "接続が切れました。再接続を試みています…",
"rate_limited_title": "サーバー認証は一時的に制限されています。",
"rate_limited_detail": "ロックアウトを避けるため、Bulwark はバックグラウンド要求を一時停止しました。{seconds} 秒後に再試行します。",
"rate_limited_action_title": "ロックアウトを避けるため要求を一時停止しました。",
"rate_limited_action_detail": "Bulwark はサーバーのクールダウンが終わるまで、追加の認証付きリクエストを送信しません。{seconds} 秒後に再試行してください。"
},
"notifications": {
"email_sent": "メールを送信しました",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "Nee",
"unknown": "Onbekend",
"app_title": "Webmail",
"reconnecting": "Verbinding verloren. Opnieuw verbinden…"
"reconnecting": "Verbinding verloren. Opnieuw verbinden…",
"rate_limited_title": "Serverauthenticatie is tijdelijk beperkt.",
"rate_limited_detail": "Bulwark heeft achtergrondverzoeken gepauzeerd om een blokkade te voorkomen. Nieuwe poging over {seconds}s.",
"rate_limited_action_title": "Verzoek gepauzeerd om blokkade te voorkomen.",
"rate_limited_action_detail": "Bulwark wacht tot de servercooldown voorbij is voordat er nieuwe geauthenticeerde verzoeken worden verzonden. Probeer het over {seconds}s opnieuw."
},
"notifications": {
"email_sent": "E-mail succesvol verzonden",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "Não",
"unknown": "Desconhecido",
"app_title": "Webmail",
"reconnecting": "Conexão perdida. Tentando reconectar…"
"reconnecting": "Conexão perdida. Tentando reconectar…",
"rate_limited_title": "A autenticação do servidor está temporariamente limitada.",
"rate_limited_detail": "O Bulwark pausou as solicitações em segundo plano para evitar bloqueio. Nova tentativa em {seconds}s.",
"rate_limited_action_title": "Solicitação pausada para evitar bloqueio.",
"rate_limited_action_detail": "O Bulwark está aguardando o fim do cooldown do servidor antes de enviar mais solicitações autenticadas. Tente novamente em {seconds}s."
},
"notifications": {
"email_sent": "E-mail enviado com sucesso",
+5 -1
View File
@@ -511,7 +511,11 @@
"no": "Нет",
"unknown": "Неизвестно",
"app_title": "Веб-почта",
"reconnecting": "Соединение потеряно. Попытка переподключения…"
"reconnecting": "Соединение потеряно. Попытка переподключения…",
"rate_limited_title": "Аутентификация на сервере временно ограничена.",
"rate_limited_detail": "Bulwark приостановил фоновые запросы, чтобы избежать блокировки. Повтор через {seconds}с.",
"rate_limited_action_title": "Запрос приостановлен, чтобы избежать блокировки.",
"rate_limited_action_detail": "Bulwark ждет окончания серверного тайм-аута перед отправкой новых аутентифицированных запросов. Повторите через {seconds}с."
},
"notifications": {
"email_sent": "Письмо успешно отправлено",