interface IResponse {
    code: number;
    message: string;
    data?: unknown;
}

/**
 * @internal
 */
declare interface IRoomCreate {
    /**
     * 房间号.
     */
    room: string;
    /**
     * 房间模式 1 = 会议；2 = 直播.
     */
    mode: number;
    /**
     * 房间类型 1 = 公开；0 = 非公开.默认值为1公开会议.
     */
    room_type: number;
    /**
     * 房间名称.
     */
    room_name: string;
    /**
     * 会议开始时间戳（单位秒）,不能少于当前时间戳半小时以上.
     */
    start_time: number;
    /**
     * 会议结束时间戳（单位秒.
     */
    end_time: number;
    /**
     * 主持人.
     */
    creator?: string;
    /**
     * 主持人名字 .
     * */
    creator_nickname?: string;
    /**
     * 房间人数限制 0表示无限制.
     */
    user_num: number;
    /**
     * 房间密码.
     */
    secret?: string;
    /**
     * 是否允许嘉宾在主持人进会前加入会议 0 允许 1 不允许.
     */
    is_must_host?: boolean;
    /**
     * 参会人员列表的用户id.
     */
    guests?: string;
    /**
     * 管理员(联席主持人)列表的用户id, 传入之后可以在主持人之前开启直播.
     */
    admins?: string;
    /**
     * 是否自动开启云录，默认值为 false.
     */
    is_record?: string;
    /**
     * 设置云录参数.
     */
    record?: object;
    /**
     * 是否使用小程序 默认false.
     */
    is_mini_app?: boolean;
    template_name?: string;
    /**
     * 是否开启会议录制水印 0:不开启 1:开启.
     */
    watermark?: number;
    /**
     * 是否自动开启录制, vb
     */
    meeting_record?: number;
    /**
     * 测验地址
     */
    quiz_domain?: string;
}
/**
 * 0: 是挑屏 1:播控  2:会控  3:调度 4: TY视频会议进入会控 5: TY学习会进入会控  7:房间统计,8:视频剪辑, 9查看剪辑 11:课后评价
 * @public
 */
type ControlRoutesOptions = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
interface IJoinMeetingElectron {
    /**
     * Electron环境.
     */
    isElectron: boolean;
    /**
     *Electron环境回调.
     */
    callback: Function;
}
/**
 * 会控按钮展示隐藏控制.
 * @public
 */
interface IMeetingControl {
    /**
     * 隐藏麦克风.
     */
    hideMicrophone?: boolean;
    /**
     * 隐藏摄像头.
     */
    hideCamera?: boolean;
    /**
     * 隐藏扬声器.
     */
    hideLoudspeaker?: boolean;
    /**
     * 隐藏邀请.
     */
    hideInvite?: boolean;
    /**
     * 隐藏分享.
     */
    hideShare?: boolean;
    /**
     * 隐藏聊天.
     */
    hideChat?: boolean;
    /**
     * 隐藏参会者列表.
     */
    hideParticipant?: boolean;
    /**
     * 隐藏协作文档.
     */
    hideDocument?: boolean;
    /**
     * 隐藏记录.
     */
    hideRecord?: boolean;
    /**
     * 隐藏设置.
     */
    hideSetting?: boolean;
    /**
     * 隐藏离会按钮.
     */
    hideLeaveRoom?: boolean;
    /**
     * 隐藏锁定按钮.
     */
    hideLockLiving?: boolean;
    /**
     * 隐藏视频预览.
     */
    hideVideoPreview?: boolean;
    /**
     * 隐藏互动
     */
    hideInteraction?: boolean;
    /**
     * 隐藏系统按钮
     */
    hideDialogButton?: boolean;
    /**
     * 隐藏加密保护图标
     */
    hideShield?: boolean;
    /**
     * 隐藏点赞
     */
    hideGiveLike?: boolean;
    /**
     * 隐藏离开会议弹窗 当值为true:主动离开的时候,没有二次确认弹窗,直接退会、房间被动结束的时候，不弹出会议已结束弹窗; 值为false则走正常逻辑,默认值为false
     */
    hideEndMeetingConfirm?: boolean;
}
interface IJoinMeetingParam {
    /**
     * 通过Boom服务下发.
     *
     * @privateRemarks
     * */
    brtcAppId: string;
    /**
     * 房间插入的节点.
     * */
    parentNode: HTMLElement;
    /**
     * 房间号.
     * */
    roomId: string;
    /**
     * 昵称.
     * */
    nickname?: string;
    /**
     * 房间主题.
     * */
    title: string;
    /**
     * 用户ID.
     * */
    user?: string;
    /**
     * 头像.
     * */
    avatar?: string;
    /**
     * 身份(即将废弃) 1: 主持人, 2: 嘉宾, 3: 观众, 4: 游客观众 5: 管理员 6: 普通参会者 9: 巡视员.
     * @deprecated 使用 userType
     * */
    identity: number;
    /**
     * 身份 1: 主持人, 20:管理员, 21:巡视员, 30:嘉宾, 40:参会者, 50:观众(直播), 51:游客(观众).
     * */
    userType: number;
    /**
     * 通过Boom服务下发.
     *
     * @privateRemarks
     * */
    server: string;
    /**
     * 房间密码, 设置了就有(数字,四位), 默认无.
     * */
    secret: string;
    /**
     * 是否是会议外投屏, 默认是false.
     * */
    screen: boolean;
    /**
     * 会控挑屏等配置项  0: 是挑屏 1:播控 2:会控 3:调度 4: TY视频会议进入会控 5: TY学习会进入会控.
     * */
    isControl: ControlRoutesOptions;
    /**
     * 是否为分会场.
     * */
    subVenue: boolean;
    /**
     * @deprecated
     */
    audio: boolean;
    /**
     * @deprecated
     */
    video: boolean;
    /**
     * 打开摄像头.
     * */
    videoEnable: boolean;
    /**
     * 打开麦克风.
     * */
    audioEnable: boolean;
    /**
     * 是否已经加入到房间了.
     * */
    joined: boolean;
    /**
     * @privateRemarks
     * */
    limit: number;
    /**
     *@privateRemarks
     * */
    token: string;
    /**
     * @privateRemarks
     * */
    visitor?: boolean;
    /**
     * 模式 meeting:会议, live:房间.
     * */
    mode: 'meeting' | 'live' | 'audio';
    /**
     * Electron PC客户端.
     * */
    electron?: IJoinMeetingElectron;
    /**
     * 设置隐藏房间间内的按钮.
     * */
    meetingControlOptions?: IMeetingControl;
    /**
     * 展示会议内全员可上传文档入口.
     * */
    visitorDocument?: boolean;
    /**
     * @privateRemarks
     * */
    authorization: string;
    /**
     *@privateRemarks
     * */
    brtc_host: string;
    /**
     * 是否开启语音激励.
     */
    voiceEncourage: 0 | 1;
    /**
     * 是否显示会议主题
     */
    showMeetingTopic: boolean;
    /**
     * 自定义用户信息
     */
    customInfo: any;
    qdtls: 0 | 1;
    qdtls_group_id: string;
    quantum_factor?: string;
    /**
     * 模板名称 三分屏, 后续会增加更多的模板. 不传值默认原来的模板.
     */
    template_name: string | 'triple';
}
interface IExtLoginParam {
    /**
     * 接入方的用户id.
     * */
    extUserId: string;
    /**
     * 接入方的用户昵称.
     * */
    nickname: string;
    /**
     * 接入方的用户用户头像.
     * */
    avatar: string;
    /**
     * 接入方token过期时间 秒级别 .
     * */
    expireTime: string;
    /**
     * 接入方后端返回, 通过Boom提供的接口.
     * */
    nonce: string;
    /**
     * Signature 端上计算得到.
     * */
    signature: string;
}

/**
 * 会控相关的操作.
 */
interface IMeetingControlOptions {
    /**
     * 是否取消自动拉流.
     */
    cancelAutoPull: boolean;
}
/**
 * 分辨率参数设置 type VideoProfile = '120p' | '180p' | '240p' | '360p' | '480p' | '720p' | '1080p'.
 */
type VideoProfile = '120p' | '180p' | '240p' | '360p' | '480p' | '720p' | '1080p';
/**
 * @public
 *
 * SDK 初始化时的参数
 *
 */
interface ISetupParam {
    /**
     * 应用ID.
     */
    appId: string;
    /**
     * 应用私有化服务器地址.
     */
    baseURL: string;
    /**
     * 应用部署域名.
     */
    domain: string;
    /**
     * 应用部署域名.
     */
    webDomain: string;
    /**
     * 是否开启加密.
     */
    enableEncrypt?: boolean;
    /**
     * 加密公钥.
     */
    publicKey?: string;
    /**
     * 启用邀请第三方人员功能.
     */
    enableThirdInvite?: boolean;
}
interface ILoginParam {
    /**
     * 用户id(会议用户id).
     * */
    userId: string;
    /**
     * 接入方的用户昵称.
     * */
    nickname: string;
    /**
     * 接入方的用户头像.
     * */
    avatar?: string;
    /**
     * 接入方token过期时间 秒级别 .
     * */
    expireTime: string;
    /**
     * 接入方后端返回, 通过Boom提供的op/v2/auth/signature接口.
     * */
    nonce: string;
    /**
     * 接入方后端返回, 通过Boom提供的op/v2/auth/signature接口.
     * */
    signature: string;
    /**
     * 接入方的用户id(第三方的用户id).
     * */
    extUserId?: string;
    /**
     * 接入方的账号字段(可用于水印).
     * */
    account?: string;
}
interface IUserRoles {
    /**
     * 设置入会发起人身份的展示文字.
     * */
    sponsor: string;
    /**
     * 接入方设置入会主持人身份的展示文字的用户头像.
     * */
    host: string;
    /**
     * 设置入会管理员身份的展示文字.
     * */
    admin: string;
    /**
     * 设置入会嘉宾身份的展示文字.
     * */
    guest: string;
    /**
     * 设置入会观众身份的展示文字.
     * */
    tourist: string;
    /**
     * 设置入会参会者列表展示区嘉宾区的展示文字.
     * */
    guestNameSetting: string;
}
interface InvitationInfo {
    /**
     * 邀请人信息.
     */
    inviter?: string;
    /**
     * 邀请信息.
     */
    inviteInfo: string;
    /**
     * 房间名称.
     */
    title: string;
    /**
     * 产品名称.
     */
    productName?: string;
    /**
     * 会议时间.
     */
    time: string;
    /**
     * 会议号.
     */
    roomNumber: string;
    /**
     * 会议密码.
     */
    password?: string;
    /**
     * 邀请唤起链接.
     */
    awaken: string;
    /**
     *  是否仅邀请信息邀请.
     */
    onlyInfoInvite: boolean;
    /**
     * 是否是非公开会议.
     */
    onlyInvite: boolean;
}
interface StaticsPageOptions {
    /** 房间的唯一标识 */
    roomId: string;
    /** 房间号 */
    roomNo?: string;
    parentNode: HTMLElement;
    domain?: string;
}
interface ClipPageOptions {
    /** 房间的唯一标识 */
    roomId: string;
    /** 房间号 */
    roomNo?: string;
    /** 视频的唯一标识 */
    videoId: string;
    parentNode: HTMLElement;
    /** 是否是查看剪辑 */
    preview?: boolean;
    domain?: string;
}
interface EvaluationOptions {
    parentNode: HTMLElement;
    domain?: string;
}
interface ShareScreenOptions {
    /** 是否开启 */
    enable: boolean;
    /** 共享类型 */
    type: 'screen' | 'camera';
    /** 设备ID,如果选择了camera,请传入设备id(navigator.mediaDevices.enumerateDevices()中的 deviceId), */
    deviceId?: string;
}
interface MeetingOptions {
    parentNode: HTMLElement;
    token: string;
}
/**
 * @class
 * BoomMeetingExternal
 */
declare class BoomMeetingExternal {
    private static setupParam;
    private static style;
    private static isJoining;
    private static brtc_host;
    private static isExtUser;
    private static extUserId;
    private static brtm_host;
    private static loginParam;
    private static companyMeetingConfigInfo;
    private static meetingInfo;
    private static meetingControlOptions;
    /**.
     * 初始化SDK
     *
     * @param options  - 初始化参数
     * @param {String} options.appId         跟商务人员获取
     * @param {String} options.baseURL       接口的 baseURL, 部署完成之后的
     * @param {String} options.domain        部署完成的展示页面的域名或者ip
     * @example
     * ```js
     * BoomMeetingExternal.setup({appId, baseURL, domain})
     * ```
     * @returns {Boolean} true:成功 false:失败
     * 参见{@link ISetupParam}
     */
    static setup(options: ISetupParam): boolean;
    static getVersion(): string;
    private static isExternalUser;
    /**.
     * 登录 Boom服务. 内部用户使用
     *
     * @param {Object} options
     * @param {string} options.nonce            - 接入方后端返回, 通过Boom提供的op/v2/auth/signature接口.
     * @param {string} options.userId           - 接入方的用户id,.
     * @param {string} options.nickname         - 接入方的用户昵称,.
     * @param {string} options.avatar           - 接入方的用户用户头像.
     * @param {string} options.signature        - 接入方后端返回, 通过Boom提供的op/v2/auth/signature接口.
     * @param {string} options.expireTime       - 接入方后端返回, 通过Boom提供的op/v2/auth/signature接口.
     * @example
     * ```ts
     * BoomMeetingExternal.login({ userId, nonce, expireTime, nickname, signature }).then(res => {
            if (res.code === 200) {
                showToast('登录成功')
            } else {
                showToast('登录失败')
            }
        }).catch(error => {
            console.log(error)
        })
      *```
     */
    static login(options: ILoginParam): Promise<IResponse>;
    /**
     * 三方用户登录Boom服务-(带账号体系).
     *
     * @param {Object} options
     * @param {string} options.nonce            - 接入方后端返回, 通过Boom提供的接口.
     * @param {string} options.extUserId        - 接入方的用户id,.
     * @param {string} options.nickname         - 接入方的用户昵称,.
     * @param {string} options.avatar           - 接入方的用户用户头像.
     * @param {string} options.signature        - Signature.
     * @param {string} options.expireTime       - 接入方token过期时间,.
     * @example
     * ```ts
     * BoomMeetingExternal.loginExternalAccount({ extUserId, nonce, expireTime, nickname, signature }).then(res => {
            if (res.code === 200) {
                showToast('登录成功')
            } else {
                showToast('登录失败')
            }
        }).catch(error => {
            console.log(error)
        })
     
        // signature 计算方式 使用这个库 CryptoJS
        function signatureEncode(msg, app_secret) {
          let hash = CryptoJS.HmacSHA256(msg, app_secret)
          let res = CryptoJS.enc.Hex.stringify(hash)
          return res
        }
     
        let strBefore = app_id + ":" + userId + ':' + nickname + ":" + avatar + ":" + expireTime + ":" + nonce
        let signature = signatureEncode((strBefore), app_secret)
     * ```
     */
    static loginExternalAccount(options: IExtLoginParam): Promise<unknown>;
    /**.
     * 退出Boom服务
     *
     * @example BoomMeetingExternal.logout()
     */
    static logout(): Promise<IResponse>;
    /**.
     * 创建房间
     *
     * @param {Object} options
     * @param {Number} [options.mode=1]                房间模式 1 = 会议；2 = 直播
     * @param options.room_type 房间类型 1 = 公开；0 = 非公开
     * @param {String} options.room_name               房间名称
     * @param {Number} options.start_time              会议开始时间戳（单位秒）,不能少于当前时间戳半小时以上
     * @param {Number} options.end_time                会议结束时间戳（单位秒）
     * @param {String} options.creator                 创建者id
     * @param {String} options.creator_nickname        创建者昵称
     * @param {Number} options.user_num                房间人数限制 0表示无限制
     * @param {String} options.secret                 房间密码
     * @param {Boolean} [options.is_must_host= 0]   是否允许嘉宾在主持人进会前加入会议 0 允许 1 不允许
     * @param {Boolean} [options.is_record=false]      是否自动开启云录，默认值为 false。
     * @param {Object} [options.record]                设置云录参数
     * @param {String} [options.record.notify_url]     云录回调地址
     * @param {Object} [options.record.params]         云录透传参数
     * @param {String} options.guests                  嘉宾列表的用户id,逗号隔开 'user01,user02,user03,user04'
     * @param {String} options.admins                  管理员列表的用户id, 传入之后可以在主持人之前开启直播, 逗号隔开 'admin01,admin02,admin03,admin04'
     * @param {Boolean} options.is_mini_app            是否使用小程序 默认false
     * @returns Promise<>
     * @example
     * ```js
     * BoomMeetingExternal.create({ room, mode, room_type, room_name, start_time, end_time, creator, creator_nickname, user_num, secret, is_must_host, guests, admins })
     *```
     * @remarks
     *
     * 创建房间说明：登录后才可创建
     *错误码
    - 201:结束时间和开始时间要大于当前时间且结束时间要大于结束时间

    - 202:自动生成房间号失败

    - 203:会议/直播已存在

    - 204:会议或直播正在进行中

    - 205:房间创建失败

     */
    static create(options: IRoomCreate): Promise<IResponse>;
    /**.
     * 加入房间
     *
     * @param {Object} options
     * @param {HTMLDivElement} options.parentNode 房间插入的节点
     * @param {String} options.roomId 房间号
     * @param {String} options.secret 房间密码, 设置了就有(数字,四位), 默认无
     * @param {String} options.user 用户ID
     * @param {String} options.nickname 昵称
     * @param {String} options.avatar 头像
     * @param {String} options.screen 是否是会议外投屏, 默认是false
     * @param {Boolean} options.audioEnable 打开麦克风
     * @param {Boolean} options.videoEnable 打开摄像头
     * @param {Number} options.identity 身份(即将废弃) 1: 主持人, 2: 嘉宾, 3: 观众, 4: 游客观众 5: 管理员 6: 普通参会者 9: 巡视员
     * @param {Number} options.userType 身份 1: 主持人, 20:管理员, 21:巡视员, 30:嘉宾, 40:参会者, 50:观众(直播), 51:游客(观众)
     * @param {String} options.mode 模式 meeting:会议, live:房间
     * @param {IJoinMeetingElectron} options.electron electron PC客户端
     * @param {String} options.electron.isElectron electron electron环境
     * @param {Function} options.electron.callback electron electron环境回调
     * @param {IMeetingControl} options.meetingControlOptions 设置隐藏房间间内的按钮
     * @param {Boolean} options.visitorDocument 展示会议内全员可上传文档入口
     * @param {Number} options.isControl 会控挑屏等配置项  0: 是挑屏 1:播控  2:会控  3:调度 4: TY视频会议进入会控 5: TY学习会进入会控
     * @param {Boolean} options.subVenue 是否为分会场
     * @param {Boolean} options.voiceEncourage 是否开启语音激励 0:不开启,1:开启
     * @param {Boolean} options.showMeetingTopic 是否展示会议主题
     * @param {Boolean} options.singleTalk 是否为单聊会议
     * @returns {Promise} promise<>
     * @example
     * ```ts
     * 入会说明：登录后才可入会，首先主持人加入房间，接着嘉宾&观众入会；若主持人未加入房间，会提示“直播暂未开始, 等待主持人加入，注意：不同角色入会需要打开新的浏览器窗口”
     * BoomMeetingExternal.join({roomId: '424830', nickname:'nickname'})
     *
     * 错误码说明：
     * 201-查询不到房间信息
     *
     * 202-房间信息校验失败
     *
     * 203-会议/直播暂未开始
     *
     * 204-房间信息获取失败
     *
     * 205-房间容量已经达到上限
     *
     * 210-未输入密码
     *
     * 212-密码错误
     * ```
     */
    static join(options: IJoinMeetingParam): Promise<IResponse>;
    private static private_join;
    /**.
     * 设置入会身份展示名称
     *
     * @param {Object} options 设置入会的用户角色
     * @param {String} options.sponsor 设置入会发起人身份的展示文字
     * @param {String} options.host 设置入会主持人身份的展示文字
     * @param {String} options.admin 设置入会管理员身份的展示文字
     * @param {String} options.guest 设置入会嘉宾身份的展示文字
     * @param {String} options.tourist 设置入会观众身份的展示文字
     * @param {String} options.guestNameSetting 设置入会参会者列表展示区嘉宾区的展示文字
     * @returns promise<>
     * @example
     * const userRoles = {
            sponsor:"发起人",
            host:"主持人",
            admin:"管理员",
            guest:"嘉宾",
            tourist:"观众",
            guestNameSetting:"嘉宾"
          }
     *  BoomMeetingExternal.setRole(userRoles)
     */
    static setRole(role: IUserRoles): Promise<IResponse>;
    /**.
     * 设置宫格最大显示窗口数
     *
     * @param {Number} windowNumber 窗口数 (输入的值应大于等于4小于等于25)
     */
    static setWindowNumber(windowNumber: number): Promise<IResponse>;
    /**.
     * 巡检管理员加入房间
     *
     * @param {Object} options
     * @param {HTMLDivElement} options.parentNode 房间插入的节点
     * @param {String} options.roomId 房间号
     * @param {String} options.secret 房间密码, 设置了就有(数字,四位), 默认无
     * @param {String} options.user 用户ID
     * @param {String} options.nickname 昵称
     * @param {String} options.avatar 头像
     * @param {String} options.mode 模式 meeting:会议, live:房间
     * @param {Number} options.isControl 会控挑屏等配置项  0: 是挑屏 1:播控  2:会控  3:调度 4: TY视频会议进入会控 5: TY学习会进入会控
     * @param {Boolean} options.subVenue 是否是分会场
     * @param {IMeetingControl} options.meetingControlOptions 设置隐藏房间间内的按钮
     * @example
     * ```ts
     * 巡检管理员入会说明：登录后才可入会，首先主持人加入房间，然后巡检入会；若主持人未加入房间，会提示“直播暂未开始, 等待主持人加入，注意：不同角色入会需要打开新的浏览器窗口”
     * BoomMeetingExternal.robotJoin({roomId: 424830, user:''user', nickname:'nickname', mode: 'live'}).catch(err => {
        if (err.code === 9) {
            console.log('参数不正确')
        } else if (err.code === 10) {
            console.log('房间不存在')
        } else if (err.code === 19) {
            console.log('房间容量已达上限, 不可加入')
        } else if (err.code === 34) {
            console.log('直播暂未开始, 等待主持人加入')
        } else if (err.code === 108) {
            console.log('请输入密码')
        } else if (err.code === 14) {
            console.log('密码错误, 请重新输入')
        }
     });
     * ```
     * @returns Promise
     */
    static robotJoin(options: IJoinMeetingParam): Promise<IResponse>;
    /**.
     * 设置邀请信息
     *
     * @param {Object} option 邀请信息
     * @param {String} option.inviter 邀请人信息
     * @param {String} option.inviteInfo 可复制的邀请信息
     * @param {String} option.title 房间名称
     * @param {String} option.productName 产品名称
     * @param {String} option.time 会议时间
     * @param {String} option.roomNumber 会议号
     * @param {String} option.password 会议密码
     * @param {String} option.awaken 邀请唤起链接
     * @param {String} option.language
     * @param {String} option.isSeminars 是否直播
     * @param {String} option.isLZ
     * @param {Boolean} option.onlyInvite 是否是非公开会议
     * @param {Boolean} option.onlyInfoInvite 是否仅邀请信息邀请
     * @example BoomMeetingExternal.setInvitationInfo(info)
     @returns {Promise}
     */
    static setInvitationInfo(option: InvitationInfo): Promise<unknown>;
    /**.
     * 设置房间配置属性,可扩展
     *
     * @param {Object} info 设置的信息
     * @param {Object} info.invitationInfo 名称
     * @param {String} info.invitationInfo.title
     * @param {String} info.invitationInfo.time
     * @param {String} info.invitationInfo.productName
     * @param {String} info.invitationInfo.roomNumber
     * @param {String} info.invitationInfo.password
     * @param {String} info.invitationInfo.awaken
     * @param {String} info.invitationInfo.introduceUrl
     * @param {String} info.invitationInfo.language
     * @param {String} info.invitationInfo.isSeminars
     * @param {String} info.invitationInfo.isLZ
     * @param {String} info.invitationInfo.onlyInvite
     * @param {Object} info.agreementAndLogoInfo logo地址
     * @param {String} info.agreementAndLogoInfo.name logo地址
     * @param {String} info.agreementAndLogoInfo.logo logo地址
     * @param {String} info.agreementAndLogoInfo.userAgreement logo地址
     * @param {String} info.agreementAndLogoInfo.privacyPolicy 隐私政策地址
     * @param {Object} info.commonConfigInfo 通用config.
     * @param {Object} info.streamConfig 流的通用config.
     * @param {boolean} info.streamConfig.disableSmallStream  true/false  关闭大小流
     * @param {String} info.streamConfig.videoHint 'detail' | 'motion' 1.保证采集的流清晰度优先设置到流的track上面,
     * @param {String} info.streamConfig.sourceType 'screen' | 'camera'  2.告诉服务端这个流不需要动态降分辨率,通过特殊标识
     
     *
     * @example
     * ```ts
     * let agreementAndLogoInfo = {
                name: 'Boom',//名称
                logo: 'https://cb-web-sdk.boom.cn/static/media/setting_logo.d20d7992.png',//logo地址
                userAgreement: 'https://cb-web.boom.cn/p/serviceAgreement.html',//用户协议地址
                privacyPolicy: 'https://cb-web.boom.cn/train/conceal?isConceal=true',//隐私政策地址
                appVersion: '0.0.1' // 当前版本

            }
    BoomMeetingExternal.setRoomConfig({agreementAndLogoInfo:agreementAndLogoInfo})
| Parameter                               | Type   | Description                                                  |
| --------------------------------------- | ------ | ------------------------------------------------------------ |
| info.invitationInfo                     | Object | 邀请信息                                                     |
| info.invitationInfo.title               |        |                                                              |
| invitationInfo.time                     |        |                                                              |
| info.invitationInfo.productName         |        |                                                              |
| info.invitationInfo.roomNumber          |        |                                                              |
| info.invitationInfo.password            |        |                                                              |
| info.invitationInfo.awaken              |        |                                                              |
| info.invitationInfo.introduceUrl        |        |                                                              |
| info.invitationInfo.language            |        |                                                              |
| info.invitationInfo.isSeminars          |        |                                                              |
| info.invitationInfo.onlyInvite          |        |                                                              |
| info.agreementAndLogoInfo               |        |                                                              |
| info.agreementAndLogoInfo.name          |        |                                                              |
| info.agreementAndLogoInfo.logo          |        |                                                              |
| info.agreementAndLogoInfo.userAgreement |        |                                                              |
| info.agreementAndLogoInfo.privacyPolicy |        |                                                              |
| info.commonConfigInfo                   | Object |                                                              |
| info.streamConfig                       | Object | 推流信息配置                                                 |
| info.streamConfig.disableSmallStream    | boolen | true/false  关闭大小流，默认值false                          |
| info.streamConfig.videoHint             | string | 'detail' / 'motion' 1.保证采集的流清晰度优先设置到流的track上面  默认值 motion |
| info.streamConfig.sourceType            | string | 'screen' / 'camera'  告诉服务端这个流不需要动态降分辨率,通过特殊标识  默认值 camera |
    *```
    *
    @returns {Promise} Promise
     */
    static setRoomConfig(info: any): Promise<unknown>;
    /**.
     * 离开房间
     *
     * @returns Promise
     * @example BoomMeetingExternal.leave()
     */
    static leave(): Promise<IResponse>;
    /**.
     * 结束房间
     *
     * @returns Promise
     * @example BoomMeetingExternal.release()
     */
    static release(): Promise<IResponse>;
    /**.
     * 获取参会人员列表
     *
     * @returns Promise<>
     * @example
     * ```ts
     * BoomMeetingExternal.getParticipants()
     * ```
     */
    static getParticipants(): Promise<IResponse>;
    /**.
     *  主题颜色配置
     *
     * @returns Promise<>
     */
    static setTheme(theme: any): Promise<IResponse>;
    /**.
     * 开始云录
     * 会议开始并推流后即可开始录制
     * @param {String} roomNumber  会议号
     * @example BoomMeetingExternal.startCloudRecord(roomNumber)
     @returns {Promise}
     */
    static startCloudRecord(roomNumber: string): Promise<IResponse>;
    /**.
     * 结束云录
     * @param {String} roomNumber  会议号
     * @example BoomMeetingExternal.endCloudRecord(roomNumber)
     @returns {Promise}
     */
    static endCloudRecord(roomNumber: string): Promise<IResponse>;
    /**.
     *  国际化配置
     *
     * @returns Promise<>
     */
    static setLanguage(language: any): Promise<IResponse>;
    /**.
     * 获取主持人
     *
     * @returns Promise<>
     * @example
     * ```ts
     * BoomMeetingExternal.getMaster()
     * ```
     */
    static getMaster(): Promise<IResponse>;
    /**.
     * 会控按钮可配置
     *
     * @param {IMeetingControl} options.meetingControlOptions 设置隐藏房间间内的按钮
     * @param {Object} options
     * @param {Boolean} options.hideCamera
     * @param {Boolean} options.hideLoudspeaker
     * @param {Boolean} options.hideInvite
     * @param {Boolean} options.hideShare
     * @param {Boolean} options.hideChat
     * @param {Boolean} options.hideParticipant
     * @param {Boolean} options.hideDocument
     * @param {Boolean} options.hideRecord
     * @param {Boolean} options.hideSetting
     * @param {Boolean} options.hideLeaveRoom
     * @returns {Promise} Promise<>
     * @example
     * ```ts
     * BoomMeetingExternal.meetingCtrlConfig({
     *    hideMicrophone: false,
          hideCamera: false,
          hideLoudspeaker: false,
          hideInvite: true,
          hideShare: true,
          hideChat: true,
          hideParticipant: false,
          hideDocument: true,
          hideRecord: true,
          hideSetting: false,
          hideLeaveRoom: false
      })
    * ```
     */
    static meetingCtrlConfig(options: IMeetingControl): any;
    /**.
     * 会控功能配置. join之前调用
     *
     * @param {IMeetingControlOptions} options - // Options.
     * @param {Boolean} [options.cancelAutoPull] 是否取消自动拉流
     * @returns {void}
     * @example BoomMeetingExternal.setupMeetingControlOptions({cancelAutoPull: true})
     */
    static setupMeetingControlOptions(options: IMeetingControlOptions): void;
    /**.
     * 截取用户图像
     *
     * @param {String[]} ids 用户id数组
     * @returns Promise<>  {userId1: Base64Image1, userId2: Base64Image2 }
     * @example BoomMeetingExternal.snapshot(['userId1', 'userId2']).then((res)=> { console.log('res:', res) })
     */
    static snapshot(ids: string[]): Promise<IResponse>;
    /**.
     * 一键截图
     *
     * @returns Promise<>
     */
    /**.
     * 修改主持人
     *
     * @param {String} id 新主持人id
     * @returns Promise<>
     */
    /**.
     * 收回主持人
     *
     * @returns Promise<>
     */
    /**.
     * 设置联席主持人
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 撤销联席主持人
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 获取全部嘉宾
     *
     * @returns Promise<>
     */
    /**.
     * 获取全部观众
     *
     * @returns Promise<>
     */
    /**.
     * 获取联席主持人
     *
     * @returns Promise<>
     */
    /**.
     * 嘉宾音频举手/本地手放下
     *
     * @returns Promise<>
     */
    /**.
     * 嘉宾手放下
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 观众音频举手/本地手放下
     *
     * @returns Promise<>
     */
    /**.
     * 观众音频手放下
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 群体手放下
     *
     * @returns Promise<>
     */
    /**.
     * 嘉宾视频举手（废弃）
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 同步全屏状态
     * @internal
     * @param {Boolean}  isFull: true-最大化状态 false-非最大化状态
     * @param isFull
     * @example
     */
    static syncFullStatus(isFull: boolean): Promise<IResponse>;
    /**.
     * 同步全屏按钮状态
     * @internal
     * @param {Boolean}  isMax: true-全屏状态 false-非全屏状态
     * @param isMax
     * @example
     */
    static syncMaxStatus(isMax: boolean): Promise<IResponse>;
    /**.
     * 观众群体手放下（废弃）
     *
     * @returns Promise<>
     */
    /**.
     * 同意观众音频举手
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 同意嘉宾音频举手
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 同意嘉宾视频举手
     *
     * @param {String} id 用户id
     * @returns Promise<>
     */
    /**.
     * 开启屏幕录制
     *
     * @returns Promise<>
     */
    /**.
     * 结束屏幕录制
     *
     * @returns Promise<>
     */
    /**.
     * 更名
     *
     * @param {String} id 用户id
     * @param {String} nickname 用户新昵称
     * @returns Promise<>
     * @example BoomMeetingExternal.rename(id, name)
     */
    static rename(id: string, nickname: string): Promise<IResponse>;
    /**.
     * 从房间踢出用户
     *
     * @param {String} id 用户id
     * @returns Promise<>
     * @example
     * ```ts
     * BoomMeetingExternal.evictUser(id)
     * ```
     */
    static evictUser(id: string): Promise<unknown>;
    /**.
     * 开关本地摄像头
     *
     * @returns Promise<>
     * @example BoomMeetingExternal.setLocalVideoEnable()
     */
    static setLocalVideoEnable(videoEnable: boolean): Promise<IResponse>;
    /**.
     * 开关本地麦克风
     *
     * @returns Promise<>
     * @example BoomMeetingExternal.setLocalAudioEnable(audioEnable: boolean)
     */
    static setLocalAudioEnable(audioEnable: boolean): Promise<IResponse>;
    /**.
     * 开关远端摄像头
     *
     * @param {String} id 用户id
     * @returns Promise<>
     * @example BoomMeetingExternal.muteRemoteVideoStream(id)
     */
    private static muteRemoteVideoStream;
    /**.
     * 开关远端麦克风
     *
     * @param {String} id 用户id
     * @returns Promise<>
     * @example BoomMeetingExternal.muteRemoteAudioStream(id)
     */
    private static muteRemoteAudioStream;
    /**.
     * 开关扬声器
     *
     * @returns Promise<>
     * @example BoomMeetingExternal.setLocalSpeaker()
     */
    private static setLocalSpeaker;
    /**.
     * 全员静音
     *
     * @param {Boolean} openBySelf 是否允许用户自行打开麦克风
     * @returns Promise<>
     * @example BoomMeetingExternal.setAllMuted(openBySelf)
     */
    static setAllMuted(openBySelf: boolean): Promise<unknown>;
    /**.
     * 结束全员静音
     *
     * @returns Promise<>
     * @example BoomMeetingExternal.setAllUnMuted()
     */
    static setAllUnMuted(): Promise<unknown>;
    /**
     * @internal
     */
    protected static eventMap: Map<string, (data: any) => void>;
    /**.
     * 添加事件监听
     *
     * @param {String} key 事件名称
     *  'participant-joined': 用户加入,
        'participant-left': 用户离开,
        'room-connected': 房间连接,
        'get-participants'获取会议内用户列表
        'room-error': 房间错误,
        'room-end': 房间结束, 结束类型: data.detail.releaseType 房间释放类型：release 释放房间  leave 离开房间  是否为自己结束会议:data.detail.isSelf  是自己结束: true 非自己结束false data.detail.meetingCommonConfig 偏好设置: openCamera 入会是否开启摄像头、openMicrophone 入会是否开启麦克风
        userStatsNotice:是否开启进离会通知
        'full-screen': 全屏,
        'need-secret': 需要密码,
        'change-master': 主持人变更
        'shareEvent': 分享会议, 房间号: data.detail.roomId
        'inviteEvent': 添加参会人, 房间号: data.detail.roomId
        'callUserEvent': 呼叫未入会人员,返回的呼叫人员数组: data.detail,
        'fullScreen': 最大化,
        'exitFullScreen': 退出最大化,
        'minApp': 最小化,
        'doubleClick':标头双击事件,
        'maxWindow': '全屏',
        'exitMax':'退出全屏',
        'changeClientSize':'改变会议窗口大小'
        'signalChanged' : 信号源改变 data.detail.signal, customInfo: { signals:[{ name: '摄像头1', value: 's1'}, { name: '摄像头 2 ', value: 's2' }] }
     * @param {Function} callback 回调函数
     * @example BoomMeetingExternal.on('room-end', callback)
     */
    static on(key: string, callback: (data: any) => void): void;
    static off(key: string): void;
    private static __create;
    private static createIframe;
    private static checkIframe;
    private static idConvert;
    private static _snapshot;
    private static _snapshotAll;
    private static _startRecord;
    private static _stopRecord;
    private static _notifyRecord;
    private static _notifyStopRecord;
    /**.
     * 获取boom内部分享链接
     *
     * @param {string} roomId
     * @returns {Promise}
     * @example
     */
    private static getBoomShare;
    /**.
     * 获取会中人员列表
     *
     * @returns
     * @example
     */
    private static _getParticipants;
    private static _getMaster;
    private static _evictUser;
    private static _setTheme;
    private static _statCloud;
    private static _endCloud;
    private static _setLanguage;
    /**.
     *设置摄像头的视频分辨率，要在入会之前设置！

     * @param {VideoProfile} vProfile
     * @example
     *```ts
     * BoomMeetingExternal.setup({
        appId: config.appId,
        baseURL: config.baseURL,
        domain: config.domain
      })

      BoomMeetingExternal.setVideoProfile('720p')
     *```
     */
    static setVideoProfile(vProfile: VideoProfile): void;
    /**.
     * 参会者列表有几个tab
     * join 之前设置
     *
     * @param {number} column
     * @example
     *  BoomMeetingExternal.setUserListColumns(1)
     */
    static setUserListColumns(column: number): void;
    /**.
     * 设置推流参数
     * join 之前设置
     *
     * @param {number} config
     * @example
     *  BoomMeetingExternal.setUserListColumns(1)
     */
    static setStreamConfig(config: number): void;
    /**.
     * 设置当前采用的排序规则
     *
     * @param {number} type 1 是标品排序方式 2 是自定义排序
     * @example
     *
     */
    static setSortType(type: number): void;
    /**.
     * 是否显示会议主题
     * join 之前设置
     *
     * @param {boolean} meetingTopic
     * @example
     *  BoomMeetingExternal.setMeetingTopic(false)
     */
    static setMeetingTopic(meetingTopic: boolean): void;
    /**.
     * 是否为单聊模式
     * join 之前设置 是单聊模式传true 非单聊传false
     *
     * @param {boolean} setSingle
     * @example
     *  BoomMeetingExternal.setMeetingTopic(false)
     */
    static setSingleTalk(setSingle: boolean): void;
    /**.
     * 直播结束后房间统计页面
     *
     * @param {object} options
     * @param {string} options.roomId 房间表ID
     * @param {HTMLElement} options.parentNode 统计页面挂载节点
     * @example
     *  BoomMeetingExternal.staticsPage({roomId, parentNode})
     */
    static staticsPage(options: StaticsPageOptions): boolean;
    /**.
     * 直播结束后 视频剪辑页面 和 查看剪辑列表页面
     *
     * @param {object} options
     * @param {string} options.roomId 房间表ID
     * @param {string} options.videoUrl 视频地址
     * @param {HTMLElement} options.parentNode 视频剪辑页面挂载节点
     * @returns {boolean}
     * @example
     * BoomMeetingExternal.clipPage({roomId, videoUrl, parentNode})
     */
    static clipPage(options: ClipPageOptions): boolean;
    /**
     * 课后评价管理页面
     * @param options
     * @returns
     */
    static evaluationView(options: EvaluationOptions): boolean;
    /**.
     * 开启示证
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.toggleShareScreen({enable: true, type:'camera', deviceId:''})
     */
    static toggleShareScreen(options: ShareScreenOptions): Promise<unknown>;
    /**
     *
     * @param path
     * @param suffix
     * @param parentNode
     */
    private static createBusinessIframe;
    /**
     * 创建房间
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.createMeeting({
     *     parentNode: document.getElementById('container'),
     * })
     */
    static createMeeting(options: MeetingOptions): Promise<unknown>;
    /**
     * 加入房间
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.joinMeeting({
     *     parentNode: document.getElementById('container'),
     * })
     */
    static joinMeeting(options: MeetingOptions): Promise<unknown>;
    /**
     * 预约会议
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.appointmentMeeting({
     *     parentNode: document.getElementById('container'),
     * })
     */
    static appointmentMeeting(options: MeetingOptions): Promise<unknown>;
    /**
     * 共享屏幕
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.shareScreen({
     *     parentNode: document.getElementById('container'),
     * })
     */
    static shareScreen(options: MeetingOptions): Promise<unknown>;
    /**
     * 直播
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.liveMeeting({
     *     parentNode: document.getElementById('container'),
     * })
     */
    static liveMeeting(options: MeetingOptions): Promise<unknown>;
    /**
     * 云录制
     * @param options
     * @returns Promise
     * @example
     * BoomMeetingExternal.cloudRecord({
     *     parentNode: document.getElementById('container'),
     * })
     */
    static cloudRecord(options: MeetingOptions): Promise<unknown>;
    static toggleQdtls(status: Boolean): Promise<unknown>;
}

declare global {
    interface Window {
        BoomMeetingExternal: any;
        BMQTBridge: any;
        electron: any;
    }
}

export { ClipPageOptions, ControlRoutesOptions, EvaluationOptions, IExtLoginParam, IJoinMeetingElectron, IJoinMeetingParam, ILoginParam, IMeetingControl, IMeetingControlOptions, IResponse, IRoomCreate, ISetupParam, IUserRoles, InvitationInfo, StaticsPageOptions, VideoProfile, BoomMeetingExternal as default };
