@techsee/techsee-media-service 0.6.0-alpha.1 → 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.
- package/lib/opentok/session.js +6 -0
- package/lib/opentok/session.js.map +1 -1
- package/lib/service.js +4 -6
- package/lib/service.js.map +1 -1
- package/lib/tracer.d.ts +35 -0
- package/lib/tracer.d.ts.map +1 -0
- package/lib/tracer.js +144 -15
- package/lib/tracer.js.map +1 -1
- package/lib/utils/ImageFixer.d.ts +1 -0
- package/lib/utils/ImageFixer.d.ts.map +1 -0
- package/lib/utils/ImageFixer.js +58 -0
- package/lib/utils/ImageFixer.js.map +1 -0
- package/lib/webrtc/helper.js +2 -4
- package/lib/webrtc/helper.js.map +1 -1
- package/lib/webrtc/session-turn.js +47 -43
- package/lib/webrtc/session-turn.js.map +1 -1
- package/lib/webrtc/session-turn.v2.js +88 -49
- package/lib/webrtc/session-turn.v2.js.map +1 -1
- package/lib/webrtc/stream.js +7 -9
- package/lib/webrtc/stream.js.map +1 -1
- package/lib/webrtc/webrtc-ie-shim.js +462 -656
- package/lib/webrtc/webrtc-ie-shim.js.map +1 -1
- package/package.json +2 -1
|
@@ -25,9 +25,7 @@ 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
|
|
29
|
-
return window.TurnSessionDebugV2 === true;
|
|
30
|
-
});
|
|
28
|
+
var tracer = (0, _tracer.getTracer)();
|
|
31
29
|
|
|
32
30
|
//Currently this version supports subscribing only. Publishing will be implemented as needed.
|
|
33
31
|
|
|
@@ -61,6 +59,8 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
61
59
|
_this._selfClientType = clientType;
|
|
62
60
|
_this._localStreamFactory = streamFactory;
|
|
63
61
|
|
|
62
|
+
_this._connectPromise = null;
|
|
63
|
+
|
|
64
64
|
var iceServers = credentials.ice.map(function (item) {
|
|
65
65
|
return {
|
|
66
66
|
urls: item.url,
|
|
@@ -92,32 +92,47 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
92
92
|
|
|
93
93
|
var connectOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
if (this._connectPromise) {
|
|
96
|
+
tracer.trace('already connecting');
|
|
97
|
+
|
|
98
|
+
return this._connectPromise;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
tracer.trace('connect');
|
|
96
102
|
|
|
97
|
-
|
|
98
|
-
trace('Joining SessionId: ' + _this2._credentials.sessionId);
|
|
103
|
+
this._connectPromise = this._connectSocket(this._credentials.url, connectOnly).then(function () {
|
|
104
|
+
tracer.trace('Joining SessionId: ' + _this2._credentials.sessionId);
|
|
99
105
|
|
|
100
106
|
_this2._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {
|
|
101
107
|
clientType: _this2._selfClientType,
|
|
102
108
|
sessionId: _this2._credentials.sessionId
|
|
103
109
|
});
|
|
110
|
+
|
|
111
|
+
_this2._connectPromise = null;
|
|
104
112
|
}).catch(function (error) {
|
|
113
|
+
setTimeout(function () {
|
|
114
|
+
return _this2._connectPromise = null;
|
|
115
|
+
});
|
|
105
116
|
_this2.emit(_session.SESSION_EVENTS.EXCEPTION, { source: 'connect', error: error });
|
|
106
117
|
throw error;
|
|
107
118
|
});
|
|
119
|
+
|
|
120
|
+
return this._connectPromise;
|
|
108
121
|
};
|
|
109
122
|
|
|
110
123
|
TurnWebRtcSessionV2.prototype.disconnect = function disconnect() {
|
|
111
124
|
var _this3 = this;
|
|
112
125
|
|
|
126
|
+
tracer.trace('Disconnecting from media session');
|
|
127
|
+
|
|
113
128
|
this._peerConnections.forEach(function (peerConnection) {
|
|
114
129
|
_this3._destroyPeerConnection(peerConnection);
|
|
115
130
|
});
|
|
116
131
|
|
|
117
|
-
this.emit(_session.SESSION_EVENTS.DISCONNECTED, { reason: 'disconnected' });
|
|
118
|
-
|
|
119
132
|
this._socket.off();
|
|
120
133
|
this._socket.disconnect();
|
|
134
|
+
|
|
135
|
+
this.emit(_session.SESSION_EVENTS.DISCONNECTED, { reason: 'disconnected' });
|
|
121
136
|
};
|
|
122
137
|
|
|
123
138
|
TurnWebRtcSessionV2.prototype._connectSocket = function _connectSocket(url, connectOnly) {
|
|
@@ -143,6 +158,24 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
143
158
|
socket.on('connect_error', done);
|
|
144
159
|
socket.on('connect_timeout', done);
|
|
145
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
|
+
|
|
146
179
|
if (!connectOnly) {
|
|
147
180
|
//PUBLISHING NOT SUPPORTED YET
|
|
148
181
|
//socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);
|
|
@@ -170,20 +203,20 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
170
203
|
var uid = _ref2.uid,
|
|
171
204
|
peerId = _ref2.peerId;
|
|
172
205
|
|
|
173
|
-
trace('_sendOfferHandler');
|
|
206
|
+
tracer.trace('_sendOfferHandler');
|
|
174
207
|
|
|
175
208
|
var peerConnection = this._createPeerConnection(peerId, _constants.CLIENT_TYPES.GUEST);
|
|
176
209
|
var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };
|
|
177
210
|
|
|
178
211
|
this._localStreamFactory(this._constraints).then(function (localStream) {
|
|
179
|
-
trace('_sendOfferHandler stream and peer created');
|
|
212
|
+
tracer.trace('_sendOfferHandler stream and peer created');
|
|
180
213
|
|
|
181
214
|
var peerConnectionStream = new _stream.TsWebRTCStream(_this5, localStream.clone(), _constants.DEFAULT_STREAM_NAMES.MOBILE_CLIENT_VIDEO_STREAM, false);
|
|
182
215
|
|
|
183
216
|
peerConnectionStream.peerConnection = peerConnection;
|
|
184
217
|
|
|
185
218
|
localStream.getTracks().forEach(function (track) {
|
|
186
|
-
trace('Adding local tracks to peer connection');
|
|
219
|
+
tracer.trace('Adding local tracks to peer connection');
|
|
187
220
|
peerConnection.addTrack(track, peerConnectionStream._mediaStream);
|
|
188
221
|
});
|
|
189
222
|
|
|
@@ -191,7 +224,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
191
224
|
}).then(function () {
|
|
192
225
|
return peerConnection.createOffer(offerParams);
|
|
193
226
|
}).then(function (offerDesc) {
|
|
194
|
-
trace('Initiator has created sdp offer', { offerDesc: offerDesc });
|
|
227
|
+
tracer.trace('Initiator has created sdp offer', { offerDesc: offerDesc });
|
|
195
228
|
|
|
196
229
|
_this5._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {
|
|
197
230
|
uid: uid,
|
|
@@ -201,10 +234,10 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
201
234
|
});
|
|
202
235
|
|
|
203
236
|
return peerConnection.setLocalDescription(offerDesc).then(function () {
|
|
204
|
-
trace('Local description was set on');
|
|
237
|
+
tracer.trace('Local description was set on');
|
|
205
238
|
});
|
|
206
239
|
}).catch(function (e) {
|
|
207
|
-
trace('Error', e);
|
|
240
|
+
tracer.trace('Error', e);
|
|
208
241
|
});
|
|
209
242
|
};
|
|
210
243
|
|
|
@@ -218,7 +251,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
218
251
|
uid = _ref3.uid,
|
|
219
252
|
peerId = _ref3.peerId;
|
|
220
253
|
|
|
221
|
-
trace('joinResponse Received', sdpAnswer);
|
|
254
|
+
tracer.trace('joinResponse Received', sdpAnswer);
|
|
222
255
|
|
|
223
256
|
this._withPeerConnection(peerId, function (peerConnection) {
|
|
224
257
|
var answer = new RTCSessionDescription({
|
|
@@ -227,11 +260,11 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
227
260
|
});
|
|
228
261
|
|
|
229
262
|
peerConnection.setRemoteDescription(answer).then(function () {
|
|
230
|
-
trace('Remote description was set', answer);
|
|
263
|
+
tracer.trace('Remote description was set', answer);
|
|
231
264
|
|
|
232
265
|
_this6._processQueuedIceCandidates(peerId);
|
|
233
266
|
}).catch(function (e) {
|
|
234
|
-
trace('Error', e);
|
|
267
|
+
tracer.trace('Error', e);
|
|
235
268
|
});
|
|
236
269
|
});
|
|
237
270
|
};
|
|
@@ -242,7 +275,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
242
275
|
TurnWebRtcSessionV2.prototype._peerDisconnectedHandler = function _peerDisconnectedHandler(_ref4) {
|
|
243
276
|
var peerId = _ref4.peerId;
|
|
244
277
|
|
|
245
|
-
trace('_peerDisconnectedHandler');
|
|
278
|
+
tracer.trace('_peerDisconnectedHandler');
|
|
246
279
|
};
|
|
247
280
|
|
|
248
281
|
//#endregion WebRTC Initiator - session Initiator (User on mobile device)
|
|
@@ -259,7 +292,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
259
292
|
peerId = _ref5.peerId,
|
|
260
293
|
uid = _ref5.uid;
|
|
261
294
|
|
|
262
|
-
trace('sdpOffer Received', { sdpOffer: sdpOffer });
|
|
295
|
+
tracer.trace('sdpOffer Received', { sdpOffer: sdpOffer });
|
|
263
296
|
|
|
264
297
|
var peerConnection = this._createPeerConnection(peerId, _constants.CLIENT_TYPES.INITIATOR);
|
|
265
298
|
|
|
@@ -267,11 +300,11 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
267
300
|
|
|
268
301
|
if (this._constraints.audio) {
|
|
269
302
|
subscriberInitChain = subscriberInitChain.then(function () {
|
|
270
|
-
trace('Creating agent local streams');
|
|
303
|
+
tracer.trace('Creating agent local streams');
|
|
271
304
|
|
|
272
305
|
return _this7._localStreamFactory(_this7._constraints).then(function (localStream) {
|
|
273
306
|
localStream.getTracks().forEach(function (track) {
|
|
274
|
-
trace('Adding local tracks to peer connection');
|
|
307
|
+
tracer.trace('Adding local tracks to peer connection');
|
|
275
308
|
|
|
276
309
|
if (track.kind === 'audio') {
|
|
277
310
|
|
|
@@ -282,7 +315,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
282
315
|
_this7.registerStream(agentAudioStream.id, agentAudioStream);
|
|
283
316
|
peerConnection.addTrack(track, peerConnection.peerLogicalStream);
|
|
284
317
|
|
|
285
|
-
trace('Agent audio stream added to peerConnection');
|
|
318
|
+
tracer.trace('Agent audio stream added to peerConnection');
|
|
286
319
|
}
|
|
287
320
|
});
|
|
288
321
|
});
|
|
@@ -293,10 +326,10 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
293
326
|
var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });
|
|
294
327
|
|
|
295
328
|
return peerConnection.setRemoteDescription(remoteDesc).then(function () {
|
|
296
|
-
trace('Remote description was set', remoteDesc);
|
|
329
|
+
tracer.trace('Remote description was set', remoteDesc);
|
|
297
330
|
|
|
298
331
|
return peerConnection.createAnswer().then(function (sdpAnswer) {
|
|
299
|
-
trace('_sdpOfferHandler answer created', sdpAnswer);
|
|
332
|
+
tracer.trace('_sdpOfferHandler answer created', sdpAnswer);
|
|
300
333
|
|
|
301
334
|
_this7._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {
|
|
302
335
|
uid: uid,
|
|
@@ -306,7 +339,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
306
339
|
});
|
|
307
340
|
|
|
308
341
|
return peerConnection.setLocalDescription(sdpAnswer).then(function () {
|
|
309
|
-
trace('_sdpOfferHandler local desc was set');
|
|
342
|
+
tracer.trace('_sdpOfferHandler local desc was set');
|
|
310
343
|
|
|
311
344
|
_this7._processQueuedIceCandidates(peerId);
|
|
312
345
|
});
|
|
@@ -315,7 +348,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
315
348
|
});
|
|
316
349
|
|
|
317
350
|
return subscriberInitChain.catch(function (e) {
|
|
318
|
-
trace('Error in _sdpOfferHandler', e);
|
|
351
|
+
tracer.trace('Error in _sdpOfferHandler', e);
|
|
319
352
|
throw e;
|
|
320
353
|
});
|
|
321
354
|
};
|
|
@@ -324,7 +357,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
324
357
|
|
|
325
358
|
|
|
326
359
|
TurnWebRtcSessionV2.prototype._initiatorReconnectHandler = function _initiatorReconnectHandler() {
|
|
327
|
-
trace('_initiatorReconnectHandler');
|
|
360
|
+
tracer.trace('_initiatorReconnectHandler');
|
|
328
361
|
|
|
329
362
|
var initiatorPeer = this._getInitiatorPeer();
|
|
330
363
|
|
|
@@ -359,15 +392,27 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
359
392
|
peerConnection.peerLogicalStream = new MediaStream();
|
|
360
393
|
|
|
361
394
|
peerConnection.oniceconnectionstatechange = function (state) {
|
|
362
|
-
trace('ICE Connection state for peer ' + peerId + ' was changed to: ' + state.currentTarget.iceConnectionState, state);
|
|
363
|
-
|
|
364
|
-
|
|
395
|
+
tracer.trace('ICE Connection state for peer ' + peerId + ' was changed to: ' + state.currentTarget.iceConnectionState, state);
|
|
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();
|
|
365
410
|
}
|
|
366
411
|
};
|
|
367
412
|
|
|
368
413
|
peerConnection.onicecandidate = function (event) {
|
|
369
414
|
if (event.candidate) {
|
|
370
|
-
trace(_this8._selfClientType + ' peerConn.onicecandidate', event.candidate);
|
|
415
|
+
tracer.trace(_this8._selfClientType + ' peerConn.onicecandidate', event.candidate);
|
|
371
416
|
_this8._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {
|
|
372
417
|
sessionId: _this8._credentials.sessionId,
|
|
373
418
|
peerId: peerId,
|
|
@@ -375,7 +420,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
375
420
|
clientType: _this8._selfClientType
|
|
376
421
|
});
|
|
377
422
|
} else {
|
|
378
|
-
trace('ICE Candidate is null in peerConnection', event);
|
|
423
|
+
tracer.trace('ICE Candidate is null in peerConnection', event);
|
|
379
424
|
}
|
|
380
425
|
};
|
|
381
426
|
|
|
@@ -385,9 +430,9 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
385
430
|
streams = trackEvent.streams;
|
|
386
431
|
|
|
387
432
|
|
|
388
|
-
trace('Stream created from peer connection track: ' + track.kind, track, streams.length > 0 ? streams[0] : 'NO STREAM');
|
|
433
|
+
tracer.trace('Stream created from peer connection track: ' + track.kind, track, streams.length > 0 ? streams[0] : 'NO STREAM');
|
|
389
434
|
|
|
390
|
-
var tsStream = new _stream.TsWebRTCStream(_this8,
|
|
435
|
+
var tsStream = new _stream.TsWebRTCStream(_this8, new MediaStream([track]));
|
|
391
436
|
|
|
392
437
|
tsStream.peerConnection = peerConnection;
|
|
393
438
|
tsStream.remote = true;
|
|
@@ -400,7 +445,7 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
400
445
|
|
|
401
446
|
this._peerConnections.set(peerId, peerConnection);
|
|
402
447
|
|
|
403
|
-
trace(this._selfClientType + ' peerConnection created');
|
|
448
|
+
tracer.trace(this._selfClientType + ' peerConnection created');
|
|
404
449
|
|
|
405
450
|
return peerConnection;
|
|
406
451
|
};
|
|
@@ -479,9 +524,9 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
479
524
|
var candidate = _ref6.candidate,
|
|
480
525
|
peerId = _ref6.peerId;
|
|
481
526
|
|
|
482
|
-
trace('_iceCandidateReceivedHandler', candidate);
|
|
527
|
+
tracer.trace('_iceCandidateReceivedHandler', candidate);
|
|
483
528
|
if (!candidate) {
|
|
484
|
-
trace('NO iceCandidate');
|
|
529
|
+
tracer.trace('NO iceCandidate');
|
|
485
530
|
|
|
486
531
|
return;
|
|
487
532
|
}
|
|
@@ -489,21 +534,21 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
489
534
|
var peerConnection = this._peerConnections.get(peerId);
|
|
490
535
|
|
|
491
536
|
if (!peerConnection || !peerConnection.remoteDescription) {
|
|
492
|
-
trace('Queueing iceCandidate', candidate);
|
|
537
|
+
tracer.trace('Queueing iceCandidate', candidate);
|
|
493
538
|
this._queueIceCandidate(candidate, peerId);
|
|
494
539
|
|
|
495
540
|
return;
|
|
496
541
|
}
|
|
497
542
|
|
|
498
|
-
trace('Going to add iceCandidate', candidate);
|
|
543
|
+
tracer.trace('Going to add iceCandidate', candidate);
|
|
499
544
|
this._addIceCandidateToPeer(candidate, peerConnection);
|
|
500
545
|
};
|
|
501
546
|
|
|
502
547
|
TurnWebRtcSessionV2.prototype._addIceCandidateToPeer = function _addIceCandidateToPeer(iceCandidate, peerConnection) {
|
|
503
548
|
return peerConnection.addIceCandidate(iceCandidate).then(function () {
|
|
504
|
-
trace('ICE Candidate add to peer connection');
|
|
549
|
+
tracer.trace('ICE Candidate add to peer connection');
|
|
505
550
|
}).catch(function (e) {
|
|
506
|
-
trace('Error adding ICE Candidate to peer connection', e);
|
|
551
|
+
tracer.trace('Error adding ICE Candidate to peer connection', e);
|
|
507
552
|
});
|
|
508
553
|
};
|
|
509
554
|
|
|
@@ -515,11 +560,11 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
515
560
|
|
|
516
561
|
if (pendingIces) {
|
|
517
562
|
pendingIces.forEach(function (pendingIce) {
|
|
518
|
-
trace('Adding pending ICE to peer connections');
|
|
563
|
+
tracer.trace('Adding pending ICE to peer connections');
|
|
519
564
|
_this10._addIceCandidateToPeer(pendingIce, peerConnection);
|
|
520
565
|
});
|
|
521
566
|
} else {
|
|
522
|
-
trace('No pending ICE found for peer', peerId);
|
|
567
|
+
tracer.trace('No pending ICE found for peer', peerId);
|
|
523
568
|
}
|
|
524
569
|
});
|
|
525
570
|
};
|
|
@@ -532,12 +577,6 @@ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSessio
|
|
|
532
577
|
this._pendingPeersIce[peerId].push(iceCandidate);
|
|
533
578
|
};
|
|
534
579
|
|
|
535
|
-
TurnWebRtcSessionV2.prototype._iceStateDisconnected = function _iceStateDisconnected(peerConnection) {
|
|
536
|
-
if (peerConnection.peerType === _constants.CLIENT_TYPES.INITIATOR) {
|
|
537
|
-
this._destroyPeerConnection(peerConnection);
|
|
538
|
-
}
|
|
539
|
-
};
|
|
540
|
-
|
|
541
580
|
//#endregion
|
|
542
581
|
|
|
543
582
|
|
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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"]}
|
package/lib/webrtc/stream.js
CHANGED
|
@@ -31,9 +31,7 @@ exports.EVENTS = _stream.EVENTS;
|
|
|
31
31
|
var TORCH_DELAY = 1500;
|
|
32
32
|
var isIE11 = new _tsEnvironmentDetect.TsEnvironmentDetect().isIE11();
|
|
33
33
|
|
|
34
|
-
var
|
|
35
|
-
return window.TsWebRTCStreamDebug === true;
|
|
36
|
-
});
|
|
34
|
+
var tracer = (0, _tracer.getTracer)();
|
|
37
35
|
|
|
38
36
|
/**
|
|
39
37
|
* WebRTC-specific implementation of TsMediaStream.
|
|
@@ -239,7 +237,7 @@ var TsWebRTCStream = exports.TsWebRTCStream = function (_TsMediaStream) {
|
|
|
239
237
|
var bindVideoStreamToElement = function bindVideoStreamToElement(stream, target) {
|
|
240
238
|
return new Promise(function (resolve, reject) {
|
|
241
239
|
var doResolve = function doResolve(videoEl) {
|
|
242
|
-
trace('Video element created successfully');
|
|
240
|
+
tracer.trace('Video element created successfully');
|
|
243
241
|
resolve(videoEl);
|
|
244
242
|
};
|
|
245
243
|
|
|
@@ -263,17 +261,17 @@ var TsWebRTCStream = exports.TsWebRTCStream = function (_TsMediaStream) {
|
|
|
263
261
|
var playRes = videoEl.play();
|
|
264
262
|
if (playRes && playRes.then) {
|
|
265
263
|
playRes.then(function () {
|
|
266
|
-
trace('Video element play success');
|
|
264
|
+
tracer.trace('Video element play success');
|
|
267
265
|
});
|
|
268
266
|
}
|
|
269
267
|
|
|
270
268
|
if (playRes && playRes.catch) {
|
|
271
269
|
playRes.catch(function (error) {
|
|
272
|
-
trace('Reject while executing play method on video element', error);
|
|
270
|
+
tracer.trace('Reject while executing play method on video element', error);
|
|
273
271
|
});
|
|
274
272
|
}
|
|
275
273
|
} catch (error) {
|
|
276
|
-
trace('Error while executing play method on video element', error);
|
|
274
|
+
tracer.trace('Error while executing play method on video element', error);
|
|
277
275
|
}
|
|
278
276
|
|
|
279
277
|
if (isIE11) {
|
|
@@ -354,9 +352,9 @@ var TsWebRTCStream = exports.TsWebRTCStream = function (_TsMediaStream) {
|
|
|
354
352
|
window.WebRTCAdapter.unBindVideoElement(videoEl);
|
|
355
353
|
if (videoEl && videoEl.parentNode && videoEl.parentNode.removeChild) {
|
|
356
354
|
videoEl.parentNode.removeChild(videoEl);
|
|
357
|
-
trace('Video element removed successfully');
|
|
355
|
+
tracer.trace('Video element removed successfully');
|
|
358
356
|
} else {
|
|
359
|
-
trace('Video element not removed', videoEl, videoEl.parentNode);
|
|
357
|
+
tracer.trace('Video element not removed', videoEl, videoEl.parentNode);
|
|
360
358
|
}
|
|
361
359
|
doResolve();
|
|
362
360
|
} else {
|