@agora-js/shared
Version:
internal utils shared across @agora-js packages
1,512 lines (1,428 loc) • 120 kB
TypeScript
import { AxiosRequestConfig } from 'axios';
import type { SessionDescription } from 'sdp-parser2';
import { default as UAParser_2 } from 'ua-parser-js';
export declare enum AgoraAPIName {
CREATE_CLIENT = "createClient",
CHECK_SYSTEM_REQUIREMENTS = "checkSystemRequirements",
SET_AREA = "setArea",
PRELOAD = "PRELOAD",
/**
* Track checker
*/
CHECK_VIDEO_TRACK_IS_ACTIVE = "checkVideoTrackIsActive",
CHECK_AUDIO_TRACK_IS_ACTIVE = "checkAudioTrackIsActive",
/**
* Track Creator
*/
CREATE_MIC_AUDIO_TRACK = "createMicrophoneAudioTrack",
CREATE_CUSTOM_AUDIO_TRACK = "createCustomAudioTrack",
CREATE_BUFFER_AUDIO_TRACK = "createBufferSourceAudioTrack",
CREATE_CAM_VIDEO_TRACK = "createCameraVideoTrack",
CREATE_CUSTOM_VIDEO_TRACK = "createCustomVideoTrack",
CREATE_MIC_AND_CAM_TRACKS = "createMicrophoneAndCameraTracks",
CREATE_SCREEN_VIDEO_TRACK = "createScreenVideoTrack",
/**
* Client 相关
*/
SET_ENCRYPTION_CONFIG = "Client.setEncryptionConfig",
START_PROXY_SERVER = "Client.startProxyServer",
STOP_PROXY_SERVER = "Client.stopProxyServer",
SET_PROXY_SERVER = "Client.setProxyServer",
SET_TURN_SERVER = "Client.setTurnServer",
SET_CLIENT_ROLE = "Client.setClientRole",
SET_LOW_STREAM_PARAMETER = "Client.setLowStreamParameter",
ENABLE_DUAL_STREAM = "Client.enableDualStream",
DISABLE_DUAL_STREAM = "Client.disableDualStream",
JOIN = "Client.join",
LEAVE = "Client.leave",
PUBLISH = "Client.publish",
UNPUBLISH = "Client.unpublish",
SUBSCRIBE = "Client.subscribe",
MASS_SUBSCRIBE = "Client.massSubscribe",
MASS_UNSUBSCRIBE = "Client.massUnsubscribe",
UNSUBSCRIBE = "Client.unsubscribe",
RENEW_TOKEN = "Client.renewToken",
SET_REMOTE_VIDEO_STREAM_TYPE = "Client.setRemoteVideoStreamType",
SET_STREAM_FALLBACK_OPTION = "Client.setStreamFallbackOption",
ENABLE_AUDIO_VOLUME_INDICATOR = "Client.enableAudioVolumeIndicator",
SEND_CUSTOM_REPORT_MESSAGE = "Client.sendCustomReportMessage",
INSPECT_VIDEO_CONTENT = "Client.inspectVideoContent",
STOP_INSPECT_VIDEO_CONTENT = "Client.stopInspectVideoContent",
JOIN_FALLBACK_TO_PROXY = "Client._joinFallbackToProxy",
/**
* 推流相关
*/
ON_LIVE_STREAM_WARNING = "Client.onLiveStreamWarning",
ON_LIVE_STREAM_ERROR = "Client.onLiveStreamingError",
START_LIVE_STREAMING = "Client.startLiveStreaming",
SET_LIVE_TRANSCODING = "Client.setLiveTranscoding",
STOP_LIVE_STREAMING = "Client.stopLiveStreaming",
/**
* 跨直播间连麦
*/
START_CHANNEL_MEDIA_RELAY = "Client.startChannelMediaRelay",
UPDATE_CHANNEL_MEDIA_RELAY = "Client.updateChannelMediaRelay",
STOP_CHANNEL_MEDIA_RELAY = "Client.stopChannelMediaRelay",
/**
* 配置下发
*/
REQUEST_CONFIG_DISTRIBUTE = "_config-distribute-request",
SET_CONFIG_DISTRIBUTE = "_configDistribute",
/**
* Tracks
*/
LOCAL_TRACK_SET_MUTED = "LocalTrack.setMute",
LOCAL_AUDIO_TRACK_PLAY = "LocalAudioTrack.play",
LOCAL_AUDIO_TRACK_PLAY_IN_ELEMENT = "LocalAudioTrack.playInElement",
LOCAL_AUDIO_TRACK_STOP = "LocalAudioTrack.stop",
LOCAL_AUDIO_TRACK_SET_VOLUME = "LocalAudioTrack.setVolume",
MIC_AUDIO_TRACK_SET_DEVICE = "MicrophoneAudioTrack.setDevice",
BUFFER_AUDIO_TRACK_START = "BufferSourceAudioTrack.startProcessAudioBuffer",
BUFFER_AUDIO_TRACK_STOP = "BufferSourceAudioTrack.stopProcessAudioBuffer",
BUFFER_AUDIO_TRACK_PAUSE = "BufferSourceAudioTrack.pauseProcessAudioBuffer",
BUFFER_AUDIO_TRACK_RESUME = "BufferSourceAudioTrack.resumeProcessAudioBuffer",
BUFFER_AUDIO_TRACK_SEEK = "BufferSourceAudioTrack.seekAudioBuffer",
LOCAL_VIDEO_TRACK_PLAY = "LocalVideoTrack.play",
LOCAL_VIDEO_TRACK_STOP = "LocalVideoTrack.stop",
LOCAL_VIDEO_TRACK_GET_VIDEO_VISIBLE = "LocalVideoTrack.getVideoElementVisibleStatus",
LOCAL_VIDEO_TRACK_BEAUTY = "LocalVideoTrack.setBeautyEffect",
LOCAL_VIDEO_SEND_SEI_DATA = "LocalVideoTrack.sendSeiData",
CAM_VIDEO_TRACK_SET_DEVICE = "CameraVideoTrack.setDevice",
CAM_VIDEO_TRACK_SET_ENCODER_CONFIG = "CameraVideoTrack.setEncoderConfiguration",
REMOTE_VIDEO_TRACK_PLAY = "RemoteVideoTrack.play",
REMOTE_VIDEO_TRACK_STOP = "RemoteVideoTrack.stop",
REMOTE_VIDEO_TRACK_GET_VIDEO_VISIBLE = "RemoteVideoTrack.getVideoElementVisibleStatus",
REMOTE_AUDIO_TRACK_PLAY = "RemoteAudioTrack.play",
REMOTE_AUDIO_TRACK_STOP = "RemoteAudioTrack.stop",
REMOTE_AUDIO_SET_VOLUME = "RemoteAudioTrack.setVolume",
REMOTE_AUDIO_SET_OUTPUT_DEVICE = "RemoteAudioTrack.setOutputDevice",
GET_MEDIA_STREAM_TRACK = "Track.getMediaStreamTrack",
/**
* Others
*/
STREAM_TYPE_CHANGE = "streamTypeChange",
CONNECTION_STATE_CHANGE = "connectionStateChange",
LOAD_CONFIG_FROM_LOCALSTORAGE = "loadConfigFromLocalStorage",
/**
* ImageModeration
*/
IMAGE_MODERATION_UPLOAD = "imageModerationUpload",
/**
* pc connected 恢复推流
*/
REPUB_AFTER_PC_CONNECTED = "repubAfterPCConnected",
/**
* 预加载媒体
*/
PRELOAD_MEDIA_FAILED = "preloadMediaFailed",
/**
* 远端dtls参数不匹配,需要重新建立连接
*/
MISMATCH_DTLS_PARAMETERS = "mismatchDtlsParameters"
}
export declare enum AgoraAPITag {
TRACER = "tracer"
}
export declare interface AgoraAudioReceiverStats extends ReceiverStats {
/**
* **Note:** Firefox 无法获取这个值
*/
codec?: string;
/**
* 范围为 0 ~ 1
* **Note:** Firefox 无法获取这个值
*/
outputLevel?: number;
decodingCNG?: number;
decodingCTN?: number;
decodingCTSG?: number;
decodingNormal?: number;
decodingPLC?: number;
decodingPLCCNG?: number;
expandRate?: number;
preemptiveExpandRate?: number;
secondaryDecodedRate?: number;
speechExpandRate?: number;
preferredJitterBufferMs?: number;
jitterBufferMs: number;
jitterMs: number;
/**
* **Note:** Firefox 无法获取这个值
*/
accelerateRate?: number;
receivedFrames: number;
droppedFrames: number;
bytes: number;
packets: number;
packetsLost: number;
packetsDiscarded: number;
packetLostRate: number;
ssrc: number;
concealedSamples: number;
totalSamplesReceived: number;
silentConcealedSamples: number;
concealmentEvents: number;
freezeSamples80: number;
freezeMs80: number;
freezeSamples200: number;
freezeMs200: number;
totalProcessingDelay?: number;
jitterBufferEmittedCount?: number;
avgProcessingDelayMs?: number;
}
export declare interface AgoraAudioSenderStats extends SenderStats {
/**
* **Note:** Firefox 无法获取这个值
*/
codec?: string;
/**
* 范围为 0 ~ 1
* **Note:** Firefox 无法获取这个值
*/
inputLevel?: number;
/**
* **Note:** Firefox/Safari 无法获取这个值
* 如果输入音源不是麦克风,这个值取不到
*/
aecReturnLoss?: number;
/**
* **Note:** Firefox/Safari 无法获取这个值
* 如果输入音源不是麦克风,这个值取不到
*/
aecReturnLossEnhancement?: number;
/**
* 残余回声数据只有 Chrome legacy stats 才能拿到
*/
residualEchoLikelihood?: number;
residualEchoLikelihoodRecentMax?: number;
bytes: number;
packets: number;
packetsLost: number;
packetLostRate: number;
ssrc: number;
rttMs: number;
jitterMs: number;
timestamp?: DOMHighResTimeStamp;
}
export declare interface AgoraBitrateStats {
actualEncoded: number;
transmit: number;
targetEncoded?: number;
retransmit?: number;
}
/**
* 试用范围 Chrome 58 ~ Chrome 76
*/
export declare class AgoraLegacyStatsFilter extends AgoraWebRTCStatsFilter {
private _stats;
/** 统计帧解码间隔用 */
private lastDecodeVideoReceiverStats;
protected updateStats(): Promise<void>;
private processBandwidthStats;
private processSSRCStats;
private _getStats;
private statsResponsesToObjects;
}
export declare interface AgoraPCStats {
timestamp: number;
/**
* 只有 legacy stats 能取到这 2 个参数
*/
bitrate: AgoraBitrateStats;
/**
* **Note:** Firefox 无法获取这个值
*/
sendBandwidth?: number;
/**
* **Note:** Firefox 无法获取这个值
*/
rtt?: number;
selectedCandidatePair: SelectedCandidatePairStats;
sendPacketLossRate: number;
recvPacketLossRate: number;
videoSend: AgoraVideoSenderStats[];
audioSend: AgoraAudioSenderStats[];
videoRecv: AgoraVideoReceiverStats[];
audioRecv: AgoraAudioReceiverStats[];
/**
* 只有IOS 17.4 / Safari 17.4 以下才会有值
*/
qualityLimitationReason?: QualityLimitationReason;
updateInterval?: number;
}
/**
* @ignore
*/
/** @en
* @ignore
*/
export declare class AgoraRTCError extends Error implements IAgoraRTCError {
readonly code: AgoraRTCErrorCode;
readonly message: string;
readonly data?: any;
readonly name: string;
constructor(code: AgoraRTCErrorCode, message?: string, data?: any);
toString(): string;
print(level?: "error" | "warning", logger?: any): AgoraRTCError;
throw(logger?: any): never;
}
/**
* AgoraSDK 抛出的错误的 Code
* @ignore
*/
/** @en
* @ignore
*/
export declare enum AgoraRTCErrorCode {
/**
* 所有用户无法处理的、非预期的错误都使用这个错误码
*/
UNEXPECTED_ERROR = "UNEXPECTED_ERROR",
/** 服务端返回了非预期的响应 */
UNEXPECTED_RESPONSE = "UNEXPECTED_RESPONSE",
TIMEOUT = "TIMEOUT",
/** 非法参数 */
INVALID_PARAMS = "INVALID_PARAMS",
/** 当前设备不可读 */
NOT_READABLE = "NOT_READABLE",
/** 浏览器不支持 */
NOT_SUPPORTED = "NOT_SUPPORTED",
/** 非法操作,比如在加入房间之前发布 */
INVALID_OPERATION = "INVALID_OPERATION",
/** 操作中止,比如在加入房间的中途离开房间 */
OPERATION_ABORTED = "OPERATION_ABORTED",
/** 安全策略限制 */
WEB_SECURITY_RESTRICT = "WEB_SECURITY_RESTRICT",
/** P2P信令交互过程中出现异常 */
EXCHANGE_SDP_FAILED = "EXCHANGE_SDP_FAILED",
/** P2P添加候选人过程中出现异常 */
ADD_CANDIDATE_FAILED = "ADD_CANDIDATE_FAILED",
/** DataChannel交互过程中出现异常 */
DATACHANNEL_FAILED = "DATACHANNEL_FAILED",
/**
* http post 请求相关
*/
NETWORK_ERROR = "NETWORK_ERROR",
NETWORK_TIMEOUT = "NETWORK_TIMEOUT",
NETWORK_RESPONSE_ERROR = "NETWORK_RESPONSE_ERROR",
/**
* report 相关
*/
API_INVOKE_TIMEOUT = "API_INVOKE_TIMEOUT",
/**
* Device 模块相关
*/
/** 枚举本地设备失败 */
ENUMERATE_DEVICES_FAILED = "ENUMERATE_DEVICES_FAILED",
/** 找不到指定设备 */
DEVICE_NOT_FOUND = "DEVICE_NOT_FOUND",
/**
* Electron 相关
*/
/** 无法获取 Electron 对象 */
ELECTRON_IS_NULL = "ELECTRON_IS_NULL",
/** 无法通过 Electron 获取屏幕共享源 */
ELECTRON_DESKTOP_CAPTURER_GET_SOURCES_ERROR = "ELECTRON_DESKTOP_CAPTURER_GET_SOURCES_ERROR",
/**
* Stream 相关
*/
/** init 因为其他的 init 操作而中止 */
/** chrome 屏幕共享插件没有响应 */
CHROME_PLUGIN_NO_RESPONSE = "CHROME_PLUGIN_NO_RESPONSE",
/** chrome 屏幕共享插件没有安装 */
CHROME_PLUGIN_NOT_INSTALL = "CHROME_PLUGIN_NOT_INSTALL",
/** 媒体采集的参数不支持 */
MEDIA_OPTION_INVALID = "MEDIA_OPTION_INVALID",
/** 获取媒体设备权限被拒绝 */
PERMISSION_DENIED = "PERMISSION_DENIED",
/** 浏览器不支持该 constraint */
CONSTRAINT_NOT_SATISFIED = "CONSTRAINT_NOT_SATISFIED",
/** 播放时被浏览器自动播放策略阻止 */
/** 创建小流时检测到大流没有视频轨 */
/** 屏幕共享不允许使用大小流 */
/** 轨道被禁用 */
TRACK_IS_DISABLED = "TRACK_IS_DISABLED",
/** 获取 video element 可见状态失败*/
GET_VIDEO_ELEMENT_VISIBLE_ERROR = "GET_VIDEO_ELEMENT_VISIBLE_ERROR",
/** 屏幕共享音频时用户没有点击 **分享音频** */
SHARE_AUDIO_NOT_ALLOWED = "SHARE_AUDIO_NOT_ALLOWED",
/** 使用RTCRtpEncodingParameters 进行小流编码失败*/
LOW_STREAM_ENCODING_ERROR = "LOW_STREAM_ENCODING_ERROR",
/** 设置 rtp encoding parameters 失败 */
SET_ENCODING_PARAMETER_ERROR = "SET_ENCODING_PARAMETER_ERROR",
/** Track 状态不可达 */
TRACK_STATE_UNREACHABLE = "TRACK_STATE_UNREACHABLE",
/**
* Client join 相关
*/
/** 用户提供的 Token 生成函数运行时出现错误 */
/** 通过 string uid allocate 服务返回了非法的 int uid */
INVALID_UINT_UID_FROM_STRING_UID = "INVALID_UINT_UID_FROM_STRING_UID",
/** 尝试了数次均无法获取云代理服务 */
CAN_NOT_GET_PROXY_SERVER = "CAN_NOT_GET_PROXY_SERVER",
/** 尝试了数次均无法获取 gateway 地址 */
CAN_NOT_GET_GATEWAY_SERVER = "CAN_NOT_GET_GATEWAY_SERVER",
/** 从 AP 拿到的网关列表为空 (obsolete after 4.7.0)*/
VOID_GATEWAY_ADDRESS = "VOID_GATEWAY_ADDRESS",
/** UID 冲突,重复的 UID */
UID_CONFLICT = "UID_CONFLICT",
/** multi unilbs 服务,响应解析错误 */
MULTI_UNILBS_RESPONSE_ERROR = "MULTI_UNILBS_RESPONSE_ERROR",
/** 更新 Ticket 请求失败 */
UPDATE_TICKET_FAILED = "UPDATE_TICKET_FAILED",
/** join 过程中 TOKEN 过期了 */
TOKEN_EXPIRE = "TOKEN_EXPIRE",
/**
* Client publish/unpublish 相关
*/
/** 传入了非法的 local track */
INVALID_LOCAL_TRACK = "INVALID_LOCAL_TRACK",
/** 传入了非法的 track */
INVALID_TRACK = "INVALID_TRACK",
/** replaceTrack 等操作时找不到指定的 sender */
SENDER_NOT_FOUND = "SENDER_NOT_FOUND",
/** p2p 建立相关 */
CREATE_OFFER_FAILED = "CREATE_OFFER_FAILED",
SET_ANSWER_FAILED = "SET_ANSWER_FAILED",
ICE_FAILED = "ICE_FAILED",
PC_CLOSED = "PC_CLOSED",
SENDER_REPLACE_FAILED = "SENDER_REPLACE_FAILED",
/** 获取本地RTP能力失败 */
GET_LOCAL_CAPABILITIES_FAILED = "GET_LOCAL_CAPABILITIES_FAILED",
GET_LOCAL_CONNECTION_PARAMS_FAILED = "GET_LOCAL_CONNECTION_PARAMS_FAILED",
SUBSCRIBE_FAILED = "SUBSCRIBE_FAILED",
UNSUBSCRIBE_FAILED = "UNSUBSCRIBE_FAILED",
/** 网关抛出的 P2P 断开 */
GATEWAY_P2P_LOST = "GATEWAY_P2P_LOST",
NO_ICE_CANDIDATE = "NO_ICE_CANDIDATE",
/** 不允许发布多个视频轨道 */
CAN_NOT_PUBLISH_MULTIPLE_VIDEO_TRACKS = "CAN_NOT_PUBLISH_MULTIPLE_VIDEO_TRACKS",
EXIST_DISABLED_VIDEO_TRACK = "EXIST_DISABLED_VIDEO_TRACK",
/**
* Client subscribe/unsubscribe 相关
*/
/** 找不到指定的订阅用户 */
INVALID_REMOTE_USER = "INVALID_REMOTE_USER",
/** 远端用户没有发布 */
REMOTE_USER_IS_NOT_PUBLISHED = "REMOTE_USER_IS_NOT_PUBLISHED",
/** 相同流的上一个订阅还没有完成 */
/**
* Client 其他
*/
/** 自定义事件上报失败,通常是因为网络原因 */
CUSTOM_REPORT_SEND_FAILED = "CUSTOM_REPORT_SEND_FAILED",
/** 自定义上报太频繁 */
CUSTOM_REPORT_FREQUENCY_TOO_HIGH = "CUSTOM_REPORT_FREQUENCY_TOO_HIGH",
/**
* Stream 混音相关
*/
/** 下载在线音频文件失败 */
FETCH_AUDIO_FILE_FAILED = "FETCH_AUDIO_FILE_FAILED",
/** 读取本地 音频文件失败*/
READ_LOCAL_AUDIO_FILE_ERROR = "READ_LOCAL_AUDIO_FILE_ERROR",
/** 解码音频文件失败 */
DECODE_AUDIO_FILE_FAILED = "DECODE_AUDIO_FILE_FAILED",
/** 音效的 `soundID` 发生冲突 */
/** 找不到指定的音效 ID */
/**
* Gateway 操作相关
*/
/** 请求网关时 WS 断开 */
WS_ABORT = "WS_ABORT",
/** 请求网关前网关就已经断开 */
WS_DISCONNECT = "WS_DISCONNECT",
WS_ERR = "WS_ERR",
/** p2p 拓展通道断开 */
EXTERNAL_SIGNAL_ABORT = "EXTERNAL_SIGNAL_ABORT",
/**
* Live Streaming 相关
*/
/** 无法和推流后台建立连接 */
/** 推流任务已经存在 */
LIVE_STREAMING_TASK_CONFLICT = "LIVE_STREAMING_TASK_CONFLICT",
/** 推流/拉流参数错误 */
LIVE_STREAMING_INVALID_ARGUMENT = "LIVE_STREAMING_INVALID_ARGUMENT",
/** 推流/拉流服务内部错误 */
LIVE_STREAMING_INTERNAL_SERVER_ERROR = "LIVE_STREAMING_INTERNAL_SERVER_ERROR",
/** 推流 URL 被占用 */
LIVE_STREAMING_PUBLISH_STREAM_NOT_AUTHORIZED = "LIVE_STREAMING_PUBLISH_STREAM_NOT_AUTHORIZED",
/** 在非转码推流中调用了转码参数 */
LIVE_STREAMING_TRANSCODING_NOT_SUPPORTED = "LIVE_STREAMING_TRANSCODING_NOT_SUPPORTED",
/** 推流的目标 CDN 出现错误导致推流失败 */
LIVE_STREAMING_CDN_ERROR = "LIVE_STREAMING_CDN_ERROR",
/** 推流超时,请确认目标流是否存在 */
LIVE_STREAMING_INVALID_RAW_STREAM = "LIVE_STREAMING_INVALID_RAW_STREAM",
/** 推流超过 10 路流 */
LIVE_STREAMING_WARN_STREAM_NUM_REACH_LIMIT = "LIVE_STREAMING_WARN_STREAM_NUM_REACH_LIMIT",
/** 推流中的背景图片或者水印地址无法拉取(不影响推流流程) */
LIVE_STREAMING_WARN_FAILED_LOAD_IMAGE = "LIVE_STREAMING_WARN_FAILED_LOAD_IMAGE",
/** 推流请求太频繁(不影响推流流程) */
LIVE_STREAMING_WARN_FREQUENT_REQUEST = "LIVE_STREAMING_WARN_FREQUENT_REQUEST",
/**
* WebGL/美颜相关
*/
/** WebGL 内部错误 */
WEBGL_INTERNAL_ERROR = "WEBGL_INTERNAL_ERROR",
/** 美颜内部错误 */
BEAUTY_PROCESSOR_INTERNAL_ERROR = "BEAUTY_PROCESSOR_INTERNAL_ERROR",
/**
* Cross Channel 相关
*/
/** 等待 status 回调出错 */
CROSS_CHANNEL_WAIT_STATUS_ERROR = "CROSS_CHANNEL_WAIT_STATUS_ERROR",
/** 服务器加入源频道失败 */
CROSS_CHANNEL_FAILED_JOIN_SRC = "CROSS_CHANNEL_FAILED_JOIN_SEC",
/** 服务器加入目标频道失败 */
CROSS_CHANNEL_FAILED_JOIN_DEST = "CROSS_CHANNEL_FAILED_JOIN_DEST",
/** 源频道发送数据失败 */
CROSS_CHANNEL_FAILED_PACKET_SENT_TO_DEST = "CROSS_CHANNEL_FAILED_PACKET_SENT_TO_DEST",
/** 服务器回应出错 */
CROSS_CHANNEL_SERVER_ERROR_RESPONSE = "CROSS_CHANNEL_SERVER_ERROR_RESPONSE",
/**
* AVC SEI 相关
*/
/** 需要编码的 SEI 数据超过了最大大小 */
METADATA_OUT_OF_RANGE = "METADATA_OUT_OF_RANGE",
LOCAL_AEC_ERROR = "LOCAL_AEC_ERROR",
/** 插件不合法 */
INVALID_PLUGIN = "INVALID_PLUGIN",
/** 抛出断开P2P的错误来让未执行完成的P2P操作结束*/
DISCONNECT_P2P = "DISCONNECT_P2P",
/** imageData转换为Blob时失败 */
CONVERTING_IMAGEDATA_TO_BLOB_FAILED = "CONVERTING_IMAGEDATA_TO_BLOB_FAILED",
CONVERTING_VIDEO_FRAME_TO_BLOB_FAILED = "CONVERTING_VIDEO_FRAME_TO_BLOB_FAILED",
/** datachannel相关 */
INIT_DATACHANNEL_TIMEOUT = "INIT_DATACHANNEL_TIMEOUT",
CREATE_DATACHANNEL_ERROR = "CREATE_DATACHANNEL_ERROR",
DATACHANNEL_CONNECTION_TIMEOUT = "DATACHANNEL_CONNECTION_TIMEOUT",
PROHIBITED_OPERATION = "PROHIBITED_OPERATION",
/** 鉴黄上传失败 */
IMAGE_MODERATION_UPLOAD_FAILED = "IMAGE_MODERATION_UPLOAD_FAILED",
/** p2p datastream传输消息失败 */
P2P_MESSAGE_FAILED = "P2P_MESSAGE_FAILED"
}
export declare class AgoraSpecStatsFilter extends AgoraWebRTCStatsFilter {
private _stats;
private report;
/**
* spec stats 没有发送/接受帧率统计,手动统计
*/
/** 统计帧解码间隔 **/
private lastDecodeVideoReceiverStats;
private lastVideoFramesRecv;
private lastVideoFramesSent;
private lastVideoFramesDecode;
private lastVideoFramesOutput;
private lastVideoJBDelay;
private lastAudioJBDelay;
/**
* spec stats 没有发送码率统计,手动统计
* key 为 ssrc
*/
private mediaBytesSent;
private mediaBytesRetransmit;
private mediaBytesTargetEncode;
private lastDecodeAudioReceiverStats;
private lastAudioConcealment;
/** 统计平均解码耗时,每 60 帧更新一次 */
private lastEncoderMs;
protected updateStats(): Promise<void>;
getSelectedCandidatePair(): Promise<IceCandidatePair>;
private processCandidatePairStats;
private processCandidateStats;
private processAudioInboundStats;
private calculateAudioFreeze;
private processVideoInboundStats;
private processVideoOutboundStats;
private processAudioOutboundStats;
private findRemoteStatsId;
private processVideoMediaSource;
private processAudioMediaSource;
private processVideoTrackSenderStats;
private processVideoTrackReceiverStats;
private processAudioTrackSenderStats;
private processAudioTrackReceiverStats;
private processRemoteInboundStats;
private getCodecFromCodecStats;
/** from https://docs.google.com/document/d/1z-D4SngG36WPiMuRvWeTMN7mWQXrf1XKZwVl3Nf1BIE/edit */
private updateSendBitrate;
}
export declare interface AgoraVideoReceiverStats extends ReceiverStats {
/**
* **Note:** Firefox 无法获取这个值
*/
codec?: string;
targetDelayMs?: number;
renderDelayMs?: number;
currentDelayMs?: number;
minPlayoutDelayMs?: number;
maxDecodeMs?: number;
/**
* **Note:** Firefox 和 Safari 无法获取这个值
*/
decodeMs?: number;
/**
* **Note:** Firefox 无法获取这个值
*/
receivedFrame?: VideoFrameState;
/**
* **Note:** Firefox 无法获取这个值
*/
decodedFrame?: VideoFrameState;
/**
* **Note:** Firefox 无法获取这个值
*/
outputFrame?: VideoFrameState;
/**
* **Note:** Firefox 无法获取这个值
*/
jitterBufferMs?: number;
firsCount: number;
nacksCount: number;
plisCount: number;
framesDecodeCount: number;
framesDroppedCount: number;
/**
* 总卡顿时间(s)
* https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats-totalfreezesduration
*/
totalFreezesDuration?: number;
/**
* 距离上一帧解码的时间间隔(ms)
*/
framesDecodeInterval: number;
/**
* 总解码卡顿时长(解码间隔 > 500ms)
*/
framesDecodeFreezeTime: number;
decodeFrameRate: number;
/**
* 实际送入渲染的帧率,不一定等于解码帧率
*/
outputFrameRate: number;
/**
* **Note:** Firefox/LegacyChrome 无法获取
*/
framesReceivedCount?: number;
/**
* **Note:** 这个值为 Firefox 专有
*/
framesRateFirefox?: number;
bytes: number;
packets: number;
packetsLost: number;
packetLostRate: number;
ssrc: number;
qpSumPerFrame: number;
totalInterFrameDelay?: number;
totalSquaredInterFrameDelay?: number;
/**
* https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats-packetsdiscarded
*/
packetsDiscarded?: number;
framesAssembledFromMultiplePackets?: number;
totalProcessingDelay?: number;
avgDecodeMs?: number;
avgFramesAssembledFromMultiplePacketsMs?: number;
avgProcessingDelayMs?: number;
avgInterFrameDelayMs?: number;
totalAssemblyTime?: number;
keyFramesDecoded?: number;
}
export declare interface AgoraVideoSenderStats extends SenderStats {
/**
* **Note:** Firefox 无法获取这个值
*/
codec?: string;
/**
* **Note:** Firefox/Safari 无法获取这个值
*/
avgEncodeMs?: number;
/** "none" / "cpu" / "bandwidth" / "other" */
adaptionChangeReason?: "none" | "cpu" | "bandwidth" | "other";
/**
* **Note:** Firefox/Safari 无法获取这个值
*/
inputFrame?: VideoFrameState;
/**
* **Note:** Firefox 无法获取这个值
*/
sentFrame?: VideoFrameState;
firsCount: number;
nacksCount: number;
plisCount: number;
frameCount: number;
bytes: number;
packets: number;
packetsLost: number;
packetLostRate: number;
ssrc: number;
rttMs: number;
jitterMs: number;
qpSumPerFrame: number;
timestamp?: DOMHighResTimeStamp;
/** 描述编解码器(主要是视频编解码器)支持的可扩展性模式 */
scalabilityMode?: ScalabilityMode;
/**
* only for video
* Huge frames, by definition, are frames that have an encoded size at least 2.5 times the average size of the frames.
*/
hugeFramesSent?: number;
keyFramesEncoded?: number;
targetBitrate?: number;
}
export declare abstract class AgoraWebRTCStatsFilter {
onFirstVideoReceived?: (ssrcId: number) => void;
onFirstVideoDecoded?: (ssrcId: number, width: number, height: number) => void;
onFirstAudioReceived?: (ssrcId: number) => void;
onFirstVideoDecodedTimeout?: (ssrcId: number) => void;
/**
* Firefox 目前不会触发此回调
*/
onFirstAudioDecoded?: (ssrcId: number) => void;
onSelectedLocalCandidateChanged?: (cur: CandidateStats, prev: CandidateStats) => void;
onSelectedRemoteCandidateChanged?: (cur: CandidateStats, prev: CandidateStats) => void;
/**
* Flag used to tell if we can use the stats info. to determine freeze case.
*/
videoIsReady: boolean;
videoIsReady2: Record<number, boolean>;
protected pc?: RTCPeerConnection;
protected options: StatsFilterOptions;
protected intervalTimer: number;
protected stats: AgoraPCStats;
protected isFirstVideoReceived: Record<number, boolean>;
protected isFirstVideoDecoded: Record<number, boolean>;
protected isFirstAudioReceived: Record<number, boolean>;
protected isFirstAudioDecoded: Record<number, boolean>;
protected isFirstVideoDecodedTimeout: Record<number, boolean>;
private lossRateWindowStats;
constructor(pc: RTCPeerConnection, options: StatsFilterOptions);
getStats(): AgoraPCStats;
getSelectedCandidatePair(): Promise<IceCandidatePair>;
setVideoIsReady(isReady: boolean): void;
setVideoIsReady2(ssrcId: number, isReady: boolean): void;
getVideoIsReady(ssrcId: number): boolean;
setIsFirstAudioDecoded(isFirstAudioDecoded: boolean): void;
destroy(): void;
/** 由上层统一计算丢包率 */
protected calcLossRate(stats: AgoraPCStats): void;
protected abstract updateStats(): Promise<void>;
}
export declare const appendBuffer: (buffer1: Uint8Array, buffer2: Uint8Array) => Uint8Array<ArrayBuffer>;
export declare function atom(className: string, mutexPropertyKey: string): <T extends Record<string, any>>(target: T, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any>;
/**
* 观众延时级别。仅在用户角色为 `"audience"` 时生效。
* - `1`: 低延时。
* - `2`: (默认)超低延时。
* @public
*/
/** @en
*
* The latency level of an audience member in a live interactive streaming. Takes effect only when the user role is `"audience"`.
* - `1`: Low latency.
* - `2`: (Default) Ultra low latency.
*/
export declare enum AudienceLatencyLevelType {
/**
* 低延时。
*/
/** @en
* Low latency.
*/
AUDIENCE_LEVEL_LOW_LATENCY = 1,// 只对audiene有效,默认将听众的延迟(音频和视频)扩展到音视频延迟 1.2s
/**
* 超低延时。
*/
/** @en
* Ultra-low latency.
*/
AUDIENCE_LEVEL_ULTRA_LOW_LATENCY = 2,// 只对audience有效,默认将听众的延迟(音频和视频)扩展到音视频延迟 500ms
/**
* @ignore
*/
/** @en
* @ignore
*/
AUDIENCE_LEVEL_SYNC_LATENCY = 3
}
export declare enum AudioCodec {
opus = "opus",
pcma = "pcma",
pcmu = "pcmu",
g722 = "g722"
}
export declare function base64ToUint8Array(base64Str: string): Uint8Array;
export declare interface BrowserInfo {
name: BrowserName | string;
os: BrowserOS | string | null;
version: string;
browserVersion?: string;
osVersion?: string;
/**
* Possible type:
* console, mobile, tablet, smarttv, wearable, embedded
* currently only focus on mobile
* link: https://github.com/duskload/react-device-detect/blob/master/src/lib/types.js
*/
deviceType?: string;
}
export declare enum BrowserName {
CHROME = "Chrome",
SAFARI = "Safari",
EDGE = "Edge",
FIREFOX = "Firefox",
OPERA = "OPR",
QQ = "QQBrowser",
WECHAT = "MicroMessenger"
}
export declare enum BrowserOS {
WIN_10 = "Windows 10",
WIN_81 = "Windows 8.1",
WIN_8 = "Windows 8",
WIN_7 = "Windows 7",
WIN_VISTA = "Windows Vista",
WIN_SERVER_2003 = "Windows Server 2003",
WIN_XP = "Windows XP",
WIN_2000 = "Windows 2000",
ANDROID = "Android",
HARMONY_OS = "HarmonyOS",
OPEN_BSD = "Open BSD",
SUN_OS = "Sun OS",
LINUX = "Linux",
IOS = "iOS",
MAC_OS = "Mac OS",
CHROMIUM_OS = "Chromium OS",
QNX = "QNX",
UNIX = "UNIX",
BEOS = "BeOS",
OS_2 = "OS/2",
SEARCH_BOT = "Search Bot"
}
export declare function bufferToStr(buffer: ArrayBuffer, base: number): string;
/**
* Agora Web SDK 的编译信息。
* @public
*/
export declare const BUILD: string;
/**
* 因为 Typescript 的 bug,导致无法用 class 继承 Promise
* 这里只能写脏点了
* https://github.com/Microsoft/TypeScript/issues/15202
*/
export declare interface CancelablePromise<T> extends Promise<T> {
cancel: () => void;
}
export declare interface CandidateStats {
/**
* Safari lack of `address` field.
*/
address: string;
candidateType: RTCIceCandidateType | "unknown";
id: string;
port: number;
priority: number;
protocol: string;
type: string;
relayProtocol?: string;
}
/**
* 比较 2 个 Object 是否相等
* **Note:** 不会递归比较,只会比较一层
*/
export declare function checkIsEqual(a: any, b: any): boolean;
export declare function checkValidArray(array: any, name: string): void;
/**
* 所有的 check function,如果 check 失败,直接 throw error
*/
export declare function checkValidBoolean(value: any, name: string): void;
export declare function checkValidConstrainLong(num: any, name: string): void;
export declare function checkValidEnum<T>(value: any, name: string, list: T[]): void;
export declare function checkValidNumber(num: any, name: string, min?: number, max?: number, forceInteger?: boolean): void;
export declare function checkValidString(string: any, name: string, lenMin?: number, lenMax?: number, ascii?: boolean): void;
/**
* @ignore
*/
/** @en
* @ignore
*/
export declare type CheckVisibleResult = VisibleResultInner | VisibleHiddenResult;
declare type CheckVisibleResultInner = VisibleResultInner | VisibleHiddenResultInner;
/**
* 用于控制客户端行为的接口。
*
* 在调用 {@link createClient} 创建客户端对象时,你需要配置该接口。
*
* > [mode]{@link ClientConfig.mode} 和 [codec]{@link ClientConfig.codec} 属性必须设置。
* @public
*/
/** @en
* Interface for defining the behavior of a web client.
*
* You need to configure it when calling the {@link createClient} method to create a web client.
*
* > The [mode]{@link ClientConfig.mode} and [codec]{@link ClientConfig.codec} properties are required.
*/
export declare interface ClientConfig {
/**
* 浏览器使用的编码格式,有以下选择:
* - `"vp8"`: 浏览器使用 VP8 编码。
* - `"h264"`: 浏览器使用 H.264 编码。
* - `"vp9"`: (Beta) 浏览器使用 VP9 编码。
* - `"av1"`: (Beta) 浏览器使用 AV1 编码。
*
* > Safari 12.1 及之前版本不支持 VP8 编码。
*/
/** @en
* The codec that the Web browser uses for encoding.
* - `"vp8"`: Use VP8 for encoding.
* - `"h264"`: Use H.264 for encoding.
* - `"vp9"`: (Beta) Use VP9 for encoding.
* - `"av1"`: (Beta) Use AV1 for encoding.
*
* > Safari 12.1 or earlier does not support the VP8 codec.
*/
codec: SDK_CODEC;
/**
* @ignore
*/
/** @en
* @ignore
*/
audioCodec?: SDK_AUDIO_CODEC;
/**
* 频道场景。
*
* Agora Web SDK 需知道 app 的使用场景(例如通信场景或直播场景),从而使用不同的优化手段。
*
* 声网频道支持以下场景:
* - `"live"`: 直播场景,有主播和观众两种用户角色,可以通过 [setClientRole]{@link IAgoraRTCClient.setClientRole} 方法设置用户角色为主播或观众。主播可以发布和订阅音视频轨道,而观众只能订阅音视频轨道,无法发布。
* - `"rtc"`: 通信场景,用于常见的一对一通话或群聊,频道中的任何用户可以自由说话。
*/
/** @en
* The channel profile.
*
* The SDK differentiates channel profiles and applies different optimization algorithms accordingly. For example, it prioritizes smoothness and low latency for a video call, and prioritizes video quality for a video streaming.
*
* The SDK supports the following channel profiles:
* - `"live"`: Sets the channel profile as live streaming. You need to go on to call [setClientRole]{@link IAgoraRTCClient.setClientRole} to set the client as either a host or an audience. A host can send and receive audio or video, while an audience can only receive audio or video.
* - `"rtc"`: Sets the channel profile as communication. It is used for a one-on-one call or a group call where all users in the channel can converse freely.
*/
mode: SDK_MODE;
/**
* 直播场景中([mode]{@link ClientConfig.mode} 为 `"live"` 时)的用户角色。
*
* 用户角色确定用户在 SDK 层的权限,包含是否可以发布和订阅音视频轨道、是否可以推流到 CDN。用户角色有 `"host"`(主播)和 `"audience"`(观众)。主播既可发布轨道,也可订阅轨道;观众不能进行 {@link publish} 操作。直播场景中的用户角色默认为观众。如需发布音视频,必须将角色角色为主播。
*
* 在创建客户端之后,你可以随时调用 {@link setClientRole} 来改变用户角色。
*/
/** @en
* The user role in a live interactive streaming (when [mode]{@link ClientConfig.mode} is `"live"`).
*
* The user role determines the permissions that the SDK grants to a user, such as permission to publish local streams, subscribe to remote streams, and push streams to a CDN address. You can set the user role as `"host"` or `"audience"`. A host can publish and subscribe to tracks, while an audience member can only subscribe to tracks. The default role in a live streaming is `"audience"`. Before publishing tracks, you must set the user role as `"host"`.
*
* After creating a client, you can call {@link setClientRole} to switch the user role.
*/
role?: ClientRole;
/**
* 用户角色的具体设置,包含用户级别。
*
* 用户级别确定用户在其角色权限范围内可以操作和享受到的服务级别。例如对于观众,选择接收低延时还是超低延时的视频流。不同的级别会影响计费。
*/
/** @en
* The detailed options of the user role, including user level.
*
* The user level determines the level of services that a user can enjoy within the permissions of the user's role. For example, an audience can choose to receive remote streams with low latency or ultra low latency. Levels affect prices.
*/
clientRoleOptions?: ClientRoleOptions;
/**
* @ignore
* HTTP 代理服务器域名。
*
* Agora Web SDK 还提供 [startProxyServer]{@link IAgoraRTCClient.startProxyServer} 方法支持云代理服务,详见使用云代理。
*/
/** @en
* @ignore
*/
proxyServer?: string;
/**
* @ignore
* TURN 服务器设置。
*
* Agora Web SDK 还提供 [startProxyServer]{@link IAgoraRTCClient.startProxyServer} 方法支持云代理服务,详见使用云代理。
*/
/** @en
* @ignore
*/
turnServer?: TurnServerConfig;
/**
* @ignore
* SDK 内 HTTP/HTTPS 请求的重试策略。
*
* 关于重试策略的详细信息请参考 [RetryConfiguration]{@link RetryConfiguration}。
*/
/** @en
* @ignore
*/
httpRetryConfig?: RetryConfiguration;
/**
* @ignore
* SDK 内 WebSocket 连接的重试策略。
*
* 关于重试策略的详细信息请参考 [RetryConfiguration]{@link RetryConfiguration}。
*/
/** @en
* @ignore
*/
websocketRetryConfig?: RetryConfiguration;
/**
* @internal
* 暂时不开放给用户配置
* 如果请求网关时网关断开,打开这个配置会等待网关恢复而不是直接抛错,默认开启
*/
forceWaitGatewayResponse?: boolean;
}
export declare enum ClientEvents {
PEERCONNECTION_STATE_CHANGE = "peerconnection-state-change",
AUDIO_METADATA = "audio-metadata",
AUDIO_PTS = "audio-pts",
CONNECTION_STATE_CHANGE = "connection-state-change",
MEDIA_RECONNECT_START = "media-reconnect-start",
MEDIA_RECONNECT_END = "media-reconnect-end",
IS_USING_CLOUD_PROXY = "is-using-cloud-proxy",
USER_JOINED = "user-joined",
USER_LEAVED = "user-left",
USER_PUBLISHED = "user-published",
USER_UNPUBLISHED = "user-unpublished",
USER_INFO_UPDATED = "user-info-updated",
CLIENT_BANNED = "client-banned",
CHANNEL_MEDIA_RELAY_STATE = "channel-media-relay-state",
CHANNEL_MEDIA_RELAY_EVENT = "channel-media-relay-event",
VOLUME_INDICATOR = "volume-indicator",
CRYPT_ERROR = "crypt-error",
ON_TOKEN_PRIVILEGE_WILL_EXPIRE = "token-privilege-will-expire",
ON_TOKEN_PRIVILEGE_DID_EXPIRE = "token-privilege-did-expire",
NETWORK_QUALITY = "network-quality",
STREAM_TYPE_CHANGED = "stream-type-changed",
STREAM_FALLBACK = "stream-fallback",
RECEIVE_METADATA = "receive-metadata",
STREAM_MESSAGE = "stream-message",
LIVE_STREAMING_ERROR = "live-streaming-error",
LIVE_STREAMING_WARNING = "live-streaming-warning",
EXCEPTION = "exception",
ERROR = "error",
P2P_LOST = "p2p_lost",
JOIN_FALLBACK_TO_PROXY = "join-fallback-to-proxy",
CHANNEL_FALLBACK_TO_WEBSOCKET = "channel-fallback-to-websocket",
MEDIA_CONNECTION_TYPE_CHANGE = "media-connection-type-change",
PUBLISHED_USER_LIST = "published-user-list",
/** @internal */
CONTENT_INSPECT_CONNECTION_STATE_CHANGE = "content-inspect-connection-state-change",
/** @internal */
CONTENT_INSPECT_ERROR = "content-inspect-error",
/** @internal */
CONTENT_INSPECT_RESULT = "content-inspect-result",
IMAGE_MODERATION_CONNECTION_STATE_CHANGE = "image-moderation-connection-state-change"
}
/**
* 用户角色。
* - `"host"`: 直播场景中的主播,可以发布和订阅音视频轨道。
* - `"audience"`: 直播场景中的观众,只能订阅,不能发布音视频轨道。
* @public
*/
/** @en
* The user role in a live broadcast channel.
* - `"host"`: Host. A host can both publish tracks and subscribe to tracks.
* - `"audience"`: Audience. An audience can only subscribe to tracks.
*/
export declare type ClientRole = "audience" | "host";
export declare interface ClientRoleOptions {
/**
* 直播场景中的观众延时级别。
*
* > 注意事项:
* > - 仅在用户角色设为 `"audience"` 时生效。
* > - 不同的级别会影响计费。
*/
/** @en
* The latency level of an audience member in a live interactive streaming.
*
* > Note:
* > - Takes effect only when the user role is `"audience"`.
* > - Levels affect prices.
*/
level: AudienceLatencyLevelType;
/**
* @ignore
* 设置角色实际延迟, 范围0-3000ms
*/
/** @en
* @ignore
*/
delay?: number;
}
export declare type CloudProxyServerMode = "disabled" | "proxy3" | "proxy4" | "proxy5" | "proxy6" | "fallback";
/**
* 判断数组内的元素是否相同(不要求顺序相同)
*/
export declare function compareArray<T>(a: T[], b: T[]): boolean;
export declare function concurrent<T = void>(uuid: string, concurrency: number, method: Function, ...params: any[]): Promise<T>;
export declare enum CONFIG_DISTRIBUTE_TYPE {
REALTIME = 1
}
/**
* 连接断开的原因。
*/
/** @en
* Reason for the disconnection.
*/
export declare enum ConnectionDisconnectedReason {
/** 用户正常退出。 */
/** @en
* The user has left the channel.
*/
LEAVE = "LEAVE",
/** 网络异常,经过重试后不可恢复。 */
/** @en
* The network is down, and cannot recover after retry.
*/
NETWORK_ERROR = "NETWORK_ERROR",
/** 服务端返回出现异常,通常是因为集成过程中参数有误。 */
/** @en
* The server returns an error. This is usually caused by incorrect parameter settings.
*/
SERVER_ERROR = "SERVER_ERROR",
/** 当前用户被踢出。 */
/** @en
* The user is banned.
*/
UID_BANNED = "UID_BANNED",
/**
* @ignore
*/
/** @en
* @ignore
*/
FALLBACK = "FALLBACK",
/** 当前 IP 被踢出。 */
/** @en
* The IP is banned.
*/
IP_BANNED = "IP_BANNED",
/** 当前频道被禁用。 */
/** @en
* The channel is banned.
*/
CHANNEL_BANNED = "CHANNEL_BANNED",
/**
* @ignore
* license字段无上报
*/
/** @en
* @ignore
*/
LICENSE_MISSING = "LICENSE_MISSING",
/**
* @ignore
* license过期仍然登录
*/
/** @en
* @ignore
*/
LICENSE_EXPIRED = "LICENSE_EXPIRED",
/**
* @ignore
* license使用分钟数超过限制
*/
/** @en
* @ignore
*/
LICENSE_MINUTES_EXCEEDED = "LICENSE_MINUTES_EXCEEDED",
/**
* @ignore
* license使用时间段不合法
*/
/** @en
* @ignore
*/
LICENSE_PERIOD_INVALID = "LICENSE_PERIOD_INVALID",
/**
* @ignore
* 同一时间相同license存在不同设备
*/
/** @en
* @ignore
*/
LICENSE_MULTIPLE_SDK_SERVICE = "LICENSE_MULTIPLE_SDK_SERVICE",
/**
* @ignore
* license不合法
*/
/** @en
* @ignore
*/
LICENSE_ILLEGAL = "LICENSE_ILLEGAL",
/**
* 当前用户的 Token 已过期。
*/
/** @en
* The user's token expires.
*/
TOKEN_EXPIRE = "TOKEN_EXPIRE"
}
/**
* SDK 和声网服务器的连接状态,可以通过 [connectionState]{@link IAgoraRTCClient.connectionState} 获取。
*
* SDK 和服务器有以下 5 种连接状态:
* - `"DISCONNECTED"`: 连接断开。该状态表示用户处于以下任一阶段:
* - 尚未通过 [join]{@link IAgoraRTCClient.join} 加入频道。
* - 已经通过 [leave]{@link IAgoraRTCClient.leave} 离开频道。
* - 被踢出频道或者连接失败等异常情况。
* - `"CONNECTING"`: 正在连接中。当调用 [join]{@link IAgoraRTCClient.join} 时为此状态。
* - `"CONNECTED"`: 已连接。该状态表示用户已经加入频道,可以在频道内发布或订阅媒体流。
* - `"RECONNECTING"`: 正在重连中。因网络断开或切换而导致 SDK 与服务器的连接中断,SDK 会自动重连,此时连接状态变为 `"RECONNECTING"`。
* - `"DISCONNECTING"`: 正在断开连接。在调用 [leave]{@link IAgoraRTCClient.leave} 的时候为此状态。
* @public
*/
/** @en
* Connection state between the SDK and Agora's edge server.
*
* You can get the connection state through [connectionState]{@link IAgoraRTCClient.connectionState}.
*
* The connection between the SDK and the edge server has the following states:
* - `"DISCONNECTED"`: The SDK is disconnected from the server.
* - This is the initial state until you call [join]{@link IAgoraRTCClient.join}.
* - The SDK also enters this state after you call [leave]{@link IAgoraRTCClient.leave}, when the user is banned, or when the connection fails.
* - `"CONNECTING"`: The SDK is connecting to the server. The SDK enters this state when you call [join]{@link IAgoraRTCClient.join}.
* - `"CONNECTED"`: The SDK is connected to the server and joins a channel. The user can now publish streams or subscribe to streams in the channel.
* - `"RECONNECTING"`: The SDK is reconnecting to the server. If the connection is lost because the network is down or switched, the SDK enters this state.
* - `"DISCONNECTING"`: The SDK is disconnecting from the server. The SDK enters this state when you call [leave]{@link IAgoraRTCClient.leave}.
*/
export declare type ConnectionState = "DISCONNECTED" | "CONNECTING" | "RECONNECTING" | "CONNECTED" | "DISCONNECTING";
export declare function constrainLongToNumber(value: ConstrainULong): number;
/**
* 将输入字符串转换为指定长度的Uint8Array。
* 如果字符串不足指定长度则填充0,超出指定长度则截断。
*
* @param input - 要转换的字符串
* @param length - 固定长度,默认为16
* @returns 指定长度的Uint8Array
*/
export declare function convertStringToFixedLengthUint8Array(input: string, length?: number): Uint8Array;
export declare function createDefer<T = void>(): Deferred<T>;
/**
* @internal
* 快速创建一个内部使用的 unexpected error 对象
*/
export declare function createInternalUnexpectedError(message: string, data?: any): AgoraRTCError;
export declare function createResolvedDefer<T = void>(value: T): Deferred<T>;
export declare function createTimeoutDefer(duration?: number): Deferred<void>;
export declare function createWebRTCStatsFilter(pc: RTCPeerConnection, updateInterval?: number, lossRateInterval?: number, freezeRateLimit?: number, firstVideoDecodedTimeout?: number): AgoraWebRTCStatsFilter;
export declare const CRYPTO_HEADER_LENGTH = 10;
export declare const CRYPTO_ITERATIONS = 1000;
export declare const CRYPTO_IV_LENGTH: number;
export declare const CRYPTO_TAG_LENGTH: number;
declare type CryptoMode = "aes-128-gcm2" | "aes-256-gcm2";
export declare interface DataChannelMessage {
uid: number;
stream_id: number;
ordered: boolean;
max_retrans_times: number;
metadata: string;
}
export declare function decryptAesGcm(iv: Uint8Array, key: CryptoKey, payload: Uint8Array): Promise<Uint8Array>;
export declare const DEFAULT_AREAS: string[];
export declare const DEFAULT_AUDIO_RECV_STATS: AgoraAudioReceiverStats;
export declare const DEFAULT_AUDIO_SEND_STATS: AgoraAudioSenderStats;
export declare const DEFAULT_CANDIDATE_STATS: CandidateStats;
export declare const DEFAULT_PC_STATS: AgoraPCStats;
export declare const DEFAULT_RETRY_CONFIG: RetryConfiguration;
export declare const DEFAULT_TURN_CONFIG: TurnServerConfig;
export declare const DEFAULT_VIDEO_RECV_STATS: AgoraVideoReceiverStats;
export declare const DEFAULT_VIDEO_SEND_STATS: AgoraVideoSenderStats;
export declare interface Deferred<T = void> {
promise: Promise<T>;
isResolved: boolean;
isRejected: boolean;
isFinished: boolean;
value?: T;
resolve: (value: T) => void;
reject: (reason: unknown) => void;
cancel: (reason?: unknown) => void;
}
/** Deprecated */
export declare function deprecatedGetBrowserInfo(userAgent?: string): BrowserInfo;
export declare function detectSecureContext(): boolean;
export declare function dividePackage<T>(source: T, key: string, mtu: number): T[];
export declare function domLoadedPromise(): Promise<void>;
declare type Electron = any;
/**
* 通过 {@link getElectronScreenSources} 获取的 Electron 下屏幕共享源信息。
*
* 详见 [Electron 官方文档](https://www.electronjs.org/docs/api/structures/desktop-capturer-source)。
* @public
*/
/** @en
* Information of the sharing screen source on Electron, which is retrieved by calling {@link getElectronScreenSources}.
*
* See [DesktopCapturerSource](https://www.electronjs.org/docs/api/structures/desktop-capturer-source) in the Electron API documentation for details.
*/
export declare interface ElectronDesktopCapturerSource {
/**
* Electron 屏幕共享源的 ID。
*/
/** @en
* The ID of the screen source.
*/
id: string;
/**
* Electron 屏幕共享源的名称。
*/
/** @en
* The name of the screen source.
*/
name: string;
/**
* Electron 屏幕共享源的快照。
*
* 详见 [ElectronNativeImage](http://electron.atom.io/docs/api/native-image)。
*/
/** @en
* The thumbnail of the screen source.
*
* See [ElectronNativeImage](https://electronjs.org/docs/api/native-image#nativeimage) for details.
*/
thumbnail: IElectronNativeImage;
}
declare class ElementVisibleChecker {
private _clientSize;
private getClientWidth;
private getClientHeight;
private getStyle;
private checkCssVisibleProperty;
private checkPropertyUpToAllParentNodes;
private checkActualCssVisibleIncludeInherit;
private getSizeAboutClient;
private checkActualSize;
private elementFromPoint;
private checkCoverForAPoint;
private getPointPositionList;
private checkElementCover;
private checkSizeIsVisible;
private checkSizeOfPartInClient;
private returnHiddenResult;
checkOneElementVisible: (element?: HTMLElement) => CheckVisibleResultInner;
private checkElementIsMountedOnDom;
}
export declare const elementVisibleChecker: ElementVisibleChecker;
/**
* emit 一个事件,并假定 handler 会同步地处理事件,将 handler 的返回作为这个函数的返回,将 handler 的异常直接抛出
*/
export declare function emitAsInvoker<T = any, E = AgoraRTCError>(emitter: EventEmitter, event: string, ...args: any[]): T;
/**
* emit 一个事件,并假定 handler 会同步地处理事件,将 handler 的返回作为这个函数的返回,将 handler 的异常直接抛出
* **Note:**
* 如果没有 handler 直接返回 `null`
*/
export declare function emitAsInvokerNoResponse<T = any, E = AgoraRTCError>(emitter: EventEmitter, event: string, ...args: any[]): T | null;
/**
* emit 一个事件,并假定 handler 会异步地处理事件,将 handler 的返回作为这个函数的 Promise 的返回,将 handler 的异常作为 Promise 的异常
* 如果检测到没有 handler 会抛出 UNEXPECTED_ERROR
*/
export declare function emitAsPromise<T = any>(emitter: EventEmitter, event: string, ...args: any[]): Promise<T>;
/**
* emit 一个事件,并假定 handler 会异步地处理事件,将 handler 的返回作为这个函数的 Promise 的返回,将 handler 的异常作为 Promise 的异常
* 要求返回的 Promise 为 Promise<void>
* 如果检测到没有 handler 会直接 resolve
*/
export declare function emitAsPromiseNoResponse(emitter: EventEmitter, event: string, ...args: any[]): Promise<void>;
export declare function encryptAesGcm(iv: Uint8Array, key: CryptoKey, payload: Uint8Array): Promise<Uint8Array>;
/**
* 加密方案,在调用 {@link setEncryptionConfig} 时使用。包含以下几种:
* - `"aes-128-xts"`: 128 位 AES 加密,XTS 模式。
* - `"aes-256-xts"`: 256 位 AES 加密,XTS 模式。
* - `"aes-128-gcm"`: 128 位 AES 加密,GCM 模式。
* - `"aes-256-gcm"`: 256 位 AES 加密,GCM 模式。
* - `"aes-128-gcm2"`: 128 位 AES 加密,GCM 模式,加盐。
* - `"aes-256-gcm2"`: 256 位 AES 加密,GCM 模式,加盐。
* - `"aes-128-ecb"`: 128 位 AES 加密,ECB 模式。
* - `"sm4-128-ecb"`: 128 位 SM4 加密,ECB 模式。
* - `"none"`: 不加密。
* @public
*/
/** @en
* The encryption mode, which is used in the {@link setEncryptionConfig} method call.
* - `"aes-128-xts"`: 128-bit AES encryption, XTS mode.
* - `"aes-256-xts"`: 256-bit AES encryption, XTS mode.
* - `"aes-128-gcm"`: 128-bit AES encryption, GCM mode.
* - `"aes-256-gcm"`: 256-bit AES encryption, GCM mode.
* - `"aes-128-gcm2"`: 128-bit AES encryption, GCM mode, with salt.
* - `"aes-256-gcm2"`: 256-bit AES encryption, GCM mode, with salt.
* - `"aes-128-ecb"`: 128-bit AES encryption, ECB mode.
* - `"sm4-128-ecb"`: 128-bit SM4 encryption, ECB mode.
* - `"none"`: No encryption.
*/
export declare type EncryptionMode = "aes-128-xts" | "aes-256-xts" | "aes-128-ecb" | "sm4-128-ecb" | "aes-128-gcm" | "aes-256-gcm" | "aes-128-gcm2" | "aes-256-gcm2" | "none";
export declare const encryptRSA: (secret: string) => Promise<string>;
/**
* `EventEmitter` 类提供了定义、触发和处理事件的方式。
*/
/** @en
* The `EventEmitter` class provides a way to define, emit, and handle events.
*/
export declare class EventEmitter {
private _events;
/**
* 指定一个事件名,获取当前所有监听这个事件的回调函数。
*
* @param event - 事件名称。
*/
/** @en
* Gets all the listeners for a specified event.
*
* @param event The event name.
*/
getListeners(event: string): Function[];
/**
* 监听一个指定的事件,当事件触发时会调用传入的回调函数。
*
* @param event - 指定事件的名称。
* @param listener - 传入的回调函数。
*/
/** @en
* Listens for a specified event.
*
* When the specified event happens, the SDK triggers the callback that you pass.
* @param event The event name.
* @param listener The callback to trigger.
*/
on(event: string, listener: Function): void;
/** @internal */
addListener: (event: string, listener: Function) => void;
/**
* 监听一个指定的事件,当事件触发时会调用传入的回调函数。
*
* 当监听后事件第一次触发时,该监听和回调函数就会被立刻移除,也就是只监听一次指定事件。
*
* @param event - 指定事件的名称。
* @param listener - 传入的回调函数。
*/
/** @en
* Listens for a specified event once.
*
* When the specified event happens, the SDK triggers the callback that you pass and then removes the listener.
* @param event The event name.
* @param listener The callback to trigger.
*/
once(event: string, listener: Function): void;
/**
* 取消一个指定事件的监听。
*
* @param event - 指定事件的名称。
* @param listener - 监听事件时传入的回调函数。
*/
/** @en
* Removes the listener for a specified event.
*
* @param event The event name.
*