/** * Ship SVG 아이콘을 미리 fetch하여 data URL로 캐시. * Deck.gl IconLayer가 매번 iconAtlas URL을 fetch하지 않도록 * 인라인 data URL을 전달한다. */ const SHIP_SVG_URL = '/assets/ship.svg'; let _cachedDataUrl: string | null = null; let _promise: Promise | null = null; function preloadShipIcon(): Promise { if (_cachedDataUrl) return Promise.resolve(_cachedDataUrl); if (_promise) return _promise; _promise = fetch(SHIP_SVG_URL) .then((res) => res.text()) .then((svg) => { _cachedDataUrl = `data:image/svg+xml;base64,${btoa(svg)}`; return _cachedDataUrl; }) .catch(() => SHIP_SVG_URL); return _promise; } /** 캐시된 data URL 또는 폴백 URL 반환 */ export function getCachedShipIcon(): string { return _cachedDataUrl ?? SHIP_SVG_URL; } // 모듈 임포트 시 즉시 로드 시작 preloadShipIcon();