import type { KisRuntimeCredentials } from "@/features/settings/store/use-kis-runtime-store"; import { DOMESTIC_KIS_SESSION_OVERRIDE_HEADER, DOMESTIC_KIS_SESSION_OVERRIDE_STORAGE_KEY, parseDomesticKisSession, } from "@/lib/kis/domestic-market-session"; export interface KisApiErrorPayload { ok?: boolean; message?: string; error?: string; errorCode?: string; } interface BuildKisRequestHeadersOptions { jsonContentType?: boolean; includeAccountNo?: boolean; includeSessionOverride?: boolean; } /** * @description KIS API 응답에서 사용자 노출용 에러 메시지를 추출합니다. * @see features/trade/apis/kis-stock.api.ts 종목/주문 API 실패 처리 * @see features/dashboard/apis/dashboard.api.ts 대시보드 API 실패 처리 */ export function resolveKisApiErrorMessage( payload: unknown, fallbackMessage: string, ) { if (!payload || typeof payload !== "object") { return fallbackMessage; } const response = payload as KisApiErrorPayload; return response.message || response.error || fallbackMessage; } /** * @description KIS API 호출용 공통 헤더를 생성합니다. * @see features/dashboard/apis/dashboard.api.ts 잔고/지수/활동 조회 공통 헤더 * @see features/trade/apis/kis-stock.api.ts 종목/호가/차트/주문 공통 헤더 */ export function buildKisRequestHeaders( credentials: KisRuntimeCredentials, options?: BuildKisRequestHeadersOptions, ) { const headers: Record = { "x-kis-app-key": credentials.appKey, "x-kis-app-secret": credentials.appSecret, "x-kis-trading-env": credentials.tradingEnv, }; if (options?.jsonContentType) { headers["content-type"] = "application/json"; } if (options?.includeAccountNo && credentials.accountNo.trim()) { headers["x-kis-account-no"] = credentials.accountNo.trim(); } if (options?.includeSessionOverride) { const sessionOverride = readSessionOverrideForDev(); if (sessionOverride) { headers[DOMESTIC_KIS_SESSION_OVERRIDE_HEADER] = sessionOverride; } } return headers; } function readSessionOverrideForDev() { if (typeof window === "undefined") return null; try { const raw = window.localStorage.getItem( DOMESTIC_KIS_SESSION_OVERRIDE_STORAGE_KEY, ); return parseDomesticKisSession(raw); } catch { return null; } }