// Live data adapter for the auto_coin terminal. // // 디자인 원본은 mock TICKERS / STRATEGIES / ORDERS_SEED / AUDIT_SEED 를 export 했지만, // 운영 환경에서는 백엔드(/api/terminal/snapshot)가 실제 봇 상태를 돌려준다. // 여기서는 포맷 헬퍼와 fetch 래퍼, 그리고 컴포넌트가 참조하는 전역 컨테이너만 노출한다. // 전역(TICKERS, STRATEGIES, ORDERS_SEED, AUDIT_SEED)은 useBotState 폴링이 매번 갱신한다. const krw = (n) => Number(n || 0).toLocaleString('en-US', { maximumFractionDigits: 0 }); const krwSigned = (n) => { const v = Number(n || 0); return (v >= 0 ? '+' : '') + v.toLocaleString('en-US', { maximumFractionDigits: 0 }); }; const pct = (n, digits = 2) => { const v = Number(n || 0); return (v >= 0 ? '+' : '') + v.toFixed(digits) + '%'; }; const fmtPx = (n) => { const v = Number(n || 0); if (v >= 1_000) return v.toLocaleString('en-US', { maximumFractionDigits: 0 }); if (v >= 1) return v.toLocaleString('en-US', { maximumFractionDigits: 1 }); return v.toLocaleString('en-US', { maximumFractionDigits: 4 }); }; const sigQty = (n) => { const v = Number(n || 0); if (v === 0) return '—'; if (v < 0.01) return v.toFixed(5); if (v < 1) return v.toFixed(4); if (v < 100) return v.toFixed(3); return v.toFixed(2); }; // 디자인이 globals 로 참조하는 컨테이너 — 폴링이 매 사이클 덮어씀. window.TICKERS = []; window.STRATEGIES = []; window.ORDERS_SEED = []; window.AUDIT_SEED = []; window.WEBHOOKS_SEED = []; const AC_CONFIG = window.AC_CONFIG || { csrfToken: '', pollIntervalMs: 5000, snapshotUrl: '/api/terminal/snapshot', controlUrl: '/api/terminal/control', }; async function apiGet(path) { const res = await fetch(path, { credentials: 'same-origin' }); if (!res.ok) throw new Error(`GET ${path} → ${res.status}`); return res.json(); } async function apiPost(path, body) { const res = await fetch(path, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': AC_CONFIG.csrfToken || '', }, body: JSON.stringify(body || {}), }); if (!res.ok) { let detail = ''; try { detail = (await res.json()).detail || ''; } catch (_) { /* empty */ } throw new Error(`POST ${path} → ${res.status} ${detail}`); } return res.json(); } Object.assign(window, { AC_CONFIG, apiGet, apiPost, krw, krwSigned, pct, fmtPx, sigQty, });