agora-rtc-sdk-ng
Version:
Agora WebRTC SDK for JavaScript
995 lines (970 loc) • 37.3 kB
TypeScript
import { RetryConfiguration, TurnServerConfigWithMode, UID, Candidate, Setup, PayloadAttribute, Extmap, FingerPrint, EventEmitter, PromiseMutex, SDKStore, SDK_CODEC, AgoraPCStats, NetworkQuality as NetworkQuality$1, AgoraVideoReceiverStats, WebSocketQuitReason, ConnectionDisconnectedReason } from '@agora-js/shared';
import { IRemoteAudioTrack, IRemoteVideoTrack, IRemoteDataChannel, RemoteAudioTrack, RemoteVideoTrack, RemoteDataChannel, LocalTrack, LocalDataChannel, LowStreamParameter, AudioMetadata, VideoEncoderConfiguration, AudioEncoderConfiguration, MediaStats, LocalAudioTrackStats, LocalVideoTrackStats, RemoteAudioTrackStats, RemoteVideoTrackStats, AgoraRTCStats } from '@agora-js/media';
interface SignalSpec {
clientId: string;
retryConfig: RetryConfiguration;
forceWaitGatewayResponse: boolean;
}
declare enum SignalConnectionState {
CONNECTING = "connecting",
CONNECTED = "connected",
RECONNECTING = "reconnecting",
CLOSED = "closed"
}
declare enum SignalRequestType {
PING = "ping",
PING_BACK = "ping_back",
JOIN = "join_v3",
REJOIN = "rejoin_v3",
LEAVE = "leave",
SET_CLIENT_ROLE = "set_client_role",
PUBLISH = "publish",
PUBLISH_DATASTREAM = "publish_datastream",
UNPUBLISH = "unpublish",
UNPUBLISH_DATASTREAM = "unpublish_datastream",
SUBSCRIBE = "subscribe",
PRE_SUBSCRIBE = "pre_subscribe",
SUBSCRIBE_DATASTREAM = "subscribe_datastream",
SUBSCRIBE_STREAMS = "subscribe_streams",
UNSUBSCRIBE = "unsubscribe",
UNSUBSCRIBE_DATASTREAM = "unsubscribe_datastream",
UNSUBSCRIBE_STREAMS = "unsubscribe_streams",
SUBSCRIBE_CHANGE = "subscribe_change",
TRAFFIC_STATS = "traffic_stats",
RENEW_TOKEN = "renew_token",
SWITCH_VIDEO_STREAM = "switch_video_stream",
DEFAULT_VIDEO_STREAM = "default_video_stream",
SET_FALLBACK_OPTION = "set_fallback_option",
GATEWAY_INFO = "gateway_info",
CONTROL = "control",
SEND_METADATA = "send_metadata",
DATA_STREAM = "data_stream",
PICK_SVC_LAYER = "pick_svc_layer",
RESTART_ICE = "restart_ice",
CONNECT_PC = "connect_pc",
SET_VIDEO_PROFILE = "set_video_profile",
SET_PARAMETER = "set_parameter",
SET_RTM2_FLAG = "set_rtm2_flag"
}
declare enum SignalUploadType {
WRTC_STATS = "wrtc_stats",
WS_INFLATE_DATA_LENGTH = "ws_inflate_data_length",
DENOISER_STATS = "denoiser_stats",
EXTENSION_USAGE_STATS = "extension_usage_stats"
}
declare enum SignalNotifyType {
ON_USER_ONLINE = "on_user_online",
ON_USER_OFFLINE = "on_user_offline",
ON_STREAM_FALLBACK_UPDATE = "on_stream_fallback_update",
ON_PUBLISH_STREAM = "on_publish_stream",
ON_UPLINK_STATS = "on_uplink_stats",
ON_P2P_LOST = "on_p2p_lost",
ON_REMOVE_STREAM = "on_remove_stream",
ON_ADD_AUDIO_STREAM = "on_add_audio_stream",
ON_ADD_VIDEO_STREAM = "on_add_video_stream",
ON_TOKEN_PRIVILEGE_WILL_EXPIRE = "on_token_privilege_will_expire",
ON_TOKEN_PRIVILEGE_DID_EXPIRE = "on_token_privilege_did_expire",
ON_USER_BANNED = "on_user_banned",
ON_USER_LICENSE_BANNED = "on_user_license_banned",
ON_NOTIFICATION = "on_notification",
ON_CRYPT_ERROR = "on_crypt_error",
MUTE_AUDIO = "mute_audio",
MUTE_VIDEO = "mute_video",
UNMUTE_AUDIO = "unmute_audio",
UNMUTE_VIDEO = "unmute_video",
ON_P2P_OK = "on_p2p_ok",
RECEIVE_METADATA = "receive_metadata",
ON_DATA_STREAM = "on_data_stream",
ON_RTP_CAPABILITY_CHANGE = "on_rtp_capability_change",
ON_REMOTE_DATASTREAM_UPDATE = "on_remote_datastream_update",
ON_REMOTE_FULL_DATASTREAM_INFO = "on_remote_full_datastream_info",
ENABLE_LOCAL_VIDEO = "enable_local_video",
DISABLE_LOCAL_VIDEO = "disable_local_video",
ENABLE_LOCAL_AUDIO = "enable_local_audio",
DISABLE_LOCAL_AUDIO = "disable_local_audio",
ON_PUBLISHED_USER_LIST = "on_published_user_list"
}
interface PeerConnectionSpec {
iceServers?: RTCIceServer[];
turnServer?: TurnServerConfigWithMode;
enableEncodedTransform?: boolean;
}
declare enum P2PConnectionDirection {
SEND_ONLY = "SEND_ONLY",
RECEIVE_ONLY = "RECEIVE_ONLY"
}
type WebSocketConnectionState = "connected" | "connecting" | "reconnecting" | "closed" | "failed";
type ReconnectMode = "retry" | "tryNext" | "recover";
/**
* Information about a remote user. You can get this through [AgoraRTCClient.remoteUsers]{@link IAgoraRTCClient.remoteUsers}.
*/
interface IAgoraRTCRemoteUser {
/**
* The ID of the remote user.
*/
uid: UID;
/**
* The subscribed audio track.
*/
audioTrack?: IRemoteAudioTrack;
/**
* The subscribed video track.
*/
videoTrack?: IRemoteVideoTrack;
/**
* Whether the remote user is sending an audio track.
* - `true`: The remote user is sending an audio track.
* - `false`: The remote user is not sending an audio track.
*/
hasAudio: boolean;
/**
* Whether the remote user is sending a video track.
* - `true`: The remote user is sending an audio track.
* - `false`: The remote user is not sending an audio track.
*/
hasVideo: boolean;
/**
* @ignore
*/
dataChannels?: IRemoteDataChannel[];
}
declare class AgoraRTCRemoteUser implements IAgoraRTCRemoteUser {
uid: UID;
_uintid: number;
_trust_audio_enabled_state_: boolean;
_trust_video_enabled_state_: boolean;
_trust_audio_mute_state_: boolean;
_trust_video_mute_state_: boolean;
_audio_muted_: boolean;
_video_muted_: boolean;
_audio_enabled_: boolean;
_video_enabled_: boolean;
_audio_added_: boolean;
_video_added_: boolean;
_is_pre_created: boolean;
_video_pre_subscribed: boolean;
_audio_pre_subscribed: boolean;
_trust_video_stream_added_state_: boolean;
_trust_audio_stream_added_state_: boolean;
get hasVideo(): boolean;
get hasAudio(): boolean;
get audioTrack(): undefined | RemoteAudioTrack;
get videoTrack(): undefined | RemoteVideoTrack;
get dataChannels(): RemoteDataChannel[];
constructor(uid: UID, uintid: number);
}
interface ConfigDistributeLimitBitrate {
uplink: {
max_bitrate: number;
min_bitrate: number;
};
low_stream_uplink?: {
bitrate: number;
};
id: number;
}
declare enum LocalTrackType {
LocalVideoTrack = "videoTrack",
LocalAudioTrack = "audioTrack",
LocalVideoLowTrack = "videoLowTrack"
}
interface LocalTrackStruct {
track: LocalTrack;
id: string;
ssrcs: SSRCMessage;
}
type PublishMessage = {
stream_type: PubStreamType;
attributes: Record<string, any>;
ssrcs: SSRCMessage;
}[];
type UnPublishMessage = {
stream_type: PubStreamType;
ssrcs: SSRCMessage;
}[];
type PublishAnswer = {
ssrcs: SSRCMessage;
stream_type: PubStreamType;
attributes?: RemoteConfig;
}[];
type SubscribeOrtc = {
ssrcs: SSRCMessage;
stream_type: Kind;
attributes?: RemoteConfig;
}[];
type UnsubscribeMessage = {
stream_type: Kind;
ssrcId: number;
}[];
type MassUnsubscribeMessage = {
users: {
stream_id: UID;
stream_type: MediaTypeMask;
}[];
};
interface RemoteConfig {
tcc?: boolean;
remb?: boolean;
twcc?: boolean;
}
type NetworkQuality = 0 | 1 | 2 | 3 | 4 | 5;
type MassUnsubscribeParams = {
user: AgoraRTCRemoteUser;
mediaType?: Kind;
};
interface RTPCapabilities {
audioCodecs: PayloadAttribute[];
videoCodecs: PayloadAttribute[];
audioExtensions: Extmap[];
videoExtensions: Extmap[];
}
interface ICEParameters {
iceUfrag: string;
icePwd: string;
}
interface DtlsParameters {
fingerprints: FingerPrint[];
}
declare enum Kind {
VIDEO = "video",
AUDIO = "audio"
}
declare enum ICERestartType {
UDP_RELAY = "udp_relay",
UDP_TCP_RELAY = "udp_tcp_relay",
TCP_RELAY = "tcp_relay",
RELAY = "relay"
}
type EstablishParams = {
iceParameters: ICEParameters;
dtlsParameters: DtlsParameters;
rtpCapabilities: RTPCapabilitiesBeforeMerge;
offerSDP?: string;
};
type ConnectionParams = {
iceParameters: ICEParameters;
dtlsParameters: DtlsParameters;
candidates: Candidate[];
rtpCapabilities: RTPCapabilitiesWithDirection;
setup: Setup;
cname: string;
preallocation?: boolean;
preSSRCs?: PreSSRCMessage[];
};
type SSRCMessage = {
ssrcId: number;
rtx?: number;
}[];
type PreSSRCMessage = {
kind: Kind;
ssrcId: number;
mslabel: string;
rtx?: number;
};
interface RTPCapabilitiesWithDirection {
send: RTPCapabilities;
recv: RTPCapabilities;
}
interface RTPCapabilitiesBeforeMerge extends Partial<RTPCapabilitiesWithDirection> {
sendrecv?: RTPCapabilities;
}
type Transmission = WebSocket | RTCDataChannel;
interface TransmissonInfo {
transmitter: Transmission;
close: () => void;
}
declare enum ExternalSignalRequestType {
CALL = "call",
CANDIDATE = "candidate",
PUBLISH = "publish",
UNPUBLISH = "unpublish",
CONTROL = "control",
RESTART_ICE = "restart_ice",
ACK = "ack",
RESPONSE = "response",
JOIN = "join",
CHECK = "check"
}
declare class P2PChannel extends EventEmitter {
readonly isPlanB: any;
private readonly store;
private statsUploader;
private connection?;
private localTrackMap;
private remoteUserMap;
private localDataChannels;
private remoteDataChannelMap;
private pendingLocalTracks;
private pendingRemoteTracks;
private pendingLocalDataChannels;
private pendingRemoteDataChannels;
private readonly statsCollector;
private shouldForwardP2PCreation;
private iceFailedCount;
private dtlsFailedCount;
protected mutex: PromiseMutex;
private _state;
private _pcStatsUploadType;
private _isStartRestartIce;
private _restartTimer;
private _isTryConnecting;
private _iceError;
private _forceTurn;
private _isWaitPcToRePub;
private get state();
private set state(value);
constructor(store: SDKStore, statsCollector: AgoraRTCStatsCollector);
startP2PConnection(spec: PeerConnectionSpec): Promise<EstablishParams>;
connect(connectParams: ConnectionParams): Promise<void>;
updateRemoteRTPCapabilities(codecs: SDK_CODEC[]): void;
getEstablishParams(): Promise<EstablishParams | void>;
publishDataChannel(datachannels: LocalDataChannel[]): Promise<PublishDataChannelOptions[]>;
publish(localTracks: LocalTrack[], enableVideoDualStream?: boolean, lowStreamParameter?: LowStreamParameter): AsyncGenerator<PublishMessage | undefined, void, PublishAnswer>;
private doPublish;
updateVideoStreamParameter(parameter: LowStreamParameter, type: Exclude<LocalTrackType, LocalTrackType.LocalAudioTrack>): Promise<void>;
publishLowStream(lowStreamParameter: LowStreamParameter | undefined): AsyncGenerator<PublishMessage | undefined, void, PublishAnswer>;
republish(): Promise<void>;
reSubscribe(needSignal?: boolean): Promise<void>;
unpublish(tracks: LocalTrack[]): Promise<UnPublishMessage | undefined>;
unpublishDataChannel(dataChannels: LocalDataChannel[]): Promise<number[] | void>;
unpublishLowStream(): Promise<UnPublishMessage | undefined>;
private doUnpublish;
subscribeDataChannel(user: AgoraRTCRemoteUser, remoteDataChannels: RemoteDataChannel[]): Promise<number[] | void>;
subscribe(user: AgoraRTCRemoteUser, mediaType: Kind, ssrcId: number, rtxSsrcId?: number, subOrtc?: SubscribeOrtc): Promise<void>;
massSubscribe(subscribeList: {
user: AgoraRTCRemoteUser;
mediaType: Kind;
ssrcId: number;
rtxSsrcId?: number;
}[]): Promise<void>;
massSubscribeNoLock(subscribeList: {
user: AgoraRTCRemoteUser;
mediaType: Kind;
ssrcId: number;
rtxSsrcId?: number;
}[]): Promise<void>;
unsubscribe(user: AgoraRTCRemoteUser, mediaType?: Kind, reserveTrack?: boolean): Promise<UnsubscribeMessage | undefined>;
unsubscribeDataChannel(user: AgoraRTCRemoteUser, remoteDataChannels: RemoteDataChannel[]): Promise<number[] | undefined>;
massUnsubscribe(unsubscribeList: MassUnsubscribeParams[]): Promise<MassUnsubscribeMessage | undefined>;
massUnsubscribeNoLock(unsubscribeList: MassUnsubscribeParams[]): Promise<MassUnsubscribeMessage | undefined>;
isPreSubScribe(ssrcId: number): boolean;
muteRemote(user: AgoraRTCRemoteUser, kind: Kind): Promise<void>;
unmuteRemote(user: AgoraRTCRemoteUser, kind: Kind): Promise<void>;
unmuteRemoteNoLock(user: AgoraRTCRemoteUser, kind: Kind): Promise<void>;
addAudioMetadata(metadata: AudioMetadata): void;
getAllTracks(filterLowVideoTrack?: boolean): LocalTrack[];
getAllDataChannels(): LocalDataChannel[];
reportPublishEvent(succ: boolean, ec: string | null, failedTracks?: LocalTrack[], isLowStream?: boolean, extend?: string): void;
reportSubscribeEvent(succ: boolean, ec: string | null, user: AgoraRTCRemoteUser, mediaType: Kind): void;
reset(): void;
getStats(): AgoraPCStats | undefined;
getRemoteVideoIsReady(ssrcId: number): boolean;
getLocalAudioVolume(): number | undefined;
getLocalVideoSize(): {
width: number;
height: number;
} | undefined;
getEncoderConfig(type: LocalTrackType): VideoEncoderConfiguration | AudioEncoderConfiguration | undefined;
getLocalMedia(type: LocalTrackType): LocalTrackStruct | undefined;
hasLocalMedia(): boolean;
hasRemoteMedia(user?: AgoraRTCRemoteUser, kind?: Kind): boolean;
hasRemoteMediaWithLock(user?: AgoraRTCRemoteUser, kind?: Kind): Promise<boolean>;
getRemoteMedia(uid: UID): {
audioTrack?: RemoteAudioTrack;
videoTrack?: RemoteVideoTrack;
audioSSRC?: number;
videoSSRC?: number;
};
getAudioLevels(): {
uid: UID;
level: number;
}[];
disconnectForReconnect(): Promise<void>;
hasPendingRemoteDataChannel(remoteUser: AgoraRTCRemoteUser | UID, streamId: number): boolean;
setPendingRemoteDataChannel(remoteUser: AgoraRTCRemoteUser, id: number): void;
hasPendingRemoteMedia(remoteUser: AgoraRTCRemoteUser | UID, mediaType: string): boolean;
setPendingRemoteMedia(remoteUser: AgoraRTCRemoteUser, mediaType: Kind): void;
restartICE(type?: ICERestartType): AsyncGenerator<ICEParameters, void, {
remoteIceParameters: ICEParameters;
}>;
getUplinkNetworkQuality(): 0 | 1 | 2 | 3 | 4 | 5;
getDownlinkNetworkQuality(): 0 | 1 | 2 | 3 | 4 | 5;
muteLocalTrack(track: LocalTrack): Promise<void>;
private handleMuteLocalTrack;
private handleUnmuteLocalTrack;
private handleUpdateVideoEncoder;
private handleUpdateVideoSendParameters;
private handleReplaceMixingTrack;
private handleReplaceTrack;
private replaceTrack;
private filterTobePublishedTracks;
private filterTobeUnpublishedTracks;
private filterTobePublishedDataChannels;
private filterTobeUnpublishedDataChannels;
private bindLocalTrackEvents;
private bindLocalAudioTrackEvents;
private unbindLocalTrackEvents;
private unbindLocalAudioTrackEvents;
private bindRemoteTrackEvents;
private unbindRemoteTrackEvents;
private unbindAllRemoteTrackEvents;
private createGatewayPublishMessage;
private createGatewayUnpublishMessage;
private assignLocalTracks;
private withdrawLocalTracks;
private bindConnectionEvents;
private resetConnection;
private filterTobeMutedTracks;
private filterTobeUnmutedTracks;
private createMuteMessage;
private createUnmuteMessage;
private filterTobeUnSubscribedTracks;
private filterTobeUnSubscribedDataChannels;
private createUnsubscribeMessage;
private createUnsubscribeAllMessage;
private withdrawRemoteTracks;
updateBitrateLimit(bitrateLimit: ConfigDistributeLimitBitrate): Promise<void>;
private handleGetRTCStats;
private handleGetLocalVideoStats;
private handleGetLocalAudioStats;
private handleGetRemoteVideoStats;
private handleGetRemoteAudioStats;
isP2PDisconnected(): boolean;
private mapPubResToRemoteConfig;
private tryToUnmuteAudio;
private bindStatsUploaderEvents;
private unbindStatsUploaderEvents;
requestReconnect(): Promise<void>;
reconnectP2P(): Promise<void>;
canPublishLowStream(): boolean;
private throwIfTrackTypeNotMatch;
private getLowVideoTrack;
globalLock(): Promise<() => void>;
private reportPCStats;
private reportVideoFirstFrameDecoded;
remoteMediaSsrcChanged(user: AgoraRTCRemoteUser, mediaType: Kind, ssrcId: number): Promise<boolean>;
private unbindRtpTransceiver;
}
declare class AgoraRTCStatsCollector {
private store;
onStatsException?: (code: number, message: string, uid: UID) => void;
onUploadPublishDuration?: (peer: UID, audioDuration: number, videoDuration: number, subscribeElapse: number) => void;
onStatsChanged?: <K extends keyof MediaStats>(key: K, value: MediaStats[K]) => void;
onVideoCodecChanged?: (codec: string) => void;
private localStats;
private remoteStats;
private updateStatsInterval?;
trafficStats?: GatewayTrafficStats;
private trafficStatsPeerList;
private uplinkStats?;
private exceptionMonitor;
private p2pChannel?;
private scalabilityMode;
constructor(store: SDKStore);
startUpdateStats(): void;
stopUpdateStats(): void;
reset(): void;
getLocalAudioTrackStats(): LocalAudioTrackStats;
getLocalVideoTrackStats(): LocalVideoTrackStats;
getRemoteAudioTrackStats(uid?: UID): {
[uid: string]: RemoteAudioTrackStats;
};
getRemoteNetworkQualityStats(uid?: UID): {
[uid: string]: NetworkQuality$1;
};
getRemoteVideoTrackStats(uid?: UID): {
[uid: string]: RemoteVideoTrackStats;
};
getRTCStats(): AgoraRTCStats;
addLocalStats(type: LocalTrackType): void;
removeLocalStats(type?: LocalTrackType): void;
addRemoteStats(uid: UID): void;
removeRemoteStats(uid?: UID): void;
addP2PChannel(p2pChannel: P2PChannel): void;
updateTrafficStats(stats: GatewayTrafficStats): void;
updateUplinkStats(stats: GatewayUplinkStats): void;
private updateStats;
static isRemoteVideoFreeze(track: RemoteVideoTrack | undefined, stats: AgoraVideoReceiverStats, lastStats?: AgoraVideoReceiverStats): boolean;
static isRemoteAudioFreeze(track?: RemoteAudioTrack): boolean;
private isLocalVideoFreeze;
private updateLocalStats;
private updateRemoteStats;
}
declare enum PubStreamType {
High = "high",
Low = "low",
Audio = "audio",
Screen = "screen",
ScreenLow = "screen_low"
}
interface PublishDataChannelOptions {
streamId: number;
ordered: boolean;
maxRetransmits: number | null;
metadata: string;
channelId: number;
}
interface GatewayTrafficStats {
B_acd: number;
B_dnq: number;
B_palr4: number;
B_pvlr4: number;
B_unq: number;
ntp_offset?: number;
peer_delay: {
B_ad: number;
B_deb: number;
B_ealr4: number;
B_ed: number;
B_evlr4: number;
B_st: number;
B_vd: number;
B_ppad: number;
B_ppvd: number;
B_punq: 0 | 1 | 2 | 3 | 4 | 5;
B_pdnq: 0 | 1 | 2 | 3 | 4 | 5;
peer_uid: UID;
}[];
timestamp: number;
}
interface GatewayUplinkStats {
B_uab: number;
B_ucl: number;
B_ufl: number;
B_fir: boolean;
}
declare enum MediaTypeMask {
Nothing = 0,
Audio = 1,
LwoVideo = 2,
Video = 4,
Data = 8,
DataStream0 = 256,
DataStream1 = 512,
DataStream2 = 1024,
DataStream3 = 2048,
DataStream4 = 4096,
DataStream5 = 8192,
DataStream6 = 16384,
DataStream7 = 32768
}
type P2PPublishMessage = {
kind: Kind;
stream_type: PubStreamType;
mid: string;
ssrcs: SSRCMessage;
isMuted?: boolean;
}[];
interface ConnectionParameters {
iceParameters: ICEParameters;
dtlsParameters: DtlsParameters;
}
type P2PEstablishParams = {
sdp: string;
} & ConnectionParameters;
declare class P2PChannel2 extends EventEmitter {
readonly isPlanB = false;
private readonly store;
private statsUploader;
private sendConnection?;
private recvConnection?;
private localTrackMap;
private remoteUserMap;
private localDataChannels;
private pendingLocalTracks;
private pendingRemoteTracks;
private readonly statsCollector;
private dtlsFailedCount;
protected sendMutex: PromiseMutex;
protected recvMutex: PromiseMutex;
private _state;
private _restartStates;
private reconnectInterval;
private uploadUnplinkStarted;
private uploadDownlinkStarted;
private uplinkStateUploadInterval?;
private downlinkStatsUploadInterval?;
private get state();
private set state(value);
constructor(store: SDKStore, statsCollector: AgoraRTCStatsCollector);
startP2PConnection(spec: PeerConnectionSpec, isDataChannel?: boolean): Promise<EstablishParams>;
connect(connectParams: ConnectionParams): Promise<void>;
startP2P(spec: PeerConnectionSpec, establishParams?: P2PEstablishParams): Promise<P2PEstablishParams>;
p2pConnect(establishParams: P2PEstablishParams): Promise<void>;
addRemoteCandidate(candidate: RTCIceCandidateInit, direction: P2PConnectionDirection): Promise<void>;
publish(localTracks: LocalTrack[], enableVideoDualStream?: boolean, lowStreamParameter?: LowStreamParameter): AsyncGenerator<P2PPublishMessage>;
unpublish(tracks: LocalTrack[]): Promise<UnPublishMessage | void>;
private startUploadUplinkState;
private stopUploadUplinkState;
publishLowStream(lowStreamParameter: LowStreamParameter | undefined): AsyncGenerator<PublishMessage | undefined, void, PublishAnswer>;
republish(): Promise<void>;
unpublishLowStream(): Promise<UnPublishMessage | undefined>;
subscribe(user: AgoraRTCRemoteUser, mediaType: Kind, ssrcId: number, mid: string): Promise<string | void>;
mockSubscribe(user: AgoraRTCRemoteUser, mediaType: Kind, ssrcId: number, mid: string): Promise<string | void>;
unsubscribe(user: AgoraRTCRemoteUser, mediaType?: Kind, reserveTrack?: boolean): Promise<void>;
private startUploadDownlinkState;
private stopUploadDownlinkState;
getAllDataChannels(): LocalDataChannel[];
massSubscribe(subscribeList: {
user: AgoraRTCRemoteUser;
mediaType: Kind;
ssrcId: number;
rtxSsrcId?: number;
}[]): Promise<void>;
massSubscribeNoLock(subscribeList: {
user: AgoraRTCRemoteUser;
mediaType: Kind;
ssrcId: number;
rtxSsrcId?: number;
}[]): Promise<void>;
massUnsubscribe(unsubscribeList: {
user: AgoraRTCRemoteUser;
mediaType?: Kind;
}[]): Promise<MassUnsubscribeMessage | undefined>;
massUnsubscribeNoLock(unsubscribeList: {
user: AgoraRTCRemoteUser;
mediaType?: Kind;
}[]): Promise<MassUnsubscribeMessage | undefined>;
muteRemote(user: AgoraRTCRemoteUser, kind: Kind): Promise<void>;
unmuteRemote(user: AgoraRTCRemoteUser, kind: Kind): Promise<void>;
unmuteRemoteNoLock(user: AgoraRTCRemoteUser, kind: Kind): Promise<void>;
getAllTracks(filterLowVideoTrack?: boolean): LocalTrack[];
reportPublishEvent(succ: boolean, ec: string | null, failedTracks?: LocalTrack[], isLowStream?: boolean, extend?: string): void;
reportSubscribeEvent(succ: boolean, ec: string | null, user: AgoraRTCRemoteUser, mediaType: Kind): void;
reset(): void;
getStats(isDownlink?: boolean): AgoraPCStats | undefined;
getRemoteVideoIsReady(ssrcId: number): boolean;
getLocalAudioVolume(): number | undefined;
getLocalVideoSize(): {
width: number;
height: number;
} | undefined;
getEncoderConfig(type: LocalTrackType): VideoEncoderConfiguration | AudioEncoderConfiguration | undefined;
getLocalMedia(type: LocalTrackType): LocalTrackStruct | undefined;
hasLocalMedia(): boolean;
hasRemoteMedia(user?: AgoraRTCRemoteUser, kind?: Kind): boolean;
hasRemoteMediaWithLock(user?: AgoraRTCRemoteUser, kind?: Kind): Promise<boolean>;
getRemoteMedia(uid: UID): {
audioTrack?: RemoteAudioTrack;
videoTrack?: RemoteVideoTrack;
audioSSRC?: number;
videoSSRC?: number;
};
getAudioLevels(): {
uid: UID;
level: number;
}[];
disconnectForReconnect(): Promise<void>;
hasPendingRemoteMedia(remoteUser: AgoraRTCRemoteUser | UID, mediaType: string): boolean;
setPendingRemoteMedia(remoteUser: AgoraRTCRemoteUser, mediaType: Kind): void;
restartICE(direction: P2PConnectionDirection, remoteIceParameter: ICEParameters): Promise<ICEParameters>;
restartICE(direction: P2PConnectionDirection): Promise<void>;
getUplinkNetworkQuality(): NetworkQuality;
getDownlinkNetworkQuality(): NetworkQuality;
muteLocalTrack(track: LocalTrack): Promise<void>;
private handleMuteLocalTrack;
private handleUnmuteLocalTrack;
private handleUpdateVideoEncoder;
private handleUpdateVideoSendParameters;
private handleReplaceTrack;
private filterTobePublishedTracks;
private filterTobeUnpublishedTracks;
private bindLocalTrackEvents;
private bindLocalAudioTrackEvents;
private unbindLocalTrackEvents;
private unbindLocalAudioTrackEvents;
private bindRemoteTrackEvents;
private unbindRemoteTrackEvents;
private unbindAllRemoteTrackEvents;
private createGatewayPublishMessage;
private createGatewayUnpublishMessage;
private assignLocalTracks;
private withdrawLocalTracks;
private bindConnectionEvents;
private unbindConnectionEvents;
handleDisconnect(direction: P2PConnectionDirection): Promise<void>;
private filterTobeMutedTracks;
private filterTobeUnmutedTracks;
private createMuteMessage;
private createUnmuteMessage;
private filterTobeUnSubscribedTracks;
private createUnsubscribeMessage;
private withdrawRemoteTracks;
updateBitrateLimit(bitrateLimit: ConfigDistributeLimitBitrate): Promise<void>;
private handleGetLocalVideoStats;
private handleGetLocalAudioStats;
private handleGetRemoteVideoStats;
private handleGetRemoteAudioStats;
isP2PDisconnected(): boolean;
private tryToUnmuteAudio;
private bindStatsUploaderEvents;
private unbindStatsUploaderEvents;
requestReconnect(): Promise<void>;
reconnectP2P(): Promise<void>;
canPublishLowStream(): boolean;
private throwIfTrackTypeNotMatch;
private getLowVideoTrack;
globalLock(): Promise<() => void>;
private reportVideoFirstFrameDecoded;
remoteMediaSsrcChanged(user: AgoraRTCRemoteUser, mediaType: Kind, ssrcId: number): Promise<boolean>;
isPreSubScribe(ssrcId: number): boolean;
publishDataChannel(datachannels: LocalDataChannel[]): Promise<PublishDataChannelOptions[]>;
unpublishDataChannel(dataChannels: LocalDataChannel[]): Promise<number[] | void>;
subscribeDataChannel(user: AgoraRTCRemoteUser, remoteDataChannels: RemoteDataChannel[]): Promise<number[] | void>;
unsubscribeDataChannel(user: AgoraRTCRemoteUser, remoteDataChannels: RemoteDataChannel[]): Promise<number[] | undefined>;
hasPendingRemoteDataChannel(remoteUser: AgoraRTCRemoteUser | UID, streamId: number): boolean;
setPendingRemoteDataChannel(remoteUser: AgoraRTCRemoteUser, id: number): void;
preConnect(connectionParams: ConnectionParams): Promise<TransmissonInfo>;
getEstablishParams(): EstablishParams;
reSubscribe(needSignal?: boolean): Promise<void>;
updateVideoStreamParameter(parameter: LowStreamParameter, type: Exclude<LocalTrackType, LocalTrackType.LocalAudioTrack>): Promise<void>;
private unbindRtpTransceiver;
}
interface WebsocketUrl {
host: string;
port: string;
proxy?: string;
}
declare abstract class BaseWebSocket extends EventEmitter {
private _websocketUrl;
get url(): string | null;
connectionID: number;
currentURLIndex: number;
urls: (WebsocketUrl | string)[];
protected _reconnectMode: "retry" | "tryNext" | "recover";
get reconnectMode(): "retry" | "tryNext" | "recover";
set reconnectMode(newMode: "retry" | "tryNext" | "recover");
reconnectReason?: WebSocketQuitReason;
private _initMutex;
protected readonly name: string;
protected _state: WebSocketConnectionState;
protected reconnectInterrupter?: () => void;
get state(): WebSocketConnectionState;
set state(newState: WebSocketConnectionState);
protected websocket?: WebSocket;
protected retryConfig: RetryConfiguration;
protected reconnectCount: number;
protected forceCloseTimeout: number;
protected resetReconnectCount(reason: string): void;
protected onlineReconnectListener?: Promise<void>;
protected useCompress: boolean;
tryDoubleDomain: boolean;
use443PortOnly: boolean;
protected wsInflateLength: number;
protected wsDeflateLength: number;
protected closeEstablishingWs?: () => void;
protected store?: SDKStore;
protected joinGatewayRecordIndex?: number;
constructor(name: string, retryConfig: RetryConfiguration, useCompress?: boolean, tryDoubleDomain?: boolean, use443PortOnly?: boolean, store?: SDKStore);
getConnection(): WebSocket | undefined;
init(urls: (WebsocketUrl | string)[], forceCloseTimeout?: number): Promise<void>;
close(failed?: boolean, lazyClose?: boolean): void;
reconnect(reconnectMode?: ReconnectMode, reason?: WebSocketQuitReason): void;
sendMessage(message: any, immediately?: boolean, isUint8ArrayMessage?: boolean): void;
private setWsInflateData;
getWsInflateData(): {
wsInflateLength: number;
wsDeflateLength: number;
};
private clearWsInflateData;
private createWebSocketConnection;
private reconnectWithAction;
protected abstract chooseBestWebsocketConnection(url: WebsocketUrl | string, recordIndex?: number): Promise<WebSocket>;
}
declare class GatewayWebSocket extends BaseWebSocket {
constructor(name: string, retryConfig: RetryConfiguration, useCompress?: boolean, tryDoubleDomain?: boolean, use443PortOnly?: boolean, store?: SDKStore);
protected chooseBestWebsocketConnection(url: WebsocketUrl | string, recordIndex?: number): Promise<WebSocket>;
}
type StatsCounter = StatsCounter6s | StatsCounter3s | StatsCounter1s;
declare enum StatsCounter6s {
Video_Send_Qp_Sum = 2143,
Video_Send_Freeze = 2082,
Video_Recv_Qp_Sum = 2144,
Video_Recv_Freeze = 2084,
Video_Render_Freeze_Time = 2109,
Video_Render_Freeze_Time_Render = 2147,
Video_Render_Freeze_Time_Render2 = 2223,
Audio_Recv_Freeze = 2083,
Video_Send_Type = 2225
}
declare enum StatsCounter3s {
Video_Send_Retransmit = 2062,
Video_Send_Target_Encoded = 2064,
Video_Send_Actual_Encoded = 2060,
Video_Send_Transmit = 2066,
Video_Send_Bandwidth = 2061,
Video_Capture_Height = 2033,
Video_Capture_Width = 2035,
Video_Capture_Frame_Rate = 2034,
Video_Send_Low_Height = 2073,
Video_Send_Low_Frame_Rate = 2075,
Video_Send_Low_Width = 2077,
Video_Send_Low_Bitrate = 2069,
Video_Send_Low_Package_Lost = 2070,
Video_Send_Low_Package_Rate = 2071,
Video_Send_Frame_Rate = 2002,
Video_Send_Width = 2003,
Video_Send_Height = 2004,
Video_Send_Disabled = 2095,
Video_Send_Adaptation = 2032,
Video_Send_Player_Status = 2128,
Video_Send_Nacks = 2009,
Video_Send_Plis = 2010,
Video_Send_Firs = 2011,
Video_Send_Avg_Encode = 2007,
Video_Send_Huge_Frame_Sent = 2174,
Video_Send_Bytes_Retransmit = 2173,
Video_Send_Packages_Retransmit = 2172,
Video_Send_Key_Frames_Encoded = 2207,
Video_Send_Bitrate = 2012,
Video_Send_Package_Rate = 2031,
Video_Send_Package_Lost = 2005,
Audio_Capture_PCM_Level = 2104,
Audio_Send_Level = 2038,
Audio_Send_Bitrate = 2039,
Audio_Send_Package_Rate = 2040,
Audio_Send_AEC_Return_Loss = 2041,
Audio_Send_AEC_Return_Loss_Enhancement = 2042,
Audio_Send_Freeze = 2081,
Audio_Send_Disabled = 2096,
Audio_Send_Bytes_Retransmit = 2179,
Audio_Send_Packages_Retransmit = 2180,
Video_Recv_Height = 2019,
Video_Recv_Width = 2018,
Video_Recv_Frame_Rate_Output = 2155,
Video_Recv_Jitter_Buffer = 2023,
Video_Recv_Current_Delay = 2024,
Video_Recv_Nacks = 2026,
Video_Recv_Plis = 2027,
Video_Recv_Firs = 2028,
Video_Recv_Disabled = 2101,
Video_Recv_Player_Status = 2129,
Video_Recv_I_Frame_Delay = 2149,
Video_Render_Frame_Rate_Render = 2022,
Video_Render_Freeze_Duration = 2156,
Audio_Render_Level = 2043,
Audio_Render_Freeze_Time_80ms = 2226,
Audio_Render_Freeze_Time_200ms = 2227,
Audio_Render_Freeze_Samples_80ms = 2228,
Audio_Render_Freeze_Samples_200ms = 2229,
Audio_Recv_PCM_Level = 2105,
Audio_Recv_Disabled = 2102,
Audio_Recv_Jitter_Buffer = 2054,
Audio_Recv_Current_Delay = 2047,
Audio_Recv_Player_Status = 2130,
Audio_Recv_Bitrate = 2044,
Audio_Recv_Concealed_Samples = 2148,
Audio_Recv_Total_Samples_Received = 2224
}
declare enum StatsCounter1s {
Video_Render_Frame_Rate_Decode = 2021,
Video_Recv_Frame_Rate = 2020,
Video_Recv_Frame_Dropped = 2181,
Video_Recv_Bytes_Retransmit = 2175,
Video_Recv_Packages_Retransmit = 2176,
Video_Recv_Packages_Discarded = 2198,
Video_Recv_Avg_Decode = 2200,
Video_Recv_Avg_Processing_Delay = 2202,
Video_Recv_Avg_Assembly_Time = 2203,
Video_Recv_Avg_Inter_Frame_Delay = 2204,
Video_Recv_Key_Frames_Decoded = 2206,
Video_Recv_Package_Lost = 2014,
Video_Recv_Bitrate = 2029,
Video_Recv_Package_Rate = 2078,
Audio_Recv_Jitter = 2055,
Audio_Recv_Bytes_Retransmit = 2178,
Audio_Recv_Packages_Retransmit = 2177,
Audio_Recv_Packages_Discarded = 2199,
Audio_Recv_Avg_Processing_Delay = 2201,
Audio_Recv_Package_Rate = 2046,
Audio_Recv_Package_Lost = 2045
}
interface UploadOutboundStats {
high?: Partial<Record<StatsCounter, number>>;
low?: Partial<Record<StatsCounter, number>>;
audio?: Partial<Record<StatsCounter, number>>;
}
interface UploadInboundStats {
peer: UID;
video?: Partial<Record<StatsCounter, number>>;
audio?: Partial<Record<StatsCounter, number>>;
}
declare enum TransportStatsCounter {
RTT = 2006,
CONN_TYPE = 801,
STATS_UPDATE_INTERVAL = 2205
}
declare enum BaseTransportCounter {
RTC_PEER_CONNECTION_STATE = 2219
}
interface UploadMixedStats {
peer?: UID;
video?: Record<StatsCounter, number>;
audio?: Record<StatsCounter, number>;
addition?: (Record<TransportStatsCounter, number | undefined> & Partial<Record<BaseTransportCounter, number>>) | Record<BaseTransportCounter, number>;
}
interface UploadStatsInfo {
inbound?: UploadInboundStats[];
outbound?: UploadOutboundStats[];
misc?: UploadMixedStats[];
}
declare class P2PSignal extends EventEmitter {
get connectionState(): SignalConnectionState;
set connectionState(state: SignalConnectionState);
get currentURLIndex(): number;
private _disconnectedReason?;
private _websocketReconnectReason?;
private _connectionState;
private reconnectToken?;
private p2pToken;
get url(): string | null;
get rtt(): number;
websocket: GatewayWebSocket;
openConnectionTime?: number;
private clientId;
private lastMsgTime;
private uploadCache;
private uploadCacheInterval?;
private rttRolling;
private pingpongTimer?;
private pingpongTimeoutCount;
private joinResponse?;
private multiIpOption?;
private initError?;
private spec;
private store;
private _external_signal;
constructor(spec: SignalSpec, store: SDKStore);
request(type: SignalRequestType, payload?: any, noNeedToReSend?: boolean, noNeedResponse?: boolean): Promise<any>;
waitMessage<T = any>(type: SignalNotifyType, filter?: (message: T) => boolean): Promise<T>;
uploadWRTCStats(stats: UploadStatsInfo): void;
upload(type: SignalUploadType, payload?: any): void;
send(type: SignalRequestType, payload?: any): void;
sendExtensionMessage(type: ExternalSignalRequestType, payload?: any, noNeedResponse?: boolean): Promise<any>;
init(urls: WebsocketUrl[]): Promise<any>;
close(reason?: ConnectionDisconnectedReason): void;
private join;
reconnect(reconnectMode?: ReconnectMode, reason?: WebSocketQuitReason): void;
private handleDataStream;
private handleNotification;
private handlePingPong;
private handleWebsocketEvents;
private onWebsocketMessage;
}
type TRteServiceName = "ChannelMediaRelay" | "LiveStreaming" | "ImageModeration" | "ContentInspect" | "DataStream" | "P2PChannel" | "PlanBConnection" | "InterceptFrame";
interface IRteService<T = any, R = any> {
name: TRteServiceName;
create: (...args: any[]) => T;
createSubmodule?: (...args: any[]) => R;
}
interface IP2PChannelOptions {
store: SDKStore;
statsCollector: AgoraRTCStatsCollector;
}
interface IP2PSignalOptions {
store: SDKStore;
spec: SignalSpec;
}
declare const P2PChannelService: IRteService<P2PChannel2, P2PSignal>;
export { P2PChannel2, P2PChannelService };
export type { IP2PChannelOptions, IP2PSignalOptions };