@techsee/techsee-media-service 0.6.1-alpha.9 → 0.7.0

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.
@@ -26,9 +26,9 @@ var MediaSessionBase_1 = require("./MediaSessionBase");
26
26
  var MediaTracer_1 = require("../MediaUtils/MediaTracer");
27
27
  var trace = MediaTracer_1.getMediaTracer('OpentokSessionV3');
28
28
  //Currently this version supports subscribing only. Publishing will be implemented as needed.
29
- var OpentokSessionV3 = /** @class */function (_super) {
30
- __extends(OpentokSessionV3, _super);
31
- function OpentokSessionV3(sessionParams, streamFactory) {
29
+ var OpentokSession = /** @class */function (_super) {
30
+ __extends(OpentokSession, _super);
31
+ function OpentokSession(sessionParams, streamFactory) {
32
32
  var _this = _super.call(this, sessionParams, streamFactory) || this;
33
33
  _this._session = null;
34
34
  _this._credentials = sessionParams.credentials;
@@ -44,21 +44,21 @@ var OpentokSessionV3 = /** @class */function (_super) {
44
44
  _this.streamDestroyedHandler = _this.streamDestroyedHandler.bind(_this);
45
45
  return _this;
46
46
  }
47
- Object.defineProperty(OpentokSessionV3.prototype, "id", {
47
+ Object.defineProperty(OpentokSession.prototype, "id", {
48
48
  get: function get() {
49
49
  return this._session && this._session.sessionId ? this._session.sessionId : '';
50
50
  },
51
51
  enumerable: true,
52
52
  configurable: true
53
53
  });
54
- Object.defineProperty(OpentokSessionV3.prototype, "ownPeerId", {
54
+ Object.defineProperty(OpentokSession.prototype, "ownPeerId", {
55
55
  get: function get() {
56
56
  return this._session && this._session.connection ? this._session.connection.connectionId : '';
57
57
  },
58
58
  enumerable: true,
59
59
  configurable: true
60
60
  });
61
- OpentokSessionV3.prototype.connect = function () {
61
+ OpentokSession.prototype.connect = function () {
62
62
  var _this = this;
63
63
  trace.info('Connect to session', this._credentials);
64
64
  if (this._session) {
@@ -90,7 +90,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
90
90
  _this._session.connect(_this._credentials.token, connectHandler);
91
91
  });
92
92
  };
93
- OpentokSessionV3.prototype.disconnect = function () {
93
+ OpentokSession.prototype.disconnect = function () {
94
94
  var _this = this;
95
95
  return new Promise(function (resolve) {
96
96
  trace.info('Disconnecting from session');
@@ -109,7 +109,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
109
109
  resolve();
110
110
  });
111
111
  };
112
- OpentokSessionV3.prototype.onMediaStreamDestroyed = function (clientRole) {
112
+ OpentokSession.prototype.onMediaStreamDestroyed = function (clientRole) {
113
113
  var _this = this;
114
114
  var promises = [];
115
115
  this._peerConnections.forEach(function (peerConnection) {
@@ -121,11 +121,11 @@ var OpentokSessionV3 = /** @class */function (_super) {
121
121
  return undefined;
122
122
  });
123
123
  };
124
- OpentokSessionV3.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
124
+ OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
125
125
  //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)
126
126
  return Promise.resolve();
127
127
  };
128
- OpentokSessionV3.prototype.getRemoteTrackStats = function (mediaTrack) {
128
+ OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {
129
129
  var _this = this;
130
130
  return new Promise(function (resolve, reject) {
131
131
  var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);
@@ -144,7 +144,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
144
144
  });
145
145
  };
146
146
  //#region OpenTok Events Handlers
147
- OpentokSessionV3.prototype.connectionCreatedHandler = function (event) {
147
+ OpentokSession.prototype.connectionCreatedHandler = function (event) {
148
148
  var _this = this;
149
149
  trace.info('connectionCreatedHandler', event);
150
150
  var connection = event.connection;
@@ -198,7 +198,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
198
198
  trace.error('Error handling new peer connection', error);
199
199
  });
200
200
  };
201
- OpentokSessionV3.prototype.connectionDestroyedHandler = function (event) {
201
+ OpentokSession.prototype.connectionDestroyedHandler = function (event) {
202
202
  trace.info('connectionDestroyedHandler', event);
203
203
  var connection = event.connection;
204
204
  if (!this.sessionExistsGuard(false) || !connection) {
@@ -208,7 +208,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
208
208
  this.destroyPeerConnection(this._peerConnections.get(connection.connectionId));
209
209
  }
210
210
  };
211
- OpentokSessionV3.prototype.streamCreatedHandler = function (event) {
211
+ OpentokSession.prototype.streamCreatedHandler = function (event) {
212
212
  var _this = this;
213
213
  trace.info('streamCreatedHandler', event.stream);
214
214
  var stream = event.stream;
@@ -238,7 +238,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
238
238
  });
239
239
  });
240
240
  };
241
- OpentokSessionV3.prototype.streamDestroyedHandler = function (event) {
241
+ OpentokSession.prototype.streamDestroyedHandler = function (event) {
242
242
  trace.info('streamDestroyedHandler', event);
243
243
  var stream = event.stream;
244
244
  if (!this.sessionExistsGuard(false) || !stream) {
@@ -255,7 +255,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
255
255
  };
256
256
  //#endregion
257
257
  //#region PeerConnection
258
- OpentokSessionV3.prototype.destroyPeerConnection = function (peerConnection) {
258
+ OpentokSession.prototype.destroyPeerConnection = function (peerConnection) {
259
259
  this._peerConnections.delete(peerConnection.peerId);
260
260
  this.destroyPublisherOnPeerConnection(peerConnection).catch(function () {
261
261
  return undefined;
@@ -266,7 +266,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
266
266
  };
267
267
  //#endregion
268
268
  //#region Publisher
269
- OpentokSessionV3.prototype.createStreamForPublishing = function (destinationRole) {
269
+ OpentokSession.prototype.createStreamForPublishing = function (destinationRole) {
270
270
  var _this = this;
271
271
  trace.info('createStreamForPublishing');
272
272
  return this._sessionStreamsManager.getMediaStreamForRole(destinationRole).then(function (mediaStream) {
@@ -286,7 +286,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
286
286
  return stream;
287
287
  });
288
288
  };
289
- OpentokSessionV3.prototype.createMediaPublisher = function (stream, streamName) {
289
+ OpentokSession.prototype.createMediaPublisher = function (stream, streamName) {
290
290
  var otParams = {
291
291
  videoSource: stream.videoSource ? stream.videoSource : false,
292
292
  audioSource: stream.audioSource ? stream.audioSource : false,
@@ -315,7 +315,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
315
315
  });
316
316
  });
317
317
  };
318
- OpentokSessionV3.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {
318
+ OpentokSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {
319
319
  if (this.sessionExistsGuard(false) && peerConnection.publisher) {
320
320
  this._session.unpublish(peerConnection.publisher);
321
321
  }
@@ -325,7 +325,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
325
325
  };
326
326
  //#endregion
327
327
  //#region Subscriber
328
- OpentokSessionV3.prototype.createMediaSubscriber = function (remoteStream) {
328
+ OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {
329
329
  var _this = this;
330
330
  return new Promise(function (resolve, reject) {
331
331
  if (!_this.sessionExistsGuard(false)) {
@@ -346,7 +346,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
346
346
  });
347
347
  });
348
348
  };
349
- OpentokSessionV3.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {
349
+ OpentokSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {
350
350
  if (this.sessionExistsGuard(false) && peerConnection.subscriber) {
351
351
  this._session.unsubscribe(peerConnection.subscriber);
352
352
  }
@@ -357,23 +357,23 @@ var OpentokSessionV3 = /** @class */function (_super) {
357
357
  });
358
358
  };
359
359
  //#endregion
360
- OpentokSessionV3.prototype.calculateDestinationRole = function () {
360
+ OpentokSession.prototype.calculateDestinationRole = function () {
361
361
  if (this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {
362
362
  var isAgentConnected = false;
363
363
  return !isAgentConnected ? MediaConstants_1.SessionClientRole.AGENT : MediaConstants_1.SessionClientRole.OBSERVER;
364
364
  }
365
365
  return MediaConstants_1.SessionClientRole.USER;
366
366
  };
367
- OpentokSessionV3.prototype.sessionExistsGuard = function (shouldThrow) {
367
+ OpentokSession.prototype.sessionExistsGuard = function (shouldThrow) {
368
368
  if (shouldThrow === void 0) {
369
369
  shouldThrow = true;
370
370
  }
371
371
  var connected = !!(this._session && this._session.connection && this._session.connection.connectionId);
372
372
  return guards_1.throwableGuard(connected, 'There no active session', shouldThrow);
373
373
  };
374
- return OpentokSessionV3;
374
+ return OpentokSession;
375
375
  }(MediaSessionBase_1.MediaSessionBase);
376
- exports.OpentokSessionV3 = OpentokSessionV3;
376
+ exports.OpentokSession = OpentokSession;
377
377
 
378
- //# sourceMappingURL=SessionOpentok.v3.js.map
379
- //# sourceMappingURL=SessionOpentok.v3.js.map
378
+ //# sourceMappingURL=SessionOpentok.js.map
379
+ //# sourceMappingURL=SessionOpentok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["MediaSession/SessionOpentok.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","defineProperty","exports","value","MediaConstants_1","require","guards_1","MediaSessionBase_1","MediaTracer_1","trace","getMediaTracer","OpentokSession","_super","sessionParams","streamFactory","_this","call","_session","_credentials","credentials","connect","bind","disconnect","onMediaStreamDestroyed","onMediaStreamRenewed","createStreamForPublishing","createMediaPublisher","connectionCreatedHandler","connectionDestroyedHandler","streamCreatedHandler","streamDestroyedHandler","get","sessionId","enumerable","configurable","connection","connectionId","info","error","Promise","reject","resolve","handleError","off","_a","_sessionParams","apiKey","window","OTSESSION","OT","initSession","on","connectHandler","token","currentSession","_peerConnections","forEach","peerConnection","destroyPeerConnection","clientRole","promises","peerRole","push","destroyPublisherOnPeerConnection","all","then","undefined","mediaStream","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","subscriber","Error","getStats","stats","warn","trackId","id","trackStats","event","sessionExistsGuard","ownPeerId","destinationRole","calculateDestinationRole","streams","peerId","peerType","clientType","SessionClientType","INITIATOR","GUEST","publisher","remoteMediaTracks","localStream","videoSource","audioSource","streamName","SessionClientRole","USER","KnownMediaStream","AGENT_AUDIO_STREAM","USER_VIDEO_STREAM","set","publish","catch","has","stream","createMediaSubscriber","subcriber","args","element","otMediaStream","srcObject","getTracks","registerMediaTrackFromPeer","destroySubscriberOnPeerConnection","delete","_sessionStreamsManager","getMediaStreamForRole","track","kind","otParams","publishAudio","publishVideo","showControls","name","otPublisher","initPublisher","preventDefault","document","getElementById","style","display","muted","unpublish","remoteStream","subscribe","err","unsubscribe","unregisterPeersRemoteMediaTracks","isAgentConnected","AGENT","OBSERVER","shouldThrow","connected","throwableGuard","MediaSessionBase"],"mappings":"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","file":"SessionOpentok.js","sourcesContent":["\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar guards_1 = require(\"@techsee/techsee-common/lib/core/guards\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar trace = MediaTracer_1.getMediaTracer('OpentokSessionV3');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar OpentokSession = /** @class */ (function (_super) {\n __extends(OpentokSession, _super);\n function OpentokSession(sessionParams, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._session = null;\n _this._credentials = sessionParams.credentials;\n _this.connect = _this.connect.bind(_this);\n _this.disconnect = _this.disconnect.bind(_this);\n _this.onMediaStreamDestroyed = _this.onMediaStreamDestroyed.bind(_this);\n _this.onMediaStreamRenewed = _this.onMediaStreamRenewed.bind(_this);\n _this.createStreamForPublishing = _this.createStreamForPublishing.bind(_this);\n _this.createMediaPublisher = _this.createMediaPublisher.bind(_this);\n _this.connectionCreatedHandler = _this.connectionCreatedHandler.bind(_this);\n _this.connectionDestroyedHandler = _this.connectionDestroyedHandler.bind(_this);\n _this.streamCreatedHandler = _this.streamCreatedHandler.bind(_this);\n _this.streamDestroyedHandler = _this.streamDestroyedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(OpentokSession.prototype, \"id\", {\n get: function () {\n return this._session && this._session.sessionId ? this._session.sessionId : '';\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(OpentokSession.prototype, \"ownPeerId\", {\n get: function () {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n },\n enumerable: true,\n configurable: true\n });\n OpentokSession.prototype.connect = function () {\n var _this = this;\n trace.info('Connect to session', this._credentials);\n if (this._session) {\n trace.error('Session already exists');\n return Promise.reject('Cannot connect to session while another session is active');\n }\n return new Promise(function (resolve, reject) {\n var handleError = function (error) {\n _this._session && _this._session.off();\n _this._session = null;\n trace.error('handleConnect error:', error);\n reject(error);\n };\n var _a = _this._sessionParams.credentials, apiKey = _a.apiKey, sessionId = _a.sessionId;\n _this._session = window.OTSESSION = window.OT.initSession(apiKey, sessionId);\n _this._session.on('connectionCreated', _this.connectionCreatedHandler);\n _this._session.on('connectionDestroyed', _this.connectionDestroyedHandler);\n _this._session.on('streamCreated', _this.streamCreatedHandler);\n _this._session.on('streamDestroyed', _this.streamDestroyedHandler);\n var connectHandler = function (error) {\n if (error) {\n handleError(error);\n return;\n }\n resolve();\n };\n _this._session.connect(_this._credentials.token, connectHandler);\n });\n };\n OpentokSession.prototype.disconnect = function () {\n var _this = this;\n return new Promise(function (resolve) {\n trace.info('Disconnecting from session');\n var currentSession = _this._session;\n _this._session = null;\n _this._peerConnections.forEach(function (peerConnection) {\n _this.destroyPeerConnection(peerConnection);\n });\n if (!currentSession) {\n trace.info('No active session - resolving');\n resolve();\n return;\n }\n currentSession.off();\n currentSession.disconnect();\n resolve();\n });\n };\n OpentokSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n var promises = [];\n this._peerConnections.forEach(function (peerConnection) {\n if (peerConnection.peerRole === clientRole) {\n promises.push(_this.destroyPublisherOnPeerConnection(peerConnection));\n }\n });\n return Promise.all(promises).then(function () { return undefined; });\n };\n OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)\n return Promise.resolve();\n };\n OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);\n if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {\n reject(new Error('Cannot find peer or subscriber for getting stats'));\n }\n //https://tokbox.com/developer/sdks/js/reference/Subscriber.html#getStats\n peerConnectionOfTrack.subscriber.getStats(function (error, stats) {\n if (error) {\n trace.warn('Error getting stats', error);\n resolve({ trackId: mediaTrack.id, trackStats: {} });\n return;\n }\n resolve({ trackId: mediaTrack.id, trackStats: stats });\n });\n });\n };\n //#region OpenTok Events Handlers\n OpentokSession.prototype.connectionCreatedHandler = function (event) {\n var _this = this;\n trace.info('connectionCreatedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n //In case we got our own connection, we have nothing to do with it\n if (connection.connectionId === this.ownPeerId) {\n return;\n }\n var destinationRole = this.calculateDestinationRole();\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 };\n if (!streams.videoSource && !streams.audioSource) {\n trace.info('Peer connection without publisher was created', peerConnection);\n return peerConnection;\n }\n var streamName = destinationRole === MediaConstants_1.SessionClientRole.USER\n ? MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM : MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM;\n return _this.createMediaPublisher(streams, streamName)\n .then(function (publisher) {\n peerConnection.publisher = publisher;\n trace.info('Peer connection with publisher was created', peerConnection);\n return peerConnection;\n });\n })\n .then(function (peerConnection) {\n _this._peerConnections.set(peerConnection.peerId, peerConnection);\n if (peerConnection.publisher) {\n return new Promise(function (resolve, reject) {\n trace.info('Starting publish to peerConnection.publisher');\n _this._session.publish(peerConnection.publisher, function (error) {\n if (error) {\n trace.error('Publish to peerConnection error', error);\n return reject(error);\n }\n trace.info('Publish to peerConnection success');\n return resolve();\n });\n });\n }\n return Promise.resolve();\n })\n .catch(function (error) {\n //Need to handle fail cases during reliability\n trace.error('Error handling new peer connection', error);\n });\n };\n OpentokSession.prototype.connectionDestroyedHandler = function (event) {\n trace.info('connectionDestroyedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n if (this._peerConnections.has(connection.connectionId)) {\n this.destroyPeerConnection(this._peerConnections.get(connection.connectionId));\n }\n };\n OpentokSession.prototype.streamCreatedHandler = function (event) {\n var _this = this;\n trace.info('streamCreatedHandler', event.stream);\n var stream = event.stream;\n var connection = (stream || { connection: null }).connection;\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist on this stage');\n return;\n }\n var peerConnection = this._peerConnections.get(connection.connectionId);\n trace.info('Subscribing the stream');\n this.createMediaSubscriber(stream).then(function (subcriber) {\n peerConnection.subscriber = subcriber;\n peerConnection.subscriber.on('videoElementCreated', function (args) {\n var element = args.element;\n var otMediaStream = element.srcObject;\n if (!otMediaStream) {\n trace.warn('MediaStream not found in OT video element');\n return;\n }\n trace.info('Registering remote media tracks', peerConnection.subscriber, otMediaStream);\n otMediaStream.getTracks().forEach(function (mediaTrack) {\n _this.registerMediaTrackFromPeer(peerConnection, mediaTrack);\n });\n });\n });\n };\n OpentokSession.prototype.streamDestroyedHandler = function (event) {\n trace.info('streamDestroyedHandler', event);\n var stream = event.stream;\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n var peerConnection = this._peerConnections.get(stream.connection.connectionId);\n if (!peerConnection) {\n trace.warn('Peer connection for remote stream not found');\n return;\n }\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region PeerConnection\n OpentokSession.prototype.destroyPeerConnection = function (peerConnection) {\n this._peerConnections.delete(peerConnection.peerId);\n this.destroyPublisherOnPeerConnection(peerConnection).catch(function () { return undefined; });\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region Publisher\n OpentokSession.prototype.createStreamForPublishing = function (destinationRole) {\n var _this = this;\n trace.info('createStreamForPublishing');\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then(function (mediaStream) {\n var stream = { videoSource: null, audioSource: null };\n if (mediaStream) {\n trace.info('Media stream found for publishing', mediaStream);\n mediaStream.getTracks().forEach(function (track) {\n if (track.kind === 'video') {\n stream.videoSource = track;\n }\n else if (track.kind === 'audio') {\n stream.audioSource = track;\n }\n });\n }\n else if (_this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n trace.warn('No local media was found for publishing to destinationRole:', destinationRole);\n }\n return stream;\n });\n };\n OpentokSession.prototype.createMediaPublisher = function (stream, streamName) {\n var otParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource,\n showControls: false,\n name: streamName\n };\n return new Promise(function (resolve, reject) {\n var otPublisher = window.OT.initPublisher(undefined, otParams, function (error) {\n if (error) {\n reject(error);\n return;\n }\n otPublisher.on('streamDestroyed', function (event) {\n trace.info('Publisher stream destroyed', event);\n //We preventing the default, in order to prevent stop the stream by OT.\n //We managing streams by ourselves and if we allow OT to close the stream, it cannot be reused.\n event.preventDefault();\n });\n otPublisher.on('videoElementCreated', function (event) {\n document.getElementById(otPublisher.id).style.display = 'none';\n event.element.muted = true;\n });\n resolve(otPublisher);\n });\n });\n };\n OpentokSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n this._session.unpublish(peerConnection.publisher);\n }\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n return Promise.resolve();\n };\n //#endregion\n //#region Subscriber\n OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (!_this.sessionExistsGuard(false)) {\n reject('Session not exists');\n return;\n }\n var subscriber = _this._session.subscribe(remoteStream, null, null, function (err) {\n if (err) {\n trace.warn('Error creating subscriber', err);\n reject(err);\n return;\n }\n subscriber.on('videoElementCreated', function (event) {\n document.getElementById(subscriber.id).style.display = 'none';\n event.element.muted = true;\n });\n resolve(subscriber);\n });\n });\n };\n OpentokSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session.unsubscribe(peerConnection.subscriber);\n }\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(function () { return trace.warn('Error removing remote streams from peerConnection'); })\n .then(function () {\n peerConnection.subscriber = null;\n });\n };\n //#endregion\n OpentokSession.prototype.calculateDestinationRole = function () {\n if (this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n var isAgentConnected = false;\n return !isAgentConnected ? MediaConstants_1.SessionClientRole.AGENT : MediaConstants_1.SessionClientRole.OBSERVER;\n }\n return MediaConstants_1.SessionClientRole.USER;\n };\n OpentokSession.prototype.sessionExistsGuard = function (shouldThrow) {\n if (shouldThrow === void 0) { shouldThrow = true; }\n var connected = !!(this._session && this._session.connection && this._session.connection.connectionId);\n return guards_1.throwableGuard(connected, 'There no active session', shouldThrow);\n };\n return OpentokSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.OpentokSession = OpentokSession;\n\n//# sourceMappingURL=SessionOpentok.js.map\n"]}
@@ -1,7 +1,7 @@
1
1
  import { IMediaSession, ISessionStreamsManager, MediaSessionHandlers, MediaSessionParams, RemoteTrackStats } from '../MediaContracts';
2
2
  import { SessionClientRole } from '../MediaConstants';
3
3
  import { MediaSessionBase } from './MediaSessionBase';
4
- export declare class TurnWebRtcSessionV3 extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {
4
+ export declare class TurnWebRtcSession extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {
5
5
  private readonly _sessionHandlers;
6
6
  private readonly _pendingPeersIce;
7
7
  private readonly _configuration;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/MediaSession/SessionTurn.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EACA,gBAAgB,EACrC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAGH,iBAAiB,EAEpB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAKpD,qBAAa,iBAAkB,SAAQ,gBAAgB,CAAC,iBAAiB,CAAE,YAAW,aAAa;IAC/F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IACrC,OAAO,CAAC,OAAO,CAAM;aAEjB,EAAE,EAAI,MAAM;gBAIJ,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,aAAa,EAAE,sBAAsB;IA4B3H,OAAO,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkChE,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBlD,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,GAAG,IAAI;IAsDhD,oBAAoB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAwBjD,wBAAwB,CAAC,qBAAqB,EAAE,GAAG,GAAG,IAAI;IAe1D,gBAAgB,CAAC,aAAa,EAAE,GAAG,GAAG,IAAI;IA2E1C,yBAAyB,IAAI,IAAI;IAcjC,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5F,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAY5E,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,mBAAmB;IAY3B,4BAA4B,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAuBzD,sBAAsB,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvG,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAejD,kBAAkB,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvE,qBAAqB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI;CAKjE","file":"SessionTurn.d.ts","sourcesContent":["import * as io from 'socket.io-client';\nimport once from 'lodash/once';\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n IMediaSession,\n ISessionStreamsManager,\n MediaSessionHandlers,\n MediaSessionParams,\n RemoteMediaTrack, RemoteTrackStats\n} from '../MediaContracts';\n\nimport {\n KnownMediaStream,\n MediaSessionDisconnectReason,\n SessionClientRole,\n SessionClientType\n} from '../MediaConstants';\n\nimport {\n SOCKET_EVENTS, SOCKET_PATH,\n SOCKET_RECONNECTION_ATTEMPTS,\n SOCKET_RECONNECTION_DELAY,\n SOCKET_RECONNECTION_DELAY_MAX\n} from './TurnConstants';\n\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {MediaSessionBase} from './MediaSessionBase';\n\nconst trace = getMediaTracer('TurnSessionV3');\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class TurnWebRtcSession extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {\n private readonly _sessionHandlers: MediaSessionHandlers;\n private readonly _pendingPeersIce: any;\n private readonly _configuration: any;\n private _socket: any;\n\n get id(): string {\n return this._sessionParams.sessionId;\n }\n\n constructor(sessionParams: MediaSessionParams, sessionHandlers: MediaSessionHandlers, streamFactory: ISessionStreamsManager) {\n super(sessionParams, streamFactory);\n this._sessionHandlers = sessionHandlers;\n this._socket = null;\n this._pendingPeersIce = {};\n\n const iceServers = sessionParams.credentials.ice.map((item: any) => ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }));\n\n this._configuration = {\n iceServers,\n iceTransportPolicy: 'relay'\n };\n\n this._joinResponseHandler = this._joinResponseHandler.bind(this);\n this._iceCandidateReceivedHandler = this._iceCandidateReceivedHandler.bind(this);\n this._sendOfferHandler = this._sendOfferHandler.bind(this);\n this._sdpOfferHandler = this._sdpOfferHandler.bind(this);\n this._userPeerReconnectHandler = this._userPeerReconnectHandler.bind(this);\n this._peerDisconnectedHandler = this._peerDisconnectedHandler.bind(this);\n this._onSocketDisconnectedHandler = this._onSocketDisconnectedHandler.bind(this);\n }\n\n //#region Socket Connectivity\n\n connect(connectOnly = false): Promise<void> {\n trace.info('Connect to session');\n\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(() => {\n trace.info('Joining SessionId: ' + this._sessionParams.sessionId);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: this._sessionParams.clientType,\n sessionId: this._sessionParams.sessionId\n });\n })\n .catch((error) => {\n throw error;\n });\n }\n\n disconnect(): Promise<void> {\n return this._disconnectInternal(MediaSessionDisconnectReason.ForcedByConsumer);\n }\n\n _connectSocket(url: string, connectOnly: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': SOCKET_RECONNECTION_ATTEMPTS,\n 'path': SOCKET_PATH\n });\n\n const done = once((err?: any) => {\n err ? reject(err) : resolve();\n });\n\n socket.once('connect', () => done());\n socket.on(SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', this._onSocketDisconnectedHandler);\n\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n\n //PUBLISHING NOT SUPPORTED YET\n socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, this._joinResponseHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, this._peerDisconnectedHandler);\n socket.on(SOCKET_EVENTS.INCOMING.SDP_OFFER, this._sdpOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, this._userPeerReconnectHandler);\n socket.on(SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, this._iceCandidateReceivedHandler);\n }\n });\n }\n\n _onSocketDisconnectedHandler(reason: string): void {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(() => undefined);\n }\n }\n }\n\n //#endregion\n\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n\n // Received by Initiator, causing him to emit SDP_OFFER\n _sendOfferHandler(sendOfferEventData: any): void {\n const {uid, peerId} = sendOfferEventData;\n\n trace.info('_sendOfferHandler');\n\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.GUEST, SessionClientRole.AGENT);\n const offerParams = {offerToReceiveAudio: true, offerToReceiveVideo: true};\n\n peerConnection.ontrack = (trackEvent: any) => {\n const track: MediaStreamTrack = trackEvent.track;\n\n trace.info(`MediaStreamTrack arrived from peerConnection: ${track.kind}`, track);\n this.registerMediaTrackFromPeer(peerConnection, track);\n };\n\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.AGENT)\n .then((mediaStream: Nullable<MediaStream>) => {\n trace.info('_sendOfferHandler stream and peer created');\n\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => peerConnection.createOffer(offerParams))\n .then((offerDesc) => {\n trace.info('Initiator has created sdp offer', {offerDesc});\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n\n return peerConnection.setLocalDescription(offerDesc)\n .then(() => {\n trace.info('Local description was set on peerConnection', peerConnection);\n });\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler(joinResponseData: any): void {\n const {sdpAnswer, uid, peerId} = joinResponseData;\n\n trace.info('joinResponse Received', {sdpAnswer});\n\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n\n peerConnection.setRemoteDescription(answer)\n .then(() => {\n trace.info('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler(peerDisconnectedEvent: any): void {\n const {peerId} = peerDisconnectedEvent;\n\n trace.info('_peerDisconnectedHandler');\n\n this._withPeerConnection(peerId, (peerConnection: any) => {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n }\n\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n\n // Received by Guest, causing him to emit SDP_ANSWER\n _sdpOfferHandler(sdpOfferEvent: any): void {\n const {sdpOffer, peerId, uid} = sdpOfferEvent;\n\n trace.info('sdpOffer Received', {sdpOffer});\n\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.INITIATOR, SessionClientRole.USER);\n\n peerConnection.ontrack = (trackEvent: any) => {\n const {track} = trackEvent;\n\n trace.info(`MediaStreamTrack arrived from peerConnection: ${track.kind}`, track);\n\n const remoteTrack: RemoteMediaTrack = {\n mediaTrack: track,\n trackType: track.kind === 'video'\n //Although we can have desktop share stream, we still name it USER_VIDEO_STREAM in dashboard.\n //Because currently we support only one video stream to be streamed at the time, it's not an issue.\n //But when we will need to stream more than one stream of a kind from single peer, this will be need to change.\n ? KnownMediaStream.USER_VIDEO_STREAM : KnownMediaStream.USER_AUDIO_STREAM\n };\n\n peerConnection.remoteMediaTracks.push(remoteTrack);\n this._sessionStreamsManager.addRemoteMediaTrack(remoteTrack)\n .catch(() => {\n trace.warn('Error adding remote track to stream manager', remoteTrack);\n });\n };\n\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.USER)\n .then((mediaStream: Nullable<MediaStream>) => {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => {\n const remoteDesc = new RTCSessionDescription({type: 'offer', sdp: sdpOffer});\n\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(() => {\n trace.info('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(() => {\n trace.info('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n });\n });\n });\n\n })\n .catch((e) => {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _userPeerReconnectHandler(): void {\n trace.info('_userPeerReconnectHandler');\n this._disconnectInternal(MediaSessionDisconnectReason.UserPeerReconnected)\n .catch((error: any) => {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n }\n\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n\n //#region Peer Connection\n\n //#region Streams Handling\n\n onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._disconnectInternal(MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(() => undefined);\n });\n\n return Promise.resolve();\n }\n\n onMediaStreamRenewed(clientRole: SessionClientRole, mediaStream: MediaStream): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n }\n\n getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats> {\n const peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n\n if (peerConnectionOfTrack !== null) {\n return (peerConnectionOfTrack as any).getStats(mediaTrack);\n }\n\n return Promise.reject(new Error('Provided track is not remote track'));\n }\n\n //#endregion\n\n private _disconnectInternal(reason: MediaSessionDisconnectReason): Promise<void> {\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._destroyPeerConnection(peerConnection);\n });\n\n trace.info('Disconnecting from session', reason);\n\n if (this._socket) {\n this._socket.off();\n this._socket.disconnect();\n }\n\n this._socket = null;\n setTimeout(() => this._sessionHandlers.onDisconnectedHandler(reason));\n\n return Promise.resolve();\n }\n\n private _createPeerConnection(peerId: string, peerConnectionType: SessionClientType, peerConnectionRole: SessionClientRole): RTCPeerConnection {\n if (this._peerConnections.get(peerId)) {\n throw new Error(`${this._sessionParams.clientType} peer connection for ${peerId} already exists`);\n }\n\n const peerConnection: any = new RTCPeerConnection(this._configuration);\n\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n\n peerConnection.onconnectionstatechange = () => {\n trace.info('onconnectionstatechange', peerConnection);\n };\n\n peerConnection.oniceconnectionstatechange = (state: any) => {\n trace.info(`ICE Connection state for peer ${peerId} was changed to: ${state.currentTarget.iceConnectionState}`, state);\n const cnState = state.currentTarget.iceConnectionState;\n\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n this._iceStateDisconnected(peerConnection);\n }\n };\n\n peerConnection.onicecandidate = (event: any) => {\n if (event.candidate) {\n trace.info(`${this._sessionParams.clientType} peerConn.onicecandidate`, event.candidate);\n this._socket.emit(SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: this._sessionParams.clientType\n });\n } else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n\n this._peerConnections.set(peerId, peerConnection);\n\n trace.info(`${peerConnectionType} peerConnection created`);\n\n return peerConnection;\n }\n\n private _destroyPeerConnection(peerConnection: RTCPeerConnection): void {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n\n this.unregisterPeersRemoteMediaTracks(peerConnection);\n\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n }\n\n private _withPeerConnection(peerId: any, callback: any): void | undefined {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n\n return undefined;\n }\n\n //#endregion\n\n //#region ICE Candidates\n\n _iceCandidateReceivedHandler(iceCandidateData: any): void {\n const {candidate, peerId} = iceCandidateData;\n\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(() => undefined);\n }\n\n _addIceCandidateToPeer(iceCandidate: RTCIceCandidate, peerConnection: RTCPeerConnection): Promise<void> {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(() => {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n }\n\n _processQueuedIceCandidates(peerId: string): void {\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const pendingIces = this._pendingPeersIce[peerId];\n\n if (pendingIces) {\n pendingIces.forEach((pendingIce: RTCIceCandidate) => {\n trace.info('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection).catch(() => undefined);\n });\n } else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n }\n\n _queueIceCandidate(iceCandidate: RTCIceCandidate, peerId: string): void {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n\n this._pendingPeersIce[peerId].push(iceCandidate);\n }\n\n _iceStateDisconnected(peerConnection: RTCPeerConnection): void {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(() => undefined);\n }\n\n //#endregion\n}\n"]}
@@ -39,9 +39,9 @@ var MediaTracer_1 = require("../MediaUtils/MediaTracer");
39
39
  var MediaSessionBase_1 = require("./MediaSessionBase");
40
40
  var trace = MediaTracer_1.getMediaTracer('TurnSessionV3');
41
41
  //Currently this version supports subscribing only. Publishing will be implemented as needed.
42
- var TurnWebRtcSessionV3 = /** @class */function (_super) {
43
- __extends(TurnWebRtcSessionV3, _super);
44
- function TurnWebRtcSessionV3(sessionParams, sessionHandlers, streamFactory) {
42
+ var TurnWebRtcSession = /** @class */function (_super) {
43
+ __extends(TurnWebRtcSession, _super);
44
+ function TurnWebRtcSession(sessionParams, sessionHandlers, streamFactory) {
45
45
  var _this = _super.call(this, sessionParams, streamFactory) || this;
46
46
  _this._sessionHandlers = sessionHandlers;
47
47
  _this._socket = null;
@@ -66,7 +66,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
66
66
  _this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);
67
67
  return _this;
68
68
  }
69
- Object.defineProperty(TurnWebRtcSessionV3.prototype, "id", {
69
+ Object.defineProperty(TurnWebRtcSession.prototype, "id", {
70
70
  get: function get() {
71
71
  return this._sessionParams.sessionId;
72
72
  },
@@ -74,7 +74,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
74
74
  configurable: true
75
75
  });
76
76
  //#region Socket Connectivity
77
- TurnWebRtcSessionV3.prototype.connect = function (connectOnly) {
77
+ TurnWebRtcSession.prototype.connect = function (connectOnly) {
78
78
  var _this = this;
79
79
  if (connectOnly === void 0) {
80
80
  connectOnly = false;
@@ -90,10 +90,10 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
90
90
  throw error;
91
91
  });
92
92
  };
93
- TurnWebRtcSessionV3.prototype.disconnect = function () {
93
+ TurnWebRtcSession.prototype.disconnect = function () {
94
94
  return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);
95
95
  };
96
- TurnWebRtcSessionV3.prototype._connectSocket = function (url, connectOnly) {
96
+ TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {
97
97
  var _this = this;
98
98
  return new Promise(function (resolve, reject) {
99
99
  var socket = _this._socket = io.connect(url, {
@@ -125,7 +125,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
125
125
  }
126
126
  });
127
127
  };
128
- TurnWebRtcSessionV3.prototype._onSocketDisconnectedHandler = function (reason) {
128
+ TurnWebRtcSession.prototype._onSocketDisconnectedHandler = function (reason) {
129
129
  if (this._socket) {
130
130
  // The initial example of differentiating between "forced" disconnect and "network" disconnect is taken from:
131
131
  // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99
@@ -140,7 +140,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
140
140
  //#endregion
141
141
  //#region WebRTC Initiator - session Initiator (User on mobile device)
142
142
  // Received by Initiator, causing him to emit SDP_OFFER
143
- TurnWebRtcSessionV3.prototype._sendOfferHandler = function (sendOfferEventData) {
143
+ TurnWebRtcSession.prototype._sendOfferHandler = function (sendOfferEventData) {
144
144
  var _this = this;
145
145
  var uid = sendOfferEventData.uid,
146
146
  peerId = sendOfferEventData.peerId;
@@ -184,7 +184,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
184
184
  });
185
185
  };
186
186
  // Received by the Initiator: Indicates that publish should be started
187
- TurnWebRtcSessionV3.prototype._joinResponseHandler = function (joinResponseData) {
187
+ TurnWebRtcSession.prototype._joinResponseHandler = function (joinResponseData) {
188
188
  var _this = this;
189
189
  var sdpAnswer = joinResponseData.sdpAnswer,
190
190
  uid = joinResponseData.uid,
@@ -204,7 +204,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
204
204
  });
205
205
  };
206
206
  // Received by Initiator after a guests socket has been disconnected
207
- TurnWebRtcSessionV3.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {
207
+ TurnWebRtcSession.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {
208
208
  var _this = this;
209
209
  var peerId = peerDisconnectedEvent.peerId;
210
210
  trace.info('_peerDisconnectedHandler');
@@ -217,7 +217,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
217
217
  //#endregion WebRTC Initiator - session Initiator (User on mobile device)
218
218
  //#region WebRTC Guest - session Guest (Agent on dashboard platform)
219
219
  // Received by Guest, causing him to emit SDP_ANSWER
220
- TurnWebRtcSessionV3.prototype._sdpOfferHandler = function (sdpOfferEvent) {
220
+ TurnWebRtcSession.prototype._sdpOfferHandler = function (sdpOfferEvent) {
221
221
  var _this = this;
222
222
  var sdpOffer = sdpOfferEvent.sdpOffer,
223
223
  peerId = sdpOfferEvent.peerId,
@@ -274,7 +274,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
274
274
  });
275
275
  };
276
276
  // Received by Guest after an Initiator reconnects to room
277
- TurnWebRtcSessionV3.prototype._userPeerReconnectHandler = function () {
277
+ TurnWebRtcSession.prototype._userPeerReconnectHandler = function () {
278
278
  trace.info('_userPeerReconnectHandler');
279
279
  this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.UserPeerReconnected).catch(function (error) {
280
280
  trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);
@@ -283,7 +283,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
283
283
  //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)
284
284
  //#region Peer Connection
285
285
  //#region Streams Handling
286
- TurnWebRtcSessionV3.prototype.onMediaStreamDestroyed = function (clientRole) {
286
+ TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {
287
287
  var _this = this;
288
288
  //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation
289
289
  this._peerConnections.forEach(function (peerConnection) {
@@ -293,11 +293,11 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
293
293
  });
294
294
  return Promise.resolve();
295
295
  };
296
- TurnWebRtcSessionV3.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
296
+ TurnWebRtcSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
297
297
  //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation
298
298
  return Promise.resolve();
299
299
  };
300
- TurnWebRtcSessionV3.prototype.getRemoteTrackStats = function (mediaTrack) {
300
+ TurnWebRtcSession.prototype.getRemoteTrackStats = function (mediaTrack) {
301
301
  var peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);
302
302
  if (peerConnectionOfTrack !== null) {
303
303
  return peerConnectionOfTrack.getStats(mediaTrack);
@@ -305,7 +305,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
305
305
  return Promise.reject(new Error('Provided track is not remote track'));
306
306
  };
307
307
  //#endregion
308
- TurnWebRtcSessionV3.prototype._disconnectInternal = function (reason) {
308
+ TurnWebRtcSession.prototype._disconnectInternal = function (reason) {
309
309
  var _this = this;
310
310
  this._peerConnections.forEach(function (peerConnection) {
311
311
  _this._destroyPeerConnection(peerConnection);
@@ -321,7 +321,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
321
321
  });
322
322
  return Promise.resolve();
323
323
  };
324
- TurnWebRtcSessionV3.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {
324
+ TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {
325
325
  var _this = this;
326
326
  if (this._peerConnections.get(peerId)) {
327
327
  throw new Error(this._sessionParams.clientType + " peer connection for " + peerId + " already exists");
@@ -358,7 +358,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
358
358
  trace.info(peerConnectionType + " peerConnection created");
359
359
  return peerConnection;
360
360
  };
361
- TurnWebRtcSessionV3.prototype._destroyPeerConnection = function (peerConnection) {
361
+ TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {
362
362
  trace.info('Destroying PeerConnection', peerConnection.peerType);
363
363
  peerConnection.ontrack = null;
364
364
  peerConnection.onicecandidate = null;
@@ -369,7 +369,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
369
369
  this._peerConnections.delete(peerConnection.peerId);
370
370
  peerConnection.close();
371
371
  };
372
- TurnWebRtcSessionV3.prototype._withPeerConnection = function (peerId, callback) {
372
+ TurnWebRtcSession.prototype._withPeerConnection = function (peerId, callback) {
373
373
  if (this._peerConnections.get(peerId)) {
374
374
  return callback(this._peerConnections.get(peerId));
375
375
  }
@@ -377,7 +377,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
377
377
  };
378
378
  //#endregion
379
379
  //#region ICE Candidates
380
- TurnWebRtcSessionV3.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {
380
+ TurnWebRtcSession.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {
381
381
  var candidate = iceCandidateData.candidate,
382
382
  peerId = iceCandidateData.peerId;
383
383
  trace.info('_iceCandidateReceivedHandler', candidate);
@@ -396,7 +396,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
396
396
  return undefined;
397
397
  });
398
398
  };
399
- TurnWebRtcSessionV3.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {
399
+ TurnWebRtcSession.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {
400
400
  return peerConnection.addIceCandidate(iceCandidate).then(function () {
401
401
  trace.info('ICE Candidate add to peer connection');
402
402
  }).catch(function (e) {
@@ -404,7 +404,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
404
404
  throw e;
405
405
  });
406
406
  };
407
- TurnWebRtcSessionV3.prototype._processQueuedIceCandidates = function (peerId) {
407
+ TurnWebRtcSession.prototype._processQueuedIceCandidates = function (peerId) {
408
408
  var _this = this;
409
409
  this._withPeerConnection(peerId, function (peerConnection) {
410
410
  var pendingIces = _this._pendingPeersIce[peerId];
@@ -420,20 +420,20 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
420
420
  }
421
421
  });
422
422
  };
423
- TurnWebRtcSessionV3.prototype._queueIceCandidate = function (iceCandidate, peerId) {
423
+ TurnWebRtcSession.prototype._queueIceCandidate = function (iceCandidate, peerId) {
424
424
  if (!this._pendingPeersIce[peerId]) {
425
425
  this._pendingPeersIce[peerId] = [];
426
426
  }
427
427
  this._pendingPeersIce[peerId].push(iceCandidate);
428
428
  };
429
- TurnWebRtcSessionV3.prototype._iceStateDisconnected = function (peerConnection) {
429
+ TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {
430
430
  this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () {
431
431
  return undefined;
432
432
  });
433
433
  };
434
- return TurnWebRtcSessionV3;
434
+ return TurnWebRtcSession;
435
435
  }(MediaSessionBase_1.MediaSessionBase);
436
- exports.TurnWebRtcSessionV3 = TurnWebRtcSessionV3;
436
+ exports.TurnWebRtcSession = TurnWebRtcSession;
437
437
 
438
- //# sourceMappingURL=SessionTurn.v3.js.map
439
- //# sourceMappingURL=SessionTurn.v3.js.map
438
+ //# sourceMappingURL=SessionTurn.js.map
439
+ //# sourceMappingURL=SessionTurn.js.map