From 96bda2de3918bb8b4e47c1d21b702c35a72e2650 Mon Sep 17 00:00:00 2001 From: hansoo Date: Fri, 21 Mar 2025 16:32:36 +0900 Subject: [PATCH] =?UTF-8?q?=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC=20?= =?UTF-8?q?=EB=81=8A=EA=B9=80=20=EC=95=8C=EB=9E=8C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/networkUtils.ts | 55 +++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/utils/networkUtils.ts b/src/utils/networkUtils.ts index a546125..5e450fb 100644 --- a/src/utils/networkUtils.ts +++ b/src/utils/networkUtils.ts @@ -43,23 +43,34 @@ interface ExtendedWindow extends Window { __networkHandlers?: NetworkEventHandlers; } +// 메모리에 네트워크 상태 저장 +let networkStatus: NetworkStatus | null = null; + /** - * 현재 네트워크 상태 확인 + * 현재 네트워크 상태 확인 (개선 버전) */ export const checkNetworkStatus = async (): Promise => { try { - // 간단한 네트워크 연결 테스트 + // 더 빠른 타임아웃 설정 (2초) const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 5000); // 5초 타임아웃 + const timeoutId = setTimeout(() => controller.abort(), 2000); - const response = await fetch('https://www.google.com', { - method: 'HEAD', - signal: controller.signal - }); + // 여러 엔드포인트로 확인하여 신뢰성 향상 + const endpoints = [ + 'https://www.google.com', + 'https://www.cloudflare.com', + 'https://www.apple.com' + ]; + + // 첫 번째 성공 응답 시 온라인으로 판단 + const isOnline = await Promise.any( + endpoints.map(url => + fetch(url, { method: 'HEAD', signal: controller.signal }) + .then(res => res.ok) + ) + ); clearTimeout(timeoutId); - - const isOnline = response.ok; setNetworkStatus(isOnline ? 'online' : 'offline'); return isOnline; } catch (error) { @@ -70,30 +81,22 @@ export const checkNetworkStatus = async (): Promise => { }; /** - * 네트워크 상태 저장 + * 네트워크 상태 저장 (메모리 기반) */ export const setNetworkStatus = (status: NetworkStatus): void => { - try { - localStorage.setItem(NETWORK_STATUS_KEY, status); - // 상태 변경 이벤트 발생 - window.dispatchEvent(new CustomEvent('networkStatusChange', { detail: status })); - console.log(`[네트워크] 상태 변경: ${status}`); - } catch (error) { - console.error('[네트워크] 상태 저장 실패:', error); - } + // 메모리에 상태 저장 + networkStatus = status; + + // 상태 변경 이벤트 발생 + window.dispatchEvent(new CustomEvent('networkStatusChange', { detail: status })); + console.log(`[네트워크] 상태 변경: ${status}`); }; /** - * 저장된 네트워크 상태 가져오기 + * 네트워크 상태 가져오기 (메모리 기반) */ export const getNetworkStatus = (): NetworkStatus => { - try { - const status = localStorage.getItem(NETWORK_STATUS_KEY) as NetworkStatus; - return status || 'online'; // 기본값은 온라인으로 설정 - } catch (error) { - console.error('[네트워크] 상태 조회 실패:', error); - return 'online'; // 오류 시 기본값 - } + return networkStatus || 'online'; }; /**