@techsee/techsee-media-service 0.5.9 → 0.6.0-alpha.1
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/service.js +6 -4
- package/lib/service.js.map +1 -1
- package/lib/tracer.js +15 -144
- package/lib/tracer.js.map +1 -1
- package/lib/webrtc/helper.js +4 -2
- package/lib/webrtc/helper.js.map +1 -1
- package/lib/webrtc/session-turn.js +43 -39
- package/lib/webrtc/session-turn.js.map +1 -1
- package/lib/webrtc/session-turn.v2.js +38 -36
- package/lib/webrtc/session-turn.v2.js.map +1 -1
- package/lib/webrtc/stream.js +9 -7
- package/lib/webrtc/stream.js.map +1 -1
- package/lib/webrtc/webrtc-ie-shim.js +656 -462
- package/lib/webrtc/webrtc-ie-shim.js.map +1 -1
- package/package.json +1 -2
- package/lib/tracer.d.ts +0 -35
- package/lib/tracer.d.ts.map +0 -1
- package/lib/utils/ImageFixer.d.ts +0 -1
- package/lib/utils/ImageFixer.d.ts.map +0 -1
- package/lib/utils/ImageFixer.js +0 -58
- package/lib/utils/ImageFixer.js.map +0 -1
|
@@ -25,7 +25,9 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
|
|
|
25
25
|
|
|
26
26
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
27
27
|
|
|
28
|
-
var
|
|
28
|
+
var trace = (0, _tracer.getTracer)('TurnWebRtcSessionV2', function () {
|
|
29
|
+
return window.TurnSessionDebugV2 === true;
|
|
30
|
+
});
|
|
29
31
|
|
|
30
32
|
//Currently this version supports subscribing only. Publishing will be implemented as needed.
|
|
31
33
|
|
|
@@ -90,10 +92,10 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
90
92
|
|
|
91
93
|
var connectOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
92
94
|
|
|
93
|
-
|
|
95
|
+
trace('connect');
|
|
94
96
|
|
|
95
97
|
return this._connectSocket(this._credentials.url, connectOnly).then(function () {
|
|
96
|
-
|
|
98
|
+
trace('Joining SessionId: ' + _this2._credentials.sessionId);
|
|
97
99
|
|
|
98
100
|
_this2._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {
|
|
99
101
|
clientType: _this2._selfClientType,
|
|
@@ -168,20 +170,20 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
168
170
|
var uid = _ref2.uid,
|
|
169
171
|
peerId = _ref2.peerId;
|
|
170
172
|
|
|
171
|
-
|
|
173
|
+
trace('_sendOfferHandler');
|
|
172
174
|
|
|
173
175
|
var peerConnection = this._createPeerConnection(peerId, _constants.CLIENT_TYPES.GUEST);
|
|
174
176
|
var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };
|
|
175
177
|
|
|
176
178
|
this._localStreamFactory(this._constraints).then(function (localStream) {
|
|
177
|
-
|
|
179
|
+
trace('_sendOfferHandler stream and peer created');
|
|
178
180
|
|
|
179
181
|
var peerConnectionStream = new _stream.TsWebRTCStream(_this5, localStream.clone(), _constants.DEFAULT_STREAM_NAMES.MOBILE_CLIENT_VIDEO_STREAM, false);
|
|
180
182
|
|
|
181
183
|
peerConnectionStream.peerConnection = peerConnection;
|
|
182
184
|
|
|
183
185
|
localStream.getTracks().forEach(function (track) {
|
|
184
|
-
|
|
186
|
+
trace('Adding local tracks to peer connection');
|
|
185
187
|
peerConnection.addTrack(track, peerConnectionStream._mediaStream);
|
|
186
188
|
});
|
|
187
189
|
|
|
@@ -189,7 +191,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
189
191
|
}).then(function () {
|
|
190
192
|
return peerConnection.createOffer(offerParams);
|
|
191
193
|
}).then(function (offerDesc) {
|
|
192
|
-
|
|
194
|
+
trace('Initiator has created sdp offer', { offerDesc: offerDesc });
|
|
193
195
|
|
|
194
196
|
_this5._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {
|
|
195
197
|
uid: uid,
|
|
@@ -199,10 +201,10 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
199
201
|
});
|
|
200
202
|
|
|
201
203
|
return peerConnection.setLocalDescription(offerDesc).then(function () {
|
|
202
|
-
|
|
204
|
+
trace('Local description was set on');
|
|
203
205
|
});
|
|
204
206
|
}).catch(function (e) {
|
|
205
|
-
|
|
207
|
+
trace('Error', e);
|
|
206
208
|
});
|
|
207
209
|
};
|
|
208
210
|
|
|
@@ -216,7 +218,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
216
218
|
uid = _ref3.uid,
|
|
217
219
|
peerId = _ref3.peerId;
|
|
218
220
|
|
|
219
|
-
|
|
221
|
+
trace('joinResponse Received', sdpAnswer);
|
|
220
222
|
|
|
221
223
|
this._withPeerConnection(peerId, function (peerConnection) {
|
|
222
224
|
var answer = new RTCSessionDescription({
|
|
@@ -225,11 +227,11 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
225
227
|
});
|
|
226
228
|
|
|
227
229
|
peerConnection.setRemoteDescription(answer).then(function () {
|
|
228
|
-
|
|
230
|
+
trace('Remote description was set', answer);
|
|
229
231
|
|
|
230
232
|
_this6._processQueuedIceCandidates(peerId);
|
|
231
233
|
}).catch(function (e) {
|
|
232
|
-
|
|
234
|
+
trace('Error', e);
|
|
233
235
|
});
|
|
234
236
|
});
|
|
235
237
|
};
|
|
@@ -240,7 +242,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
240
242
|
TurnWebRtcSessionV2.prototype._peerDisconnectedHandler = function _peerDisconnectedHandler(_ref4) {
|
|
241
243
|
var peerId = _ref4.peerId;
|
|
242
244
|
|
|
243
|
-
|
|
245
|
+
trace('_peerDisconnectedHandler');
|
|
244
246
|
};
|
|
245
247
|
|
|
246
248
|
//#endregion WebRTC Initiator - session Initiator (User on mobile device)
|
|
@@ -257,7 +259,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
257
259
|
peerId = _ref5.peerId,
|
|
258
260
|
uid = _ref5.uid;
|
|
259
261
|
|
|
260
|
-
|
|
262
|
+
trace('sdpOffer Received', { sdpOffer: sdpOffer });
|
|
261
263
|
|
|
262
264
|
var peerConnection = this._createPeerConnection(peerId, _constants.CLIENT_TYPES.INITIATOR);
|
|
263
265
|
|
|
@@ -265,11 +267,11 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
265
267
|
|
|
266
268
|
if (this._constraints.audio) {
|
|
267
269
|
subscriberInitChain = subscriberInitChain.then(function () {
|
|
268
|
-
|
|
270
|
+
trace('Creating agent local streams');
|
|
269
271
|
|
|
270
272
|
return _this7._localStreamFactory(_this7._constraints).then(function (localStream) {
|
|
271
273
|
localStream.getTracks().forEach(function (track) {
|
|
272
|
-
|
|
274
|
+
trace('Adding local tracks to peer connection');
|
|
273
275
|
|
|
274
276
|
if (track.kind === 'audio') {
|
|
275
277
|
|
|
@@ -280,7 +282,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
280
282
|
_this7.registerStream(agentAudioStream.id, agentAudioStream);
|
|
281
283
|
peerConnection.addTrack(track, peerConnection.peerLogicalStream);
|
|
282
284
|
|
|
283
|
-
|
|
285
|
+
trace('Agent audio stream added to peerConnection');
|
|
284
286
|
}
|
|
285
287
|
});
|
|
286
288
|
});
|
|
@@ -291,10 +293,10 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
291
293
|
var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });
|
|
292
294
|
|
|
293
295
|
return peerConnection.setRemoteDescription(remoteDesc).then(function () {
|
|
294
|
-
|
|
296
|
+
trace('Remote description was set', remoteDesc);
|
|
295
297
|
|
|
296
298
|
return peerConnection.createAnswer().then(function (sdpAnswer) {
|
|
297
|
-
|
|
299
|
+
trace('_sdpOfferHandler answer created', sdpAnswer);
|
|
298
300
|
|
|
299
301
|
_this7._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {
|
|
300
302
|
uid: uid,
|
|
@@ -304,7 +306,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
304
306
|
});
|
|
305
307
|
|
|
306
308
|
return peerConnection.setLocalDescription(sdpAnswer).then(function () {
|
|
307
|
-
|
|
309
|
+
trace('_sdpOfferHandler local desc was set');
|
|
308
310
|
|
|
309
311
|
_this7._processQueuedIceCandidates(peerId);
|
|
310
312
|
});
|
|
@@ -313,7 +315,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
313
315
|
});
|
|
314
316
|
|
|
315
317
|
return subscriberInitChain.catch(function (e) {
|
|
316
|
-
|
|
318
|
+
trace('Error in _sdpOfferHandler', e);
|
|
317
319
|
throw e;
|
|
318
320
|
});
|
|
319
321
|
};
|
|
@@ -322,7 +324,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
322
324
|
|
|
323
325
|
|
|
324
326
|
TurnWebRtcSessionV2.prototype._initiatorReconnectHandler = function _initiatorReconnectHandler() {
|
|
325
|
-
|
|
327
|
+
trace('_initiatorReconnectHandler');
|
|
326
328
|
|
|
327
329
|
var initiatorPeer = this._getInitiatorPeer();
|
|
328
330
|
|
|
@@ -357,7 +359,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
357
359
|
peerConnection.peerLogicalStream = new MediaStream();
|
|
358
360
|
|
|
359
361
|
peerConnection.oniceconnectionstatechange = function (state) {
|
|
360
|
-
|
|
362
|
+
trace('ICE Connection state for peer ' + peerId + ' was changed to: ' + state.currentTarget.iceConnectionState, state);
|
|
361
363
|
if (state.currentTarget.iceConnectionState === 'disconnected') {
|
|
362
364
|
_this8._iceStateDisconnected(peerConnection);
|
|
363
365
|
}
|
|
@@ -365,7 +367,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
365
367
|
|
|
366
368
|
peerConnection.onicecandidate = function (event) {
|
|
367
369
|
if (event.candidate) {
|
|
368
|
-
|
|
370
|
+
trace(_this8._selfClientType + ' peerConn.onicecandidate', event.candidate);
|
|
369
371
|
_this8._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {
|
|
370
372
|
sessionId: _this8._credentials.sessionId,
|
|
371
373
|
peerId: peerId,
|
|
@@ -373,7 +375,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
373
375
|
clientType: _this8._selfClientType
|
|
374
376
|
});
|
|
375
377
|
} else {
|
|
376
|
-
|
|
378
|
+
trace('ICE Candidate is null in peerConnection', event);
|
|
377
379
|
}
|
|
378
380
|
};
|
|
379
381
|
|
|
@@ -383,9 +385,9 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
383
385
|
streams = trackEvent.streams;
|
|
384
386
|
|
|
385
387
|
|
|
386
|
-
|
|
388
|
+
trace('Stream created from peer connection track: ' + track.kind, track, streams.length > 0 ? streams[0] : 'NO STREAM');
|
|
387
389
|
|
|
388
|
-
var tsStream = new _stream.TsWebRTCStream(_this8,
|
|
390
|
+
var tsStream = new _stream.TsWebRTCStream(_this8, streams[0]);
|
|
389
391
|
|
|
390
392
|
tsStream.peerConnection = peerConnection;
|
|
391
393
|
tsStream.remote = true;
|
|
@@ -398,7 +400,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
398
400
|
|
|
399
401
|
this._peerConnections.set(peerId, peerConnection);
|
|
400
402
|
|
|
401
|
-
|
|
403
|
+
trace(this._selfClientType + ' peerConnection created');
|
|
402
404
|
|
|
403
405
|
return peerConnection;
|
|
404
406
|
};
|
|
@@ -477,9 +479,9 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
477
479
|
var candidate = _ref6.candidate,
|
|
478
480
|
peerId = _ref6.peerId;
|
|
479
481
|
|
|
480
|
-
|
|
482
|
+
trace('_iceCandidateReceivedHandler', candidate);
|
|
481
483
|
if (!candidate) {
|
|
482
|
-
|
|
484
|
+
trace('NO iceCandidate');
|
|
483
485
|
|
|
484
486
|
return;
|
|
485
487
|
}
|
|
@@ -487,21 +489,21 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
487
489
|
var peerConnection = this._peerConnections.get(peerId);
|
|
488
490
|
|
|
489
491
|
if (!peerConnection || !peerConnection.remoteDescription) {
|
|
490
|
-
|
|
492
|
+
trace('Queueing iceCandidate', candidate);
|
|
491
493
|
this._queueIceCandidate(candidate, peerId);
|
|
492
494
|
|
|
493
495
|
return;
|
|
494
496
|
}
|
|
495
497
|
|
|
496
|
-
|
|
498
|
+
trace('Going to add iceCandidate', candidate);
|
|
497
499
|
this._addIceCandidateToPeer(candidate, peerConnection);
|
|
498
500
|
};
|
|
499
501
|
|
|
500
502
|
TurnWebRtcSessionV2.prototype._addIceCandidateToPeer = function _addIceCandidateToPeer(iceCandidate, peerConnection) {
|
|
501
503
|
return peerConnection.addIceCandidate(iceCandidate).then(function () {
|
|
502
|
-
|
|
504
|
+
trace('ICE Candidate add to peer connection');
|
|
503
505
|
}).catch(function (e) {
|
|
504
|
-
|
|
506
|
+
trace('Error adding ICE Candidate to peer connection', e);
|
|
505
507
|
});
|
|
506
508
|
};
|
|
507
509
|
|
|
@@ -513,11 +515,11 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
513
515
|
|
|
514
516
|
if (pendingIces) {
|
|
515
517
|
pendingIces.forEach(function (pendingIce) {
|
|
516
|
-
|
|
518
|
+
trace('Adding pending ICE to peer connections');
|
|
517
519
|
_this10._addIceCandidateToPeer(pendingIce, peerConnection);
|
|
518
520
|
});
|
|
519
521
|
} else {
|
|
520
|
-
|
|
522
|
+
trace('No pending ICE found for peer', peerId);
|
|
521
523
|
}
|
|
522
524
|
});
|
|
523
525
|
};
|
|
@@ -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":"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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 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","trace","window","TurnSessionDebugV2","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","_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":"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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 trace = getTracer('TurnWebRtcSessionV2', () => window.TurnSessionDebugV2 === true);\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 trace('connect');\n\n return this._connectSocket(this._credentials.url, connectOnly)\n .then(() => {\n 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 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 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 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 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 trace('Local description was set on');\n });\n })\n .catch((e) => {\n trace('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler({sdpAnswer, uid, peerId}) {\n 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 trace('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n trace('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler({peerId}) {\n 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 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 trace('Creating agent local streams');\n\n return this._localStreamFactory(this._constraints)\n .then((localStream) => {\n localStream.getTracks().forEach((track) => {\n 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 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 trace('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n 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 trace('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n });\n });\n });\n\n });\n\n return subscriberInitChain.catch((e) => {\n trace('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _initiatorReconnectHandler() {\n 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 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 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 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 trace(`Stream created from peer connection track: ${track.kind}`, track, streams.length > 0 ? streams[0] : 'NO STREAM');\n\n const tsStream = new TsWebRTCStream(this, streams[0]);\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 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 trace('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace('NO iceCandidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n 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 trace('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n 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 trace('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection);\n });\n } else {\n 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"]}
|
package/lib/webrtc/stream.js
CHANGED
|
@@ -31,7 +31,9 @@ exports.EVENTS = _stream.EVENTS;
|
|
|
31
31
|
var TORCH_DELAY = 1500;
|
|
32
32
|
var isIE11 = new _tsEnvironmentDetect.TsEnvironmentDetect().isIE11();
|
|
33
33
|
|
|
34
|
-
var
|
|
34
|
+
var trace = (0, _tracer.getTracer)('TsWebRTCStream', function () {
|
|
35
|
+
return window.TsWebRTCStreamDebug === true;
|
|
36
|
+
});
|
|
35
37
|
|
|
36
38
|
/**
|
|
37
39
|
* WebRTC-specific implementation of TsMediaStream.
|
|
@@ -237,7 +239,7 @@ var TsWebRTCStream = exports.TsWebRTCStream = function (_TsMediaStream) {
|
|
|
237
239
|
var bindVideoStreamToElement = function bindVideoStreamToElement(stream, target) {
|
|
238
240
|
return new Promise(function (resolve, reject) {
|
|
239
241
|
var doResolve = function doResolve(videoEl) {
|
|
240
|
-
|
|
242
|
+
trace('Video element created successfully');
|
|
241
243
|
resolve(videoEl);
|
|
242
244
|
};
|
|
243
245
|
|
|
@@ -261,17 +263,17 @@ var TsWebRTCStream = exports.TsWebRTCStream = function (_TsMediaStream) {
|
|
|
261
263
|
var playRes = videoEl.play();
|
|
262
264
|
if (playRes && playRes.then) {
|
|
263
265
|
playRes.then(function () {
|
|
264
|
-
|
|
266
|
+
trace('Video element play success');
|
|
265
267
|
});
|
|
266
268
|
}
|
|
267
269
|
|
|
268
270
|
if (playRes && playRes.catch) {
|
|
269
271
|
playRes.catch(function (error) {
|
|
270
|
-
|
|
272
|
+
trace('Reject while executing play method on video element', error);
|
|
271
273
|
});
|
|
272
274
|
}
|
|
273
275
|
} catch (error) {
|
|
274
|
-
|
|
276
|
+
trace('Error while executing play method on video element', error);
|
|
275
277
|
}
|
|
276
278
|
|
|
277
279
|
if (isIE11) {
|
|
@@ -352,9 +354,9 @@ var TsWebRTCStream = exports.TsWebRTCStream = function (_TsMediaStream) {
|
|
|
352
354
|
window.WebRTCAdapter.unBindVideoElement(videoEl);
|
|
353
355
|
if (videoEl && videoEl.parentNode && videoEl.parentNode.removeChild) {
|
|
354
356
|
videoEl.parentNode.removeChild(videoEl);
|
|
355
|
-
|
|
357
|
+
trace('Video element removed successfully');
|
|
356
358
|
} else {
|
|
357
|
-
|
|
359
|
+
trace('Video element not removed', videoEl, videoEl.parentNode);
|
|
358
360
|
}
|
|
359
361
|
doResolve();
|
|
360
362
|
} else {
|