@techsee/techsee-media-service 0.5.11 → 0.6.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.
|
@@ -59,6 +59,8 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
59
59
|
_this._selfClientType = clientType;
|
|
60
60
|
_this._localStreamFactory = streamFactory;
|
|
61
61
|
|
|
62
|
+
_this._connectPromise = null;
|
|
63
|
+
|
|
62
64
|
var iceServers = credentials.ice.map(function (item) {
|
|
63
65
|
return {
|
|
64
66
|
urls: item.url,
|
|
@@ -90,32 +92,47 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
90
92
|
|
|
91
93
|
var connectOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
92
94
|
|
|
95
|
+
if (this._connectPromise) {
|
|
96
|
+
tracer.trace('already connecting');
|
|
97
|
+
|
|
98
|
+
return this._connectPromise;
|
|
99
|
+
}
|
|
100
|
+
|
|
93
101
|
tracer.trace('connect');
|
|
94
102
|
|
|
95
|
-
|
|
103
|
+
this._connectPromise = this._connectSocket(this._credentials.url, connectOnly).then(function () {
|
|
96
104
|
tracer.trace('Joining SessionId: ' + _this2._credentials.sessionId);
|
|
97
105
|
|
|
98
106
|
_this2._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {
|
|
99
107
|
clientType: _this2._selfClientType,
|
|
100
108
|
sessionId: _this2._credentials.sessionId
|
|
101
109
|
});
|
|
110
|
+
|
|
111
|
+
_this2._connectPromise = null;
|
|
102
112
|
}).catch(function (error) {
|
|
113
|
+
setTimeout(function () {
|
|
114
|
+
return _this2._connectPromise = null;
|
|
115
|
+
});
|
|
103
116
|
_this2.emit(_session.SESSION_EVENTS.EXCEPTION, { source: 'connect', error: error });
|
|
104
117
|
throw error;
|
|
105
118
|
});
|
|
119
|
+
|
|
120
|
+
return this._connectPromise;
|
|
106
121
|
};
|
|
107
122
|
|
|
108
123
|
TurnWebRtcSessionV2.prototype.disconnect = function disconnect() {
|
|
109
124
|
var _this3 = this;
|
|
110
125
|
|
|
126
|
+
tracer.trace('Disconnecting from media session');
|
|
127
|
+
|
|
111
128
|
this._peerConnections.forEach(function (peerConnection) {
|
|
112
129
|
_this3._destroyPeerConnection(peerConnection);
|
|
113
130
|
});
|
|
114
131
|
|
|
115
|
-
this.emit(_session.SESSION_EVENTS.DISCONNECTED, { reason: 'disconnected' });
|
|
116
|
-
|
|
117
132
|
this._socket.off();
|
|
118
133
|
this._socket.disconnect();
|
|
134
|
+
|
|
135
|
+
this.emit(_session.SESSION_EVENTS.DISCONNECTED, { reason: 'disconnected' });
|
|
119
136
|
};
|
|
120
137
|
|
|
121
138
|
TurnWebRtcSessionV2.prototype._connectSocket = function _connectSocket(url, connectOnly) {
|
|
@@ -141,6 +158,24 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
141
158
|
socket.on('connect_error', done);
|
|
142
159
|
socket.on('connect_timeout', done);
|
|
143
160
|
|
|
161
|
+
socket.on('reconnect_attempt', function (args) {
|
|
162
|
+
tracer.trace('Session Socket reconnect_attempt', args);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
socket.on('reconnecting', function (args) {
|
|
166
|
+
tracer.trace('Session Socket reconnecting', args);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
socket.on('disconnect', function (reason) {
|
|
170
|
+
tracer.trace('Session Socket disconnected, reason:', reason);
|
|
171
|
+
// The initial example of differentiating between "forced" disconnect and "network" disconnect is taken from:
|
|
172
|
+
// https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99
|
|
173
|
+
//if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {
|
|
174
|
+
// the disconnection was initiated by the server or by client, you need to call (connect) manually
|
|
175
|
+
_this4.disconnect();
|
|
176
|
+
//}
|
|
177
|
+
});
|
|
178
|
+
|
|
144
179
|
if (!connectOnly) {
|
|
145
180
|
//PUBLISHING NOT SUPPORTED YET
|
|
146
181
|
//socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);
|
|
@@ -358,8 +393,20 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
358
393
|
|
|
359
394
|
peerConnection.oniceconnectionstatechange = function (state) {
|
|
360
395
|
tracer.trace('ICE Connection state for peer ' + peerId + ' was changed to: ' + state.currentTarget.iceConnectionState, state);
|
|
361
|
-
|
|
362
|
-
|
|
396
|
+
var cnnState = state.currentTarget.iceConnectionState;
|
|
397
|
+
|
|
398
|
+
if (cnnState === 'disconnected') {
|
|
399
|
+
//According to https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState
|
|
400
|
+
//Connection can become active again, so we will do nothing.
|
|
401
|
+
// if (peerConnection.peerType === CLIENT_TYPES.INITIATOR) {
|
|
402
|
+
// //this._destroyPeerConnection(peerConnection);
|
|
403
|
+
// this.disconnect();
|
|
404
|
+
// }
|
|
405
|
+
} else if (cnnState === 'failed' || cnnState === 'closed') {
|
|
406
|
+
//According to https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState
|
|
407
|
+
//When iceConnectionState is failed or closed, the peer connection can be destroyed.
|
|
408
|
+
//In our case, we disconnecting from media session, and when session will be needed again, it will be connected.
|
|
409
|
+
_this8.disconnect();
|
|
363
410
|
}
|
|
364
411
|
};
|
|
365
412
|
|
|
@@ -530,12 +577,6 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
530
577
|
this._pendingPeersIce[peerId].push(iceCandidate);
|
|
531
578
|
};
|
|
532
579
|
|
|
533
|
-
TurnWebRtcSessionV2.prototype._iceStateDisconnected = function _iceStateDisconnected(peerConnection) {
|
|
534
|
-
if (peerConnection.peerType === _constants.CLIENT_TYPES.INITIATOR) {
|
|
535
|
-
this._destroyPeerConnection(peerConnection);
|
|
536
|
-
}
|
|
537
|
-
};
|
|
538
|
-
|
|
539
580
|
//#endregion
|
|
540
581
|
|
|
541
582
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webrtc/session-turn.v2.js"],"names":["io","tracer","TurnWebRtcSessionV2","_credentials","sessionId","credentials","constraints","clientType","streamFactory","_socket","_localPeer","_pendingPeersIce","_peerConnections","Map","_constraints","_selfClientType","_localStreamFactory","iceServers","ice","map","item","urls","url","username","login","credential","password","_configuration","iceTransportPolicy","_joinResponseHandler","bind","_iceCandidateReceivedHandler","_sendOfferHandler","_sdpOfferHandler","_initiatorReconnectHandler","_peerDisconnectedHandler","_extendPeerConnection","connect","connectOnly","trace","_connectSocket","then","emit","SOCKET_EVENTS","OUTGOING","JOIN_ROOM","catch","error","SESSION_EVENTS","EXCEPTION","source","disconnect","forEach","peerConnection","_destroyPeerConnection","DISCONNECTED","reason","off","Promise","resolve","reject","socket","SOCKET_RECONNECTION_DELAY","SOCKET_RECONNECTION_DELAY_MAX","SOCKET_RECONNECTION_ATTEMPTS","SOCKET_PATH","done","_","once","err","on","INCOMING","ERROR","SDP_OFFER","PUBLISHER_RECONNECT","ICE_CANDIDATE","uid","peerId","_createPeerConnection","CLIENT_TYPES","GUEST","offerParams","offerToReceiveAudio","offerToReceiveVideo","localStream","peerConnectionStream","TsWebRTCStream","clone","DEFAULT_STREAM_NAMES","MOBILE_CLIENT_VIDEO_STREAM","getTracks","track","addTrack","_mediaStream","registerStream","id","createOffer","offerDesc","sdpOffer","sdp","setLocalDescription","e","sdpAnswer","_withPeerConnection","answer","RTCSessionDescription","type","setRemoteDescription","_processQueuedIceCandidates","INITIATOR","subscriberInitChain","audio","kind","stream","MediaStream","streamName","DASHBOARD_AUDIO_STREAM","agentAudioStream","peerLogicalStream","remoteDesc","createAnswer","SDP_ANSWER","initiatorPeer","_getInitiatorPeer","RECONNECT_TURN_SERVER","peer","_getPeerConnectionsByType","length","peerConnectionType","get","Error","RTCPeerConnection","peerType","oniceconnectionstatechange","state","currentTarget","iceConnectionState","_iceStateDisconnected","onicecandidate","event","candidate","ontrack","trackEvent","streams","tsStream","remote","STREAM_CREATED","set","_getRemoteStreams","unregisterStream","STREAM_DESTROYED","size","delete","close","result","push","callback","prototype","remoteDescription","_queueIceCandidate","_addIceCandidateToPeer","iceCandidate","addIceCandidate","pendingIces","pendingIce","TsMediaSession"],"mappings":";;;;;;;AAAA;;AACA;;IAAYA,E;;AACZ;;AAQA;;AAEA;;;;;;;;;;AAEA,IAAMC,SAAS,wBAAf;;AAEA;;IACaC,mB,WAAAA,mB;;;;;4BACA;AACL,mBAAO,KAAKC,YAAL,CAAkBC,SAAzB;AACH;;;AAED,uCAAmE;AAAA,YAAtDC,WAAsD,QAAtDA,WAAsD;AAAA,YAAzCC,WAAyC,QAAzCA,WAAyC;AAAA,YAA5BC,UAA4B,QAA5BA,UAA4B;AAAA,YAAhBC,aAAgB,QAAhBA,aAAgB;;AAAA;;AAAA,qDAC/D,0BAD+D;;AAG/D,cAAKC,OAAL,GAAe,IAAf;AACA,cAAKC,UAAL,GAAkB,IAAlB;AACA,cAAKC,gBAAL,GAAwB,EAAxB;AACA,cAAKC,gBAAL,GAAwB,IAAIC,GAAJ,EAAxB;;AAEA,cAAKV,YAAL,GAAoBE,WAApB;AACA,cAAKS,YAAL,GAAoBR,WAApB;AACA,cAAKS,eAAL,GAAuBR,UAAvB;AACA,cAAKS,mBAAL,GAA2BR,aAA3B;;AAEA,YAAMS,aAAaZ,YAAYa,GAAZ,CAAgBC,GAAhB,CAAoB,UAACC,IAAD;AAAA,mBAAW;AAC9CC,sBAAMD,KAAKE,GADmC;AAE9CC,0BAAUH,KAAKI,KAF+B;AAG9CC,4BAAYL,KAAKM;AAH6B,aAAX;AAAA,SAApB,CAAnB;;AAMA,cAAKC,cAAL,GAAsB;AAClBV,kCADkB;AAElBW,gCAAoB;AAFF,SAAtB;;AAKA,cAAKC,oBAAL,GAA4B,MAAKA,oBAAL,CAA0BC,IAA1B,OAA5B;AACA,cAAKC,4BAAL,GAAoC,MAAKA,4BAAL,CAAkCD,IAAlC,OAApC;AACA,cAAKE,iBAAL,GAAyB,MAAKA,iBAAL,CAAuBF,IAAvB,OAAzB;AACA,cAAKG,gBAAL,GAAwB,MAAKA,gBAAL,CAAsBH,IAAtB,OAAxB;AACA,cAAKI,0BAAL,GAAkC,MAAKA,0BAAL,CAAgCJ,IAAhC,OAAlC;AACA,cAAKK,wBAAL,GAAgC,MAAKA,wBAAL,CAA8BL,IAA9B,OAAhC;;AAEA,cAAKM,qBAAL;AA/B+D;AAgClE;;AAED;;kCAEAC,O,sBAA6B;AAAA;;AAAA,YAArBC,WAAqB,uEAAP,KAAO;;AACzBrC,eAAOsC,KAAP,CAAa,SAAb;;AAEA,eAAO,KAAKC,cAAL,CAAoB,KAAKrC,YAAL,CAAkBmB,GAAtC,EAA2CgB,WAA3C,EACFG,IADE,CACG,YAAM;AACRxC,mBAAOsC,KAAP,CAAa,wBAAwB,OAAKpC,YAAL,CAAkBC,SAAvD;;AAEA,mBAAKK,OAAL,CAAaiC,IAAb,CAAkBC,yBAAcC,QAAd,CAAuBC,SAAzC,EAAoD;AAChDtC,4BAAY,OAAKQ,eAD+B;AAEhDX,2BAAW,OAAKD,YAAL,CAAkBC;AAFmB,aAApD;AAIH,SARE,EASF0C,KATE,CASI,UAACC,KAAD,EAAW;AACd,mBAAKL,IAAL,CAAUM,wBAAeC,SAAzB,EAAoC,EAACC,QAAQ,SAAT,EAAoBH,YAApB,EAApC;AACA,kBAAMA,KAAN;AACH,SAZE,CAAP;AAaH,K;;kCAEDI,U,yBAAa;AAAA;;AACT,aAAKvC,gBAAL,CAAsBwC,OAAtB,CAA8B,UAACC,cAAD,EAAoB;AAC9C,mBAAKC,sBAAL,CAA4BD,cAA5B;AACH,SAFD;;AAIA,aAAKX,IAAL,CAAUM,wBAAeO,YAAzB,EAAuC,EAACC,QAAQ,cAAT,EAAvC;;AAEA,aAAK/C,OAAL,CAAagD,GAAb;AACA,aAAKhD,OAAL,CAAa0C,UAAb;AACH,K;;kCAEDX,c,2BAAelB,G,EAAKgB,W,EAAa;AAAA;;AAC7B,eAAO,IAAIoB,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACpC,gBAAMC,SAAS,OAAKpD,OAAL,GAAeT,GAAGqC,OAAH,CAAWf,GAAX,EAAgB;AAC1C,4BAAY,IAD8B;AAE1C,qCAAqBwC,oCAFqB;AAG1C,wCAAwBC,wCAHkB;AAI1C,wCAAwBC,uCAJkB;AAK1C,wBAAQC;AALkC,aAAhB,CAA9B;;AAQA,gBAAMC,OAAOC,EAAEC,IAAF,CAAO,UAACC,GAAD,EAAS;AACzBA,sBAAMT,OAAOS,GAAP,CAAN,GAAoBV,SAApB;AACH,aAFY,CAAb;;AAIAE,mBAAOO,IAAP,CAAY,SAAZ,EAAuB;AAAA,uBAAMF,MAAN;AAAA,aAAvB;AACAL,mBAAOS,EAAP,CAAU3B,yBAAc4B,QAAd,CAAuBC,KAAjC,EAAwCN,IAAxC;AACAL,mBAAOS,EAAP,CAAU,eAAV,EAA2BJ,IAA3B;AACAL,mBAAOS,EAAP,CAAU,iBAAV,EAA6BJ,IAA7B;;AAEA,gBAAI,CAAC5B,WAAL,EAAkB;AACd;AACA;AACA;AACA;;AAEAuB,uBAAOS,EAAP,CAAU3B,yBAAc4B,QAAd,CAAuBE,SAAjC,EAA4C,OAAKxC,gBAAjD;AACA4B,uBAAOS,EAAP,CAAU3B,yBAAc4B,QAAd,CAAuBG,mBAAjC,EAAsD,OAAKxC,0BAA3D;;AAEA2B,uBAAOS,EAAP,CAAU3B,yBAAc4B,QAAd,CAAuBI,aAAjC,EAAgD,OAAK5C,4BAArD;AACH;AACJ,SA7BM,CAAP;AA8BH,K;;AAED;;AAEA;;AAEA;;;kCACAC,iB,qCAAiC;AAAA;;AAAA,YAAd4C,GAAc,SAAdA,GAAc;AAAA,YAATC,MAAS,SAATA,MAAS;;AAC7B5E,eAAOsC,KAAP,CAAa,mBAAb;;AAEA,YAAMc,iBAAiB,KAAKyB,qBAAL,CAA2BD,MAA3B,EAAmCE,wBAAaC,KAAhD,CAAvB;AACA,YAAMC,cAAc,EAACC,qBAAqB,IAAtB,EAA4BC,qBAAqB,IAAjD,EAApB;;AAEA,aAAKnE,mBAAL,CAAyB,KAAKF,YAA9B,EACK2B,IADL,CACU,UAAC2C,WAAD,EAAiB;AACnBnF,mBAAOsC,KAAP,CAAa,2CAAb;;AAEA,gBAAM8C,uBAAuB,IAAIC,sBAAJ,CAAmB,MAAnB,EAAyBF,YAAYG,KAAZ,EAAzB,EAA8CC,gCAAqBC,0BAAnE,EAA+F,KAA/F,CAA7B;;AAEAJ,iCAAqBhC,cAArB,GAAsCA,cAAtC;;AAEA+B,wBAAYM,SAAZ,GAAwBtC,OAAxB,CAAgC,UAACuC,KAAD,EAAW;AACvC1F,uBAAOsC,KAAP,CAAa,wCAAb;AACAc,+BAAeuC,QAAf,CAAwBD,KAAxB,EAA+BN,qBAAqBQ,YAApD;AACH,aAHD;;AAKA,mBAAKC,cAAL,CAAoBT,qBAAqBU,EAAzC,EAA6CV,oBAA7C;AACH,SAdL,EAeK5C,IAfL,CAeU;AAAA,mBAAMY,eAAe2C,WAAf,CAA2Bf,WAA3B,CAAN;AAAA,SAfV,EAgBKxC,IAhBL,CAgBU,UAACwD,SAAD,EAAe;AACjBhG,mBAAOsC,KAAP,CAAa,iCAAb,EAAgD,EAAC0D,oBAAD,EAAhD;;AAEA,mBAAKxF,OAAL,CAAaiC,IAAb,CAAkBC,yBAAcC,QAAd,CAAuB6B,SAAzC,EAAoD;AAChDG,wBADgD;AAEhDC,8BAFgD;AAGhDzE,2BAAW,OAAKD,YAAL,CAAkBC,SAHmB;AAIhD8F,0BAAUD,UAAUE;AAJ4B,aAApD;;AAOA,mBAAO9C,eAAe+C,mBAAf,CAAmCH,SAAnC,EACFxD,IADE,CACG,YAAM;AACRxC,uBAAOsC,KAAP,CAAa,8BAAb;AACH,aAHE,CAAP;AAIH,SA9BL,EA+BKO,KA/BL,CA+BW,UAACuD,CAAD,EAAO;AACVpG,mBAAOsC,KAAP,CAAa,OAAb,EAAsB8D,CAAtB;AACH,SAjCL;AAkCH,K;;AAED;;;kCACAxE,oB,wCAA+C;AAAA;;AAAA,YAAzByE,SAAyB,SAAzBA,SAAyB;AAAA,YAAd1B,GAAc,SAAdA,GAAc;AAAA,YAATC,MAAS,SAATA,MAAS;;AAC3C5E,eAAOsC,KAAP,CAAa,uBAAb,EAAsC+D,SAAtC;;AAEA,aAAKC,mBAAL,CAAyB1B,MAAzB,EAAiC,UAACxB,cAAD,EAAoB;AACjD,gBAAMmD,SAAS,IAAIC,qBAAJ,CAA0B;AACrCC,sBAAM,QAD+B;AAErCP,qBAAKG;AAFgC,aAA1B,CAAf;;AAKAjD,2BAAesD,oBAAf,CAAoCH,MAApC,EACK/D,IADL,CACU,YAAM;AACRxC,uBAAOsC,KAAP,CAAa,4BAAb,EAA2CiE,MAA3C;;AAEA,uBAAKI,2BAAL,CAAiC/B,MAAjC;AACH,aALL,EAMK/B,KANL,CAMW,UAACuD,CAAD,EAAO;AACVpG,uBAAOsC,KAAP,CAAa,OAAb,EAAsB8D,CAAtB;AACH,aARL;AASH,SAfD;AAgBH,K;;AAED;;;kCACAlE,wB,4CAAmC;AAAA,YAAT0C,MAAS,SAATA,MAAS;;AAC/B5E,eAAOsC,KAAP,CAAa,0BAAb;AACH,K;;AAED;;AAEA;;AAEA;;;kCACAN,gB,oCAA0C;AAAA;;AAAA,YAAxBiE,QAAwB,SAAxBA,QAAwB;AAAA,YAAdrB,MAAc,SAAdA,MAAc;AAAA,YAAND,GAAM,SAANA,GAAM;;AACtC3E,eAAOsC,KAAP,CAAa,mBAAb,EAAkC,EAAC2D,kBAAD,EAAlC;;AAEA,YAAM7C,iBAAiB,KAAKyB,qBAAL,CAA2BD,MAA3B,EAAmCE,wBAAa8B,SAAhD,CAAvB;;AAEA,YAAIC,sBAAsBpD,QAAQC,OAAR,EAA1B;;AAEA,YAAI,KAAK7C,YAAL,CAAkBiG,KAAtB,EAA6B;AACzBD,kCAAsBA,oBAAoBrE,IAApB,CAAyB,YAAM;AACjDxC,uBAAOsC,KAAP,CAAa,8BAAb;;AAEA,uBAAO,OAAKvB,mBAAL,CAAyB,OAAKF,YAA9B,EACF2B,IADE,CACG,UAAC2C,WAAD,EAAiB;AACnBA,gCAAYM,SAAZ,GAAwBtC,OAAxB,CAAgC,UAACuC,KAAD,EAAW;AACvC1F,+BAAOsC,KAAP,CAAa,wCAAb;;AAEA,4BAAIoD,MAAMqB,IAAN,KAAe,OAAnB,EAA4B;;AAExB,gCAAMC,SAAS,IAAIC,WAAJ,CAAgB,CAACvB,KAAD,CAAhB,CAAf;AACA,gCAAMwB,aAAa3B,gCAAqB4B,sBAAxC;AACA,gCAAMC,mBAAmB,IAAI/B,sBAAJ,CAAmB,MAAnB,EAAyB2B,MAAzB,EAAiCE,UAAjC,EAA6C,KAA7C,CAAzB;;AAEA,mCAAKrB,cAAL,CAAoBuB,iBAAiBtB,EAArC,EAAyCsB,gBAAzC;AACAhE,2CAAeuC,QAAf,CAAwBD,KAAxB,EAA+BtC,eAAeiE,iBAA9C;;AAEArH,mCAAOsC,KAAP,CAAa,4CAAb;AACH;AACJ,qBAdD;AAeH,iBAjBE,CAAP;AAkBH,aArBqB,CAAtB;AAsBH;;AAEDuE,4BAAoBrE,IAApB,CAAyB,YAAM;AAC3B,gBAAM8E,aAAa,IAAId,qBAAJ,CAA0B,EAACC,MAAM,OAAP,EAAgBP,KAAKD,QAArB,EAA1B,CAAnB;;AAEA,mBAAO7C,eAAesD,oBAAf,CAAoCY,UAApC,EACF9E,IADE,CACG,YAAM;AACRxC,uBAAOsC,KAAP,CAAa,4BAAb,EAA2CgF,UAA3C;;AAEA,uBAAOlE,eAAemE,YAAf,GACF/E,IADE,CACG,UAAC6D,SAAD,EAAe;AACjBrG,2BAAOsC,KAAP,CAAa,iCAAb,EAAgD+D,SAAhD;;AAEA,2BAAK7F,OAAL,CAAaiC,IAAb,CAAkBC,yBAAcC,QAAd,CAAuB6E,UAAzC,EAAqD;AACjD7C,gCADiD;AAEjDC,sCAFiD;AAGjDzE,mCAAW,OAAKD,YAAL,CAAkBC,SAHoB;AAIjDkG,mCAAWA,UAAUH;AAJ4B,qBAArD;;AAOA,2BAAO9C,eAAe+C,mBAAf,CAAmCE,SAAnC,EACF7D,IADE,CACG,YAAM;AACRxC,+BAAOsC,KAAP,CAAa,qCAAb;;AAEA,+BAAKqE,2BAAL,CAAiC/B,MAAjC;AACH,qBALE,CAAP;AAMH,iBAjBE,CAAP;AAkBH,aAtBE,CAAP;AAwBH,SA3BD;;AA6BA,eAAOiC,oBAAoBhE,KAApB,CAA0B,UAACuD,CAAD,EAAO;AACpCpG,mBAAOsC,KAAP,CAAa,2BAAb,EAA0C8D,CAA1C;AACA,kBAAMA,CAAN;AACH,SAHM,CAAP;AAIH,K;;AAED;;;kCACAnE,0B,yCAA6B;AACzBjC,eAAOsC,KAAP,CAAa,4BAAb;;AAEA,YAAMmF,gBAAgB,KAAKC,iBAAL,EAAtB;;AAEA,YAAID,aAAJ,EAAmB;AACf,iBAAKpE,sBAAL,CAA4BoE,aAA5B;AACH;;AAED,aAAKhF,IAAL,CAAUM,wBAAe4E,qBAAzB;AACH,K;;kCAEDD,iB,gCAAoB;AAChB,YAAME,OAAO,KAAKC,yBAAL,CAA+B/C,wBAAa8B,SAA5C,CAAb;;AAEA,eAAOgB,KAAKE,MAAL,GAAc,CAAd,GAAkBF,KAAK,CAAL,CAAlB,GAA4B,IAAnC;AACH,K;;AAED;;AAEA;;kCAEA/C,qB,kCAAsBD,M,EAAQmD,kB,EAAoB;AAAA;;AAC9C,YAAI,KAAKpH,gBAAL,CAAsBqH,GAAtB,CAA0BpD,MAA1B,CAAJ,EAAuC;AACnC,kBAAM,IAAIqD,KAAJ,CAAa,KAAKnH,eAAlB,6BAAyD8D,MAAzD,qBAAN;AACH;;AAED,YAAMxB,iBAAiB,IAAI8E,iBAAJ,CAAsB,KAAKxG,cAA3B,CAAvB;;AAEA0B,uBAAewB,MAAf,GAAwBA,MAAxB;AACAxB,uBAAe+E,QAAf,GAA0BJ,kBAA1B;AACA3E,uBAAeiE,iBAAf,GAAmC,IAAIJ,WAAJ,EAAnC;;AAEA7D,uBAAegF,0BAAf,GAA4C,UAACC,KAAD,EAAW;AACnDrI,mBAAOsC,KAAP,oCAA8CsC,MAA9C,yBAAwEyD,MAAMC,aAAN,CAAoBC,kBAA5F,EAAkHF,KAAlH;AACA,gBAAIA,MAAMC,aAAN,CAAoBC,kBAApB,KAA2C,cAA/C,EAA+D;AAC3D,uBAAKC,qBAAL,CAA2BpF,cAA3B;AACH;AACJ,SALD;;AAOAA,uBAAeqF,cAAf,GAAgC,UAACC,KAAD,EAAW;AACvC,gBAAIA,MAAMC,SAAV,EAAqB;AACjB3I,uBAAOsC,KAAP,CAAgB,OAAKxB,eAArB,+BAAgE4H,MAAMC,SAAtE;AACA,uBAAKnI,OAAL,CAAaiC,IAAb,CAAkBC,yBAAcC,QAAd,CAAuB+B,aAAzC,EAAwD;AACpDvE,+BAAW,OAAKD,YAAL,CAAkBC,SADuB;AAEpDyE,4BAAQA,MAF4C;AAGpD+D,+BAAWD,MAAMC,SAHmC;AAIpDrI,gCAAY,OAAKQ;AAJmC,iBAAxD;AAMH,aARD,MAQO;AACHd,uBAAOsC,KAAP,CAAa,yCAAb,EAAwDoG,KAAxD;AACH;AACJ,SAZD;;AAcA,YAAI,KAAK5H,eAAL,KAAyBgE,wBAAaC,KAA1C,EAAiD;AAC7C3B,2BAAewF,OAAf,GAAyB,UAACC,UAAD,EAAgB;AAAA,oBAC9BnD,KAD8B,GACZmD,UADY,CAC9BnD,KAD8B;AAAA,oBACvBoD,OADuB,GACZD,UADY,CACvBC,OADuB;;;AAGrC9I,uBAAOsC,KAAP,iDAA2DoD,MAAMqB,IAAjE,EAAyErB,KAAzE,EAAgFoD,QAAQhB,MAAR,GAAiB,CAAjB,GAAqBgB,QAAQ,CAAR,CAArB,GAAkC,WAAlH;;AAEA,oBAAMC,WAAW,IAAI1D,sBAAJ,CAAmB,MAAnB,EAAyB,IAAI4B,WAAJ,CAAgB,CAACvB,KAAD,CAAhB,CAAzB,CAAjB;;AAEAqD,yBAAS3F,cAAT,GAA0BA,cAA1B;AACA2F,yBAASC,MAAT,GAAkB,IAAlB;;AAEA,uBAAKnD,cAAL,CAAoBkD,SAASjD,EAA7B,EAAiCiD,QAAjC;;AAEA,uBAAKtG,IAAL,CAAUM,wBAAekG,cAAzB,EAAyCF,QAAzC;AACH,aAbD;AAcH;;AAED,aAAKpI,gBAAL,CAAsBuI,GAAtB,CAA0BtE,MAA1B,EAAkCxB,cAAlC;;AAEApD,eAAOsC,KAAP,CAAgB,KAAKxB,eAArB;;AAEA,eAAOsC,cAAP;AACH,K;;kCAEDC,sB,mCAAuBD,c,EAAgB;AAAA;;AACnC,YAAI,KAAKtC,eAAL,KAAyBgE,wBAAaC,KAA1C,EAAiD;AAC7C,iBAAKoE,iBAAL,CAAuB/F,cAAvB,EAAuCD,OAAvC,CAA+C,UAAC6D,MAAD,EAAY;AACvD,uBAAKoC,gBAAL,CAAsBpC,OAAOlB,EAA7B;AACA,uBAAKrD,IAAL,CAAUM,wBAAesG,gBAAzB,EAA2C,EAACrC,cAAD,EAA3C;AACH,aAHD;AAIH;;AAED,YAAI,KAAKlG,eAAL,KAAyBgE,wBAAa8B,SAAtC,IAAmD,KAAKjG,gBAAL,CAAsB2I,IAAtB,KAA+B,CAAtF,EAAyF;AACrF;AACH;;AAED,aAAK3I,gBAAL,CAAsB4I,MAAtB,CAA6BnG,eAAewB,MAA5C;AACAxB,uBAAeoG,KAAf;AACH,K;;kCAEDL,iB,8BAAkB/F,c,EAAgB;AAC9B,YAAMqG,SAAS,EAAf;;AAEA,aAAKX,OAAL,CAAa3F,OAAb,CAAqB,UAAC6D,MAAD,EAAY;AAC7B,gBAAIA,OAAO5D,cAAP,KAA0BA,cAA1B,IAA4C4D,OAAOgC,MAAvD,EAA+D;AAC3DS,uBAAOC,IAAP,CAAY1C,MAAZ;AACH;AACJ,SAJD;;AAMA,eAAOyC,MAAP;AACH,K;;kCAED5B,yB,sCAA0BM,Q,EAAU;AAChC,YAAMsB,SAAS,EAAf;;AAEA,aAAK9I,gBAAL,CAAsBwC,OAAtB,CAA8B,UAACC,cAAD,EAAoB;AAC9C,gBAAIA,eAAe+E,QAAf,KAA4BA,QAAhC,EAA0C;AACtCsB,uBAAOC,IAAP,CAAYtG,cAAZ;AACH;AACJ,SAJD;;AAMA,eAAOqG,MAAP;AACH,K;;kCAEDnD,mB,gCAAoB1B,M,EAAQ+E,Q,EAAU;AAClC,YAAI,KAAKhJ,gBAAL,CAAsBqH,GAAtB,CAA0BpD,MAA1B,CAAJ,EAAuC;AACnC,mBAAO+E,SAAS,KAAKhJ,gBAAL,CAAsBqH,GAAtB,CAA0BpD,MAA1B,CAAT,CAAP;AACH;;AAED,eAAO,IAAP;AACH,K;;kCAEDzC,qB,oCAAwB;AACpB;;AAEA,YAAI,CAAC+F,kBAAkB0B,SAAlB,CAA4BhF,MAAjC,EAAyC;AACrCsD,8BAAkB0B,SAAlB,CAA4BhF,MAA5B,GAAqC,EAArC;AACH;;AAED,YAAI,CAACsD,kBAAkB0B,SAAlB,CAA4BzB,QAAjC,EAA2C;AACvCD,8BAAkB0B,SAAlB,CAA4BzB,QAA5B,GAAuC,IAAvC;AACH;;AAED,YAAI,CAACD,kBAAkB0B,SAAlB,CAA4BvC,iBAAjC,EAAoD;AAChDa,8BAAkB0B,SAAlB,CAA4BvC,iBAA5B,GAAgD,IAAhD;AACH;AACJ,K;;AAED;;AAEA;;kCAEAvF,4B,gDAAkD;AAAA,YAApB6G,SAAoB,SAApBA,SAAoB;AAAA,YAAT/D,MAAS,SAATA,MAAS;;AAC9C5E,eAAOsC,KAAP,CAAa,8BAAb,EAA6CqG,SAA7C;AACA,YAAI,CAACA,SAAL,EAAgB;AACZ3I,mBAAOsC,KAAP,CAAa,iBAAb;;AAEA;AACH;;AAED,YAAMc,iBAAiB,KAAKzC,gBAAL,CAAsBqH,GAAtB,CAA0BpD,MAA1B,CAAvB;;AAEA,YAAI,CAACxB,cAAD,IAAmB,CAACA,eAAeyG,iBAAvC,EAA0D;AACtD7J,mBAAOsC,KAAP,CAAa,uBAAb,EAAsCqG,SAAtC;AACA,iBAAKmB,kBAAL,CAAwBnB,SAAxB,EAAmC/D,MAAnC;;AAEA;AACH;;AAED5E,eAAOsC,KAAP,CAAa,2BAAb,EAA0CqG,SAA1C;AACA,aAAKoB,sBAAL,CAA4BpB,SAA5B,EAAuCvF,cAAvC;AACH,K;;kCAED2G,sB,mCAAuBC,Y,EAAc5G,c,EAAgB;AACjD,eAAOA,eAAe6G,eAAf,CAA+BD,YAA/B,EACFxH,IADE,CACG,YAAM;AACRxC,mBAAOsC,KAAP,CAAa,sCAAb;AACH,SAHE,EAIFO,KAJE,CAII,UAACuD,CAAD,EAAO;AACVpG,mBAAOsC,KAAP,CAAa,+CAAb,EAA8D8D,CAA9D;AACH,SANE,CAAP;AAOH,K;;kCAEDO,2B,wCAA4B/B,M,EAAQ;AAAA;;AAChC,aAAK0B,mBAAL,CAAyB1B,MAAzB,EAAiC,UAACxB,cAAD,EAAoB;AACjD,gBAAM8G,cAAc,QAAKxJ,gBAAL,CAAsBkE,MAAtB,CAApB;;AAEA,gBAAIsF,WAAJ,EAAiB;AACbA,4BAAY/G,OAAZ,CAAoB,UAACgH,UAAD,EAAgB;AAChCnK,2BAAOsC,KAAP,CAAa,wCAAb;AACA,4BAAKyH,sBAAL,CAA4BI,UAA5B,EAAwC/G,cAAxC;AACH,iBAHD;AAIH,aALD,MAKO;AACHpD,uBAAOsC,KAAP,CAAa,+BAAb,EAA8CsC,MAA9C;AACH;AACJ,SAXD;AAYH,K;;kCAEDkF,kB,+BAAmBE,Y,EAAcpF,M,EAAQ;AACrC,YAAI,CAAC,KAAKlE,gBAAL,CAAsBkE,MAAtB,CAAL,EAAoC;AAChC,iBAAKlE,gBAAL,CAAsBkE,MAAtB,IAAgC,EAAhC;AACH;;AAED,aAAKlE,gBAAL,CAAsBkE,MAAtB,EAA8B8E,IAA9B,CAAmCM,YAAnC;AACH,K;;kCAEDxB,qB,kCAAsBpF,c,EAAgB;AAClC,YAAIA,eAAe+E,QAAf,KAA4BrD,wBAAa8B,SAA7C,EAAwD;AACpD,iBAAKvD,sBAAL,CAA4BD,cAA5B;AACH;AACJ,K;;AAED;;;;EAxcqCgH,uB","file":"session-turn.v2.js","sourcesContent":["import {SESSION_EVENTS, TsMediaSession} from '../session';\nimport * as io from 'socket.io-client';\nimport {\n CLIENT_TYPES, DEFAULT_STREAM_NAMES,\n SOCKET_EVENTS,\n SOCKET_PATH,\n SOCKET_RECONNECTION_ATTEMPTS,\n SOCKET_RECONNECTION_DELAY,\n SOCKET_RECONNECTION_DELAY_MAX\n} from './constants';\nimport {TsWebRTCStream} from './stream';\n\nimport {getTracer} from '../tracer';\n\nconst tracer = getTracer();\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class TurnWebRtcSessionV2 extends TsMediaSession {\n get id() {\n return this._credentials.sessionId;\n }\n\n constructor({credentials, constraints, clientType, streamFactory}) {\n super();\n\n this._socket = null;\n this._localPeer = null;\n this._pendingPeersIce = {};\n this._peerConnections = new Map();\n\n this._credentials = credentials;\n this._constraints = constraints;\n this._selfClientType = clientType;\n this._localStreamFactory = streamFactory;\n\n const iceServers = credentials.ice.map((item) => ({\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._initiatorReconnectHandler = this._initiatorReconnectHandler.bind(this);\n this._peerDisconnectedHandler = this._peerDisconnectedHandler.bind(this);\n\n this._extendPeerConnection();\n }\n\n //#region Socket Connectivity\n\n connect(connectOnly = false) {\n tracer.trace('connect');\n\n return this._connectSocket(this._credentials.url, connectOnly)\n .then(() => {\n tracer.trace('Joining SessionId: ' + this._credentials.sessionId);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: this._selfClientType,\n sessionId: this._credentials.sessionId\n });\n })\n .catch((error) => {\n this.emit(SESSION_EVENTS.EXCEPTION, {source: 'connect', error});\n throw error;\n });\n }\n\n disconnect() {\n this._peerConnections.forEach((peerConnection) => {\n this._destroyPeerConnection(peerConnection);\n });\n\n this.emit(SESSION_EVENTS.DISCONNECTED, {reason: 'disconnected'});\n\n this._socket.off();\n this._socket.disconnect();\n }\n\n _connectSocket(url, connectOnly) {\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) => {\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\n if (!connectOnly) {\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\n socket.on(SOCKET_EVENTS.INCOMING.SDP_OFFER, this._sdpOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, this._initiatorReconnectHandler);\n\n socket.on(SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, this._iceCandidateReceivedHandler);\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({uid, peerId}) {\n tracer.trace('_sendOfferHandler');\n\n const peerConnection = this._createPeerConnection(peerId, CLIENT_TYPES.GUEST);\n const offerParams = {offerToReceiveAudio: true, offerToReceiveVideo: true};\n\n this._localStreamFactory(this._constraints)\n .then((localStream) => {\n tracer.trace('_sendOfferHandler stream and peer created');\n\n const peerConnectionStream = new TsWebRTCStream(this, localStream.clone(), DEFAULT_STREAM_NAMES.MOBILE_CLIENT_VIDEO_STREAM, false);\n\n peerConnectionStream.peerConnection = peerConnection;\n\n localStream.getTracks().forEach((track) => {\n tracer.trace('Adding local tracks to peer connection');\n peerConnection.addTrack(track, peerConnectionStream._mediaStream);\n });\n\n this.registerStream(peerConnectionStream.id, peerConnectionStream);\n })\n .then(() => peerConnection.createOffer(offerParams))\n .then((offerDesc) => {\n tracer.trace('Initiator has created sdp offer', {offerDesc});\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid,\n peerId,\n sessionId: this._credentials.sessionId,\n sdpOffer: offerDesc.sdp\n });\n\n return peerConnection.setLocalDescription(offerDesc)\n .then(() => {\n tracer.trace('Local description was set on');\n });\n })\n .catch((e) => {\n tracer.trace('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler({sdpAnswer, uid, peerId}) {\n tracer.trace('joinResponse Received', sdpAnswer);\n\n this._withPeerConnection(peerId, (peerConnection) => {\n const answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n\n peerConnection.setRemoteDescription(answer)\n .then(() => {\n tracer.trace('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n tracer.trace('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler({peerId}) {\n tracer.trace('_peerDisconnectedHandler');\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({sdpOffer, peerId, uid}) {\n tracer.trace('sdpOffer Received', {sdpOffer});\n\n const peerConnection = this._createPeerConnection(peerId, CLIENT_TYPES.INITIATOR);\n\n let subscriberInitChain = Promise.resolve();\n\n if (this._constraints.audio) {\n subscriberInitChain = subscriberInitChain.then(() => {\n tracer.trace('Creating agent local streams');\n\n return this._localStreamFactory(this._constraints)\n .then((localStream) => {\n localStream.getTracks().forEach((track) => {\n tracer.trace('Adding local tracks to peer connection');\n\n if (track.kind === 'audio') {\n\n const stream = new MediaStream([track]);\n const streamName = DEFAULT_STREAM_NAMES.DASHBOARD_AUDIO_STREAM;\n const agentAudioStream = new TsWebRTCStream(this, stream, streamName, false);\n\n this.registerStream(agentAudioStream.id, agentAudioStream);\n peerConnection.addTrack(track, peerConnection.peerLogicalStream);\n\n tracer.trace('Agent audio stream added to peerConnection');\n }\n });\n });\n });\n }\n\n subscriberInitChain.then(() => {\n const remoteDesc = new RTCSessionDescription({type: 'offer', sdp: sdpOffer});\n\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(() => {\n tracer.trace('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n tracer.trace('_sdpOfferHandler answer created', sdpAnswer);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid,\n peerId,\n sessionId: this._credentials.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(() => {\n tracer.trace('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n });\n });\n });\n\n });\n\n return subscriberInitChain.catch((e) => {\n tracer.trace('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _initiatorReconnectHandler() {\n tracer.trace('_initiatorReconnectHandler');\n\n const initiatorPeer = this._getInitiatorPeer();\n\n if (initiatorPeer) {\n this._destroyPeerConnection(initiatorPeer);\n }\n\n this.emit(SESSION_EVENTS.RECONNECT_TURN_SERVER);\n }\n\n _getInitiatorPeer() {\n const peer = this._getPeerConnectionsByType(CLIENT_TYPES.INITIATOR);\n\n return peer.length > 0 ? peer[0] : null;\n }\n\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n\n //#region Peer Connection\n\n _createPeerConnection(peerId, peerConnectionType) {\n if (this._peerConnections.get(peerId)) {\n throw new Error(`${this._selfClientType} peer connection for ${peerId} already exists`);\n }\n\n const peerConnection = new RTCPeerConnection(this._configuration);\n\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.peerLogicalStream = new MediaStream();\n\n peerConnection.oniceconnectionstatechange = (state) => {\n tracer.trace(`ICE Connection state for peer ${peerId} was changed to: ${state.currentTarget.iceConnectionState}`, state);\n if (state.currentTarget.iceConnectionState === 'disconnected') {\n this._iceStateDisconnected(peerConnection);\n }\n };\n\n peerConnection.onicecandidate = (event) => {\n if (event.candidate) {\n tracer.trace(`${this._selfClientType} peerConn.onicecandidate`, event.candidate);\n this._socket.emit(SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: this._credentials.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: this._selfClientType\n });\n } else {\n tracer.trace('ICE Candidate is null in peerConnection', event);\n }\n };\n\n if (this._selfClientType === CLIENT_TYPES.GUEST) {\n peerConnection.ontrack = (trackEvent) => {\n const {track, streams} = trackEvent;\n\n tracer.trace(`Stream created from peer connection track: ${track.kind}`, track, streams.length > 0 ? streams[0] : 'NO STREAM');\n\n const tsStream = new TsWebRTCStream(this, new MediaStream([track]));\n\n tsStream.peerConnection = peerConnection;\n tsStream.remote = true;\n\n this.registerStream(tsStream.id, tsStream);\n\n this.emit(SESSION_EVENTS.STREAM_CREATED, tsStream);\n };\n }\n\n this._peerConnections.set(peerId, peerConnection);\n\n tracer.trace(`${this._selfClientType} peerConnection created`);\n\n return peerConnection;\n }\n\n _destroyPeerConnection(peerConnection) {\n if (this._selfClientType === CLIENT_TYPES.GUEST) {\n this._getRemoteStreams(peerConnection).forEach((stream) => {\n this.unregisterStream(stream.id);\n this.emit(SESSION_EVENTS.STREAM_DESTROYED, {stream});\n });\n }\n\n if (this._selfClientType === CLIENT_TYPES.INITIATOR && this._peerConnections.size === 0) {\n //TODO - ALEX: When initiator will be implemented, here we need to destroy local stream (or better raise, event).\n }\n\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n }\n\n _getRemoteStreams(peerConnection) {\n const result = [];\n\n this.streams.forEach((stream) => {\n if (stream.peerConnection === peerConnection && stream.remote) {\n result.push(stream);\n }\n });\n\n return result;\n }\n\n _getPeerConnectionsByType(peerType) {\n const result = [];\n\n this._peerConnections.forEach((peerConnection) => {\n if (peerConnection.peerType === peerType) {\n result.push(peerConnection);\n }\n });\n\n return result;\n }\n\n _withPeerConnection(peerId, callback) {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n\n return null;\n }\n\n _extendPeerConnection() {\n //TODO - Alex: Need to modify IE shim, and add these methods inside shim itself\n\n if (!RTCPeerConnection.prototype.peerId) {\n RTCPeerConnection.prototype.peerId = '';\n }\n\n if (!RTCPeerConnection.prototype.peerType) {\n RTCPeerConnection.prototype.peerType = null;\n }\n\n if (!RTCPeerConnection.prototype.peerLogicalStream) {\n RTCPeerConnection.prototype.peerLogicalStream = null;\n }\n }\n\n //#endregion\n\n //#region ICE Candidates\n\n _iceCandidateReceivedHandler({candidate, peerId}) {\n tracer.trace('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n tracer.trace('NO iceCandidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n tracer.trace('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n tracer.trace('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection);\n }\n\n _addIceCandidateToPeer(iceCandidate, peerConnection) {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(() => {\n tracer.trace('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n tracer.trace('Error adding ICE Candidate to peer connection', e);\n });\n }\n\n _processQueuedIceCandidates(peerId) {\n this._withPeerConnection(peerId, (peerConnection) => {\n const pendingIces = this._pendingPeersIce[peerId];\n\n if (pendingIces) {\n pendingIces.forEach((pendingIce) => {\n tracer.trace('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection);\n });\n } else {\n tracer.trace('No pending ICE found for peer', peerId);\n }\n });\n }\n\n _queueIceCandidate(iceCandidate, peerId) {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n\n this._pendingPeersIce[peerId].push(iceCandidate);\n }\n\n _iceStateDisconnected(peerConnection) {\n if (peerConnection.peerType === CLIENT_TYPES.INITIATOR) {\n this._destroyPeerConnection(peerConnection);\n }\n }\n\n //#endregion\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["webrtc/session-turn.v2.js"],"names":["io","tracer","TurnWebRtcSessionV2","_credentials","sessionId","credentials","constraints","clientType","streamFactory","_socket","_localPeer","_pendingPeersIce","_peerConnections","Map","_constraints","_selfClientType","_localStreamFactory","_connectPromise","iceServers","ice","map","item","urls","url","username","login","credential","password","_configuration","iceTransportPolicy","_joinResponseHandler","bind","_iceCandidateReceivedHandler","_sendOfferHandler","_sdpOfferHandler","_initiatorReconnectHandler","_peerDisconnectedHandler","_extendPeerConnection","connect","connectOnly","trace","_connectSocket","then","emit","SOCKET_EVENTS","OUTGOING","JOIN_ROOM","catch","error","setTimeout","SESSION_EVENTS","EXCEPTION","source","disconnect","forEach","peerConnection","_destroyPeerConnection","off","DISCONNECTED","reason","Promise","resolve","reject","socket","SOCKET_RECONNECTION_DELAY","SOCKET_RECONNECTION_DELAY_MAX","SOCKET_RECONNECTION_ATTEMPTS","SOCKET_PATH","done","_","once","err","on","INCOMING","ERROR","args","SDP_OFFER","PUBLISHER_RECONNECT","ICE_CANDIDATE","uid","peerId","_createPeerConnection","CLIENT_TYPES","GUEST","offerParams","offerToReceiveAudio","offerToReceiveVideo","localStream","peerConnectionStream","TsWebRTCStream","clone","DEFAULT_STREAM_NAMES","MOBILE_CLIENT_VIDEO_STREAM","getTracks","track","addTrack","_mediaStream","registerStream","id","createOffer","offerDesc","sdpOffer","sdp","setLocalDescription","e","sdpAnswer","_withPeerConnection","answer","RTCSessionDescription","type","setRemoteDescription","_processQueuedIceCandidates","INITIATOR","subscriberInitChain","audio","kind","stream","MediaStream","streamName","DASHBOARD_AUDIO_STREAM","agentAudioStream","peerLogicalStream","remoteDesc","createAnswer","SDP_ANSWER","initiatorPeer","_getInitiatorPeer","RECONNECT_TURN_SERVER","peer","_getPeerConnectionsByType","length","peerConnectionType","get","Error","RTCPeerConnection","peerType","oniceconnectionstatechange","state","currentTarget","iceConnectionState","cnnState","onicecandidate","event","candidate","ontrack","trackEvent","streams","tsStream","remote","STREAM_CREATED","set","_getRemoteStreams","unregisterStream","STREAM_DESTROYED","size","delete","close","result","push","callback","prototype","remoteDescription","_queueIceCandidate","_addIceCandidateToPeer","iceCandidate","addIceCandidate","pendingIces","pendingIce","TsMediaSession"],"mappings":"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","file":"session-turn.v2.js","sourcesContent":["import {SESSION_EVENTS, TsMediaSession} from '../session';\nimport * as io from 'socket.io-client';\nimport {\n CLIENT_TYPES, DEFAULT_STREAM_NAMES,\n SOCKET_EVENTS,\n SOCKET_PATH,\n SOCKET_RECONNECTION_ATTEMPTS,\n SOCKET_RECONNECTION_DELAY,\n SOCKET_RECONNECTION_DELAY_MAX\n} from './constants';\nimport {TsWebRTCStream} from './stream';\n\nimport {getTracer} from '../tracer';\n\nconst tracer = getTracer();\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class TurnWebRtcSessionV2 extends TsMediaSession {\n get id() {\n return this._credentials.sessionId;\n }\n\n constructor({credentials, constraints, clientType, streamFactory}) {\n super();\n\n this._socket = null;\n this._localPeer = null;\n this._pendingPeersIce = {};\n this._peerConnections = new Map();\n\n this._credentials = credentials;\n this._constraints = constraints;\n this._selfClientType = clientType;\n this._localStreamFactory = streamFactory;\n\n this._connectPromise = null;\n\n const iceServers = credentials.ice.map((item) => ({\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._initiatorReconnectHandler = this._initiatorReconnectHandler.bind(this);\n this._peerDisconnectedHandler = this._peerDisconnectedHandler.bind(this);\n\n this._extendPeerConnection();\n }\n\n //#region Socket Connectivity\n\n connect(connectOnly = false) {\n if (this._connectPromise) {\n tracer.trace('already connecting');\n \n return this._connectPromise;\n }\n\n tracer.trace('connect');\n\n this._connectPromise = this._connectSocket(this._credentials.url, connectOnly)\n .then(() => {\n tracer.trace('Joining SessionId: ' + this._credentials.sessionId);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: this._selfClientType,\n sessionId: this._credentials.sessionId\n });\n\n this._connectPromise = null;\n })\n .catch((error) => {\n setTimeout(() => this._connectPromise = null);\n this.emit(SESSION_EVENTS.EXCEPTION, {source: 'connect', error});\n throw error;\n });\n\n return this._connectPromise;\n }\n\n disconnect() {\n tracer.trace('Disconnecting from media session');\n\n this._peerConnections.forEach((peerConnection) => {\n this._destroyPeerConnection(peerConnection);\n });\n\n this._socket.off();\n this._socket.disconnect();\n\n this.emit(SESSION_EVENTS.DISCONNECTED, {reason: 'disconnected'});\n }\n\n _connectSocket(url, connectOnly) {\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) => {\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\n socket.on('reconnect_attempt', (args) => {\n tracer.trace('Session Socket reconnect_attempt', args);\n });\n\n socket.on('reconnecting', (args) => {\n tracer.trace('Session Socket reconnecting', args);\n });\n\n socket.on('disconnect', (reason) => {\n tracer.trace('Session Socket disconnected, reason:', reason);\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.disconnect();\n //}\n });\n\n if (!connectOnly) {\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\n socket.on(SOCKET_EVENTS.INCOMING.SDP_OFFER, this._sdpOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, this._initiatorReconnectHandler);\n\n socket.on(SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, this._iceCandidateReceivedHandler);\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({uid, peerId}) {\n tracer.trace('_sendOfferHandler');\n\n const peerConnection = this._createPeerConnection(peerId, CLIENT_TYPES.GUEST);\n const offerParams = {offerToReceiveAudio: true, offerToReceiveVideo: true};\n\n this._localStreamFactory(this._constraints)\n .then((localStream) => {\n tracer.trace('_sendOfferHandler stream and peer created');\n\n const peerConnectionStream = new TsWebRTCStream(this, localStream.clone(), DEFAULT_STREAM_NAMES.MOBILE_CLIENT_VIDEO_STREAM, false);\n\n peerConnectionStream.peerConnection = peerConnection;\n\n localStream.getTracks().forEach((track) => {\n tracer.trace('Adding local tracks to peer connection');\n peerConnection.addTrack(track, peerConnectionStream._mediaStream);\n });\n\n this.registerStream(peerConnectionStream.id, peerConnectionStream);\n })\n .then(() => peerConnection.createOffer(offerParams))\n .then((offerDesc) => {\n tracer.trace('Initiator has created sdp offer', {offerDesc});\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid,\n peerId,\n sessionId: this._credentials.sessionId,\n sdpOffer: offerDesc.sdp\n });\n\n return peerConnection.setLocalDescription(offerDesc)\n .then(() => {\n tracer.trace('Local description was set on');\n });\n })\n .catch((e) => {\n tracer.trace('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler({sdpAnswer, uid, peerId}) {\n tracer.trace('joinResponse Received', sdpAnswer);\n\n this._withPeerConnection(peerId, (peerConnection) => {\n const answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n\n peerConnection.setRemoteDescription(answer)\n .then(() => {\n tracer.trace('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n tracer.trace('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler({peerId}) {\n tracer.trace('_peerDisconnectedHandler');\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({sdpOffer, peerId, uid}) {\n tracer.trace('sdpOffer Received', {sdpOffer});\n\n const peerConnection = this._createPeerConnection(peerId, CLIENT_TYPES.INITIATOR);\n\n let subscriberInitChain = Promise.resolve();\n\n if (this._constraints.audio) {\n subscriberInitChain = subscriberInitChain.then(() => {\n tracer.trace('Creating agent local streams');\n\n return this._localStreamFactory(this._constraints)\n .then((localStream) => {\n localStream.getTracks().forEach((track) => {\n tracer.trace('Adding local tracks to peer connection');\n\n if (track.kind === 'audio') {\n\n const stream = new MediaStream([track]);\n const streamName = DEFAULT_STREAM_NAMES.DASHBOARD_AUDIO_STREAM;\n const agentAudioStream = new TsWebRTCStream(this, stream, streamName, false);\n\n this.registerStream(agentAudioStream.id, agentAudioStream);\n peerConnection.addTrack(track, peerConnection.peerLogicalStream);\n\n tracer.trace('Agent audio stream added to peerConnection');\n }\n });\n });\n });\n }\n\n subscriberInitChain.then(() => {\n const remoteDesc = new RTCSessionDescription({type: 'offer', sdp: sdpOffer});\n\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(() => {\n tracer.trace('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n tracer.trace('_sdpOfferHandler answer created', sdpAnswer);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid,\n peerId,\n sessionId: this._credentials.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(() => {\n tracer.trace('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n });\n });\n });\n\n });\n\n return subscriberInitChain.catch((e) => {\n tracer.trace('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _initiatorReconnectHandler() {\n tracer.trace('_initiatorReconnectHandler');\n\n const initiatorPeer = this._getInitiatorPeer();\n\n if (initiatorPeer) {\n this._destroyPeerConnection(initiatorPeer);\n }\n\n this.emit(SESSION_EVENTS.RECONNECT_TURN_SERVER);\n }\n\n _getInitiatorPeer() {\n const peer = this._getPeerConnectionsByType(CLIENT_TYPES.INITIATOR);\n\n return peer.length > 0 ? peer[0] : null;\n }\n\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n\n //#region Peer Connection\n\n _createPeerConnection(peerId, peerConnectionType) {\n if (this._peerConnections.get(peerId)) {\n throw new Error(`${this._selfClientType} peer connection for ${peerId} already exists`);\n }\n\n const peerConnection = new RTCPeerConnection(this._configuration);\n\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.peerLogicalStream = new MediaStream();\n\n peerConnection.oniceconnectionstatechange = (state) => {\n tracer.trace(`ICE Connection state for peer ${peerId} was changed to: ${state.currentTarget.iceConnectionState}`, state);\n const cnnState = state.currentTarget.iceConnectionState;\n\n if (cnnState === 'disconnected') {\n //According to https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState\n //Connection can become active again, so we will do nothing.\n // if (peerConnection.peerType === CLIENT_TYPES.INITIATOR) {\n // //this._destroyPeerConnection(peerConnection);\n // this.disconnect();\n // }\n } else if (cnnState === 'failed' || cnnState === 'closed') {\n //According to https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState\n //When iceConnectionState is failed or closed, the peer connection can be destroyed.\n //In our case, we disconnecting from media session, and when session will be needed again, it will be connected.\n this.disconnect();\n }\n };\n\n peerConnection.onicecandidate = (event) => {\n if (event.candidate) {\n tracer.trace(`${this._selfClientType} peerConn.onicecandidate`, event.candidate);\n this._socket.emit(SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: this._credentials.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: this._selfClientType\n });\n } else {\n tracer.trace('ICE Candidate is null in peerConnection', event);\n }\n };\n\n if (this._selfClientType === CLIENT_TYPES.GUEST) {\n peerConnection.ontrack = (trackEvent) => {\n const {track, streams} = trackEvent;\n\n tracer.trace(`Stream created from peer connection track: ${track.kind}`, track, streams.length > 0 ? streams[0] : 'NO STREAM');\n\n const tsStream = new TsWebRTCStream(this, new MediaStream([track]));\n\n tsStream.peerConnection = peerConnection;\n tsStream.remote = true;\n\n this.registerStream(tsStream.id, tsStream);\n\n this.emit(SESSION_EVENTS.STREAM_CREATED, tsStream);\n };\n }\n\n this._peerConnections.set(peerId, peerConnection);\n\n tracer.trace(`${this._selfClientType} peerConnection created`);\n\n return peerConnection;\n }\n\n _destroyPeerConnection(peerConnection) {\n if (this._selfClientType === CLIENT_TYPES.GUEST) {\n this._getRemoteStreams(peerConnection).forEach((stream) => {\n this.unregisterStream(stream.id);\n this.emit(SESSION_EVENTS.STREAM_DESTROYED, {stream});\n });\n }\n\n if (this._selfClientType === CLIENT_TYPES.INITIATOR && this._peerConnections.size === 0) {\n //TODO - ALEX: When initiator will be implemented, here we need to destroy local stream (or better raise, event).\n }\n\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n }\n\n _getRemoteStreams(peerConnection) {\n const result = [];\n\n this.streams.forEach((stream) => {\n if (stream.peerConnection === peerConnection && stream.remote) {\n result.push(stream);\n }\n });\n\n return result;\n }\n\n _getPeerConnectionsByType(peerType) {\n const result = [];\n\n this._peerConnections.forEach((peerConnection) => {\n if (peerConnection.peerType === peerType) {\n result.push(peerConnection);\n }\n });\n\n return result;\n }\n\n _withPeerConnection(peerId, callback) {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n\n return null;\n }\n\n _extendPeerConnection() {\n //TODO - Alex: Need to modify IE shim, and add these methods inside shim itself\n\n if (!RTCPeerConnection.prototype.peerId) {\n RTCPeerConnection.prototype.peerId = '';\n }\n\n if (!RTCPeerConnection.prototype.peerType) {\n RTCPeerConnection.prototype.peerType = null;\n }\n\n if (!RTCPeerConnection.prototype.peerLogicalStream) {\n RTCPeerConnection.prototype.peerLogicalStream = null;\n }\n }\n\n //#endregion\n\n //#region ICE Candidates\n\n _iceCandidateReceivedHandler({candidate, peerId}) {\n tracer.trace('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n tracer.trace('NO iceCandidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n tracer.trace('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n tracer.trace('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection);\n }\n\n _addIceCandidateToPeer(iceCandidate, peerConnection) {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(() => {\n tracer.trace('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n tracer.trace('Error adding ICE Candidate to peer connection', e);\n });\n }\n\n _processQueuedIceCandidates(peerId) {\n this._withPeerConnection(peerId, (peerConnection) => {\n const pendingIces = this._pendingPeersIce[peerId];\n\n if (pendingIces) {\n pendingIces.forEach((pendingIce) => {\n tracer.trace('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection);\n });\n } else {\n tracer.trace('No pending ICE found for peer', peerId);\n }\n });\n }\n\n _queueIceCandidate(iceCandidate, peerId) {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n\n this._pendingPeersIce[peerId].push(iceCandidate);\n }\n\n //#endregion\n}\n"]}
|