Files
anvil-hosting/js/api.js
kappa 758266d8cb refactor: app.js를 ES6 모듈로 분리
## 변경사항
- app.js (1370줄) → 7개 모듈 (1427줄)
- ES6 import/export 문법 사용
- Alpine.js 호환성 유지 (window 전역 노출)

## 모듈 구조
- js/config.js: 상수/설정 (WIZARD_CONFIG, PRICING_DATA, MOCK_*)
- js/api.js: ApiService
- js/utils.js: formatPrice, switchTab, ping 시뮬레이션
- js/wizard.js: 서버 추천 마법사 로직
- js/pricing.js: 가격표 컴포넌트
- js/dashboard.js: 대시보드 및 텔레그램 연동
- js/app.js: 메인 통합 (모든 모듈 import)

## HTML 변경
- <script type="module" src="js/app.js">로 변경
- 기존 기능 모두 정상 작동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 12:59:54 +09:00

57 lines
1.4 KiB
JavaScript

/**
* API Service
* cloud-instances-api 워커 호출
*/
// API 설정 (프록시 사용 - /api/* 경로)
export const API_CONFIG = {
baseUrl: '/api', // Cloudflare Pages Functions 프록시 사용
apiKey: null, // 프록시에서 처리
timeout: 10000
};
/**
* API 서비스 객체
*/
export const ApiService = {
/**
* API 요청 헬퍼
*/
async request(endpoint, options = {}) {
const url = `${API_CONFIG.baseUrl}${endpoint}`;
const headers = {
'Content-Type': 'application/json',
...(API_CONFIG.apiKey && { 'X-API-Key': API_CONFIG.apiKey }),
...options.headers
};
try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), API_CONFIG.timeout);
const response = await fetch(url, {
...options,
headers,
signal: controller.signal
});
clearTimeout(timeoutId);
if (!response.ok) {
const error = await response.json().catch(() => ({ message: response.statusText }));
throw new Error(error.message || `HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
if (error.name === 'AbortError') {
throw new Error('요청 시간이 초과되었습니다.');
}
throw error;
}
}
// Removed: health(), getInstances(), recommend(), sync()
// These methods referenced deleted API functions (health.ts, instances.ts, recommend.ts)
};