import { ChatSDK } from '@tencentcloud/chat';
export { default as TIM, default as TencentCloudChat } from '@tencentcloud/chat';
import { TRTCVideoRotation, TRTCVideoFillMode, TRTCVideoMirrorType, TRTCDeviceInfo } from 'trtc-cloud-js-sdk';
export { Rect, default as TRTCCloud, TRTCDeviceInfo, TRTCDeviceState, TRTCDeviceType, TRTCLogLevel, TRTCScreenCaptureSourceInfo, TRTCScreenCaptureSourceType, TRTCVideoEncParam, TRTCVideoFillMode, TRTCVideoMirrorType, TRTCVideoResolution, TRTCVideoResolutionMode, TRTCVideoRotation, TRTCVideoStreamType, TRTCVolumeInfo } from 'trtc-cloud-js-sdk';

interface ITUICallEngineOption {
    SDKAppID?: number;
    sdkAppID?: number;
    tim?: any;
    callkitVersion?: string;
    framework?: string;
    isFromChat?: boolean;
    language?: number;
    component?: number;
    isSharedInstance?: boolean;
}
interface ICallParam {
    userID: string;
    type: CALL_MEDIA_TYPE;
    timeout?: number;
    offlinePushInfo?: OfflinePushInfo;
    roomID?: number;
    strRoomID?: string;
    userData?: string;
}
interface IGroupCallParam {
    userIDList: string[];
    type: CALL_MEDIA_TYPE;
    groupID: string;
    timeout?: number;
    offlinePushInfo?: OfflinePushInfo;
    roomID?: number;
    strRoomID?: string;
    userData?: string;
}
interface IJoinInGroupCallParam {
    type: CALL_MEDIA_TYPE;
    groupID: string;
    roomID: number;
    strRoomID: string;
}
interface IInviteUserParam {
    userIDList: string[];
    offlinePushInfo?: OfflinePushInfo;
    timeout?: number;
    userData?: string;
}
interface ISwitchDeviceParams {
    deviceType: DEVICE_TYPE;
    deviceId: string;
}
interface ICallsParam {
    userIDList: string[];
    type: CALL_MEDIA_TYPE;
    chatGroupID?: string;
    timeout?: number;
    offlinePushInfo?: OfflinePushInfo;
    roomID?: number;
    strRoomID?: string;
    userData?: string;
}
interface IJoinParam {
    callId: string;
}
interface OfflinePushInfo {
    title?: string;
    description?: string;
    androidOPPOChannelID?: string;
    extension: string;
    ignoreIOSBadge?: boolean;
    iOSSound?: string;
    androidSound?: string;
    androidVIVOClassification?: number;
    androidXiaoMiChannelID?: string;
    androidFCMChannelID?: string;
    androidHuaWeiCategory?: string;
    isDisablePush?: boolean;
    iOSPushType?: IOSOfflinePushType;
}
declare enum IOSOfflinePushType {
    APNs = 0,
    VoIP = 1
}
interface IStopRemoteViewParam {
    userID: string;
}
declare enum CALL_MEDIA_TYPE {
    UNKNOWN = 0,
    AUDIO_CALL = 1,
    VIDEO_CALL = 2
}
declare enum LOG_LEVEL {
    NORMAL = 0,
    RELEASE = 1,
    WARNING = 2,
    ERROR = 3,
    NONE = 4
}

interface IPlayVideoOption {
    rotation?: TRTCVideoRotation;
    fillMode?: TRTCVideoFillMode;
    mirrorType?: TRTCVideoMirrorType;
    muted?: boolean;
}
interface IStartRemoteViewParam {
    userID: string;
    videoViewDomID: string;
    options?: IPlayVideoOption;
}
interface IVideoRenderParam {
    userID?: string;
    rotation?: TRTCVideoRotation;
    objectFit?: string;
    muted?: boolean;
    mirror?: boolean;
}
declare enum DEVICE_TYPE {
    CAMERA = "camera",
    SPEAKER = "speaker",
    MICROPHONES = "microphones",
    MICROPHONE = "microphone",
    AUDIO = "audio",
    VIDEO = "video"
}

declare enum TUIErrorCode {
    ERR_SUCC = 0,
    ERR_FAILED = -1,
    ERR_INVALID_PARAMETER = -1001,
    ERR_SDK_NOT_INITIALIZED = -1002,
    ERR_PERMISSION_DENIED = -1003,
    ERR_REQUIRE_PAYMENT = -1004,
    ERR_CAMERA_START_FAILED = -1100,
    ERR_CAMERA_NOT_AUTHORIZED = -1101,
    ERR_CAMERA_OCCUPIED = -1102,
    ERR_CAMERA_DEVICE_EMPTY = -1103,
    ERR_MICROPHONE_START_FAILED = -1104,
    ERR_MICROPHONE_NOT_AUTHORIZED = -1105,
    ERR_MICROPHONE_OCCUPIED = -1106,
    ERR_MICROPHONE_DEVICE_EMPTY = -1107,
    ERR_ROOM_NAME_INVALID = -2107,
    ERR_USER_NOT_EXIST = -2200,
    ERR_REQUEST_ID_INVALID = -2311
}
declare enum TUIVideoQuality {
    kVideoQuality_360p = 1,
    kVideoQuality_540p = 2,
    kVideoQuality_720p = 3,
    kVideoQuality_1080p = 4
}
declare enum TUIAudioQuality {
    kAudioProfileSpeech = 0,
    kAudioProfileDefault = 1,
    kAudioProfileMusic = 2
}
declare enum TUINetworkQuality {
    kQualityUnknown = 0,
    kQualityExcellent = 1,
    kQualityGood = 2,
    kQualityPoor = 3,
    kQualityBad = 4,
    kQualityVeryBad = 5,
    kQualityDown = 6
}
/**
 * 消息结构体
 * @typedef {object} TUINetwork
 * @property {string} userId 用户 Id
 * @property {TUINetworkQuality} quality 网络质量
 * @property {number} upLoss 上行丢包率，单位 (%) 该数值越小越好，目前仅本地用户有该信息
 * @property {TUIRole} downLoss 下行丢包率，单位 (%) 该数值越小越好，目前仅本地用户有该信息
 * @property {Number} delay 网络延迟，单位 ms，目前仅本地用户有该信息
 */
type TUINetwork = {
    userId: string;
    quality: TUINetworkQuality;
    upLoss: number;
    downLoss: number;
    delay: number;
};
/**
 * 视频编码参数
 * @typedef {object} TUIVideoEncoderParams
 * @property {number} fps 帧率设置
 * @property {number} bitrate 目标编码码率设置
 * @property {TUIVideoQuality} quality 上行视频分辨率
 * @property {TUIVideoQuality} videoResolution 上行视频分辨率（自 v1.6.0 版本开始支持，v1.6.0 之前版本请使用 quality 参数）
 * @property {TUIResolutionMode} resolutionMode 横竖屏模式
 */
type TUIVideoEncoderParams = {
    quality?: TUIVideoQuality;
    videoResolution: TUIVideoQuality;
    fps: number;
    bitrate: number;
    resolutionMode: TUIResolutionMode;
};
declare enum TUIKickedOutOfRoomReason {
    kKickedByAdmin = 0,
    kKickedByLoggedOnOtherDevice = 1,
    kKickedByServer = 2
}
declare enum TUIResolutionMode {
    kResolutionMode_Landscape = 0,
    kResolutionMode_Portrait = 1
}
type TUIDeviceInfo = {
    deviceId: string;
    deviceName: string;
    deviceProperties?: {
        supportedResolution?: {
            width: number;
            height: number;
        }[];
    };
};
/**
 * **TUIRoomEngine 事件列表**<br>
 * @namespace TUICallEvents
 * @example
 * import TUIRoomEngine, { TUICallEvents } from '@tencentcloud/tuiroom-engine-js';
 * const roomEngine = new TUIRoomEngine();
 * roomEngine.on(TUICallEvents.onError, (error) => {
 *  console.log('roomEngine.error', error);
 * })
 */
declare enum TUICallEvent {
    /**
      * @description sdk内部发生了错误
      * @memberOf module:TUICallEvent
      * @example
      * let onError = function(error) {
      *   console.log(error)
      * };
      * tuiCallEngine.on(TUICallEvent.ERROR, onError);
     */
    ERROR = "onError",
    /**
     * @description SDK 进入 ready 状态时收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let onSDKReady = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.SDK_READY, onSDKReady);
     */
    SDK_READY = "sdkReady",
    /**
     * @description 重复登陆，收到该回调说明被踢出房间
     * @memberOf module:TUICallEvent
     * @example
     * let handleOnKickedOut = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.KICKED_OUT, handleOnKickedOut);
     */
    KICKED_OUT = "onKickedOffLine",
    /**
     * @description userSig 过期事件
     * @default 'onUserSigExpired'
     * @event TUICallEvents#onUserSigExpired
     * @example
     * const roomEngine = new TUIRoomEngine();
     * roomEngine.on(TUICallEvents.onUserSigExpired, () => {
     *   console.log('roomEngine.onUserSigExpired');
     * });
     */
    onUserSigExpired = "onUserSigExpired",
    /**
     * @description 表示通话接通(仅被叫收到)，您可以通过监听这个事件来开启云端录制、内容审核等流程。
     * @memberOf module:TUICallEvent
     * @example
     * let handleOnCallBegin = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.ON_CALL_BEGIN, handleOnCallBegin);
     */
    ON_CALL_BEGIN = "onCallBegin",
    /**
     * @description 收到通话请求的回调(仅被叫收到)
     * - 注意：废弃, 请使用 ON_CALL_RECEIVED 事件。
     * @memberOf module:TUICallEvent
     * @example
     * let handleNewInvitationReceived = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.INVITED, handleNewInvitationReceived);
     */
    INVITED = "onInvited",
    /**
     * @description 收到通话请求的回调(仅被叫收到)，您可以通过监听这个事件，来决定是否显示通话接听界面。
     * @memberOf module:TUICallEvent
     * @example
     * let handleOnCallReceived = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.ON_CALL_RECEIVED, handleOnCallReceived);
     */
    ON_CALL_RECEIVED = "onCallReceived",
    /**
     * @description 如果有用户接听，那么会收到此回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleUserAccept = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.USER_ACCEPT, handleUserAccept);
     */
    USER_ACCEPT = "onUserAccept",
    /**
     * @description 如果有用户同意进入通话，那么会收到此回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleUserEnter = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.USER_ENTER, handleUserEnter);
     */
    USER_ENTER = "onUserJoin",
    /**
     * @description 如果有用户同意离开通话，那么会收到此回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleUserLeave = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.USER_LEAVE, handleUserLeave);
     */
    USER_LEAVE = "onUserLeave",
    /**
     * @description 用户拒绝通话
     *  1. 在C2C通话中，只有发起方会收到拒绝回调
     *    例如 A 邀请 B、C 进入通话，B拒绝，A可以收到该回调，但C不行
     *  2. 在IM群组通话中，所有被邀请人均能收到该回调
     *    例如 A 邀请 B、C 进入通话，B拒绝，A、C均能收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleInviteeReject = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.REJECT, handleInviteeReject);
     */
    REJECT = "onUserReject",
    /**
     * @description 邀请用户无应答
     *  1. 在C2C通话中，只有发起方会收到无人应答的回调
     *    例如 A 邀请 B、C 进入通话，B不应答，A可以收到该回调，但C不行
     *  2. 在IM群组通话中，所有被邀请人均能收到该回调
     *    例如 A 邀请 B、C 进入通话，B不应答，A、C均能收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleNoResponse = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.NO_RESP, handleNoResponse);
     */
    NO_RESP = "onUserNoResponse",
    /**
     * @description 邀请方忙线
     * @memberOf module:TUICallEvent
     * @example
     * let handleLineBusy = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.LINE_BUSY, handleLineBusy);
     */
    LINE_BUSY = "onUserLineBusy",
    /**
     * @description 作为被邀请方会收到，收到该回调说明本次通话被取消了
     * - **注意：废弃，推荐使用 ON_CALL_NOT_CONNECTED 事件**。
     * @memberOf module:TUICallEvent
     * @example
     * let handleCallingCancel = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.CALLING_CANCEL, handleCallingCancel);
     */
    CALLING_CANCEL = "onCallingCancel",
    /**
     * @description 如果通话未建立，都会抛出该事件。您可以通过监听该事件来实现类似未接来电、重置 UI 状态等显示逻辑。
     * - **注意：废弃，推荐使用 ON_CALL_NOT_CONNECTED 事件**。
     * @memberOf module:TUICallEvent
     * @example
     * let handleOnCallCanceled = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.ON_CALL_CANCELED, handleOnCallCanceled);
     */
    ON_CALL_CANCELED = "onCallCancelled",
    /**
     * @private
     * @description 收到该回调说明本次通话结束了
     * - **注意：废弃，推荐使用 ON_CALL_NOT_CONNECTED 事件**。
     * @memberOf module:TUICallEvent
     * @example
     * let handleCallingEnd = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.CALL_END, handleCallingEnd);
     */
    CALL_END = "onCallEnd",
    /**
     * @description 收到该回调说明本次通话结束了
     * @memberOf module:TUICallEvent
     * @example
     * let handleCallingEnd = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.CALLING_END, handleCallingEnd);
     */
    CALLING_END = "onCallEnd",
    /**
     * @description 远端用户开启/关闭了摄像头, 会收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleUserVideoChange = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.USER_VIDEO_AVAILABLE, handleUserVideoChange);
     */
    USER_VIDEO_AVAILABLE = "onUserVideoAvailable",
    /**
     * @description 远端用户开启/关闭了麦克风, 会收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleUserAudioChange = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.USER_AUDIO_AVAILABLE, handleUserAudioChange);
     */
    USER_AUDIO_AVAILABLE = "onUserAudioAvailable",
    /**
     * @description 远端用户说话音量调整, 会收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleUserVoiceVolumeChange = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.USER_VOICE_VOLUME, handleUserVoiceVolumeChange);
     */
    USER_VOICE_VOLUME = "onUserVoiceVolumeChanged",
    /**
     * @description 群聊更新邀请列表收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleGroupInviteeListUpdate = function(event) {
     *   console.log(event)
     * };
     * tuiCallEngine.on(TUICallEvent.GROUP_CALL_INVITEE_LIST_UPDATE, handleGroupInviteeListUpdate);
     */
    GROUP_CALL_INVITEE_LIST_UPDATE = "onGroupCallInviteeListUpdate",
    /**
     * @description 通话类型切换收到该回调
     * @memberOf module:TUICallEvent
     * @example
     * let handleCallTypeChanged = function({oldCallType, newCallType}) {
     *   console.log(oldCallType, newCallType)
     * };
     * tuiCallEngine.on(TUICallEvent.CALL_TYPE_CHANGED, handleCallTypeChanged);
     */
    CALL_TYPE_CHANGED = "onCallMediaTypeChanged",
    /**
     * @description 设备列表更新
     * @memberOf module:TUICallEvent
     * @example
     * let handleDeviceUpdated = function({ microphoneList, cameraList, currentMicrophone, currentCamera}) {
     *   console.log(microphoneList, cameraList, currentMicrophone, currentCamera)
     * };
     * tuiCallEngine.on(TUICallEvent.DEVICED_UPDATED, handleDeviceUpdated);
     */
    DEVICED_UPDATED = "onDeviceUpdated",
    /**
     * @description 用户网络质量
     * @memberOf module:TUICallEvent
     * @example
     * let handleOnUserNetworkQualityChanged = function(event) {
     *   console.log(event.networkQualityList);
     * };
     * tuiCallEngine.on(TUICallEvent.ON_USER_NETWORK_QUALITY_CHANGED, handleOnUserNetworkQualityChanged);
     */
    ON_USER_NETWORK_QUALITY_CHANGED = "onUserNetworkQualityChanged",
    MESSAGE_SENT_BY_ME = "onMessageSentByMe",
    /**
     * @description 设备变更事件
     * @memberOf module:TUICallEvent
     * @param {object} options
     * @param {string} options.deviceId 设备 Id
     * @param {any} options.type 设备类型
     * @param {any} options.state 设备变更状态
     * @example
     * tuiCallEngine.on(TUICallEvent.onDeviceChange, ({ deviceId, type, state }) => {
     *   console.log('roomEngine.onDeviceChange', deviceId, type, state);
     * });
     */
    onDeviceChange = "onDeviceChange",
    /**
     * @description 通话结束的回调，通话未接通的情况下，因为用户拒绝、忙线等原因导致的通话结束，都会回调该接口。
     * - **注意：v3.0.0 + 支持**。
     * @memberOf module:TUICallEvent
     * @example
     * tuiCallEngine.on(TUICallEvent.ON_CALL_NOT_CONNECTED, (event) => {
     *   console.log(event);
     * });
     */
    ON_CALL_NOT_CONNECTED = "onCallNotConnected",
    /**
     * @description 当一个多人通话发生邀请他人时, 处在该通话的所有人都会抛出该事件, userId 就是被邀请者
     * - **注意：v3.0.0 + 支持**。
     * @memberOf module:TUICallEvent
     * @example
     * tuiCallEngine.on(TUICallEvent.ON_USER_INVITING, (event) => {
     *   console.log(event);
     * });
     */
    ON_USER_INVITING = "onUserInviting"
}
declare enum TUIRoomDeviceMangerEvents {
    /**
     * @description 设备变更事件
     * @default 'onDeviceChange'
     * @event TUIRoomDeviceMangerEvents#onDeviceChange
     * @param {object} options
     * @param {string} options.deviceId 设备 Id
     * @param {any} options.type 设备类型
     * @param {any} options.state 设备变更状态
     * @example
     * const roomEngine = new TUIRoomEngine();
     * const deviceManager = roomEngine.getDeviceManager();
     * deviceManager.on(TUIRoomDeviceMangerEvents.onDeviceChange, ({ deviceId, type, state }) => {
     *   console.log('deviceManager.onDeviceChange', deviceId, type, state);
     * });
     */
    onDeviceChanged = "onDeviceChanged"
}
declare enum TUICamera {
    kFront = 0,
    kBack = 1
}
/**
 * 切换摄像头参数
 * @memberof SDK
 *
 * @exports TUICallCameraPosition
 * @module TUICallCameraPosition
 */
declare enum TUICallCameraPosition {
    /**
     * @description 摄像头类型 - 前置摄像头
     * @memberOf module:TRTCCallCameraPosition
     * @example
     * tuiCallEngine.switchCamera(TUICallCameraPosition.FRONT); // 切换前置摄像头
     */
    FRONT = 0,
    /**
     * @description 摄像头类型 - 后置摄像头
     * @memberOf module:TRTCCallCameraPosition
     * @example
     * tuiCallEngine.switchCamera(TUICallCameraPosition.BACK); // 切换后置摄像头
     */
    BACK = 1
}
declare enum AUDIO_PLAYBACK_DEVICE {
    EAR = 0,
    SPEAKER = 1
}
/**
 * 接入侧需要的呼叫类型列表，详细如下：
 * @memberof SDK
 *
 * @exports TUICallType
 * @module TUICallType
 */
declare const TUICallType: {
    /**
     * @description 通话类型 - 语音通话
     * @memberOf module:TUICallType
     * @example
     * let onError = function(error) {
     *   console.log(error)
     * };
     * tuiCallEngine.call({userID: 'user1', type: TUICallType.AUDIO_CALL})
     */
    AUDIO_CALL: number;
    /**
     * @description 通话类型 - 视频通话
     * @memberOf module:TUICallType
     * @example
     * let onError = function(error) {
     *   console.log(error)
     * };
     * tuiCallEngine.call({userID: 'user1', type: TUICallType.VIDEO_CALL})
     */
    VIDEO_CALL: number;
    /**
     * @description 设备类型 - 摄像头
     * @memberOf module:TUICallType
     * @example
     * let onError = function(error) {
     *   console.log(error)
     * };
     * tuiCallEngine.getDeviceList(TUICallType.DEVCIED_CARMERA) // 获取摄像头列表
     */
    DEVCIED_CAMERA: string;
    /**
     * @description 设备类型 - 麦克风
     * @memberOf module:TUICallType
     * @example
     * let onError = function(error) {
     *   console.log(error)
     * };
     * tuiCallEngine.getDeviceList(TUICallType.DEVCIED_CARMERA) // 获取麦克风列表
     */
    DEVCIED_MICROPHONES: string;
};
interface ILoginParams {
    userID: string;
    userSig: string;
    assetsPath?: string;
}
declare enum CallEndReason {
    UnKnown = 0,
    Hangup = 1,
    Reject = 2,
    NoResponse = 3,
    Offline = 4,
    LineBusy = 5,
    Canceled = 6,
    OtherDeviceAccepted = 7,
    OtherDeviceReject = 8,
    EndByServer = 9
}

declare const VIDEO_ENCODER_MAP: any;

/**
 * TUICallEngine 提供了 Call 的基本能力
 * @class TUICallEngine
 */
declare class TUICallEngine {
    static className: string;
    static instance: TUICallEngine;
    private static isWasmReady;
    private static sdkAppId;
    private static userId;
    private static userSig;
    private static Module;
    private _callEngineWASM;
    private _logger;
    private _logLevel;
    private _uniqueLoginId;
    private _isExternalTim;
    private _excludeFromHistoryMessage;
    private _localRenderFillMode;
    private _remoteRenderFillMode;
    private _callMediaType;
    tim: any;
    private _permission;
    private _devices;
    private _currentDevices;
    private _isRegisterVirtualBackgroundModelFile;
    constructor(options: ITUICallEngineOption);
    static setModule(Module: any): void;
    /**
     * @private
     * 调用 TUICallEngineWASM 的异步方法
     * @param funcName
     * @param args
     */
    private JSCallNativeFunctionPromise;
    /**
     * 创建 TUICallEngine 实例
     * @memberof TUICallEngine
     * @param {Object} options 配置
     * @param {Number} options.SDKAppID - 云通信应用的 `SDKAppID`
     * @param {ChatSDK=} options.tim - [TIM 实例](https://web.sdk.qcloud.com/im/doc/zh-cn/TIM.html)（选填）
     * - tim 参数适用于业务中已存在 TIM 实例，需要传入保证 TIM 实例唯一性
     * @example
     * let options = {
     *   SDKAppID: 0, // 接入时需要将0替换为您的云通信应用的 SDKAppID
     *   // tim 参数适用于业务中已存在 TIM 实例，需要传入保证 TIM 实例唯一性
     *   tim: tim
     * };
     * let tuiCallEngine = TUICallEngine.createInstance(options);
     */
    static createInstance(options: ITUICallEngineOption): TUICallEngine;
    static once(event: string, func: (...args: any[]) => void): void;
    /**
     * 销毁 TUICallEngine 实例
     * - 注：SDK 会先 logout，然后释放资源
     * @memberof TUICallEngine
     * @returns {Promise}
     */
    destroyInstance(): Promise<void>;
    /**
     * 登录 TUICallEngine
     * @param {object} options
     * @param {number} options.sdkAppId sdkAppId <br>
     * 在 [实时音视频控制台](https://console.cloud.tencent.com/trtc) 单击 **应用管理** > **创建应用** 创建新应用之后，即可在 **应用信息** 中获取 sdkAppId 信息。
     * @param {string} options.userId 用户ID <br>
     * 建议限制长度为32字节，只允许包含大小写英文字母(a-zA-Z)、数字(0-9)及下划线和连词符。
     * @param {string} options.userSig userSig 签名 <br>
     * 计算 userSig 的方式请参考 [UserSig 相关](https://cloud.tencent.com/document/product/647/17275)。
     * @returns {Promise<void>}
     * @example
     * // 登录 TUICallEngine
     * await TUICallEngine.login({
     *  sdkAppId: 0,   // 填写您申请的 sdkAppId
     *  userId: '',    // 填写您业务对应的 userId
     *  userSig: '',   // 填写服务器或本地计算的 userSig
     * })
     */
    login(params: ILoginParams): Promise<void>;
    /**
     * 登出接口，登出后无法再进行拨打操作
     * @memberof TUICallEngine
     * @returns {Promise}
     * @example
     * await tuiCallEngine.logout();
     */
    logout(): Promise<void>;
    /**
     * C2C邀请通话，被邀请方会收到 TUICallEvent.INVITED 事件<br>
     * - 注意：离线推送仅适用于终端（Android 或 iOS)，Web 和 微信小程序不支持。
     * @memberof TUICallEngine
     * @param {Object} params - 拨打通话配置
     * @param {String} params.userID 被邀请方 userID
     * @param {Number} params.type 0-未知， 1-语音通话，2-视频通话
     * @param {Number=} params.timeout 0为不超时, 单位 s(秒)（选填） - 默认 30s
     * @param {Number=} params.roomID 数字房间号, 范围 [1, 2147483647]。支持 v1.4.2+ 版本。
     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息。支持 v1.4.2+ 版本。
     * @param {Object=} params.offlinePushInfo  - 自定义离线消息推送（选填）-- 需 tsignaling 版本 >= 0.8.0
     * | name                 | Type    | Description    |
     * | :---                 | :---    | :---    |
     * | title                | string  | 离线推送标题（选填）  |
     * | description          | string  | 离线推送内容（选填）  |
     * | androidOPPOChannelID | string  | 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID（选填）  |
     * | extension            | string  | 离线推送透传内容（选填）（tsignaling 版本 >= 0.9.0）|
     * @returns {Promise}
     * @example
     * await tuiCallEngine.call({userID: 'user1', type: 1});
     */
    call(params: ICallParam): Promise<any>;
    /**
     * IM群组邀请通话，被邀请方会收到 TUICallEvent.INVITED 事件<br>
     * 注意：离线推送仅适用于终端（Android 或 iOS)，Web 和 微信小程序不支持。
     * @memberof TUICallEngine
     * @param {Object} params - 群聊拨打通话配置
     * @param {Array} params.userIDList 邀请列表
     * @param {Number} params.type 0-未知， 1-语音通话，2-视频通话
     * @param {String} params.groupID IM 群组 ID
     * @param {Number=} params.timeout 0为不超时, 单位 s(秒)（选填） - 默认 30s
     * @param {Number=} params.roomID 数字房间号, 范围 [1, 2147483647]
     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息
     * @param {Object=} params.offlinePushInfo  - 自定义离线消息推送（选填）-- 需 tsignaling 版本 >= 0.8.0
     * | name                 | Type    | Description    |
     * | :---                 | :---    | :---    |
     * | title                | string  | 离线推送标题（选填）  |
     * | description          | string  | 离线推送内容（选填） |
     * | androidOPPOChannelID | string  | 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID （选填） |
     * | extension            | string  | 离线推送透传内容（选填）（tsignaling 版本 >= 0.9.0）  |
     * @returns {Promise}
     * @example
     * await tuiCallEngine.groupCall({userIDList: ['user1', 'user2'], type: 1, groupID: 'IM群组 ID'});
     */
    groupCall(params: IGroupCallParam): Promise<any>;
    /**
     * 多人通话<br>
     * 注意：离线推送仅适用于终端（Android 或 iOS)，Web 和 微信小程序不支持。
     * @memberof TUICallEngine
     * @param {Object} params - 群聊拨打通话配置
     * @param {Array} params.userIDList 邀请列表
     * @param {Number} params.type 0-未知， 1-语音通话，2-视频通话
     * @param {String=} params.chatGroupID IM 群组 ID
     * @param {Number=} params.timeout 0为不超时, 单位 s(秒)（选填） - 默认 30s
     * @param {Number=} params.roomID 数字房间号, 范围 [1, 2147483647]
     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息
     * @param {Object=} params.offlinePushInfo  - 自定义离线消息推送（选填）-- 需 tsignaling 版本 >= 0.8.0
     * | name                 | Type    | Description    |
     * | :---                 | :---    | :---    |
     * | title                | string  | 离线推送标题（选填）  |
     * | description          | string  | 离线推送内容（选填） |
     * | androidOPPOChannelID | string  | 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID （选填） |
     * | extension            | string  | 离线推送透传内容（选填）（tsignaling 版本 >= 0.9.0）  |
     * @returns {Promise}
     * @example
     * await tuiCallEngine.calls({userIDList: ['user1', 'user2'], type: 1, chatGroupID: 'IM群组 ID'});
     */
    calls(params: ICallsParam): Promise<any>;
    /**
     * 当您作为被邀请方收到 TUICallEvent.INVITED 事件的回调时，可以调用该接口接听来电
     * @memberof TUICallEngine
     * @returns {Promise}
     * @example
     * tuiCallEngine.on(TUICallEvent.INVITED, () => {
     *   tuiCallEngine.accept().then(() => {
     *     //success
     *   }).catch(error => {
     *     console.warn('accept error:', error);
     *   });
     * });
     */
    accept(): Promise<any>;
    reject(): Promise<any>;
    hangup(): Promise<any>;
    /**
     * IM群组邀请通话，被邀请方会收到 TUICallEvent.INVITED 事件<br>
     * 注意：离线推送仅适用于终端（Android 或 iOS)，Web 和 微信小程序不支持。
     * @memberof TUICallEngine
     * @param {Object} params - 群聊拨打通话配置
     * @param {Array} params.userIDList 邀请列表
     * @param {Number} params.type 0-未知， 1-语音通话，2-视频通话
     * @param {String} params.groupID IM 群组 ID
     * @param {Number=} params.timeout 0为不超时, 单位 s(秒)（选填） - 默认 30s
     * @param {Number=} params.roomID 数字房间号, 范围 [1, 2147483647]
     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息
     * @param {Object=} params.offlinePushInfo  - 自定义离线消息推送（选填）-- 需 tsignaling 版本 >= 0.8.0
     * | name                 | Type    | Description    |
     * | :---                 | :---    | :---    |
     * | title                | string  | 离线推送标题（选填）  |
     * | description          | string  | 离线推送内容（选填） |
     * | androidOPPOChannelID | string  | 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID （选填） |
     * | extension            | string  | 离线推送透传内容（选填）（tsignaling 版本 >= 0.9.0）  |
     * @returns {Promise}
     * @example
     * await tuiCallEngine.groupCall({userIDList: ['user1', 'user2'], type: 1, groupID: 'IM群组 ID'});
     */
    inviteUser(params: IInviteUserParam): Promise<void>;
    /**
     * IM群组邀请通话，被邀请方会收到 TUICallEvent.INVITED 事件<br>
     * 注意：离线推送仅适用于终端（Android 或 iOS)，Web 和 微信小程序不支持。
     * @memberof TUICallEngine
     * @param {Object} params - 群聊拨打通话配置
     * @param {Array} params.userIDList 邀请列表
     * @param {Number} params.type 0-未知， 1-语音通话，2-视频通话
     * @param {String} params.groupID IM 群组 ID
     * @param {Number=} params.timeout 0为不超时, 单位 s(秒)（选填） - 默认 30s
     * @param {Number=} params.roomID 数字房间号, 范围 [1, 2147483647]
     * @param {String=} params.userData 扩展字段: 用于在邀请信令中增加扩展信息
     * @param {Object=} params.offlinePushInfo  - 自定义离线消息推送（选填）-- 需 tsignaling 版本 >= 0.8.0
     * | name                 | Type    | Description    |
     * | :---                 | :---    | :---    |
     * | title                | string  | 离线推送标题（选填）  |
     * | description          | string  | 离线推送内容（选填） |
     * | androidOPPOChannelID | string  | 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID （选填） |
     * | extension            | string  | 离线推送透传内容（选填）（tsignaling 版本 >= 0.9.0）  |
     * @returns {Promise}
     * @example
     * await tuiCallEngine.groupCall({userIDList: ['user1', 'user2'], type: 1, groupID: 'IM群组 ID'});
     */
    joinInGroupCall(params: IJoinInGroupCallParam): Promise<void>;
    /**
     * call 3.0 新增的 “中途加入” 接口
     * @param params 入参
     * @param {String} params.callId 当前通话的唯一 id
     */
    join(params: IJoinParam): Promise<void>;
    openCamera(videoViewDomID: string, isFrontCamera?: boolean): Promise<void>;
    closeCamera(): Promise<void>;
    /**
     * 切换前后置摄像头<br>
     * **Note: v3.0.0+ 支持，且该接口仅在移动端使用生效。**
     * @memberof TUICallEngine
     * @param {TUICallCameraPosition} cameraPosition 摄像头类型
     *  - TUICallCameraPosition.FRONT 前置摄像头
     *  - TUICallCameraPosition.BACK 后置摄像头
     * @example
     * await tuiCallEngine.switchCamera(TUICallCameraPosition.FRONT); // 切换前置摄像头
     * await tuiCallEngine.switchCamera(TUICallCameraPosition.BACK); // 切换后置摄像头
     */
    switchCamera(cameraPosition: TUICallCameraPosition): Promise<void>;
    /**
     * 设置视频分辨率
     * @memberof TUICallEngine
     * @param {String} profile  视频 profile
     * | 视频 Profile | 分辨率（宽 x 高）|
     * | :---       | :---           |
     * | 480p       | 640 x 480      |
     * | 720p       | 1280 x 720     |
     * | 1080p      | 1920 x 1080    |
     * - iOS Safari 不支持采集 1080p
     * - 由于设备和浏览器的限制，视频分辨率不一定能够完全匹配，在这种情况下，浏览器会自动调整分辨率使其接近 Profile 对应的分辨率。
     * - 默认使用 `480p`。
     * @returns {Promise}
     * @example
     * const profile = '720p';
     * // 设置视频质量为 720p
     * tuiCallEngine.setVideoQuality(profile).then(() => {
     *   // success
     * }).catch(error => {
     *   console.warn('setVideoQuality error:', error)
     * });
     */
    setVideoQuality(profile: string): Promise<void>;
    /**
     * 设置用户视频画面的显示模式
     * @param {IVideoRenderParam} params 显示参数
     * @param {String} params.userID 用户 ID。**不传入 userID 时, 对所有预览进行显示模式设置（包括：本地预览和所有的远端预览）**
     * @param {String} params.objectFit 视频画面显示模式。目前仅支持: 'contain' | 'cover' | 'fill'
     *  - contain 优先保证视频内容全部显示。视频尺寸等比缩放，直至视频窗口的一边与视窗边框对齐。如果视频尺寸与显示视窗尺寸不一致，在保持长宽比的前提下，将视频进行缩放后填满视窗，缩放后的视频四周会有一圈黑边。**v3.0.0 废弃**
     *  - cover 优先保证视窗被填满。视频尺寸等比缩放，直至整个视窗被视频填满。如果视频长宽与显示窗口不同，则视频流会按照显示视窗的比例进行周边裁剪或图像拉伸后填满视窗。
     *  - fill 保证视窗被填满的同时保证视频内容全部显示，但是不保证视频尺寸比例不变。视频的宽高会被拉伸至和视窗尺寸一致。
     *    播放视频流默认使用 cover 模式。
     * @param {String} params.muted 是否需要 mute 声音, **v3.0.0 废弃**
     *  - 对于本地流，muted 默认为 true，防止播放从麦克风采集的声音。
     * @param {TRTCVideoMirrorType} params.mirror 是否开启视频镜像预览
     * @param {TRTCVideoRotation} params.rotation 视频画面旋转方向
     * 注意
     *   - 对于本地音视频流，默认开启镜像预览。建议在使用前置摄像头时开启镜像，使用后置摄像头时关闭镜像。
     *   - 对于远端音视频流，默认关闭镜像预览。
     *   - 对于屏幕分享流，不支持开启镜像预览。
     *   - 该参数只对本地预览有效，推流是没有镜像效果的。
     * @examples
     * const params = {
     *  userID: '132',
     *  rotation: 0, // 旋转
     *  objectFit: 'contain',
     *  mirror: false,
     * };
     * await trtcCloud.setVideoRenderParams(params);
     */
    setVideoRenderParams(params: IVideoRenderParam): Promise<void>;
    /**
     * 打开麦克风，处于通话中的用户会收到 USER_AUDIO_AVAILABLE 回调
     * @memberof TUICallEngine
     * @returns {Promise}
     * @example
     * tuiCallEngine.openMicrophone().then(() => {
     *   // success
     * }).catch(error => {
     *   console.warn('openMicrophone error:', error)
     * });
     */
    openMicrophone(): Promise<void>;
    /**
     * 关闭麦克风，处于通话中的用户会收到 USER_AUDIO_AVAILABLE 回调
     * @memberof TUICallEngine
     * @returns {Promise}
     * @example
     * tuiCallEngine.closeMicrophone().then(() => {
     *   // success
     * }).catch(error => {
     *   console.warn('closeMicrophone error:', error)
     * });
     */
    closeMicrophone(): Promise<void>;
    startRemoteView(params: IStartRemoteViewParam): Promise<void>;
    /**
     * 停止远端画面渲染
     * @memberof TUICallEngine
     * @param {Object} params - 渲染远端视频配置
     * @param {String} params.userID 用户id
     * @returns {Promise}
     * @example
     * let promise = tuiCallEngine.stopRemoteView({userID: 'user1'});
     * promise.then(() => {
     *   //success
     * }).catch(error => {
     *   console.warn('stopRemoteView error:', error)
     * });
     */
    stopRemoteView(params: IStopRemoteViewParam): Promise<void>;
    /**
     * 开关/设置背景虚化<br>
     * **Note: v3.0.5+ 支持，暂不支持 H5，后续支持。**
     * @param {number} blurLevel 虚化等级, 0 - 表示关闭背景虚化。目前不支持 blurLevel 等级的设置，后续支持。使用时需要 blurLevel > 0
     * @memberof TUICallEngine
     * @returns {Promise}
     * @example
     * await tuiCallEngine.setBlurBackground(1);
     */
    setBlurBackground(blurLevel: number): Promise<void>;
    /**
     * 开关/设置图片背景虚化<br>
     * **Note: v3.0.5+ 支持，暂不支持 H5，后续支持。**
     * @param {string} imagePath 图片路径（可以是 url，也可以是相对路径）。imagePath = '' 表示关闭图片背景虚化
     * @memberof TUICallEngine
     * @returns {Promise}
     * @example
     * await tuiCallEngine.setVirtualBackground('https://xxx.png');
     */
    setVirtualBackground(imagePath: string): Promise<void>;
    private _setVirtualBackground;
    /**
     * 开启/关闭 TUICallEngine 的多设备登录模式 （**尊享版套餐支持**）
     * - **注意**：v2.1.1+ 才支持。
     * @param {boolean} enable 开启、关闭多设备登录. 开启: true; 关闭: false; 默认: 关闭
     * @returns {void}
     * @example
     * tuiCallEngine.enableMultiDeviceAbility(true);
     */
    enableMultiDeviceAbility(enable: boolean): void;
    /**
     * 设置当前用户基本信息（用户名、用户头像）
     *
     * @param {object} options
     * @param {string} options.nickName 用户名，必填
     * @param {string} options.avatar 用户头像，必填
     * App 管理员可以通过 [即时通信 IM 控制台 > 用户自定义字段](https://console.cloud.tencent.com/im/user-data) 新增自定义资料字段
     * 用户自定义字段生效以后，用户可以调用 setSelfInfo 接口设置自定义资料
     * @returns {Promise<void>}
     *
     * @example
     * // 设置当前用户用户名及用户头像
     * await TUICallEngine.setSelfInfo({
     *  nickName: '',     // 填写您的新用户名
     *  avatar: '',    // 填写您的新头像地址
     * })
     */
    setSelfInfo(options: {
        nickName: string;
        avatar: string;
    }): Promise<void>;
    /**
     * @memberof TUICallEngine
     * @description 设置日志级别，低于 level 的日志将不会输出。
     * @param {LOG_LEVEL} level - 日志级别
     * - 0 普通级别，日志量较多，接入时建议使用
     * - 1 主要级别，SDK 输出关键信息，默认日志等级
     * - 2 告警级别，SDK 只输出告警和错误级别的日志
     * - 3 错误级别，SDK 只输出错误级别的日志
     * - 4 无日志级别，SDK 将不打印任何日志
     * @example
     * tuiCallEngine.setLogLevel(0);
     */
    setLogLevel(level: LOG_LEVEL): void;
    /**
     * login() 方法的别名接口，参数一致
     * @memberof TUICallEngine
     * @returns {Promise}
     */
    init(params: ILoginParams): Promise<void>;
    /**
     * 监听 callEngine 的事件
     * @param event TUICallEvent
     * @param func function
     * @returns {void}
     * @example
     * const callEngine = new TUICallEngine();
     * callEngine.on(event, func);
     */
    on(event: TUICallEvent, callback: () => void, context: any): void;
    /**
     * 移除监听 callEngine 的事件
     * @param event TUICallEvent
     * @param func function
     * @returns {void}
     * @example
     * const callEngine = new TUICallEngine();
     * callEngine.off(event, func);
     */
    off(event: TUICallEvent, callback: () => void, context: any): void;
    /**
     * 获取 trtcCloud 实例
     * @returns {TRTCCloud} trtcCloud
     * web 端 trtcCloud 能力请查看：https://web.sdk.qcloud.com/trtc/webrtc/trtcCloud/doc/TRTCCloud.html
     *
     * @example
     * const callEngine = new TUICallEngine();
     * const trtcCloud = callEngine.getTRTCCloud();
     */
    getTRTCCloudInstance(): any;
    /**
     * 获取 tim 实例
     * @returns {TIM} tim
     * web 端 tim 能力请查看：https://web.sdk.qcloud.com/im/doc/zh-cn/SDK.html
     * @example
     */
    getTim(): ChatSDK;
    /**
     * 实验性接口
     * @private
     * @param jsonStr jason 字符串
     * @returns
     */
    callExperimentalAPI(jsonStr: string): Promise<void>;
    /**
     * 获取设备列表
     * @memberof TUICallEngine
     * @param {String} deviceType 设备类型
     *  - 'camera' 摄像头
     *  - 'microphones' 麦克风，后续废弃 'microphones'。v3.0.0+ 支持传入 'microphone'
     *  - 'speaker' 扬声器，v3.0.0+ 才支持该参数
     * @example
     * tuiCallEngine.getDeviceList('camera').then((devices)=>{  // 获取摄像头列表
     *  console.log(devices)
     * }).catch(error => {
     *   console.warn('getDeviceList error:', error)
     * });
     */
    getDeviceList(deviceType: DEVICE_TYPE): Promise<TRTCDeviceInfo[]>;
    /**
     * 切换摄像头或麦克风设备
     * @memberof TUICallEngine
     * @param {ISwitchDeviceParams} params
     * @param {string} params.deviceType 需要切换的设备类型
     * - 'video' 摄像头, 后续废弃 'video'。v3.0.0+ 支持传入 'camera' 切换摄像头。
     * - 'audio' 麦克风, 后续废弃 'audio'。v3.0.0+ 支持传入 'microphone' 切换麦克风。
     * - 'speaker' 扬声器, v3.0.0+ 支持
     * @param {string} params.deviceId 需要切换的设备ID
     * - 摄像头设备标识通过 {@link TUICallEngine.getDeviceList getDeviceList('camera')} 获取。
     * - 麦克风设备标识通过 {@link TUICallEngine.getDeviceList getDeviceList('microphone')} 获取。
     * - 扬声器设备标识通过 {@link TUICallEngine.getDeviceList getDeviceList('speaker')} 获取。
     * @example
     * let promise = tuiCallEngine.switchDevice({deviceType: 'camera', deviceId: cameras[0].deviceId}) // 切换设备
     * promise.then(() => {
     *   // success
     * }).catch(error => {
     *   console.warn('switchDevice error:', error)
     * });
     */
    switchDevice(params: ISwitchDeviceParams): Promise<boolean>;
    private _updateCurrentDevice;
    /**
     * 当前通话类型切换
     * - 仅支持1v1通话过程中使用
     * - 失败监听 ERROR 事件，code: 60001
     * @memberof TUICallEngine
     * @param {String} newMediaType 通话类型
     *  - 1 语音通话
     *  - 2 视频通话
     * @example
     * tuiCallEngine.switchCallMediaType(1).then(() => { // 视频通话切换语音通话
     *   // success
     * }).catch(error => {
     *   console.warn('switchCallMediaType error:', error)
     * });
     */
    switchCallMediaType(newMediaType: number): Promise<void>;
    private _checkDevicePermission;
    private _getMediaDevicesAuth;
    private _releaseStream;
    private _handleMediaError;
    private _analyzeVideoRenderParams;
    private _handleTrtcCloudBindEvent;
    private _observerFunction;
    private _onDeviceUpdated;
    private _initLogger;
    getDevicePermission(): {
        audio: boolean;
        video: boolean;
    };
    private _setDevicePermission;
}

export { AUDIO_PLAYBACK_DEVICE, CallEndReason, TUIAudioQuality, TUICallCameraPosition, TUICallEngine, TUICallEvent, TUICallType, TUICamera, TUIErrorCode, TUIKickedOutOfRoomReason, TUINetworkQuality, TUIResolutionMode, TUIRoomDeviceMangerEvents, TUIVideoQuality, VIDEO_ENCODER_MAP, TUICallEngine as default };
export type { ILoginParams, TUIDeviceInfo, TUINetwork, TUIVideoEncoderParams };
