import BaseSignaling, { AddParticipantParams } from '../abstract/BaseSignaling'; import { ParticipantIdRegistry } from '../classes/ParticipantIdRegistry'; import { SharingStatReport } from '../classes/screenshare/SharingStatReport'; import { TransportTopology } from '../classes/transport/Transport'; import ConversationFeature from '../enums/ConversationFeature'; import ConversationOption from '../enums/ConversationOption'; import MediaOption from '../enums/MediaOption'; import SignalingCommandType from '../enums/SignalingCommandType'; import SignalingConnectionType from '../enums/SignalingConnectionType'; import UserRole from '../enums/UserRole'; import { JSONObject } from '../static/Json'; import { IAsrStartParams, IAsrStopParams } from '../types/Asr'; import { ChangeSimulcast } from '../types/ChangeSimulcast'; import MediaModifiers from '../types/MediaModifiers'; import MediaSettings from '../types/MediaSettings'; import { IAddMovieParams, IUpdateMovieData } from '../types/MovieShare'; import MuteStates from '../types/MuteStates'; import { NetworkStatReport } from '../types/NetworkStatReport'; import { CompositeUserId, ParticipantId, ParticipantStateData } from '../types/Participant'; import ParticipantLayout, { RequestKeyFrame, StopStream } from '../types/ParticipantLayout'; import { ParticipantListChunkParameters } from '../types/ParticipantListChunk'; import { StreamDescriptionString } from '../types/ParticipantStreamDescription'; import { PerfStatReport } from '../types/PerfStatReporter'; import SignalingMessage, { GetParticipantsSignalingResponse, GetRoomsSignalingResponse, SignalingSuccessResponse } from '../types/SignalingMessage'; import { IPublishStreamData, IRecordConfData, IStartStreamData, IStopStreamData } from '../types/Streams'; export default class Signaling extends BaseSignaling { private socket; protected sequence: number; private lastStamp; private websocketCommandsQueue; private datachannelCommandsQueue; private incomingCache; private responseHandlers; private connectionType; private reconnectCount; private endpoint; private wtEndpoint; protected conversationResolve: Function | null; protected conversationReject: Function | null; private connected; private listenersReady; private postfix; protected peerId: number | null; protected conversationId: string | null; private reconnectTimer; private connectionMessageWaitTimer; private doctorTimer; private participantIdRegistry; private producerNotificationDataChannel; private producerCommandDataChannel; private producerCommandDataChannelEnabled; private producerCommandSerializationService; private static get RECONNECT_DELAY(); private static get RECONNECT_MAX_DELAY(); private static get RECONNECT_MAX_COUNT(); private static get WAIT_CONNECTION_DELAY(); private static get WAIT_RESPONSE_DELAY(); private static get WAIT_MESSAGE_DELAY(); get ready(): boolean; setEndpoint(endpoint: string): void; setWebTransportEndpoint(endpoint: string | null): void; setConversationId(conversationId: string): void; setParticipantIdRegistry(participantIdRegistry: ParticipantIdRegistry): void; setProducerNotificationDataChannel(dataChannel: RTCDataChannel): void; setProducerCommandDataChannel(dataChannel: RTCDataChannel): void; useCommandDataChannel(status: boolean): void; /** * Free used resources */ cleanup(): void; /** * Open a connection with a signaling server */ connect(connectionType: SignalingConnectionType): Promise; /** * Send a command to a signaling server */ protected _send(command: SignalingCommandType, params?: any, needResponse?: boolean, retryCount?: number): Promise; /** * Send a raw command to a signaling server */ protected _sendRaw(command: SignalingCommandType, params?: any, needResponse?: boolean, retryCount?: number): Promise; private _isDataChannelCommand; getNextCommandSequenceNumber(): number; hangup(reason: string): Promise; sendCandidate(participantId: ParticipantId, candidate: RTCIceCandidate): Promise; requestTestMode(consumerCommand: string, producerCommand: string | null): Promise; sendSdp(participantId: ParticipantId, sdp: RTCSessionDescriptionInit, extraPayload?: Record): Promise; acceptCall(mediaSettings: MediaSettings): Promise; changeMediaSettings(mediaSettings: MediaSettings): Promise; changeParticipantState(state: ParticipantStateData, compositeUserId?: CompositeUserId): Promise; hold(hold: boolean): Promise; putHandsDown(): Promise; addParticipant(externalIds: CompositeUserId[], params?: AddParticipantParams): Promise; addParticipantLegacy(participantIds: CompositeUserId[], params?: AddParticipantParams): Promise; removeParticipant(participantId: CompositeUserId, ban?: boolean): Promise; allocateConsumer(description: RTCSessionDescription | null, capabilities: { [key: string]: number | boolean | string; }): Promise; acceptProducer(description: RTCSessionDescriptionInit, ssrcs: string[], sessionId: string): Promise; /** * @deprecated Use updateDisplayLayout instead */ changePriorities(priorities: { [key: string]: number; }): Promise; updateDisplayLayout(layouts: { [streamDesc: StreamDescriptionString]: ParticipantLayout | StopStream | RequestKeyFrame; }): Promise; addMovie(data: IAddMovieParams): Promise; updateMovie(data: IUpdateMovieData): Promise; removeMovie(data: any): Promise; startUrlSharing(sharedUrl: string): Promise; stopUrlSharing(): Promise; updateRooms(rooms: SignalingMessage.Room[], assignRandomly?: boolean): Promise; activateRooms(roomIds: number[], deactivate: boolean): Promise; switchRoom(toRoomId: number | null, participantId?: ParticipantId): Promise; getRooms(withParticipants: boolean): Promise; removeRooms(roomIds: number[]): Promise; startStream(data: IStartStreamData): Promise; stopStream(data?: IStopStreamData): Promise; publishStream(data?: IPublishStreamData): Promise; recordSetConf(conf?: IRecordConfData): Promise; getRecordStatus(): Promise; switchTopology(topology: TransportTopology, force?: boolean): Promise; requestRealloc(): Promise; reportPerfStat(report: PerfStatReport): Promise; reportSharingStat(report: SharingStatReport): Promise; reportNetworkStat(report: NetworkStatReport): Promise; chatMessage(message: string, participantId?: CompositeUserId | null): Promise; chatHistory(count: number): Promise; customData(data: JSONObject, participantId: ParticipantId | null): Promise; grantRoles(participantId: ParticipantId, roles: UserRole[], revoke: boolean): Promise; muteParticipant(participantId: ParticipantId | null, muteStates: MuteStates, requestedMedia: MediaOption[], roomId?: number | null): Promise; enableFeatureForRoles(feature: ConversationFeature, roles: UserRole[]): Promise; pinParticipant(participantId: ParticipantId, unpin: boolean, roomId: number | null): Promise; updateMediaModifiers(mediaModifiers: MediaModifiers): Promise; enableVideoSuspend(enabled: boolean): Promise; enableVideoSuspendSuggest(enabled: boolean): Promise; changeSimulcast(changeSimulcast: ChangeSimulcast): Promise; changeOptions(changes: { [key in ConversationOption]?: boolean; }): Promise; getWaitingHall(fromId?: SignalingMessage.WaitingParticipantId | null, count?: number, backward?: boolean): Promise; promoteParticipant(participantId?: CompositeUserId, demote?: boolean): Promise; requestPromotion(unrequest?: boolean): Promise; acceptPromotion(reject?: boolean): Promise; feedback(key: string): Promise; getHandQueue(): Promise; /** * Close a connection with a signaling server */ close(): void; /** * Этот метод нужен т.к. после получения сообщения "connected" устанавливается транспорт * и подписывается на сигналинг. Данные приходят очень быстро и транспорт пропускает * часть сообщений сигналинга. Этот метод вызывается вручную и сообщает о том, * что все подписчики готовы принимать сообщения от сигналинга. */ readyToSend(isReady?: boolean): void; getParticipantListChunk(participantListChunkParameters: ParticipantListChunkParameters): Promise; getParticipants(externalIds: SignalingMessage.ExternalId[]): Promise; getPeerId(): number | null; startAsr(params: IAsrStartParams): Promise; stopAsr(params?: IAsrStopParams): Promise; requestAsr(request: boolean): Promise; protected _connect(connectionType: SignalingConnectionType, useWebTransport: boolean): void; protected _disconnect(code?: number): void; private _onOpen; private _onMessage; protected _handleMessage(message: SignalingMessage): void; private _handleErrorMessage; protected _handleCachedMessages(): void; private _throwError; private _onError; protected _onClose(event: CloseEvent): void; protected _closeSocket(error?: Error | null): void; protected _reconnect(): void; private _handleCommandResponse; private _handleCommandsQueue; private _startResponseTimer; private _serializeBinary; private _serializeJson; private _convertDisplayLayout; protected _waitConnectionMessage(): void; protected _stopWaitConnectionMessage(): void; /** * Отвечает за timeout логику в WebSocket, если неполучаем никаких сообщений в течении WAIT_MESSAGE_DELAY, то запускаем реконнект */ private _startDoctor; private _stopDoctor; private isWebTransportAvailable; private _getSocketType; private _markTransportStat; private _logTransportStat; }