Files
auto-trade/features/settings/apis/kis-api-utils.ts

83 lines
2.3 KiB
TypeScript
Raw Normal View History

2026-02-26 09:05:17 +09:00
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<string, string> = {
"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;
}
}