import EventEmitter from 'events';

declare abstract class BaseSRTC {
	/**
	 * 获取sdk编译信息
	 */
	abstract buildInfo(): BuildInfo;
	/**
	 * 获取运行环境信息
	 * @returns
	 */
	abstract getEnvInfo(): any;
	/**
	 * 频道事件通知回调
	 */
	onNotifyChannelEvent?: ((event: ChannelEvent) => void) | null;
	/**
	 * 频道外im事件通知回调
	 */
	onNotifyImEvent?: ((event: ImEvent) => void) | null;
	constructor(initParams: SdkInitParams);
	/**
	 * 加入频道的version信息
	 */
	protected get joinVersion(): string;
	/**
	 * 加入频道
	 * @param token 加入频道token
	 */
	join(token: string): Promise<BaseChannelInfo>;
	/**
	 * 离开频道
	 */
	leave(): Promise<void>;
	/**
	 * 获取频道信息
	 * @returns
	 */
	getChannelInfo(): BaseChannelInfo | null;
	/**
	 * 获取某用户信息
	 * @returns
	 */
	getUserInfo(uid: string): BaseUserInfo;
	/**
	 * 获取频道内用户信息列表
	 * @returns
	 */
	getUsersInfo(map: true): Record<string, BaseUserInfo>;
	getUsersInfo(map: false): BaseUserInfo[];
	/**
	 * 订阅远端频道混音流
	 * @param filterUids 过滤音频的用户id
	 */
	subscribeRemoteAudioMixTrack(filterUids?: string[]): Promise<BaseTrack>;
	/**
	 * 订阅远端用户音频流
	 * @param uid 用户id
	 * @param id 流轨道id
	 */
	subscribeRemoteAudioTrack(uid: string, id: string): Promise<BaseTrack>;
	/**
	 * 订阅远端视频合成流
	 */
	subscribeRemoteVideoMcuTrack(): Promise<BaseTrack>;
	/**
	 * 订阅远端用户视频流
	 * @param uid 用户id
	 * @param id 流轨道id
	 */
	subscribeRemoteVideoTrack(uid: string, id: string): Promise<BaseTrack>;
	/**
	 * 取消订阅远端流
	 */
	unsubscribeRemoteTrack(track: BaseTrack): Promise<void>;
	/**
	 * 获取远端用户音视频流实例，一般用于订阅流后您没有持有返回的流实例，可以用此方法获取对应实例
	 * @param uid 用户id
	 * @param id 流轨道id，与desc二选一
	 * @param desc 流描述，与id二选一
	 */
	getRemoteTrack(uid: string, id?: string, desc?: string): BaseTrack;
	/**
	 * 启用频道外消息
	 * @param token 启用频道外消息token
	 * @returns im会话sid
	 */
	enableIm(token: string): Promise<string>;
	/**
	 * 关闭频道外消息
	 */
	disableIm(): Promise<void>;
}
declare abstract class BaseTrack extends EventEmitter {
	constructor(info: BaseTrackInfo, uid: string);
	/**
	 * 轨道id
	 */
	get id(): string;
	/**
	 * 轨道类型
	 */
	get kind(): TrackKind;
	/**
	 * 轨道描述
	 */
	get desc(): string;
	/**
	 * 获取流轨道信息
	 * @returns
	 */
	getInfo(): BaseTrackInfo;
	/**
	 * 轨道所属用户
	 * @returns
	 */
	getUid(): string;
	toString(): string;
}
declare class CommonChannelEventType {
	/** 频道自定义props更新，对应data为ChannelInfo */
	static readonly CHANNEL_UPDATE = "channel_update";
	/** 首次加入频道成功，对应data为ChannelInfo */
	static readonly JOIN_SUCCEED = "join_succeed";
	/** 自己信息被改变，对应data为UserInfo */
	static readonly ME_UPDATE = "me_update";
	/** 开始断线自动重连，无data */
	static readonly RECONNECTING = "reconnecting";
	/** 重连成功，断线重连成功后会触发 */
	static readonly RECONNECTED = "reconnected";
	/** 自己被强制离开频道，对应data为DisconnectEventData */
	static readonly DISCONNECTED = "disconnected";
	/** 其他用户加入频道，对应data为UserInfo */
	static readonly USER_JOIN = "user_join";
	/** 其他用户信息改变，对应data为UserInfo */
	static readonly USER_UPDATE = "user_update";
	/** 其他用户离开频道，对应data为UserLeaveEventData */
	static readonly USER_LEAVE = "user_leave";
	/** 其他用户发布流轨道，对应data为{ user: UserInfo, track: TrackInfo } */
	static readonly USER_TRACK_ADD = "user_track_add";
	/** 其他用户更新流轨道，对应data为{ user: UserInfo, track: TrackInfo } */
	static readonly USER_TRACK_UPDATE = "user_track_update";
	/** 其他用户删除流轨道，对应data为{ user: UserInfo, track: TrackInfo } */
	static readonly USER_TRACK_REMOVE = "user_track_remove";
	/** 频道内自定义消息，对应data为CustomMsgData */
	static readonly CUSTOM_MSG = "custom_msg";
	/** 流轨道没有数据，对应data为BaseTrack */
	static readonly TRACK_MUTED = "track_muted";
	/** 流轨道恢复数据，对应data为BaseTrack */
	static readonly TRACK_UNMUTED = "track_unmuted";
	/** 流轨道停止，对应data为BaseTrack */
	static readonly TRACK_ENDED = "track_ended";
}
/** 频道外事件类型 */
declare class CommonImEventType {
	/** 首次连接im成功，无data */
	static readonly ENABLE_SUCCEED = "enable_succeed";
	/** im开始断线自动重连，无data */
	static readonly RECONNECTING = "reconnecting";
	/** im重连成功，断线重连成功后会触发 */
	static readonly RECONNECTED = "reconnected";
	/** 自己被强制断开im，对应data为ImDisconnectEventData */
	static readonly DISCONNECTED = "disconnected";
	/** im消息，对应data为ImMsgData */
	static readonly IM_MSG = "im_msg";
}
declare class Logger {
	constructor(dp?: string, dclt?: string);
	setTarget(target: LogTarget): void;
	setLevel(level: LogLevel): void;
	debug(...args: any[]): void;
	info(...args: any[]): void;
	warn(...args: any[]): void;
	error(...args: any[]): void;
}
declare class RemoteVideoMcuTrack extends RemoteTrack {
	constructor(info: BaseTrackInfo);
}
declare class SdkError {
	/** 错误码 */
	code: number;
	/** 错误详情 */
	msg: string;
	/** 获取前缀错误码 */
	protected prefixCode(): string;
	constructor(msg: string, code?: number);
	/**
	 * 从err转化为sdkError
	 * @param err 原始error
	 * @returns
	 */
	static fromError(err: Error): SdkError;
	toString(): string;
	toJSON(): {
		code: number;
		msg: string;
	};
}
declare enum Codec {
	/** 未知编码类型 */
	Unknown = 0,
	/** h264编码 */
	H264 = 27,
	/** h265编码 */
	H265 = 36,
	/** AAC编码 */
	AAC = 15,
	/** OPUS编码 */
	OPUS = 1398100047
}
declare function dateFormat(format: string, date?: Date): string;
declare function dct(t: string): any;
declare function genNonce(len?: number): string;
declare function getHostnameFromUrl(url: string): string;
declare function isObject(value: any): boolean;
declare function isString(value: any): boolean;
declare function isWxxcx(): boolean;
declare function propAssign<T>(target: T, income: T, assigner?: Record<keyof T, (value: any, old: any) => void>): PropChangeItem<keyof T>[];
declare function retry<T>(f: () => Promise<T>, opt: {
	/** 首次执行失败后的最大重试次数，默认10次，<=0代表不限制次数 */
	maxRetries?: number;
	/** 第一次重试间隔(ms)，默认500ms，之后会以 initialDelay * 2^n 进行重试 */
	initialDelay?: number;
	/** 每次重试前的回调，e为上次失败catch到的错误，返回false则代表放弃重试，会返回canceled */
	onRetry?: (attempt: number, e?: any) => boolean | void;
}): retryCallback<T>;
declare function sleep(ms: number): Promise<void>;
/** 频道事件通知 */
export declare class ChannelEvent {
	/** 事件类型 */
	type: CommonChannelEventType;
	/** 事件携带的数据 */
	data?: any;
	constructor(type: CommonChannelEventType, data?: any);
}
/** 扩展的频道事件 */
export declare class ChannelEventType extends CommonChannelEventType {
	/** 上行弱网，无data */
	static readonly UP_WEAKNET = "up_weaknet";
	/** 上行弱网恢复，无data */
	static readonly UP_WEAKNET_RECOVER = "up_weaknet_recover";
	/** 推流失败，对应data为失败描述string */
	static readonly UP_PUSH_FAIL = "up_push_fail";
	/** 下行弱网，对应data为{track: BaseTrack} */
	static readonly DOWN_WEAKNET = "down_weaknet";
	/** 下行弱网恢复，对应data为{track: BaseTrack} */
	static readonly DOWN_WEAKNET_RECOVER = "down_weaknet_recover";
	/** 拉流播放失败，对应data为{track: BaseTrack, detail: string} */
	static readonly DOWN_PLAY_FAIL = "down_play_fail";
}
/** 频道外事件通知 */
export declare class ImEvent {
	/** 事件类型 */
	type: CommonImEventType;
	/** 事件携带的数据 */
	data?: any;
	constructor(type: CommonImEventType, data?: any);
}
/** 小程序本地流轨道 */
export declare class LocalTrack extends BaseTrack {
	/** 推流地址 */
	rtmp_push?: string;
}
/**
 * 远端混音流
 */
export declare class RemoteAudioMixTrack extends RemoteTrack {
	constructor(info: BaseTrackInfo, filterUids?: string[]);
	getFilterUids(): string[];
}
/** 小程序远端流轨道 */
export declare class RemoteTrack extends BaseTrack {
	/** 播放地址 */
	rtmp_play?: string;
	/** live-player播放器的style */
	player_style: string;
	constructor(info: BaseTrackInfo, uid: string);
	/**
	 * 更新播放器transform style
	 */
	freshPlayerStyle(containerSelector: string): Promise<void>;
}
export declare class SRTC extends BaseSRTC {
	buildInfo(): BuildInfo;
	/**
	 * 获取小程序运行环境信息
	 * @returns
	 */
	getEnvInfo(): EnvWxInfo;
	constructor(initParams: SdkInitParams);
	/**
	 * livepusher配置
	 */
	getPusherOptions(): PusherOptions;
	/**
	 * 更新推流配置
	 * @param opt
	 */
	changePusherOptions(opt: Partial<PusherOptions>): Promise<PusherOptions>;
	/**
	 * 订阅远端频道混音流
	 */
	subscribeRemoteAudioMixTrack(filterUids?: string[]): Promise<RemoteAudioMixTrack>;
	/**
	 * 订阅远端用户音频流
	 * @param uid 用户id
	 * @param id 流轨道id
	 */
	subscribeRemoteAudioTrack(uid: string, id: string): Promise<RemoteTrack>;
	/**
	 * 订阅远端视频合成流
	 */
	subscribeRemoteVideoMcuTrack(): Promise<RemoteVideoMcuTrack>;
	/**
	 * 订阅远端用户视频流
	 * @param uid 用户id
	 * @param id 流轨道id
	 */
	subscribeRemoteVideoTrack(uid: string, id: string): Promise<RemoteTrack>;
	/**
	 * 取消订阅远端流
	 */
	unsubscribeRemoteTrack(track: RemoteTrack): Promise<void>;
	getRemoteTrack(uid: string, id?: string, desc?: string): RemoteTrack;
	/**
	 * 上报live-pusher的volumenotify
	 * 你需要在live-pusher组件bindaudiovolumenotify
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html
	 */
	updatePusherVolume(detail: any): void;
	/**
	 * 上报live-pusher的error
	 * 你需要在live-pusher组件binderror
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html
	 */
	updatePusherError(detail: any): void;
	/**
	 * 上报live-pusher的netstatus
	 * 你需要在live-pusher组件bindnetstatus
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html
	 */
	updatePusherNetStatus(detail: any): void;
	/**
	 * 上报live-pusher的statechange事件
	 * 你需要在live-pusher组件bindstatechange
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html
	 */
	updatePusherStateChange(detail: any): void;
	/**
	 * 上报live-player的volumenotify
	 * 你需要在live-player音频组件bindaudiovolumenotify
	 * @param uid 流轨道的所有者
	 * @param trackId 流轨道id
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html
	 */
	updatePlayerVolume(uid: string, trackId: string, detail: any): void;
	/**
	 * 上报live-player的netstatus
	 * 你需要在live-player组件bindnetstatus
	 * @param uid 流轨道的所有者
	 * @param trackId 流轨道id
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html
	 */
	updatePlayerNetStatus(uid: string, trackId: string, detail: any): void;
	/**
	 * 上报live-player的statechange事件
	 * 你需要在live-player组件bindstatechange
	 * @param uid 流的所有者
	 * @param trackId 流轨道id
	 * @param detail 小程序的event.detail
	 * @see https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html
	 */
	updatePlayerStateChange(uid: string, trackId: string, detail: any): void;
}
/**
 * 终端类型枚举
 */
export declare enum DeviceType {
	/**
	 * 未知设备
	 */
	Unknown = 0,
	/**
	 * Windows
	 */
	Windows = 1,
	/**
	 * Android
	 */
	Android = 2,
	/**
	 * iOS
	 */
	IOS = 3,
	/**
	 * Linux
	 */
	Linux = 4,
	/**
	 * MacOS
	 */
	MacOS = 5,
	/**
	 * webrtc
	 */
	WebRTC = 6,
	/**
	 * 小程序
	 */
	XCX = 7
}
/**
 * 用户离开频道的原因
 */
export declare enum DisconnectReason {
	/** 错误 */
	Error = -1,
	/** 主动离开 */
	Self = 1,
	/** 被踢离开 */
	Kicked = 2,
	/** 被顶号 */
	Replace = 3,
	/** 心跳超时离开 */
	Timeout = 4,
	/** 频道销毁离开 */
	Destroy = 5
}
/**
 * 用户断开im的原因
 */
export declare enum ImDisconnectReason {
	/** 错误 */
	Error = -1,
	/** 主动离开 */
	Self = 1,
	/** 被踢离开 */
	Kicked = 2,
	/** 心跳超时离开 */
	Timeout = 4
}
/**
 * 日志打印等级
 */
export declare enum LogLevel {
	DEBUG = "debug",
	INFO = "info",
	WARN = "warn",
	ERROR = "error"
}
/**
 * 日志打印目标
 */
export declare enum LogTarget {
	/** 控制台打印 */
	CONSOLE = "console",
	/** 微信实时日志 */
	WXREALTIME = "wxrealtime",
	/** 不打任何日志 */
	NONE = "none"
}
/**
 * 流轨道类型
 */
export declare enum TrackKind {
	Video = "video",
	Audio = "audio"
}
export declare namespace __INNER__ {
	const BaseSRTC_I: typeof BaseSRTC;
	const CommonChannelEventType_I: typeof CommonChannelEventType;
	const isWxxcx_I: typeof isWxxcx;
	const Logger_I: typeof Logger;
	const SdkError_I: typeof SdkError;
	const propAssign_I: typeof propAssign;
	const isObject_I: typeof isObject;
	const isString_I: typeof isString;
	const sleep_I: typeof sleep;
	const retry_I: typeof retry;
	const dateFormat_I: typeof dateFormat;
	const genNonce_I: typeof genNonce;
	const getHostnameFromUrl_I: typeof getHostnameFromUrl;
	const dct_I: typeof dct;
	function hmac_I(msg: string, key: string): string;
}
/**
 * sdk编译信息
 */
export interface BuildInfo {
	/** 编译时间s */
	timestamp: number;
	/** sdk版本号 */
	version: string;
}
/**
 * 自定义消息
 */
export interface CustomMsgData {
	/** 消息命令 */
	action: string;
	/** 消息体 */
	content: any;
	/** 发送者会话id */
	sid: string;
	/** 发送者ID */
	uid: string;
	/** 频道名(如果非频道内自定义消息，为空) */
	channel: string;
	/** 是否私发 */
	private: boolean;
}
/**
 * 强制离开事件data
 */
export interface DisconnectEventData {
	/** 离开原因 */
	reason: DisconnectReason;
	/** 错误 */
	error?: any;
}
/**
 * 微信小程序环境详情
 */
export interface EnvWxInfo {
	base: WechatMiniprogram.AppBaseInfo;
	window: WechatMiniprogram.WindowInfo;
	device: WechatMiniprogram.DeviceInfo;
}
/**
 * im强制断开事件data
 */
export interface ImDisconnectEventData {
	/** 断开原因 */
	reason: ImDisconnectReason;
	/** 错误 */
	error?: any;
}
/**
 * im频道外消息
 */
export interface ImMsgData {
	/** 消息命令 */
	action: string;
	/** 消息体 */
	content: any;
	/** 发送者im会话id */
	sid: string;
	/** 发送者ID */
	uid: string;
	/** 发送者昵称 */
	name: string;
}
/**
 * 属性更改项
 */
export interface PropChangeItem<T> {
	/** 属性名 */
	prop: T;
	/** 更改后的值 */
	value: any;
	/** 更改前的值 */
	old: any;
}
/**
* 小程序推流器配置
* @see https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html
*/
export interface PusherOptions {
	/**
	 * 推流地址
	 */
	url: string;
	/**
	 * 是否开启摄像头
	 */
	enableCamera: boolean;
	/**
	 * 视频描述
	 */
	videoDesc?: string;
	/**
	 * 视频自定义属性
	 */
	videoProps?: Record<string, any>;
	/**
	 * 前置或后置摄像头
	 */
	devicePosition: "front" | "back";
	/**
	 * 推流画面是否镜像
	 */
	remoteMirror: boolean;
	/**
	 * 本地预览画面是否镜像
	 */
	localMirror: "auto" | "enable" | "disable";
	/**
	 * 视频推流宽度
	 */
	width: number;
	/**
	 * 视频推流高度
	 */
	height: number;
	/**
	 * 帧率
	 */
	fps: number;
	/**
	 * 美颜。取值范围 0-9，0表示关闭
	 */
	beautyLevel: number;
	/**
	 * 美白。取值范围 0-9，0表示关闭
	 */
	whitenessLevel: number;
	/**
	 * 是否开启麦克风
	 */
	enableMic: boolean;
	/**
	 * 音频描述
	 */
	audioDesc?: string;
	/**
	 * 音频自定义属性
	 */
	audioProps?: Record<string, any>;
	/**
	 * 是否开启音频自动增益
	 */
	enableAgc: boolean;
	/**
	 * 是否开启音频噪声抑制
	 */
	enableAns: boolean;
	/**
	 * 最小码率 kbps
	 */
	minBitrate: number;
	/**
	 * 最大码率 kbps
	 */
	maxBitrate: number;
}
/**
 * sdk构造参数
 */
export interface SdkInitParams {
	/** 日志等级 */
	logLevel?: LogLevel;
	/** 日志目标 */
	logTarget?: LogTarget;
}
/**
 * 用户离开事件data
 */
export interface UserLeaveEventData {
	/** 用户id */
	uid: string;
	/** 离开原因 */
	reason: DisconnectReason;
}
/**
 * 重试执行器函数：直接调用开始执行，.cancel()取消重试，函数失败会返回maxretry或canceled
 */
export type retryCallback<T> = (() => Promise<T>) & {
	cancel: () => void;
};
/**
 * 频道信息
 */
interface BaseChannelInfo {
	/** 应用id */
	app_id: string;
	/** 频道名 */
	channel: string;
	/** 频道扩展属性 */
	props?: Record<string, any>;
	/** 频道创建时间 */
	created_at: number;
	/** 频道更新时间 */
	updated_at: number;
}
/**
 * 流轨道信息
 */
interface BaseTrackInfo {
	/** 轨道id，在stream里唯一，在全局不一定唯一 */
	id: string;
	/** 自定义描述，如摄像头大流、摄像头小流、共享桌面流等 */
	desc: string;
	/** 轨道类型 */
	kind: TrackKind;
	/** 编码类型 */
	codec: Codec;
	/** 视频宽 */
	width: number;
	/** 视频高 */
	height: number;
	/** 视频帧率 */
	fps: number;
	/** 视频角度 */
	angle: number;
	/** 码率 */
	bitrate: number;
	/** 音频采样率 */
	sampleRate: number;
	/** 流扩展属性 */
	props?: Record<string, any>;
}
/**
 * 用户信息
 */
interface BaseUserInfo {
	/** 应用id */
	app_id: string;
	/** 用户id */
	uid: string;
	/** 会中昵称 */
	name: string;
	/** 设备类型 */
	device_type: DeviceType;
	/** 设备ID */
	device_id: string;
	/** 客户端RTCsdk版本号 */
	version: string;
	/** 用户扩展属性 */
	props?: Record<string, any>;
	/** 网络 */
	net: string;
	/** 服务分组 */
	sg: string;
	/** 更新时间 */
	updated_at: number;
	/** 频道名 */
	channel: string;
	/** 会话id */
	sid: string;
	/** 是否观众，类似研讨会观众，只收流 */
	is_audience: boolean;
	/** 进入时间 */
	join_at: number;
	/** 退出时间 */
	leave_at: number;
	/** 流轨道 */
	stream_tracks?: BaseTrackInfo[];
}

export {
	BaseChannelInfo as ChannelInfo,
	BaseTrackInfo as TrackInfo,
	BaseUserInfo as UserInfo,
	CommonImEventType as ImEventType,
};

