@techsee/techsee-media-service 999.13.0-alphasap1 → 999.13.0-alphasap3

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.
@@ -24,6 +24,7 @@ interface OTStreamSource {
24
24
  }
25
25
  export declare class OpentokSession extends MediaSessionBase<OTPeerConnection> implements IMediaSession {
26
26
  private readonly _credentials;
27
+ private _lastStreamEvents;
27
28
  private _session;
28
29
  readonly id: string;
29
30
  private readonly ownPeerId;
@@ -33,7 +34,7 @@ export declare class OpentokSession extends MediaSessionBase<OTPeerConnection> i
33
34
  disconnect(): Promise<void>;
34
35
  onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void>;
35
36
  onMediaStreamRenewed(clientRole: SessionClientRole, mediaStream: MediaStream): Promise<void>;
36
- replaceStreamTracks(mediaStream: Nullable<MediaStream>): Promise<never>;
37
+ replaceStreamTracks(mediaStream: Nullable<MediaStream>): Promise<void>;
37
38
  getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats>;
38
39
  private connectionCreatedHandler;
39
40
  private connectionDestroyedHandler;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/MediaSession/SessionOpentok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EACH,aAAa,EACb,sBAAsB,EAAE,yBAAyB,EACjD,kBAAkB,EAClB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAyC,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAE/G,OAAO,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAKvE,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,EAAE,EAAE,GAAG,CAAC;KACX;CACJ;AA+BD,aAAK,WAAW,GAAG,GAAG,CAAA;AAEtB,aAAK,YAAY,GAAG,GAAG,CAAA;AAEvB,UAAU,YAAY;IAClB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAiB,SAAQ,iBAAiB;IAChD,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtC,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CACtC;AAED,UAAU,cAAc;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC;CACpB;AAGD,qBAAa,cAAe,SAAQ,gBAAgB,CAAC,gBAAgB,CAAE,YAAW,aAAa;IAC3F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAM;IAEnC,OAAO,CAAC,QAAQ,CAA8B;aAE1C,EAAE,EAAI,MAAM;qBAIJ,SAAS;gBAIT,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EAAE,aAAa,EAAE,sBAAsB;IAiBhH,iBAAiB,IAAI,IAAI;IAMzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5F,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC;IAItD,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuB5E,OAAO,CAAC,wBAAwB;IAgFhC,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,gCAAgC;IAexC,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,iCAAiC;IAazC,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,kBAAkB;CAK7B","file":"SessionOpentok.d.ts","sourcesContent":["import {Nullable} from '@techsee/techsee-common';\n\nimport {\n IMediaSession,\n ISessionStreamsManager, MediaSessionConfiguration,\n MediaSessionParams,\n RemoteTrackStats\n} from '../MediaContracts';\n\nimport {KnownMediaStream, KnownMediaStreamKind, SessionClientRole, SessionClientType} from '../MediaConstants';\nimport {throwableGuard} from '@techsee/techsee-common/lib/core/guards';\nimport {IMediaSessionPeer, MediaSessionBase} from './MediaSessionBase';\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\n\nconst trace = getMediaTracer('OpentokSession');\n\ndeclare global {\n interface Window {\n OT: any;\n }\n}\n\ninterface IOTSession {\n\n sessionId: string;\n\n connection: Nullable<OTConnection>;\n\n isConnected(): boolean;\n\n connect(token: string, cb: any): void;\n\n disconnect(): void;\n\n publish(publisher: OTPublisher, cb: any): void;\n\n unpublish(publisher: OTPublisher): void;\n\n subscribe(stream: any, container: any, uiProps: any, doneCb: any): OTSubscriber;\n\n unsubscribe(subscriber: OTSubscriber): void;\n\n getSubscribersForStream(stream: any): OTSubscriber[];\n\n off(): void;\n\n on(param: string, cb: any): void;\n\n once(param: string, cb: any): void;\n}\n\ntype OTPublisher = any\n\ntype OTSubscriber = any\n\ninterface OTConnection {\n connectionId: string;\n}\n\ninterface OTPeerConnection extends IMediaSessionPeer {\n localStream: Nullable<OTStreamSource>;\n connection: OTConnection;\n publisher: Nullable<OTPublisher>;\n subscriber: Nullable<OTSubscriber>;\n}\n\ninterface OTStreamSource {\n videoSource: any;\n audioSource: any;\n}\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class OpentokSession extends MediaSessionBase<OTPeerConnection> implements IMediaSession {\n private readonly _credentials: any;\n\n private _session: Nullable<IOTSession> = null;\n\n get id(): string {\n return this._session && this._session.sessionId ? this._session.sessionId : '';\n }\n\n private get ownPeerId(): string {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n }\n\n constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration, streamFactory: ISessionStreamsManager) {\n super(sessionParams, streamFactory);\n this._credentials = sessionParams.credentials;\n\n this.connect = this.connect.bind(this);\n this.disconnect = this.disconnect.bind(this);\n this.onMediaStreamDestroyed = this.onMediaStreamDestroyed.bind(this);\n this.onMediaStreamRenewed = this.onMediaStreamRenewed.bind(this);\n\n this.createStreamForPublishing = this.createStreamForPublishing.bind(this);\n this.createMediaPublisher = this.createMediaPublisher.bind(this);\n this.connectionCreatedHandler = this.connectionCreatedHandler.bind(this);\n this.connectionDestroyedHandler = this.connectionDestroyedHandler.bind(this);\n this.streamCreatedHandler = this.streamCreatedHandler.bind(this);\n this.streamDestroyedHandler = this.streamDestroyedHandler.bind(this);\n }\n\n sessionDisconnect(): void {\n if (this._session) {\n return this._session.disconnect();\n }\n }\n\n connect(): Promise<void> {\n trace.info('Connect to session', this._credentials);\n\n if (this._session) {\n trace.error('Session already exists');\n\n return Promise.reject('Cannot connect to session while another session is active');\n }\n\n return new Promise((resolve, reject) => {\n const handleError = (error: any): void => {\n this._session && this._session!.off();\n this._session = null;\n trace.error('handleConnect error:', error);\n reject(error);\n };\n\n const {apiKey, sessionId} = this._sessionParams.credentials;\n\n this._session = (window as any).OTSESSION = window.OT.initSession(apiKey, sessionId);\n\n this._session!.on('connectionCreated', this.connectionCreatedHandler);\n this._session!.on('connectionDestroyed', this.connectionDestroyedHandler);\n this._session!.on('streamCreated', this.streamCreatedHandler);\n this._session!.on('streamDestroyed', this.streamDestroyedHandler);\n\n const connectHandler = (error: any): void => {\n if (error) {\n handleError(error);\n\n return;\n }\n\n resolve();\n };\n\n this._session!.connect(this._credentials.token, connectHandler);\n });\n }\n\n disconnect(): Promise<void> {\n return new Promise((resolve) => {\n trace.info('Disconnecting from session');\n const currentSession = this._session;\n\n this._session = null;\n\n this._peerConnections.forEach((peerConnection) => {\n this.destroyPeerConnection(peerConnection);\n });\n\n if (!currentSession) {\n trace.info('No active session - resolving');\n resolve();\n\n return;\n }\n currentSession.off();\n currentSession.disconnect();\n resolve();\n });\n }\n\n onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void> {\n const promises: Promise<void>[] = [];\n\n this._peerConnections.forEach((peerConnection) => {\n if (peerConnection.peerRole === clientRole) {\n promises.push(this.destroyPublisherOnPeerConnection(peerConnection));\n }\n });\n\n return Promise.all(promises).then(() => undefined);\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 (in OT API)\n return Promise.resolve();\n }\n\n replaceStreamTracks(mediaStream: Nullable<MediaStream>) {\n return Promise.reject(new Error('Not implemented'));\n }\n\n getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats> {\n return new Promise((resolve: any, reject: any) => {\n const peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n\n if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {\n reject(new Error('Cannot find peer or subscriber for getting stats'));\n }\n\n //https://tokbox.com/developer/sdks/js/reference/Subscriber.html#getStats\n peerConnectionOfTrack!.subscriber.getStats((error: any, stats: any) => {\n if (error) {\n trace.warn('Error getting stats', error);\n resolve({trackId: mediaTrack.id, trackStats: {}});\n\n return;\n }\n resolve({trackId: mediaTrack.id, trackStats: stats});\n });\n });\n }\n\n //#region OpenTok Events Handlers\n\n private connectionCreatedHandler(event: any): void {\n trace.info('connectionCreatedHandler', event);\n const {connection} = event;\n\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n\n //In case we got our own connection, we have nothing to do with it\n // if (connection.connectionId === this.ownPeerId) {\n // return;\n // }\n\n const destinationRole = JSON.parse(connection.data).clientRole;\n\n this.createStreamForPublishing(destinationRole)\n .then((streams: OTStreamSource) => {\n const peerConnection: OTPeerConnection = {\n peerId: connection.connectionId,\n peerRole: destinationRole,\n peerType: this._sessionParams.clientType === SessionClientType.INITIATOR\n ? SessionClientType.GUEST : SessionClientType.INITIATOR,\n connection: connection,\n publisher: null,\n subscriber: null,\n remoteMediaTracks: [],\n localStream: streams,\n connectionTimoutPrt: null\n };\n\n // if (!streams.videoSource && !streams.audioSource) {\n // trace.info('Peer connection without publisher was created', peerConnection);\n //\n // return peerConnection;\n // }\n\n if (connection.connectionId !== this.ownPeerId || (!streams.videoSource && !streams.audioSource)) {\n trace.info('Peer connection without publisher was created', peerConnection);\n\n return peerConnection;\n }\n\n const streamName = destinationRole === SessionClientRole.USER\n ? KnownMediaStream.USER_VIDEO_STREAM : KnownMediaStream.AGENT_AUDIO_STREAM;\n\n return this.createMediaPublisher(streams, streamName)\n .then((publisher: OTPublisher) => {\n peerConnection.publisher = publisher;\n trace.info('Peer connection with publisher was created', peerConnection);\n\n return peerConnection;\n });\n })\n .then((peerConnection: OTPeerConnection) => {\n this._peerConnections.set(peerConnection.peerId, peerConnection);\n\n if (peerConnection.publisher) {\n return new Promise<void>((resolve, reject) => {\n trace.info('Starting publish to peerConnection.publisher');\n this._session!.publish(peerConnection.publisher, (error: any) => {\n if (error) {\n trace.error('Publish to peerConnection error', error);\n\n return reject(error);\n }\n trace.info('Publish to peerConnection success');\n\n return resolve();\n });\n });\n }\n\n return Promise.resolve();\n })\n .catch((error: any) => {\n //Need to handle fail cases during reliability\n trace.error('Error handling new peer connection', error);\n });\n }\n\n private connectionDestroyedHandler(event: any): void {\n trace.info('connectionDestroyedHandler', event);\n const {connection} = event;\n\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n\n if (this._peerConnections.has(connection.connectionId)) {\n this.destroyPeerConnection(this._peerConnections.get(connection.connectionId)!);\n }\n }\n\n private streamCreatedHandler(event: any): void {\n trace.info('streamCreatedHandler', event.stream);\n const {stream} = event;\n const {connection} = stream || {connection: null};\n\n if (!this.sessionExistsGuard(false) || !stream || connection.connectionId === this.ownPeerId) {\n return;\n }\n\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist on this stage');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(connection.connectionId)!;\n\n trace.info('Subscribing the stream');\n\n this.createMediaSubscriber(stream).then((subscriber: OTSubscriber) => {\n peerConnection.subscriber = subscriber;\n });\n }\n\n private streamDestroyedHandler(event: any): void {\n trace.info('streamDestroyedHandler', event);\n const {stream} = event;\n\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n\n const peerConnection = this._peerConnections.get(stream.connection.connectionId);\n\n if (!peerConnection) {\n trace.warn('Peer connection for remote stream not found');\n\n return;\n }\n\n this.destroySubscriberOnPeerConnection(peerConnection).catch(() => undefined);\n }\n\n //#endregion\n\n //#region PeerConnection\n\n private destroyPeerConnection(peerConnection: OTPeerConnection): void {\n this._peerConnections.delete(peerConnection.peerId);\n this.destroyPublisherOnPeerConnection(peerConnection).catch(() => undefined);\n this.destroySubscriberOnPeerConnection(peerConnection).catch(() => undefined);\n }\n\n //#endregion\n\n //#region Publisher\n\n private createStreamForPublishing(destinationRole: SessionClientRole): Promise<OTStreamSource> {\n trace.info('createStreamForPublishing');\n\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then((mediaStream: Nullable<MediaStream>) => {\n\n const stream: OTStreamSource = {videoSource: null, audioSource: null};\n\n if (mediaStream) {\n trace.info('Media stream found for publishing', mediaStream);\n mediaStream.getTracks().forEach((track) => {\n if (track.kind === 'video') {\n stream.videoSource = track;\n } else if (track.kind === 'audio') {\n stream.audioSource = track;\n }\n });\n } else if (this._sessionParams.clientRole === SessionClientRole.USER) {\n trace.warn('No local media was found for publishing to destinationRole:', destinationRole);\n }\n\n return stream;\n });\n }\n\n private createMediaPublisher(stream: OTStreamSource, streamName: string): Promise<OTPublisher> {\n const otParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource,\n showControls: false\n };\n\n return new Promise((resolve, reject) => {\n const otPublisher = window.OT.initPublisher(undefined, otParams, (error: any) => {\n if (error) {\n reject(error);\n\n return;\n }\n otPublisher.on('streamDestroyed', (event: any) => {\n trace.info('Publisher stream destroyed', event);\n //We preventing the default, in order to prevent stop the stream by OT.\n //We managing streams by ourselves and if we allow OT to close the stream, it cannot be reused.\n event.preventDefault();\n });\n otPublisher.on('videoElementCreated', (event: any) => {\n document.getElementById(otPublisher.id)!.style.display = 'none';\n event.element.muted = true;\n });\n resolve(otPublisher);\n });\n });\n }\n\n private destroyPublisherOnPeerConnection(peerConnection: OTPeerConnection): Promise<void> {\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n this._session!.unpublish(peerConnection.publisher);\n }\n\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n\n return Promise.resolve();\n }\n\n //#endregion\n\n //#region Subscriber\n\n private createMediaSubscriber(remoteStream: any): Promise<OTSubscriber> {\n return new Promise((resolve: any, reject: any) => {\n if (!this.sessionExistsGuard(false)) {\n reject('Session not exists');\n\n return;\n }\n\n const subscriber: OTSubscriber = this._session!.subscribe(remoteStream, null, null, (err: any) => {\n if (err) {\n trace.warn('Error creating subscriber', err);\n reject(err);\n\n return;\n }\n\n subscriber.on('videoElementCreated', (event: any) => {\n document.getElementById(subscriber.id)!.style.display = 'none';\n\n const {element} = event;\n\n element.muted = true;\n\n const peerConnection = this._peerConnections.get(remoteStream.connection.connectionId)!;\n const otMediaStream: MediaStream = element.srcObject;\n\n peerConnection.subscriber = subscriber;\n\n if (!otMediaStream) {\n trace.warn('MediaStream not found in OT video element');\n\n return;\n }\n\n trace.info('Registering remote media tracks', peerConnection.subscriber, otMediaStream);\n otMediaStream.getTracks().forEach((mediaTrack: MediaStreamTrack) => {\n this.addRemoteTrackToPeer(peerConnection, mediaTrack);\n });\n\n this.registerPeersRemoteTracks(peerConnection);\n });\n\n resolve(subscriber);\n });\n });\n }\n\n private destroySubscriberOnPeerConnection(peerConnection: OTPeerConnection): Promise<void> {\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session!.unsubscribe(peerConnection.subscriber);\n }\n\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(() => trace.warn('Error removing remote streams from peerConnection'))\n .then(() => {\n peerConnection.subscriber = null;\n });\n }\n\n //#endregion\n private calculateDestinationRole(): SessionClientRole {\n if (this._sessionParams.clientRole === SessionClientRole.USER) {\n const isAgentConnected = false;\n\n return !isAgentConnected ? SessionClientRole.AGENT : SessionClientRole.OBSERVER;\n }\n\n return SessionClientRole.USER;\n }\n\n private sessionExistsGuard(shouldThrow = true): boolean {\n const connected = !!(this._session && this._session.connection && this._session.connection.connectionId);\n\n return throwableGuard(connected, 'There no OpenTok session exists', shouldThrow);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/MediaSession/SessionOpentok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EACH,aAAa,EACb,sBAAsB,EAAE,yBAAyB,EACjD,kBAAkB,EAClB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAMvE,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,EAAE,EAAE,GAAG,CAAC;KACX;CACJ;AA+BD,aAAK,WAAW,GAAG,GAAG,CAAA;AAEtB,aAAK,YAAY,GAAG,GAAG,CAAA;AAEvB,UAAU,YAAY;IAClB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAiB,SAAQ,iBAAiB;IAChD,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtC,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CACtC;AAED,UAAU,cAAc;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC;CACpB;AAGD,qBAAa,cAAe,SAAQ,gBAAgB,CAAC,gBAAgB,CAAE,YAAW,aAAa;IAC3F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAM;IACnC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,QAAQ,CAA8B;aAE1C,EAAE,EAAI,MAAM;qBAIJ,SAAS;gBAIT,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EAAE,aAAa,EAAE,sBAAsB;IAiBhH,iBAAiB,IAAI,IAAI;IAMzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5F,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuB5E,OAAO,CAAC,wBAAwB;IAyEhC,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,gCAAgC;IAexC,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,iCAAiC;IAazC,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,kBAAkB;CAK7B","file":"SessionOpentok.d.ts","sourcesContent":["import {Nullable} from '@techsee/techsee-common';\n\nimport {\n IMediaSession,\n ISessionStreamsManager, MediaSessionConfiguration,\n MediaSessionParams,\n RemoteTrackStats\n} from '../MediaContracts';\n\nimport {SessionClientRole, SessionClientType} from '../MediaConstants';\nimport {throwableGuard} from '@techsee/techsee-common/lib/core/guards';\nimport {IMediaSessionPeer, MediaSessionBase} from './MediaSessionBase';\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {Promise} from 'bluebird';\n\nconst trace = getMediaTracer('OpentokSession');\n\ndeclare global {\n interface Window {\n OT: any;\n }\n}\n\ninterface IOTSession {\n\n sessionId: string;\n\n connection: Nullable<OTConnection>;\n\n isConnected(): boolean;\n\n connect(token: string, cb: any): void;\n\n disconnect(): void;\n\n publish(publisher: OTPublisher, cb: any): void;\n\n unpublish(publisher: OTPublisher): void;\n\n subscribe(stream: any, container: any, uiProps: any, doneCb: any): OTSubscriber;\n\n unsubscribe(subscriber: OTSubscriber): void;\n\n getSubscribersForStream(stream: any): OTSubscriber[];\n\n off(): void;\n\n on(param: string, cb: any): void;\n\n once(param: string, cb: any): void;\n}\n\ntype OTPublisher = any\n\ntype OTSubscriber = any\n\ninterface OTConnection {\n connectionId: string;\n}\n\ninterface OTPeerConnection extends IMediaSessionPeer {\n localStream: Nullable<OTStreamSource>;\n connection: OTConnection;\n publisher: Nullable<OTPublisher>;\n subscriber: Nullable<OTSubscriber>;\n}\n\ninterface OTStreamSource {\n videoSource: any;\n audioSource: any;\n}\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class OpentokSession extends MediaSessionBase<OTPeerConnection> implements IMediaSession {\n private readonly _credentials: any;\n private _lastStreamEvents: any[] = [];\n private _session: Nullable<IOTSession> = null;\n\n get id(): string {\n return this._session && this._session.sessionId ? this._session.sessionId : '';\n }\n\n private get ownPeerId(): string {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n }\n\n constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration, streamFactory: ISessionStreamsManager) {\n super(sessionParams, streamFactory);\n this._credentials = sessionParams.credentials;\n\n this.connect = this.connect.bind(this);\n this.disconnect = this.disconnect.bind(this);\n this.onMediaStreamDestroyed = this.onMediaStreamDestroyed.bind(this);\n this.onMediaStreamRenewed = this.onMediaStreamRenewed.bind(this);\n\n this.createStreamForPublishing = this.createStreamForPublishing.bind(this);\n this.createMediaPublisher = this.createMediaPublisher.bind(this);\n this.connectionCreatedHandler = this.connectionCreatedHandler.bind(this);\n this.connectionDestroyedHandler = this.connectionDestroyedHandler.bind(this);\n this.streamCreatedHandler = this.streamCreatedHandler.bind(this);\n this.streamDestroyedHandler = this.streamDestroyedHandler.bind(this);\n }\n\n sessionDisconnect(): void {\n if (this._session) {\n return this._session.disconnect();\n }\n }\n\n connect(): Promise<void> {\n trace.info('Connect to session', this._credentials);\n\n if (this._session) {\n trace.error('Session already exists');\n\n return Promise.reject('Cannot connect to session while another session is active');\n }\n\n return new Promise((resolve, reject) => {\n const handleError = (error: any): void => {\n this._session && this._session!.off();\n this._session = null;\n trace.error('handleConnect error:', error);\n reject(error);\n };\n\n const {apiKey, sessionId} = this._sessionParams.credentials;\n\n this._session = (window as any).OTSESSION = window.OT.initSession(apiKey, sessionId);\n this._lastStreamEvents = [];\n\n this._session!.on('connectionCreated', this.connectionCreatedHandler);\n this._session!.on('connectionDestroyed', this.connectionDestroyedHandler);\n this._session!.on('streamCreated', this.streamCreatedHandler);\n this._session!.on('streamDestroyed', this.streamDestroyedHandler);\n\n const connectHandler = (error: any): void => {\n if (error) {\n handleError(error);\n\n return;\n }\n\n resolve();\n };\n\n this._session!.connect(this._credentials.token, connectHandler);\n });\n }\n\n disconnect(): Promise<void> {\n return new Promise((resolve) => {\n trace.info('Disconnecting from session');\n const currentSession = this._session;\n\n this._session = null;\n\n this._peerConnections.forEach((peerConnection) => {\n this.destroyPeerConnection(peerConnection);\n });\n\n if (!currentSession) {\n trace.info('No active session - resolving');\n resolve();\n\n return;\n }\n currentSession.off();\n currentSession.disconnect();\n this._lastStreamEvents = [];\n resolve();\n });\n }\n\n onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void> {\n const promises: Promise<void>[] = [];\n\n this._peerConnections.forEach((peerConnection) => {\n if (peerConnection.peerRole === clientRole) {\n promises.push(this.destroyPublisherOnPeerConnection(peerConnection));\n }\n });\n\n return Promise.all(promises).then(() => undefined);\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 (in OT API)\n return Promise.resolve();\n }\n\n replaceStreamTracks(mediaStream: Nullable<MediaStream>): Promise<void> {\n return Promise.reject(new Error('Not implemented'));\n }\n\n getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats> {\n return new Promise((resolve: any, reject: any) => {\n const peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n\n if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {\n reject(new Error('Cannot find peer or subscriber for getting stats'));\n }\n\n //https://tokbox.com/developer/sdks/js/reference/Subscriber.html#getStats\n peerConnectionOfTrack!.subscriber.getStats((error: any, stats: any) => {\n if (error) {\n trace.warn('Error getting stats', error);\n resolve({trackId: mediaTrack.id, trackStats: {}});\n\n return;\n }\n resolve({trackId: mediaTrack.id, trackStats: stats});\n });\n });\n }\n\n //#region OpenTok Events Handlers\n\n private connectionCreatedHandler(event: any): void {\n trace.info('connectionCreatedHandler', event);\n const {connection} = event;\n\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n\n const destinationRole = JSON.parse(connection.data).clientRole;\n\n this.createStreamForPublishing(destinationRole)\n .then((streams: OTStreamSource) => {\n const peerConnection: OTPeerConnection = {\n peerId: connection.connectionId,\n peerRole: destinationRole,\n peerType: this._sessionParams.clientType === SessionClientType.INITIATOR\n ? SessionClientType.GUEST : SessionClientType.INITIATOR,\n connection: connection,\n publisher: null,\n subscriber: null,\n remoteMediaTracks: [],\n localStream: streams,\n connectionTimoutPrt: null\n };\n\n if (connection.connectionId !== this.ownPeerId || (!streams.videoSource && !streams.audioSource)) {\n trace.info('Peer connection without publisher was created', peerConnection);\n\n return peerConnection;\n }\n\n return this.createMediaPublisher(streams)\n .then((publisher: OTPublisher) => {\n peerConnection.publisher = publisher;\n trace.info('Peer connection with publisher was created', peerConnection);\n\n return peerConnection;\n });\n })\n .then((peerConnection: OTPeerConnection) => {\n this._peerConnections.set(peerConnection.peerId, peerConnection);\n\n if (connection.connectionId === this.ownPeerId) {\n trace.info('Before subscribe the event streams');\n\n return this._lastStreamEvents.reduce((promiseChain: any, streamEvent: any) => promiseChain.then(() => this.streamCreatedHandler(streamEvent)),\n Promise.resolve()).then(() => {\n if (peerConnection.publisher) {\n return new Promise<void>((resolve, reject) => {\n trace.info('Starting publish to peerConnection.publisher');\n this._session!.publish(peerConnection.publisher, (error: any) => {\n if (error) {\n trace.error('Publish to peerConnection error', error);\n\n return reject(error);\n }\n trace.info('Publish to peerConnection success');\n\n return resolve();\n });\n });\n }\n\n return Promise.resolve();\n });\n }\n })\n .catch((error: any) => {\n //Need to handle fail cases during reliability\n trace.error('Error handling new peer connection', error);\n });\n }\n\n private connectionDestroyedHandler(event: any): void {\n trace.info('connectionDestroyedHandler', event);\n const {connection} = event;\n\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n\n if (this._peerConnections.has(connection.connectionId)) {\n this.destroyPeerConnection(this._peerConnections.get(connection.connectionId)!);\n }\n }\n\n private streamCreatedHandler(event: any): void {\n trace.info('streamCreatedHandler', event.stream);\n const {stream} = event;\n const {connection} = stream || {connection: null};\n\n if (!this.sessionExistsGuard(false) || !stream || connection.connectionId === this.ownPeerId) {\n return;\n }\n\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist on this stage');\n this._lastStreamEvents.push(event);\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(connection.connectionId)!;\n\n trace.info('Subscribing the stream');\n\n this.createMediaSubscriber(stream).then((subscriber: OTSubscriber) => {\n peerConnection.subscriber = subscriber;\n });\n }\n\n private streamDestroyedHandler(event: any): void {\n trace.info('streamDestroyedHandler', event);\n const {stream} = event;\n\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n\n const peerConnection = this._peerConnections.get(stream.connection.connectionId);\n\n if (!peerConnection) {\n trace.warn('Peer connection for remote stream not found');\n\n return;\n }\n\n this.destroySubscriberOnPeerConnection(peerConnection).catch(() => undefined);\n }\n\n //#endregion\n\n //#region PeerConnection\n\n private destroyPeerConnection(peerConnection: OTPeerConnection): void {\n this._peerConnections.delete(peerConnection.peerId);\n this.destroyPublisherOnPeerConnection(peerConnection).catch(() => undefined);\n this.destroySubscriberOnPeerConnection(peerConnection).catch(() => undefined);\n }\n\n //#endregion\n\n //#region Publisher\n\n private createStreamForPublishing(destinationRole: SessionClientRole): Promise<OTStreamSource> {\n trace.info('createStreamForPublishing');\n\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then((mediaStream: Nullable<MediaStream>) => {\n\n const stream: OTStreamSource = {videoSource: null, audioSource: null};\n\n if (mediaStream) {\n trace.info('Media stream found for publishing', mediaStream);\n mediaStream.getTracks().forEach((track) => {\n if (track.kind === 'video') {\n stream.videoSource = track;\n } else if (track.kind === 'audio') {\n stream.audioSource = track;\n }\n });\n } else if (this._sessionParams.clientRole === SessionClientRole.USER) {\n trace.warn('No local media was found for publishing to destinationRole:', destinationRole);\n }\n\n return stream;\n });\n }\n\n private createMediaPublisher(stream: OTStreamSource): Promise<OTPublisher> {\n const otParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource,\n showControls: false\n };\n\n return new Promise((resolve, reject) => {\n const otPublisher = window.OT.initPublisher(undefined, otParams, (error: any) => {\n if (error) {\n reject(error);\n\n return;\n }\n otPublisher.on('streamDestroyed', (event: any) => {\n trace.info('Publisher stream destroyed', event);\n //We preventing the default, in order to prevent stop the stream by OT.\n //We managing streams by ourselves and if we allow OT to close the stream, it cannot be reused.\n event.preventDefault();\n });\n otPublisher.on('videoElementCreated', (event: any) => {\n document.getElementById(otPublisher.id)!.style.display = 'none';\n event.element.muted = true;\n });\n resolve(otPublisher);\n });\n });\n }\n\n private destroyPublisherOnPeerConnection(peerConnection: OTPeerConnection): Promise<void> {\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n this._session!.unpublish(peerConnection.publisher);\n }\n\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n\n return Promise.resolve();\n }\n\n //#endregion\n\n //#region Subscriber\n\n private createMediaSubscriber(remoteStream: any): Promise<OTSubscriber> {\n return new Promise((resolve: any, reject: any) => {\n if (!this.sessionExistsGuard(false)) {\n reject('Session not exists');\n\n return;\n }\n\n const subscriber: OTSubscriber = this._session!.subscribe(remoteStream, null, null, (err: any) => {\n if (err) {\n trace.warn('Error creating subscriber', err);\n reject(err);\n\n return;\n }\n\n subscriber.on('videoElementCreated', (event: any) => {\n document.getElementById(subscriber.id)!.style.display = 'none';\n\n const {element} = event;\n\n element.muted = true;\n\n const peerConnection = this._peerConnections.get(remoteStream.connection.connectionId)!;\n const otMediaStream: MediaStream = element.srcObject;\n\n peerConnection.subscriber = subscriber;\n\n if (!otMediaStream) {\n trace.warn('MediaStream not found in OT video element');\n\n return;\n }\n\n trace.info('Registering remote media tracks', peerConnection.subscriber, otMediaStream);\n otMediaStream.getTracks().forEach((mediaTrack: MediaStreamTrack) => {\n this.addRemoteTrackToPeer(peerConnection, mediaTrack);\n });\n\n this.registerPeersRemoteTracks(peerConnection);\n });\n\n resolve(subscriber);\n });\n });\n }\n\n private destroySubscriberOnPeerConnection(peerConnection: OTPeerConnection): Promise<void> {\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session!.unsubscribe(peerConnection.subscriber);\n }\n\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(() => trace.warn('Error removing remote streams from peerConnection'))\n .then(() => {\n peerConnection.subscriber = null;\n });\n }\n\n //#endregion\n private calculateDestinationRole(): SessionClientRole {\n if (this._sessionParams.clientRole === SessionClientRole.USER) {\n const isAgentConnected = false;\n\n return !isAgentConnected ? SessionClientRole.AGENT : SessionClientRole.OBSERVER;\n }\n\n return SessionClientRole.USER;\n }\n\n private sessionExistsGuard(shouldThrow = true): boolean {\n const connected = !!(this._session && this._session.connection && this._session.connection.connectionId);\n\n return throwableGuard(connected, 'There no OpenTok session exists', shouldThrow);\n }\n}\n"]}
@@ -24,12 +24,14 @@ var MediaConstants_1 = require("../MediaConstants");
24
24
  var guards_1 = require("@techsee/techsee-common/lib/core/guards");
25
25
  var MediaSessionBase_1 = require("./MediaSessionBase");
26
26
  var MediaTracer_1 = require("../MediaUtils/MediaTracer");
27
+ var bluebird_1 = require("bluebird");
27
28
  var trace = MediaTracer_1.getMediaTracer('OpentokSession');
28
29
  //Currently this version supports subscribing only. Publishing will be implemented as needed.
29
30
  var OpentokSession = /** @class */function (_super) {
30
31
  __extends(OpentokSession, _super);
31
32
  function OpentokSession(sessionParams, streamFactory) {
32
33
  var _this = _super.call(this, sessionParams, streamFactory) || this;
34
+ _this._lastStreamEvents = [];
33
35
  _this._session = null;
34
36
  _this._credentials = sessionParams.credentials;
35
37
  _this.connect = _this.connect.bind(_this);
@@ -68,9 +70,9 @@ var OpentokSession = /** @class */function (_super) {
68
70
  trace.info('Connect to session', this._credentials);
69
71
  if (this._session) {
70
72
  trace.error('Session already exists');
71
- return Promise.reject('Cannot connect to session while another session is active');
73
+ return bluebird_1.Promise.reject('Cannot connect to session while another session is active');
72
74
  }
73
- return new Promise(function (resolve, reject) {
75
+ return new bluebird_1.Promise(function (resolve, reject) {
74
76
  var handleError = function handleError(error) {
75
77
  _this._session && _this._session.off();
76
78
  _this._session = null;
@@ -81,6 +83,7 @@ var OpentokSession = /** @class */function (_super) {
81
83
  apiKey = _a.apiKey,
82
84
  sessionId = _a.sessionId;
83
85
  _this._session = window.OTSESSION = window.OT.initSession(apiKey, sessionId);
86
+ _this._lastStreamEvents = [];
84
87
  _this._session.on('connectionCreated', _this.connectionCreatedHandler);
85
88
  _this._session.on('connectionDestroyed', _this.connectionDestroyedHandler);
86
89
  _this._session.on('streamCreated', _this.streamCreatedHandler);
@@ -97,7 +100,7 @@ var OpentokSession = /** @class */function (_super) {
97
100
  };
98
101
  OpentokSession.prototype.disconnect = function () {
99
102
  var _this = this;
100
- return new Promise(function (resolve) {
103
+ return new bluebird_1.Promise(function (resolve) {
101
104
  trace.info('Disconnecting from session');
102
105
  var currentSession = _this._session;
103
106
  _this._session = null;
@@ -111,6 +114,7 @@ var OpentokSession = /** @class */function (_super) {
111
114
  }
112
115
  currentSession.off();
113
116
  currentSession.disconnect();
117
+ _this._lastStreamEvents = [];
114
118
  resolve();
115
119
  });
116
120
  };
@@ -122,20 +126,20 @@ var OpentokSession = /** @class */function (_super) {
122
126
  promises.push(_this.destroyPublisherOnPeerConnection(peerConnection));
123
127
  }
124
128
  });
125
- return Promise.all(promises).then(function () {
129
+ return bluebird_1.Promise.all(promises).then(function () {
126
130
  return undefined;
127
131
  });
128
132
  };
129
133
  OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
130
134
  //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)
131
- return Promise.resolve();
135
+ return bluebird_1.Promise.resolve();
132
136
  };
133
137
  OpentokSession.prototype.replaceStreamTracks = function (mediaStream) {
134
- return Promise.reject(new Error('Not implemented'));
138
+ return bluebird_1.Promise.reject(new Error('Not implemented'));
135
139
  };
136
140
  OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {
137
141
  var _this = this;
138
- return new Promise(function (resolve, reject) {
142
+ return new bluebird_1.Promise(function (resolve, reject) {
139
143
  var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);
140
144
  if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {
141
145
  reject(new Error('Cannot find peer or subscriber for getting stats'));
@@ -159,10 +163,6 @@ var OpentokSession = /** @class */function (_super) {
159
163
  if (!this.sessionExistsGuard(false) || !connection) {
160
164
  return;
161
165
  }
162
- //In case we got our own connection, we have nothing to do with it
163
- // if (connection.connectionId === this.ownPeerId) {
164
- // return;
165
- // }
166
166
  var destinationRole = JSON.parse(connection.data).clientRole;
167
167
  this.createStreamForPublishing(destinationRole).then(function (streams) {
168
168
  var peerConnection = {
@@ -176,37 +176,40 @@ var OpentokSession = /** @class */function (_super) {
176
176
  localStream: streams,
177
177
  connectionTimoutPrt: null
178
178
  };
179
- // if (!streams.videoSource && !streams.audioSource) {
180
- // trace.info('Peer connection without publisher was created', peerConnection);
181
- //
182
- // return peerConnection;
183
- // }
184
179
  if (connection.connectionId !== _this.ownPeerId || !streams.videoSource && !streams.audioSource) {
185
180
  trace.info('Peer connection without publisher was created', peerConnection);
186
181
  return peerConnection;
187
182
  }
188
- var streamName = destinationRole === MediaConstants_1.SessionClientRole.USER ? MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM : MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM;
189
- return _this.createMediaPublisher(streams, streamName).then(function (publisher) {
183
+ return _this.createMediaPublisher(streams).then(function (publisher) {
190
184
  peerConnection.publisher = publisher;
191
185
  trace.info('Peer connection with publisher was created', peerConnection);
192
186
  return peerConnection;
193
187
  });
194
188
  }).then(function (peerConnection) {
195
189
  _this._peerConnections.set(peerConnection.peerId, peerConnection);
196
- if (peerConnection.publisher) {
197
- return new Promise(function (resolve, reject) {
198
- trace.info('Starting publish to peerConnection.publisher');
199
- _this._session.publish(peerConnection.publisher, function (error) {
200
- if (error) {
201
- trace.error('Publish to peerConnection error', error);
202
- return reject(error);
203
- }
204
- trace.info('Publish to peerConnection success');
205
- return resolve();
190
+ if (connection.connectionId === _this.ownPeerId) {
191
+ trace.info('Before subscribe the event streams');
192
+ return _this._lastStreamEvents.reduce(function (promiseChain, streamEvent) {
193
+ return promiseChain.then(function () {
194
+ return _this.streamCreatedHandler(streamEvent);
206
195
  });
196
+ }, bluebird_1.Promise.resolve()).then(function () {
197
+ if (peerConnection.publisher) {
198
+ return new bluebird_1.Promise(function (resolve, reject) {
199
+ trace.info('Starting publish to peerConnection.publisher');
200
+ _this._session.publish(peerConnection.publisher, function (error) {
201
+ if (error) {
202
+ trace.error('Publish to peerConnection error', error);
203
+ return reject(error);
204
+ }
205
+ trace.info('Publish to peerConnection success');
206
+ return resolve();
207
+ });
208
+ });
209
+ }
210
+ return bluebird_1.Promise.resolve();
207
211
  });
208
212
  }
209
- return Promise.resolve();
210
213
  }).catch(function (error) {
211
214
  //Need to handle fail cases during reliability
212
215
  trace.error('Error handling new peer connection', error);
@@ -231,6 +234,7 @@ var OpentokSession = /** @class */function (_super) {
231
234
  }
232
235
  if (!this._peerConnections.has(connection.connectionId)) {
233
236
  trace.warn('Unexpected case, connection should exist on this stage');
237
+ this._lastStreamEvents.push(event);
234
238
  return;
235
239
  }
236
240
  var peerConnection = this._peerConnections.get(connection.connectionId);
@@ -287,7 +291,7 @@ var OpentokSession = /** @class */function (_super) {
287
291
  return stream;
288
292
  });
289
293
  };
290
- OpentokSession.prototype.createMediaPublisher = function (stream, streamName) {
294
+ OpentokSession.prototype.createMediaPublisher = function (stream) {
291
295
  var otParams = {
292
296
  videoSource: stream.videoSource ? stream.videoSource : false,
293
297
  audioSource: stream.audioSource ? stream.audioSource : false,
@@ -295,7 +299,7 @@ var OpentokSession = /** @class */function (_super) {
295
299
  publishVideo: !!stream.videoSource,
296
300
  showControls: false
297
301
  };
298
- return new Promise(function (resolve, reject) {
302
+ return new bluebird_1.Promise(function (resolve, reject) {
299
303
  var otPublisher = window.OT.initPublisher(undefined, otParams, function (error) {
300
304
  if (error) {
301
305
  reject(error);
@@ -321,13 +325,13 @@ var OpentokSession = /** @class */function (_super) {
321
325
  }
322
326
  peerConnection.publisher = null;
323
327
  peerConnection.localStream = null;
324
- return Promise.resolve();
328
+ return bluebird_1.Promise.resolve();
325
329
  };
326
330
  //#endregion
327
331
  //#region Subscriber
328
332
  OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {
329
333
  var _this = this;
330
- return new Promise(function (resolve, reject) {
334
+ return new bluebird_1.Promise(function (resolve, reject) {
331
335
  if (!_this.sessionExistsGuard(false)) {
332
336
  reject('Session not exists');
333
337
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["MediaSession/SessionOpentok.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","defineProperty","exports","value","MediaConstants_1","require","guards_1","MediaSessionBase_1","MediaTracer_1","trace","getMediaTracer","OpentokSession","_super","sessionParams","streamFactory","_this","call","_session","_credentials","credentials","connect","bind","disconnect","onMediaStreamDestroyed","onMediaStreamRenewed","createStreamForPublishing","createMediaPublisher","connectionCreatedHandler","connectionDestroyedHandler","streamCreatedHandler","streamDestroyedHandler","get","sessionId","enumerable","configurable","connection","connectionId","sessionDisconnect","info","error","Promise","reject","resolve","handleError","off","_a","_sessionParams","apiKey","window","OTSESSION","OT","initSession","on","connectHandler","token","currentSession","_peerConnections","forEach","peerConnection","destroyPeerConnection","clientRole","promises","peerRole","push","destroyPublisherOnPeerConnection","all","then","undefined","mediaStream","replaceStreamTracks","Error","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","subscriber","getStats","stats","warn","trackId","id","trackStats","event","sessionExistsGuard","destinationRole","JSON","parse","data","streams","peerId","peerType","clientType","SessionClientType","INITIATOR","GUEST","publisher","remoteMediaTracks","localStream","connectionTimoutPrt","ownPeerId","videoSource","audioSource","streamName","SessionClientRole","USER","KnownMediaStream","USER_VIDEO_STREAM","AGENT_AUDIO_STREAM","set","publish","catch","has","stream","createMediaSubscriber","destroySubscriberOnPeerConnection","delete","_sessionStreamsManager","getMediaStreamForRole","getTracks","track","kind","otParams","publishAudio","publishVideo","showControls","otPublisher","initPublisher","preventDefault","document","getElementById","style","display","element","muted","unpublish","remoteStream","subscribe","err","otMediaStream","srcObject","addRemoteTrackToPeer","registerPeersRemoteTracks","unsubscribe","unregisterPeersRemoteMediaTracks","calculateDestinationRole","isAgentConnected","AGENT","OBSERVER","shouldThrow","connected","throwableGuard","MediaSessionBase"],"mappings":"AAAA;;AACA,IAAIA,YAAa,aAAQ,UAAKA,SAAd,IAA6B,YAAY;AACrD,QAAIC,iBAAgB,uBAAUC,CAAV,EAAaC,CAAb,EAAgB;AAChCF,yBAAgBG,OAAOC,cAAP,IACX,EAAEC,WAAW,EAAb,cAA6BC,KAA7B,IAAsC,UAAUL,CAAV,EAAaC,CAAb,EAAgB;AAAED,cAAEI,SAAF,GAAcH,CAAd;AAAkB,SAD/D,IAEZ,UAAUD,CAAV,EAAaC,CAAb,EAAgB;AAAE,iBAAK,IAAIK,CAAT,IAAcL,CAAd;AAAiB,oBAAIA,EAAEM,cAAF,CAAiBD,CAAjB,CAAJ,EAAyBN,EAAEM,CAAF,IAAOL,EAAEK,CAAF,CAAP;AAA1C;AAAwD,SAF9E;AAGA,eAAOP,eAAcC,CAAd,EAAiBC,CAAjB,CAAP;AACH,KALD;AAMA,WAAO,UAAUD,CAAV,EAAaC,CAAb,EAAgB;AACnBF,uBAAcC,CAAd,EAAiBC,CAAjB;AACA,iBAASO,EAAT,GAAc;AAAE,iBAAKC,WAAL,GAAmBT,CAAnB;AAAuB;AACvCA,UAAEU,SAAF,GAAcT,MAAM,IAAN,GAAaC,OAAOS,MAAP,CAAcV,CAAd,CAAb,IAAiCO,GAAGE,SAAH,GAAeT,EAAES,SAAjB,EAA4B,IAAIF,EAAJ,EAA7D,CAAd;AACH,KAJD;AAKH,CAZ2C,EAA5C;AAaAN,OAAOU,cAAP,CAAsBC,OAAtB,EAA+B,YAA/B,EAA6C,EAAEC,OAAO,IAAT,EAA7C;AACA,IAAIC,mBAAmBC,QAAQ,mBAAR,CAAvB;AACA,IAAIC,WAAWD,QAAQ,yCAAR,CAAf;AACA,IAAIE,qBAAqBF,QAAQ,oBAAR,CAAzB;AACA,IAAIG,gBAAgBH,QAAQ,2BAAR,CAApB;AACA,IAAII,QAAQD,cAAcE,cAAd,CAA6B,gBAA7B,CAAZ;AACA;AACA,IAAIC,iBAAiB,aAAe,UAAUC,MAAV,EAAkB;AAClDzB,cAAUwB,cAAV,EAA0BC,MAA1B;AACA,aAASD,cAAT,CAAwBE,aAAxB,EAAuCC,aAAvC,EAAsD;AAClD,YAAIC,QAAQH,OAAOI,IAAP,CAAY,IAAZ,EAAkBH,aAAlB,EAAiCC,aAAjC,KAAmD,IAA/D;AACAC,cAAME,QAAN,GAAiB,IAAjB;AACAF,cAAMG,YAAN,GAAqBL,cAAcM,WAAnC;AACAJ,cAAMK,OAAN,GAAgBL,MAAMK,OAAN,CAAcC,IAAd,CAAmBN,KAAnB,CAAhB;AACAA,cAAMO,UAAN,GAAmBP,MAAMO,UAAN,CAAiBD,IAAjB,CAAsBN,KAAtB,CAAnB;AACAA,cAAMQ,sBAAN,GAA+BR,MAAMQ,sBAAN,CAA6BF,IAA7B,CAAkCN,KAAlC,CAA/B;AACAA,cAAMS,oBAAN,GAA6BT,MAAMS,oBAAN,CAA2BH,IAA3B,CAAgCN,KAAhC,CAA7B;AACAA,cAAMU,yBAAN,GAAkCV,MAAMU,yBAAN,CAAgCJ,IAAhC,CAAqCN,KAArC,CAAlC;AACAA,cAAMW,oBAAN,GAA6BX,MAAMW,oBAAN,CAA2BL,IAA3B,CAAgCN,KAAhC,CAA7B;AACAA,cAAMY,wBAAN,GAAiCZ,MAAMY,wBAAN,CAA+BN,IAA/B,CAAoCN,KAApC,CAAjC;AACAA,cAAMa,0BAAN,GAAmCb,MAAMa,0BAAN,CAAiCP,IAAjC,CAAsCN,KAAtC,CAAnC;AACAA,cAAMc,oBAAN,GAA6Bd,MAAMc,oBAAN,CAA2BR,IAA3B,CAAgCN,KAAhC,CAA7B;AACAA,cAAMe,sBAAN,GAA+Bf,MAAMe,sBAAN,CAA6BT,IAA7B,CAAkCN,KAAlC,CAA/B;AACA,eAAOA,KAAP;AACH;AACDxB,WAAOU,cAAP,CAAsBU,eAAeZ,SAArC,EAAgD,IAAhD,EAAsD;AAClDgC,aAAK,eAAY;AACb,mBAAO,KAAKd,QAAL,IAAiB,KAAKA,QAAL,CAAce,SAA/B,GAA2C,KAAKf,QAAL,CAAce,SAAzD,GAAqE,EAA5E;AACH,SAHiD;AAIlDC,oBAAY,IAJsC;AAKlDC,sBAAc;AALoC,KAAtD;AAOA3C,WAAOU,cAAP,CAAsBU,eAAeZ,SAArC,EAAgD,WAAhD,EAA6D;AACzDgC,aAAK,eAAY;AACb,mBAAO,KAAKd,QAAL,IAAiB,KAAKA,QAAL,CAAckB,UAA/B,GAA4C,KAAKlB,QAAL,CAAckB,UAAd,CAAyBC,YAArE,GAAoF,EAA3F;AACH,SAHwD;AAIzDH,oBAAY,IAJ6C;AAKzDC,sBAAc;AAL2C,KAA7D;AAOAvB,mBAAeZ,SAAf,CAAyBsC,iBAAzB,GAA6C,YAAY;AACrD,YAAI,KAAKpB,QAAT,EAAmB;AACf,mBAAO,KAAKA,QAAL,CAAcK,UAAd,EAAP;AACH;AACJ,KAJD;AAKAX,mBAAeZ,SAAf,CAAyBqB,OAAzB,GAAmC,YAAY;AAC3C,YAAIL,QAAQ,IAAZ;AACAN,cAAM6B,IAAN,CAAW,oBAAX,EAAiC,KAAKpB,YAAtC;AACA,YAAI,KAAKD,QAAT,EAAmB;AACfR,kBAAM8B,KAAN,CAAY,wBAAZ;AACA,mBAAOC,QAAQC,MAAR,CAAe,2DAAf,CAAP;AACH;AACD,eAAO,IAAID,OAAJ,CAAY,UAAUE,OAAV,EAAmBD,MAAnB,EAA2B;AAC1C,gBAAIE,cAAc,SAAdA,WAAc,CAAUJ,KAAV,EAAiB;AAC/BxB,sBAAME,QAAN,IAAkBF,MAAME,QAAN,CAAe2B,GAAf,EAAlB;AACA7B,sBAAME,QAAN,GAAiB,IAAjB;AACAR,sBAAM8B,KAAN,CAAY,sBAAZ,EAAoCA,KAApC;AACAE,uBAAOF,KAAP;AACH,aALD;AAMA,gBAAIM,KAAK9B,MAAM+B,cAAN,CAAqB3B,WAA9B;AAAA,gBAA2C4B,SAASF,GAAGE,MAAvD;AAAA,gBAA+Df,YAAYa,GAAGb,SAA9E;AACAjB,kBAAME,QAAN,GAAiB+B,OAAOC,SAAP,GAAmBD,OAAOE,EAAP,CAAUC,WAAV,CAAsBJ,MAAtB,EAA8Bf,SAA9B,CAApC;AACAjB,kBAAME,QAAN,CAAemC,EAAf,CAAkB,mBAAlB,EAAuCrC,MAAMY,wBAA7C;AACAZ,kBAAME,QAAN,CAAemC,EAAf,CAAkB,qBAAlB,EAAyCrC,MAAMa,0BAA/C;AACAb,kBAAME,QAAN,CAAemC,EAAf,CAAkB,eAAlB,EAAmCrC,MAAMc,oBAAzC;AACAd,kBAAME,QAAN,CAAemC,EAAf,CAAkB,iBAAlB,EAAqCrC,MAAMe,sBAA3C;AACA,gBAAIuB,iBAAiB,SAAjBA,cAAiB,CAAUd,KAAV,EAAiB;AAClC,oBAAIA,KAAJ,EAAW;AACPI,gCAAYJ,KAAZ;AACA;AACH;AACDG;AACH,aAND;AAOA3B,kBAAME,QAAN,CAAeG,OAAf,CAAuBL,MAAMG,YAAN,CAAmBoC,KAA1C,EAAiDD,cAAjD;AACH,SArBM,CAAP;AAsBH,KA7BD;AA8BA1C,mBAAeZ,SAAf,CAAyBuB,UAAzB,GAAsC,YAAY;AAC9C,YAAIP,QAAQ,IAAZ;AACA,eAAO,IAAIyB,OAAJ,CAAY,UAAUE,OAAV,EAAmB;AAClCjC,kBAAM6B,IAAN,CAAW,4BAAX;AACA,gBAAIiB,iBAAiBxC,MAAME,QAA3B;AACAF,kBAAME,QAAN,GAAiB,IAAjB;AACAF,kBAAMyC,gBAAN,CAAuBC,OAAvB,CAA+B,UAAUC,cAAV,EAA0B;AACrD3C,sBAAM4C,qBAAN,CAA4BD,cAA5B;AACH,aAFD;AAGA,gBAAI,CAACH,cAAL,EAAqB;AACjB9C,sBAAM6B,IAAN,CAAW,+BAAX;AACAI;AACA;AACH;AACDa,2BAAeX,GAAf;AACAW,2BAAejC,UAAf;AACAoB;AACH,SAfM,CAAP;AAgBH,KAlBD;AAmBA/B,mBAAeZ,SAAf,CAAyBwB,sBAAzB,GAAkD,UAAUqC,UAAV,EAAsB;AACpE,YAAI7C,QAAQ,IAAZ;AACA,YAAI8C,WAAW,EAAf;AACA,aAAKL,gBAAL,CAAsBC,OAAtB,CAA8B,UAAUC,cAAV,EAA0B;AACpD,gBAAIA,eAAeI,QAAf,KAA4BF,UAAhC,EAA4C;AACxCC,yBAASE,IAAT,CAAchD,MAAMiD,gCAAN,CAAuCN,cAAvC,CAAd;AACH;AACJ,SAJD;AAKA,eAAOlB,QAAQyB,GAAR,CAAYJ,QAAZ,EAAsBK,IAAtB,CAA2B,YAAY;AAAE,mBAAOC,SAAP;AAAmB,SAA5D,CAAP;AACH,KATD;AAUAxD,mBAAeZ,SAAf,CAAyByB,oBAAzB,GAAgD,UAAUoC,UAAV,EAAsBQ,WAAtB,EAAmC;AAC/E;AACA,eAAO5B,QAAQE,OAAR,EAAP;AACH,KAHD;AAIA/B,mBAAeZ,SAAf,CAAyBsE,mBAAzB,GAA+C,UAAUD,WAAV,EAAuB;AAClE,eAAO5B,QAAQC,MAAR,CAAe,IAAI6B,KAAJ,CAAU,iBAAV,CAAf,CAAP;AACH,KAFD;AAGA3D,mBAAeZ,SAAf,CAAyBwE,mBAAzB,GAA+C,UAAUC,UAAV,EAAsB;AACjE,YAAIzD,QAAQ,IAAZ;AACA,eAAO,IAAIyB,OAAJ,CAAY,UAAUE,OAAV,EAAmBD,MAAnB,EAA2B;AAC1C,gBAAIgC,wBAAwB1D,MAAM2D,6BAAN,CAAoCF,UAApC,CAA5B;AACA,gBAAI,CAACC,qBAAD,IAA0B,CAACA,sBAAsBE,UAArD,EAAiE;AAC7DlC,uBAAO,IAAI6B,KAAJ,CAAU,kDAAV,CAAP;AACH;AACD;AACAG,kCAAsBE,UAAtB,CAAiCC,QAAjC,CAA0C,UAAUrC,KAAV,EAAiBsC,KAAjB,EAAwB;AAC9D,oBAAItC,KAAJ,EAAW;AACP9B,0BAAMqE,IAAN,CAAW,qBAAX,EAAkCvC,KAAlC;AACAG,4BAAQ,EAAEqC,SAASP,WAAWQ,EAAtB,EAA0BC,YAAY,EAAtC,EAAR;AACA;AACH;AACDvC,wBAAQ,EAAEqC,SAASP,WAAWQ,EAAtB,EAA0BC,YAAYJ,KAAtC,EAAR;AACH,aAPD;AAQH,SAdM,CAAP;AAeH,KAjBD;AAkBA;AACAlE,mBAAeZ,SAAf,CAAyB4B,wBAAzB,GAAoD,UAAUuD,KAAV,EAAiB;AACjE,YAAInE,QAAQ,IAAZ;AACAN,cAAM6B,IAAN,CAAW,0BAAX,EAAuC4C,KAAvC;AACA,YAAI/C,aAAa+C,MAAM/C,UAAvB;AACA,YAAI,CAAC,KAAKgD,kBAAL,CAAwB,KAAxB,CAAD,IAAmC,CAAChD,UAAxC,EAAoD;AAChD;AACH;AACD;AACA;AACA;AACA;AACA,YAAIiD,kBAAkBC,KAAKC,KAAL,CAAWnD,WAAWoD,IAAtB,EAA4B3B,UAAlD;AACA,aAAKnC,yBAAL,CAA+B2D,eAA/B,EACKlB,IADL,CACU,UAAUsB,OAAV,EAAmB;AACzB,gBAAI9B,iBAAiB;AACjB+B,wBAAQtD,WAAWC,YADF;AAEjB0B,0BAAUsB,eAFO;AAGjBM,0BAAU3E,MAAM+B,cAAN,CAAqB6C,UAArB,KAAoCvF,iBAAiBwF,iBAAjB,CAAmCC,SAAvE,GACJzF,iBAAiBwF,iBAAjB,CAAmCE,KAD/B,GACuC1F,iBAAiBwF,iBAAjB,CAAmCC,SAJnE;AAKjB1D,4BAAYA,UALK;AAMjB4D,2BAAW,IANM;AAOjBpB,4BAAY,IAPK;AAQjBqB,mCAAmB,EARF;AASjBC,6BAAaT,OATI;AAUjBU,qCAAqB;AAVJ,aAArB;AAYA;AACA;AACA;AACA;AACA;AACA,gBAAI/D,WAAWC,YAAX,KAA4BrB,MAAMoF,SAAlC,IAAgD,CAACX,QAAQY,WAAT,IAAwB,CAACZ,QAAQa,WAArF,EAAmG;AAC/F5F,sBAAM6B,IAAN,CAAW,+CAAX,EAA4DoB,cAA5D;AACA,uBAAOA,cAAP;AACH;AACD,gBAAI4C,aAAalB,oBAAoBhF,iBAAiBmG,iBAAjB,CAAmCC,IAAvD,GACXpG,iBAAiBqG,gBAAjB,CAAkCC,iBADvB,GAC2CtG,iBAAiBqG,gBAAjB,CAAkCE,kBAD9F;AAEA,mBAAO5F,MAAMW,oBAAN,CAA2B8D,OAA3B,EAAoCc,UAApC,EACFpC,IADE,CACG,UAAU6B,SAAV,EAAqB;AAC3BrC,+BAAeqC,SAAf,GAA2BA,SAA3B;AACAtF,sBAAM6B,IAAN,CAAW,4CAAX,EAAyDoB,cAAzD;AACA,uBAAOA,cAAP;AACH,aALM,CAAP;AAMH,SA/BD,EAgCKQ,IAhCL,CAgCU,UAAUR,cAAV,EAA0B;AAChC3C,kBAAMyC,gBAAN,CAAuBoD,GAAvB,CAA2BlD,eAAe+B,MAA1C,EAAkD/B,cAAlD;AACA,gBAAIA,eAAeqC,SAAnB,EAA8B;AAC1B,uBAAO,IAAIvD,OAAJ,CAAY,UAAUE,OAAV,EAAmBD,MAAnB,EAA2B;AAC1ChC,0BAAM6B,IAAN,CAAW,8CAAX;AACAvB,0BAAME,QAAN,CAAe4F,OAAf,CAAuBnD,eAAeqC,SAAtC,EAAiD,UAAUxD,KAAV,EAAiB;AAC9D,4BAAIA,KAAJ,EAAW;AACP9B,kCAAM8B,KAAN,CAAY,iCAAZ,EAA+CA,KAA/C;AACA,mCAAOE,OAAOF,KAAP,CAAP;AACH;AACD9B,8BAAM6B,IAAN,CAAW,mCAAX;AACA,+BAAOI,SAAP;AACH,qBAPD;AAQH,iBAVM,CAAP;AAWH;AACD,mBAAOF,QAAQE,OAAR,EAAP;AACH,SAhDD,EAiDKoE,KAjDL,CAiDW,UAAUvE,KAAV,EAAiB;AACxB;AACA9B,kBAAM8B,KAAN,CAAY,oCAAZ,EAAkDA,KAAlD;AACH,SApDD;AAqDH,KAjED;AAkEA5B,mBAAeZ,SAAf,CAAyB6B,0BAAzB,GAAsD,UAAUsD,KAAV,EAAiB;AACnEzE,cAAM6B,IAAN,CAAW,4BAAX,EAAyC4C,KAAzC;AACA,YAAI/C,aAAa+C,MAAM/C,UAAvB;AACA,YAAI,CAAC,KAAKgD,kBAAL,CAAwB,KAAxB,CAAD,IAAmC,CAAChD,UAAxC,EAAoD;AAChD;AACH;AACD,YAAI,KAAKqB,gBAAL,CAAsBuD,GAAtB,CAA0B5E,WAAWC,YAArC,CAAJ,EAAwD;AACpD,iBAAKuB,qBAAL,CAA2B,KAAKH,gBAAL,CAAsBzB,GAAtB,CAA0BI,WAAWC,YAArC,CAA3B;AACH;AACJ,KATD;AAUAzB,mBAAeZ,SAAf,CAAyB8B,oBAAzB,GAAgD,UAAUqD,KAAV,EAAiB;AAC7DzE,cAAM6B,IAAN,CAAW,sBAAX,EAAmC4C,MAAM8B,MAAzC;AACA,YAAIA,SAAS9B,MAAM8B,MAAnB;AACA,YAAI7E,aAAa,CAAC6E,UAAU,EAAE7E,YAAY,IAAd,EAAX,EAAiCA,UAAlD;AACA,YAAI,CAAC,KAAKgD,kBAAL,CAAwB,KAAxB,CAAD,IAAmC,CAAC6B,MAApC,IAA8C7E,WAAWC,YAAX,KAA4B,KAAK+D,SAAnF,EAA8F;AAC1F;AACH;AACD,YAAI,CAAC,KAAK3C,gBAAL,CAAsBuD,GAAtB,CAA0B5E,WAAWC,YAArC,CAAL,EAAyD;AACrD3B,kBAAMqE,IAAN,CAAW,wDAAX;AACA;AACH;AACD,YAAIpB,iBAAiB,KAAKF,gBAAL,CAAsBzB,GAAtB,CAA0BI,WAAWC,YAArC,CAArB;AACA3B,cAAM6B,IAAN,CAAW,wBAAX;AACA,aAAK2E,qBAAL,CAA2BD,MAA3B,EAAmC9C,IAAnC,CAAwC,UAAUS,UAAV,EAAsB;AAC1DjB,2BAAeiB,UAAf,GAA4BA,UAA5B;AACH,SAFD;AAGH,KAhBD;AAiBAhE,mBAAeZ,SAAf,CAAyB+B,sBAAzB,GAAkD,UAAUoD,KAAV,EAAiB;AAC/DzE,cAAM6B,IAAN,CAAW,wBAAX,EAAqC4C,KAArC;AACA,YAAI8B,SAAS9B,MAAM8B,MAAnB;AACA,YAAI,CAAC,KAAK7B,kBAAL,CAAwB,KAAxB,CAAD,IAAmC,CAAC6B,MAAxC,EAAgD;AAC5C;AACH;AACD,YAAItD,iBAAiB,KAAKF,gBAAL,CAAsBzB,GAAtB,CAA0BiF,OAAO7E,UAAP,CAAkBC,YAA5C,CAArB;AACA,YAAI,CAACsB,cAAL,EAAqB;AACjBjD,kBAAMqE,IAAN,CAAW,6CAAX;AACA;AACH;AACD,aAAKoC,iCAAL,CAAuCxD,cAAvC,EAAuDoD,KAAvD,CAA6D,YAAY;AAAE,mBAAO3C,SAAP;AAAmB,SAA9F;AACH,KAZD;AAaA;AACA;AACAxD,mBAAeZ,SAAf,CAAyB4D,qBAAzB,GAAiD,UAAUD,cAAV,EAA0B;AACvE,aAAKF,gBAAL,CAAsB2D,MAAtB,CAA6BzD,eAAe+B,MAA5C;AACA,aAAKzB,gCAAL,CAAsCN,cAAtC,EAAsDoD,KAAtD,CAA4D,YAAY;AAAE,mBAAO3C,SAAP;AAAmB,SAA7F;AACA,aAAK+C,iCAAL,CAAuCxD,cAAvC,EAAuDoD,KAAvD,CAA6D,YAAY;AAAE,mBAAO3C,SAAP;AAAmB,SAA9F;AACH,KAJD;AAKA;AACA;AACAxD,mBAAeZ,SAAf,CAAyB0B,yBAAzB,GAAqD,UAAU2D,eAAV,EAA2B;AAC5E,YAAIrE,QAAQ,IAAZ;AACAN,cAAM6B,IAAN,CAAW,2BAAX;AACA,eAAO,KAAK8E,sBAAL,CAA4BC,qBAA5B,CAAkDjC,eAAlD,EACFlB,IADE,CACG,UAAUE,WAAV,EAAuB;AAC7B,gBAAI4C,SAAS,EAAEZ,aAAa,IAAf,EAAqBC,aAAa,IAAlC,EAAb;AACA,gBAAIjC,WAAJ,EAAiB;AACb3D,sBAAM6B,IAAN,CAAW,mCAAX,EAAgD8B,WAAhD;AACAA,4BAAYkD,SAAZ,GAAwB7D,OAAxB,CAAgC,UAAU8D,KAAV,EAAiB;AAC7C,wBAAIA,MAAMC,IAAN,KAAe,OAAnB,EAA4B;AACxBR,+BAAOZ,WAAP,GAAqBmB,KAArB;AACH,qBAFD,MAGK,IAAIA,MAAMC,IAAN,KAAe,OAAnB,EAA4B;AAC7BR,+BAAOX,WAAP,GAAqBkB,KAArB;AACH;AACJ,iBAPD;AAQH,aAVD,MAWK,IAAIxG,MAAM+B,cAAN,CAAqBc,UAArB,KAAoCxD,iBAAiBmG,iBAAjB,CAAmCC,IAA3E,EAAiF;AAClF/F,sBAAMqE,IAAN,CAAW,6DAAX,EAA0EM,eAA1E;AACH;AACD,mBAAO4B,MAAP;AACH,SAlBM,CAAP;AAmBH,KAtBD;AAuBArG,mBAAeZ,SAAf,CAAyB2B,oBAAzB,GAAgD,UAAUsF,MAAV,EAAkBV,UAAlB,EAA8B;AAC1E,YAAImB,WAAW;AACXrB,yBAAaY,OAAOZ,WAAP,GAAqBY,OAAOZ,WAA5B,GAA0C,KAD5C;AAEXC,yBAAaW,OAAOX,WAAP,GAAqBW,OAAOX,WAA5B,GAA0C,KAF5C;AAGXqB,0BAAc,CAAC,CAACV,OAAOX,WAHZ;AAIXsB,0BAAc,CAAC,CAACX,OAAOZ,WAJZ;AAKXwB,0BAAc;AALH,SAAf;AAOA,eAAO,IAAIpF,OAAJ,CAAY,UAAUE,OAAV,EAAmBD,MAAnB,EAA2B;AAC1C,gBAAIoF,cAAc7E,OAAOE,EAAP,CAAU4E,aAAV,CAAwB3D,SAAxB,EAAmCsD,QAAnC,EAA6C,UAAUlF,KAAV,EAAiB;AAC5E,oBAAIA,KAAJ,EAAW;AACPE,2BAAOF,KAAP;AACA;AACH;AACDsF,4BAAYzE,EAAZ,CAAe,iBAAf,EAAkC,UAAU8B,KAAV,EAAiB;AAC/CzE,0BAAM6B,IAAN,CAAW,4BAAX,EAAyC4C,KAAzC;AACA;AACA;AACAA,0BAAM6C,cAAN;AACH,iBALD;AAMAF,4BAAYzE,EAAZ,CAAe,qBAAf,EAAsC,UAAU8B,KAAV,EAAiB;AACnD8C,6BAASC,cAAT,CAAwBJ,YAAY7C,EAApC,EAAwCkD,KAAxC,CAA8CC,OAA9C,GAAwD,MAAxD;AACAjD,0BAAMkD,OAAN,CAAcC,KAAd,GAAsB,IAAtB;AACH,iBAHD;AAIA3F,wBAAQmF,WAAR;AACH,aAhBiB,CAAlB;AAiBH,SAlBM,CAAP;AAmBH,KA3BD;AA4BAlH,mBAAeZ,SAAf,CAAyBiE,gCAAzB,GAA4D,UAAUN,cAAV,EAA0B;AAClF,YAAI,KAAKyB,kBAAL,CAAwB,KAAxB,KAAkCzB,eAAeqC,SAArD,EAAgE;AAC5D,iBAAK9E,QAAL,CAAcqH,SAAd,CAAwB5E,eAAeqC,SAAvC;AACH;AACDrC,uBAAeqC,SAAf,GAA2B,IAA3B;AACArC,uBAAeuC,WAAf,GAA6B,IAA7B;AACA,eAAOzD,QAAQE,OAAR,EAAP;AACH,KAPD;AAQA;AACA;AACA/B,mBAAeZ,SAAf,CAAyBkH,qBAAzB,GAAiD,UAAUsB,YAAV,EAAwB;AACrE,YAAIxH,QAAQ,IAAZ;AACA,eAAO,IAAIyB,OAAJ,CAAY,UAAUE,OAAV,EAAmBD,MAAnB,EAA2B;AAC1C,gBAAI,CAAC1B,MAAMoE,kBAAN,CAAyB,KAAzB,CAAL,EAAsC;AAClC1C,uBAAO,oBAAP;AACA;AACH;AACD,gBAAIkC,aAAa5D,MAAME,QAAN,CAAeuH,SAAf,CAAyBD,YAAzB,EAAuC,IAAvC,EAA6C,IAA7C,EAAmD,UAAUE,GAAV,EAAe;AAC/E,oBAAIA,GAAJ,EAAS;AACLhI,0BAAMqE,IAAN,CAAW,2BAAX,EAAwC2D,GAAxC;AACAhG,2BAAOgG,GAAP;AACA;AACH;AACD9D,2BAAWvB,EAAX,CAAc,qBAAd,EAAqC,UAAU8B,KAAV,EAAiB;AAClD8C,6BAASC,cAAT,CAAwBtD,WAAWK,EAAnC,EAAuCkD,KAAvC,CAA6CC,OAA7C,GAAuD,MAAvD;AACA,wBAAIC,UAAUlD,MAAMkD,OAApB;AACAA,4BAAQC,KAAR,GAAgB,IAAhB;AACA,wBAAI3E,iBAAiB3C,MAAMyC,gBAAN,CAAuBzB,GAAvB,CAA2BwG,aAAapG,UAAb,CAAwBC,YAAnD,CAArB;AACA,wBAAIsG,gBAAgBN,QAAQO,SAA5B;AACAjF,mCAAeiB,UAAf,GAA4BA,UAA5B;AACA,wBAAI,CAAC+D,aAAL,EAAoB;AAChBjI,8BAAMqE,IAAN,CAAW,2CAAX;AACA;AACH;AACDrE,0BAAM6B,IAAN,CAAW,iCAAX,EAA8CoB,eAAeiB,UAA7D,EAAyE+D,aAAzE;AACAA,kCAAcpB,SAAd,GAA0B7D,OAA1B,CAAkC,UAAUe,UAAV,EAAsB;AACpDzD,8BAAM6H,oBAAN,CAA2BlF,cAA3B,EAA2Cc,UAA3C;AACH,qBAFD;AAGAzD,0BAAM8H,yBAAN,CAAgCnF,cAAhC;AACH,iBAhBD;AAiBAhB,wBAAQiC,UAAR;AACH,aAxBgB,CAAjB;AAyBH,SA9BM,CAAP;AA+BH,KAjCD;AAkCAhE,mBAAeZ,SAAf,CAAyBmH,iCAAzB,GAA6D,UAAUxD,cAAV,EAA0B;AACnF,YAAI,KAAKyB,kBAAL,CAAwB,KAAxB,KAAkCzB,eAAeiB,UAArD,EAAiE;AAC7D,iBAAK1D,QAAL,CAAc6H,WAAd,CAA0BpF,eAAeiB,UAAzC;AACH;AACD,eAAO,KAAKoE,gCAAL,CAAsCrF,cAAtC,EACFoD,KADE,CACI,YAAY;AAAE,mBAAOrG,MAAMqE,IAAN,CAAW,mDAAX,CAAP;AAAyE,SAD3F,EAEFZ,IAFE,CAEG,YAAY;AAClBR,2BAAeiB,UAAf,GAA4B,IAA5B;AACH,SAJM,CAAP;AAKH,KATD;AAUA;AACAhE,mBAAeZ,SAAf,CAAyBiJ,wBAAzB,GAAoD,YAAY;AAC5D,YAAI,KAAKlG,cAAL,CAAoBc,UAApB,KAAmCxD,iBAAiBmG,iBAAjB,CAAmCC,IAA1E,EAAgF;AAC5E,gBAAIyC,mBAAmB,KAAvB;AACA,mBAAO,CAACA,gBAAD,GAAoB7I,iBAAiBmG,iBAAjB,CAAmC2C,KAAvD,GAA+D9I,iBAAiBmG,iBAAjB,CAAmC4C,QAAzG;AACH;AACD,eAAO/I,iBAAiBmG,iBAAjB,CAAmCC,IAA1C;AACH,KAND;AAOA7F,mBAAeZ,SAAf,CAAyBoF,kBAAzB,GAA8C,UAAUiE,WAAV,EAAuB;AACjE,YAAIA,gBAAgB,KAAK,CAAzB,EAA4B;AAAEA,0BAAc,IAAd;AAAqB;AACnD,YAAIC,YAAY,CAAC,EAAE,KAAKpI,QAAL,IAAiB,KAAKA,QAAL,CAAckB,UAA/B,IAA6C,KAAKlB,QAAL,CAAckB,UAAd,CAAyBC,YAAxE,CAAjB;AACA,eAAO9B,SAASgJ,cAAT,CAAwBD,SAAxB,EAAmC,iCAAnC,EAAsED,WAAtE,CAAP;AACH,KAJD;AAKA,WAAOzI,cAAP;AACH,CApWmC,CAoWlCJ,mBAAmBgJ,gBApWe,CAApC;AAqWArJ,QAAQS,cAAR,GAAyBA,cAAzB;;AAEA","file":"SessionOpentok.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})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar guards_1 = require(\"@techsee/techsee-common/lib/core/guards\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar trace = MediaTracer_1.getMediaTracer('OpentokSession');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar OpentokSession = /** @class */ (function (_super) {\n __extends(OpentokSession, _super);\n function OpentokSession(sessionParams, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._session = null;\n _this._credentials = sessionParams.credentials;\n _this.connect = _this.connect.bind(_this);\n _this.disconnect = _this.disconnect.bind(_this);\n _this.onMediaStreamDestroyed = _this.onMediaStreamDestroyed.bind(_this);\n _this.onMediaStreamRenewed = _this.onMediaStreamRenewed.bind(_this);\n _this.createStreamForPublishing = _this.createStreamForPublishing.bind(_this);\n _this.createMediaPublisher = _this.createMediaPublisher.bind(_this);\n _this.connectionCreatedHandler = _this.connectionCreatedHandler.bind(_this);\n _this.connectionDestroyedHandler = _this.connectionDestroyedHandler.bind(_this);\n _this.streamCreatedHandler = _this.streamCreatedHandler.bind(_this);\n _this.streamDestroyedHandler = _this.streamDestroyedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(OpentokSession.prototype, \"id\", {\n get: function () {\n return this._session && this._session.sessionId ? this._session.sessionId : '';\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(OpentokSession.prototype, \"ownPeerId\", {\n get: function () {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n },\n enumerable: true,\n configurable: true\n });\n OpentokSession.prototype.sessionDisconnect = function () {\n if (this._session) {\n return this._session.disconnect();\n }\n };\n OpentokSession.prototype.connect = function () {\n var _this = this;\n trace.info('Connect to session', this._credentials);\n if (this._session) {\n trace.error('Session already exists');\n return Promise.reject('Cannot connect to session while another session is active');\n }\n return new Promise(function (resolve, reject) {\n var handleError = function (error) {\n _this._session && _this._session.off();\n _this._session = null;\n trace.error('handleConnect error:', error);\n reject(error);\n };\n var _a = _this._sessionParams.credentials, apiKey = _a.apiKey, sessionId = _a.sessionId;\n _this._session = window.OTSESSION = window.OT.initSession(apiKey, sessionId);\n _this._session.on('connectionCreated', _this.connectionCreatedHandler);\n _this._session.on('connectionDestroyed', _this.connectionDestroyedHandler);\n _this._session.on('streamCreated', _this.streamCreatedHandler);\n _this._session.on('streamDestroyed', _this.streamDestroyedHandler);\n var connectHandler = function (error) {\n if (error) {\n handleError(error);\n return;\n }\n resolve();\n };\n _this._session.connect(_this._credentials.token, connectHandler);\n });\n };\n OpentokSession.prototype.disconnect = function () {\n var _this = this;\n return new Promise(function (resolve) {\n trace.info('Disconnecting from session');\n var currentSession = _this._session;\n _this._session = null;\n _this._peerConnections.forEach(function (peerConnection) {\n _this.destroyPeerConnection(peerConnection);\n });\n if (!currentSession) {\n trace.info('No active session - resolving');\n resolve();\n return;\n }\n currentSession.off();\n currentSession.disconnect();\n resolve();\n });\n };\n OpentokSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n var promises = [];\n this._peerConnections.forEach(function (peerConnection) {\n if (peerConnection.peerRole === clientRole) {\n promises.push(_this.destroyPublisherOnPeerConnection(peerConnection));\n }\n });\n return Promise.all(promises).then(function () { return undefined; });\n };\n OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)\n return Promise.resolve();\n };\n OpentokSession.prototype.replaceStreamTracks = function (mediaStream) {\n return Promise.reject(new Error('Not implemented'));\n };\n OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);\n if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {\n reject(new Error('Cannot find peer or subscriber for getting stats'));\n }\n //https://tokbox.com/developer/sdks/js/reference/Subscriber.html#getStats\n peerConnectionOfTrack.subscriber.getStats(function (error, stats) {\n if (error) {\n trace.warn('Error getting stats', error);\n resolve({ trackId: mediaTrack.id, trackStats: {} });\n return;\n }\n resolve({ trackId: mediaTrack.id, trackStats: stats });\n });\n });\n };\n //#region OpenTok Events Handlers\n OpentokSession.prototype.connectionCreatedHandler = function (event) {\n var _this = this;\n trace.info('connectionCreatedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n //In case we got our own connection, we have nothing to do with it\n // if (connection.connectionId === this.ownPeerId) {\n // return;\n // }\n var destinationRole = JSON.parse(connection.data).clientRole;\n this.createStreamForPublishing(destinationRole)\n .then(function (streams) {\n var peerConnection = {\n peerId: connection.connectionId,\n peerRole: destinationRole,\n peerType: _this._sessionParams.clientType === MediaConstants_1.SessionClientType.INITIATOR\n ? MediaConstants_1.SessionClientType.GUEST : MediaConstants_1.SessionClientType.INITIATOR,\n connection: connection,\n publisher: null,\n subscriber: null,\n remoteMediaTracks: [],\n localStream: streams,\n connectionTimoutPrt: null\n };\n // if (!streams.videoSource && !streams.audioSource) {\n // trace.info('Peer connection without publisher was created', peerConnection);\n //\n // return peerConnection;\n // }\n if (connection.connectionId !== _this.ownPeerId || (!streams.videoSource && !streams.audioSource)) {\n trace.info('Peer connection without publisher was created', peerConnection);\n return peerConnection;\n }\n var streamName = destinationRole === MediaConstants_1.SessionClientRole.USER\n ? MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM : MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM;\n return _this.createMediaPublisher(streams, streamName)\n .then(function (publisher) {\n peerConnection.publisher = publisher;\n trace.info('Peer connection with publisher was created', peerConnection);\n return peerConnection;\n });\n })\n .then(function (peerConnection) {\n _this._peerConnections.set(peerConnection.peerId, peerConnection);\n if (peerConnection.publisher) {\n return new Promise(function (resolve, reject) {\n trace.info('Starting publish to peerConnection.publisher');\n _this._session.publish(peerConnection.publisher, function (error) {\n if (error) {\n trace.error('Publish to peerConnection error', error);\n return reject(error);\n }\n trace.info('Publish to peerConnection success');\n return resolve();\n });\n });\n }\n return Promise.resolve();\n })\n .catch(function (error) {\n //Need to handle fail cases during reliability\n trace.error('Error handling new peer connection', error);\n });\n };\n OpentokSession.prototype.connectionDestroyedHandler = function (event) {\n trace.info('connectionDestroyedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n if (this._peerConnections.has(connection.connectionId)) {\n this.destroyPeerConnection(this._peerConnections.get(connection.connectionId));\n }\n };\n OpentokSession.prototype.streamCreatedHandler = function (event) {\n trace.info('streamCreatedHandler', event.stream);\n var stream = event.stream;\n var connection = (stream || { connection: null }).connection;\n if (!this.sessionExistsGuard(false) || !stream || connection.connectionId === this.ownPeerId) {\n return;\n }\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist on this stage');\n return;\n }\n var peerConnection = this._peerConnections.get(connection.connectionId);\n trace.info('Subscribing the stream');\n this.createMediaSubscriber(stream).then(function (subscriber) {\n peerConnection.subscriber = subscriber;\n });\n };\n OpentokSession.prototype.streamDestroyedHandler = function (event) {\n trace.info('streamDestroyedHandler', event);\n var stream = event.stream;\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n var peerConnection = this._peerConnections.get(stream.connection.connectionId);\n if (!peerConnection) {\n trace.warn('Peer connection for remote stream not found');\n return;\n }\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region PeerConnection\n OpentokSession.prototype.destroyPeerConnection = function (peerConnection) {\n this._peerConnections.delete(peerConnection.peerId);\n this.destroyPublisherOnPeerConnection(peerConnection).catch(function () { return undefined; });\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region Publisher\n OpentokSession.prototype.createStreamForPublishing = function (destinationRole) {\n var _this = this;\n trace.info('createStreamForPublishing');\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then(function (mediaStream) {\n var stream = { videoSource: null, audioSource: null };\n if (mediaStream) {\n trace.info('Media stream found for publishing', mediaStream);\n mediaStream.getTracks().forEach(function (track) {\n if (track.kind === 'video') {\n stream.videoSource = track;\n }\n else if (track.kind === 'audio') {\n stream.audioSource = track;\n }\n });\n }\n else if (_this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n trace.warn('No local media was found for publishing to destinationRole:', destinationRole);\n }\n return stream;\n });\n };\n OpentokSession.prototype.createMediaPublisher = function (stream, streamName) {\n var otParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource,\n showControls: false\n };\n return new Promise(function (resolve, reject) {\n var otPublisher = window.OT.initPublisher(undefined, otParams, function (error) {\n if (error) {\n reject(error);\n return;\n }\n otPublisher.on('streamDestroyed', function (event) {\n trace.info('Publisher stream destroyed', event);\n //We preventing the default, in order to prevent stop the stream by OT.\n //We managing streams by ourselves and if we allow OT to close the stream, it cannot be reused.\n event.preventDefault();\n });\n otPublisher.on('videoElementCreated', function (event) {\n document.getElementById(otPublisher.id).style.display = 'none';\n event.element.muted = true;\n });\n resolve(otPublisher);\n });\n });\n };\n OpentokSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n this._session.unpublish(peerConnection.publisher);\n }\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n return Promise.resolve();\n };\n //#endregion\n //#region Subscriber\n OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (!_this.sessionExistsGuard(false)) {\n reject('Session not exists');\n return;\n }\n var subscriber = _this._session.subscribe(remoteStream, null, null, function (err) {\n if (err) {\n trace.warn('Error creating subscriber', err);\n reject(err);\n return;\n }\n subscriber.on('videoElementCreated', function (event) {\n document.getElementById(subscriber.id).style.display = 'none';\n var element = event.element;\n element.muted = true;\n var peerConnection = _this._peerConnections.get(remoteStream.connection.connectionId);\n var otMediaStream = element.srcObject;\n peerConnection.subscriber = subscriber;\n if (!otMediaStream) {\n trace.warn('MediaStream not found in OT video element');\n return;\n }\n trace.info('Registering remote media tracks', peerConnection.subscriber, otMediaStream);\n otMediaStream.getTracks().forEach(function (mediaTrack) {\n _this.addRemoteTrackToPeer(peerConnection, mediaTrack);\n });\n _this.registerPeersRemoteTracks(peerConnection);\n });\n resolve(subscriber);\n });\n });\n };\n OpentokSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session.unsubscribe(peerConnection.subscriber);\n }\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(function () { return trace.warn('Error removing remote streams from peerConnection'); })\n .then(function () {\n peerConnection.subscriber = null;\n });\n };\n //#endregion\n OpentokSession.prototype.calculateDestinationRole = function () {\n if (this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n var isAgentConnected = false;\n return !isAgentConnected ? MediaConstants_1.SessionClientRole.AGENT : MediaConstants_1.SessionClientRole.OBSERVER;\n }\n return MediaConstants_1.SessionClientRole.USER;\n };\n OpentokSession.prototype.sessionExistsGuard = function (shouldThrow) {\n if (shouldThrow === void 0) { shouldThrow = true; }\n var connected = !!(this._session && this._session.connection && this._session.connection.connectionId);\n return guards_1.throwableGuard(connected, 'There no OpenTok session exists', shouldThrow);\n };\n return OpentokSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.OpentokSession = OpentokSession;\n\n//# sourceMappingURL=SessionOpentok.js.map\n"]}
1
+ {"version":3,"sources":["MediaSession/SessionOpentok.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","defineProperty","exports","value","MediaConstants_1","require","guards_1","MediaSessionBase_1","MediaTracer_1","bluebird_1","trace","getMediaTracer","OpentokSession","_super","sessionParams","streamFactory","_this","call","_lastStreamEvents","_session","_credentials","credentials","connect","bind","disconnect","onMediaStreamDestroyed","onMediaStreamRenewed","createStreamForPublishing","createMediaPublisher","connectionCreatedHandler","connectionDestroyedHandler","streamCreatedHandler","streamDestroyedHandler","get","sessionId","enumerable","configurable","connection","connectionId","sessionDisconnect","info","error","Promise","reject","resolve","handleError","off","_a","_sessionParams","apiKey","window","OTSESSION","OT","initSession","on","connectHandler","token","currentSession","_peerConnections","forEach","peerConnection","destroyPeerConnection","clientRole","promises","peerRole","push","destroyPublisherOnPeerConnection","all","then","undefined","mediaStream","replaceStreamTracks","Error","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","subscriber","getStats","stats","warn","trackId","id","trackStats","event","sessionExistsGuard","destinationRole","JSON","parse","data","streams","peerId","peerType","clientType","SessionClientType","INITIATOR","GUEST","publisher","remoteMediaTracks","localStream","connectionTimoutPrt","ownPeerId","videoSource","audioSource","set","reduce","promiseChain","streamEvent","publish","catch","has","stream","createMediaSubscriber","destroySubscriberOnPeerConnection","delete","_sessionStreamsManager","getMediaStreamForRole","getTracks","track","kind","SessionClientRole","USER","otParams","publishAudio","publishVideo","showControls","otPublisher","initPublisher","preventDefault","document","getElementById","style","display","element","muted","unpublish","remoteStream","subscribe","err","otMediaStream","srcObject","addRemoteTrackToPeer","registerPeersRemoteTracks","unsubscribe","unregisterPeersRemoteMediaTracks","calculateDestinationRole","isAgentConnected","AGENT","OBSERVER","shouldThrow","connected","throwableGuard","MediaSessionBase"],"mappings":"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","file":"SessionOpentok.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})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar guards_1 = require(\"@techsee/techsee-common/lib/core/guards\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar bluebird_1 = require(\"bluebird\");\nvar trace = MediaTracer_1.getMediaTracer('OpentokSession');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar OpentokSession = /** @class */ (function (_super) {\n __extends(OpentokSession, _super);\n function OpentokSession(sessionParams, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._lastStreamEvents = [];\n _this._session = null;\n _this._credentials = sessionParams.credentials;\n _this.connect = _this.connect.bind(_this);\n _this.disconnect = _this.disconnect.bind(_this);\n _this.onMediaStreamDestroyed = _this.onMediaStreamDestroyed.bind(_this);\n _this.onMediaStreamRenewed = _this.onMediaStreamRenewed.bind(_this);\n _this.createStreamForPublishing = _this.createStreamForPublishing.bind(_this);\n _this.createMediaPublisher = _this.createMediaPublisher.bind(_this);\n _this.connectionCreatedHandler = _this.connectionCreatedHandler.bind(_this);\n _this.connectionDestroyedHandler = _this.connectionDestroyedHandler.bind(_this);\n _this.streamCreatedHandler = _this.streamCreatedHandler.bind(_this);\n _this.streamDestroyedHandler = _this.streamDestroyedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(OpentokSession.prototype, \"id\", {\n get: function () {\n return this._session && this._session.sessionId ? this._session.sessionId : '';\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(OpentokSession.prototype, \"ownPeerId\", {\n get: function () {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n },\n enumerable: true,\n configurable: true\n });\n OpentokSession.prototype.sessionDisconnect = function () {\n if (this._session) {\n return this._session.disconnect();\n }\n };\n OpentokSession.prototype.connect = function () {\n var _this = this;\n trace.info('Connect to session', this._credentials);\n if (this._session) {\n trace.error('Session already exists');\n return bluebird_1.Promise.reject('Cannot connect to session while another session is active');\n }\n return new bluebird_1.Promise(function (resolve, reject) {\n var handleError = function (error) {\n _this._session && _this._session.off();\n _this._session = null;\n trace.error('handleConnect error:', error);\n reject(error);\n };\n var _a = _this._sessionParams.credentials, apiKey = _a.apiKey, sessionId = _a.sessionId;\n _this._session = window.OTSESSION = window.OT.initSession(apiKey, sessionId);\n _this._lastStreamEvents = [];\n _this._session.on('connectionCreated', _this.connectionCreatedHandler);\n _this._session.on('connectionDestroyed', _this.connectionDestroyedHandler);\n _this._session.on('streamCreated', _this.streamCreatedHandler);\n _this._session.on('streamDestroyed', _this.streamDestroyedHandler);\n var connectHandler = function (error) {\n if (error) {\n handleError(error);\n return;\n }\n resolve();\n };\n _this._session.connect(_this._credentials.token, connectHandler);\n });\n };\n OpentokSession.prototype.disconnect = function () {\n var _this = this;\n return new bluebird_1.Promise(function (resolve) {\n trace.info('Disconnecting from session');\n var currentSession = _this._session;\n _this._session = null;\n _this._peerConnections.forEach(function (peerConnection) {\n _this.destroyPeerConnection(peerConnection);\n });\n if (!currentSession) {\n trace.info('No active session - resolving');\n resolve();\n return;\n }\n currentSession.off();\n currentSession.disconnect();\n _this._lastStreamEvents = [];\n resolve();\n });\n };\n OpentokSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n var promises = [];\n this._peerConnections.forEach(function (peerConnection) {\n if (peerConnection.peerRole === clientRole) {\n promises.push(_this.destroyPublisherOnPeerConnection(peerConnection));\n }\n });\n return bluebird_1.Promise.all(promises).then(function () { return undefined; });\n };\n OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)\n return bluebird_1.Promise.resolve();\n };\n OpentokSession.prototype.replaceStreamTracks = function (mediaStream) {\n return bluebird_1.Promise.reject(new Error('Not implemented'));\n };\n OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var _this = this;\n return new bluebird_1.Promise(function (resolve, reject) {\n var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);\n if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {\n reject(new Error('Cannot find peer or subscriber for getting stats'));\n }\n //https://tokbox.com/developer/sdks/js/reference/Subscriber.html#getStats\n peerConnectionOfTrack.subscriber.getStats(function (error, stats) {\n if (error) {\n trace.warn('Error getting stats', error);\n resolve({ trackId: mediaTrack.id, trackStats: {} });\n return;\n }\n resolve({ trackId: mediaTrack.id, trackStats: stats });\n });\n });\n };\n //#region OpenTok Events Handlers\n OpentokSession.prototype.connectionCreatedHandler = function (event) {\n var _this = this;\n trace.info('connectionCreatedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n var destinationRole = JSON.parse(connection.data).clientRole;\n this.createStreamForPublishing(destinationRole)\n .then(function (streams) {\n var peerConnection = {\n peerId: connection.connectionId,\n peerRole: destinationRole,\n peerType: _this._sessionParams.clientType === MediaConstants_1.SessionClientType.INITIATOR\n ? MediaConstants_1.SessionClientType.GUEST : MediaConstants_1.SessionClientType.INITIATOR,\n connection: connection,\n publisher: null,\n subscriber: null,\n remoteMediaTracks: [],\n localStream: streams,\n connectionTimoutPrt: null\n };\n if (connection.connectionId !== _this.ownPeerId || (!streams.videoSource && !streams.audioSource)) {\n trace.info('Peer connection without publisher was created', peerConnection);\n return peerConnection;\n }\n return _this.createMediaPublisher(streams)\n .then(function (publisher) {\n peerConnection.publisher = publisher;\n trace.info('Peer connection with publisher was created', peerConnection);\n return peerConnection;\n });\n })\n .then(function (peerConnection) {\n _this._peerConnections.set(peerConnection.peerId, peerConnection);\n if (connection.connectionId === _this.ownPeerId) {\n trace.info('Before subscribe the event streams');\n return _this._lastStreamEvents.reduce(function (promiseChain, streamEvent) { return promiseChain.then(function () { return _this.streamCreatedHandler(streamEvent); }); }, bluebird_1.Promise.resolve()).then(function () {\n if (peerConnection.publisher) {\n return new bluebird_1.Promise(function (resolve, reject) {\n trace.info('Starting publish to peerConnection.publisher');\n _this._session.publish(peerConnection.publisher, function (error) {\n if (error) {\n trace.error('Publish to peerConnection error', error);\n return reject(error);\n }\n trace.info('Publish to peerConnection success');\n return resolve();\n });\n });\n }\n return bluebird_1.Promise.resolve();\n });\n }\n })\n .catch(function (error) {\n //Need to handle fail cases during reliability\n trace.error('Error handling new peer connection', error);\n });\n };\n OpentokSession.prototype.connectionDestroyedHandler = function (event) {\n trace.info('connectionDestroyedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n if (this._peerConnections.has(connection.connectionId)) {\n this.destroyPeerConnection(this._peerConnections.get(connection.connectionId));\n }\n };\n OpentokSession.prototype.streamCreatedHandler = function (event) {\n trace.info('streamCreatedHandler', event.stream);\n var stream = event.stream;\n var connection = (stream || { connection: null }).connection;\n if (!this.sessionExistsGuard(false) || !stream || connection.connectionId === this.ownPeerId) {\n return;\n }\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist on this stage');\n this._lastStreamEvents.push(event);\n return;\n }\n var peerConnection = this._peerConnections.get(connection.connectionId);\n trace.info('Subscribing the stream');\n this.createMediaSubscriber(stream).then(function (subscriber) {\n peerConnection.subscriber = subscriber;\n });\n };\n OpentokSession.prototype.streamDestroyedHandler = function (event) {\n trace.info('streamDestroyedHandler', event);\n var stream = event.stream;\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n var peerConnection = this._peerConnections.get(stream.connection.connectionId);\n if (!peerConnection) {\n trace.warn('Peer connection for remote stream not found');\n return;\n }\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region PeerConnection\n OpentokSession.prototype.destroyPeerConnection = function (peerConnection) {\n this._peerConnections.delete(peerConnection.peerId);\n this.destroyPublisherOnPeerConnection(peerConnection).catch(function () { return undefined; });\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region Publisher\n OpentokSession.prototype.createStreamForPublishing = function (destinationRole) {\n var _this = this;\n trace.info('createStreamForPublishing');\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then(function (mediaStream) {\n var stream = { videoSource: null, audioSource: null };\n if (mediaStream) {\n trace.info('Media stream found for publishing', mediaStream);\n mediaStream.getTracks().forEach(function (track) {\n if (track.kind === 'video') {\n stream.videoSource = track;\n }\n else if (track.kind === 'audio') {\n stream.audioSource = track;\n }\n });\n }\n else if (_this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n trace.warn('No local media was found for publishing to destinationRole:', destinationRole);\n }\n return stream;\n });\n };\n OpentokSession.prototype.createMediaPublisher = function (stream) {\n var otParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource,\n showControls: false\n };\n return new bluebird_1.Promise(function (resolve, reject) {\n var otPublisher = window.OT.initPublisher(undefined, otParams, function (error) {\n if (error) {\n reject(error);\n return;\n }\n otPublisher.on('streamDestroyed', function (event) {\n trace.info('Publisher stream destroyed', event);\n //We preventing the default, in order to prevent stop the stream by OT.\n //We managing streams by ourselves and if we allow OT to close the stream, it cannot be reused.\n event.preventDefault();\n });\n otPublisher.on('videoElementCreated', function (event) {\n document.getElementById(otPublisher.id).style.display = 'none';\n event.element.muted = true;\n });\n resolve(otPublisher);\n });\n });\n };\n OpentokSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n this._session.unpublish(peerConnection.publisher);\n }\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n return bluebird_1.Promise.resolve();\n };\n //#endregion\n //#region Subscriber\n OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {\n var _this = this;\n return new bluebird_1.Promise(function (resolve, reject) {\n if (!_this.sessionExistsGuard(false)) {\n reject('Session not exists');\n return;\n }\n var subscriber = _this._session.subscribe(remoteStream, null, null, function (err) {\n if (err) {\n trace.warn('Error creating subscriber', err);\n reject(err);\n return;\n }\n subscriber.on('videoElementCreated', function (event) {\n document.getElementById(subscriber.id).style.display = 'none';\n var element = event.element;\n element.muted = true;\n var peerConnection = _this._peerConnections.get(remoteStream.connection.connectionId);\n var otMediaStream = element.srcObject;\n peerConnection.subscriber = subscriber;\n if (!otMediaStream) {\n trace.warn('MediaStream not found in OT video element');\n return;\n }\n trace.info('Registering remote media tracks', peerConnection.subscriber, otMediaStream);\n otMediaStream.getTracks().forEach(function (mediaTrack) {\n _this.addRemoteTrackToPeer(peerConnection, mediaTrack);\n });\n _this.registerPeersRemoteTracks(peerConnection);\n });\n resolve(subscriber);\n });\n });\n };\n OpentokSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session.unsubscribe(peerConnection.subscriber);\n }\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(function () { return trace.warn('Error removing remote streams from peerConnection'); })\n .then(function () {\n peerConnection.subscriber = null;\n });\n };\n //#endregion\n OpentokSession.prototype.calculateDestinationRole = function () {\n if (this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n var isAgentConnected = false;\n return !isAgentConnected ? MediaConstants_1.SessionClientRole.AGENT : MediaConstants_1.SessionClientRole.OBSERVER;\n }\n return MediaConstants_1.SessionClientRole.USER;\n };\n OpentokSession.prototype.sessionExistsGuard = function (shouldThrow) {\n if (shouldThrow === void 0) { shouldThrow = true; }\n var connected = !!(this._session && this._session.connection && this._session.connection.connectionId);\n return guards_1.throwableGuard(connected, 'There no OpenTok session exists', shouldThrow);\n };\n return OpentokSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.OpentokSession = OpentokSession;\n\n//# sourceMappingURL=SessionOpentok.js.map\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techsee/techsee-media-service",
3
- "version": "999.13.0-alphasap1",
3
+ "version": "999.13.0-alphasap3",
4
4
  "description": "Techsee Media Service Client",
5
5
  "author": "TechSee",
6
6
  "main": "lib/index.js",