@techsee/techsee-media-service 999.20.0-nodejs20 → 999.20.2-alpha

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.
Files changed (209) hide show
  1. package/README.md +28 -27
  2. package/lib/LocalStreamManager.d.ts +0 -1
  3. package/lib/LocalStreamManager.d.ts.map +1 -1
  4. package/lib/LocalStreamManager.js +84 -82
  5. package/lib/LocalStreamManager.js.map +1 -1
  6. package/lib/MediaConstants.d.ts +3 -21
  7. package/lib/MediaConstants.d.ts.map +1 -1
  8. package/lib/MediaConstants.js +13 -32
  9. package/lib/MediaConstants.js.map +1 -1
  10. package/lib/MediaContracts.d.ts +1 -7
  11. package/lib/MediaContracts.d.ts.map +1 -1
  12. package/lib/MediaContracts.js +4 -1
  13. package/lib/MediaContracts.js.map +1 -1
  14. package/lib/MediaPublisher.d.ts +0 -1
  15. package/lib/MediaPublisher.d.ts.map +1 -1
  16. package/lib/MediaPublisher.js +10 -7
  17. package/lib/MediaPublisher.js.map +1 -1
  18. package/lib/MediaServiceBase.d.ts +0 -1
  19. package/lib/MediaServiceBase.d.ts.map +1 -1
  20. package/lib/MediaServiceBase.js +199 -170
  21. package/lib/MediaServiceBase.js.map +1 -1
  22. package/lib/MediaSession/MediaServer.d.ts +0 -1
  23. package/lib/MediaSession/MediaServer.d.ts.map +1 -1
  24. package/lib/MediaSession/MediaServer.js +74 -62
  25. package/lib/MediaSession/MediaServer.js.map +1 -1
  26. package/lib/MediaSession/MediaSessionBase.d.ts +0 -1
  27. package/lib/MediaSession/MediaSessionBase.d.ts.map +1 -1
  28. package/lib/MediaSession/MediaSessionBase.js +23 -19
  29. package/lib/MediaSession/MediaSessionBase.js.map +1 -1
  30. package/lib/MediaSession/SessionOpentok.d.ts +0 -1
  31. package/lib/MediaSession/SessionOpentok.d.ts.map +1 -1
  32. package/lib/MediaSession/SessionOpentok.js +80 -51
  33. package/lib/MediaSession/SessionOpentok.js.map +1 -1
  34. package/lib/MediaSession/SessionTurn.d.ts +0 -1
  35. package/lib/MediaSession/SessionTurn.d.ts.map +1 -1
  36. package/lib/MediaSession/SessionTurn.js +151 -109
  37. package/lib/MediaSession/SessionTurn.js.map +1 -1
  38. package/lib/MediaSession/TurnConstants.d.ts +0 -1
  39. package/lib/MediaSession/TurnConstants.d.ts.map +1 -1
  40. package/lib/MediaSession/TurnConstants.js +16 -1
  41. package/lib/MediaSession/TurnConstants.js.map +1 -1
  42. package/lib/MediaSubscriber.d.ts +0 -1
  43. package/lib/MediaSubscriber.d.ts.map +1 -1
  44. package/lib/MediaSubscriber.js +43 -37
  45. package/lib/MediaSubscriber.js.map +1 -1
  46. package/lib/MediaUtils/Compatibility.d.ts +0 -3
  47. package/lib/MediaUtils/Compatibility.d.ts.map +1 -1
  48. package/lib/MediaUtils/Compatibility.js +34 -76
  49. package/lib/MediaUtils/Compatibility.js.map +1 -1
  50. package/lib/MediaUtils/MediaDomUtils.d.ts +3 -6
  51. package/lib/MediaUtils/MediaDomUtils.d.ts.map +1 -1
  52. package/lib/MediaUtils/MediaDomUtils.js +65 -70
  53. package/lib/MediaUtils/MediaDomUtils.js.map +1 -1
  54. package/lib/MediaUtils/MediaTracer.d.ts +0 -1
  55. package/lib/MediaUtils/MediaTracer.d.ts.map +1 -1
  56. package/lib/MediaUtils/MediaTracer.js +5 -2
  57. package/lib/MediaUtils/MediaTracer.js.map +1 -1
  58. package/lib/MultiParty/Contracts.d.ts +10 -0
  59. package/lib/MultiParty/Contracts.d.ts.map +1 -0
  60. package/lib/MultiParty/Contracts.js +6 -0
  61. package/lib/MultiParty/Contracts.js.map +1 -0
  62. package/lib/MultiParty/DetectWebRtcService.d.ts +14 -17
  63. package/lib/MultiParty/DetectWebRtcService.d.ts.map +1 -1
  64. package/lib/MultiParty/DetectWebRtcService.js +54 -98
  65. package/lib/MultiParty/DetectWebRtcService.js.map +1 -1
  66. package/lib/MultiParty/MediaCapabilitiesHelper.d.ts +10 -0
  67. package/lib/MultiParty/MediaCapabilitiesHelper.d.ts.map +1 -0
  68. package/lib/MultiParty/MediaCapabilitiesHelper.js +140 -0
  69. package/lib/MultiParty/MediaCapabilitiesHelper.js.map +1 -0
  70. package/lib/MultiParty/MultiParty.d.ts +19 -0
  71. package/lib/MultiParty/MultiParty.d.ts.map +1 -0
  72. package/lib/MultiParty/MultiParty.js +160 -0
  73. package/lib/MultiParty/MultiParty.js.map +1 -0
  74. package/lib/MultiParty/OpentokMultiparty.d.ts +25 -0
  75. package/lib/MultiParty/OpentokMultiparty.d.ts.map +1 -0
  76. package/lib/MultiParty/OpentokMultiparty.js +184 -0
  77. package/lib/MultiParty/OpentokMultiparty.js.map +1 -0
  78. package/lib/TechseeMediaStream.d.ts +0 -1
  79. package/lib/TechseeMediaStream.d.ts.map +1 -1
  80. package/lib/TechseeMediaStream.js +12 -9
  81. package/lib/TechseeMediaStream.js.map +1 -1
  82. package/lib/oldCode/constants.js +20 -0
  83. package/lib/oldCode/constants.js.map +1 -0
  84. package/lib/oldCode/event-emitter.js +39 -0
  85. package/lib/oldCode/event-emitter.js.map +1 -0
  86. package/lib/oldCode/index.js +64 -0
  87. package/lib/oldCode/index.js.map +1 -0
  88. package/lib/oldCode/opentok/session.js +310 -0
  89. package/lib/oldCode/opentok/session.js.map +1 -0
  90. package/lib/oldCode/opentok/stream.js +310 -0
  91. package/lib/oldCode/opentok/stream.js.map +1 -0
  92. package/lib/oldCode/publisher.js +143 -0
  93. package/lib/oldCode/publisher.js.map +1 -0
  94. package/lib/oldCode/service.js +395 -0
  95. package/lib/oldCode/service.js.map +1 -0
  96. package/lib/oldCode/session.js +110 -0
  97. package/lib/oldCode/session.js.map +1 -0
  98. package/lib/oldCode/stream.js +195 -0
  99. package/lib/oldCode/stream.js.map +1 -0
  100. package/lib/oldCode/subscriber.js +90 -0
  101. package/lib/oldCode/subscriber.js.map +1 -0
  102. package/lib/oldCode/tracer.d.ts +36 -0
  103. package/lib/oldCode/tracer.d.ts.map +1 -0
  104. package/lib/oldCode/tracer.js +161 -0
  105. package/lib/oldCode/tracer.js.map +1 -0
  106. package/lib/oldCode/utils/ImageFixer.d.ts +1 -0
  107. package/lib/oldCode/utils/ImageFixer.d.ts.map +1 -0
  108. package/lib/oldCode/utils/ImageFixer.js +59 -0
  109. package/lib/oldCode/utils/ImageFixer.js.map +1 -0
  110. package/lib/oldCode/webrtc/constants.js +114 -0
  111. package/lib/oldCode/webrtc/constants.js.map +1 -0
  112. package/lib/oldCode/webrtc/helper.js +173 -0
  113. package/lib/oldCode/webrtc/helper.js.map +1 -0
  114. package/lib/oldCode/webrtc/session-kms.js +558 -0
  115. package/lib/oldCode/webrtc/session-kms.js.map +1 -0
  116. package/lib/oldCode/webrtc/session-loopback.js +336 -0
  117. package/lib/oldCode/webrtc/session-loopback.js.map +1 -0
  118. package/lib/oldCode/webrtc/session-turn.js +880 -0
  119. package/lib/oldCode/webrtc/session-turn.js.map +1 -0
  120. package/lib/oldCode/webrtc/session-turn.v2.js +583 -0
  121. package/lib/oldCode/webrtc/session-turn.v2.js.map +1 -0
  122. package/lib/oldCode/webrtc/session.js +52 -0
  123. package/lib/oldCode/webrtc/session.js.map +1 -0
  124. package/lib/oldCode/webrtc/stream.js +674 -0
  125. package/lib/oldCode/webrtc/stream.js.map +1 -0
  126. package/lib/oldCode/webrtc/temasys/adapter-loader.js +12 -0
  127. package/lib/oldCode/webrtc/temasys/adapter-loader.js.map +1 -0
  128. package/lib/oldCode/webrtc/temasys/adapter.js +5861 -0
  129. package/lib/oldCode/webrtc/temasys/adapter.js.map +1 -0
  130. package/lib/oldCode/webrtc/webrtc-ie-shim.js +3007 -0
  131. package/lib/oldCode/webrtc/webrtc-ie-shim.js.map +1 -0
  132. package/lib/qos/raw-qos.js +145 -84
  133. package/lib/qos/raw-qos.js.map +1 -1
  134. package/lib/webrtc-ie-shim.js +2950 -1896
  135. package/lib/webrtc-ie-shim.js.map +1 -1
  136. package/package.json +61 -66
  137. package/lib/MediaUtils/index.d.ts +0 -2
  138. package/lib/MediaUtils/index.d.ts.map +0 -1
  139. package/lib/MediaUtils/index.js +0 -6
  140. package/lib/MediaUtils/index.js.map +0 -1
  141. package/lib/MultiParty/MediaCapabilitiesService.d.ts +0 -18
  142. package/lib/MultiParty/MediaCapabilitiesService.d.ts.map +0 -1
  143. package/lib/MultiParty/MediaCapabilitiesService.js +0 -158
  144. package/lib/MultiParty/MediaCapabilitiesService.js.map +0 -1
  145. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts +0 -6
  146. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts.map +0 -1
  147. package/lib/MultiParty/MediaCapabilitiesUtils.js +0 -123
  148. package/lib/MultiParty/MediaCapabilitiesUtils.js.map +0 -1
  149. package/lib/MultiParty/MediaTracer.d.ts +0 -4
  150. package/lib/MultiParty/MediaTracer.d.ts.map +0 -1
  151. package/lib/MultiParty/MediaTracer.js +0 -10
  152. package/lib/MultiParty/MediaTracer.js.map +0 -1
  153. package/lib/MultiParty/MultiPartyService.d.ts +0 -49
  154. package/lib/MultiParty/MultiPartyService.d.ts.map +0 -1
  155. package/lib/MultiParty/MultiPartyService.js +0 -30
  156. package/lib/MultiParty/MultiPartyService.js.map +0 -1
  157. package/lib/MultiParty/MultiPartyServiceFactory.d.ts +0 -4
  158. package/lib/MultiParty/MultiPartyServiceFactory.d.ts.map +0 -1
  159. package/lib/MultiParty/MultiPartyServiceFactory.js +0 -13
  160. package/lib/MultiParty/MultiPartyServiceFactory.js.map +0 -1
  161. package/lib/MultiParty/MultipartyServiceEventTypes.d.ts +0 -89
  162. package/lib/MultiParty/MultipartyServiceEventTypes.d.ts.map +0 -1
  163. package/lib/MultiParty/MultipartyServiceEventTypes.js +0 -16
  164. package/lib/MultiParty/MultipartyServiceEventTypes.js.map +0 -1
  165. package/lib/MultiParty/index.d.ts +0 -7
  166. package/lib/MultiParty/index.d.ts.map +0 -1
  167. package/lib/MultiParty/index.js +0 -25
  168. package/lib/MultiParty/index.js.map +0 -1
  169. package/lib/MultiParty/opentok/OpentokMultiPartyService.d.ts +0 -38
  170. package/lib/MultiParty/opentok/OpentokMultiPartyService.d.ts.map +0 -1
  171. package/lib/MultiParty/opentok/OpentokMultiPartyService.js +0 -492
  172. package/lib/MultiParty/opentok/OpentokMultiPartyService.js.map +0 -1
  173. package/lib/MultiParty/opentok/OpentokPublisher.d.ts +0 -34
  174. package/lib/MultiParty/opentok/OpentokPublisher.d.ts.map +0 -1
  175. package/lib/MultiParty/opentok/OpentokPublisher.js +0 -121
  176. package/lib/MultiParty/opentok/OpentokPublisher.js.map +0 -1
  177. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.d.ts +0 -20
  178. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.d.ts.map +0 -1
  179. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.js +0 -49
  180. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.js.map +0 -1
  181. package/lib/MultiParty/opentok/OpentokScreenPublisher.d.ts +0 -6
  182. package/lib/MultiParty/opentok/OpentokScreenPublisher.d.ts.map +0 -1
  183. package/lib/MultiParty/opentok/OpentokScreenPublisher.js +0 -48
  184. package/lib/MultiParty/opentok/OpentokScreenPublisher.js.map +0 -1
  185. package/lib/MultiParty/opentok/OpentokSubscriber.d.ts +0 -2
  186. package/lib/MultiParty/opentok/OpentokSubscriber.d.ts.map +0 -1
  187. package/lib/MultiParty/opentok/OpentokSubscriber.js +0 -26
  188. package/lib/MultiParty/opentok/OpentokSubscriber.js.map +0 -1
  189. package/lib/MultiParty/opentok/OpentokVideoPublisher.d.ts +0 -19
  190. package/lib/MultiParty/opentok/OpentokVideoPublisher.d.ts.map +0 -1
  191. package/lib/MultiParty/opentok/OpentokVideoPublisher.js +0 -182
  192. package/lib/MultiParty/opentok/OpentokVideoPublisher.js.map +0 -1
  193. package/lib/MultiParty/opentok/trace.d.ts +0 -3
  194. package/lib/MultiParty/opentok/trace.d.ts.map +0 -1
  195. package/lib/MultiParty/opentok/trace.js +0 -18
  196. package/lib/MultiParty/opentok/trace.js.map +0 -1
  197. package/lib/MultiParty/opentok.d.ts +0 -463
  198. package/lib/MultiParty/types.d.ts +0 -33
  199. package/lib/MultiParty/types.d.ts.map +0 -1
  200. package/lib/MultiParty/types.js +0 -3
  201. package/lib/MultiParty/types.js.map +0 -1
  202. package/lib/MultiParty/utils.d.ts +0 -10
  203. package/lib/MultiParty/utils.d.ts.map +0 -1
  204. package/lib/MultiParty/utils.js +0 -17
  205. package/lib/MultiParty/utils.js.map +0 -1
  206. package/lib/qos/raw-qos.d.ts +0 -29
  207. package/lib/qos/raw-qos.d.ts.map +0 -1
  208. package/lib/webrtc-ie-shim.d.ts +0 -4
  209. package/lib/webrtc-ie-shim.d.ts.map +0 -1
@@ -0,0 +1,583 @@
1
+ 'use strict';
2
+
3
+ exports.__esModule = true;
4
+ exports.TurnWebRtcSessionV2 = undefined;
5
+
6
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
7
+
8
+ var _session = require('../session');
9
+
10
+ var _socket = require('socket.io-client');
11
+
12
+ var io = _interopRequireWildcard(_socket);
13
+
14
+ var _constants = require('./constants');
15
+
16
+ var _stream = require('./stream');
17
+
18
+ var _tracer = require('../tracer');
19
+
20
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
21
+
22
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
23
+
24
+ function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
25
+
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
+
28
+ var tracer = (0, _tracer.getTracer)();
29
+
30
+ //Currently this version supports subscribing only. Publishing will be implemented as needed.
31
+
32
+ var TurnWebRtcSessionV2 = exports.TurnWebRtcSessionV2 = function (_TsMediaSession) {
33
+ _inherits(TurnWebRtcSessionV2, _TsMediaSession);
34
+
35
+ _createClass(TurnWebRtcSessionV2, [{
36
+ key: 'id',
37
+ get: function get() {
38
+ return this._credentials.sessionId;
39
+ }
40
+ }]);
41
+
42
+ function TurnWebRtcSessionV2(_ref) {
43
+ var credentials = _ref.credentials,
44
+ constraints = _ref.constraints,
45
+ clientType = _ref.clientType,
46
+ streamFactory = _ref.streamFactory;
47
+
48
+ _classCallCheck(this, TurnWebRtcSessionV2);
49
+
50
+ var _this = _possibleConstructorReturn(this, _TsMediaSession.call(this));
51
+
52
+ _this._socket = null;
53
+ _this._localPeer = null;
54
+ _this._pendingPeersIce = {};
55
+ _this._peerConnections = new Map();
56
+
57
+ _this._credentials = credentials;
58
+ _this._constraints = constraints;
59
+ _this._selfClientType = clientType;
60
+ _this._localStreamFactory = streamFactory;
61
+
62
+ _this._connectPromise = null;
63
+
64
+ var iceServers = credentials.ice.map(function (item) {
65
+ return {
66
+ urls: item.url,
67
+ username: item.login,
68
+ credential: item.password
69
+ };
70
+ });
71
+
72
+ _this._configuration = {
73
+ iceServers: iceServers,
74
+ iceTransportPolicy: 'relay'
75
+ };
76
+
77
+ _this._joinResponseHandler = _this._joinResponseHandler.bind(_this);
78
+ _this._iceCandidateReceivedHandler = _this._iceCandidateReceivedHandler.bind(_this);
79
+ _this._sendOfferHandler = _this._sendOfferHandler.bind(_this);
80
+ _this._sdpOfferHandler = _this._sdpOfferHandler.bind(_this);
81
+ _this._initiatorReconnectHandler = _this._initiatorReconnectHandler.bind(_this);
82
+ _this._peerDisconnectedHandler = _this._peerDisconnectedHandler.bind(_this);
83
+
84
+ _this._extendPeerConnection();
85
+ return _this;
86
+ }
87
+
88
+ //#region Socket Connectivity
89
+
90
+ TurnWebRtcSessionV2.prototype.connect = function connect() {
91
+ var _this2 = this;
92
+
93
+ var connectOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
94
+
95
+ if (this._connectPromise) {
96
+ tracer.trace('already connecting');
97
+ return this._connectPromise;
98
+ }
99
+
100
+ tracer.trace('connect');
101
+
102
+ this._connectPromise = this._connectSocket(this._credentials.url, connectOnly).then(function () {
103
+ tracer.trace('Joining SessionId: ' + _this2._credentials.sessionId);
104
+
105
+ _this2._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {
106
+ clientType: _this2._selfClientType,
107
+ sessionId: _this2._credentials.sessionId
108
+ });
109
+
110
+ _this2._connectPromise = null;
111
+ }).catch(function (error) {
112
+ setTimeout(function () {
113
+ return _this2._connectPromise = null;
114
+ });
115
+ _this2.emit(_session.SESSION_EVENTS.EXCEPTION, { source: 'connect', error: error });
116
+ throw error;
117
+ });
118
+
119
+ return this._connectPromise;
120
+ };
121
+
122
+ TurnWebRtcSessionV2.prototype.disconnect = function disconnect() {
123
+ var _this3 = this;
124
+
125
+ tracer.trace('Disconnecting from media session');
126
+
127
+ this._peerConnections.forEach(function (peerConnection) {
128
+ _this3._destroyPeerConnection(peerConnection);
129
+ });
130
+
131
+ this._socket.off();
132
+ this._socket.disconnect();
133
+
134
+ this.emit(_session.SESSION_EVENTS.DISCONNECTED, { reason: 'disconnected' });
135
+ };
136
+
137
+ TurnWebRtcSessionV2.prototype._connectSocket = function _connectSocket(url, connectOnly) {
138
+ var _this4 = this;
139
+
140
+ return new Promise(function (resolve, reject) {
141
+ var socket = _this4._socket = io.connect(url, {
142
+ 'forceNew': true,
143
+ 'reconnectionDelay': _constants.SOCKET_RECONNECTION_DELAY,
144
+ 'reconnectionDelayMax': _constants.SOCKET_RECONNECTION_DELAY_MAX,
145
+ 'reconnectionAttempts': _constants.SOCKET_RECONNECTION_ATTEMPTS,
146
+ 'path': _constants.SOCKET_PATH
147
+ });
148
+
149
+ var done = _.once(function (err) {
150
+ err ? reject(err) : resolve();
151
+ });
152
+
153
+ socket.once('connect', function () {
154
+ return done();
155
+ });
156
+ socket.on(_constants.SOCKET_EVENTS.INCOMING.ERROR, done);
157
+ socket.on('connect_error', done);
158
+ socket.on('connect_timeout', done);
159
+
160
+ socket.on('reconnect_attempt', function (args) {
161
+ tracer.trace('Session Socket reconnect_attempt', args);
162
+ });
163
+
164
+ socket.on('reconnecting', function (args) {
165
+ tracer.trace('Session Socket reconnecting', args);
166
+ });
167
+
168
+ socket.on('disconnect', function (reason) {
169
+ tracer.trace('Session Socket disconnected, reason:', reason);
170
+ // The initial example of differentiating between "forced" disconnect and "network" disconnect is taken from:
171
+ // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99
172
+ //if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {
173
+ // the disconnection was initiated by the server or by client, you need to call (connect) manually
174
+ _this4.disconnect();
175
+ //}
176
+ });
177
+
178
+ if (!connectOnly) {
179
+ //PUBLISHING NOT SUPPORTED YET
180
+ //socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);
181
+ //socket.on(SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, this._joinResponseHandler);
182
+ //socket.on(SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, this._peerDisconnectedHandler);
183
+
184
+ socket.on(_constants.SOCKET_EVENTS.INCOMING.SDP_OFFER, _this4._sdpOfferHandler);
185
+ socket.on(_constants.SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, _this4._initiatorReconnectHandler);
186
+
187
+ socket.on(_constants.SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, _this4._iceCandidateReceivedHandler);
188
+ }
189
+ });
190
+ };
191
+
192
+ //#endregion
193
+
194
+ //#region WebRTC Initiator - session Initiator (User on mobile device)
195
+
196
+ // Received by Initiator, causing him to emit SDP_OFFER
197
+
198
+
199
+ TurnWebRtcSessionV2.prototype._sendOfferHandler = function _sendOfferHandler(_ref2) {
200
+ var _this5 = this;
201
+
202
+ var uid = _ref2.uid,
203
+ peerId = _ref2.peerId;
204
+
205
+ tracer.trace('_sendOfferHandler');
206
+
207
+ var peerConnection = this._createPeerConnection(peerId, _constants.CLIENT_TYPES.GUEST);
208
+ var offerParams = { offerToReceiveAudio: true, offerToReceiveVideo: true };
209
+
210
+ this._localStreamFactory(this._constraints).then(function (localStream) {
211
+ tracer.trace('_sendOfferHandler stream and peer created');
212
+
213
+ var peerConnectionStream = new _stream.TsWebRTCStream(_this5, localStream.clone(), _constants.DEFAULT_STREAM_NAMES.MOBILE_CLIENT_VIDEO_STREAM, false);
214
+
215
+ peerConnectionStream.peerConnection = peerConnection;
216
+
217
+ localStream.getTracks().forEach(function (track) {
218
+ tracer.trace('Adding local tracks to peer connection');
219
+ peerConnection.addTrack(track, peerConnectionStream._mediaStream);
220
+ });
221
+
222
+ _this5.registerStream(peerConnectionStream.id, peerConnectionStream);
223
+ }).then(function () {
224
+ return peerConnection.createOffer(offerParams);
225
+ }).then(function (offerDesc) {
226
+ tracer.trace('Initiator has created sdp offer', { offerDesc: offerDesc });
227
+
228
+ _this5._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.SDP_OFFER, {
229
+ uid: uid,
230
+ peerId: peerId,
231
+ sessionId: _this5._credentials.sessionId,
232
+ sdpOffer: offerDesc.sdp
233
+ });
234
+
235
+ return peerConnection.setLocalDescription(offerDesc).then(function () {
236
+ tracer.trace('Local description was set on');
237
+ });
238
+ }).catch(function (e) {
239
+ tracer.trace('Error', e);
240
+ });
241
+ };
242
+
243
+ // Received by the Initiator: Indicates that publish should be started
244
+
245
+
246
+ TurnWebRtcSessionV2.prototype._joinResponseHandler = function _joinResponseHandler(_ref3) {
247
+ var _this6 = this;
248
+
249
+ var sdpAnswer = _ref3.sdpAnswer,
250
+ uid = _ref3.uid,
251
+ peerId = _ref3.peerId;
252
+
253
+ tracer.trace('joinResponse Received', sdpAnswer);
254
+
255
+ this._withPeerConnection(peerId, function (peerConnection) {
256
+ var answer = new RTCSessionDescription({
257
+ type: 'answer',
258
+ sdp: sdpAnswer
259
+ });
260
+
261
+ peerConnection.setRemoteDescription(answer).then(function () {
262
+ tracer.trace('Remote description was set', answer);
263
+
264
+ _this6._processQueuedIceCandidates(peerId);
265
+ }).catch(function (e) {
266
+ tracer.trace('Error', e);
267
+ });
268
+ });
269
+ };
270
+
271
+ // Received by Initiator after a guests socket has been disconnected
272
+
273
+
274
+ TurnWebRtcSessionV2.prototype._peerDisconnectedHandler = function _peerDisconnectedHandler(_ref4) {
275
+ var peerId = _ref4.peerId;
276
+
277
+ tracer.trace('_peerDisconnectedHandler');
278
+ };
279
+
280
+ //#endregion WebRTC Initiator - session Initiator (User on mobile device)
281
+
282
+ //#region WebRTC Guest - session Guest (Agent on dashboard platform)
283
+
284
+ // Received by Guest, causing him to emit SDP_ANSWER
285
+
286
+
287
+ TurnWebRtcSessionV2.prototype._sdpOfferHandler = function _sdpOfferHandler(_ref5) {
288
+ var _this7 = this;
289
+
290
+ var sdpOffer = _ref5.sdpOffer,
291
+ peerId = _ref5.peerId,
292
+ uid = _ref5.uid;
293
+
294
+ tracer.trace('sdpOffer Received', { sdpOffer: sdpOffer });
295
+
296
+ var peerConnection = this._createPeerConnection(peerId, _constants.CLIENT_TYPES.INITIATOR);
297
+
298
+ var subscriberInitChain = Promise.resolve();
299
+
300
+ if (this._constraints.audio) {
301
+ subscriberInitChain = subscriberInitChain.then(function () {
302
+ tracer.trace('Creating agent local streams');
303
+
304
+ return _this7._localStreamFactory(_this7._constraints).then(function (localStream) {
305
+ localStream.getTracks().forEach(function (track) {
306
+ tracer.trace('Adding local tracks to peer connection');
307
+
308
+ if (track.kind === 'audio') {
309
+
310
+ var stream = new MediaStream([track]);
311
+ var streamName = _constants.DEFAULT_STREAM_NAMES.DASHBOARD_AUDIO_STREAM;
312
+ var agentAudioStream = new _stream.TsWebRTCStream(_this7, stream, streamName, false);
313
+
314
+ _this7.registerStream(agentAudioStream.id, agentAudioStream);
315
+ peerConnection.addTrack(track, peerConnection.peerLogicalStream);
316
+
317
+ tracer.trace('Agent audio stream added to peerConnection');
318
+ }
319
+ });
320
+ });
321
+ });
322
+ }
323
+
324
+ subscriberInitChain.then(function () {
325
+ var remoteDesc = new RTCSessionDescription({ type: 'offer', sdp: sdpOffer });
326
+
327
+ return peerConnection.setRemoteDescription(remoteDesc).then(function () {
328
+ tracer.trace('Remote description was set', remoteDesc);
329
+
330
+ return peerConnection.createAnswer().then(function (sdpAnswer) {
331
+ tracer.trace('_sdpOfferHandler answer created', sdpAnswer);
332
+
333
+ _this7._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {
334
+ uid: uid,
335
+ peerId: peerId,
336
+ sessionId: _this7._credentials.sessionId,
337
+ sdpAnswer: sdpAnswer.sdp
338
+ });
339
+
340
+ return peerConnection.setLocalDescription(sdpAnswer).then(function () {
341
+ tracer.trace('_sdpOfferHandler local desc was set');
342
+
343
+ _this7._processQueuedIceCandidates(peerId);
344
+ });
345
+ });
346
+ });
347
+ });
348
+
349
+ return subscriberInitChain.catch(function (e) {
350
+ tracer.trace('Error in _sdpOfferHandler', e);
351
+ throw e;
352
+ });
353
+ };
354
+
355
+ // Received by Guest after an Initiator reconnects to room
356
+
357
+
358
+ TurnWebRtcSessionV2.prototype._initiatorReconnectHandler = function _initiatorReconnectHandler() {
359
+ tracer.trace('_initiatorReconnectHandler');
360
+
361
+ var initiatorPeer = this._getInitiatorPeer();
362
+
363
+ if (initiatorPeer) {
364
+ this._destroyPeerConnection(initiatorPeer);
365
+ }
366
+
367
+ this.emit(_session.SESSION_EVENTS.RECONNECT_TURN_SERVER);
368
+ };
369
+
370
+ TurnWebRtcSessionV2.prototype._getInitiatorPeer = function _getInitiatorPeer() {
371
+ var peer = this._getPeerConnectionsByType(_constants.CLIENT_TYPES.INITIATOR);
372
+
373
+ return peer.length > 0 ? peer[0] : null;
374
+ };
375
+
376
+ //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)
377
+
378
+ //#region Peer Connection
379
+
380
+ TurnWebRtcSessionV2.prototype._createPeerConnection = function _createPeerConnection(peerId, peerConnectionType) {
381
+ var _this8 = this;
382
+
383
+ if (this._peerConnections.get(peerId)) {
384
+ throw new Error(this._selfClientType + ' peer connection for ' + peerId + ' already exists');
385
+ }
386
+
387
+ var peerConnection = new RTCPeerConnection(this._configuration);
388
+
389
+ peerConnection.peerId = peerId;
390
+ peerConnection.peerType = peerConnectionType;
391
+ peerConnection.peerLogicalStream = new MediaStream();
392
+
393
+ peerConnection.oniceconnectionstatechange = function (state) {
394
+ tracer.trace('ICE Connection state for peer ' + peerId + ' was changed to: ' + state.currentTarget.iceConnectionState, state);
395
+ var cnnState = state.currentTarget.iceConnectionState;
396
+ if (cnnState === 'disconnected') {
397
+ //According to https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState
398
+ //Connection can become active again, so we will do nothing.
399
+ // if (peerConnection.peerType === CLIENT_TYPES.INITIATOR) {
400
+ // //this._destroyPeerConnection(peerConnection);
401
+ // this.disconnect();
402
+ // }
403
+ } else if (cnnState === 'failed' || cnnState === 'closed') {
404
+ //According to https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState
405
+ //When iceConnectionState is failed or closed, the peer connection can be destroyed.
406
+ //In our case, we disconnecting from media session, and when session will be needed again, it will be connected.
407
+ _this8.disconnect();
408
+ }
409
+ };
410
+
411
+ peerConnection.onicecandidate = function (event) {
412
+ if (event.candidate) {
413
+ tracer.trace(_this8._selfClientType + ' peerConn.onicecandidate', event.candidate);
414
+ _this8._socket.emit(_constants.SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {
415
+ sessionId: _this8._credentials.sessionId,
416
+ peerId: peerId,
417
+ candidate: event.candidate,
418
+ clientType: _this8._selfClientType
419
+ });
420
+ } else {
421
+ tracer.trace('ICE Candidate is null in peerConnection', event);
422
+ }
423
+ };
424
+
425
+ if (this._selfClientType === _constants.CLIENT_TYPES.GUEST) {
426
+ peerConnection.ontrack = function (trackEvent) {
427
+ var track = trackEvent.track,
428
+ streams = trackEvent.streams;
429
+
430
+
431
+ tracer.trace('Stream created from peer connection track: ' + track.kind, track, streams.length > 0 ? streams[0] : 'NO STREAM');
432
+
433
+ var tsStream = new _stream.TsWebRTCStream(_this8, new MediaStream([track]));
434
+
435
+ tsStream.peerConnection = peerConnection;
436
+ tsStream.remote = true;
437
+
438
+ _this8.registerStream(tsStream.id, tsStream);
439
+
440
+ _this8.emit(_session.SESSION_EVENTS.STREAM_CREATED, tsStream);
441
+ };
442
+ }
443
+
444
+ this._peerConnections.set(peerId, peerConnection);
445
+
446
+ tracer.trace(this._selfClientType + ' peerConnection created');
447
+
448
+ return peerConnection;
449
+ };
450
+
451
+ TurnWebRtcSessionV2.prototype._destroyPeerConnection = function _destroyPeerConnection(peerConnection) {
452
+ var _this9 = this;
453
+
454
+ if (this._selfClientType === _constants.CLIENT_TYPES.GUEST) {
455
+ this._getRemoteStreams(peerConnection).forEach(function (stream) {
456
+ _this9.unregisterStream(stream.id);
457
+ _this9.emit(_session.SESSION_EVENTS.STREAM_DESTROYED, { stream: stream });
458
+ });
459
+ }
460
+
461
+ if (this._selfClientType === _constants.CLIENT_TYPES.INITIATOR && this._peerConnections.size === 0) {
462
+ //TODO - ALEX: When initiator will be implemented, here we need to destroy local stream (or better raise, event).
463
+ }
464
+
465
+ this._peerConnections.delete(peerConnection.peerId);
466
+ peerConnection.close();
467
+ };
468
+
469
+ TurnWebRtcSessionV2.prototype._getRemoteStreams = function _getRemoteStreams(peerConnection) {
470
+ var result = [];
471
+
472
+ this.streams.forEach(function (stream) {
473
+ if (stream.peerConnection === peerConnection && stream.remote) {
474
+ result.push(stream);
475
+ }
476
+ });
477
+
478
+ return result;
479
+ };
480
+
481
+ TurnWebRtcSessionV2.prototype._getPeerConnectionsByType = function _getPeerConnectionsByType(peerType) {
482
+ var result = [];
483
+
484
+ this._peerConnections.forEach(function (peerConnection) {
485
+ if (peerConnection.peerType === peerType) {
486
+ result.push(peerConnection);
487
+ }
488
+ });
489
+
490
+ return result;
491
+ };
492
+
493
+ TurnWebRtcSessionV2.prototype._withPeerConnection = function _withPeerConnection(peerId, callback) {
494
+ if (this._peerConnections.get(peerId)) {
495
+ return callback(this._peerConnections.get(peerId));
496
+ }
497
+
498
+ return null;
499
+ };
500
+
501
+ TurnWebRtcSessionV2.prototype._extendPeerConnection = function _extendPeerConnection() {
502
+ //TODO - Alex: Need to modify IE shim, and add these methods inside shim itself
503
+
504
+ if (!RTCPeerConnection.prototype.peerId) {
505
+ RTCPeerConnection.prototype.peerId = '';
506
+ }
507
+
508
+ if (!RTCPeerConnection.prototype.peerType) {
509
+ RTCPeerConnection.prototype.peerType = null;
510
+ }
511
+
512
+ if (!RTCPeerConnection.prototype.peerLogicalStream) {
513
+ RTCPeerConnection.prototype.peerLogicalStream = null;
514
+ }
515
+ };
516
+
517
+ //#endregion
518
+
519
+ //#region ICE Candidates
520
+
521
+ TurnWebRtcSessionV2.prototype._iceCandidateReceivedHandler = function _iceCandidateReceivedHandler(_ref6) {
522
+ var candidate = _ref6.candidate,
523
+ peerId = _ref6.peerId;
524
+
525
+ tracer.trace('_iceCandidateReceivedHandler', candidate);
526
+ if (!candidate) {
527
+ tracer.trace('NO iceCandidate');
528
+
529
+ return;
530
+ }
531
+
532
+ var peerConnection = this._peerConnections.get(peerId);
533
+
534
+ if (!peerConnection || !peerConnection.remoteDescription) {
535
+ tracer.trace('Queueing iceCandidate', candidate);
536
+ this._queueIceCandidate(candidate, peerId);
537
+
538
+ return;
539
+ }
540
+
541
+ tracer.trace('Going to add iceCandidate', candidate);
542
+ this._addIceCandidateToPeer(candidate, peerConnection);
543
+ };
544
+
545
+ TurnWebRtcSessionV2.prototype._addIceCandidateToPeer = function _addIceCandidateToPeer(iceCandidate, peerConnection) {
546
+ return peerConnection.addIceCandidate(iceCandidate).then(function () {
547
+ tracer.trace('ICE Candidate add to peer connection');
548
+ }).catch(function (e) {
549
+ tracer.trace('Error adding ICE Candidate to peer connection', e);
550
+ });
551
+ };
552
+
553
+ TurnWebRtcSessionV2.prototype._processQueuedIceCandidates = function _processQueuedIceCandidates(peerId) {
554
+ var _this10 = this;
555
+
556
+ this._withPeerConnection(peerId, function (peerConnection) {
557
+ var pendingIces = _this10._pendingPeersIce[peerId];
558
+
559
+ if (pendingIces) {
560
+ pendingIces.forEach(function (pendingIce) {
561
+ tracer.trace('Adding pending ICE to peer connections');
562
+ _this10._addIceCandidateToPeer(pendingIce, peerConnection);
563
+ });
564
+ } else {
565
+ tracer.trace('No pending ICE found for peer', peerId);
566
+ }
567
+ });
568
+ };
569
+
570
+ TurnWebRtcSessionV2.prototype._queueIceCandidate = function _queueIceCandidate(iceCandidate, peerId) {
571
+ if (!this._pendingPeersIce[peerId]) {
572
+ this._pendingPeersIce[peerId] = [];
573
+ }
574
+
575
+ this._pendingPeersIce[peerId].push(iceCandidate);
576
+ };
577
+
578
+ //#endregion
579
+
580
+
581
+ return TurnWebRtcSessionV2;
582
+ }(_session.TsMediaSession);
583
+ //# sourceMappingURL=session-turn.v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["oldCode/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 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 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"]}