@techsee/techsee-media-service 999.0.2-switch → 999.0.3-alpha2

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.
Files changed (150) hide show
  1. package/lib/LocalStreamManager.d.ts +12 -0
  2. package/lib/LocalStreamManager.d.ts.map +1 -1
  3. package/lib/LocalStreamManager.js +440 -283
  4. package/lib/LocalStreamManager.js.map +1 -1
  5. package/lib/MediaConstants.d.ts +14 -4
  6. package/lib/MediaConstants.d.ts.map +1 -1
  7. package/lib/MediaConstants.js +83 -38
  8. package/lib/MediaConstants.js.map +1 -1
  9. package/lib/MediaContracts.d.ts +17 -14
  10. package/lib/MediaContracts.d.ts.map +1 -1
  11. package/lib/MediaContracts.js +3 -3
  12. package/lib/MediaContracts.js.map +1 -1
  13. package/lib/MediaPublisher.d.ts +3 -3
  14. package/lib/MediaPublisher.d.ts.map +1 -1
  15. package/lib/MediaPublisher.js +46 -35
  16. package/lib/MediaPublisher.js.map +1 -1
  17. package/lib/MediaServiceBase.d.ts +21 -7
  18. package/lib/MediaServiceBase.d.ts.map +1 -1
  19. package/lib/MediaServiceBase.js +924 -586
  20. package/lib/MediaServiceBase.js.map +1 -1
  21. package/lib/MediaSession/MediaServer.d.ts +45 -0
  22. package/lib/MediaSession/MediaServer.d.ts.map +1 -0
  23. package/lib/MediaSession/MediaServer.js +538 -0
  24. package/lib/MediaSession/MediaServer.js.map +1 -0
  25. package/lib/MediaSession/MediaSessionBase.d.ts +10 -1
  26. package/lib/MediaSession/MediaSessionBase.d.ts.map +1 -1
  27. package/lib/MediaSession/MediaSessionBase.js +128 -66
  28. package/lib/MediaSession/MediaSessionBase.js.map +1 -1
  29. package/lib/MediaSession/SessionOpentok.d.ts +11 -9
  30. package/lib/MediaSession/SessionOpentok.d.ts.map +1 -1
  31. package/lib/MediaSession/SessionOpentok.js +500 -352
  32. package/lib/MediaSession/SessionOpentok.js.map +1 -1
  33. package/lib/MediaSession/SessionTurn.d.ts +4 -1
  34. package/lib/MediaSession/SessionTurn.d.ts.map +1 -1
  35. package/lib/MediaSession/SessionTurn.js +611 -422
  36. package/lib/MediaSession/SessionTurn.js.map +1 -1
  37. package/lib/MediaSession/TurnConstants.js +31 -30
  38. package/lib/MediaSession/TurnConstants.js.map +1 -1
  39. package/lib/MediaSubscriber.d.ts +11 -11
  40. package/lib/MediaSubscriber.d.ts.map +1 -1
  41. package/lib/MediaSubscriber.js +236 -192
  42. package/lib/MediaSubscriber.js.map +1 -1
  43. package/lib/MediaUtils/Compatibility.d.ts +2 -1
  44. package/lib/MediaUtils/Compatibility.d.ts.map +1 -1
  45. package/lib/MediaUtils/Compatibility.js +130 -85
  46. package/lib/MediaUtils/Compatibility.js.map +1 -1
  47. package/lib/MediaUtils/MediaDomUtils.d.ts +3 -2
  48. package/lib/MediaUtils/MediaDomUtils.d.ts.map +1 -1
  49. package/lib/MediaUtils/MediaDomUtils.js +235 -174
  50. package/lib/MediaUtils/MediaDomUtils.js.map +1 -1
  51. package/lib/MediaUtils/MediaTracer.js +9 -4
  52. package/lib/MediaUtils/MediaTracer.js.map +1 -1
  53. package/lib/MediaUtils/index.d.ts +1 -0
  54. package/lib/MediaUtils/index.d.ts.map +1 -0
  55. package/lib/MediaUtils/index.js +16 -0
  56. package/lib/MediaUtils/index.js.map +1 -0
  57. package/lib/MultiParty/Contracts.d.ts +16 -0
  58. package/lib/MultiParty/Contracts.d.ts.map +1 -0
  59. package/lib/MultiParty/Contracts.js +6 -0
  60. package/lib/MultiParty/Contracts.js.map +1 -0
  61. package/lib/MultiParty/DetectWebRtcService.d.ts +16 -0
  62. package/lib/MultiParty/DetectWebRtcService.d.ts.map +1 -0
  63. package/lib/MultiParty/DetectWebRtcService.js +79 -0
  64. package/lib/MultiParty/DetectWebRtcService.js.map +1 -0
  65. package/lib/MultiParty/MediaCapabilitiesService.d.ts +23 -0
  66. package/lib/MultiParty/MediaCapabilitiesService.d.ts.map +1 -0
  67. package/lib/MultiParty/MediaCapabilitiesService.js +369 -0
  68. package/lib/MultiParty/MediaCapabilitiesService.js.map +1 -0
  69. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts +5 -0
  70. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts.map +1 -0
  71. package/lib/MultiParty/MediaCapabilitiesUtils.js +305 -0
  72. package/lib/MultiParty/MediaCapabilitiesUtils.js.map +1 -0
  73. package/lib/MultiParty/MultiPartyService.d.ts +40 -0
  74. package/lib/MultiParty/MultiPartyService.d.ts.map +1 -0
  75. package/lib/MultiParty/MultiPartyService.js +70 -0
  76. package/lib/MultiParty/MultiPartyService.js.map +1 -0
  77. package/lib/MultiParty/MultiPartyServiceFactory.d.ts +3 -0
  78. package/lib/MultiParty/MultiPartyServiceFactory.d.ts.map +1 -0
  79. package/lib/MultiParty/MultiPartyServiceFactory.js +21 -0
  80. package/lib/MultiParty/MultiPartyServiceFactory.js.map +1 -0
  81. package/lib/MultiParty/OpentokMultiPartyService.d.ts +29 -0
  82. package/lib/MultiParty/OpentokMultiPartyService.d.ts.map +1 -0
  83. package/lib/MultiParty/OpentokMultiPartyService.js +888 -0
  84. package/lib/MultiParty/OpentokMultiPartyService.js.map +1 -0
  85. package/lib/MultiParty/VideoLayoutType.d.ts +4 -0
  86. package/lib/MultiParty/VideoLayoutType.d.ts.map +1 -0
  87. package/lib/MultiParty/VideoLayoutType.js +13 -0
  88. package/lib/MultiParty/VideoLayoutType.js.map +1 -0
  89. package/lib/MultiParty/index.d.ts +4 -0
  90. package/lib/MultiParty/index.d.ts.map +1 -0
  91. package/lib/MultiParty/index.js +61 -0
  92. package/lib/MultiParty/index.js.map +1 -0
  93. package/lib/MultiParty/opentok.d.ts +503 -0
  94. package/lib/TechseeMediaStream.d.ts +6 -6
  95. package/lib/TechseeMediaStream.d.ts.map +1 -1
  96. package/lib/TechseeMediaStream.js +59 -53
  97. package/lib/TechseeMediaStream.js.map +1 -1
  98. package/lib/oldCode/constants.js +20 -15
  99. package/lib/oldCode/constants.js.map +1 -1
  100. package/lib/oldCode/event-emitter.js +45 -22
  101. package/lib/oldCode/event-emitter.js.map +1 -1
  102. package/lib/oldCode/index.js +48 -52
  103. package/lib/oldCode/index.js.map +1 -1
  104. package/lib/oldCode/opentok/session.js +261 -236
  105. package/lib/oldCode/opentok/session.js.map +1 -1
  106. package/lib/oldCode/opentok/stream.js +283 -269
  107. package/lib/oldCode/opentok/stream.js.map +1 -1
  108. package/lib/oldCode/publisher.js +96 -71
  109. package/lib/oldCode/publisher.js.map +1 -1
  110. package/lib/oldCode/service.js +294 -272
  111. package/lib/oldCode/service.js.map +1 -1
  112. package/lib/oldCode/session.js +82 -60
  113. package/lib/oldCode/session.js.map +1 -1
  114. package/lib/oldCode/stream.js +153 -125
  115. package/lib/oldCode/stream.js.map +1 -1
  116. package/lib/oldCode/subscriber.js +60 -35
  117. package/lib/oldCode/subscriber.js.map +1 -1
  118. package/lib/oldCode/tracer.d.ts +3 -2
  119. package/lib/oldCode/tracer.d.ts.map +1 -1
  120. package/lib/oldCode/tracer.js +181 -130
  121. package/lib/oldCode/tracer.js.map +1 -1
  122. package/lib/oldCode/utils/ImageFixer.js +67 -44
  123. package/lib/oldCode/utils/ImageFixer.js.map +1 -1
  124. package/lib/oldCode/webrtc/constants.js +102 -110
  125. package/lib/oldCode/webrtc/constants.js.map +1 -1
  126. package/lib/oldCode/webrtc/helper.js +176 -124
  127. package/lib/oldCode/webrtc/helper.js.map +1 -1
  128. package/lib/oldCode/webrtc/session-kms.js +408 -393
  129. package/lib/oldCode/webrtc/session-kms.js.map +1 -1
  130. package/lib/oldCode/webrtc/session-loopback.js +245 -227
  131. package/lib/oldCode/webrtc/session-loopback.js.map +1 -1
  132. package/lib/oldCode/webrtc/session-turn.js +705 -658
  133. package/lib/oldCode/webrtc/session-turn.js.map +1 -1
  134. package/lib/oldCode/webrtc/session-turn.v2.js +480 -471
  135. package/lib/oldCode/webrtc/session-turn.v2.js.map +1 -1
  136. package/lib/oldCode/webrtc/session.js +12 -6
  137. package/lib/oldCode/webrtc/session.js.map +1 -1
  138. package/lib/oldCode/webrtc/stream.js +526 -504
  139. package/lib/oldCode/webrtc/stream.js.map +1 -1
  140. package/lib/oldCode/webrtc/temasys/adapter-loader.js +5 -6
  141. package/lib/oldCode/webrtc/temasys/adapter-loader.js.map +1 -1
  142. package/lib/oldCode/webrtc/temasys/adapter.js +5264 -5192
  143. package/lib/oldCode/webrtc/temasys/adapter.js.map +1 -1
  144. package/lib/oldCode/webrtc/webrtc-ie-shim.js +3357 -2927
  145. package/lib/oldCode/webrtc/webrtc-ie-shim.js.map +1 -1
  146. package/lib/qos/raw-qos.js +348 -273
  147. package/lib/qos/raw-qos.js.map +1 -1
  148. package/lib/webrtc-ie-shim.js +3386 -2985
  149. package/lib/webrtc-ie-shim.js.map +1 -1
  150. package/package.json +54 -42
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["MediaSession/MediaServer.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__","constructor","create","__importDefault","mod","__esModule","defineProperty","exports","value","MediaServerSession","MediaSessionBase_1","require","MediaConstants_1","openvidu_browser_1","MediaTracer_1","guards_1","bluebird_1","get_1","trace","getMediaTracer","_super","sessionParams","streamFactory","_this","OV","_session","_lastStreamEvents","_credentials","credentials","connect","bind","disconnect","onMediaStreamDestroyed","onPublisherDestroyed","onMediaStreamRenewed","createStreamForPublishing","createMediaPublisher","connectionCreatedHandler","connectionDestroyedHandler","streamCreatedHandler","streamDestroyedHandler","get","connection","connectionId","enumerable","configurable","connectOnly","info","error","Promise","reject","OpenVidu","initSession","initSessionEvents","token","clientRole","_sessionParams","err","sessionDisconnect","resolve","promiseDisconnect","_peerConnections","forEach","peerConnection","push","destroyPeerConnection","all","then","removeSessionEvent","off","removeHandlers","getRemoteTrackStats","mediaTrack","undefined","promises","peerRole","destroyPublisherOnPeerConnection","mediaStream","replaceStreamTracks","Error","initHandlers","on","event","emitEvent","recordingEvents","RECORD_STARTED","RECORD_STOPPED","RECONNECTING","stream","sessionExistsGuard","warn","destroySubscriberOnPeerConnection","has","peerId","subscriber","unsubscribe","unregisterPeersRemoteMediaTracks","publisher","unpublish","localStream","createMediaSubscriber","remoteStream","subscribe","ownPeerId","getMediaStream","getTracks","addRemoteTrackToPeer","registerPeersRemoteTracks","destinationRole","_sessionStreamsManager","getMediaStreamForRole","videoSource","audioSource","track","kind","SessionClientRole","USER","ovParams","publishAudio","publishVideo","ovPublisher","initPublisher","preventDefault","JSON","parse","data","streams","peerType","clientType","SessionClientType","INITIATOR","GUEST","remoteMediaTracks","connectionTimoutPrt","set","reduce","promiseChain","streamEvent","publish","shouldThrow","connected","throwableGuard","MediaSessionBase"],"mappings":"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","file":"MediaServer.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 (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MediaServerSession = void 0;\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar openvidu_browser_1 = require(\"@techsee/openvidu-browser\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar guards_1 = require(\"@techsee/techsee-common/lib/core/guards\");\nvar bluebird_1 = require(\"bluebird\");\nvar get_1 = __importDefault(require(\"lodash/get\"));\nvar trace = MediaTracer_1.getMediaTracer('MediaServerSession');\nvar MediaServerSession = /** @class */ (function (_super) {\n __extends(MediaServerSession, _super);\n function MediaServerSession(sessionParams, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this.OV = null;\n _this._session = null;\n _this._lastStreamEvents = [];\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.onPublisherDestroyed = _this.onPublisherDestroyed.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(MediaServerSession.prototype, \"ownPeerId\", {\n get: function () {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n },\n enumerable: false,\n configurable: true\n });\n MediaServerSession.prototype.connect = function (connectOnly) {\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 // const iceServers = this._credentials.ice.map((item: any) => ({\n // urls: item.url,\n // username: item.login,\n // credential: item.password\n // }));\n this.OV = new openvidu_browser_1.OpenVidu();\n // this.OV.setAdvancedConfiguration({ iceServers });\n this._session = this.OV.initSession();\n this.initSessionEvents();\n return this._session.connect(this._credentials.token, { clientRole: this._sessionParams.clientRole })\n .catch(function (err) {\n trace.error('Error to connect to session Media Server: ', err);\n throw err;\n });\n };\n MediaServerSession.prototype.sessionDisconnect = function () {\n if (this._session) {\n return this._session.disconnect(true);\n }\n };\n MediaServerSession.prototype.disconnect = function () {\n var _this = this;\n return new bluebird_1.Promise(function (resolve) {\n trace.info('Disconnecting from session');\n var promiseDisconnect = [];\n _this._peerConnections.forEach(function (peerConnection) {\n promiseDisconnect.push(_this.destroyPeerConnection(peerConnection));\n });\n return bluebird_1.Promise.all(promiseDisconnect).then(function () {\n if (!_this._session) {\n trace.info('No active session - resolving');\n resolve();\n return;\n }\n _this.removeSessionEvent();\n _this._session.disconnect();\n _this._lastStreamEvents = [];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete _this._session;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete _this.OV;\n resolve();\n });\n });\n };\n MediaServerSession.prototype.removeSessionEvent = function () {\n if (!this._session) {\n return;\n }\n this._session.off('connectionCreated');\n this._session.off('streamCreated');\n this._session.off('streamDestroyed');\n this._session.off('connectionDestroyed');\n this._session.off('sessionDisconnected');\n this._session.off('recordingStarted');\n this._session.off('recordingStopped');\n this._sessionParams.removeHandlers && this._sessionParams.removeHandlers();\n trace.info('Remove Events Listener');\n };\n MediaServerSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore// @ts-ignore\n return bluebird_1.Promise.resolve(undefined);\n };\n MediaServerSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n trace.info('onMediaStreamDestroyed');\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 trace.info('onMediaStreamDestroyed: Success'); });\n };\n MediaServerSession.prototype.onPublisherDestroyed = function (connectionId) {\n trace.info('onPublisherDestroyed');\n var peerConnection = this._peerConnections.get(connectionId);\n if (!peerConnection) {\n return bluebird_1.Promise.resolve();\n }\n return this.destroyPublisherOnPeerConnection(peerConnection);\n };\n MediaServerSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n return bluebird_1.Promise.resolve(undefined);\n };\n MediaServerSession.prototype.replaceStreamTracks = function (mediaStream) {\n return bluebird_1.Promise.reject(new Error('Not implemented'));\n };\n MediaServerSession.prototype.initSessionEvents = function () {\n var _this = this;\n if (!this._session) {\n return;\n }\n this._sessionParams.initHandlers && this._sessionParams.initHandlers();\n this._lastStreamEvents = [];\n this._session.on('connectionCreated', this.connectionCreatedHandler);\n this._session.on('streamCreated', this.streamCreatedHandler);\n this._session.on('streamDestroyed', this.streamDestroyedHandler);\n this._session.on('connectionDestroyed', this.connectionDestroyedHandler);\n this._session.on('recordingStarted', function (event) {\n trace.info('recordingStarted event', event);\n _this.emitEvent(MediaSessionBase_1.recordingEvents.RECORD_STARTED, event);\n });\n this._session.on('recordingStopped', function (event) {\n trace.info('recordingStopped event', event);\n _this.emitEvent(MediaSessionBase_1.recordingEvents.RECORD_STOPPED, event);\n });\n this._session.on('reconnecting', function () {\n trace.info('reconnecting event');\n _this.emitEvent(MediaSessionBase_1.recordingEvents.RECONNECTING);\n });\n this._session.on('sessionDisconnected', this.disconnect);\n };\n MediaServerSession.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 MediaServerSession.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 var peerConnection = this._peerConnections.get(connection.connectionId);\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n }\n };\n MediaServerSession.prototype.destroyPeerConnection = function (peerConnection) {\n trace.info('destroyPeerConnection');\n this._peerConnections.delete(peerConnection.peerId);\n return bluebird_1.Promise.all([this.destroyPublisherOnPeerConnection(peerConnection),\n this.destroySubscriberOnPeerConnection(peerConnection)]).then(function () { return undefined; })\n .catch(function () {\n trace.warn('destroyPeerConnection - something wrong with destroy');\n });\n };\n MediaServerSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {\n trace.info('destroySubscriberOnPeerConnection', peerConnection);\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session.unsubscribe(peerConnection.subscriber);\n }\n trace.info('destroySubscriberOnPeerConnection- before unregisterPeersRemoteMediaTracks');\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(function () { return trace.warn('Error removing remote streams from peerConnection'); })\n .then(function () {\n trace.info('destroySubscriberOnPeerConnection- unregisterPeersRemoteMediaTracks successfully');\n peerConnection.subscriber = null;\n });\n };\n MediaServerSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {\n trace.info('destroyPublisherOnPeerConnection');\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n trace.info('destroyPublisherOnPeerConnection- unpublish!');\n this._session.unpublish(peerConnection.publisher);\n }\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n return bluebird_1.Promise.resolve();\n };\n MediaServerSession.prototype.createMediaSubscriber = function (remoteStream) {\n var _this = this;\n trace.info('createMediaSubscriber');\n return new bluebird_1.Promise(function (resolve, reject) {\n if (!_this.sessionExistsGuard(false)) {\n return reject('Session not exists');\n }\n trace.info('Before create subscriber');\n var subscriber = _this._session.subscribe(remoteStream, '', {}, function (err) {\n if (err) {\n trace.warn('Error creating subscriber', err);\n return reject(err);\n }\n trace.info('create subscriber successfully', subscriber);\n return resolve(subscriber);\n });\n });\n };\n MediaServerSession.prototype.streamCreatedHandler = function (event) {\n var _this = this;\n if (!event) {\n return bluebird_1.Promise.resolve();\n }\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 bluebird_1.Promise.resolve();\n }\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist, add to streams to subscribe list', event);\n this._lastStreamEvents.push(event);\n return bluebird_1.Promise.resolve();\n }\n var peerConnection = this._peerConnections.get(connection.connectionId);\n trace.info('Subscribing the stream');\n return this.createMediaSubscriber(stream).then(function (subscriber) {\n peerConnection.subscriber = subscriber;\n trace.info('Registering remote media tracks', peerConnection.subscriber);\n subscriber.stream.getMediaStream().getTracks().forEach(function (mediaTrack) {\n _this.addRemoteTrackToPeer(peerConnection, mediaTrack);\n });\n return _this.registerPeersRemoteTracks(peerConnection);\n });\n };\n MediaServerSession.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 MediaServerSession.prototype.createMediaPublisher = function (stream) {\n var _this = this;\n var ovParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource\n };\n return new bluebird_1.Promise(function (resolve, reject) {\n var ovPublisher = _this.OV.initPublisher('', ovParams, function (error) {\n if (error) {\n reject(error);\n return;\n }\n ovPublisher.on('streamDestroyed', function (event) {\n trace.info('Publisher stream destroyed', event);\n var connectionId = get_1.default(event, 'stream.connection.connectionId');\n _this.onPublisherDestroyed(connectionId);\n //We preventing the default, in order to prevent stop the stream by OV.\n //We managing streams by ourselves and if we allow OV to close the stream, it cannot be reused.\n event.preventDefault();\n });\n resolve(ovPublisher);\n });\n });\n };\n MediaServerSession.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 trace.info('Starting publish to peerConnection.publisher');\n return _this._session.publish(peerConnection.publisher)\n .catch(function (err) {\n trace.info('Error during publish', peerConnection.publisher);\n if (peerConnection.publisher) {\n trace.info('Error during publish- unpublish');\n _this._session.unpublish(peerConnection.publisher);\n }\n throw err;\n });\n }\n return bluebird_1.Promise.resolve();\n });\n }\n })\n .catch(function (error) {\n trace.error('Error handling new peer connection', error);\n });\n };\n MediaServerSession.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 MediaServer session exists', shouldThrow);\n };\n return MediaServerSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.MediaServerSession = MediaServerSession;\n\n//# sourceMappingURL=MediaServer.js.map\n"]}
@@ -1,7 +1,8 @@
1
- import { IMediaSessionPeer } from './MediaSessionBase';
1
+ /// <reference types="node" />
2
2
  import { SessionClientRole, SessionClientType } from '../MediaConstants';
3
3
  import { ISessionStreamsManager, MediaSessionConfiguration, MediaSessionParams, RemoteMediaTrack } from '../MediaContracts';
4
4
  import { Nullable } from '@techsee/techsee-common';
5
+ import { EventEmitter } from 'events';
5
6
  export interface IMediaSessionPeer {
6
7
  peerId: string;
7
8
  peerType: SessionClientType;
@@ -9,6 +10,11 @@ export interface IMediaSessionPeer {
9
10
  remoteMediaTracks: RemoteMediaTrack[];
10
11
  connectionTimoutPrt: any;
11
12
  }
13
+ export declare enum recordingEvents {
14
+ RECORD_STARTED = "RECORD_STARTED",
15
+ RECORD_STOPPED = "RECORD_STOPPED",
16
+ RECONNECTING = "RECONNECTING"
17
+ }
12
18
  declare global {
13
19
  interface RTCPeerConnection extends IMediaSessionPeer {
14
20
  }
@@ -17,7 +23,10 @@ export declare abstract class MediaSessionBase<PeerType extends IMediaSessionPee
17
23
  protected readonly _peerConnections: Map<string, PeerType>;
18
24
  protected readonly _sessionStreamsManager: ISessionStreamsManager;
19
25
  protected readonly _sessionParams: MediaSessionParams & MediaSessionConfiguration;
26
+ protected readonly _emitter: EventEmitter;
20
27
  protected constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration, streamFactory: ISessionStreamsManager);
28
+ registerEventCallback(event: string, callback: (eventArgs?: any) => void): void;
29
+ protected emitEvent(event: string, eventArgs?: any): void;
21
30
  protected addRemoteTrackToPeer(sourcePeerConnection: IMediaSessionPeer, mediaTrack: MediaStreamTrack): void;
22
31
  protected registerPeersRemoteTracks(sourcePeerConnection: IMediaSessionPeer): void;
23
32
  protected unregisterPeersRemoteMediaTracks(peerConnection: PeerType): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/MediaSession/MediaSessionBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAyC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EACH,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,mBAAmB,EAAE,GAAG,CAAC;CAC5B;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,iBAAkB,SAAQ,iBAAiB;KAEpD;CACJ;AAID,8BAAsB,gBAAgB,CAAC,QAAQ,SAAS,iBAAiB;IACrE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IACvE,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,kBAAkB,GAAG,yBAAyB,CAAC;IAElF,SAAS,aAAa,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EAAE,aAAa,EAAE,sBAAsB;IAO1H,SAAS,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB;IAsBpG,SAAS,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,iBAAiB;IAgB3E,SAAS,CAAC,gCAAgC,CAAC,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnF,SAAS,CAAC,6BAA6B,CAAC,UAAU,EAAE,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC;CAiB5F","file":"MediaSessionBase.d.ts","sourcesContent":["import {IMediaSessionPeer} from './MediaSessionBase';\nimport {KnownMediaStream, KnownMediaStreamKind, SessionClientRole, SessionClientType} from '../MediaConstants';\nimport {\n ISessionStreamsManager,\n MediaSessionConfiguration,\n MediaSessionParams,\n RemoteMediaTrack\n} from '../MediaContracts';\n\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {Nullable} from '@techsee/techsee-common';\n\nexport interface IMediaSessionPeer {\n peerId: string;\n peerType: SessionClientType;\n peerRole: SessionClientRole;\n remoteMediaTracks: RemoteMediaTrack[];\n connectionTimoutPrt: any;\n}\n\ndeclare global {\n interface RTCPeerConnection extends IMediaSessionPeer {\n\n }\n}\n\nconst trace = getMediaTracer('MediaSessionBase');\n\nexport abstract class MediaSessionBase<PeerType extends IMediaSessionPeer> {\n protected readonly _peerConnections: Map<string, PeerType> = new Map();\n protected readonly _sessionStreamsManager: ISessionStreamsManager;\n protected readonly _sessionParams: MediaSessionParams & MediaSessionConfiguration;\n\n protected constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration, streamFactory: ISessionStreamsManager) {\n this._sessionParams = sessionParams;\n this._sessionStreamsManager = streamFactory;\n\n this._peerConnections = new Map();\n }\n\n protected addRemoteTrackToPeer(sourcePeerConnection: IMediaSessionPeer, mediaTrack: MediaStreamTrack) {\n if (mediaTrack.kind === KnownMediaStreamKind.Video &&\n sourcePeerConnection.peerRole === SessionClientRole.AGENT) {\n //Currently We don't support video streams from Agent side\n return;\n }\n\n let trackType: Nullable<KnownMediaStream> = null;\n\n if (mediaTrack.kind.toLowerCase() === KnownMediaStreamKind.Audio) {\n trackType = sourcePeerConnection.peerRole === SessionClientRole.AGENT\n ? KnownMediaStream.AGENT_AUDIO_STREAM : KnownMediaStream.USER_AUDIO_STREAM;\n\n } else {\n trackType = KnownMediaStream.USER_VIDEO_STREAM;\n }\n\n const remoteMediaTrack: RemoteMediaTrack = {mediaTrack, trackType, isRegistered: false};\n\n sourcePeerConnection.remoteMediaTracks.push(remoteMediaTrack);\n }\n\n protected registerPeersRemoteTracks(sourcePeerConnection: IMediaSessionPeer) {\n trace.info('registerPeersRemoteTracks', sourcePeerConnection && sourcePeerConnection.remoteMediaTracks);\n sourcePeerConnection.remoteMediaTracks.forEach((remoteMediaTrack: RemoteMediaTrack) => {\n if (!remoteMediaTrack.isRegistered) {\n trace.info('call addRemoteMediaTrack with the remote media track', remoteMediaTrack);\n this._sessionStreamsManager.addRemoteMediaTrack(remoteMediaTrack)\n .then(() => {\n remoteMediaTrack.isRegistered = true;\n })\n .catch((error: any) => {\n trace.warn('Error adding remote media track to available streams', error);\n });\n }\n });\n }\n\n protected unregisterPeersRemoteMediaTracks(peerConnection: PeerType): Promise<void> {\n const promises: Promise<any>[] = [];\n\n peerConnection.remoteMediaTracks.forEach((remoteMediaTrack) => {\n const removalPromise = this._sessionStreamsManager.removeMediaTrack(remoteMediaTrack.mediaTrack)\n .then(() => remoteMediaTrack.isRegistered = false)\n .catch(() => trace.warn('Error while removing remote media track', remoteMediaTrack));\n\n promises.push(removalPromise);\n });\n\n return Promise.all(promises).then(() => undefined);\n }\n\n protected getPeerConnectionByMediaTrack(mediaTrack: MediaStreamTrack): Nullable<PeerType> {\n let peerConnectionOfTrack: Nullable<PeerType> = null;\n\n this._peerConnections.forEach((peerConnection: PeerType) => {\n if (peerConnectionOfTrack !== null) {\n return;\n }\n\n const remoteTrack = peerConnection.remoteMediaTracks.filter((track) => track.mediaTrack.id === mediaTrack.id);\n\n if (remoteTrack.length === 1) {\n peerConnectionOfTrack = peerConnection;\n }\n });\n\n return peerConnectionOfTrack;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/MediaSession/MediaSessionBase.ts"],"names":[],"mappings":";AAAA,OAAO,EAAyC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EACH,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,mBAAmB,EAAE,GAAG,CAAC;CAC5B;AAED,oBAAY,eAAe;IACvB,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;CAChC;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,iBAAkB,SAAQ,iBAAiB;KAEpD;CACJ;AAID,8BAAsB,gBAAgB,CAAC,QAAQ,SAAS,iBAAiB;IACrE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,kBAAkB,GAAG,yBAAyB,CAAC;IAClF,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAE1C,SAAS,aAAa,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EAAE,aAAa,EAAE,sBAAsB;IAQ1H,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI/E,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI;IAMzD,SAAS,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,gBAAgB;IA+BpG,SAAS,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,iBAAiB;IAgB3E,SAAS,CAAC,gCAAgC,CAAC,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnF,SAAS,CAAC,6BAA6B,CAAC,UAAU,EAAE,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC;CAiB5F","file":"MediaSessionBase.d.ts","sourcesContent":["import {KnownMediaStream, KnownMediaStreamKind, SessionClientRole, SessionClientType} from '../MediaConstants';\nimport {\n ISessionStreamsManager,\n MediaSessionConfiguration,\n MediaSessionParams,\n RemoteMediaTrack\n} from '../MediaContracts';\n\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {Nullable} from '@techsee/techsee-common';\nimport {EventEmitter} from 'events';\n\nexport interface IMediaSessionPeer {\n peerId: string;\n peerType: SessionClientType;\n peerRole: SessionClientRole;\n remoteMediaTracks: RemoteMediaTrack[];\n connectionTimoutPrt: any;\n}\n\nexport enum recordingEvents {\n RECORD_STARTED = 'RECORD_STARTED',\n RECORD_STOPPED = 'RECORD_STOPPED',\n RECONNECTING = 'RECONNECTING'\n}\n\ndeclare global {\n interface RTCPeerConnection extends IMediaSessionPeer {\n\n }\n}\n\nconst trace = getMediaTracer('MediaSessionBase');\n\nexport abstract class MediaSessionBase<PeerType extends IMediaSessionPeer> {\n protected readonly _peerConnections: Map<string, PeerType>;\n protected readonly _sessionStreamsManager: ISessionStreamsManager;\n protected readonly _sessionParams: MediaSessionParams & MediaSessionConfiguration;\n protected readonly _emitter: EventEmitter;\n\n protected constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration, streamFactory: ISessionStreamsManager) {\n this._sessionParams = sessionParams;\n this._sessionStreamsManager = streamFactory;\n this._emitter = new EventEmitter();\n\n this._peerConnections = new Map();\n }\n\n registerEventCallback(event: string, callback: (eventArgs?: any) => void): void {\n this._emitter.on(event, callback);\n }\n\n protected emitEvent(event: string, eventArgs?: any): void {\n setTimeout(() => {\n this._emitter.emit(event, eventArgs);\n });\n }\n\n protected addRemoteTrackToPeer(sourcePeerConnection: IMediaSessionPeer, mediaTrack: MediaStreamTrack) {\n if (mediaTrack.kind === KnownMediaStreamKind.Video &&\n sourcePeerConnection.peerRole === SessionClientRole.AGENT) {\n //Currently We don't support video streams from Agent side\n return;\n }\n\n let trackType: Nullable<KnownMediaStream> = null;\n\n if (mediaTrack.kind.toLowerCase() === KnownMediaStreamKind.Audio) {\n switch (sourcePeerConnection.peerRole) {\n case SessionClientRole.AGENT:\n trackType = KnownMediaStream.AGENT_AUDIO_STREAM;\n break;\n case SessionClientRole.OBSERVER:\n trackType = KnownMediaStream.OBSERVER_AUDIO_STREAM;\n break;\n default:\n trackType = KnownMediaStream.USER_AUDIO_STREAM;\n break;\n }\n\n } else {\n trackType = KnownMediaStream.USER_VIDEO_STREAM;\n }\n\n const remoteMediaTrack: RemoteMediaTrack = {mediaTrack, trackType, isRegistered: false};\n\n sourcePeerConnection.remoteMediaTracks.push(remoteMediaTrack);\n }\n\n protected registerPeersRemoteTracks(sourcePeerConnection: IMediaSessionPeer) {\n trace.info('registerPeersRemoteTracks', sourcePeerConnection && sourcePeerConnection.remoteMediaTracks);\n sourcePeerConnection.remoteMediaTracks.forEach((remoteMediaTrack: RemoteMediaTrack) => {\n if (!remoteMediaTrack.isRegistered) {\n trace.info('call addRemoteMediaTrack with the remote media track', remoteMediaTrack);\n this._sessionStreamsManager.addRemoteMediaTrack(remoteMediaTrack)\n .then(() => {\n remoteMediaTrack.isRegistered = true;\n })\n .catch((error: any) => {\n trace.warn('Error adding remote media track to available streams', error);\n });\n }\n });\n }\n\n protected unregisterPeersRemoteMediaTracks(peerConnection: PeerType): Promise<void> {\n const promises: Promise<any>[] = [];\n\n peerConnection.remoteMediaTracks.forEach((remoteMediaTrack) => {\n const removalPromise = this._sessionStreamsManager.removeMediaTrack(remoteMediaTrack.mediaTrack)\n .then(() => remoteMediaTrack.isRegistered = false)\n .catch(() => trace.warn('Error while removing remote media track', remoteMediaTrack));\n\n promises.push(removalPromise);\n });\n\n return Promise.all(promises).then(() => undefined);\n }\n\n protected getPeerConnectionByMediaTrack(mediaTrack: MediaStreamTrack): Nullable<PeerType> {\n let peerConnectionOfTrack: Nullable<PeerType> = null;\n\n this._peerConnections.forEach((peerConnection: PeerType) => {\n if (peerConnectionOfTrack !== null) {\n return;\n }\n\n const remoteTrack = peerConnection.remoteMediaTracks.filter((track) => track.mediaTrack.id === mediaTrack.id);\n\n if (remoteTrack.length === 1) {\n peerConnectionOfTrack = peerConnection;\n }\n });\n\n return peerConnectionOfTrack;\n }\n}\n"]}
@@ -1,77 +1,139 @@
1
1
  "use strict";
2
2
 
3
- Object.defineProperty(exports, "__esModule", { value: true });
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MediaSessionBase = exports.recordingEvents = void 0;
7
+
4
8
  var MediaConstants_1 = require("../MediaConstants");
9
+
5
10
  var MediaTracer_1 = require("../MediaUtils/MediaTracer");
11
+
12
+ var events_1 = require("events");
13
+
14
+ var recordingEvents;
15
+
16
+ (function (recordingEvents) {
17
+ recordingEvents["RECORD_STARTED"] = "RECORD_STARTED";
18
+ recordingEvents["RECORD_STOPPED"] = "RECORD_STOPPED";
19
+ recordingEvents["RECONNECTING"] = "RECONNECTING";
20
+ })(recordingEvents = exports.recordingEvents || (exports.recordingEvents = {}));
21
+
6
22
  var trace = MediaTracer_1.getMediaTracer('MediaSessionBase');
7
- var MediaSessionBase = /** @class */function () {
8
- function MediaSessionBase(sessionParams, streamFactory) {
9
- this._peerConnections = new Map();
10
- this._sessionParams = sessionParams;
11
- this._sessionStreamsManager = streamFactory;
12
- this._peerConnections = new Map();
23
+
24
+ var MediaSessionBase =
25
+ /** @class */
26
+ function () {
27
+ function MediaSessionBase(sessionParams, streamFactory) {
28
+ this._sessionParams = sessionParams;
29
+ this._sessionStreamsManager = streamFactory;
30
+ this._emitter = new events_1.EventEmitter();
31
+ this._peerConnections = new Map();
32
+ }
33
+
34
+ MediaSessionBase.prototype.registerEventCallback = function (event, callback) {
35
+ this._emitter.on(event, callback);
36
+ };
37
+
38
+ MediaSessionBase.prototype.emitEvent = function (event, eventArgs) {
39
+ var _this = this;
40
+
41
+ setTimeout(function () {
42
+ _this._emitter.emit(event, eventArgs);
43
+ });
44
+ };
45
+
46
+ MediaSessionBase.prototype.addRemoteTrackToPeer = function (sourcePeerConnection, mediaTrack) {
47
+ if (mediaTrack.kind === MediaConstants_1.KnownMediaStreamKind.Video && sourcePeerConnection.peerRole === MediaConstants_1.SessionClientRole.AGENT) {
48
+ //Currently We don't support video streams from Agent side
49
+ return;
13
50
  }
14
- MediaSessionBase.prototype.addRemoteTrackToPeer = function (sourcePeerConnection, mediaTrack) {
15
- if (mediaTrack.kind === MediaConstants_1.KnownMediaStreamKind.Video && sourcePeerConnection.peerRole === MediaConstants_1.SessionClientRole.AGENT) {
16
- //Currently We don't support video streams from Agent side
17
- return;
18
- }
19
- var trackType = null;
20
- if (mediaTrack.kind.toLowerCase() === MediaConstants_1.KnownMediaStreamKind.Audio) {
21
- trackType = sourcePeerConnection.peerRole === MediaConstants_1.SessionClientRole.AGENT ? MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM : MediaConstants_1.KnownMediaStream.USER_AUDIO_STREAM;
22
- } else {
23
- trackType = MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM;
24
- }
25
- var remoteMediaTrack = { mediaTrack: mediaTrack, trackType: trackType, isRegistered: false };
26
- sourcePeerConnection.remoteMediaTracks.push(remoteMediaTrack);
27
- };
28
- MediaSessionBase.prototype.registerPeersRemoteTracks = function (sourcePeerConnection) {
29
- var _this = this;
30
- trace.info('registerPeersRemoteTracks', sourcePeerConnection && sourcePeerConnection.remoteMediaTracks);
31
- sourcePeerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {
32
- if (!remoteMediaTrack.isRegistered) {
33
- trace.info('call addRemoteMediaTrack with the remote media track', remoteMediaTrack);
34
- _this._sessionStreamsManager.addRemoteMediaTrack(remoteMediaTrack).then(function () {
35
- remoteMediaTrack.isRegistered = true;
36
- }).catch(function (error) {
37
- trace.warn('Error adding remote media track to available streams', error);
38
- });
39
- }
40
- });
41
- };
42
- MediaSessionBase.prototype.unregisterPeersRemoteMediaTracks = function (peerConnection) {
43
- var _this = this;
44
- var promises = [];
45
- peerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {
46
- var removalPromise = _this._sessionStreamsManager.removeMediaTrack(remoteMediaTrack.mediaTrack).then(function () {
47
- return remoteMediaTrack.isRegistered = false;
48
- }).catch(function () {
49
- return trace.warn('Error while removing remote media track', remoteMediaTrack);
50
- });
51
- promises.push(removalPromise);
52
- });
53
- return Promise.all(promises).then(function () {
54
- return undefined;
55
- });
51
+
52
+ var trackType = null;
53
+
54
+ if (mediaTrack.kind.toLowerCase() === MediaConstants_1.KnownMediaStreamKind.Audio) {
55
+ switch (sourcePeerConnection.peerRole) {
56
+ case MediaConstants_1.SessionClientRole.AGENT:
57
+ trackType = MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM;
58
+ break;
59
+
60
+ case MediaConstants_1.SessionClientRole.OBSERVER:
61
+ trackType = MediaConstants_1.KnownMediaStream.OBSERVER_AUDIO_STREAM;
62
+ break;
63
+
64
+ default:
65
+ trackType = MediaConstants_1.KnownMediaStream.USER_AUDIO_STREAM;
66
+ break;
67
+ }
68
+ } else {
69
+ trackType = MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM;
70
+ }
71
+
72
+ var remoteMediaTrack = {
73
+ mediaTrack: mediaTrack,
74
+ trackType: trackType,
75
+ isRegistered: false
56
76
  };
57
- MediaSessionBase.prototype.getPeerConnectionByMediaTrack = function (mediaTrack) {
58
- var peerConnectionOfTrack = null;
59
- this._peerConnections.forEach(function (peerConnection) {
60
- if (peerConnectionOfTrack !== null) {
61
- return;
62
- }
63
- var remoteTrack = peerConnection.remoteMediaTracks.filter(function (track) {
64
- return track.mediaTrack.id === mediaTrack.id;
65
- });
66
- if (remoteTrack.length === 1) {
67
- peerConnectionOfTrack = peerConnection;
68
- }
77
+ sourcePeerConnection.remoteMediaTracks.push(remoteMediaTrack);
78
+ };
79
+
80
+ MediaSessionBase.prototype.registerPeersRemoteTracks = function (sourcePeerConnection) {
81
+ var _this = this;
82
+
83
+ trace.info('registerPeersRemoteTracks', sourcePeerConnection && sourcePeerConnection.remoteMediaTracks);
84
+ sourcePeerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {
85
+ if (!remoteMediaTrack.isRegistered) {
86
+ trace.info('call addRemoteMediaTrack with the remote media track', remoteMediaTrack);
87
+
88
+ _this._sessionStreamsManager.addRemoteMediaTrack(remoteMediaTrack).then(function () {
89
+ remoteMediaTrack.isRegistered = true;
90
+ })["catch"](function (error) {
91
+ trace.warn('Error adding remote media track to available streams', error);
69
92
  });
70
- return peerConnectionOfTrack;
71
- };
72
- return MediaSessionBase;
93
+ }
94
+ });
95
+ };
96
+
97
+ MediaSessionBase.prototype.unregisterPeersRemoteMediaTracks = function (peerConnection) {
98
+ var _this = this;
99
+
100
+ var promises = [];
101
+ peerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {
102
+ var removalPromise = _this._sessionStreamsManager.removeMediaTrack(remoteMediaTrack.mediaTrack).then(function () {
103
+ return remoteMediaTrack.isRegistered = false;
104
+ })["catch"](function () {
105
+ return trace.warn('Error while removing remote media track', remoteMediaTrack);
106
+ });
107
+
108
+ promises.push(removalPromise);
109
+ });
110
+ return Promise.all(promises).then(function () {
111
+ return undefined;
112
+ });
113
+ };
114
+
115
+ MediaSessionBase.prototype.getPeerConnectionByMediaTrack = function (mediaTrack) {
116
+ var peerConnectionOfTrack = null;
117
+
118
+ this._peerConnections.forEach(function (peerConnection) {
119
+ if (peerConnectionOfTrack !== null) {
120
+ return;
121
+ }
122
+
123
+ var remoteTrack = peerConnection.remoteMediaTracks.filter(function (track) {
124
+ return track.mediaTrack.id === mediaTrack.id;
125
+ });
126
+
127
+ if (remoteTrack.length === 1) {
128
+ peerConnectionOfTrack = peerConnection;
129
+ }
130
+ });
131
+
132
+ return peerConnectionOfTrack;
133
+ };
134
+
135
+ return MediaSessionBase;
73
136
  }();
74
- exports.MediaSessionBase = MediaSessionBase;
75
137
 
76
- //# sourceMappingURL=MediaSessionBase.js.map
138
+ exports.MediaSessionBase = MediaSessionBase;
77
139
  //# sourceMappingURL=MediaSessionBase.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["MediaSession/MediaSessionBase.js"],"names":["Object","defineProperty","exports","value","MediaConstants_1","require","MediaTracer_1","trace","getMediaTracer","MediaSessionBase","sessionParams","streamFactory","_peerConnections","Map","_sessionParams","_sessionStreamsManager","prototype","addRemoteTrackToPeer","sourcePeerConnection","mediaTrack","kind","KnownMediaStreamKind","Video","peerRole","SessionClientRole","AGENT","trackType","toLowerCase","Audio","KnownMediaStream","AGENT_AUDIO_STREAM","USER_AUDIO_STREAM","USER_VIDEO_STREAM","remoteMediaTrack","isRegistered","remoteMediaTracks","push","registerPeersRemoteTracks","_this","info","forEach","addRemoteMediaTrack","then","catch","error","warn","unregisterPeersRemoteMediaTracks","peerConnection","promises","removalPromise","removeMediaTrack","Promise","all","undefined","getPeerConnectionByMediaTrack","peerConnectionOfTrack","remoteTrack","filter","track","id","length"],"mappings":"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","file":"MediaSessionBase.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar trace = MediaTracer_1.getMediaTracer('MediaSessionBase');\nvar MediaSessionBase = /** @class */ (function () {\n function MediaSessionBase(sessionParams, streamFactory) {\n this._peerConnections = new Map();\n this._sessionParams = sessionParams;\n this._sessionStreamsManager = streamFactory;\n this._peerConnections = new Map();\n }\n MediaSessionBase.prototype.addRemoteTrackToPeer = function (sourcePeerConnection, mediaTrack) {\n if (mediaTrack.kind === MediaConstants_1.KnownMediaStreamKind.Video &&\n sourcePeerConnection.peerRole === MediaConstants_1.SessionClientRole.AGENT) {\n //Currently We don't support video streams from Agent side\n return;\n }\n var trackType = null;\n if (mediaTrack.kind.toLowerCase() === MediaConstants_1.KnownMediaStreamKind.Audio) {\n trackType = sourcePeerConnection.peerRole === MediaConstants_1.SessionClientRole.AGENT\n ? MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM : MediaConstants_1.KnownMediaStream.USER_AUDIO_STREAM;\n }\n else {\n trackType = MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM;\n }\n var remoteMediaTrack = { mediaTrack: mediaTrack, trackType: trackType, isRegistered: false };\n sourcePeerConnection.remoteMediaTracks.push(remoteMediaTrack);\n };\n MediaSessionBase.prototype.registerPeersRemoteTracks = function (sourcePeerConnection) {\n var _this = this;\n trace.info('registerPeersRemoteTracks', sourcePeerConnection && sourcePeerConnection.remoteMediaTracks);\n sourcePeerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {\n if (!remoteMediaTrack.isRegistered) {\n trace.info('call addRemoteMediaTrack with the remote media track', remoteMediaTrack);\n _this._sessionStreamsManager.addRemoteMediaTrack(remoteMediaTrack)\n .then(function () {\n remoteMediaTrack.isRegistered = true;\n })\n .catch(function (error) {\n trace.warn('Error adding remote media track to available streams', error);\n });\n }\n });\n };\n MediaSessionBase.prototype.unregisterPeersRemoteMediaTracks = function (peerConnection) {\n var _this = this;\n var promises = [];\n peerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {\n var removalPromise = _this._sessionStreamsManager.removeMediaTrack(remoteMediaTrack.mediaTrack)\n .then(function () { return remoteMediaTrack.isRegistered = false; })\n .catch(function () { return trace.warn('Error while removing remote media track', remoteMediaTrack); });\n promises.push(removalPromise);\n });\n return Promise.all(promises).then(function () { return undefined; });\n };\n MediaSessionBase.prototype.getPeerConnectionByMediaTrack = function (mediaTrack) {\n var peerConnectionOfTrack = null;\n this._peerConnections.forEach(function (peerConnection) {\n if (peerConnectionOfTrack !== null) {\n return;\n }\n var remoteTrack = peerConnection.remoteMediaTracks.filter(function (track) { return track.mediaTrack.id === mediaTrack.id; });\n if (remoteTrack.length === 1) {\n peerConnectionOfTrack = peerConnection;\n }\n });\n return peerConnectionOfTrack;\n };\n return MediaSessionBase;\n}());\nexports.MediaSessionBase = MediaSessionBase;\n\n//# sourceMappingURL=MediaSessionBase.js.map\n"]}
1
+ {"version":3,"sources":["MediaSession/MediaSessionBase.js"],"names":["Object","defineProperty","exports","value","MediaSessionBase","recordingEvents","MediaConstants_1","require","MediaTracer_1","events_1","trace","getMediaTracer","sessionParams","streamFactory","_sessionParams","_sessionStreamsManager","_emitter","EventEmitter","_peerConnections","Map","prototype","registerEventCallback","event","callback","on","emitEvent","eventArgs","_this","setTimeout","emit","addRemoteTrackToPeer","sourcePeerConnection","mediaTrack","kind","KnownMediaStreamKind","Video","peerRole","SessionClientRole","AGENT","trackType","toLowerCase","Audio","KnownMediaStream","AGENT_AUDIO_STREAM","OBSERVER","OBSERVER_AUDIO_STREAM","USER_AUDIO_STREAM","USER_VIDEO_STREAM","remoteMediaTrack","isRegistered","remoteMediaTracks","push","registerPeersRemoteTracks","info","forEach","addRemoteMediaTrack","then","error","warn","unregisterPeersRemoteMediaTracks","peerConnection","promises","removalPromise","removeMediaTrack","Promise","all","undefined","getPeerConnectionByMediaTrack","peerConnectionOfTrack","remoteTrack","filter","track","id","length"],"mappings":"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","file":"MediaSessionBase.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MediaSessionBase = exports.recordingEvents = void 0;\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar events_1 = require(\"events\");\nvar recordingEvents;\n(function (recordingEvents) {\n recordingEvents[\"RECORD_STARTED\"] = \"RECORD_STARTED\";\n recordingEvents[\"RECORD_STOPPED\"] = \"RECORD_STOPPED\";\n recordingEvents[\"RECONNECTING\"] = \"RECONNECTING\";\n})(recordingEvents = exports.recordingEvents || (exports.recordingEvents = {}));\nvar trace = MediaTracer_1.getMediaTracer('MediaSessionBase');\nvar MediaSessionBase = /** @class */ (function () {\n function MediaSessionBase(sessionParams, streamFactory) {\n this._sessionParams = sessionParams;\n this._sessionStreamsManager = streamFactory;\n this._emitter = new events_1.EventEmitter();\n this._peerConnections = new Map();\n }\n MediaSessionBase.prototype.registerEventCallback = function (event, callback) {\n this._emitter.on(event, callback);\n };\n MediaSessionBase.prototype.emitEvent = function (event, eventArgs) {\n var _this = this;\n setTimeout(function () {\n _this._emitter.emit(event, eventArgs);\n });\n };\n MediaSessionBase.prototype.addRemoteTrackToPeer = function (sourcePeerConnection, mediaTrack) {\n if (mediaTrack.kind === MediaConstants_1.KnownMediaStreamKind.Video &&\n sourcePeerConnection.peerRole === MediaConstants_1.SessionClientRole.AGENT) {\n //Currently We don't support video streams from Agent side\n return;\n }\n var trackType = null;\n if (mediaTrack.kind.toLowerCase() === MediaConstants_1.KnownMediaStreamKind.Audio) {\n switch (sourcePeerConnection.peerRole) {\n case MediaConstants_1.SessionClientRole.AGENT:\n trackType = MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM;\n break;\n case MediaConstants_1.SessionClientRole.OBSERVER:\n trackType = MediaConstants_1.KnownMediaStream.OBSERVER_AUDIO_STREAM;\n break;\n default:\n trackType = MediaConstants_1.KnownMediaStream.USER_AUDIO_STREAM;\n break;\n }\n }\n else {\n trackType = MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM;\n }\n var remoteMediaTrack = { mediaTrack: mediaTrack, trackType: trackType, isRegistered: false };\n sourcePeerConnection.remoteMediaTracks.push(remoteMediaTrack);\n };\n MediaSessionBase.prototype.registerPeersRemoteTracks = function (sourcePeerConnection) {\n var _this = this;\n trace.info('registerPeersRemoteTracks', sourcePeerConnection && sourcePeerConnection.remoteMediaTracks);\n sourcePeerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {\n if (!remoteMediaTrack.isRegistered) {\n trace.info('call addRemoteMediaTrack with the remote media track', remoteMediaTrack);\n _this._sessionStreamsManager.addRemoteMediaTrack(remoteMediaTrack)\n .then(function () {\n remoteMediaTrack.isRegistered = true;\n })\n .catch(function (error) {\n trace.warn('Error adding remote media track to available streams', error);\n });\n }\n });\n };\n MediaSessionBase.prototype.unregisterPeersRemoteMediaTracks = function (peerConnection) {\n var _this = this;\n var promises = [];\n peerConnection.remoteMediaTracks.forEach(function (remoteMediaTrack) {\n var removalPromise = _this._sessionStreamsManager.removeMediaTrack(remoteMediaTrack.mediaTrack)\n .then(function () { return remoteMediaTrack.isRegistered = false; })\n .catch(function () { return trace.warn('Error while removing remote media track', remoteMediaTrack); });\n promises.push(removalPromise);\n });\n return Promise.all(promises).then(function () { return undefined; });\n };\n MediaSessionBase.prototype.getPeerConnectionByMediaTrack = function (mediaTrack) {\n var peerConnectionOfTrack = null;\n this._peerConnections.forEach(function (peerConnection) {\n if (peerConnectionOfTrack !== null) {\n return;\n }\n var remoteTrack = peerConnection.remoteMediaTracks.filter(function (track) { return track.mediaTrack.id === mediaTrack.id; });\n if (remoteTrack.length === 1) {\n peerConnectionOfTrack = peerConnection;\n }\n });\n return peerConnectionOfTrack;\n };\n return MediaSessionBase;\n}());\nexports.MediaSessionBase = MediaSessionBase;\n\n//# sourceMappingURL=MediaSessionBase.js.map\n"]}
@@ -7,31 +7,34 @@ declare global {
7
7
  OT: any;
8
8
  }
9
9
  }
10
- declare type OTPublisher = any;
11
- declare type OTSubscriber = any;
12
10
  interface OTConnection {
13
11
  connectionId: string;
14
12
  }
13
+ declare type OTPublisher = any;
14
+ declare type OTSubscriber = any;
15
+ interface OTStreamSource {
16
+ videoSource: any;
17
+ audioSource: any;
18
+ }
15
19
  interface OTPeerConnection extends IMediaSessionPeer {
16
20
  localStream: Nullable<OTStreamSource>;
17
21
  connection: OTConnection;
18
22
  publisher: Nullable<OTPublisher>;
19
23
  subscriber: Nullable<OTSubscriber>;
20
24
  }
21
- interface OTStreamSource {
22
- videoSource: any;
23
- audioSource: any;
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
- readonly id: string;
29
- private readonly ownPeerId;
29
+ get id(): string;
30
+ private get ownPeerId();
30
31
  constructor(sessionParams: MediaSessionParams & MediaSessionConfiguration, streamFactory: ISessionStreamsManager);
32
+ sessionDisconnect(): void;
31
33
  connect(): Promise<void>;
32
34
  disconnect(): Promise<void>;
33
35
  onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void>;
34
36
  onMediaStreamRenewed(clientRole: SessionClientRole, mediaStream: MediaStream): Promise<void>;
37
+ replaceStreamTracks(mediaStream: Nullable<MediaStream>): Promise<void>;
35
38
  getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats>;
36
39
  private connectionCreatedHandler;
37
40
  private connectionDestroyedHandler;
@@ -43,7 +46,6 @@ export declare class OpentokSession extends MediaSessionBase<OTPeerConnection> i
43
46
  private destroyPublisherOnPeerConnection;
44
47
  private createMediaSubscriber;
45
48
  private destroySubscriberOnPeerConnection;
46
- private calculateDestinationRole;
47
49
  private sessionExistsGuard;
48
50
  }
49
51
  export {};
@@ -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,EAAmB,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAEzF,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,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,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuB5E,OAAO,CAAC,wBAAwB;IA2EhC,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,oBAAoB;IAyC5B,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,oBAAoB;IAgC5B,OAAO,CAAC,gCAAgC;IAexC,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,iCAAiC;IAczC,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, 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 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 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 = this.calculateDestinationRole();\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 const streamName = destinationRole === SessionClientRole.USER\n ? KnownMediaStream.AGENT_AUDIO_STREAM : KnownMediaStream.USER_VIDEO_STREAM;\n\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) {\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((subcriber: OTSubscriber) => {\n peerConnection.subscriber = subcriber;\n peerConnection.subscriber.on('videoElementCreated', (args: any) => {\n const {element} = args;\n const otMediaStream: MediaStream = element.srcObject;\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 }\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 name: streamName\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 event.element.muted = true;\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\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,EAAkB,MAAM,oBAAoB,CAAC;AAKxF,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,EAAE,EAAE,GAAG,CAAC;KACX;CACJ;AAED,UAAU,YAAY;IAClB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,aAAK,WAAW,GAAG,GAAG,CAAA;AAEtB,aAAK,YAAY,GAAG,GAAG,CAAA;AA+BvB,UAAU,cAAc;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC;CACpB;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;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;IAE9C,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,OAAO,KAAK,SAAS,GAEpB;gBAEW,aAAa,EAAE,kBAAkB,GAAG,yBAAyB,EAAE,aAAa,EAAE,sBAAsB;IAkBhH,iBAAiB,IAAI,IAAI;IAMzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B,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;IA0B5E,OAAO,CAAC,wBAAwB;IA+EhC,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,yBAAyB;IA8BjC,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,gCAAgC;IAexC,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,iCAAiC;IAsBzC,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, recordingEvents} 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 OTConnection {\n connectionId: string;\n}\n\ntype OTPublisher = any\n\ntype OTSubscriber = any\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\ninterface OTStreamSource {\n videoSource: any;\n audioSource: any;\n}\n\ninterface OTPeerConnection extends IMediaSessionPeer {\n localStream: Nullable<OTStreamSource>;\n connection: OTConnection;\n publisher: Nullable<OTPublisher>;\n subscriber: Nullable<OTSubscriber>;\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\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 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 this._session!.on('archiveStarted', (event: any) => {\n trace.info('archiveStarted event', event);\n this.emitEvent(recordingEvents.RECORD_STARTED, event);\n });\n\n this._session!.on('archiveStopped', (event: any) => {\n trace.info('archiveStopped event', event);\n this.emitEvent(recordingEvents.RECORD_STOPPED, event);\n });\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\n trace.info('Disconnection from session completed');\n\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 return;\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\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, connection.connectionId === this.ownPeerId)\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 /*\n When publisher connect after others participants,\n make sure the publisher will not loose their stream to subscribe\n */\n return this._lastStreamEvents.reduce((promiseChain: any, streamEvent: any) => promiseChain\n .then(() => this.streamCreatedHandler(streamEvent)), Promise.resolve())\n .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\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)\n .catch(() => trace.warn('Error destroying subscriber on stream destroy'));\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)\n .catch(() => trace.warn('Error destroying publisher on peer destroy'));\n this.destroySubscriberOnPeerConnection(peerConnection)\n .catch(() => trace.warn('Error destroying subscriber on peer destroy'));\n }\n\n //#endregion\n\n //#region Publisher\n\n private createStreamForPublishing(destinationRole: SessionClientRole, shouldCreateStream: boolean): Promise<OTStreamSource> {\n trace.info('createStreamForPublishing');\n const stream: OTStreamSource = {videoSource: null, audioSource: null};\n\n if (!shouldCreateStream) {\n trace.info(`createStreamForPublishing - destinationRole: ${destinationRole} not supposed to create a stream`);\n\n return Promise.resolve(stream);\n }\n\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then((mediaStream: Nullable<MediaStream>) => {\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 insertDefaultUI: 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 event.element.muted = true;\n });\n otPublisher.on('streamCreated', (event: any) => {\n trace.info('publisher stream created', event, otPublisher.stream.hasAudio);\n });\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, {insertDefaultUI: false}, (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 const {element} = event;\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 peerConnection.subscriber = null;\n\n return Promise.resolve();\n\n /**\n REMARK- opentok provide the same media track id for all participates.\n when we unregister the media track we check by the id which is the same for all.\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\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"]}