Skip to content

TypeScript 지원 ​

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

타입 정의 파일 ​

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

대응 SDK 버전

아래 타입 정의는 SDK 2.0.0 기준입니다. 사용 중인 SDK 버전을 올린 뒤에는 각 API 문서와 대조하여 타입 정의를 다시 확인하세요.

typescript
/** Klleon SDK 2.0.0 기준 타입 정의 */

/** SDK 연결 상태 */
type SDKStatus =
  | "IDLE"
  | "CONNECTING"
  | "SOCKET_CONNECTED"
  | "STREAMING_CONNECTED"
  | "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;
}

/** speak() 옵션 */
interface SpeakOption {
  text: string;
}

/** 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: (option: string | SpeakOption) => void;

  // 오디오 립싱크 전송
  sendSpeakAudio: (audio: string, sample_rate?: number) => 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 사용 시 타입 에러 방지 (React 18/19 모두 동작)
declare module "react" {
  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;
          // false를 지정하면 글자 수 카운터가 숨겨집니다.
          isShowCount?: boolean;
          // 스크롤바를 숨기려면 값을 넘기지 말고 prop 자체를 생략하세요.
          // HTML 속성으로 전달되면 "false"도 true로 해석됩니다.
          scrollbar?: boolean;
        },
        HTMLElement
      >;
    }
  }
}

export type {
  SDKStatus,
  LogLevel,
  LanguageCode,
  InitOption,
  SpeakOption,
  IncomingSignalData,
  ErrorData,
  KlleonSDK,
};

isShowCount, scrollbar의 boolean 해석 규칙은 chat-container 문서의 "boolean 속성 지정 방법"을 참고하세요.

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));