import { updateVesselCache } from './vesselService.js'; import type { VesselPosition } from './vesselTypes.js'; const VESSEL_TRACK_API_URL = process.env.VESSEL_TRACK_API_URL ?? 'https://guide.gc-si.dev/signal-batch'; const POLL_INTERVAL_MS = 60_000; // 개별 쿠키 환경변수를 조합하여 Cookie 헤더 문자열 생성 function buildVesselCookie(): string { const entries: [string, string | undefined][] = [ ['apt.uid', process.env.VESSEL_COOKIE_APT_UID], ['g_state', process.env.VESSEL_COOKIE_G_STATE], ['gc_proxy_auth', process.env.VESSEL_COOKIE_GC_PROXY_AUTH], ['GC_SESSION', process.env.VESSEL_COOKIE_GC_SESSION], // 기존 단일 쿠키 변수 폴백 (레거시 지원) ]; const parts = entries .filter(([, v]) => v) .map(([k, v]) => `${k}=${v}`); // 기존 VESSEL_TRACK_COOKIE 폴백 (단일 문자열로 설정된 경우) if (parts.length === 0 && process.env.VESSEL_TRACK_COOKIE) { return process.env.VESSEL_TRACK_COOKIE; } return parts.join('; '); } // 한국 전 해역 고정 폴리곤 (124~132°E, 32~38°N) const KOREA_WATERS_POLYGON = [ [120, 31], [132, 31], [132, 41], [120, 41], [120, 31], ]; let intervalId: ReturnType | null = null; async function pollVesselSignals(): Promise { const url = `${VESSEL_TRACK_API_URL}/api/v1/vessels/recent-positions-detail`; const body = { minutes: 5, coordinates: KOREA_WATERS_POLYGON, polygonFilter: true, }; const cookie = buildVesselCookie(); const requestHeaders: Record = { 'Content-Type': 'application/json', ...(cookie ? { Cookie: cookie } : {}), }; try { const res = await fetch(url, { method: 'POST', headers: requestHeaders, body: JSON.stringify(body), signal: AbortSignal.timeout(30_000), }); if (!res.ok) { const text = await res.text().catch(() => ''); console.error(`[vesselScheduler] 선박 신호 API 오류: ${res.status}`, text.substring(0, 200)); return; } const contentType = res.headers.get('content-type') ?? ''; if (!contentType.includes('application/json')) { const text = await res.text().catch(() => ''); console.error('[vesselScheduler] 선박 신호 API가 JSON이 아닌 응답 반환:', text); return; } const data = (await res.json()) as VesselPosition[]; updateVesselCache(data); } catch (err) { console.error('[vesselScheduler] 선박 신호 폴링 실패:', err); } } export function startVesselScheduler(): void { if (intervalId !== null) return; // 서버 시작 시 즉시 1회 실행 후 주기적 폴링 pollVesselSignals(); intervalId = setInterval(pollVesselSignals, POLL_INTERVAL_MS); console.log('[vesselScheduler] 선박 신호 스케줄러 시작 (1분 간격)'); } export function stopVesselScheduler(): void { if (intervalId !== null) { clearInterval(intervalId); intervalId = null; console.log('[vesselScheduler] 선박 신호 스케줄러 중지'); } }