diff --git a/packages/ts-client/src/FishjamClient.ts b/packages/ts-client/src/FishjamClient.ts index 26074520..3269babb 100644 --- a/packages/ts-client/src/FishjamClient.ts +++ b/packages/ts-client/src/FishjamClient.ts @@ -29,7 +29,7 @@ export type Component = Omit( endpoint: Endpoint, -): endpoint is Peer => endpoint.type === 'webrtc'; +): endpoint is Peer => endpoint.type === 'webrtc' || endpoint.type === 'exwebrtc'; const isComponent = ( endpoint: Endpoint, ): endpoint is Component => diff --git a/packages/ts-client/src/webrtc/CommandsQueue.ts b/packages/ts-client/src/webrtc/CommandsQueue.ts index 1b2c028a..1157dd61 100644 --- a/packages/ts-client/src/webrtc/CommandsQueue.ts +++ b/packages/ts-client/src/webrtc/CommandsQueue.ts @@ -38,6 +38,7 @@ export class CommandsQueue { this.processNextCommand(); } }; + const onIceConnectionStateChange = () => { if (connection.getConnection().iceConnectionState === 'connected') { this.processNextCommand(); diff --git a/packages/ts-client/src/webrtc/ConnectionManager.ts b/packages/ts-client/src/webrtc/ConnectionManager.ts index ffbf401a..afcc8236 100644 --- a/packages/ts-client/src/webrtc/ConnectionManager.ts +++ b/packages/ts-client/src/webrtc/ConnectionManager.ts @@ -1,21 +1,12 @@ import type { MediaStreamTrackId } from './types'; -export type TurnServer = { - transport: string; - password: string; - serverAddr: string; - serverPort: string; - username: string; -}; - export class ConnectionManager { private readonly connection: RTCPeerConnection; - constructor(turnServers: TurnServer[]) { + constructor() { this.connection = new RTCPeerConnection({ bundlePolicy: 'max-bundle', - iceServers: this.getIceServers(turnServers), - iceTransportPolicy: 'relay', + iceTransportPolicy: 'all', }); } @@ -29,24 +20,6 @@ export class ConnectionManager { return isSignalingUnstable && isConnectionNotConnected && isIceNotConnected; }; - /** - * Configures TURN servers for WebRTC connections by adding them to the provided RTCConfiguration object. - */ - private getIceServers = (turnServers: TurnServer[]): RTCIceServer[] => { - return turnServers.map((turnServer: TurnServer) => { - const transport = turnServer.transport === 'tls' ? 'tcp' : turnServer.transport; - const uri = turnServer.transport === 'tls' ? 'turns' : 'turn'; - const address = turnServer.serverAddr; - const port = turnServer.serverPort; - - return { - credential: turnServer.password, - urls: uri.concat(':', address, ':', port, '?transport=', transport), - username: turnServer.username, - }; - }); - }; - public getConnection = (): RTCPeerConnection => { return this.connection; }; diff --git a/packages/ts-client/src/webrtc/tracks/Local.ts b/packages/ts-client/src/webrtc/tracks/Local.ts index 072e56b5..ac2d9759 100644 --- a/packages/ts-client/src/webrtc/tracks/Local.ts +++ b/packages/ts-client/src/webrtc/tracks/Local.ts @@ -334,10 +334,16 @@ export class Local { private getTrackIdToTrackBitrates = (): Record => { return Object.values(this.localTracks).reduce( - (previousValue, localTrack) => ({ - ...previousValue, - [localTrack.id]: localTrack.getTrackBitrates(), - }), + (previousValue, localTrack) => { + const bitrates = localTrack.getTrackBitrates(); + if (bitrates) { + return { + ...previousValue, + [localTrack.id]: bitrates, + } + } + return previousValue; + }, {} as Record, ); }; diff --git a/packages/ts-client/src/webrtc/tracks/LocalTrack.ts b/packages/ts-client/src/webrtc/tracks/LocalTrack.ts index a7b25550..9515bb93 100644 --- a/packages/ts-client/src/webrtc/tracks/LocalTrack.ts +++ b/packages/ts-client/src/webrtc/tracks/LocalTrack.ts @@ -240,7 +240,7 @@ export class LocalTrack implements TrackCommon private isNotSimulcastTrack = (encodings: RTCRtpEncodingParameters[]): boolean => encodings.length === 1 && !encodings[0]!.rid; - public getTrackBitrates = (): Bitrates => { + public getTrackBitrates = (): Bitrates | undefined => { const trackContext = this.trackContext; const kind = this.trackContext.track?.kind as TrackKind | undefined; @@ -252,7 +252,8 @@ export class LocalTrack implements TrackCommon return defaultBitrates[trackContext.trackKind]; } - if (!this.sender) throw new Error(`RTCRtpSender for track ${this.id} not found`); + if (!this.sender) + return undefined; const encodings = this.sender.getParameters().encodings; diff --git a/packages/ts-client/src/webrtc/tracks/Remote.ts b/packages/ts-client/src/webrtc/tracks/Remote.ts index 03781998..b11a2926 100644 --- a/packages/ts-client/src/webrtc/tracks/Remote.ts +++ b/packages/ts-client/src/webrtc/tracks/Remote.ts @@ -56,7 +56,6 @@ export class Remote { public addTracks = ( endpointId: EndpointId, tracks: Record, - trackIdToMetadata: Record, ) => { const endpoint: EndpointWithTrackContext | undefined = this.remoteEndpoints[endpointId]; @@ -64,11 +63,11 @@ export class Remote { if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`); Object.entries(tracks || {}) - .map(([trackId, { simulcastConfig }]) => { + .map(([trackId, { simulcastConfig, metadata }]) => { const trackContext = new TrackContextImpl( endpoint, trackId, - trackIdToMetadata[trackId], + metadata, simulcastConfig, this.trackMetadataParser, ); @@ -115,7 +114,7 @@ export class Remote { this.updateEndpointMetadata(newEndpoint, endpoint?.metadata?.peer); this.addEndpoint(newEndpoint); - this.addTracks(newEndpoint.id, endpoint.tracks, endpoint.trackIdToMetadata); + this.addTracks(newEndpoint.id, endpoint.tracks); if (sendNotification) { this.emit('endpointAdded', endpoint); diff --git a/packages/ts-client/src/webrtc/webRTCEndpoint.ts b/packages/ts-client/src/webrtc/webRTCEndpoint.ts index 7a476fe3..2a2886d2 100644 --- a/packages/ts-client/src/webrtc/webRTCEndpoint.ts +++ b/packages/ts-client/src/webrtc/webRTCEndpoint.ts @@ -20,7 +20,6 @@ import { LocalTrackManager } from './tracks/LocalTrackManager'; import { CommandsQueue } from './CommandsQueue'; import { Remote } from './tracks/Remote'; import { Local } from './tracks/Local'; -import type { TurnServer } from './ConnectionManager'; import { ConnectionManager } from './ConnectionManager'; /** @@ -208,7 +207,7 @@ export class WebRTCEndpoint extends if (this.getEndpointId() === data.endpointId) return; - this.remote.addTracks(data.endpointId, data.tracks, data.trackIdToMetadata); + this.remote.addTracks(data.endpointId, data.tracks); break; } case 'tracksRemoved': { @@ -224,9 +223,9 @@ export class WebRTCEndpoint extends } case 'sdpAnswer': + this.localTrackManager.ongoingRenegotiation = false; await this.onSdpAnswer(deserializedMediaEvent.data); - this.localTrackManager.ongoingRenegotiation = false; this.commandsQueue.processNextCommand(); break; @@ -694,6 +693,7 @@ export class WebRTCEndpoint extends // todo change to private public sendMediaEvent = (mediaEvent: MediaEvent) => { + console.log("send ME", mediaEvent) const serializedMediaEvent = serializeMediaEvent(mediaEvent); this.emit('sendMediaEvent', serializedMediaEvent); }; @@ -703,6 +703,8 @@ export class WebRTCEndpoint extends if (!connection) return; try { + this.localTrackManager.updateSenders(); + const offer = await connection.getConnection().createOffer(); if (!this.connectionManager) { @@ -728,10 +730,8 @@ export class WebRTCEndpoint extends private onOfferData = async (offerData: MediaEvent) => { const connection = this.connectionManager; - if (connection) { - connection.getConnection().restartIce(); - } else { - this.setConnection(offerData.data.integratedTurnServers); + if (!connection) { + this.setConnection(); const onIceCandidate = (event: RTCPeerConnectionIceEvent) => this.onLocalCandidate(event); const onIceCandidateError = (event: RTCPeerConnectionIceErrorEvent) => this.onIceCandidateError(event); @@ -758,8 +758,6 @@ export class WebRTCEndpoint extends this.local.addAllTracksToConnection(); } - this.localTrackManager.updateSenders(); - const tracks = new Map(Object.entries(offerData.data.tracksTypes)); this.connectionManager?.addTransceiversIfNeeded(tracks); @@ -767,8 +765,8 @@ export class WebRTCEndpoint extends await this.createAndSendOffer(); }; - private setConnection = (turnServers: TurnServer[]) => { - this.connectionManager = new ConnectionManager(turnServers); + private setConnection = () => { + this.connectionManager = new ConnectionManager(); this.localTrackManager.updateConnection(this.connectionManager); this.local.updateConnection(this.connectionManager); @@ -793,6 +791,8 @@ export class WebRTCEndpoint extends data: { candidate: event.candidate.candidate, sdpMLineIndex: event.candidate.sdpMLineIndex, + sdpMid: event.candidate.sdpMid, + usernameFragment: event.candidate.usernameFragment, }, }); this.sendMediaEvent(mediaEvent); @@ -820,7 +820,7 @@ export class WebRTCEndpoint extends console.warn('ICE connection: disconnected'); // Requesting renegotiation on ICE connection state failed fixes RTCPeerConnection // when the user changes their WiFi network. - this.sendMediaEvent(generateCustomEvent({ type: 'renegotiateTracks' })); + // this.sendMediaEvent(generateCustomEvent({ type: 'renegotiateTracks' })); break; case 'failed': this.emit('connectionError', {