@techsee/techsee-media-service 0.7.2 → 0.7.3
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.
- package/lib/MediaConstants.d.ts +6 -3
- package/lib/MediaConstants.d.ts.map +1 -1
- package/lib/MediaConstants.js +7 -3
- package/lib/MediaConstants.js.map +1 -1
- package/lib/MediaContracts.d.ts +12 -6
- package/lib/MediaContracts.d.ts.map +1 -1
- package/lib/MediaServiceBase.d.ts +3 -2
- package/lib/MediaServiceBase.d.ts.map +1 -1
- package/lib/MediaServiceBase.js +31 -15
- package/lib/MediaServiceBase.js.map +1 -1
- package/lib/MediaSession/MediaSessionBase.d.ts +6 -4
- package/lib/MediaSession/MediaSessionBase.d.ts.map +1 -1
- package/lib/MediaSession/MediaSessionBase.js +18 -6
- package/lib/MediaSession/MediaSessionBase.js.map +1 -1
- package/lib/MediaSession/SessionOpentok.d.ts +2 -2
- package/lib/MediaSession/SessionOpentok.d.ts.map +1 -1
- package/lib/MediaSession/SessionOpentok.js +5 -3
- package/lib/MediaSession/SessionOpentok.js.map +1 -1
- package/lib/MediaSession/SessionTurn.d.ts +5 -3
- package/lib/MediaSession/SessionTurn.d.ts.map +1 -1
- package/lib/MediaSession/SessionTurn.js +47 -37
- package/lib/MediaSession/SessionTurn.js.map +1 -1
- package/package.json +2 -2
|
@@ -37,7 +37,7 @@ var MediaConstants_1 = require("../MediaConstants");
|
|
|
37
37
|
var TurnConstants_1 = require("./TurnConstants");
|
|
38
38
|
var MediaTracer_1 = require("../MediaUtils/MediaTracer");
|
|
39
39
|
var MediaSessionBase_1 = require("./MediaSessionBase");
|
|
40
|
-
var trace = MediaTracer_1.getMediaTracer('
|
|
40
|
+
var trace = MediaTracer_1.getMediaTracer('TurnWebRtcSession');
|
|
41
41
|
//Currently this version supports subscribing only. Publishing will be implemented as needed.
|
|
42
42
|
var TurnWebRtcSession = /** @class */function (_super) {
|
|
43
43
|
__extends(TurnWebRtcSession, _super);
|
|
@@ -61,7 +61,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
61
61
|
_this._iceCandidateReceivedHandler = _this._iceCandidateReceivedHandler.bind(_this);
|
|
62
62
|
_this._sendOfferHandler = _this._sendOfferHandler.bind(_this);
|
|
63
63
|
_this._sdpOfferHandler = _this._sdpOfferHandler.bind(_this);
|
|
64
|
-
_this.
|
|
64
|
+
_this._initiatorPeerReconnectHandler = _this._initiatorPeerReconnectHandler.bind(_this);
|
|
65
65
|
_this._peerDisconnectedHandler = _this._peerDisconnectedHandler.bind(_this);
|
|
66
66
|
_this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);
|
|
67
67
|
return _this;
|
|
@@ -115,12 +115,11 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
115
115
|
socket.on('disconnect', _this._onSocketDisconnectedHandler);
|
|
116
116
|
if (!connectOnly) {
|
|
117
117
|
trace.info('Subscribing socket events');
|
|
118
|
-
//PUBLISHING NOT SUPPORTED YET
|
|
119
118
|
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SEND_OFFER, _this._sendOfferHandler);
|
|
120
119
|
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, _this._joinResponseHandler);
|
|
121
120
|
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, _this._peerDisconnectedHandler);
|
|
122
121
|
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SDP_OFFER, _this._sdpOfferHandler);
|
|
123
|
-
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this.
|
|
122
|
+
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this._initiatorPeerReconnectHandler);
|
|
124
123
|
socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, _this._iceCandidateReceivedHandler);
|
|
125
124
|
}
|
|
126
125
|
});
|
|
@@ -148,11 +147,6 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
148
147
|
//Currently we not support of passing role through signaling, so we assume every connection is "AGENT" like
|
|
149
148
|
var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.GUEST, MediaConstants_1.SessionClientRole.AGENT);
|
|
150
149
|
var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };
|
|
151
|
-
peerConnection.ontrack = function (trackEvent) {
|
|
152
|
-
var track = trackEvent.track;
|
|
153
|
-
trace.info("MediaStreamTrack arrived from peerConnection: " + track.kind, track);
|
|
154
|
-
_this.registerMediaTrackFromPeer(peerConnection, track);
|
|
155
|
-
};
|
|
156
150
|
//TODO - Alex: Currently we not sending "role" through signaling, and by default we assume that the one who asks fot offer, is agent.
|
|
157
151
|
//On later stages we can send or the client "role" or the list of "streams" that peer is interested in.
|
|
158
152
|
this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.AGENT).then(function (mediaStream) {
|
|
@@ -178,6 +172,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
178
172
|
});
|
|
179
173
|
return peerConnection.setLocalDescription(offerDesc).then(function () {
|
|
180
174
|
trace.info('Local description was set on peerConnection', peerConnection);
|
|
175
|
+
_this._setPeerConnectionMonitor(peerConnection);
|
|
181
176
|
});
|
|
182
177
|
}).catch(function (e) {
|
|
183
178
|
trace.warn('Error', e);
|
|
@@ -209,9 +204,8 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
209
204
|
var peerId = peerDisconnectedEvent.peerId;
|
|
210
205
|
trace.info('_peerDisconnectedHandler');
|
|
211
206
|
this._withPeerConnection(peerId, function (peerConnection) {
|
|
212
|
-
_this.
|
|
213
|
-
|
|
214
|
-
});
|
|
207
|
+
_this._destroyPeerConnection(peerConnection);
|
|
208
|
+
//this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);
|
|
215
209
|
});
|
|
216
210
|
};
|
|
217
211
|
//#endregion WebRTC Initiator - session Initiator (User on mobile device)
|
|
@@ -224,22 +218,6 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
224
218
|
uid = sdpOfferEvent.uid;
|
|
225
219
|
trace.info('sdpOffer Received', { sdpOffer: sdpOffer });
|
|
226
220
|
var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.INITIATOR, MediaConstants_1.SessionClientRole.USER);
|
|
227
|
-
peerConnection.ontrack = function (trackEvent) {
|
|
228
|
-
var track = trackEvent.track;
|
|
229
|
-
trace.info("MediaStreamTrack arrived from peerConnection: " + track.kind, track);
|
|
230
|
-
var remoteTrack = {
|
|
231
|
-
mediaTrack: track,
|
|
232
|
-
trackType: track.kind === 'video'
|
|
233
|
-
//Although we can have desktop share stream, we still name it USER_VIDEO_STREAM in dashboard.
|
|
234
|
-
//Because currently we support only one video stream to be streamed at the time, it's not an issue.
|
|
235
|
-
//But when we will need to stream more than one stream of a kind from single peer, this will be need to change.
|
|
236
|
-
? MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM : MediaConstants_1.KnownMediaStream.USER_AUDIO_STREAM
|
|
237
|
-
};
|
|
238
|
-
peerConnection.remoteMediaTracks.push(remoteTrack);
|
|
239
|
-
_this._sessionStreamsManager.addRemoteMediaTrack(remoteTrack).catch(function () {
|
|
240
|
-
trace.warn('Error adding remote track to stream manager', remoteTrack);
|
|
241
|
-
});
|
|
242
|
-
};
|
|
243
221
|
this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.USER).then(function (mediaStream) {
|
|
244
222
|
if (mediaStream) {
|
|
245
223
|
trace.info('Adding local tracks to peer connection');
|
|
@@ -265,6 +243,7 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
265
243
|
return peerConnection.setLocalDescription(sdpAnswer).then(function () {
|
|
266
244
|
trace.info('_sdpOfferHandler local desc was set');
|
|
267
245
|
_this._processQueuedIceCandidates(peerId);
|
|
246
|
+
_this._setPeerConnectionMonitor(peerConnection);
|
|
268
247
|
});
|
|
269
248
|
});
|
|
270
249
|
});
|
|
@@ -274,9 +253,9 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
274
253
|
});
|
|
275
254
|
};
|
|
276
255
|
// Received by Guest after an Initiator reconnects to room
|
|
277
|
-
TurnWebRtcSession.prototype.
|
|
278
|
-
trace.info('
|
|
279
|
-
this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.
|
|
256
|
+
TurnWebRtcSession.prototype._initiatorPeerReconnectHandler = function () {
|
|
257
|
+
trace.info('_initiatorPeerReconnectHandler');
|
|
258
|
+
this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected).catch(function (error) {
|
|
280
259
|
trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);
|
|
281
260
|
});
|
|
282
261
|
};
|
|
@@ -310,15 +289,15 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
310
289
|
this._peerConnections.forEach(function (peerConnection) {
|
|
311
290
|
_this._destroyPeerConnection(peerConnection);
|
|
312
291
|
});
|
|
313
|
-
trace.info('Disconnecting from session', reason);
|
|
314
292
|
if (this._socket) {
|
|
293
|
+
trace.info('Disconnecting from session', reason);
|
|
315
294
|
this._socket.off();
|
|
316
295
|
this._socket.disconnect();
|
|
296
|
+
this._socket = null;
|
|
297
|
+
setTimeout(function () {
|
|
298
|
+
return _this._sessionHandlers.onDisconnectedHandler(reason);
|
|
299
|
+
});
|
|
317
300
|
}
|
|
318
|
-
this._socket = null;
|
|
319
|
-
setTimeout(function () {
|
|
320
|
-
return _this._sessionHandlers.onDisconnectedHandler(reason);
|
|
321
|
-
});
|
|
322
301
|
return Promise.resolve();
|
|
323
302
|
};
|
|
324
303
|
TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {
|
|
@@ -331,12 +310,17 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
331
310
|
peerConnection.peerType = peerConnectionType;
|
|
332
311
|
peerConnection.remoteMediaTracks = [];
|
|
333
312
|
peerConnection.peerRole = peerConnectionRole;
|
|
313
|
+
peerConnection.connectionTimoutPrt = null;
|
|
334
314
|
peerConnection.onconnectionstatechange = function () {
|
|
335
315
|
trace.info('onconnectionstatechange', peerConnection);
|
|
316
|
+
if (peerConnection.connectionState === 'connected') {
|
|
317
|
+
_this.registerPeersRemoteTracks(peerConnection);
|
|
318
|
+
}
|
|
336
319
|
};
|
|
337
320
|
peerConnection.oniceconnectionstatechange = function (state) {
|
|
338
321
|
trace.info("ICE Connection state for peer " + peerId + " was changed to: " + state.currentTarget.iceConnectionState, state);
|
|
339
322
|
var cnState = state.currentTarget.iceConnectionState;
|
|
323
|
+
clearTimeout(peerConnection.connectionTimoutPrt);
|
|
340
324
|
if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {
|
|
341
325
|
_this._iceStateDisconnected(peerConnection);
|
|
342
326
|
}
|
|
@@ -354,10 +338,33 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
354
338
|
trace.info('ICE Candidate is null in peerConnection', event);
|
|
355
339
|
}
|
|
356
340
|
};
|
|
341
|
+
peerConnection.ontrack = function (trackEvent) {
|
|
342
|
+
var track = trackEvent.track;
|
|
343
|
+
trace.info("MediaStreamTrack arrived from peerConnection: " + track.kind, track);
|
|
344
|
+
_this.addRemoteTrackToPeer(peerConnection, track);
|
|
345
|
+
if (peerConnection.connectionState === 'connected') {
|
|
346
|
+
_this.registerPeersRemoteTracks(peerConnection);
|
|
347
|
+
}
|
|
348
|
+
};
|
|
357
349
|
this._peerConnections.set(peerId, peerConnection);
|
|
358
350
|
trace.info(peerConnectionType + " peerConnection created");
|
|
359
351
|
return peerConnection;
|
|
360
352
|
};
|
|
353
|
+
TurnWebRtcSession.prototype._setPeerConnectionMonitor = function (peerConnection) {
|
|
354
|
+
var _this = this;
|
|
355
|
+
clearTimeout(peerConnection.connectionTimoutPrt);
|
|
356
|
+
peerConnection.connectionTimoutPrt = setTimeout(function () {
|
|
357
|
+
trace.info('PeerConnection ICE state timeout', peerConnection);
|
|
358
|
+
_this._handlePeerConnectionTimeout(peerConnection);
|
|
359
|
+
}, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);
|
|
360
|
+
};
|
|
361
|
+
TurnWebRtcSession.prototype._handlePeerConnectionTimeout = function (peerConnection) {
|
|
362
|
+
if (peerConnection.peerRole === MediaConstants_1.SessionClientRole.USER) {
|
|
363
|
+
this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(function () {
|
|
364
|
+
return undefined;
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
};
|
|
361
368
|
TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {
|
|
362
369
|
trace.info('Destroying PeerConnection', peerConnection.peerType);
|
|
363
370
|
peerConnection.ontrack = null;
|
|
@@ -365,7 +372,10 @@ var TurnWebRtcSession = /** @class */function (_super) {
|
|
|
365
372
|
peerConnection.onconnectionstatechange = null;
|
|
366
373
|
peerConnection.oniceconnectionstatechange = null;
|
|
367
374
|
peerConnection.onicegatheringstatechange = null;
|
|
368
|
-
|
|
375
|
+
clearTimeout(peerConnection.connectionTimoutPrt);
|
|
376
|
+
this.unregisterPeersRemoteMediaTracks(peerConnection).catch(function () {
|
|
377
|
+
return undefined;
|
|
378
|
+
});
|
|
369
379
|
this._peerConnections.delete(peerConnection.peerId);
|
|
370
380
|
peerConnection.close();
|
|
371
381
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["MediaSession/SessionTurn.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","__importStar","mod","__esModule","result","k","call","__importDefault","defineProperty","exports","value","io","require","once_1","MediaConstants_1","TurnConstants_1","MediaTracer_1","MediaSessionBase_1","trace","getMediaTracer","TurnWebRtcSession","_super","sessionParams","sessionHandlers","streamFactory","_this","_sessionHandlers","_socket","_pendingPeersIce","iceServers","credentials","ice","map","item","urls","url","username","login","credential","password","_configuration","iceTransportPolicy","_joinResponseHandler","bind","_iceCandidateReceivedHandler","_sendOfferHandler","_sdpOfferHandler","_userPeerReconnectHandler","_peerDisconnectedHandler","_onSocketDisconnectedHandler","get","_sessionParams","sessionId","enumerable","configurable","connect","connectOnly","info","_connectSocket","then","emit","SOCKET_EVENTS","OUTGOING","JOIN_ROOM","clientType","catch","error","disconnect","_disconnectInternal","MediaSessionDisconnectReason","ForcedByConsumer","Promise","resolve","reject","socket","SOCKET_RECONNECTION_DELAY","SOCKET_RECONNECTION_DELAY_MAX","SOCKET_RECONNECTION_ATTEMPTS","SOCKET_PATH","done","default","err","once","on","INCOMING","ERROR","SEND_OFFER","JOIN_RESPONSE","PEER_DISCONNECTED","SDP_OFFER","PUBLISHER_RECONNECT","ICE_CANDIDATE","reason","SignalingChannelDisconnect","undefined","sendOfferEventData","uid","peerId","peerConnection","_createPeerConnection","SessionClientType","GUEST","SessionClientRole","AGENT","offerParams","offerToReceiveAudio","offerToReceiveVideo","ontrack","trackEvent","track","kind","registerMediaTrackFromPeer","_sessionStreamsManager","getMediaStreamForRole","mediaStream","getTracks","forEach","addTrack","createOffer","offerDesc","sdpOffer","sdp","setLocalDescription","e","warn","joinResponseData","sdpAnswer","_withPeerConnection","answer","RTCSessionDescription","type","setRemoteDescription","_processQueuedIceCandidates","peerDisconnectedEvent","PeerDisconnected","sdpOfferEvent","INITIATOR","USER","remoteTrack","mediaTrack","trackType","KnownMediaStream","USER_VIDEO_STREAM","USER_AUDIO_STREAM","remoteMediaTracks","push","addRemoteMediaTrack","remoteDesc","createAnswer","SDP_ANSWER","UserPeerReconnected","onMediaStreamDestroyed","clientRole","_peerConnections","PublishedStreamDestroyed","onMediaStreamRenewed","getRemoteTrackStats","peerConnectionOfTrack","getPeerConnectionByMediaTrack","getStats","Error","_destroyPeerConnection","off","setTimeout","onDisconnectedHandler","peerConnectionType","peerConnectionRole","RTCPeerConnection","peerType","peerRole","onconnectionstatechange","oniceconnectionstatechange","state","currentTarget","iceConnectionState","cnState","indexOf","_iceStateDisconnected","onicecandidate","event","candidate","set","onicegatheringstatechange","unregisterPeersRemoteMediaTracks","delete","close","callback","iceCandidateData","remoteDescription","_queueIceCandidate","_addIceCandidateToPeer","iceCandidate","addIceCandidate","pendingIces","pendingIce","PeerConnectionInterrupted","MediaSessionBase"],"mappings":"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","file":"SessionTurn.js","sourcesContent":["\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar io = __importStar(require(\"socket.io-client\"));\nvar once_1 = __importDefault(require(\"lodash/once\"));\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar TurnConstants_1 = require(\"./TurnConstants\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar trace = MediaTracer_1.getMediaTracer('TurnSessionV3');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar TurnWebRtcSession = /** @class */ (function (_super) {\n __extends(TurnWebRtcSession, _super);\n function TurnWebRtcSession(sessionParams, sessionHandlers, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._sessionHandlers = sessionHandlers;\n _this._socket = null;\n _this._pendingPeersIce = {};\n var iceServers = sessionParams.credentials.ice.map(function (item) { return ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }); });\n _this._configuration = {\n iceServers: iceServers,\n iceTransportPolicy: 'relay'\n };\n _this._joinResponseHandler = _this._joinResponseHandler.bind(_this);\n _this._iceCandidateReceivedHandler = _this._iceCandidateReceivedHandler.bind(_this);\n _this._sendOfferHandler = _this._sendOfferHandler.bind(_this);\n _this._sdpOfferHandler = _this._sdpOfferHandler.bind(_this);\n _this._userPeerReconnectHandler = _this._userPeerReconnectHandler.bind(_this);\n _this._peerDisconnectedHandler = _this._peerDisconnectedHandler.bind(_this);\n _this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(TurnWebRtcSession.prototype, \"id\", {\n get: function () {\n return this._sessionParams.sessionId;\n },\n enumerable: true,\n configurable: true\n });\n //#region Socket Connectivity\n TurnWebRtcSession.prototype.connect = function (connectOnly) {\n var _this = this;\n if (connectOnly === void 0) { connectOnly = false; }\n trace.info('Connect to session');\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(function () {\n trace.info('Joining SessionId: ' + _this._sessionParams.sessionId);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: _this._sessionParams.clientType,\n sessionId: _this._sessionParams.sessionId\n });\n })\n .catch(function (error) {\n throw error;\n });\n };\n TurnWebRtcSession.prototype.disconnect = function () {\n return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);\n };\n TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var socket = _this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': TurnConstants_1.SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': TurnConstants_1.SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': TurnConstants_1.SOCKET_RECONNECTION_ATTEMPTS,\n 'path': TurnConstants_1.SOCKET_PATH\n });\n var done = once_1.default(function (err) {\n err ? reject(err) : resolve();\n });\n socket.once('connect', function () { return done(); });\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', _this._onSocketDisconnectedHandler);\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n //PUBLISHING NOT SUPPORTED YET\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SEND_OFFER, _this._sendOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, _this._joinResponseHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, _this._peerDisconnectedHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SDP_OFFER, _this._sdpOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this._userPeerReconnectHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, _this._iceCandidateReceivedHandler);\n }\n });\n };\n TurnWebRtcSession.prototype._onSocketDisconnectedHandler = function (reason) {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(function () { return undefined; });\n }\n }\n };\n //#endregion\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n // Received by Initiator, causing him to emit SDP_OFFER\n TurnWebRtcSession.prototype._sendOfferHandler = function (sendOfferEventData) {\n var _this = this;\n var uid = sendOfferEventData.uid, peerId = sendOfferEventData.peerId;\n trace.info('_sendOfferHandler');\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.GUEST, MediaConstants_1.SessionClientRole.AGENT);\n var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };\n peerConnection.ontrack = function (trackEvent) {\n var track = trackEvent.track;\n trace.info(\"MediaStreamTrack arrived from peerConnection: \" + track.kind, track);\n _this.registerMediaTrackFromPeer(peerConnection, track);\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(MediaConstants_1.SessionClientRole.AGENT)\n .then(function (mediaStream) {\n trace.info('_sendOfferHandler stream and peer created');\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () { return peerConnection.createOffer(offerParams); })\n .then(function (offerDesc) {\n trace.info('Initiator has created sdp offer', { offerDesc: offerDesc });\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n return peerConnection.setLocalDescription(offerDesc)\n .then(function () {\n trace.info('Local description was set on peerConnection', peerConnection);\n });\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n };\n // Received by the Initiator: Indicates that publish should be started\n TurnWebRtcSession.prototype._joinResponseHandler = function (joinResponseData) {\n var _this = this;\n var sdpAnswer = joinResponseData.sdpAnswer, uid = joinResponseData.uid, peerId = joinResponseData.peerId;\n trace.info('joinResponse Received', { sdpAnswer: sdpAnswer });\n this._withPeerConnection(peerId, function (peerConnection) {\n var answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n peerConnection.setRemoteDescription(answer)\n .then(function () {\n trace.info('Remote description was set', answer);\n _this._processQueuedIceCandidates(peerId);\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n });\n };\n // Received by Initiator after a guests socket has been disconnected\n TurnWebRtcSession.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {\n var _this = this;\n var peerId = peerDisconnectedEvent.peerId;\n trace.info('_peerDisconnectedHandler');\n this._withPeerConnection(peerId, function (peerConnection) {\n _this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerDisconnected).catch(function () { return undefined; });\n });\n };\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n // Received by Guest, causing him to emit SDP_ANSWER\n TurnWebRtcSession.prototype._sdpOfferHandler = function (sdpOfferEvent) {\n var _this = this;\n var sdpOffer = sdpOfferEvent.sdpOffer, peerId = sdpOfferEvent.peerId, uid = sdpOfferEvent.uid;\n trace.info('sdpOffer Received', { sdpOffer: sdpOffer });\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.INITIATOR, MediaConstants_1.SessionClientRole.USER);\n peerConnection.ontrack = function (trackEvent) {\n var track = trackEvent.track;\n trace.info(\"MediaStreamTrack arrived from peerConnection: \" + track.kind, track);\n var remoteTrack = {\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 ? MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM : MediaConstants_1.KnownMediaStream.USER_AUDIO_STREAM\n };\n peerConnection.remoteMediaTracks.push(remoteTrack);\n _this._sessionStreamsManager.addRemoteMediaTrack(remoteTrack)\n .catch(function () {\n trace.warn('Error adding remote track to stream manager', remoteTrack);\n });\n };\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.USER)\n .then(function (mediaStream) {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () {\n var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(function () {\n trace.info('Remote description was set', remoteDesc);\n return peerConnection.createAnswer()\n .then(function (sdpAnswer) {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(function () {\n trace.info('_sdpOfferHandler local desc was set');\n _this._processQueuedIceCandidates(peerId);\n });\n });\n });\n })\n .catch(function (e) {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n };\n // Received by Guest after an Initiator reconnects to room\n TurnWebRtcSession.prototype._userPeerReconnectHandler = function () {\n trace.info('_userPeerReconnectHandler');\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.UserPeerReconnected)\n .catch(function (error) {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n };\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n //#region Peer Connection\n //#region Streams Handling\n TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n this._peerConnections.forEach(function (peerConnection) {\n _this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(function () { return undefined; });\n });\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n if (peerConnectionOfTrack !== null) {\n return peerConnectionOfTrack.getStats(mediaTrack);\n }\n return Promise.reject(new Error('Provided track is not remote track'));\n };\n //#endregion\n TurnWebRtcSession.prototype._disconnectInternal = function (reason) {\n var _this = this;\n this._peerConnections.forEach(function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n });\n trace.info('Disconnecting from session', reason);\n if (this._socket) {\n this._socket.off();\n this._socket.disconnect();\n }\n this._socket = null;\n setTimeout(function () { return _this._sessionHandlers.onDisconnectedHandler(reason); });\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {\n var _this = this;\n if (this._peerConnections.get(peerId)) {\n throw new Error(this._sessionParams.clientType + \" peer connection for \" + peerId + \" already exists\");\n }\n var peerConnection = new RTCPeerConnection(this._configuration);\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n peerConnection.onconnectionstatechange = function () {\n trace.info('onconnectionstatechange', peerConnection);\n };\n peerConnection.oniceconnectionstatechange = function (state) {\n trace.info(\"ICE Connection state for peer \" + peerId + \" was changed to: \" + state.currentTarget.iceConnectionState, state);\n var cnState = state.currentTarget.iceConnectionState;\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n _this._iceStateDisconnected(peerConnection);\n }\n };\n peerConnection.onicecandidate = function (event) {\n if (event.candidate) {\n trace.info(_this._sessionParams.clientType + \" peerConn.onicecandidate\", event.candidate);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: _this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: _this._sessionParams.clientType\n });\n }\n else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n this._peerConnections.set(peerId, peerConnection);\n trace.info(peerConnectionType + \" peerConnection created\");\n return peerConnection;\n };\n TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n this.unregisterPeersRemoteMediaTracks(peerConnection);\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n };\n TurnWebRtcSession.prototype._withPeerConnection = function (peerId, callback) {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n return undefined;\n };\n //#endregion\n //#region ICE Candidates\n TurnWebRtcSession.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {\n var candidate = iceCandidateData.candidate, peerId = iceCandidateData.peerId;\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n return;\n }\n var peerConnection = this._peerConnections.get(peerId);\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n return;\n }\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(function () { return undefined; });\n };\n TurnWebRtcSession.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(function () {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch(function (e) {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n };\n TurnWebRtcSession.prototype._processQueuedIceCandidates = function (peerId) {\n var _this = this;\n this._withPeerConnection(peerId, function (peerConnection) {\n var pendingIces = _this._pendingPeersIce[peerId];\n if (pendingIces) {\n pendingIces.forEach(function (pendingIce) {\n trace.info('Adding pending ICE to peer connections');\n _this._addIceCandidateToPeer(pendingIce, peerConnection).catch(function () { return undefined; });\n });\n }\n else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n };\n TurnWebRtcSession.prototype._queueIceCandidate = function (iceCandidate, peerId) {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n this._pendingPeersIce[peerId].push(iceCandidate);\n };\n TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () { return undefined; });\n };\n return TurnWebRtcSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.TurnWebRtcSession = TurnWebRtcSession;\n\n//# sourceMappingURL=SessionTurn.js.map\n"]}
|
|
1
|
+
{"version":3,"sources":["MediaSession/SessionTurn.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","__importStar","mod","__esModule","result","k","call","__importDefault","defineProperty","exports","value","io","require","once_1","MediaConstants_1","TurnConstants_1","MediaTracer_1","MediaSessionBase_1","trace","getMediaTracer","TurnWebRtcSession","_super","sessionParams","sessionHandlers","streamFactory","_this","_sessionHandlers","_socket","_pendingPeersIce","iceServers","credentials","ice","map","item","urls","url","username","login","credential","password","_configuration","iceTransportPolicy","_joinResponseHandler","bind","_iceCandidateReceivedHandler","_sendOfferHandler","_sdpOfferHandler","_initiatorPeerReconnectHandler","_peerDisconnectedHandler","_onSocketDisconnectedHandler","get","_sessionParams","sessionId","enumerable","configurable","connect","connectOnly","info","_connectSocket","then","emit","SOCKET_EVENTS","OUTGOING","JOIN_ROOM","clientType","catch","error","disconnect","_disconnectInternal","MediaSessionDisconnectReason","ForcedByConsumer","Promise","resolve","reject","socket","SOCKET_RECONNECTION_DELAY","SOCKET_RECONNECTION_DELAY_MAX","SOCKET_RECONNECTION_ATTEMPTS","SOCKET_PATH","done","default","err","once","on","INCOMING","ERROR","SEND_OFFER","JOIN_RESPONSE","PEER_DISCONNECTED","SDP_OFFER","PUBLISHER_RECONNECT","ICE_CANDIDATE","reason","SignalingChannelDisconnect","undefined","sendOfferEventData","uid","peerId","peerConnection","_createPeerConnection","SessionClientType","GUEST","SessionClientRole","AGENT","offerParams","offerToReceiveAudio","offerToReceiveVideo","_sessionStreamsManager","getMediaStreamForRole","mediaStream","getTracks","forEach","track","addTrack","kind","createOffer","offerDesc","sdpOffer","sdp","setLocalDescription","_setPeerConnectionMonitor","e","warn","joinResponseData","sdpAnswer","_withPeerConnection","answer","RTCSessionDescription","type","setRemoteDescription","_processQueuedIceCandidates","peerDisconnectedEvent","_destroyPeerConnection","sdpOfferEvent","INITIATOR","USER","remoteDesc","createAnswer","SDP_ANSWER","InitiatorPeerReconnected","onMediaStreamDestroyed","clientRole","_peerConnections","PublishedStreamDestroyed","onMediaStreamRenewed","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","getStats","Error","off","setTimeout","onDisconnectedHandler","peerConnectionType","peerConnectionRole","RTCPeerConnection","peerType","remoteMediaTracks","peerRole","connectionTimoutPrt","onconnectionstatechange","connectionState","registerPeersRemoteTracks","oniceconnectionstatechange","state","currentTarget","iceConnectionState","cnState","clearTimeout","indexOf","_iceStateDisconnected","onicecandidate","event","candidate","ontrack","trackEvent","addRemoteTrackToPeer","set","_handlePeerConnectionTimeout","peerConnectivityTimeoutSeconds","PeerConnectionStateChangeTimeout","onicegatheringstatechange","unregisterPeersRemoteMediaTracks","delete","close","callback","iceCandidateData","remoteDescription","_queueIceCandidate","_addIceCandidateToPeer","iceCandidate","addIceCandidate","pendingIces","pendingIce","push","PeerConnectionInterrupted","MediaSessionBase"],"mappings":"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","file":"SessionTurn.js","sourcesContent":["\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar io = __importStar(require(\"socket.io-client\"));\nvar once_1 = __importDefault(require(\"lodash/once\"));\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar TurnConstants_1 = require(\"./TurnConstants\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar trace = MediaTracer_1.getMediaTracer('TurnWebRtcSession');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar TurnWebRtcSession = /** @class */ (function (_super) {\n __extends(TurnWebRtcSession, _super);\n function TurnWebRtcSession(sessionParams, sessionHandlers, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._sessionHandlers = sessionHandlers;\n _this._socket = null;\n _this._pendingPeersIce = {};\n var iceServers = sessionParams.credentials.ice.map(function (item) { return ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }); });\n _this._configuration = {\n iceServers: iceServers,\n iceTransportPolicy: 'relay'\n };\n _this._joinResponseHandler = _this._joinResponseHandler.bind(_this);\n _this._iceCandidateReceivedHandler = _this._iceCandidateReceivedHandler.bind(_this);\n _this._sendOfferHandler = _this._sendOfferHandler.bind(_this);\n _this._sdpOfferHandler = _this._sdpOfferHandler.bind(_this);\n _this._initiatorPeerReconnectHandler = _this._initiatorPeerReconnectHandler.bind(_this);\n _this._peerDisconnectedHandler = _this._peerDisconnectedHandler.bind(_this);\n _this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(TurnWebRtcSession.prototype, \"id\", {\n get: function () {\n return this._sessionParams.sessionId;\n },\n enumerable: true,\n configurable: true\n });\n //#region Socket Connectivity\n TurnWebRtcSession.prototype.connect = function (connectOnly) {\n var _this = this;\n if (connectOnly === void 0) { connectOnly = false; }\n trace.info('Connect to session');\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(function () {\n trace.info('Joining SessionId: ' + _this._sessionParams.sessionId);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: _this._sessionParams.clientType,\n sessionId: _this._sessionParams.sessionId\n });\n })\n .catch(function (error) {\n throw error;\n });\n };\n TurnWebRtcSession.prototype.disconnect = function () {\n return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);\n };\n TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var socket = _this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': TurnConstants_1.SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': TurnConstants_1.SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': TurnConstants_1.SOCKET_RECONNECTION_ATTEMPTS,\n 'path': TurnConstants_1.SOCKET_PATH\n });\n var done = once_1.default(function (err) {\n err ? reject(err) : resolve();\n });\n socket.once('connect', function () { return done(); });\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', _this._onSocketDisconnectedHandler);\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SEND_OFFER, _this._sendOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, _this._joinResponseHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, _this._peerDisconnectedHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.SDP_OFFER, _this._sdpOfferHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this._initiatorPeerReconnectHandler);\n socket.on(TurnConstants_1.SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, _this._iceCandidateReceivedHandler);\n }\n });\n };\n TurnWebRtcSession.prototype._onSocketDisconnectedHandler = function (reason) {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(function () { return undefined; });\n }\n }\n };\n //#endregion\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n // Received by Initiator, causing him to emit SDP_OFFER\n TurnWebRtcSession.prototype._sendOfferHandler = function (sendOfferEventData) {\n var _this = this;\n var uid = sendOfferEventData.uid, peerId = sendOfferEventData.peerId;\n trace.info('_sendOfferHandler');\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.GUEST, MediaConstants_1.SessionClientRole.AGENT);\n var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.AGENT)\n .then(function (mediaStream) {\n trace.info('_sendOfferHandler stream and peer created');\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () { return peerConnection.createOffer(offerParams); })\n .then(function (offerDesc) {\n trace.info('Initiator has created sdp offer', { offerDesc: offerDesc });\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n return peerConnection.setLocalDescription(offerDesc)\n .then(function () {\n trace.info('Local description was set on peerConnection', peerConnection);\n _this._setPeerConnectionMonitor(peerConnection);\n });\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n };\n // Received by the Initiator: Indicates that publish should be started\n TurnWebRtcSession.prototype._joinResponseHandler = function (joinResponseData) {\n var _this = this;\n var sdpAnswer = joinResponseData.sdpAnswer, uid = joinResponseData.uid, peerId = joinResponseData.peerId;\n trace.info('joinResponse Received', { sdpAnswer: sdpAnswer });\n this._withPeerConnection(peerId, function (peerConnection) {\n var answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n peerConnection.setRemoteDescription(answer)\n .then(function () {\n trace.info('Remote description was set', answer);\n _this._processQueuedIceCandidates(peerId);\n })\n .catch(function (e) {\n trace.warn('Error', e);\n });\n });\n };\n // Received by Initiator after a guests socket has been disconnected\n TurnWebRtcSession.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {\n var _this = this;\n var peerId = peerDisconnectedEvent.peerId;\n trace.info('_peerDisconnectedHandler');\n this._withPeerConnection(peerId, function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n //this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n };\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n // Received by Guest, causing him to emit SDP_ANSWER\n TurnWebRtcSession.prototype._sdpOfferHandler = function (sdpOfferEvent) {\n var _this = this;\n var sdpOffer = sdpOfferEvent.sdpOffer, peerId = sdpOfferEvent.peerId, uid = sdpOfferEvent.uid;\n trace.info('sdpOffer Received', { sdpOffer: sdpOffer });\n var peerConnection = this._createPeerConnection(peerId, MediaConstants_1.SessionClientType.INITIATOR, MediaConstants_1.SessionClientRole.USER);\n this._sessionStreamsManager.getMediaStreamForRole(MediaConstants_1.SessionClientRole.USER)\n .then(function (mediaStream) {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach(function (track) {\n peerConnection.addTrack(track, mediaStream);\n trace.info(\"Local \" + track.kind + \" track added to peer connection\");\n });\n }\n else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(function () {\n var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(function () {\n trace.info('Remote description was set', remoteDesc);\n return peerConnection.createAnswer()\n .then(function (sdpAnswer) {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid: uid,\n peerId: peerId,\n sessionId: _this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(function () {\n trace.info('_sdpOfferHandler local desc was set');\n _this._processQueuedIceCandidates(peerId);\n _this._setPeerConnectionMonitor(peerConnection);\n });\n });\n });\n })\n .catch(function (e) {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n };\n // Received by Guest after an Initiator reconnects to room\n TurnWebRtcSession.prototype._initiatorPeerReconnectHandler = function () {\n trace.info('_initiatorPeerReconnectHandler');\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.InitiatorPeerReconnected)\n .catch(function (error) {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n };\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n //#region Peer Connection\n //#region Streams Handling\n TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n this._peerConnections.forEach(function (peerConnection) {\n _this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(function () { return undefined; });\n });\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n if (peerConnectionOfTrack !== null) {\n return peerConnectionOfTrack.getStats(mediaTrack);\n }\n return Promise.reject(new Error('Provided track is not remote track'));\n };\n //#endregion\n TurnWebRtcSession.prototype._disconnectInternal = function (reason) {\n var _this = this;\n this._peerConnections.forEach(function (peerConnection) {\n _this._destroyPeerConnection(peerConnection);\n });\n if (this._socket) {\n trace.info('Disconnecting from session', reason);\n this._socket.off();\n this._socket.disconnect();\n this._socket = null;\n setTimeout(function () { return _this._sessionHandlers.onDisconnectedHandler(reason); });\n }\n return Promise.resolve();\n };\n TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {\n var _this = this;\n if (this._peerConnections.get(peerId)) {\n throw new Error(this._sessionParams.clientType + \" peer connection for \" + peerId + \" already exists\");\n }\n var peerConnection = new RTCPeerConnection(this._configuration);\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n peerConnection.connectionTimoutPrt = null;\n peerConnection.onconnectionstatechange = function () {\n trace.info('onconnectionstatechange', peerConnection);\n if (peerConnection.connectionState === 'connected') {\n _this.registerPeersRemoteTracks(peerConnection);\n }\n };\n peerConnection.oniceconnectionstatechange = function (state) {\n trace.info(\"ICE Connection state for peer \" + peerId + \" was changed to: \" + state.currentTarget.iceConnectionState, state);\n var cnState = state.currentTarget.iceConnectionState;\n clearTimeout(peerConnection.connectionTimoutPrt);\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n _this._iceStateDisconnected(peerConnection);\n }\n };\n peerConnection.onicecandidate = function (event) {\n if (event.candidate) {\n trace.info(_this._sessionParams.clientType + \" peerConn.onicecandidate\", event.candidate);\n _this._socket.emit(TurnConstants_1.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: _this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: _this._sessionParams.clientType\n });\n }\n else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n peerConnection.ontrack = function (trackEvent) {\n var track = trackEvent.track;\n trace.info(\"MediaStreamTrack arrived from peerConnection: \" + track.kind, track);\n _this.addRemoteTrackToPeer(peerConnection, track);\n if (peerConnection.connectionState === 'connected') {\n _this.registerPeersRemoteTracks(peerConnection);\n }\n };\n this._peerConnections.set(peerId, peerConnection);\n trace.info(peerConnectionType + \" peerConnection created\");\n return peerConnection;\n };\n TurnWebRtcSession.prototype._setPeerConnectionMonitor = function (peerConnection) {\n var _this = this;\n clearTimeout(peerConnection.connectionTimoutPrt);\n peerConnection.connectionTimoutPrt = setTimeout(function () {\n trace.info('PeerConnection ICE state timeout', peerConnection);\n _this._handlePeerConnectionTimeout(peerConnection);\n }, this._sessionParams.peerConnectivityTimeoutSeconds * 1000);\n };\n TurnWebRtcSession.prototype._handlePeerConnectionTimeout = function (peerConnection) {\n if (peerConnection.peerRole === MediaConstants_1.SessionClientRole.USER) {\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionStateChangeTimeout).catch(function () { return undefined; });\n }\n };\n TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n clearTimeout(peerConnection.connectionTimoutPrt);\n this.unregisterPeersRemoteMediaTracks(peerConnection).catch(function () { return undefined; });\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n };\n TurnWebRtcSession.prototype._withPeerConnection = function (peerId, callback) {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n return undefined;\n };\n //#endregion\n //#region ICE Candidates\n TurnWebRtcSession.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {\n var candidate = iceCandidateData.candidate, peerId = iceCandidateData.peerId;\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n return;\n }\n var peerConnection = this._peerConnections.get(peerId);\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n return;\n }\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(function () { return undefined; });\n };\n TurnWebRtcSession.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(function () {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch(function (e) {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n };\n TurnWebRtcSession.prototype._processQueuedIceCandidates = function (peerId) {\n var _this = this;\n this._withPeerConnection(peerId, function (peerConnection) {\n var pendingIces = _this._pendingPeersIce[peerId];\n if (pendingIces) {\n pendingIces.forEach(function (pendingIce) {\n trace.info('Adding pending ICE to peer connections');\n _this._addIceCandidateToPeer(pendingIce, peerConnection).catch(function () { return undefined; });\n });\n }\n else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n };\n TurnWebRtcSession.prototype._queueIceCandidate = function (iceCandidate, peerId) {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n this._pendingPeersIce[peerId].push(iceCandidate);\n };\n TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {\n this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () { return undefined; });\n };\n return TurnWebRtcSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.TurnWebRtcSession = TurnWebRtcSession;\n\n//# sourceMappingURL=SessionTurn.js.map\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@techsee/techsee-media-service",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"description": "Techsee Media Service Client",
|
|
5
5
|
"author": "TechSee - Alex Danilov",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@techsee/kurento-utils-temasys-mod": "6.6.3-dev-3",
|
|
19
|
-
"@techsee/techsee-common": "~0.18.
|
|
19
|
+
"@techsee/techsee-common": "~0.18.48",
|
|
20
20
|
"kurento-utils": "6.6.2",
|
|
21
21
|
"lodash": "4.13.1",
|
|
22
22
|
"socket.io-client": "2.1.1",
|