Skip to content

TypeScript 지원

Klleon SDK는 UMD 번들로 제공되므로 TypeScript 프로젝트에서 사용하려면 타입 정의 파일을 추가해야 합니다.

타입 정의 파일

프로젝트 루트에 KlleonSDK.d.ts 파일을 생성합니다.

typescript
/** SDK 연결 상태 */
type SDKStatus =
  | "IDLE"
  | "CONNECTING"
  | "CONNECTING_FAILED"
  | "SOCKET_CONNECTED"
  | "SOCKET_FAILED"
  | "STREAMING_CONNECTED"
  | "STREAMING_FAILED"
  | "CONNECTED_FINISH";

type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
type LanguageCode = "ko_kr" | "en_us" | "ja_jp" | "id_id";

/** init() 옵션 */
interface InitOption {
  sdk_key: string;
  avatar_id: string;
  log_level?: LogLevel;
  language?: LanguageCode;
  enable_microphone?: boolean;
  auto_send?: boolean;
  stt_only?: boolean;
}

/** onSignal 콜백 파라미터 */
interface IncomingSignalData {
  signal: string;
  payload?: Record<string, unknown>;
  id: string;
  type: "SESSION" | "INPUT" | "OUTPUT";
}

/** onError 콜백 파라미터 */
interface ErrorData {
  code: string;
  message?: string;
}

/** SDK 인터페이스 */
interface KlleonSDK {
  // 생명주기
  init: (option: InitOption) => Promise<void>;
  destroy: () => Promise<void>;
  // 이벤트
  onSignal: (cb: (data: IncomingSignalData) => void) => void;
  onStatus: (cb: (status: SDKStatus) => void) => void;
  onError: (cb: (error: ErrorData) => void) => void;

  // 텍스트
  sendMessage: (text: string) => void;
  speak: (text: string) => void;

  // 오디오 에코
  sendSpeakAudio: (audio: string) => void;
  endSpeakAudio: () => void;

  // 음성
  startListening: () => void;
  endListening: () => void;
  cancelListening: () => void;

  // 아바타 제어
  stopSpeaking: () => void;

  // 미디어
  setVolume: (volume: number) => void;

  // 상태 조회
  getStatus: () => SDKStatus;
  clearMessages: () => void;
}

declare global {
  interface Window {
    KlleonSDK: KlleonSDK;
  }

  // React에서 Web Component 사용 시 타입 에러 방지
  namespace JSX {
    interface IntrinsicElements {
      "avatar-container": React.DetailedHTMLProps<
        React.HTMLAttributes<HTMLElement> & {
          volume?: number;
          fit?: "cover" | "contain" | "fill";
        },
        HTMLElement
      >;
      "chat-container": React.DetailedHTMLProps<
        React.HTMLAttributes<HTMLElement> & {
          type?: "text" | "voice";
          delay?: number;
          isShowCount?: boolean;
          scrollbar?: boolean;
        },
        HTMLElement
      >;
    }
  }
}

export {};

tsconfig.json 설정

타입 정의 파일을 TypeScript가 인식하도록 include에 추가합니다.

json
{
  "compilerOptions": {
    "jsx": "react-jsx"
  },
  "include": ["src", "KlleonSDK.d.ts"]
}

사용 예시

타입 정의를 추가하면 window.KlleonSDK에 대한 자동 완성과 타입 검사가 동작합니다.

tsx
const SDK = window.KlleonSDK;

SDK.onStatus((status) => console.log(status));
SDK.onSignal((data) => console.log(data.signal, data.payload));

SDK.init({
  sdk_key: 'YOUR_SDK_KEY',
  avatar_id: 'YOUR_AVATAR_ID',
}).catch((e) => console.error(e.message));