fix(relay): handle dead connections and preserve usage on refresh failure
Use received frames for peer liveness and reject new requests after terminal relay failures. Keep authoritative usage snapshots separate from refresh errors, bound request lifetime, and guard concurrent refreshes and runtime switches. Add regression coverage for relay liveness, terminal rejections, quota failures, cancellation and request deadlines. Validated with 51 focused tests, workspace type-check and lint, web build and mobile assets.
This commit is contained in:
@@ -1577,6 +1577,7 @@ export const dict = {
|
||||
'header.services.refreshRateLimitsAria': 'Ratenlimits aktualisieren',
|
||||
'header.services.noRateLimits': 'Keine Ratenlimits verfügbar.',
|
||||
'header.services.noRateLimitsReported': 'Keine Ratenlimits berichtet.',
|
||||
'header.services.usageRefreshFailedStale': 'Zuvor empfangene Nutzungsdaten werden angezeigt. Aktualisierung fehlgeschlagen: {error}',
|
||||
'header.services.remoteUpdate.title': 'Remote-Instanz-Update',
|
||||
'header.services.remoteUpdate.checking': 'Suche nach Updates...',
|
||||
'header.services.remoteUpdate.upToDate': 'Diese Instanz ist auf dem neuesten Stand.',
|
||||
|
||||
@@ -1777,6 +1777,7 @@ export const dict = {
|
||||
'header.services.refreshRateLimitsAria': 'Refresh rate limits',
|
||||
'header.services.noRateLimits': 'No rate limits available.',
|
||||
'header.services.noRateLimitsReported': 'No rate limits reported.',
|
||||
'header.services.usageRefreshFailedStale': 'Showing previously received usage. Refresh failed: {error}',
|
||||
'header.services.remoteUpdate.title': 'Remote instance update',
|
||||
'header.services.remoteUpdate.checking': 'Looking for updates...',
|
||||
'header.services.remoteUpdate.upToDate': 'This instance is up to date.',
|
||||
|
||||
@@ -1755,6 +1755,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
"header.services.refreshRateLimitsAria": "Actualizar límites de tasa",
|
||||
"header.services.noRateLimits": "No hay límites de tasa disponibles.",
|
||||
"header.services.noRateLimitsReported": "No se reportaron límites de tasa.",
|
||||
"header.services.usageRefreshFailedStale": "Se muestran los datos de uso recibidos anteriormente. No se pudieron actualizar: {error}",
|
||||
"header.services.remoteUpdate.title": "Actualización de instancia remota",
|
||||
"header.services.remoteUpdate.checking": "Buscando actualizaciones...",
|
||||
"header.services.remoteUpdate.upToDate": "Esta instancia está actualizada.",
|
||||
|
||||
@@ -1540,6 +1540,7 @@ export const dict = {
|
||||
'header.services.refreshRateLimitsAria': 'Limites du taux de rafraîchissement',
|
||||
'header.services.noRateLimits': 'Aucune limite de taux disponible.',
|
||||
'header.services.noRateLimitsReported': 'Aucune limite de taux signalée.',
|
||||
'header.services.usageRefreshFailedStale': 'Les données d’utilisation précédentes sont affichées. Échec de l’actualisation : {error}',
|
||||
'header.services.used': 'Utilisé',
|
||||
'header.services.remaining': 'Restant',
|
||||
'header.services.modelFamily.other': 'Autre',
|
||||
|
||||
@@ -1773,6 +1773,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'header.services.refreshRateLimitsAria': 'レート制限を更新',
|
||||
'header.services.noRateLimits': 'レート制限は利用できません。',
|
||||
'header.services.noRateLimitsReported': 'レート制限は報告されていません。',
|
||||
'header.services.usageRefreshFailedStale': '以前に取得した使用状況を表示しています。更新に失敗しました: {error}',
|
||||
'header.services.remoteUpdate.title': 'リモートインスタンスの更新',
|
||||
'header.services.remoteUpdate.checking': '更新を確認中...',
|
||||
'header.services.remoteUpdate.upToDate': 'このインスタンスは最新です。',
|
||||
|
||||
@@ -1779,6 +1779,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'header.services.refreshRateLimitsAria': '레이트 리밋 새로고침',
|
||||
'header.services.noRateLimits': '사용 가능한 레이트 리밋이 없습니다.',
|
||||
'header.services.noRateLimitsReported': '보고된 레이트 리밋이 없습니다.',
|
||||
'header.services.usageRefreshFailedStale': '이전에 받은 사용량을 표시하고 있습니다. 새로고침 실패: {error}',
|
||||
'header.services.remoteUpdate.title': '원격 인스턴스 업데이트',
|
||||
'header.services.remoteUpdate.checking': '업데이트를 확인하는 중...',
|
||||
'header.services.remoteUpdate.upToDate': '이 인스턴스는 최신 상태입니다.',
|
||||
|
||||
@@ -2539,6 +2539,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'header.services.modelFamily.other': 'Inne',
|
||||
'header.services.noRateLimits': 'Brak dostępnych limitów użycia.',
|
||||
'header.services.noRateLimitsReported': 'Nie zgłoszono limitów użycia.',
|
||||
'header.services.usageRefreshFailedStale': 'Wyświetlane są wcześniej otrzymane dane użycia. Odświeżanie nie powiodło się: {error}',
|
||||
'header.services.remoteUpdate.title': 'Aktualizacja zdalnej instancji',
|
||||
'header.services.remoteUpdate.checking': 'Sprawdzanie aktualizacji...',
|
||||
'header.services.remoteUpdate.upToDate': 'Ta instancja jest aktualna.',
|
||||
|
||||
@@ -1755,6 +1755,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
"header.services.refreshRateLimitsAria": "Atualizar limites de taxa",
|
||||
"header.services.noRateLimits": "Não há limites de taxa disponíveis.",
|
||||
"header.services.noRateLimitsReported": "Nenhum limite de taxa foi informado.",
|
||||
"header.services.usageRefreshFailedStale": "Exibindo os dados de uso recebidos anteriormente. Falha ao atualizar: {error}",
|
||||
"header.services.remoteUpdate.title": "Atualização da instância remota",
|
||||
"header.services.remoteUpdate.checking": "Procurando atualizações...",
|
||||
"header.services.remoteUpdate.upToDate": "Esta instância está atualizada.",
|
||||
|
||||
@@ -1739,6 +1739,7 @@ export const dict = {
|
||||
'header.services.refreshRateLimitsAria': 'Rate limit\'leri yenile',
|
||||
'header.services.noRateLimits': 'Kullanılabilir rate limit yok.',
|
||||
'header.services.noRateLimitsReported': 'Bildirilen rate limit yok.',
|
||||
'header.services.usageRefreshFailedStale': 'Daha önce alınan kullanım verileri gösteriliyor. Yenileme başarısız: {error}',
|
||||
'header.services.remoteUpdate.title': 'Uzak instance güncellemesi',
|
||||
'header.services.remoteUpdate.checking': 'Güncellemeler aranıyor...',
|
||||
'header.services.remoteUpdate.upToDate': 'Bu instance güncel.',
|
||||
|
||||
@@ -1755,6 +1755,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
"header.services.refreshRateLimitsAria": "Оновити ліміти запитів",
|
||||
"header.services.noRateLimits": "Ліміти запитів недоступні.",
|
||||
"header.services.noRateLimitsReported": "Ліміти запитів не надходять.",
|
||||
"header.services.usageRefreshFailedStale": "Показано раніше отримані дані використання. Не вдалося оновити: {error}",
|
||||
"header.services.remoteUpdate.title": "Оновлення віддаленого інстанса",
|
||||
"header.services.remoteUpdate.checking": "Шукаємо оновлення...",
|
||||
"header.services.remoteUpdate.upToDate": "Цей інстанс уже оновлений.",
|
||||
|
||||
@@ -1743,6 +1743,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'header.services.refreshRateLimitsAria': '刷新速率限制',
|
||||
'header.services.noRateLimits': '没有可用的速率限制。',
|
||||
'header.services.noRateLimitsReported': '未上报速率限制。',
|
||||
'header.services.usageRefreshFailedStale': '正在显示之前获取的用量数据。刷新失败:{error}',
|
||||
'header.services.remoteUpdate.title': '远程实例更新',
|
||||
'header.services.remoteUpdate.checking': '正在检查更新...',
|
||||
'header.services.remoteUpdate.upToDate': '此实例已是最新。',
|
||||
|
||||
@@ -1753,6 +1753,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'header.services.refreshRateLimitsAria': '重新整理速率限制',
|
||||
'header.services.noRateLimits': '沒有可用的速率限制。',
|
||||
'header.services.noRateLimitsReported': '未報告速率限制。',
|
||||
'header.services.usageRefreshFailedStale': '正在顯示先前取得的用量資料。重新整理失敗:{error}',
|
||||
'header.services.used': '已用',
|
||||
'header.services.remaining': '剩餘',
|
||||
'header.services.modelFamily.other': '其他',
|
||||
|
||||
Reference in New Issue
Block a user