agora-rtc-sdk-ng
Version:
Agora WebRTC SDK for JavaScript
672 lines (655 loc) • 26.1 kB
TypeScript
import { RetryConfiguration, TurnServerConfigWithMode, CloudProxyServerMode, EventEmitter, PromiseMutex, SDKStore, SDK_CODEC, SDK_AUDIO_CODEC, AgoraPCStats, UID, Candidate, Setup, CandidateStats, FingerPrint, ConnectionDisconnectedReason, WebSocketQuitReason } from '@agora-js/shared';
import { AgoraRTCPlayer, VideoPlayer, LocalTrack, LocalDataChannel, RemoteDataChannel, LocalVideoTrackStats, AgoraRTCStats, LocalVideoTrack } from '@agora-js/media';
import { ServerAddress, RTPCapabilitiesBeforeMerge, RTPCapabilitiesWithDirection } from '@agora-js/protocol';
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",
SET_DUAL_STREAM_MODE = "set_dual_stream_mode",
SWITCH_VIDEO_STREAM = "switch_video_stream",
DEFAULT_VIDEO_STREAM = "default_video_stream",
SET_FALLBACK_OPTION = "set_fallback_option",
CONFIGURE = "configure",
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",
DOWNGRADE_CODEC = "downgrade_codec"
}
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",
ENABLE_MULTI_STREAM = "enable_multi_stream",
ON_USER_LIST = "on_user_list"
}
interface PeerConnectionSpec {
iceServers?: RTCIceServer[];
turnServer?: TurnServerConfigWithMode;
enableEncodedTransform?: boolean;
isPreallocation?: boolean;
cloudProxyServer?: CloudProxyServerMode;
}
interface AnyObject {
[k: string]: any;
[j: number]: any;
}
interface RemoteConfig {
tcc?: boolean;
remb?: boolean;
twcc?: boolean;
}
type Transmission = WebSocket | RTCDataChannel;
declare abstract class AgoraTransmissionMediumManager<T extends Transmission> extends EventEmitter {
get url(): string | null;
connectionID: number;
currentURLIndex: number;
reconnectReason?: TransmitterQuitReason;
get reconnectMode(): "retry" | "tryNext" | "recover";
set reconnectMode(newMode: "retry" | "tryNext" | "recover");
get state(): TransmitterConnectionState;
set state(newState: TransmitterConnectionState);
protected _reconnectMode: "retry" | "tryNext" | "recover";
protected abstract _initMutex: PromiseMutex;
protected readonly _name: string;
protected _state: TransmitterConnectionState;
protected abstract _reconnectInterrupter?: () => void;
protected abstract _url?: string;
protected _retryConfig: RetryConfiguration;
protected _reconnectCount: number;
protected _forceCloseTimeout: number;
protected _onlineReconnectListener?: Promise<void>;
protected _closeEstablishingTransmitter?: (() => void) | undefined;
protected _store?: SDKStore;
protected _joinChannelServiceRecordIndex?: number;
protected abstract _transmitter?: T;
protected _useCompress: boolean;
protected _inflateLength: number;
protected _deflateLength: number;
constructor(name: string, _retryConfig: RetryConfiguration, useCompress: boolean, store?: SDKStore);
protected resetReconnectCount(reason: "retry" | "tryNext" | "recover" | string): void;
abstract getConnection(): any;
abstract init(addresses: ServerAddress[], forceCloseTimeout: number): Promise<void>;
close(failed?: boolean, lazyClose?: boolean): void;
reconnect(reconnectMode?: "tryNext" | "retry" | "recover", reason?: TransmitterQuitReason): void;
abstract sendMessage(...args: unknown[]): void;
getInflateData(): {
inflateLength: number;
deflateLength: number;
};
protected setInflateData(data: TransmissionCompressedInfo): void;
protected clearInflateData(): void;
protected abstract createTransmitterConnection(address: unknown, isRetry?: boolean): Promise<void>;
protected abstract reconnectWithAction(action: "tryNext" | "retry" | "recover" | string, needWaitTime: boolean): Promise<boolean>;
}
declare enum TransmitterQuitReason {
NETWORK_ERROR = "NETWORK_ERROR",
SERVER_ERROR = "SERVER_ERROR",
MULTI_IP = "MULTI_IP",
TIMEOUT = "TIMEOUT",
OFFLINE = "OFFLINE",
LEAVE = "LEAVE",
P2P_FAILED = "P2P_FAILED",
FALLBACK = "FALLBACK"
}
type TransmitterConnectionState = "connected" | "connecting" | "reconnecting" | "closed" | "failed";
interface TransmissionCompressedInfo {
origin: AnyObject;
originLength: number;
shortKeyAndValue: AnyObject;
msgpackSer: Uint8Array;
compressed: Uint8Array;
compressedLength: number;
time: number;
}
interface TransmissonInfo {
transmitter: Transmission;
close: () => void;
}
declare abstract class P2PConnectionBaseImpl extends EventEmitter {
onICEConnectionStateChange?: (ICEConnectionState: RTCIceConnectionState) => void;
onConnectionStateChange?: (connectionState: RTCPeerConnectionState) => void;
onDTLSTransportStateChange?: (state: RTCDtlsTransportState) => void;
onDTLSTransportError?: (error: any) => void;
onICETransportStateChange?: (state: RTCIceTransportState) => void;
onFirstAudioReceived?: (ssrcId: number) => void;
onFirstVideoReceived?: (ssrcId: number) => void;
onFirstAudioDecoded?: (ssrcId: number) => void;
onFirstVideoDecoded?: (ssrcId: number, width: number, height: number) => void;
onFirstVideoRender?: (ssrcId: number) => void;
onFirstVideoBufferReady?: (ssrcId: number) => void;
onFirstVideoDecodedTimeout?: (ssrcId: number) => void;
onSelectedLocalCandidateChanged?: (cur: CandidateStats, prev: CandidateStats) => void;
onSelectedRemoteCandidateChanged?: (cur: CandidateStats, prev: CandidateStats) => void;
onICECandidateError?: (errMsg: string) => void;
getLocalVideoStats?: () => LocalVideoTrackStats & AgoraRTCStats;
constructor(spec: PeerConnectionSpec, store: SDKStore);
abstract get currentLocalDescription(): RTCSessionDescription | null;
abstract get currentRemoteDescription(): RTCSessionDescription | null;
abstract get peerConnectionState(): RTCPeerConnectionState;
abstract get iceConnectionState(): RTCIceConnectionState;
abstract get localCodecs(): SDK_CODEC[];
}
declare abstract class P2PConnectionImpl extends P2PConnectionBaseImpl {
abstract establishPromise: Promise<EstablishParams>;
constructor(spec: PeerConnectionSpec, store: SDKStore);
abstract establish(): Promise<EstablishParams>;
abstract connect(connectParams: ConnectionParams): Promise<void | TransmissonInfo>;
abstract updateRemoteConnect(connectParams: ConnectionParams): Promise<void>;
abstract updateRemoteRTPCapabilities(mids: string[], codecs: SDK_CODEC[]): Promise<void>;
abstract getPreMedia(ssrcId: number): {
mid: string;
track: MediaStreamTrack;
transceiver: RTCRtpTransceiver;
player: AgoraRTCPlayer | VideoPlayer | undefined;
} | undefined;
abstract send(tracks: LocalTrack[], codec: SDK_CODEC, audioCodec: SDK_AUDIO_CODEC): AsyncGenerator<SSRCMessage[], {
localSSRC: SSRCMessage;
id: string;
}[], (RemoteConfig | undefined)[]>;
abstract stopSending(mids: string[]): Promise<void>;
abstract receive(kind: Kind, ssrcMsg: SSRCMessage, mslabel: string, remoteConfig: RemoteConfig | undefined): Promise<{
track: MediaStreamTrack;
id: string;
transceiver?: RTCRtpTransceiver;
}>;
abstract batchReceive(list: {
kind: Kind;
ssrcMsg: SSRCMessage;
mslabel: string;
}[]): Promise<{
track: MediaStreamTrack;
id: string;
transceiver?: RTCRtpTransceiver;
}[]>;
abstract stopReceiving(mids: string[]): Promise<void>;
abstract muteRemote(mid: string): Promise<void>;
abstract unmuteRemote(mid: string): Promise<void>;
abstract muteLocal(mids: string[]): Promise<void>;
abstract unmuteLocal(ids: string[]): Promise<void>;
abstract restartICE(type?: ICERestartType): AsyncGenerator<ICEParameters, void, {
remoteIceParameters: ICEParameters;
}>;
abstract close(): void;
abstract getStats(): AgoraPCStats;
abstract getRemoteVideoIsReady(ssrcId: number): boolean;
abstract updateEncoderConfig(mid: string, track: LocalTrack): Promise<void>;
abstract updateSendParameters(mid: string, track: LocalTrack): Promise<void>;
abstract setStatsRemoteVideoIsReady(ssrcId: number, isReady: boolean): void;
abstract replaceTrack(track: LocalTrack, id: string): Promise<void>;
abstract getRemoteSSRC(mid: string): Promise<number | undefined>;
abstract createDataChannels(uid: UID, dataChannels: LocalDataChannel[] | RemoteDataChannel[]): Promise<void>;
abstract stopDataChannels(uid: UID): Promise<void>;
abstract setConfiguration(spec: PeerConnectionSpec): void;
}
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;
ssrcMsg: SSRCMessage;
mslabel: string;
};
declare class DataChannelConnection extends P2PConnectionImpl {
name: string;
private readonly store;
private readonly peerConnection;
private cname?;
protected mutex: PromiseMutex;
dataChannel: RTCDataChannel;
get currentLocalDescription(): RTCSessionDescription | null;
get currentRemoteDescription(): RTCSessionDescription | null;
get peerConnectionState(): RTCPeerConnectionState;
get iceConnectionState(): RTCIceConnectionState;
get localCodecs(): SDK_CODEC[];
private _p2pConnection;
establishPromise: Promise<EstablishParams>;
private _nvMedia?;
constructor(spec: any, store: SDKStore);
getPreMedia(ssrcId: number): {
mid: string;
track: MediaStreamTrack;
transceiver: RTCRtpTransceiver;
player: AgoraRTCPlayer | VideoPlayer | undefined;
firstVideoRender?: number;
} | undefined;
isPreSub(): boolean;
establish(): Promise<EstablishParams>;
getP2PConnectionParams(): Promise<EstablishParams>;
updateRtpSenderEncodings(track: LocalVideoTrack): Promise<void>;
connect(connectParams: ConnectionParams): Promise<TransmissonInfo>;
checkDtlsParameters(fingerprints: FingerPrint[]): boolean;
checkIceParameters(iceParameters: ICEParameters): boolean;
updateRemoteRTPCapabilities(mids: string[], codecs: SDK_CODEC[]): Promise<void>;
send(tracks: LocalTrack[], codec: SDK_CODEC, audioCodec: SDK_AUDIO_CODEC): AsyncGenerator<SSRCMessage[], {
localSSRC: SSRCMessage;
id: string;
}[], (RemoteConfig | undefined)[]>;
stopSending(mids: string[], nolock?: boolean): Promise<void>;
createDataChannels(uid: UID, dataChannels: LocalDataChannel[] | RemoteDataChannel[]): Promise<void>;
stopDataChannels(uid: UID): Promise<void>;
receive(kind: Kind, ssrcMsg: SSRCMessage, mslabel: string, remoteConfig?: RemoteConfig): Promise<{
track: MediaStreamTrack;
id: string;
transceiver?: RTCRtpTransceiver;
}>;
batchReceive(receiveList: {
kind: Kind;
ssrcMsg: SSRCMessage;
mslabel: string;
}[]): Promise<{
track: MediaStreamTrack;
id: string;
}[]>;
stopReceiving(mids: string[]): Promise<void>;
muteRemote(mid: string): Promise<void>;
unmuteRemote(mid: string): Promise<void>;
muteLocal(mids: string[]): Promise<void>;
unmuteLocal(ids: string[]): Promise<void>;
restartICE(type?: ICERestartType): AsyncGenerator<ICEParameters, void, {
remoteIceParameters: ICEParameters;
}>;
close(): void;
getStats(): AgoraPCStats;
getRemoteVideoIsReady(ssrcId: number): boolean;
updateRemoteConnect(connectParams: ConnectionParams): Promise<void>;
updateEncoderConfig(mid: string, track: LocalTrack): Promise<void>;
updateSendParameters(mid: string, track: LocalTrack): Promise<void>;
setStatsRemoteVideoIsReady(ssrcId: number, isReady: boolean): void;
replaceTrack(track: LocalTrack, mid: string): Promise<void>;
getRemoteSSRC(mid: string): Promise<number | undefined>;
private logSDPExchange;
private static resolvePCConfiguration;
private static turnServerConfigToIceServers;
private bindPCEvents;
private closeSignal;
private unbindConnectionEvents;
setConfiguration(spec: PeerConnectionSpec): void;
}
type StatsCounter = StatsCounter6s | StatsCounter3s | StatsCounter1s | StatsCounter60s;
declare enum StatsCounter60s {
Video_Send_Type = 190
}
declare enum StatsCounter6s {
Video_Send_Qp_Sum = 2143,
Video_Send_Freeze = 2082,
Video_Send_Codec = 2240,
Video_Send_Power_Efficient_Encoder = 2241,
Video_Recv_Qp_Sum = 2144,
Video_Recv_Freeze = 2084,
Video_Recv_Codec = 2242,
Video_Recv_Power_Efficient_Decoder = 2243,
Video_Render_Freeze_Time = 2109,
Video_Render_Freeze_Time_Render = 2147,
Video_Render_Freeze_Time_Render2 = 2223,
Audio_Recv_Freeze = 2083
}
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,
Audio_Recv_AV_Sync_TIME = 2237
}
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,
PAGE_VISIBILITY = 2233
}
declare enum TransportBandwidthCounter {
Transport_Send_Bitrate = 2234,
Transport_Recv_Bitrate = 2235
}
interface UploadMixedStats {
peer?: UID;
video?: Record<StatsCounter, number>;
audio?: Record<StatsCounter, number>;
addition?: (Record<TransportStatsCounter, number | undefined> & Partial<Record<BaseTransportCounter | TransportBandwidthCounter, number>>) | Partial<Record<BaseTransportCounter, number>>;
}
interface UploadStatsInfo {
inbound?: UploadInboundStats[];
outbound?: UploadOutboundStats[];
misc?: UploadMixedStats[];
}
declare enum PacketType {
Default = 0,
Ack = 1
}
interface MessagePacket {
version: number;
type: PacketType.Default;
packetNumber: number;
sendTs: number;
payload: string | Uint8Array;
}
interface AckPacket {
version: number;
type: PacketType.Ack;
maxAckPacketNumber: number;
shift: number;
ackSendTs: number;
}
declare class Transmitter {
private version;
private readonly initialRTO;
private readonly maxBatchAckCount;
private readonly maxRTO;
private readonly initialRTT;
private readonly ID;
private rtt;
private packetNumber;
private rtoRatioMap;
private timeoutMap;
private unorderedPacketQueue;
private batchAckPacketQueue;
private lastOrderedPacketNumber;
private batchAckTimer?;
private readonly sendImpl;
private readonly receiveImpl;
constructor(sendImpl: (buffer: ArrayBuffer) => void, receiveImpl: (payload: string | ArrayBuffer) => void, options?: {
initialRTO?: number;
initialRTT?: number;
maxBatchAckCount?: number;
maxRTO?: number;
});
packetize(payload: string | Uint8Array, packetNumber: number): Omit<MessagePacket, "sendTs">;
serialize(packet: MessagePacket | AckPacket): ArrayBuffer;
deserialize(buffer: ArrayBuffer): MessagePacket | AckPacket;
sendMessage(payload: string | Uint8Array): void;
onData(data: ArrayBuffer): void;
close(): void;
private resendMessage;
private calculateRTO;
private updateRTT;
private ack;
private batchAck;
private sendPacket;
private clearRTO;
}
declare class AgoraDatachannelManager extends AgoraTransmissionMediumManager<RTCDataChannel> {
protected _initMutex: PromiseMutex;
protected _reconnectInterrupter?: (() => void) | undefined;
protected _url?: string;
protected _transmitter?: RTCDataChannel;
private _addresses?;
private _reliableTransmission?;
private _textEncoder;
private _textDecoder;
constructor(name: string, _retryConfig: RetryConfiguration, useCompress?: boolean, store?: SDKStore);
getConnection(): Transmitter | undefined;
init(addresses: ServerAddress[], forceCloseTimeout?: number): Promise<void>;
sendMessage(message: any, immediately?: boolean, isUint8ArrayMessage?: boolean): Promise<void>;
unbindDcCloseEventListener(): void;
private sendMessageWithJSON;
private sendMessageWithUint8Array;
protected createTransmitterConnection(address: ServerAddress): Promise<void>;
protected reconnectWithAction(action: "retry" | "tryNext" | "recover", needWaitTime?: boolean): Promise<boolean>;
}
declare class DataChannelSignal extends EventEmitter {
__name__: string;
get connectionState(): SignalConnectionState;
set connectionState(state: SignalConnectionState);
get currentURLIndex(): number;
private _disconnectedReason?;
private _websocketReconnectReason?;
private _connectionState;
private reconnectToken?;
get url(): string | null;
get rtt(): number;
websocket: AgoraDatachannelManager;
openConnectionTime?: number;
private clientId;
private lastMsgTime;
private uploadCache;
private uploadCacheInterval?;
private rttRolling;
private pingpongTimer?;
private inflateDataTimer?;
private pingpongTimeoutCount;
private ortc?;
private joinResponse?;
private multiIpOption?;
private initError?;
private spec;
private store;
private isJoining;
private pendingNotifications;
private processPendingNotifications;
private handleUserBanned;
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): Promise<void>;
init(urls: ServerAddress[]): Promise<any>;
close(reason?: ConnectionDisconnectedReason): void;
private join;
private rejoin;
reconnect(reconnectMode?: "retry" | "tryNext" | "recover", reason?: WebSocketQuitReason | TransmitterQuitReason): void;
downgradeCodec(codec: string): Promise<boolean>;
private handleNotification;
private handlePingPong;
private handleInflateData;
private handleWebsocketEvents;
private onWebsocketMessage;
}
type TRteServiceName = "ChannelMediaRelay" | "LiveStreaming" | "ImageModeration" | "ContentInspect" | "DataStream" | "P2PChannel" | "PlanBConnection" | "InterceptFrame" | "DataChannelConnection" | "DataChannelSignal";
interface IRteService<T = any, R = any> {
name: TRteServiceName;
create: (...args: any[]) => T;
createSubmodule?: (...args: any[]) => R;
}
interface IDataChannelConnectionOptions {
spec: PeerConnectionSpec;
store: SDKStore;
}
interface IDataChannelSignalOptions {
spec: SignalSpec;
store: SDKStore;
}
declare const DataChannelConnectionService: IRteService<DataChannelConnection>;
declare const DataChannelSignalService: IRteService<DataChannelSignal>;
export { DataChannelConnectionService, DataChannelSignalService };
export type { IDataChannelConnectionOptions, IDataChannelSignalOptions };