fix: handle ERR_NETWORK_CHANGED from Docker network changes

- Add retry logic for transient network errors in API client
- Retry up to 2 times with exponential backoff on network errors
- Reduce session polling from 10s to 30s to decrease error frequency
- Handle 502/503/504 gateway errors with retries as well
This commit is contained in:
Fusion
2026-05-24 21:29:16 +02:00
parent 8da527f964
commit 3fc392a314
2 changed files with 28 additions and 3 deletions
+26 -1
View File
@@ -14,13 +14,38 @@ export const shouldSkipAuthRedirect = (path: string): boolean => {
return path.startsWith("/login") || path.startsWith("/auth");
};
// Retry config for transient network errors
const MAX_RETRIES = 2;
const RETRY_DELAY_MS = 1000;
// Track retry count per request
const retryCount = new WeakMap<any, number>();
apiClient.interceptors.response.use(
(response) => response,
(error) => {
async (error) => {
const status = error?.response?.status;
if (status === 401 && !shouldSkipAuthRedirect(window.location.pathname)) {
window.location.assign(`${BASE_URL}/auth/login`);
return Promise.reject(error);
}
// Retry on transient network errors (ERR_NETWORK_CHANGED, etc.)
const isNetworkError = !error.response && error.message?.includes("Network");
const isRetryable = isNetworkError || status >= 502; // 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout
if (isRetryable) {
const config = error.config;
const currentRetry = retryCount.get(config) || 0;
if (currentRetry < MAX_RETRIES) {
retryCount.set(config, currentRetry + 1);
// Wait before retrying
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS * (currentRetry + 1)));
return apiClient(config);
}
}
return Promise.reject(error);
}
);