/**
 * 오류 객체입니다.
 * [오류 코드 페이지](https://vchatcloud.com/doc/javascript/chatting/errorCodeDefinition.html)를 참조하세요.
 */
export interface VChatCloudError {
    code: number;
    message: string;
}
/**
 * 과거 채팅 내역 데이터입니다.
 *
 * 기록이 내림차순(역순)으로 나타나므로 주의하세요.
 */
export interface MessageHistory {
    logType: string;
    roomId: string;
    clientKey: string;
    message: string;
    mimeType: ChannelMimeType;
    messageType: any;
    nickName: string;
    date: string;
    grade: ChannelUserGrade;
    userInfo: any;
}
export declare class VChatCloud {
    /**
     * 접속한 `roomId`별로 채널을 관리합니다.
     */
    channels: Record<string, Channel>;
    /**
     * 현재 접속한 유저의 고유 키 입니다.
     */
    clientKey: string;
    /**
     * 채팅 서버와의 연결을 초기화합니다.
     */
    constructor(param?: {
        /**
         * 채팅 서버 URL입니다. (솔루션을 사용할 때만 작성하세요.)
         */
        url?: string;
        /**
         * CMS에서 사용하는 유저 이메일을 작성합니다.
         *
         * 개인 비밀채팅방을 생성하는 `openChannel` 기능을 사용하려면 필수로 등록하여야 합니다.
         */
        serviceId?: string;
    });
    /**
     * 채팅방에 접속합니다.
     *
     * @param param 채팅에 접속 할 데이터입니다.
     * @param callback 접속 시 실행되는 콜백입니다.
     */
    joinChannel<T = Record<string, never>>(param: User, callback?: (
    /**
     * `error`는 오류 객체로 `null`이 아니면 오류가 발생 한 것입니다.
     */
    error: VChatCloudError | null, 
    /**
     * 접속에 성공할 경우 `history`에 최근 20개의 과거 채팅내역 데이터를 가져옵니다.
     */
    history?: MessageHistory[]) => void): Channel<T>;
    /**
     * **새로운 채팅방**을 생성합니다.
     *
     * 새 채팅방을 생성하기 위해서는 먼저 CMS에서 생성한 채팅방 중
     * 임의의 채팅방에 접속해있어야 한다.
     *
     * @param param 채팅에 접속 할 데이터입니다.
     * @param callback 접속 시 실행되는 콜백입니다.
     */
    openChannel(param: {
        /**
         * 채팅방의 고유 키 입니다. 기존의 `channelKey`가 아닌 새로운 값을 사용해야 합니다.
         */
        roomId: string;
        /**
         * 채팅방을 생성할 사용자의 고유 키 입니다.
         * 기존 채팅방에 접속한 유저의 `clientKey`여야 합니다.
         */
        clientKey: string;
    }, callback?: (
    /**
     * `error`는 오류 객체로 `null`이 아니면 오류가 발생 한 것입니다.
     */
    error: VChatCloudError | null, result: boolean) => void): void;
    /**
     * `VChatCloud.openChannel`로 생성한 **새로운 채팅방**을 퇴장하고 종료합니다.
     *
     * `data.clientKey`에 채널을 생성한 유저의 `clientKey`를 설정해야 합니다.
     *
     * @param param 퇴장 할 채팅방의 데이터입니다.
     * @param callback 퇴장 후 실행되는 콜백입니다.
     */
    closeChannel(param: {
        /**
         * 채팅방의 고유 키 입니다. `channelKey`와 같은 값입니다.
         */
        roomId: string;
        /**
         * 퇴장 할 사용자의 고유 키 입니다.
         */
        clientKey: string;
    }, callback?: (
    /**
     * `error`는 오류 객체로 `null`이 아니면 오류가 발생 한 것입니다.
     */
    error: VChatCloudError | null, result: boolean) => void): void;
    /**
     * 채팅 서버와의 연결을 종료합니다.
     *
     * 주로 접속 시도 중 실패하거나, 서버와 연결을 종료할 때 실행합니다.
     *
     * @param callback 연결 종료 시 실행 될 콜백입니다.
     */
    disconnect(
    /**
     * `error`가 `null`이 아닐 경우 접속 종료 중 오류가 발생한 것 입니다.
     */
    callback?: (error: VChatCloudError | null) => void): void;
}
/**
 * 채팅 유저 등급입니다.
 *
 * - `user`: 일반유저
 * - `userManager`: 채팅방 매니저
 * - `userMute`: 글쓰기 제한 유저
 * - `manager`: 관리자
 */
export type ChannelUserGrade = "user" | "userManager" | "userMute" | "manager";
/**
 * 채팅 데이터의 마임 타입입니다.
 *
 * - `text`: 문자열 데이터
 * - `emoji_img`: 이모티콘 데이터
 * - `file`: 파일 정보 JSON 데이터
 */
export type ChannelMimeType = "text" | "emoji_img" | "file";
/**
 * 채팅 이벤트에서 받을 수 있는 이벤트 데이터입니다.
 */
export interface Message {
    /**
     * 	채팅 유저의 닉네입입니다.
     */
    nickName: string;
    /**
     * 	채팅방의 고유한 `roomId`(=`channelKey`)입니다.
     */
    roomId: string;
    /**
     * 	채팅 유저의 고유 키 입니다.
     */
    clientKey: string;
    /**
     * 귓속말 사용 시 상대방의 고유 키 입니다.
     */
    receivedClientKey?: string;
    /**
     * 	전송한 메시지 내용입니다.
     */
    message: string;
    /**
     * 	전송한 메시지의 마임 타입입니다.
     */
    mimeType: ChannelMimeType;
    /**
     * 	메시지를 전송한 날짜입니다.
     */
    messageDt: string;
    /**
     * 	채팅방에서 메시지를 전송한 숫자입니다.
     */
    messageCount: string;
    /**
     * 	메시지를 전송한 유저의 등급입니다.
     */
    grade: ChannelUserGrade;
    /**
     * 접속한 유저의 정보로, 보통 JSON형태를 사용합니다.
     *
     * 필요한 데이터를 추가로 저장할 수 있습니다.
     */
    userInfo: any;
}
/**
 * 유저 객체입니다.
 */
export interface User {
    /**
     * 접속한 채팅방의 `roomId`(=`channelKey`)입니다.
     */
    roomId: string;
    /**
     * 	유저의 고유 키 입니다.
     */
    clientKey: string;
    /**
     * 	유저의 닉네입입니다.
     */
    nickName: string;
    /**
     * 	유저의 등급입니다.
     */
    grade?: ChannelUserGrade;
    /**
     * 유저의 정보로, 보통 JSON형태를 사용합니다.
     *
     * 필요한 데이터를 추가로 저장할 수 있습니다.
     */
    userInfo?: any;
}
/**
 * 스트림 데이터가 추가될 때 발생합니다.
 */
export interface StreamAppendEvent {
    client: {
        clientKey: string;
        grade: ChannelUserGrade;
        nickName: string;
    };
    clientKey: string;
    target: MediaStream;
    type: "rtcLocalStreamAppend" | "rtcRemoteStreamAppend";
}
/**
 * 스트림 데이터가 제거될 때 발생합니다.
 */
export interface StreamRemoveEvent {
    client: undefined;
    clientKey: string;
    target: null;
    type: "rtcLocalStreamRemove" | "rtcRemoteStreamRemove";
}
/**
 * 스트림 데이터가 변경될 때 발생합니다.
 *
 * 사용자가 카메라를 On/Off하거나, 마이크를 On/Off할 때 발생합니다.
 */
export interface StreamChangeEvent {
    clientKey: string;
    enable: boolean;
    share: boolean;
    stream: MediaStream;
    target: MediaStreamTrack;
    type: "rtcLocalAudioChanged" | "rtcRemoteAudioChanged" | "rtcLocalVideoChanged" | "rtcRemoteVideoChanged";
}
/**
 * WebRTC 이벤트 처리 함수 정의
 */
export interface WebRTCDefaultEventMap {
    rtcLocalStreamAppend: (event: StreamAppendEvent) => void;
    rtcRemoteStreamAppend: (event: StreamAppendEvent) => void;
    rtcLocalStreamRemove: (event: StreamRemoveEvent) => void;
    rtcRemoteStreamRemove: (event: StreamRemoveEvent) => void;
    rtcLocalAudioChanged: (event: StreamChangeEvent) => void;
    rtcLocalVideoChanged: (event: StreamChangeEvent) => void;
    rtcRemoteAudioChanged: (event: StreamChangeEvent) => void;
    rtcRemoteVideoChanged: (event: StreamChangeEvent) => void;
}
/**
 * 메시지를 보내거나, 받은 메시지의 이벤트를 처리할 수 있는 객체입니다.
 */
export declare class Channel<ChannelEventMap = Record<string, never>, DefaultEventMap = WebRTCDefaultEventMap> extends Object {
    nickName: string;
    roomId: string;
    roomName: string;
    clientKey: string;
    grade: ChannelUserGrade;
    resultCode: number;
    /**
     * 접속한 유저 목록입니다.
     *
     * Record<userClientKey: User>형태로 구성되어 있습니다.
     */
    users: Record<string, User>;
    private constructor();
    /**
     * 채팅방에 메시지를 전송합니다.
     *
     * @param data 전송할 메시지 데이터입니다.
     * @param callback 전송 후 실행될 콜백입니다.
     */
    sendMessage(data: {
        /**
         * 전송할 데이터를 입력합니다.
         */
        message: string;
        /**
         * 전송할 데이터의 `mimeType`을 작성합니다.
         *
         * @default 'text'
         */
        mimeType?: ChannelMimeType;
    }, callback?: (
    /**
     * 오류가 발생하지 않으면 null이 전달됩니다.
     */
    err: VChatCloudError | null) => void): void;
    /**
     * 채팅방에서 특정 유저에게 귓속말을 전송합니다.
     *
     * 귓속말을 전송하면 `data.receivedClientKey`에 지정한 상대방에게만 귓속말 이벤트가 전송됩니다.
     *
     * @param data 전송할 메시지 데이터입니다.
     * @param callback 전송 후 실행될 콜백입니다.
     */
    sendWhisper(data: {
        /**
         * 전송할 데이터를 입력합니다.
         */
        message: string;
        /**
         * 전송할 데이터의 `mimeType`을 작성합니다.
         *
         * @default 'text'
         */
        mimeType?: ChannelMimeType;
        /**
         * 귓속말 수신 유저의 고유 키 (`clientKey`)
         */
        receivedClientKey: string;
    }, 
    /**
     * 오류가 발생하지 않으면 null이 전달됩니다.
     */
    callback?: (err: VChatCloudError | null) => void): void;
    /**
     * [CustomEvent](https://vchatcloud.com/doc/javascript/chatting/customMessage.html#%E1%84%8F%E1%85%A5%E1%84%89%E1%85%B3%E1%84%90%E1%85%A5%E1%86%B7-%E1%84%86%E1%85%A6%E1%84%89%E1%85%A6%E1%84%8C%E1%85%B5-%E1%84%8C%E1%85%A1%E1%86%A8%E1%84%89%E1%85%A5%E1%86%BC%E1%84%87%E1%85%A1%E1%86%BC%E1%84%87%E1%85%A5%E1%86%B8)를 전송합니다.
     *
     * 해당 기능을 이용해서 다양한 기능을 구현할 수 있습니다.
     *
     * 예를 들어 JSON형식의 데이터를 문자열로 변환하여 보낸 뒤
     * `onNotifyCustom`에서 받은 데이터를 JSON으로 역직렬화하여
     * 원하는 함수를 실행하는 방법 등 으로 사용하실 수 있습니다.
     *
     *
     * @param data 커스텀 이벤트 데이터를 작성합니다.
     * @param callback 커스텀 이벤트 전송 후 실행될 콜백입니다.
     */
    sendCustom(data: {
        message: string;
    }, callback?: (err: VChatCloudError | null) => void): void;
    /**
     * 기존 채팅방에 접속해있는 유저를 **새로운 채팅방**에 초대합니다.
     *
     * @param data 초대 할 채팅방과 상대방의 정보입니다.
     * @param callback 초대 후 실행될 콜백입니다.
     */
    sendInvite(data: {
        /**
         * 새로 생성한 채팅방의 `roomId`(=`channelKey`)입니다.
         */
        roomId: string;
        /**
         * 초대할 사용자의 `clientKey`입니다.
         */
        clientKey: string;
    }, callback?: (err: VChatCloudError | null, res: boolean) => void): void;
    /**
     * 공지사항을 채팅방에 전송합니다.
     *
     * @param data
     * @param callback
     */
    sendNotice(data: {
        /**
         * 전송할 데이터를 입력합니다.
         */
        message: string;
        /**
         * 전송할 데이터의 `mimeType`을 작성합니다.
         *
         * @default 'text'
         */
        mimeType?: ChannelMimeType;
    }, callback?: (err: VChatCloudError | null) => void): void;
    /**
     * 접속중인 채팅방에서 퇴장합니다.
     *
     * @param callback 퇴장 후 실행될 콜백입니다.
     */
    leave(callback?: () => void): void;
    /**
     * 채널에 접속한 유저 목록을 조회합니다.
     *
     * @param callback 유저 목록 조회 후 실행 될 콜백입니다.
     */
    getAllUserList(callback?: (err: VChatCloudError | null, users: User[]) => void): void;
    /**
     * 선택한 유저를 입장 제한시킵니다.
     *
     * @param data 입장 제한할 유저의 `clientKey`를 작성합니다.
     * @param callback 입장 제한 후 실행 될 콜백입니다.
     */
    kickUser(data: {
        clientKey: string;
    }, callback?: (err: VChatCloudError | null) => void): void;
    /**
     * 선택한 유저를 채팅 제한 시킵니다.
     *
     * @param data 채팅 제한할 유저의 `clientKey`를 입력합니다.
     * @param callback 채팅 제한 후 실행 될 콜백입니다.
     */
    muteUser(data: {
        clientKey: string;
    }, callback?: (err: VChatCloudError | null) => void): void;
    /**
     * 선택한 유저의 입장 제한을 해제합니다.
     *
     * @param data 입장 제한을 해제할 유저의 `clientKey`를 작성합니다.
     * @param callback 입장 제한 해제 후 실행 될 콜백입니다.
     */
    unkickUser(data: {
        clientKey: string;
    }, callback?: (err: VChatCloudError | null) => void): void;
    /**
     * 선택한 유저의 채팅 제한을 해제합니다.
     *
     * @param data 채팅 제한을 해제할 유저의 `clientKey`를 작성합니다.
     * @param callback 채팅 제한 해제 후 실행 될 콜백입니다.
     */
    unmuteUser(data: {
        clientKey: string;
    }, callback?: (err: VChatCloudError | null) => void): void;
    /**
     * 채널 연결이 종료될 때 실행됩니다.
     */
    onDisconnected: () => void;
    /**
     * 채팅방에 유저가 새로 접속할 때 전달됩니다.
     */
    onNotifyJoinUser: (event: Message) => void;
    /**
     * 채팅방에 접속 해 있는 유저가 퇴장할 때 전달됩니다.
     */
    onNotifyLeaveUser: (event: Message) => void;
    /**
     * 새로운 메시지를 받았을 때 전달됩니다.
     */
    onNotifyMessage: (event: Message) => void;
    /**
     * 새로운 공지사항을 받았을 떄 전달됩니다.
     */
    onNotifyNotice: (event: Message) => void;
    /**
     * 유저가 입장 제한될 때 전달됩니다.
     */
    onNotifyKickUser: (event: Message) => void;
    /**
     * 유저의 입장 제한이 해제될 때 전달됩니다.
     */
    onNotifyUnkickUser: (event: Message) => void;
    /**
     * 유저가 채팅 제한될 때 전달됩니다.
     */
    onNotifyMuteUser: (event: Message) => void;
    /**
     * 유저의 채팅 제한이 해제될 때 전달됩니다.
     */
    onNotifyUnmuteUser: (event: Message) => void;
    /**
     * 커스텀 이벤트를 수신 할 때 전달됩니다.
     */
    onNotifyCustom: (event: Message) => void;
    /**
     * 귓속말을 받은 유저에게 전달됩니다.
     */
    onPersonalWhisper: (event: Message) => void;
    /**
     * **서브 채팅방**에 초대 된 유저에게 전달됩니다.
     * 일반적으로 `{channel key}-{Date.now()}_{invite user client key}`형식으로 구성되어 있습니다.
     */
    onPersonalInvite: (event: Pick<Message, "roomId">) => void;
    /**
     * 입장 제한당한 유저에게 전달됩니다.
     *
     * 해당 유저는 채팅방의 연결이 종료되고, 입장 제한이 해제 되기 전까지
     * 다시 입장할 수 없습니다.
     */
    onPersonalKickUser: (event: Message) => void;
    /**
     * 채팅 제한당한 유저에게 전달됩니다.
     */
    onPersonalMuteUser: (event: Message) => void;
    /**
     * 채팅 제한이 해제 된 유저에게 전달됩니다.
     */
    onPersonalUnmuteUser: (event: Message) => void;
    /**
     * 로그인할 때 `clientKey`가 중복으로 이루어질경우
     * 기존 (`clientKey`가 같은)사용자에게 전달됩니다.
     */
    onPersonalDuplicateUser: (event: Message) => void;
    /**
     * 자신의 영상 소스를 Video 태그에 설정합니다.
     *
     * `HTMLVideoElement.srcObject`에 `MediaStream`을 설정하고,
     * 음소거를 해제합니다.
     *
     * @param video srcObject를 설정할 HTMLVideoElement
     */
    setRTCLocalMedia(video: HTMLVideoElement): void;
    /**
     * 참가자의 영상 소스를 Video 태그에 설정합니다.
     *
     * `HTMLVideoElement.srcObject`에 `MediaStream`을 설정하고,
     * 음소거를 해제합니다.
     *
     * @param video srcObject를 설정할 HTMLVideoElement
     * @param clientKey 참가자의 `clientKey`
     */
    setRTCRemoteMedia(video: HTMLVideoElement, clientKey: string): void;
    /**
     * 자신의 오디오 입력을 토글합니다.
     *
     * @param on `true`를 설정하면 켭니다. `false`를 설정하면 끕니다. 미설정 시 토글됩니다.
     */
    toggleRTCAudioControl(on?: boolean): void;
    /**
     * 자신의 비디오 입력을 토글합니다.
     *
     * @param on `true`를 설정하면 켭니다. `false`를 설정하면 끕니다. 미설정 시 토글됩니다.
     */
    toggleRTCVideoControl(on?: boolean): void;
    /**
     * 자신의 영상 입력(카메라 <=> 화면공유)을 변경합니다.
     *
     * @param callback 영상 입력 변경 후 실행될 콜백 함수입니다.
     */
    toggleRTCMedia(callback?: (
    /**
     * 영상 입력 종류입니다.
     *
     * - media: 카메라 입력
     * - share: 화면 공유 입력
     */
    name: "media" | "share", 
    /**
     * 변경 성공 여부입니다.
     */
    result: boolean) => void): void;
    /**
     * 이벤트 리스너를 추가합니다.
     */
    on<T extends keyof ChannelEventMap | keyof DefaultEventMap>(event: T, fn: T extends keyof ChannelEventMap ? ChannelEventMap[T] : T extends keyof DefaultEventMap ? DefaultEventMap[T] : never): this;
    /**
     * 이벤트 리스너를 추가합니다.
     */
    addListener<T extends keyof ChannelEventMap | keyof DefaultEventMap>(event: T, fn: T extends keyof ChannelEventMap ? ChannelEventMap[T] : T extends keyof DefaultEventMap ? DefaultEventMap[T] : never): this;
    /**
     * 한번만 실행되는 이벤트 리스너를 추가합니다.
     */
    once<T extends keyof ChannelEventMap | keyof DefaultEventMap>(event: T, fn: T extends keyof ChannelEventMap ? ChannelEventMap[T] : T extends keyof DefaultEventMap ? DefaultEventMap[T] : never): this;
    /**
     * 이벤트 리스너를 제거합니다.
     */
    off<T extends keyof ChannelEventMap | keyof DefaultEventMap>(event: T, fn: T extends keyof ChannelEventMap ? ChannelEventMap[T] : T extends keyof DefaultEventMap ? DefaultEventMap[T] : never): this;
    /**
     * 이벤트 리스너를 제거합니다.
     */
    removeListener<T extends keyof ChannelEventMap | keyof DefaultEventMap>(event: T, fn: T extends keyof ChannelEventMap ? ChannelEventMap[T] : T extends keyof DefaultEventMap ? DefaultEventMap[T] : never): this;
    /**
     * 등록되어있는 모든 이벤트 리스너를 제거합니다.
     *
     * 파라미터로 입력할 경우 해당 이벤트 리스너를 제거합니다.
     */
    removeAllListeners<T extends keyof ChannelEventMap | keyof DefaultEventMap>(event: T): this;
}
declare global {
    interface Window {
        VChatCloud: typeof VChatCloud;
        Channel: typeof Channel;
    }
}
