import { supabase } from '@/lib/supabase'; /** * CORS 문제 확인 */ export const hasCorsIssue = (error: any): boolean => { if (!error) return false; const errorMessage = error.message || ''; return ( errorMessage.includes('Failed to fetch') || errorMessage.includes('CORS') || errorMessage.includes('Network') || errorMessage.includes('프록시') ); }; /** * Supabase 연결 상태 확인 */ export const checkSupabaseConnection = async (): Promise => { try { const { data, error } = await supabase.auth.getSession(); // 오류가 없으면 연결 성공 if (!error) { return true; } // 오류 메시지 확인 if (error.message && ( error.message.includes('Failed to fetch') || error.message.includes('Network') || error.message.includes('CORS') )) { return false; } // 다른 오류는 연결은 됐지만 세션/인증 관련 오류이므로 연결은 성공 return true; } catch (err) { console.error('Supabase 연결 확인 중 오류:', err); return false; } }; /** * 서버 연결 상태 검사 */ export const verifyServerConnection = async (): Promise<{ connected: boolean; message: string; statusCode?: number; }> => { try { const start = Date.now(); // Supabase URL 가져오기 const supabaseUrl = supabase.auth.url; // 단순 헬스 체크 요청 try { const response = await fetch(`${supabaseUrl}/`, { method: 'GET', headers: { 'Content-Type': 'application/json' }, // 연결 확인만을 위한 요청이므로 짧은 타임아웃 설정 signal: AbortSignal.timeout(3000) }); const elapsed = Date.now() - start; // 200, 401, 404 응답도 서버가 살아있다는 신호로 간주 if (response.ok || response.status === 401 || response.status === 404) { return { connected: true, message: `서버 연결 성공 (응답 시간: ${elapsed}ms)`, statusCode: response.status }; } else { return { connected: false, message: `서버 응답 오류: ${response.status} ${response.statusText}`, statusCode: response.status }; } } catch (fetchError: any) { console.error('기본 연결 확인 실패, 대체 경로 시도:', fetchError); // 대체 경로로 재시도 try { const altResponse = await fetch(`${supabaseUrl}/auth/v1/`, { method: 'GET', headers: { 'Content-Type': 'application/json' }, signal: AbortSignal.timeout(3000) }); // 어떤 응답이라도 오면 서버가 살아있다고 간주 const elapsed = Date.now() - start; return { connected: true, message: `서버 연결 성공 (대체 경로, 응답 시간: ${elapsed}ms)`, statusCode: altResponse.status }; } catch (altError) { // 두 가지 경로 모두 실패 console.error('대체 경로 확인도 실패:', altError); throw fetchError; // 원래 에러를 던짐 } } } catch (error: any) { console.error('서버 연결 확인 중 오류:', error); // 오류 유형에 따른 메시지 설정 let errorMessage = '알 수 없는 네트워크 오류'; if (error.message) { if (error.message.includes('Failed to fetch')) { errorMessage = 'CORS 정책 오류 또는 서버 연결 실패'; } else if (error.message.includes('NetworkError')) { errorMessage = '네트워크 연결 실패'; } else if (error.message.includes('TypeError')) { errorMessage = '네트워크 요청 형식 오류'; } else if (error.message.includes('timeout')) { errorMessage = '서버 응답 시간 초과'; } else if (error.message.includes('aborted')) { errorMessage = '요청이 중단됨'; } else { errorMessage = error.message; } } return { connected: false, message: errorMessage }; } };