@techsee/techsee-media-service 0.7.7 → 0.7.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/MediaSession/SessionTurn.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,aAAa,EACb,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAElB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAiD,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAWvH,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAKpD,qBAAa,iBAAkB,SAAQ,gBAAgB,CAAC,iBAAiB,CAAE,YAAW,aAAa;IAC/F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IACrC,OAAO,CAAC,OAAO,CAAM;aAEjB,EAAE,EAAI,MAAM;gBAIJ,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EACrE,eAAe,EAAE,oBAAoB,EACrC,aAAa,EAAE,sBAAsB;IA4BzC,OAAO,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiChE,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBlD,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,GAAG,IAAI;IAgDhD,oBAAoB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAwBjD,wBAAwB,CAAC,qBAAqB,EAAE,GAAG,GAAG,IAAI;IAgB1D,gBAAgB,CAAC,aAAa,EAAE,GAAG,GAAG,IAAI;IAuD1C,8BAA8B,IAAI,IAAI;IActC,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5F,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAY5E,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,qBAAqB;IA6D7B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,4BAA4B;IAMpC,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,mBAAmB;IAY3B,4BAA4B,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAuBzD,sBAAsB,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvG,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAejD,kBAAkB,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvE,qBAAqB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI;CAKjE","file":"SessionTurn.d.ts","sourcesContent":["import * as io from 'socket.io-client';\nimport once from 'lodash/once';\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n IMediaSession,\n ISessionStreamsManager,\n MediaSessionConfiguration,\n MediaSessionHandlers,\n MediaSessionParams,\n RemoteMediaTrack,\n RemoteTrackStats\n} from '../MediaContracts';\n\nimport {KnownMediaStream, MediaSessionDisconnectReason, SessionClientRole, SessionClientType} from '../MediaConstants';\n\nimport {\n SOCKET_EVENTS,\n SOCKET_PATH,\n SOCKET_RECONNECTION_ATTEMPTS,\n SOCKET_RECONNECTION_DELAY,\n SOCKET_RECONNECTION_DELAY_MAX\n} from './TurnConstants';\n\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {MediaSessionBase} from './MediaSessionBase';\n\nconst trace = getMediaTracer('TurnWebRtcSession');\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class TurnWebRtcSession extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {\n private readonly _sessionHandlers: MediaSessionHandlers;\n private readonly _pendingPeersIce: any;\n private readonly _configuration: any;\n private _socket: any;\n\n get id(): string {\n return this._sessionParams.sessionId;\n }\n\n constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration,\n sessionHandlers: MediaSessionHandlers,\n streamFactory: ISessionStreamsManager) {\n super(sessionParams, streamFactory);\n this._sessionHandlers = sessionHandlers;\n this._socket = null;\n this._pendingPeersIce = {};\n\n const iceServers = sessionParams.credentials.ice.map((item: any) => ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }));\n\n this._configuration = {\n iceServers,\n iceTransportPolicy: 'relay'\n };\n\n this._joinResponseHandler = this._joinResponseHandler.bind(this);\n this._iceCandidateReceivedHandler = this._iceCandidateReceivedHandler.bind(this);\n this._sendOfferHandler = this._sendOfferHandler.bind(this);\n this._sdpOfferHandler = this._sdpOfferHandler.bind(this);\n this._initiatorPeerReconnectHandler = this._initiatorPeerReconnectHandler.bind(this);\n this._peerDisconnectedHandler = this._peerDisconnectedHandler.bind(this);\n this._onSocketDisconnectedHandler = this._onSocketDisconnectedHandler.bind(this);\n }\n\n //#region Socket Connectivity\n\n connect(connectOnly = false): Promise<void> {\n trace.info('Connect to session');\n\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(() => {\n trace.info('Joining SessionId: ' + this._sessionParams.sessionId);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: this._sessionParams.clientType,\n sessionId: this._sessionParams.sessionId\n });\n })\n .catch((error) => {\n throw error;\n });\n }\n\n disconnect(): Promise<void> {\n return this._disconnectInternal(MediaSessionDisconnectReason.ForcedByConsumer);\n }\n\n _connectSocket(url: string, connectOnly: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': SOCKET_RECONNECTION_ATTEMPTS,\n 'path': SOCKET_PATH\n });\n\n const done = once((err?: any) => {\n err ? reject(err) : resolve();\n });\n\n socket.once('connect', () => done());\n socket.on(SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', this._onSocketDisconnectedHandler);\n\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n\n socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, this._joinResponseHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, this._peerDisconnectedHandler);\n socket.on(SOCKET_EVENTS.INCOMING.SDP_OFFER, this._sdpOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, this._initiatorPeerReconnectHandler);\n socket.on(SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, this._iceCandidateReceivedHandler);\n }\n });\n }\n\n _onSocketDisconnectedHandler(reason: string): void {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(() => undefined);\n }\n }\n }\n\n //#endregion\n\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n\n // Received by Initiator, causing him to emit SDP_OFFER\n _sendOfferHandler(sendOfferEventData: any): void {\n const {uid, peerId} = sendOfferEventData;\n\n trace.info('_sendOfferHandler');\n\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.GUEST, SessionClientRole.AGENT);\n const offerParams = {offerToReceiveAudio: true, offerToReceiveVideo: true};\n\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.AGENT)\n .then((mediaStream: Nullable<MediaStream>) => {\n trace.info('_sendOfferHandler stream and peer created');\n\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection for sending offer');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} ${track.id} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => peerConnection.createOffer(offerParams))\n .then((offerDesc) => {\n trace.info('Initiator has created sdp offer', {offerDesc});\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n\n return peerConnection.setLocalDescription(offerDesc)\n .then(() => {\n trace.info('Local description was set on peerConnection', peerConnection);\n this._setPeerConnectionMonitor(peerConnection);\n });\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler(joinResponseData: any): void {\n const {sdpAnswer, uid, peerId} = joinResponseData;\n\n trace.info('joinResponse Received', {sdpAnswer});\n\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n\n peerConnection.setRemoteDescription(answer)\n .then(() => {\n trace.info('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler(peerDisconnectedEvent: any): void {\n const {peerId} = peerDisconnectedEvent;\n\n trace.info('_peerDisconnectedHandler');\n\n this._withPeerConnection(peerId, (peerConnection: any) => {\n this._destroyPeerConnection(peerConnection);\n //this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n }\n\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n\n // Received by Guest, causing him to emit SDP_ANSWER\n _sdpOfferHandler(sdpOfferEvent: any): void {\n const {sdpOffer, peerId, uid} = sdpOfferEvent;\n\n trace.info('sdpOffer Received', {sdpOffer});\n\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.INITIATOR, SessionClientRole.USER);\n\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.USER)\n .then((mediaStream: Nullable<MediaStream>) => {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection offer handler');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => {\n const remoteDesc = new RTCSessionDescription({type: 'offer', sdp: sdpOffer});\n\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(() => {\n trace.info('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(() => {\n trace.info('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n this._setPeerConnectionMonitor(peerConnection);\n });\n });\n });\n\n })\n .catch((e) => {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _initiatorPeerReconnectHandler(): void {\n trace.info('_initiatorPeerReconnectHandler');\n this._disconnectInternal(MediaSessionDisconnectReason.InitiatorPeerReconnected)\n .catch((error: any) => {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n }\n\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n\n //#region Peer Connection\n\n //#region Streams Handling\n\n onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._disconnectInternal(MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(() => undefined);\n });\n\n return Promise.resolve();\n }\n\n onMediaStreamRenewed(clientRole: SessionClientRole, mediaStream: MediaStream): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n }\n\n getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats> {\n const peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n\n if (peerConnectionOfTrack !== null) {\n return (peerConnectionOfTrack as any).getStats(mediaTrack);\n }\n\n return Promise.reject(new Error('Provided track is not remote track'));\n }\n\n //#endregion\n\n private _disconnectInternal(reason: MediaSessionDisconnectReason): Promise<void> {\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._destroyPeerConnection(peerConnection);\n });\n\n if (this._socket) {\n trace.info('Disconnecting from session', reason);\n this._socket.off();\n this._socket.disconnect();\n this._socket = null;\n setTimeout(() => this._sessionHandlers.onDisconnectedHandler(reason));\n }\n\n return Promise.resolve();\n }\n\n private _createPeerConnection(peerId: string, peerConnectionType: SessionClientType, peerConnectionRole: SessionClientRole): RTCPeerConnection {\n if (this._peerConnections.get(peerId)) {\n throw new Error(`${this._sessionParams.clientType} peer connection for ${peerId} already exists`);\n }\n\n const peerConnection: any = new RTCPeerConnection(this._configuration);\n\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n peerConnection.connectionTimoutPrt = null;\n\n peerConnection.onconnectionstatechange = () => {\n trace.info('onconnectionstatechange', peerConnection);\n };\n\n peerConnection.oniceconnectionstatechange = (state: any) => {\n trace.info(`ICE Connection state for peer ${peerId} was changed to: ${state.currentTarget.iceConnectionState}`, state);\n const cnState = state.currentTarget.iceConnectionState;\n\n clearTimeout(peerConnection.connectionTimoutPrt);\n\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n this._iceStateDisconnected(peerConnection);\n } else if (cnState === 'connected') {\n this.registerPeersRemoteTracks(peerConnection);\n }\n };\n\n peerConnection.onicecandidate = (event: any) => {\n if (event.candidate) {\n trace.info(`${this._sessionParams.clientType} peerConn.onicecandidate`, event.candidate);\n this._socket.emit(SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: this._sessionParams.clientType\n });\n } else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n\n peerConnection.ontrack = (trackEvent: any) => {\n const track: MediaStreamTrack = trackEvent.track;\n\n trace.info(`MediaStreamTrack arrived from peerConnection: ${track.kind}`, track);\n this.addRemoteTrackToPeer(peerConnection, track);\n if (peerConnection.connectionState === 'connected') {\n this.registerPeersRemoteTracks(peerConnection);\n }\n };\n\n this._peerConnections.set(peerId, peerConnection);\n\n trace.info(`${peerConnectionType} peerConnection created`);\n\n return peerConnection;\n }\n\n private _setPeerConnectionMonitor(peerConnection: RTCPeerConnection) {\n clearTimeout(peerConnection.connectionTimoutPrt);\n peerConnection.connectionTimoutPrt = setTimeout(() => {\n trace.info('PeerConnection ICE state timeout', peerConnection);\n this._handlePeerConnectionTimeout(peerConnection);\n }, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);\n }\n\n private _handlePeerConnectionTimeout(peerConnection: RTCPeerConnection) {\n if (peerConnection.peerRole === SessionClientRole.USER) {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(() => undefined);\n }\n }\n\n private _destroyPeerConnection(peerConnection: RTCPeerConnection): void {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n\n clearTimeout(peerConnection.connectionTimoutPrt);\n this.unregisterPeersRemoteMediaTracks(peerConnection).catch(() => undefined);\n\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n }\n\n private _withPeerConnection(peerId: any, callback: any): void | undefined {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n\n return undefined;\n }\n\n //#endregion\n\n //#region ICE Candidates\n\n _iceCandidateReceivedHandler(iceCandidateData: any): void {\n const {candidate, peerId} = iceCandidateData;\n\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(() => undefined);\n }\n\n _addIceCandidateToPeer(iceCandidate: RTCIceCandidate, peerConnection: RTCPeerConnection): Promise<void> {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(() => {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n }\n\n _processQueuedIceCandidates(peerId: string): void {\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const pendingIces = this._pendingPeersIce[peerId];\n\n if (pendingIces) {\n pendingIces.forEach((pendingIce: RTCIceCandidate) => {\n trace.info('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection).catch(() => undefined);\n });\n } else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n }\n\n _queueIceCandidate(iceCandidate: RTCIceCandidate, peerId: string): void {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n\n this._pendingPeersIce[peerId].push(iceCandidate);\n }\n\n _iceStateDisconnected(peerConnection: RTCPeerConnection): void {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(() => undefined);\n }\n\n //#endregion\n}\n"]}
1
+ {"version":3,"sources":["../src/MediaSession/SessionTurn.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,aAAa,EACb,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAElB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAiD,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAWvH,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAKpD,qBAAa,iBAAkB,SAAQ,gBAAgB,CAAC,iBAAiB,CAAE,YAAW,aAAa;IAC/F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IACrC,OAAO,CAAC,OAAO,CAAM;aAEjB,EAAE,EAAI,MAAM;gBAIJ,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EACrE,eAAe,EAAE,oBAAoB,EACrC,aAAa,EAAE,sBAAsB;IA4BzC,OAAO,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiChE,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBlD,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,GAAG,IAAI;IAgDhD,oBAAoB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAwBjD,wBAAwB,CAAC,qBAAqB,EAAE,GAAG,GAAG,IAAI;IAgB1D,gBAAgB,CAAC,aAAa,EAAE,GAAG,GAAG,IAAI;IAuD1C,8BAA8B,IAAI,IAAI;IActC,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5F,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAY5E,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,qBAAqB;IA6D7B,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,mBAAmB;IAY3B,4BAA4B,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAuBzD,sBAAsB,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvG,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAejD,kBAAkB,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvE,qBAAqB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI;CAMjE","file":"SessionTurn.d.ts","sourcesContent":["import * as io from 'socket.io-client';\nimport once from 'lodash/once';\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n IMediaSession,\n ISessionStreamsManager,\n MediaSessionConfiguration,\n MediaSessionHandlers,\n MediaSessionParams,\n RemoteMediaTrack,\n RemoteTrackStats\n} from '../MediaContracts';\n\nimport {KnownMediaStream, MediaSessionDisconnectReason, SessionClientRole, SessionClientType} from '../MediaConstants';\n\nimport {\n SOCKET_EVENTS,\n SOCKET_PATH,\n SOCKET_RECONNECTION_ATTEMPTS,\n SOCKET_RECONNECTION_DELAY,\n SOCKET_RECONNECTION_DELAY_MAX\n} from './TurnConstants';\n\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {MediaSessionBase} from './MediaSessionBase';\n\nconst trace = getMediaTracer('TurnWebRtcSession');\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class TurnWebRtcSession extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {\n private readonly _sessionHandlers: MediaSessionHandlers;\n private readonly _pendingPeersIce: any;\n private readonly _configuration: any;\n private _socket: any;\n\n get id(): string {\n return this._sessionParams.sessionId;\n }\n\n constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration,\n sessionHandlers: MediaSessionHandlers,\n streamFactory: ISessionStreamsManager) {\n super(sessionParams, streamFactory);\n this._sessionHandlers = sessionHandlers;\n this._socket = null;\n this._pendingPeersIce = {};\n\n const iceServers = sessionParams.credentials.ice.map((item: any) => ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }));\n\n this._configuration = {\n iceServers,\n iceTransportPolicy: 'relay'\n };\n\n this._joinResponseHandler = this._joinResponseHandler.bind(this);\n this._iceCandidateReceivedHandler = this._iceCandidateReceivedHandler.bind(this);\n this._sendOfferHandler = this._sendOfferHandler.bind(this);\n this._sdpOfferHandler = this._sdpOfferHandler.bind(this);\n this._initiatorPeerReconnectHandler = this._initiatorPeerReconnectHandler.bind(this);\n this._peerDisconnectedHandler = this._peerDisconnectedHandler.bind(this);\n this._onSocketDisconnectedHandler = this._onSocketDisconnectedHandler.bind(this);\n }\n\n //#region Socket Connectivity\n\n connect(connectOnly = false): Promise<void> {\n trace.info('Connect to session');\n\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(() => {\n trace.info('Joining SessionId: ' + this._sessionParams.sessionId);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: this._sessionParams.clientType,\n sessionId: this._sessionParams.sessionId\n });\n })\n .catch((error) => {\n throw error;\n });\n }\n\n disconnect(): Promise<void> {\n trace.info('disconnect - call disconnect from session', MediaSessionDisconnectReason.ForcedByConsumer);\n \n return this._disconnectInternal(MediaSessionDisconnectReason.ForcedByConsumer);\n }\n\n _connectSocket(url: string, connectOnly: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': SOCKET_RECONNECTION_ATTEMPTS,\n 'path': SOCKET_PATH\n });\n\n const done = once((err?: any) => {\n err ? reject(err) : resolve();\n });\n\n socket.once('connect', () => done());\n socket.on(SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', this._onSocketDisconnectedHandler);\n\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n\n socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, this._joinResponseHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, this._peerDisconnectedHandler);\n socket.on(SOCKET_EVENTS.INCOMING.SDP_OFFER, this._sdpOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, this._initiatorPeerReconnectHandler);\n socket.on(SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, this._iceCandidateReceivedHandler);\n }\n });\n }\n\n _onSocketDisconnectedHandler(reason: string): void {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n trace.info('_onSocketDisconnectedHandler disconnect from session', MediaSessionDisconnectReason.SignalingChannelDisconnect);\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(() => undefined);\n }\n }\n }\n\n //#endregion\n\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n\n // Received by Initiator, causing him to emit SDP_OFFER\n _sendOfferHandler(sendOfferEventData: any): void {\n const {uid, peerId} = sendOfferEventData;\n\n trace.info('_sendOfferHandler');\n\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.GUEST, SessionClientRole.AGENT);\n const offerParams = {offerToReceiveAudio: true, offerToReceiveVideo: true};\n\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.AGENT)\n .then((mediaStream: Nullable<MediaStream>) => {\n trace.info('_sendOfferHandler stream and peer created');\n\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection for sending offer');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} ${track.id} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => peerConnection.createOffer(offerParams))\n .then((offerDesc) => {\n trace.info('Initiator has created sdp offer', {offerDesc});\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n\n return peerConnection.setLocalDescription(offerDesc)\n .then(() => {\n trace.info('Local description was set on peerConnection', peerConnection);\n this._setPeerConnectionMonitor(peerConnection);\n });\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler(joinResponseData: any): void {\n const {sdpAnswer, uid, peerId} = joinResponseData;\n\n trace.info('joinResponse Received', {sdpAnswer});\n\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n\n peerConnection.setRemoteDescription(answer)\n .then(() => {\n trace.info('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler(peerDisconnectedEvent: any): void {\n const {peerId} = peerDisconnectedEvent;\n\n trace.info('_peerDisconnectedHandler');\n\n this._withPeerConnection(peerId, (peerConnection: any) => {\n this._destroyPeerConnection(peerConnection);\n //this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n }\n\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n\n // Received by Guest, causing him to emit SDP_ANSWER\n _sdpOfferHandler(sdpOfferEvent: any): void {\n const {sdpOffer, peerId, uid} = sdpOfferEvent;\n\n trace.info('sdpOffer Received', {sdpOffer});\n\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.INITIATOR, SessionClientRole.USER);\n\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.USER)\n .then((mediaStream: Nullable<MediaStream>) => {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection offer handler');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => {\n const remoteDesc = new RTCSessionDescription({type: 'offer', sdp: sdpOffer});\n\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(() => {\n trace.info('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(() => {\n trace.info('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n this._setPeerConnectionMonitor(peerConnection);\n });\n });\n });\n\n })\n .catch((e) => {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _initiatorPeerReconnectHandler(): void {\n trace.info('_initiatorPeerReconnectHandler disconnect from session', MediaSessionDisconnectReason.InitiatorPeerReconnected);\n this._disconnectInternal(MediaSessionDisconnectReason.InitiatorPeerReconnected)\n .catch((error: any) => {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n }\n\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n\n //#region Peer Connection\n\n //#region Streams Handling\n\n onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n trace.info('onMediaStreamDestroyed disconnect all peer connections from session', MediaSessionDisconnectReason.PublishedStreamDestroyed);\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._disconnectInternal(MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(() => undefined);\n });\n\n return Promise.resolve();\n }\n\n onMediaStreamRenewed(clientRole: SessionClientRole, mediaStream: MediaStream): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n }\n\n getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats> {\n const peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n\n if (peerConnectionOfTrack !== null) {\n return (peerConnectionOfTrack as any).getStats(mediaTrack);\n }\n\n return Promise.reject(new Error('Provided track is not remote track'));\n }\n\n //#endregion\n\n private _disconnectInternal(reason: MediaSessionDisconnectReason): Promise<void> {\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._destroyPeerConnection(peerConnection);\n });\n\n if (this._socket) {\n trace.info('Disconnecting from session', reason);\n this._socket.off();\n this._socket.disconnect();\n this._socket = null;\n setTimeout(() => this._sessionHandlers.onDisconnectedHandler(reason));\n }\n\n return Promise.resolve();\n }\n\n private _createPeerConnection(peerId: string, peerConnectionType: SessionClientType, peerConnectionRole: SessionClientRole): RTCPeerConnection {\n if (this._peerConnections.get(peerId)) {\n throw new Error(`${this._sessionParams.clientType} peer connection for ${peerId} already exists`);\n }\n\n const peerConnection: any = new RTCPeerConnection(this._configuration);\n\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n peerConnection.connectionTimoutPrt = null;\n\n peerConnection.onconnectionstatechange = () => {\n trace.info('onconnectionstatechange', peerConnection);\n };\n\n peerConnection.oniceconnectionstatechange = (state: any) => {\n trace.info(`ICE Connection state for peer ${peerId} was changed to: ${state.currentTarget.iceConnectionState}`, state);\n const cnState = state.currentTarget.iceConnectionState;\n\n clearTimeout(peerConnection.connectionTimoutPrt);\n\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n this._iceStateDisconnected(peerConnection);\n } else if (cnState === 'connected') {\n this.registerPeersRemoteTracks(peerConnection);\n }\n };\n\n peerConnection.onicecandidate = (event: any) => {\n if (event.candidate) {\n trace.info(`${this._sessionParams.clientType} peerConn.onicecandidate`, event.candidate);\n this._socket.emit(SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: this._sessionParams.clientType\n });\n } else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n\n peerConnection.ontrack = (trackEvent: any) => {\n const track: MediaStreamTrack = trackEvent.track;\n\n trace.info(`MediaStreamTrack arrived from peerConnection: ${track.kind}`, track);\n this.addRemoteTrackToPeer(peerConnection, track);\n if (peerConnection.connectionState === 'connected') {\n this.registerPeersRemoteTracks(peerConnection);\n }\n };\n\n this._peerConnections.set(peerId, peerConnection);\n\n trace.info(`${peerConnectionType} peerConnection created`);\n\n return peerConnection;\n }\n\n private _setPeerConnectionMonitor(peerConnection: RTCPeerConnection) {\n clearTimeout(peerConnection.connectionTimoutPrt);\n peerConnection.connectionTimoutPrt = setTimeout(() => {\n trace.info('PeerConnection ICE state timeout', peerConnection);\n this._handlePeerConnectionTimeout(peerConnection);\n }, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);\n }\n\n private _handlePeerConnectionTimeout(peerConnection: RTCPeerConnection) {\n trace.info('_handlePeerConnectionTimeout disconnect from session', MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout);\n if (peerConnection.peerRole === SessionClientRole.USER) {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(() => undefined);\n }\n }\n\n private _destroyPeerConnection(peerConnection: RTCPeerConnection): void {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n\n clearTimeout(peerConnection.connectionTimoutPrt);\n this.unregisterPeersRemoteMediaTracks(peerConnection).catch(() => undefined);\n\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n }\n\n private _withPeerConnection(peerId: any, callback: any): void | undefined {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n\n return undefined;\n }\n\n //#endregion\n\n //#region ICE Candidates\n\n _iceCandidateReceivedHandler(iceCandidateData: any): void {\n const {candidate, peerId} = iceCandidateData;\n\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(() => undefined);\n }\n\n _addIceCandidateToPeer(iceCandidate: RTCIceCandidate, peerConnection: RTCPeerConnection): Promise<void> {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(() => {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n }\n\n _processQueuedIceCandidates(peerId: string): void {\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const pendingIces = this._pendingPeersIce[peerId];\n\n if (pendingIces) {\n pendingIces.forEach((pendingIce: RTCIceCandidate) => {\n trace.info('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection).catch(() => undefined);\n });\n } else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n }\n\n _queueIceCandidate(iceCandidate: RTCIceCandidate, peerId: string): void {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n\n this._pendingPeersIce[peerId].push(iceCandidate);\n }\n\n _iceStateDisconnected(peerConnection: RTCPeerConnection): void {\n trace.info('_iceStateDisconnected disconnect from session', MediaSessionDisconnectReason.PeerConnectionInterrupted);\n this._disconnectInternal(MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(() => undefined);\n }\n\n //#endregion\n}\n"]}
@@ -91,6 +91,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
91
91
  });
92
92
  };
93
93
  TurnWebRtcSession.prototype.disconnect = function () {
94
+ trace.info('disconnect - call disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);
94
95
  return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);
95
96
  };
96
97
  TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {
@@ -129,6 +130,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
129
130
  // The initial example of differentiating between "forced" disconnect and "network" disconnect is taken from:
130
131
  // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99
131
132
  if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {
133
+ trace.info('_onSocketDisconnectedHandler disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect);
132
134
  // the disconnection was initiated by the server or by client, you need to call (connect) manually
133
135
  this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(function () {
134
136
  return undefined;
@@ -254,7 +256,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
254
256
  };
255
257
  // Received by Guest after an Initiator reconnects to room
256
258
  TurnWebRtcSession.prototype._initiatorPeerReconnectHandler = function () {
257
- trace.info('_initiatorPeerReconnectHandler');
259
+ trace.info('_initiatorPeerReconnectHandler disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected);
258
260
  this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected).catch(function (error) {
259
261
  trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);
260
262
  });
@@ -265,6 +267,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
265
267
  TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {
266
268
  var _this = this;
267
269
  //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation
270
+ trace.info('onMediaStreamDestroyed disconnect all peer connections from session', MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed);
268
271
  this._peerConnections.forEach(function (peerConnection) {
269
272
  _this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(function () {
270
273
  return undefined;
@@ -358,6 +361,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
358
361
  }, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);
359
362
  };
360
363
  TurnWebRtcSession.prototype._handlePeerConnectionTimeout = function (peerConnection) {
364
+ trace.info('_handlePeerConnectionTimeout disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout);
361
365
  if (peerConnection.peerRole === MediaConstants_1.SessionClientRole.USER) {
362
366
  this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(function () {
363
367
  return undefined;
@@ -436,6 +440,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
436
440
  this._pendingPeersIce[peerId].push(iceCandidate);
437
441
  };
438
442
  TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {
443
+ trace.info('_iceStateDisconnected disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted);
439
444
  this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () {
440
445
  return undefined;
441
446
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["MediaSession/SessionTurn.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","__importStar","mod","__esModule","result","k","call","__importDefault","defineProperty","exports","value","io","require","once_1","MediaConstants_1","TurnConstants_1","MediaTracer_1","MediaSessionBase_1","trace","getMediaTracer","TurnWebRtcSession","_super","sessionParams","sessionHandlers","streamFactory","_this","_sessionHandlers","_socket","_pendingPeersIce","iceServers","credentials","ice","map","item","urls","url","username","login","credential","password","_configuration","iceTransportPolicy","_joinResponseHandler","bind","_iceCandidateReceivedHandler","_sendOfferHandler","_sdpOfferHandler","_initiatorPeerReconnectHandler","_peerDisconnectedHandler","_onSocketDisconnectedHandler","get","_sessionParams","sessionId","enumerable","configurable","connect","connectOnly","info","_connectSocket","then","emit","SOCKET_EVENTS","OUTGOING","JOIN_ROOM","clientType","catch","error","disconnect","_disconnectInternal","MediaSessionDisconnectReason","ForcedByConsumer","Promise","resolve","reject","socket","SOCKET_RECONNECTION_DELAY","SOCKET_RECONNECTION_DELAY_MAX","SOCKET_RECONNECTION_ATTEMPTS","SOCKET_PATH","done","default","err","once","on","INCOMING","ERROR","SEND_OFFER","JOIN_RESPONSE","PEER_DISCONNECTED","SDP_OFFER","PUBLISHER_RECONNECT","ICE_CANDIDATE","reason","SignalingChannelDisconnect","undefined","sendOfferEventData","uid","peerId","peerConnection","_createPeerConnection","SessionClientType","GUEST","SessionClientRole","AGENT","offerParams","offerToReceiveAudio","offerToReceiveVideo","_sessionStreamsManager","getMediaStreamForRole","mediaStream","getTracks","forEach","track","addTrack","kind","id","createOffer","offerDesc","sdpOffer","sdp","setLocalDescription","_setPeerConnectionMonitor","e","warn","joinResponseData","sdpAnswer","_withPeerConnection","answer","RTCSessionDescription","type","setRemoteDescription","_processQueuedIceCandidates","peerDisconnectedEvent","_destroyPeerConnection","sdpOfferEvent","INITIATOR","USER","remoteDesc","createAnswer","SDP_ANSWER","InitiatorPeerReconnected","onMediaStreamDestroyed","clientRole","_peerConnections","PublishedStreamDestroyed","onMediaStreamRenewed","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","getStats","Error","off","setTimeout","onDisconnectedHandler","peerConnectionType","peerConnectionRole","RTCPeerConnection","peerType","remoteMediaTracks","peerRole","connectionTimoutPrt","onconnectionstatechange","oniceconnectionstatechange","state","currentTarget","iceConnectionState","cnState","clearTimeout","indexOf","_iceStateDisconnected","registerPeersRemoteTracks","onicecandidate","event","candidate","ontrack","trackEvent","addRemoteTrackToPeer","connectionState","set","_handlePeerConnectionTimeout","peerConnectivityTimeoutSeconds","PeerConnectionStateChangeTimeout","onicegatheringstatechange","unregisterPeersRemoteMediaTracks","delete","close","callback","iceCandidateData","remoteDescription","_queueIceCandidate","_addIceCandidateToPeer","iceCandidate","addIceCandidate","pendingIces","pendingIce","push","PeerConnectionInterrupted","MediaSessionBase"],"mappings":"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","file":"SessionTurn.js","sourcesContent":["\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar io = __importStar(require(\"socket.io-client\"));\nvar once_1 = __importDefault(require(\"lodash/once\"));\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar TurnConstants_1 = require(\"./TurnConstants\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar trace = MediaTracer_1.getMediaTracer('TurnWebRtcSession');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar TurnWebRtcSession = /** @class */ (function (_super) {\n __extends(TurnWebRtcSession, _super);\n function TurnWebRtcSession(sessionParams, sessionHandlers, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._sessionHandlers = sessionHandlers;\n _this._socket = null;\n _this._pendingPeersIce = {};\n var iceServers = sessionParams.credentials.ice.map(function (item) { return ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }); });\n _this._configuration = {\n iceServers: iceServers,\n iceTransportPolicy: 'relay'\n };\n _this._joinResponseHandler = _this._joinResponseHandler.bind(_this);\n _this._iceCandidateReceivedHandler = _this._iceCandidateReceivedHandler.bind(_this);\n _this._sendOfferHandler = _this._sendOfferHandler.bind(_this);\n _this._sdpOfferHandler = _this._sdpOfferHandler.bind(_this);\n _this._initiatorPeerReconnectHandler = _this._initiatorPeerReconnectHandler.bind(_this);\n _this._peerDisconnectedHandler = _this._peerDisconnectedHandler.bind(_this);\n _this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(TurnWebRtcSession.prototype, \"id\", {\n get: function () {\n return this._sessionParams.sessionId;\n },\n enumerable: true,\n configurable: true\n });\n //#region Socket Connectivity\n TurnWebRtcSession.prototype.connect = function (connectOnly) {\n var _this = this;\n if (connectOnly === void 0) { connectOnly = false; }\n trace.info('Connect to session');\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(function () {\n trace.info('Joining SessionId: ' + _this._sessionParams.sessionId);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: _this._sessionParams.clientType,\n sessionId: _this._sessionParams.sessionId\n });\n })\n .catch(function (error) {\n throw error;\n });\n };\n TurnWebRtcSession.prototype.disconnect = function () {\n return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);\n };\n TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var socket = _this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': TurnConstants_1.SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': TurnConstants_1.SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': TurnConstants_1.SOCKET_RECONNECTION_ATTEMPTS,\n 'path': TurnConstants_1.SOCKET_PATH\n });\n var done = once_1.default(function (err) {\n err ? reject(err) : resolve();\n });\n socket.once('connect', function () { return done(); });\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', _this._onSocketDisconnectedHandler);\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SEND_OFFER, _this._sendOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, _this._joinResponseHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, _this._peerDisconnectedHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SDP_OFFER, _this._sdpOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this._initiatorPeerReconnectHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, _this._iceCandidateReceivedHandler);\n }\n });\n };\n TurnWebRtcSession.prototype._onSocketDisconnectedHandler = function (reason) {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(function () { return undefined; });\n }\n }\n };\n //#endregion\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n // Received by Initiator, causing him to emit SDP_OFFER\n TurnWebRtcSession.prototype._sendOfferHandler = function (sendOfferEventData) {\n var _this = this;\n var uid = sendOfferEventData.uid, peerId = sendOfferEventData.peerId;\n trace.info('_sendOfferHandler');\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.GUEST, MediaConstants_1.SessionClientRole.AGENT);\n var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.AGENT)\n .then(function (mediaStream) {\n trace.info('_sendOfferHandler stream and peer created');\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection for sending offer');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" \" + track.id + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () { return peerConnection.createOffer(offerParams); })\n .then(function (offerDesc) {\n trace.info('Initiator has created sdp offer', { offerDesc: offerDesc });\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n return peerConnection.setLocalDescription(offerDesc)\n .then(function () {\n trace.info('Local description was set on peerConnection', peerConnection);\n _this._setPeerConnectionMonitor(peerConnection);\n });\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n };\n // Received by the Initiator: Indicates that publish should be started\n TurnWebRtcSession.prototype._joinResponseHandler = function (joinResponseData) {\n var _this = this;\n var sdpAnswer = joinResponseData.sdpAnswer, uid = joinResponseData.uid, peerId = joinResponseData.peerId;\n trace.info('joinResponse Received', { sdpAnswer: sdpAnswer });\n this._withPeerConnection(peerId, function (peerConnection) {\n var answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n peerConnection.setRemoteDescription(answer)\n .then(function () {\n trace.info('Remote description was set', answer);\n _this._processQueuedIceCandidates(peerId);\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n });\n };\n // Received by Initiator after a guests socket has been disconnected\n TurnWebRtcSession.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {\n var _this = this;\n var peerId = peerDisconnectedEvent.peerId;\n trace.info('_peerDisconnectedHandler');\n this._withPeerConnection(peerId, function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n //this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n };\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n // Received by Guest, causing him to emit SDP_ANSWER\n TurnWebRtcSession.prototype._sdpOfferHandler = function (sdpOfferEvent) {\n var _this = this;\n var sdpOffer = sdpOfferEvent.sdpOffer, peerId = sdpOfferEvent.peerId, uid = sdpOfferEvent.uid;\n trace.info('sdpOffer Received', { sdpOffer: sdpOffer });\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.INITIATOR, MediaConstants_1.SessionClientRole.USER);\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.USER)\n .then(function (mediaStream) {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection offer handler');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () {\n var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(function () {\n trace.info('Remote description was set', remoteDesc);\n return peerConnection.createAnswer()\n .then(function (sdpAnswer) {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(function () {\n trace.info('_sdpOfferHandler local desc was set');\n _this._processQueuedIceCandidates(peerId);\n _this._setPeerConnectionMonitor(peerConnection);\n });\n });\n });\n })\n .catch(function (e) {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n };\n // Received by Guest after an Initiator reconnects to room\n TurnWebRtcSession.prototype._initiatorPeerReconnectHandler = function () {\n trace.info('_initiatorPeerReconnectHandler');\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected)\n .catch(function (error) {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n };\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n //#region Peer Connection\n //#region Streams Handling\n TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n this._peerConnections.forEach(function (peerConnection) {\n _this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(function () { return undefined; });\n });\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n if (peerConnectionOfTrack !== null) {\n return peerConnectionOfTrack.getStats(mediaTrack);\n }\n return Promise.reject(new Error('Provided track is not remote track'));\n };\n //#endregion\n TurnWebRtcSession.prototype._disconnectInternal = function (reason) {\n var _this = this;\n this._peerConnections.forEach(function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n });\n if (this._socket) {\n trace.info('Disconnecting from session', reason);\n this._socket.off();\n this._socket.disconnect();\n this._socket = null;\n setTimeout(function () { return _this._sessionHandlers.onDisconnectedHandler(reason); });\n }\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {\n var _this = this;\n if (this._peerConnections.get(peerId)) {\n throw new Error(this._sessionParams.clientType + \" peer connection for \" + peerId + \" already exists\");\n }\n var peerConnection = new RTCPeerConnection(this._configuration);\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n peerConnection.connectionTimoutPrt = null;\n peerConnection.onconnectionstatechange = function () {\n trace.info('onconnectionstatechange', peerConnection);\n };\n peerConnection.oniceconnectionstatechange = function (state) {\n trace.info(\"ICE Connection state for peer \" + peerId + \" was changed to: \" + state.currentTarget.iceConnectionState, state);\n var cnState = state.currentTarget.iceConnectionState;\n clearTimeout(peerConnection.connectionTimoutPrt);\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n _this._iceStateDisconnected(peerConnection);\n }\n else if (cnState === 'connected') {\n _this.registerPeersRemoteTracks(peerConnection);\n }\n };\n peerConnection.onicecandidate = function (event) {\n if (event.candidate) {\n trace.info(_this._sessionParams.clientType + \" peerConn.onicecandidate\", event.candidate);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: _this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: _this._sessionParams.clientType\n });\n }\n else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n peerConnection.ontrack = function (trackEvent) {\n var track = trackEvent.track;\n trace.info(\"MediaStreamTrack arrived from peerConnection: \" + track.kind, track);\n _this.addRemoteTrackToPeer(peerConnection, track);\n if (peerConnection.connectionState === 'connected') {\n _this.registerPeersRemoteTracks(peerConnection);\n }\n };\n this._peerConnections.set(peerId, peerConnection);\n trace.info(peerConnectionType + \" peerConnection created\");\n return peerConnection;\n };\n TurnWebRtcSession.prototype._setPeerConnectionMonitor = function (peerConnection) {\n var _this = this;\n clearTimeout(peerConnection.connectionTimoutPrt);\n peerConnection.connectionTimoutPrt = setTimeout(function () {\n trace.info('PeerConnection ICE state timeout', peerConnection);\n _this._handlePeerConnectionTimeout(peerConnection);\n }, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);\n };\n TurnWebRtcSession.prototype._handlePeerConnectionTimeout = function (peerConnection) {\n if (peerConnection.peerRole === MediaConstants_1.SessionClientRole.USER) {\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(function () { return undefined; });\n }\n };\n TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n clearTimeout(peerConnection.connectionTimoutPrt);\n this.unregisterPeersRemoteMediaTracks(peerConnection).catch(function () { return undefined; });\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n };\n TurnWebRtcSession.prototype._withPeerConnection = function (peerId, callback) {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n return undefined;\n };\n //#endregion\n //#region ICE Candidates\n TurnWebRtcSession.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {\n var candidate = iceCandidateData.candidate, peerId = iceCandidateData.peerId;\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n return;\n }\n var peerConnection = this._peerConnections.get(peerId);\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n return;\n }\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(function () { return undefined; });\n };\n TurnWebRtcSession.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(function () {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch(function (e) {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n };\n TurnWebRtcSession.prototype._processQueuedIceCandidates = function (peerId) {\n var _this = this;\n this._withPeerConnection(peerId, function (peerConnection) {\n var pendingIces = _this._pendingPeersIce[peerId];\n if (pendingIces) {\n pendingIces.forEach(function (pendingIce) {\n trace.info('Adding pending ICE to peer connections');\n _this._addIceCandidateToPeer(pendingIce, peerConnection).catch(function () { return undefined; });\n });\n }\n else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n };\n TurnWebRtcSession.prototype._queueIceCandidate = function (iceCandidate, peerId) {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n this._pendingPeersIce[peerId].push(iceCandidate);\n };\n TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () { return undefined; });\n };\n return TurnWebRtcSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.TurnWebRtcSession = TurnWebRtcSession;\n\n//# sourceMappingURL=SessionTurn.js.map\n"]}
1
+ {"version":3,"sources":["MediaSession/SessionTurn.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","__importStar","mod","__esModule","result","k","call","__importDefault","defineProperty","exports","value","io","require","once_1","MediaConstants_1","TurnConstants_1","MediaTracer_1","MediaSessionBase_1","trace","getMediaTracer","TurnWebRtcSession","_super","sessionParams","sessionHandlers","streamFactory","_this","_sessionHandlers","_socket","_pendingPeersIce","iceServers","credentials","ice","map","item","urls","url","username","login","credential","password","_configuration","iceTransportPolicy","_joinResponseHandler","bind","_iceCandidateReceivedHandler","_sendOfferHandler","_sdpOfferHandler","_initiatorPeerReconnectHandler","_peerDisconnectedHandler","_onSocketDisconnectedHandler","get","_sessionParams","sessionId","enumerable","configurable","connect","connectOnly","info","_connectSocket","then","emit","SOCKET_EVENTS","OUTGOING","JOIN_ROOM","clientType","catch","error","disconnect","MediaSessionDisconnectReason","ForcedByConsumer","_disconnectInternal","Promise","resolve","reject","socket","SOCKET_RECONNECTION_DELAY","SOCKET_RECONNECTION_DELAY_MAX","SOCKET_RECONNECTION_ATTEMPTS","SOCKET_PATH","done","default","err","once","on","INCOMING","ERROR","SEND_OFFER","JOIN_RESPONSE","PEER_DISCONNECTED","SDP_OFFER","PUBLISHER_RECONNECT","ICE_CANDIDATE","reason","SignalingChannelDisconnect","undefined","sendOfferEventData","uid","peerId","peerConnection","_createPeerConnection","SessionClientType","GUEST","SessionClientRole","AGENT","offerParams","offerToReceiveAudio","offerToReceiveVideo","_sessionStreamsManager","getMediaStreamForRole","mediaStream","getTracks","forEach","track","addTrack","kind","id","createOffer","offerDesc","sdpOffer","sdp","setLocalDescription","_setPeerConnectionMonitor","e","warn","joinResponseData","sdpAnswer","_withPeerConnection","answer","RTCSessionDescription","type","setRemoteDescription","_processQueuedIceCandidates","peerDisconnectedEvent","_destroyPeerConnection","sdpOfferEvent","INITIATOR","USER","remoteDesc","createAnswer","SDP_ANSWER","InitiatorPeerReconnected","onMediaStreamDestroyed","clientRole","PublishedStreamDestroyed","_peerConnections","onMediaStreamRenewed","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","getStats","Error","off","setTimeout","onDisconnectedHandler","peerConnectionType","peerConnectionRole","RTCPeerConnection","peerType","remoteMediaTracks","peerRole","connectionTimoutPrt","onconnectionstatechange","oniceconnectionstatechange","state","currentTarget","iceConnectionState","cnState","clearTimeout","indexOf","_iceStateDisconnected","registerPeersRemoteTracks","onicecandidate","event","candidate","ontrack","trackEvent","addRemoteTrackToPeer","connectionState","set","_handlePeerConnectionTimeout","peerConnectivityTimeoutSeconds","PeerConnectionStateChangeTimeout","onicegatheringstatechange","unregisterPeersRemoteMediaTracks","delete","close","callback","iceCandidateData","remoteDescription","_queueIceCandidate","_addIceCandidateToPeer","iceCandidate","addIceCandidate","pendingIces","pendingIce","push","PeerConnectionInterrupted","MediaSessionBase"],"mappings":"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","file":"SessionTurn.js","sourcesContent":["\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar io = __importStar(require(\"socket.io-client\"));\nvar once_1 = __importDefault(require(\"lodash/once\"));\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar TurnConstants_1 = require(\"./TurnConstants\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar trace = MediaTracer_1.getMediaTracer('TurnWebRtcSession');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar TurnWebRtcSession = /** @class */ (function (_super) {\n __extends(TurnWebRtcSession, _super);\n function TurnWebRtcSession(sessionParams, sessionHandlers, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._sessionHandlers = sessionHandlers;\n _this._socket = null;\n _this._pendingPeersIce = {};\n var iceServers = sessionParams.credentials.ice.map(function (item) { return ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }); });\n _this._configuration = {\n iceServers: iceServers,\n iceTransportPolicy: 'relay'\n };\n _this._joinResponseHandler = _this._joinResponseHandler.bind(_this);\n _this._iceCandidateReceivedHandler = _this._iceCandidateReceivedHandler.bind(_this);\n _this._sendOfferHandler = _this._sendOfferHandler.bind(_this);\n _this._sdpOfferHandler = _this._sdpOfferHandler.bind(_this);\n _this._initiatorPeerReconnectHandler = _this._initiatorPeerReconnectHandler.bind(_this);\n _this._peerDisconnectedHandler = _this._peerDisconnectedHandler.bind(_this);\n _this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(TurnWebRtcSession.prototype, \"id\", {\n get: function () {\n return this._sessionParams.sessionId;\n },\n enumerable: true,\n configurable: true\n });\n //#region Socket Connectivity\n TurnWebRtcSession.prototype.connect = function (connectOnly) {\n var _this = this;\n if (connectOnly === void 0) { connectOnly = false; }\n trace.info('Connect to session');\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(function () {\n trace.info('Joining SessionId: ' + _this._sessionParams.sessionId);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: _this._sessionParams.clientType,\n sessionId: _this._sessionParams.sessionId\n });\n })\n .catch(function (error) {\n throw error;\n });\n };\n TurnWebRtcSession.prototype.disconnect = function () {\n trace.info('disconnect - call disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);\n return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);\n };\n TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var socket = _this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': TurnConstants_1.SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': TurnConstants_1.SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': TurnConstants_1.SOCKET_RECONNECTION_ATTEMPTS,\n 'path': TurnConstants_1.SOCKET_PATH\n });\n var done = once_1.default(function (err) {\n err ? reject(err) : resolve();\n });\n socket.once('connect', function () { return done(); });\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', _this._onSocketDisconnectedHandler);\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SEND_OFFER, _this._sendOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, _this._joinResponseHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, _this._peerDisconnectedHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SDP_OFFER, _this._sdpOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this._initiatorPeerReconnectHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, _this._iceCandidateReceivedHandler);\n }\n });\n };\n TurnWebRtcSession.prototype._onSocketDisconnectedHandler = function (reason) {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n trace.info('_onSocketDisconnectedHandler disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect);\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(function () { return undefined; });\n }\n }\n };\n //#endregion\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n // Received by Initiator, causing him to emit SDP_OFFER\n TurnWebRtcSession.prototype._sendOfferHandler = function (sendOfferEventData) {\n var _this = this;\n var uid = sendOfferEventData.uid, peerId = sendOfferEventData.peerId;\n trace.info('_sendOfferHandler');\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.GUEST, MediaConstants_1.SessionClientRole.AGENT);\n var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.AGENT)\n .then(function (mediaStream) {\n trace.info('_sendOfferHandler stream and peer created');\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection for sending offer');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" \" + track.id + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () { return peerConnection.createOffer(offerParams); })\n .then(function (offerDesc) {\n trace.info('Initiator has created sdp offer', { offerDesc: offerDesc });\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n return peerConnection.setLocalDescription(offerDesc)\n .then(function () {\n trace.info('Local description was set on peerConnection', peerConnection);\n _this._setPeerConnectionMonitor(peerConnection);\n });\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n };\n // Received by the Initiator: Indicates that publish should be started\n TurnWebRtcSession.prototype._joinResponseHandler = function (joinResponseData) {\n var _this = this;\n var sdpAnswer = joinResponseData.sdpAnswer, uid = joinResponseData.uid, peerId = joinResponseData.peerId;\n trace.info('joinResponse Received', { sdpAnswer: sdpAnswer });\n this._withPeerConnection(peerId, function (peerConnection) {\n var answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n peerConnection.setRemoteDescription(answer)\n .then(function () {\n trace.info('Remote description was set', answer);\n _this._processQueuedIceCandidates(peerId);\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n });\n };\n // Received by Initiator after a guests socket has been disconnected\n TurnWebRtcSession.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {\n var _this = this;\n var peerId = peerDisconnectedEvent.peerId;\n trace.info('_peerDisconnectedHandler');\n this._withPeerConnection(peerId, function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n //this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n };\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n // Received by Guest, causing him to emit SDP_ANSWER\n TurnWebRtcSession.prototype._sdpOfferHandler = function (sdpOfferEvent) {\n var _this = this;\n var sdpOffer = sdpOfferEvent.sdpOffer, peerId = sdpOfferEvent.peerId, uid = sdpOfferEvent.uid;\n trace.info('sdpOffer Received', { sdpOffer: sdpOffer });\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.INITIATOR, MediaConstants_1.SessionClientRole.USER);\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.USER)\n .then(function (mediaStream) {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection offer handler');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () {\n var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(function () {\n trace.info('Remote description was set', remoteDesc);\n return peerConnection.createAnswer()\n .then(function (sdpAnswer) {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(function () {\n trace.info('_sdpOfferHandler local desc was set');\n _this._processQueuedIceCandidates(peerId);\n _this._setPeerConnectionMonitor(peerConnection);\n });\n });\n });\n })\n .catch(function (e) {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n };\n // Received by Guest after an Initiator reconnects to room\n TurnWebRtcSession.prototype._initiatorPeerReconnectHandler = function () {\n trace.info('_initiatorPeerReconnectHandler disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected);\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected)\n .catch(function (error) {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n };\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n //#region Peer Connection\n //#region Streams Handling\n TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n trace.info('onMediaStreamDestroyed disconnect all peer connections from session', MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed);\n this._peerConnections.forEach(function (peerConnection) {\n _this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(function () { return undefined; });\n });\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n if (peerConnectionOfTrack !== null) {\n return peerConnectionOfTrack.getStats(mediaTrack);\n }\n return Promise.reject(new Error('Provided track is not remote track'));\n };\n //#endregion\n TurnWebRtcSession.prototype._disconnectInternal = function (reason) {\n var _this = this;\n this._peerConnections.forEach(function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n });\n if (this._socket) {\n trace.info('Disconnecting from session', reason);\n this._socket.off();\n this._socket.disconnect();\n this._socket = null;\n setTimeout(function () { return _this._sessionHandlers.onDisconnectedHandler(reason); });\n }\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {\n var _this = this;\n if (this._peerConnections.get(peerId)) {\n throw new Error(this._sessionParams.clientType + \" peer connection for \" + peerId + \" already exists\");\n }\n var peerConnection = new RTCPeerConnection(this._configuration);\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n peerConnection.connectionTimoutPrt = null;\n peerConnection.onconnectionstatechange = function () {\n trace.info('onconnectionstatechange', peerConnection);\n };\n peerConnection.oniceconnectionstatechange = function (state) {\n trace.info(\"ICE Connection state for peer \" + peerId + \" was changed to: \" + state.currentTarget.iceConnectionState, state);\n var cnState = state.currentTarget.iceConnectionState;\n clearTimeout(peerConnection.connectionTimoutPrt);\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n _this._iceStateDisconnected(peerConnection);\n }\n else if (cnState === 'connected') {\n _this.registerPeersRemoteTracks(peerConnection);\n }\n };\n peerConnection.onicecandidate = function (event) {\n if (event.candidate) {\n trace.info(_this._sessionParams.clientType + \" peerConn.onicecandidate\", event.candidate);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: _this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: _this._sessionParams.clientType\n });\n }\n else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n peerConnection.ontrack = function (trackEvent) {\n var track = trackEvent.track;\n trace.info(\"MediaStreamTrack arrived from peerConnection: \" + track.kind, track);\n _this.addRemoteTrackToPeer(peerConnection, track);\n if (peerConnection.connectionState === 'connected') {\n _this.registerPeersRemoteTracks(peerConnection);\n }\n };\n this._peerConnections.set(peerId, peerConnection);\n trace.info(peerConnectionType + \" peerConnection created\");\n return peerConnection;\n };\n TurnWebRtcSession.prototype._setPeerConnectionMonitor = function (peerConnection) {\n var _this = this;\n clearTimeout(peerConnection.connectionTimoutPrt);\n peerConnection.connectionTimoutPrt = setTimeout(function () {\n trace.info('PeerConnection ICE state timeout', peerConnection);\n _this._handlePeerConnectionTimeout(peerConnection);\n }, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);\n };\n TurnWebRtcSession.prototype._handlePeerConnectionTimeout = function (peerConnection) {\n trace.info('_handlePeerConnectionTimeout disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout);\n if (peerConnection.peerRole === MediaConstants_1.SessionClientRole.USER) {\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(function () { return undefined; });\n }\n };\n TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n clearTimeout(peerConnection.connectionTimoutPrt);\n this.unregisterPeersRemoteMediaTracks(peerConnection).catch(function () { return undefined; });\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n };\n TurnWebRtcSession.prototype._withPeerConnection = function (peerId, callback) {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n return undefined;\n };\n //#endregion\n //#region ICE Candidates\n TurnWebRtcSession.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {\n var candidate = iceCandidateData.candidate, peerId = iceCandidateData.peerId;\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n return;\n }\n var peerConnection = this._peerConnections.get(peerId);\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n return;\n }\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(function () { return undefined; });\n };\n TurnWebRtcSession.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(function () {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch(function (e) {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n };\n TurnWebRtcSession.prototype._processQueuedIceCandidates = function (peerId) {\n var _this = this;\n this._withPeerConnection(peerId, function (peerConnection) {\n var pendingIces = _this._pendingPeersIce[peerId];\n if (pendingIces) {\n pendingIces.forEach(function (pendingIce) {\n trace.info('Adding pending ICE to peer connections');\n _this._addIceCandidateToPeer(pendingIce, peerConnection).catch(function () { return undefined; });\n });\n }\n else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n };\n TurnWebRtcSession.prototype._queueIceCandidate = function (iceCandidate, peerId) {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n this._pendingPeersIce[peerId].push(iceCandidate);\n };\n TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {\n trace.info('_iceStateDisconnected disconnect from session', MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted);\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () { return undefined; });\n };\n return TurnWebRtcSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.TurnWebRtcSession = TurnWebRtcSession;\n\n//# sourceMappingURL=SessionTurn.js.map\n"]}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@techsee/techsee-media-service",
3
- "version": "0.7.7",
3
+ "version": "0.7.9",
4
4
  "description": "Techsee Media Service Client",
5
- "author": "TechSee - Alex Danilov",
5
+ "author": "TechSee",
6
6
  "main": "lib/index.js",
7
7
  "scripts": {
8
8
  "preinstall": "npm update @techsee/techsee-common",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@techsee/kurento-utils-temasys-mod": "6.6.3-dev-3",
20
- "@techsee/techsee-common": "~0.18.63",
20
+ "@techsee/techsee-common": "~0.18.94",
21
21
  "bluebird": "~3.7.2",
22
22
  "kurento-utils": "6.6.2",
23
23
  "lodash": "4.13.1",