import { RTCError } from './RTCError';
import { LocalStream, RemoteStream } from './BRTCStream';
import { AudioCodec, Codec, Mode, Role, UserId } from './value';
/**
 * client join 参数配置
 */
export interface JoinConfig {
    role?: Role;
}
/**
 * 创建 Client 参数
 */
export interface ClientOptions {
    /**
      * 用户 appId
      */
    appId: string;
    /**
     * 视频编码类型，默认 h264，目前只支持 h264
     */
    codec?: Codec;
    /**
     * 音频编码类型，默认 opus，目前只支持 opus
     */
    audioCodec?: AudioCodec;
    /**
     * 直播模式，默认 rtc 模式，目前只支持 rtc 模式
     */
    mode?: Mode;
    /**
     * 数据上报自定义字段
     * 长度小于 64 个字符，超过的会被截断
     */
    comments?: string;
}
/**
 * 订阅流参数
 */
export interface SubscribeOptions {
    /**
     * 是否订阅视频
     */
    video: boolean;
    /**
     * 是否不下发视频数据
     */
    videoEnable?: boolean;
    /**
     * 是否订阅音频
     */
    audio: boolean;
    /**
     * 是否不下发音频数据
     */
    audioEnable?: boolean;
    /**
     * 订阅类型
     */
    streamType?: 'small' | 'big';
}
/**
 * Client 对象
 */
export declare class Client {
    /**
     * 创建 Client 对象
     *
     * @param options 配置项
     *
     * @returns Client 实例
     */
    constructor(options: ClientOptions);
    /**
     * 加入一个音视频通话房间
     *
     * - 进房代表开始一个音视频通话会话，这时候 SDK 会监听远端用户进房退房情况，若有远端用户进房并且发布流，本地会收到 'stream-added' 事件。
     * - 进房后用户可以通过 publish() 发布本地流，本地流发布成功后远端用户就会收到相应 'stream-added' 事件通知从而完成一个双向的音视频通话连接。
     *
     * @param roomId 房间 id
     * @param userId 用户 id
     * @param sig 动态口令
     *
     * @returns any
     */
    join(roomId: string, userId: UserId, sig: string, joinConfig?: JoinConfig): Promise<any>;
    /**
     * 退出当前音视频通话房间，结束一次音视频通话会话。
     *
     * - 退房前请确保已经通过 unpublish() 取消发布本地流，若未取消发布本地流，SDK 内部会自动取消发布本地流。 同时，退房会关闭所有远端流。
     *
     * @param type 离开原因，不传表示主动离开
     *
     * @returns any
     */
    leave(type?: string): Promise<any>;
    /**
     * 发布本地音视频流。
     *
     * - 该方法需要在 join() 进房后调用，一次音视频会话中只能发布一个本地流。若想发布另外一个本地流，可先通过 unpublish() 取消发布当前本地流后再发布新的本地流。
     * - 在发布本地流后，可通过 removeTrack()、addTrack()、 replaceTrack() 来更新本地流中的某个音频或视频流。
     * - 发布本地流后远端会收到 ‘stream-added’ 事件通知。
     *
     * @param stream 创建的本地流对象
     *
     * @returns any
     */
    publish(stream: LocalStream): Promise<any>;
    /**
     * 取消发布本地流。
     *
     * - 取消发布本地流后远端会收到 'stream-removed' 事件通知。
     * - 请在 leave() 退房前取消已经发布的本地流。
     *
     * @param stream 取消发布的本地流对象
     *
     * @returns any
     */
    unpublish(stream: LocalStream): Promise<any>;
    /**
     * 订阅远端流
     *
     * - 可通过该订阅接口指明需要订阅音频、视频或者音视频流。
     *
     * @param stream 需要订阅的远端流对象，由 ‘stream-added’ 事件获得
     * @param options 订阅选项，默认音视频都订阅
     *
     * @returns any
     */
    subscribe(stream: RemoteStream, options?: SubscribeOptions): Promise<any>;
    /**
     * 取消订阅远端流
     *
     * @param stream 需要取消订阅的远端流对象，由 ‘stream-added’ 事件获得
     *
     * @returns any
     */
    unsubscribe(stream: RemoteStream): Promise<any>;
    /**
     * 提交事件
     *
     * @param type 事件类型
     * @param data 事件数据
     *
     * @returns void
     */
    fire(type: string, data?: any): void;
    /**
     * 设置一次事件监听
     * 支持链式调用
     * 支持命名空间 `type.namespace`，使用 `.` 来分隔 `type` 和 `namespace`
     *
     * @param type 事件类型
     * @param listener 监听函数
     *
     * @returns Client
     */
    on(type: 'stream-added', listener: typeof client_event_stream_added): this;
    on(type: 'stream-removed', listener: typeof client_event_stream_removed): this;
    on(type: 'stream-updated', listener: typeof client_event_stream_updated): this;
    on(type: 'stream-published', listener: typeof client_event_stream_published): this;
    on(type: 'stream-subscribed', listener: typeof client_event_stream_subscribed): this;
    on(type: 'mute-video', listener: typeof client_event_mute_video): this;
    on(type: 'unmute-video', listener: typeof client_event_unmute_video): this;
    on(type: 'mute-audio', listener: typeof client_event_mute_audio): this;
    on(type: 'unmute-audio', listener: typeof client_event_unmute_audio): this;
    on(type: 'error', listener: typeof client_event_error): this;
    on(type: 'peer-joined', listener: typeof client_event_peer_joined): this;
    on(type: 'peer-leaved', listener: typeof client_event_peer_leaved): this;
    on(type: 'client-banned', listener: typeof client_event_client_banned): this;
    on(type: 'user-kicked', listener: typeof client_event_user_kicked): this;
    on(type: 'room-closed', listener: typeof client_event_room_closed): this;
    on(type: string, listener: Function): this;
    /**
     * 设置一次事件监听
     * 支持链式调用
     * 支持命名空间 `type.namespace`，使用 `.` 来分隔 `type` 和 `namespace`
     *
     * @param type 事件类型
     * @param listener 监听函数
     *
     * @returns Client
     */
    one(type: 'stream-added', listener: typeof client_event_stream_added): this;
    one(type: 'stream-removed', listener: typeof client_event_stream_removed): this;
    one(type: 'stream-updated', listener: typeof client_event_stream_updated): this;
    one(type: 'stream-published', listener: typeof client_event_stream_published): this;
    one(type: 'stream-subscribed', listener: typeof client_event_stream_subscribed): this;
    one(type: 'mute-video', listener: typeof client_event_mute_video): this;
    one(type: 'unmute-video', listener: typeof client_event_unmute_video): this;
    one(type: 'mute-audio', listener: typeof client_event_mute_audio): this;
    one(type: 'unmute-audio', listener: typeof client_event_unmute_audio): this;
    one(type: 'error', listener: typeof client_event_error): this;
    one(type: 'peer-joined', listener: typeof client_event_peer_joined): this;
    one(type: 'peer-leaved', listener: typeof client_event_peer_leaved): this;
    one(type: 'client-banned', listener: typeof client_event_client_banned): this;
    one(type: 'user-kicked', listener: typeof client_event_user_kicked): this;
    one(type: 'room-closed', listener: typeof client_event_room_closed): this;
    one(type: string, listener: Function): this;
    /**
     * 取消事件监听
     * 支持链式调用
     *
     * @param type 事件类型或者命名空间
     * - 如果传入命名空间则解绑此命名空间的所有回调
     * - 如果不传则解绑所有设置过的回调
     * @param listener 绑定函数
     * - 如果不传则解绑指定 `type` 的所有回调，否则只解绑指定 `type` 和 `listener` 的回调
     *
     * @returns Client
     */
    off(type?: string, listener?: Function): this;
    /**
     * 设置 client 只用于推流，一般用于推多路流的时候，设置主 client为 false，辅 client 为 true，这样辅 client 只用于推流，只会触发 ’stream-published‘ 事件，所有的流由主 client 来订阅
     *
     * @param value 是否只推流
     *
     * @returns void
     */
    setPublishOnly(value: boolean): void;
    /**
     * 销毁 client 实例
     *
     * @param force 同步销毁，不等待异步返回
     *
     * @returns any
     */
    destroy(force: boolean): Promise<any>;
}
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_stream_added(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_stream_removed(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_stream_updated(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 本地流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_stream_published(event: {
    stream: LocalStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_stream_subscribed(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_mute_video(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_unmute_video(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_mute_audio(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_unmute_audio(event: {
    stream: RemoteStream;
}): void | false;
/**
 * @param event Object
 * - stream 远端流实例
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_error(error: RTCError): void | false;
/**
 * @param event Object
 * - userId 用户 id
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_peer_joined(event: {
    userId: UserId;
}): void | false;
/**
 * @param event Object
 * - userId 用户 id
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_peer_leaved(event: {
    userId: UserId;
}): void | false;
/**
 * @param event Object
 * - userId 用户 id
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_client_banned(error: RTCError): void | false;
/**
 * @param event Object
 * - userId 用户 id
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_user_kicked(error: RTCError): void | false;
/**
 * @param event Object
 * - userId 用户 id
 *
 * @returns
 * 返回 false 会停止触发后面监听的事件
 */
declare function client_event_room_closed(error: RTCError): void | false;
export {};
