import ITransport from './ITransport'; import ITransportObserver from './ITransportObserver'; import { AdditionalAnalyticsProperties } from '../analytics/AdditionalAnalyticsProperties'; import { AnalyticsEventsService } from '../analytics/AnalyticsEventsService'; import { AnalyticsTimer } from '../analytics/AnalyticsTimer'; import HMSSubscribeConnection from '../connection/subscribe/subscribeConnection'; import { DeviceManager } from '../device-manager'; import { EventBus } from '../events/EventBus'; import { HLSConfig, HLSTimedMetadata, HMSPermissionType, HMSRole, HMSRoleChangeRequest, HMSWhiteboardCreateOptions } from '../interfaces'; import { RTMPRecordingConfig } from '../interfaces/rtmp-recording-config'; import { HMSLocalTrack } from '../media/tracks'; import { HMSWebrtcInternals } from '../rtc-stats/HMSWebrtcInternals'; import Message from '../sdk/models/HMSMessage'; import { IStore } from '../sdk/store'; import { InitConfig, InitFlags } from '../signal/init/models'; import { CreateWhiteboardResponse, findPeersRequestParams, JoinLeaveGroupResponse, MultiTrackUpdateRequestParams, peerIterRequestParams, PeersIterationResponse, PollInfoGetParams, PollInfoGetResponse, PollInfoSetParams, PollInfoSetResponse, PollLeaderboardGetParams, PollLeaderboardGetResponse, PollListParams, PollListResponse, PollQuestionsGetParams, PollQuestionsGetResponse, PollQuestionsSetParams, PollQuestionsSetResponse, PollResponseSetParams, PollResponseSetResponse, PollResponsesGetParams, PollResponsesGetResponse, PollResultParams, PollResultResponse, PollStartParams, PollStartResponse, PollStopParams, SetSessionMetadataParams, TrackUpdateRequestParams } from '../signal/interfaces'; export default class HMSTransport implements ITransport { private observer; private deviceManager; private store; private eventBus; private analyticsEventsService; private analyticsTimer; private state; private trackStates; private publishConnection; private subscribeConnection; private initConfig?; private endpoint; private joinParameters?; private retryScheduler; private webrtcInternals?; private publishStatsAnalytics?; private subscribeStatsAnalytics?; private maxSubscribeBitrate; joinRetryCount: number; constructor(observer: ITransportObserver, deviceManager: DeviceManager, store: IStore, eventBus: EventBus, analyticsEventsService: AnalyticsEventsService, analyticsTimer: AnalyticsTimer); /** * Map of callbacks used to wait for an event to fire. * Used here for: * 1. publish/unpublish waits for [IPublishConnectionObserver.onRenegotiationNeeded] to complete */ private readonly callbacks; private signalObserver; private signal; private analyticsSignalTransport; private publishDtlsStateTimer; private lastPublishDtlsState; private publishConnectionObserver; private subscribeConnectionObserver; getWebrtcInternals(): HMSWebrtcInternals | undefined; isFlagEnabled(flag: InitFlags): boolean; preview(token: string, endpoint: string, peerId: string, customData: { name: string; metaData: string; }, autoSubscribeVideo?: boolean): Promise; join(authToken: string, peerId: string, customData: { name: string; metaData: string; }, initEndpoint: string, autoSubscribeVideo?: boolean): Promise; connect(token: string, endpoint: string, peerId: string, customData: { name: string; metaData: string; }, autoSubscribeVideo?: boolean): Promise; leave(notifyServer: boolean): Promise; handleLocalRoleUpdate: ({ oldRole, newRole }: { oldRole: HMSRole; newRole: HMSRole; }) => Promise; publish(tracks: Array): Promise; unpublish(tracks: Array): Promise; sendMessage(message: Message): Promise; /** * TODO: check if track.publishedTrackId be used instead of the hack to match with track with same type and * source. The hack won't work if there are multiple tracks with same source and type. */ trackUpdate(track: HMSLocalTrack): void; changeRole(forPeerId: string, toRole: string, force?: boolean): Promise; changeRoleOfPeer(forPeerId: string, toRole: string, force: boolean): Promise; changeRoleOfPeersWithRoles(roles: HMSRole[], toRole: string): Promise; acceptRoleChange(request: HMSRoleChangeRequest): Promise; endRoom(lock: boolean, reason: string): Promise; removePeer(peerId: string, reason: string): Promise; startRTMPOrRecording(params: RTMPRecordingConfig): Promise; stopRTMPOrRecording(): Promise; startHLSStreaming(params?: HLSConfig): Promise; stopHLSStreaming(params?: HLSConfig): Promise; sendHLSTimedMetadata(metadataList: HLSTimedMetadata[]): Promise; changeName(name: string): Promise; changeMetadata(metadata: string): Promise; getSessionMetadata(key?: string): Promise; setSessionMetadata(params: SetSessionMetadataParams): Promise; listenMetadataChange(keys: string[]): Promise; setPollInfo(params: PollInfoSetParams): Promise; fetchLeaderboard(params: PollLeaderboardGetParams): Promise; getPollInfo(params: PollInfoGetParams): Promise; setPollQuestions(params: PollQuestionsSetParams): Promise; getPollQuestions(params: PollQuestionsGetParams): Promise; startPoll(params: PollStartParams): Promise; stopPoll(params: PollStopParams): Promise; setPollResponses(params: PollResponseSetParams): Promise; getPollResponses(params: PollResponsesGetParams): Promise; getPollsList(params: PollListParams): Promise; getPollResult(params: PollResultParams): Promise; getWhiteboard(params: { id: string; permission?: Array; }): Promise; createWhiteboard(params: HMSWhiteboardCreateOptions): Promise; joinGroup(name: string): Promise; leaveGroup(name: string): Promise; addToGroup(peerId: string, name: string): Promise; removeFromGroup(peerId: string, name: string): Promise; findPeers(params: findPeersRequestParams): Promise; peerIterNext(params: peerIterRequestParams): Promise; changeTrackState(trackUpdateRequest: TrackUpdateRequestParams): Promise; changeMultiTrackState(trackUpdateRequest: MultiTrackUpdateRequestParams): Promise; private publishTrack; private unpublishTrack; private waitForLocalRoleAvailability; private createConnectionsAndNegotiateJoin; private createPeerConnections; private negotiateJoinWithRetry; private negotiateJoin; private negotiateJoinWebRTC; private negotiateJoinNonWebRTC; /** * Negotiate on first publish after changing role from non-webrtc peer to webrtc peer by sending offer */ private negotiateOnFirstPublish; private performPublishRenegotiation; private handleIceConnectionFailure; private internalConnect; private validateNotDisconnected; private openSignal; private initRtcStatsMonitor; private initStatsAnalytics; private getValueFromInitConfig; /** * Role does not need WebRTC(peer connections to communicate to SFU) if it cannot publish or subscribe to anything * @returns boolean denoting if a peer cannot publish(video, audio or screen) and cannot subscribe to any role */ private doesRoleNeedWebRTC; private doesLocalPeerNeedWebRTC; private retryPublishIceFailedTask; private retrySubscribeIceFailedTask; private retrySignalDisconnectTask; private handleSubscribeConnectionConnected; private setTransportStateForConnect; private sendErrorAnalyticsEvent; getSubscribeConnection(): HMSSubscribeConnection | null; getAdditionalAnalyticsProperties(): AdditionalAnalyticsProperties; }