import { BCEvent } from "./clientEventType";
import { EventType } from "../../BoomAdapter/type/client";
import Emitter from "../../BoomAdapter/bjy-common/util/Emitter";
import type { ClientOptions, LocalStream, RemoteStream, SubscribeOptions } from "BRTC";
import * as BRTC from "BRTC";
import User from "../../BoomAdapter/User/User";
import BCUser from "../../BoomAdapter/User/User";
import { StreamDeviceOption } from "../../BoomAdapter/type/BRTCStream";
import type Room from "@hysc/bloud/src/core/Room";
import { BloudStream } from "@hysc/bloud";
export interface ShareMediaOptions {
    audio: boolean;
    video: boolean;
    width: number;
    height: number;
    videoSource: MediaStreamTrack;
    audioSource: MediaStreamTrack;
}
export default class BCClient {
    bloud: any;
    client: Room;
    emitters: Array<EventType>;
    name: string;
    type: number;
    appId: string;
    brtcAppId: string;
    roomId: string;
    tarCreate: boolean;
    userinfo: any;
    userId: string;
    isJoining: boolean;
    collection: any;
    limit: number;
    token: string;
    /** 用户业务的customToken, 用于反向校验是否有创建的权限 */
    customToken: string;
    create: Boolean;
    host: string;
    getProxiesUrl: string;
    secret: string;
    enableRace: boolean;
    emitter: Emitter;
    disableMediaEngine: boolean;
    roomType: number | undefined;
    /**
     * 本地权限
     */
    private privileges;
    private audioCodec;
    private codec;
    private reportThreshold;
    private publishOnly;
    /**
     * brtc相关
     */
    brtcClient: any;
    /**
     * brtc屏幕共享单独客户端
     */
    shareBrtcClient: any;
    shareScreenStream: LocalStream;
    bloudShareScreenStream: BloudStream;
    /**
     * 因为是要先brtc入会，在bloud入会，所以在brtc入会之后加入当前房间有人推流
     * 会触发stream-added事件，但是这个时候bloud还没有入会，导致没法和流对应的用户绑定，外面也收不到监听
     * 所以要加一个flag判断一下，对brtc入会之后的流进行缓存，当bloud入会之后，在对当前的缓存的状态进行抛发
     * 之后当前状态设置为true
     *
     * 相关流记载在BMStreamModelVM里面 hadJoinedStreamModels
     */
    hasBloudJoined: boolean;
    brtcSig: string;
    brtcShareSig: string;
    private shareContentHint;
    identity: string;
    isBig: string;
    private sig;
    private brtcJoined;
    private joinReady;
    private bloudShareUnPublishTimer;
    constructor(options: ClientOptions | {});
    setShareSig(sig: string): void;
    clearObject(): void;
    /**
     * 加入一个音视频通话房间(初始化房间对象)
     * 进房代表开始一个音视频通话会话，这时候 SDK 会监听远端用户进房退房情况，若有远端用户进房并且发布流，本地会收到 'stream-added' 事件。
     * 进房后用户可以通过 publish() 发布本地流，本地流发布成功后远端用户就会收到相应 'stream-added' 事件通知从而完成一个双向的音视频通话连接。
     *
     * @param {Object} props room创建所需属性
     * @param {String} props.roomId 房间号
     * @param {Number} props.user 用户id
     * @param {String} props.host 会议内的请求地址
     * @param {String} props.getProxiesUrl 获取ws请求地址的路径
     * @param {String} props.secret 房间密码
     * @param {Boolean} props.create 是否执行房间的创建, 默认为自适应, 有房间则创建, 没房间则不创建
     * @param {String} props.customToken 用户业务token
     * @param {Number} props.limit 人数最大值
     * @param {Number} props.brtcAppId
     * @param {String} props.collection 数据上报地址
     * @param {Object} props.userinfo 用户信息
     * @param {Number} props.userinfo.cver 客户端版本
     * @param {String} props.userinfo.nickname 用户昵称
     * @param {String} props.userinfo.avatar 用户头像
     * @param {Number} props.userinfo.pos 客户端类型
     * @param {Number} props.type //1:单一模式, 2:混合模式
      * @param {Number} props.sig // 混合模式入会的签名
     * @example
     * {
          room: '111111',//房间号
          host: 'https://v3test.boom.cn',//会议内的请求地址
          getProxiesUrl: '/api/conference/v1/auth/token',//获取ws地址的路径
          secret: '',//房间密码
          type: 1,
          nickname: 'zzy',
          collection: '',//数据上报地址
          custom_token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJsb2dpbiIsImlhdCI6MTY1MDA5ODkwMSwibmJmIjoxNjUwMDk4OTAxLCJqdGkiOiIiLCJzdWIiOjk4NSwicHJ2IjoiODdlN2UxYmVlMjcyMmJmMzk4NjQxN2IzMzUxZTVmMjYzODQwY2ExYyIsImF0dHIiOjAsImJkIjowfQ.b-J9TnmjOzaVUJeY83tY_d1rdu_ELAWx8iH3odBN5kE',//用户token
          userinfo: {
              userId: 985,//用户id
              pos: 'web',
              nickname: 'zzy',//用户昵称
              avatar: '',//用户头像
          }
      }
     */
    join(props: any): Promise<any>;
    joinBrtc: () => Promise<unknown>;
    joinBloud: () => Promise<unknown>;
    joinRoom(): Promise<unknown>;
    private createShareBrtcClient;
    /**
     * 获取ws路径
     * @returns
     */
    _getBloudProxiesUrl(token: string): Promise<any>;
    /**
     * 监听事件
     *
     * @param type 事件类型
     * @param fn 事件回调
     * @return 实例本身 {@link Client}
     */
    on(type: string, fn: Function): this;
    /**
     * 提交事件
     * @param type 事件类型
     * @param data 事件数据
     */
    fire(type: string, data?: any): void;
    /**
     * 移交管理员权限
     * @param {String} masterId 新的管理员用户ID
     * @param {boolean} isKeep 是否将转移人设置为联席主持人
     */
    changeMaster(masterId: string, isKeep?: boolean): Promise<any>;
    /**
     * 获取房间主持人
     */
    getMaster(): string;
    /**
     * 普通参会者设置为嘉宾之后，要调用这个方法，去给其他人发用户
     * @param pageSize
     */
    syncUser(pageSize?: number): Promise<void | import("@hysc/bloud/src/types/type").Data>;
    /**
     * 获取房间创建者
     */
    getCreator(): string;
    /**
     * 获取房间名称
     */
    getName(): string;
    /**
     * 关闭房间
     */
    close(): Promise<void>;
    /**
     * 获取最新消息序列号
     */
    getMsgSeq(): number;
    /**
     * 踢出用户
     * @param {String} userId 用户ID
     * @param {boolean} withoutBlack true 可以再进来 false 进不来
     */
    evictUser(userId: string, withoutBlack: boolean): Promise<any>;
    /**
     * 更新用户信息
     * @param {String} target - 目标用户id
     * @param {Object} info - 对象
     * @param {Object} info.customInfo - 用户自定义信息
     * @param {String} info.customInfo.nickname - 用户昵称
     * @param {String} info.customInfo.permission - 权限
     * @param {String[]} info.customInfo.udpateKeys - 这个不需要传 服务端会自动计算那些值变更了.
     **/
    updateUser(target: string, info: any): Promise<any>;
    /**
     * 获取限制人数
     */
    getLimits(): number;
    /**
     * 是否允许房间加入成员
     * @return {Boolean}
     */
    getSwitch(): Boolean;
    /**
     * 更新token
     * @param {String} token
     */
    /**
     * 同步房间信息，在事件 room-reconnected 触发后调用
     * @return {Promise}
     */
    syncRoom(): Promise<any>;
    /**
     * 更新房间状态
     * @param {Object} options - 更新房间信息参数
     * @param {Boolean} options.audiooff - 房间是否开启全员静音，可选
     * @param {Boolean} options.selfopenaudio - 房间是否允许成员自行开启语音
     * @param {Boolean} options.videooff - 房间是否开启禁用摄像头，可选
     * @param {Boolean} options.msgoff - 房间是否开启全员禁言，可选
     * @param {Boolean} options.switch - 房间是否开启准入开关，可选
     * @param {Boolean} options.lock - 房间是否锁定
     * @param {Boolean} options.secret - 不为空时表示房间密码，为以`md5(${room}.${secret})`计算所得值为参数
     * @returns {Promise}
     */
    update(options: any): Promise<any>;
    /**
     * 获取用户列表
     * @return {Promise}
     */
    getUsers(pageIndex: number, permission?: string, pageSize?: number): Promise<{
        users: Map<string, BCUser>;
        total: number;
    }>;
    updateStream(uid: string, streamId: string, streamInfo: any): Promise<any>;
    /**
     * 获取用户列表
     * @return {Promise}
     */
    getUsersList(pgIndex: number, permission?: string, pageSize?: number, waitRoom?: boolean): Promise<{
        users: Map<string, BCUser>;
        total: number;
        pageIndex: number;
    }>;
    /**
     * 获取用户总数
     * @return {Number}
     */
    getTotalUsers(): Number;
    /**
     * 发送消息，缓存至服务器，会生成序列号
     * @param {String} message - 待发送消息, 必须是 JSON 字符串
     * @param {String|undefined} to - 如果为空，则为广播消息，不为空，则为定向到to用户的私聊消息
     */
    sendMessage(message: string, to: string | undefined): Promise<any>;
    /**
     * 发送自定义消息 可绕过 W 权限
     * @param {String} message - 待发送消息
     * @param {String|undefined} to - 如果为空，则为广播消息，不为空，则定向到to用户的消息
     */
    customMessage(message: string, to: string | undefined): Promise<any>;
    /**
     * 获取指定消息列表
     * @param {Number} startSeq - 起始序列号
     * @param {Number} endSeq - 终止序列号
     * @return {Promise<>}
     */
    getMessages(startSeq: number, endSeq: number): Promise<any>;
    /**
     * 获取本地用户对象
     * @return {Participant}
     */
    getLocalParticipant(): import("@hysc/bloud/src/core/Participant").default;
    /**
     * 是否开启全员静音
     * @return {Boolean}
     */
    getAudioOff(): boolean;
    /**
     * 是否允许自行开启语音
     */
    getSelfOpenAudio(): boolean;
    /**
     * 是否开启全员禁用摄像头
     * @return {Boolean}
     */
    getVideoOff(): boolean;
    /**
     * 是否开启全员禁言[禁止发送消息]
     * @return {Boolean}
     */
    getMsgOff(): boolean;
    /**
     * 是否锁定房间
     * @return {Boolean}
     */
    getLock(): boolean;
    /**
     * 获取房间信息
     * @return {Object}
     */
    getRoomInfo(): any;
    /**
     * 设置全员静音
     * @param {Boolean} audiooff - 是否静音
     * @param {Boolean} selfopenaudio - 是否允许自行开启
     * @return {Promise}
     */
    setAudioOff(audiooff: boolean, selfopenaudio: boolean): Promise<any>;
    /**
     * 设置全员禁用摄像头
     * @param {Boolean} videooff - 是否禁用摄像头
     * @return {Promise}
     */
    setVideoOff(videooff: boolean): Promise<any>;
    /**
     * 设置全员禁言
     * @param {Boolean} msgoff - 是否禁言
     * @return {Promise}
     */
    setMsgOff(msgoff: boolean): Promise<any>;
    /**
     * 设置是否允许加入成员
     * @param {Boolean} switch - 是否开启
     */
    setSwitch(switch_: boolean): Promise<void>;
    /**
     * 设置是否锁定房间
     * @param {Boolean} lock - 是否锁定
     */
    setLock(lock: boolean): Promise<void>;
    /**
     * 发布本地音视频流。
     * 该方法需要在 join() 进房后调用，一次音视频会话中只能发布一个本地流。若想发布另外一个本地流，可先通过 unpublish() 取消发布当前本地流后再发布新的本地流。
     * 在发布本地流后，可通过 removeTrack()、addTrack()、 replaceTrack() 来更新本地流中的某个音频或视频流。
     * 发布本地流后远端会收到 ‘stream-added’ 事件通知。
     *
     * @param stream 创建的本地流对象
     * @return
     */
    publish(stream: LocalStream): Promise<any>;
    /**
     * 取消发布本地流。
     * 取消发布本地流后远端会收到 'stream-removed' 事件通知。
     * 请在 leave() 退房前取消已经发布的本地流。
     *
     * @param stream 取消发布的本地流对象
     * @return
     */
    unpublish(stream: LocalStream): Promise<any>;
    /**
     * 订阅远端流
     * 可通过该订阅接口指明需要订阅音频、视频或者音视频流。
     *
     * @param stream 需要订阅的远端流对象，由 ‘stream-added’ 事件获得
     * @param options 订阅选项
     */
    subscribe(stream: RemoteStream, options?: SubscribeOptions): Promise<any>;
    /**
     * 取消订阅远端流
     *
     * @param stream 需要取消订阅的远端流对象，由 ‘stream-added’ 事件获得
     * @return
     */
    unsubscribe(stream: RemoteStream): Promise<any>;
    /**
     * 给bloud client 添加事件
     * @private
     */
    private addBloudEvent;
    /**
     * 给brtc client 添加事件
     * @private
     */
    private addBrtcEvent;
    clearBrtcEvent(): void;
    leave(): Promise<void>;
    leaveBrtcRoom(): Promise<void>;
    leaveShare(): Promise<void>;
    getEventList(): typeof BCEvent;
    /**
     * 创建录制对象,用于本地录制，可以指定添加录制远端音频流
     * @param {String} opts.filename - 录制文件名
     * @param {Object} opts.capture - 采集属性
     * @param {Number} opts.capture.width - 宽度
     * @param {Number} opts.capture.height - 高度
     * @param {Number} opts.capture.fps - 帧率
     * @param {Number} opts.record - 编码属性
     * @param {Number} opts.record.bitrate - 编码码率
     * @param {String|undefined} opts.record.format - 编码格式
     * @return {BloudRecorder}
     */
    createRecorder(opts: any): import("@hysc/bloud/src/core/Recorder/Recorder").default;
    /**
     * 创建当前说话人检测器
     * @returns
     */
    createSpeakerDetector(): any;
    /**
     * 创建本地流
     * @param options 流的配置
     * @param sid 流的id
     */
    createLocalStream(options: StreamDeviceOption, sid?: string): Promise<any>;
    /**
     * 发布之后在重新创建流，
     * 主要是因为，上面的createLocalStream 里面有 enableSmallStream
     * 这个方法在发布之后是没有办法在调用的
     * @param options
     * @param sid
     */
    createPBLocalStream(options: StreamDeviceOption, sid?: string): Promise<any>;
    /**
     * 创建vloud的流，目的是为了给vloud推流，但是这个流不携带流信息
     * @param options
     * @param sid
     */
    creteBloudLocalStream(options: {
        audio_enable: boolean;
        video_enable: boolean;
    }, sid: string): import("@hysc/bloud/src/core/BloudStream").default;
    /**
     * 创建bloud共享屏幕流
     * @param options
     * @param sid
     * @returns
     */
    createBloudScreenStream(options: {
        audio_enable: boolean;
        video_enable: boolean;
    }, sid: string): import("@hysc/bloud/src/core/BloudStream").default;
    /**
     * 更新房间自定义属性状态
     * @param {Object} customStats - 更新自定义房间信息参数
     * @param {boolean} replace 是否替换原数据
     * @param {number} customStats.layoutMode - 0/1/2,   // 默认为0，0:自由模式，可随时切换；1:是使用 defaultLayout，布局内可控；2:是使用 mainLayout，主会场同内容
     * @returns {Promise}
     */
    updateCustomStats(customStats: any, replace?: boolean): Promise<any>;
    /**
     * 获取自定义属性
     */
    getCustomStats(): any;
    /**
     * 获取会议时间进度,返回秒数
     */
    getDuration(): number;
    toggleShareScreen(enable: boolean, opts: any, customShare?: any): Promise<unknown>;
    shareHTMLMedia(enable: boolean, shareOptions: ShareMediaOptions): Promise<never>;
    /**
     * 共享client推共享屏幕流
     * @param shareStream
     */
    publishShareStream(shareStream: BRTC.LocalStream): Promise<never>;
    createAndPubBloudShareStream(audio: boolean, video: boolean, pub?: boolean): void;
    replaceShareStreamVideoTrack(videoTrack: MediaStreamTrack): void;
    unpublishShareStream(): Promise<unknown>;
    handleForceUnpublishBloudStream: () => void;
    /**
     * 设置共享屏幕流的 contentHint，开启共享屏幕之前设置
     * @param contentHint
     */
    setShareScreenContentHint(contentHint: '' | 'motion' | 'detail' | 'text'): void;
    /**
     * 释放房间,会议结束时调用
     */
    releaseRoom(): Promise<void>;
    private handleShareStreamEnded;
    /**
     * 私有化地址url
     * @param url
     */
    setCustomUrl(url: string): void;
    bloudReconnect(): Promise<void>;
    searchUsers(nickname: string, pageSize: number, waitRoom: boolean): Promise<{
        users: Map<string, User>;
    }>;
    queryUsers(uIds: string[]): Promise<{
        users: Map<string, User>;
    }>;
    /**
     * 端上出现net-work error之后，退出当前会议，然后重新入会
     */
    handleBloudRejoin(): Promise<any>;
}
