UNPKG

podchat-browser

Version:

Javascript SDK to use POD's Chat Service - Browser Only

1,273 lines (1,110 loc) 80.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _callUsers = _interopRequireDefault(require("./callUsers")); var _utility = _interopRequireDefault(require("../../../utility/utility")); var _callServerManager = _interopRequireDefault(require("../callServerManager")); var _constants = require("../../constants"); var _errorHandler = require("../../errorHandler"); var _peerConnectionManager = _interopRequireDefault(require("./peerConnectionManager")); var _screenShareStateManager = _interopRequireDefault(require("../screenShareStateManager")); var _messageExecutorQueue = _interopRequireDefault(require("../../store/messageExecutorQueue")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function MultiTrackCallManager(_ref) { var app = _ref.app, callId = _ref.callId, callConfig = _ref.callConfig; var config = { callId: callId, callConfig: callConfig, users: new _callUsers["default"]({ app: app, callId: callId }), callServerController: new _callServerManager["default"](app), screenShareInfo: new _screenShareStateManager["default"](app), sendPeerManager: null, receivePeerManager: null, receivePeerSdpVersion: 0, isReconnecting: false, isReceivePeerReconnecting: false, isDestroyed: false, onChatReadyUniqueId: null, inquiryCallCounter: 0, receivePeerReConnectTimes: 0, ti: atob(callConfig.tInfo).split(":") }; var publicized = { processCallMessage: processCallMessage, requestReceivingMedia: requestReceivingMedia, callStop: callStop, endCall: app.call.endCall, screenShareInfo: config.screenShareInfo, getCallDetails: getCallDetails, sendCallMessage: sendCallMessage, callServerController: function callServerController() { return config.callServerController; }, callConfig: function callConfig() { return config.callConfig; }, users: function users() { return config.users; }, getCallId: function getCallId() { return config.callId; }, setReceivePeerSdpVersion: function setReceivePeerSdpVersion(sdpVersion) { config.receivePeerSdpVersion = sdpVersion; }, getReceivePeerSdpVersion: function getReceivePeerSdpVersion(sdpVersion) { return config.receivePeerSdpVersion; }, sendPeerManager: function sendPeerManager() { return config.sendPeerManager; }, receivePeerManager: function receivePeerManager() { return config.receivePeerManager; }, sendCallLog: sendCallLog }; config.callMessageExecutor = new _messageExecutorQueue["default"]({ app: app, executorTimeout: 10, callback: publicized.processCallMessage }); function socketConnectListener() { if (!config.inquiryCallCounter) { var dataChangeDetected = false; config.inquiryCallCounter++; setTimeout(function () { config.inquiryCallCounter = 0; if (!config.isDestroyed && (config.receivePeerManager && config.receivePeerManager.isPeerFailed() || config.sendPeerManager && config.sendPeerManager.isPeerFailed())) { socketConnectListener(); } }, 9000); config.isReconnecting = true; app.call.inquiryCallParticipants.inquiryCallParticipants({}, /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(result) { var _result$result, _result$result2, serverUsers, serverUserIds, localScreenShare, _callId; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (result.hasError) { _context.next = 15; break; } app.chatEvents.fireEvent("callEvents", { type: "INQUIRY_CALL_RESULT", callId: config.callId, result: result }); if ((_result$result = result.result) !== null && _result$result !== void 0 && _result$result.callParticipantVOs && result.result.callParticipantVOs.length) { serverUsers = (_result$result2 = result.result) === null || _result$result2 === void 0 ? void 0 : _result$result2.callParticipantVOs; //Sync local users with server users serverUsers.forEach(function (item) { if (!config.users.userExists(item.userId)) { config.users.addItem({ clientId: item.participantVO.ssoId, topicSend: item.sendTopic, mute: item.mute, video: item.video, userId: item.userId, callId: config.callId, cameraPaused: false, brokerAddress: config.callConfig.brokerAddress }); dataChangeDetected = true; } else { config.users.get(item.userId).correctWithServerData(item); } }); serverUserIds = serverUsers.map(function (item) { return item.userId; }); Object.keys(config.users.getAll()).forEach(function (key) { if (!serverUserIds.includes(Number(key)) && key != 'screenShare') { config.users.removeItem(key); } dataChangeDetected = true; }); } //TODO: IT gives screenShareUser client id instead of its chat user id, // It might needs change in future if (!Number(result.result.screenShareUser)) { _context.next = 8; break; } localScreenShare = config.users.get('screenShare'); if (!localScreenShare || !!localScreenShare && localScreenShare.isOwnerChanged(Number(result.result.screenShareUser))) { correctWhenScreenOwnerChanged({ inquiryResult: result.result, dataChangeDetected: dataChangeDetected }); } _context.next = 12; break; case 8: if (!config.users.userExists('screenShare')) { _context.next = 12; break; } _context.next = 11; return config.users.removeItem('screenShare'); case 11: dataChangeDetected = true; case 12: // if (Number(result.result.recordingUser)) { // app.chatEvents.fireEvent('callEvents', { // type: 'CALL_RECORDING_STARTED', // callId: config.callId, // result: { // id: result.result.recordingUser // } // }); // } else if(config.callConfig.recordingOwner) { // app.chatEvents.fireEvent('callEvents', { // type: 'STOP_RECORDING_CALL', // callId: config.callId, // result: { // id: config.callConfig.recordingOwner // } // }); // } setTimeout(function () { config.isReconnecting = true; checkPeersState(); }, 500); _context.next = 16; break; case 15: if (result.errorCode == 171) { _callId = config.callId; sendCallLog(_constants.callLog.levels.INFO, _constants.callLog.types.GENERAL, "[SDK_BROWSER][inquiryCallParticipants] End call because of errorCode 171 from chat."); app.call.endCall({ callId: config.callId }, null); app.callsManager.removeItem(config.callId); app.chatEvents.fireEvent('callEvents', { type: 'YOU_DROPPED_FROM_CALL', callId: _callId, result: { callId: _callId, userId: app.store.user.get().id } }); } else if (result.errorCode == 163) { sendCallLog(_constants.callLog.levels.INFO, _constants.callLog.types.GENERAL, "[SDK_BROWSER][inquiryCallParticipants] End call because of errorCode 163 from chat."); app.call.endCall({ callId: config.callId }, null); app.chatEvents.fireEvent('callEvents', { type: 'CALL_ENDED', callId: config.callId }); app.callsManager.removeItem(config.callId); } case 16: case "end": return _context.stop(); } } }, _callee); })); return function (_x) { return _ref2.apply(this, arguments); }; }()); } } function sendCallLog(logLevel, logType, log) { var uniqueId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; sendCallMessage({ id: 'CALL_LOG', token: app.sdkParams.token, chatId: config.callId, clientId: config.users.get(app.store.user.get().id).user().clientId, logLevel: logLevel, logType: logType, log: log, uniqueId: uniqueId ? uniqueId : _utility["default"].generateUUID() }, null, {}); } function correctWhenScreenOwnerChanged(_x2) { return _correctWhenScreenOwnerChanged.apply(this, arguments); } function _correctWhenScreenOwnerChanged() { _correctWhenScreenOwnerChanged = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(_ref3) { var inquiryResult, dataChangeDetected, screenOwnerChatId; return _regenerator["default"].wrap(function _callee9$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: inquiryResult = _ref3.inquiryResult, dataChangeDetected = _ref3.dataChangeDetected; screenOwnerChatId = config.users.findUserIdByClientId(Number(inquiryResult.screenShareUser)); config.callConfig.screenShareOwner = screenOwnerChatId; config.screenShareInfo.setOwner(config.callConfig.screenShareOwner); config.screenShareInfo.setIsStarted(true); // if (config.screenShareInfo.isStarted()) { config.callConfig.screenShareObject.clientId = Number(inquiryResult.screenShareUser); config.callConfig.screenShareObject.brokerAddress = config.callConfig.brokerAddress; // config.screenShareInfo.setOwner(config.callConfig.screenShareOwner); // } if (!config.users.userExists('screenShare')) { _context10.next = 11; break; } _context10.next = 10; return config.users.removeItem('screenShare'); case 10: dataChangeDetected = true; case 11: config.users.addItem(config.callConfig.screenShareObject, "screenShare"); case 12: case "end": return _context10.stop(); } } }, _callee9); })); return _correctWhenScreenOwnerChanged.apply(this, arguments); } function getPeersState() { var sendPeerFailed = false, receivePeerFailed = false; /** * Consider state new as failed, for when user is reconnecting so much and sdk has created the peer in the previous try */ var badStates = ['failed', 'new']; if (!config.sendPeerManager || config.sendPeerManager && (badStates.includes(config.sendPeerManager.getPeer().peerConnection.connectionState) || badStates.includes(config.sendPeerManager.getPeer().peerConnection.iceConnectionState))) { sendPeerFailed = true; } if (!config.receivePeerManager || config.receivePeerManager && (badStates.includes(config.receivePeerManager.getPeer().peerConnection.connectionState) || badStates.includes(config.receivePeerManager.getPeer().peerConnection.iceConnectionState))) { receivePeerFailed = true; } return { receiveFailed: receivePeerFailed, sendFailed: sendPeerFailed }; } function checkPeersState() { var peersState = getPeersState(); var failed = { sendPeer: false, receivePeer: false }; if (peersState.receiveFailed) { failed.receivePeer = true; } else { checkReceivePeerStateWithJanus(); } if (peersState.sendFailed) { failed.sendPeer = true; } else if (config.screenShareInfo.iAmOwner() && config.users.get('screenShare')) {//TODO: Needs improvement // config.sendPeerManager.removeTrack(`screen-Share-${config.callId}`); // setTimeout(()=>{ // config.users.get('screenShare').startVideo(); // }, 2000); } if (failed.sendPeer || failed.receivePeer) { reconnectFailedPeers(failed); } } function checkReceivePeerStateWithJanus() { config.receivePeerManager.resetSendQueue(); config.isReconnecting = false; new Promise(function (resolve) { sendCallMessage({ id: 'REQUEST_RECEIVING_MEDIA', token: app.sdkParams.token, chatId: config.callId, brokerAddress: config.callConfig.brokerAddress }, null // result => { // if(result.done == false) // return // // if (result && result.recvList && result.recvList.length) { // try { // let processedTopics = []; // // let list = JSON.parse(result.recvList); // app.logger.log(app.logger.tags.CALL_PROCESS.id, // `[media][RECEIVING_MEDIA] `, // `Received.. , clientIds: ${list.map(it => it.clientId).join(', ')} ||| topics: ${list.map(it => it.topic).join(', ')}` // ); // // let localCallUsers = config.users.getAll(); // Object.keys(localCallUsers) // //TODO: add screenshare check // .forEach(userId => { // // if (userId == 'screenShare' ) { // if( // localCallUsers[userId].isVideoOpen() // && !config.screenShareInfo.iAmOwner() // && !list.find(item => item.topic == `screen-Share-${config.callId}`) // ) { // config.receivePeerManager.removeTrack(`screen-Share-${config.callId}`); // localCallUsers[userId].destroyVideo(); // } // } else { // if (localCallUsers[userId].isVideoOpen() && !list.find(item => item.topic == `Vi-send-${config.callId}-${localCallUsers[userId].user().clientId}`)) { // config.receivePeerManager.removeTrack(`Vi-send-${config.callId}-${localCallUsers[userId].user().clientId}`); // localCallUsers[userId].destroyVideo(); // } // // if (localCallUsers[userId].isAudioOpen() && !list.find(item => item.topic == `Vo-send-${config.callId}-${localCallUsers[userId].user().clientId}`)) { // config.receivePeerManager.removeTrack(`Vi-send-${config.callId}-${localCallUsers[userId].user().clientId}`); // localCallUsers[userId].destroyAudio(); // } // } // }); // } catch (error) { // console.error('Unable to parse receive list', error); // } // } // // resolve(); // // } , { timeoutTime: 2000, timeoutRetriesCount: 2 }); }); // .then(() => { // new Promise(resolve => { // sendCallMessage({ // id: 'REQUEST_LATEST_SDP_OFFER', // token: app.sdkParams.token, // chatId: config.callId, // sdpVersion: config.receivePeerSdpVersion, // clientId: config.users.get(app.store.user.get().id).user().clientId // }, result => { // if (result.sdpVersion == config.receivePeerSdpVersion) {} // else if (result.unfinishedTopic) { // result.topic = result.unfinishedTopic; // handleProcessSdpOffer(result); // resolve(); // } else if (result.sdpOffer) { // handleProcessLatestSdpOffer(result); // } // // setTimeout(()=> { // config.isReconnecting = false; // sendCallMessage({ // id: 'REQUEST_RECEIVING_MEDIA', // token: app.sdkParams.token, // chatId: config.callId, // brokerAddress: config.callConfig.brokerAddress // }, null, {}) // },2000); // }, {timeoutTime: 2000, timeoutRetriesCount: 2}); // }); // }); } function onSendTrackFailed() { reconnectFailedPeers({}); } function reconnectFailedPeers(_ref4) { var _ref4$sendPeer = _ref4.sendPeer, sendPeer = _ref4$sendPeer === void 0 ? true : _ref4$sendPeer, _ref4$receivePeer = _ref4.receivePeer, receivePeer = _ref4$receivePeer === void 0 ? true : _ref4$receivePeer; var sendPeerFailed = false, receivePeerFailed = false; config.isReconnecting = true; if (sendPeer) { sendPeerFailed = true; } if (receivePeer) { receivePeerFailed = true; config.isReceivePeerReconnecting = true; } // let badStates = ['failed', 'new']; // if(!config.sendPeerManager // || (config.sendPeerManager // && badStates.includes(config.sendPeerManager.getPeer().peerConnection.connectionState) // ) // ) { // sendPeerFailed = true; // // destroyPeerManager('send'); // } // console.log('xxx sendPeerManager', config.sendPeerManager.getPeer().peerConnection.connectionState) // // if(!config.receivePeerManager // || (config.receivePeerManager // && badStates.includes(config.receivePeerManager.getPeer().peerConnection.connectionState) // ) // ) { // receivePeerFailed = true; // // destroyPeerManager('receive'); // } if (receivePeerFailed) { app.chatEvents.fireEvent('callEvents', { type: 'PEER_RECONNECTING', callId: config.callId, direction: 'receive' }); config.users.stopAllReceivers(); } if (sendPeerFailed) { app.chatEvents.fireEvent('callEvents', { type: 'PEER_RECONNECTING', callId: config.callId, direction: 'send' }); config.users.stopAllSenders(false); } setTimeout(function () { sendPeerFailed && destroyPeerManager('send'); receivePeerFailed && destroyPeerManager('receive'); publicized.relocateResources({ releaseSend: sendPeerFailed, releaseReceive: receivePeerFailed }).then(function (result) { setTimeout(function () { receivePeerFailed && createPeerManager('receive'); sendPeerFailed && createPeerManager('send'); setTimeout(function () { if (sendPeerFailed) { config.users.startAllsenders(); } if (receivePeerFailed) { Object.values(config.users.getAll()).forEach(function (user) { if (!user.isMe()) { user.resetTopicVersions(); } }); } setTimeout(function () { config.isReceivePeerReconnecting = false; config.isReconnecting = false; requestReceivingMedia(); }, 20); // else { // config.receivePeerManager.repairMutedTracks(); // // requestReceivingMedia(); // config.isReconnecting = false; // sendCallMessage({ // id: 'REQUEST_LATEST_SDP_OFFER', // token: app.sdkParams.token, // chatId: config.callId, // sdpVersion: config.receivePeerSdpVersion, // clientId: config.users.get(app.store.user.get().id).user().clientId // }, null, {}); // } }, 200); }, 200); }); }, 300); } function onPeerFailed() { if (app.messenger.chatState) { socketConnectListener(); } } function checkTURNServer(turnIp, port) { var useUDP = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var username = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; var password = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; var timeout = arguments.length > 5 ? arguments[5] : undefined; var url = 'turn:' + turnIp + ':' + port + '?transport=' + (useUDP ? 'udp' : 'tcp'); var turnConfig = { urls: url, username: username, credential: password }; if (navigator.userAgent.indexOf('firefox') !== -1 && navigator.userAgent.indexOf('92.0.5') !== -1) { alert('Browser version is not suitable for video call. Upgrade or use another browser.'); } return new Promise(function (resolve) { var promiseResolved = false; setTimeout(function () { if (!promiseResolved) { promiseResolved = true; resolve(false); } }, timeout || 5000); var pc = new RTCPeerConnection({ iceServers: [turnConfig] }); pc.createDataChannel("test"); // اسم خالی نذار pc.createOffer().then(function (sdp) { if (sdp.sdp.indexOf('typ relay') > -1) { promiseResolved = true; resolve(true); } return pc.setLocalDescription(sdp); })["catch"](function () { return resolve(false); }); pc.onicecandidate = function (ice) { if (promiseResolved || !ice.candidate || !ice.candidate.candidate) return; if (ice.candidate.candidate.indexOf('typ relay') > -1) { promiseResolved = true; resolve(true); } }; }); } function destroyPeerManager(direction) { if (direction === 'send') { if (config.sendPeerManager) { config.sendPeerManager.destroy(); config.sendPeerManager = null; } } else { if (config.receivePeerManager) { config.receivePeerManager.destroy(); config.receivePeerManager = null; config.users.resetTopicVersions(); config.receivePeerSdpVersion = 0; } } } function createPeerManager(direction) { if (direction == 'send') { config.sendPeerManager = new _peerConnectionManager["default"]({ app: app, callId: callId, direction: 'send', rtcPeerConfig: { iceServers: publicized.getTurnServer(publicized.callConfig()), iceTransportPolicy: 'relay' }, brokerAddress: config.callConfig.brokerAddress, onPeerFailed: onPeerFailed, onSendTrackFailed: onSendTrackFailed }); } else { config.receivePeerManager = new _peerConnectionManager["default"]({ app: app, callId: callId, direction: 'receive', rtcPeerConfig: { iceServers: publicized.getTurnServer(publicized.callConfig()), iceTransportPolicy: 'relay' }, brokerAddress: config.callConfig.brokerAddress, onPeerFailed: onPeerFailed }); } } function startCallWebRTCFunctions(callConfig) { config.callServerController.setServers(callConfig.kurentoAddress); createPeerManager('send'); createPeerManager('receive'); config.onChatReadyUniqueId = app.chatEvents.on('chatReady', socketConnectListener); new Promise( /*#__PURE__*/function () { var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(resolve) { var callVideo, callMute, i, clientId, screenOwnerClientId, _iterator, _step, user, callConf, serversTemp, turnCheckRes; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: callVideo = typeof callConfig.video === 'boolean' ? callConfig.video : true, callMute = typeof callConfig.mute === 'boolean' ? callConfig.mute : false; if (callConfig.selfData) { callConfig.selfData.callId = config.callId; callConfig.selfData.cameraPaused = callConfig.cameraPaused; callConfig.selfData.brokerAddress = config.callConfig.brokerAddress; config.users.addItem(callConfig.selfData); // callStateController.setupCallParticipant(params.selfData); } config.screenShareInfo.setOwner(callConfig.screenShareOwner); config.screenShareInfo.setIsStarted(!!callConfig.screenShareOwner); if (callConfig.recordingOwner) { app.chatEvents.fireEvent('callEvents', { type: 'CALL_RECORDING_STARTED', callId: config.callId, result: { id: callConfig.recordingOwner } }); } if (callConfig.clientsList && callConfig.clientsList.length) { for (i in callConfig.clientsList) { if (callConfig.clientsList[i].userId !== app.store.user.get().id) { callConfig.clientsList[i].callId = config.callId; callConfig.clientsList[i].cameraPaused = false; callConfig.clientsList[i].brokerAddress = config.callConfig.brokerAddress; config.users.addItem(callConfig.clientsList[i]); } } } config.callConfig.screenShareObject = { callId: config.callId, cameraPaused: false, userId: "screenShare", topicSend: callConfig.screenShare }; config.screenShareInfo.setIsStarted(!!config.callConfig.screenShareOwner); if (config.screenShareInfo.isStarted()) { clientId = callConfig.screenShare.split('-')[2]; _iterator = _createForOfIteratorHelper(callConfig.clientsList); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { user = _step.value; if (user.userId == config.callConfig.screenShareOwner) { screenOwnerClientId = user.clientId; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } config.callConfig.screenShareObject.clientId = screenOwnerClientId; config.callConfig.screenShareObject.brokerAddress = config.callConfig.brokerAddress; config.screenShareInfo.setOwner(config.callConfig.screenShareOwner); config.users.addItem(config.callConfig.screenShareObject, "screenShare"); } config.callConfig.callVideo = callVideo; config.callConfig.callAudio = callMute; callConf = publicized.callConfig(), serversTemp = app.call.sharedVariables.useInternalTurnAddress ? callConf.internalTurnAddress.split(',') : callConf.turnAddress.split(','), turnCheckRes = false; if (app.call.sharedVariables.useCustomTurnAddress) { serversTemp = [app.call.sharedVariables.callTurnIp]; } if (serversTemp && serversTemp.length) { new Promise( /*#__PURE__*/function () { var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(resolve, reject) { var _i; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.t0 = _regenerator["default"].keys(serversTemp); case 1: if ((_context2.t1 = _context2.t0()).done) { _context2.next = 11; break; } _i = _context2.t1.value; _context2.next = 5; return checkTURNServer(serversTemp[_i].split(":")[0], '3478', true, config.ti[0], config.ti[1], 2000); case 5: turnCheckRes = _context2.sent; if (!turnCheckRes) { _context2.next = 9; break; } createSessionInChat(); return _context2.abrupt("return", resolve()); case 9: _context2.next = 1; break; case 11: if (turnCheckRes) { _context2.next = 16; break; } publicized.raiseCallError(_errorHandler.errorList.TURN_SERVERS_NOT_ACCESSIBLE, null, true); sendCallLog(_constants.callLog.levels.ERROR, _constants.callLog.types.TRACK_FLOW, "[SDK_BROWSER][turnsInaccessible] Failed to connect to turn servers."); app.call.endCall({ callId: config.callId }); return _context2.abrupt("return", reject()); case 16: case "end": return _context2.stop(); } } }, _callee2); })); return function (_x4, _x5) { return _ref6.apply(this, arguments); }; }()); } else { publicized.raiseCallError(_errorHandler.errorList.TURN_SERVERS_NOT_ACCESSIBLE, null, true); app.call.endCall({ callId: config.callId }); } resolve(); case 15: case "end": return _context3.stop(); } } }, _callee3); })); return function (_x3) { return _ref5.apply(this, arguments); }; }()).then(function () { app.call.currentCall().sendCallDivs(); }); } function createSessionInChat() { app.call.callStopQueue.callStarted = true; var message = { id: 'CREATE_SESSION', brokerAddress: config.callConfig.brokerAddress, turnAddress: config.callConfig.turnAddress.split(',')[0], chatId: callId, // clientId: app.sdkParams.token token: app.sdkParams.token }, onResultCallback = function onResultCallback(res) { if (res.done === 'TRUE') { app.call.callStopQueue.callStarted = true; var user = config.users.get(app.store.user.get().id); //Start my own senders if (user.user().video) { user.startVideo(user.user().topicSend, null); } if (!user.user().mute) { user.startAudio(user.user().topicSend, null); } } else { publicized.raiseCallError(_errorHandler.errorList.CREATE_SESSION_TIMEOUT, null, true); app.chatEvents.fireEvent('callEvents', { type: 'YOU_DROPPED_FROM_CALL', callId: app.call.currentCall().getCallId(), result: { callId: app.call.currentCall().getCallId(), userId: app.store.user.get().id } }); app.call.endCall({ callId: app.call.currentCall().getCallId() }); } }; sendCallMessage(message, onResultCallback, { timeoutTime: 4000, timeoutRetriesCount: 5 }); } function callStop() { return _callStop.apply(this, arguments); } function _callStop() { _callStop = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() { var resetCurrentCallId, resetCameraPaused, _args11 = arguments; return _regenerator["default"].wrap(function _callee10$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: resetCurrentCallId = _args11.length > 0 && _args11[0] !== undefined ? _args11[0] : true; resetCameraPaused = _args11.length > 1 && _args11[1] !== undefined ? _args11[1] : true; _context11.next = 4; return config.users.destroy(); case 4: config.sendPeerManager && config.sendPeerManager.destroy(); config.receivePeerManager && config.receivePeerManager.destroy(); if (app.call.callStopQueue.callStarted) { sendCallMessage({ id: 'EXIT_CLIENT', token: app.sdkParams.token }, null, {}); app.call.callStopQueue.callStarted = false; } if (resetCameraPaused) app.call.joinCallParams.cameraPaused = false; clearTimeout(config.callRequestTimeout); config.callConfig = {}; if (resetCurrentCallId) config.callId = null; case 11: case "end": return _context11.stop(); } } }, _callee10); })); return _callStop.apply(this, arguments); } function sendCallMessage(message, callback, _ref7) { var _ref7$timeoutTime = _ref7.timeoutTime, timeoutTime = _ref7$timeoutTime === void 0 ? 0 : _ref7$timeoutTime, _ref7$timeoutRetriesC = _ref7.timeoutRetriesCount, timeoutRetriesCount = _ref7$timeoutRetriesC === void 0 ? 0 : _ref7$timeoutRetriesC; message.token = app.sdkParams.token; if (!message.uniqueId) { message.uniqueId = _utility["default"].generateUUID(); } message.chatId = config.callId; var data = { type: 3, content: { peerName: config.callServerController.getCurrentServer(), // callServerName, priority: 1, content: JSON.stringify(message), ttl: app.sdkParams.messageTtl }, uniqueId: message.uniqueId }; if (typeof callback == 'function') { app.store.messagesCallbacks[message.uniqueId] = callback; } app.call.sharedVariables.asyncClient.send(data, function (res) {}); if (timeoutTime || app.call.sharedVariables.globalCallRequestTimeout > 0) { app.store.asyncRequestTimeouts[message.uniqueId] && clearTimeout(app.store.asyncRequestTimeouts[message.uniqueId]); app.store.asyncRequestTimeouts[message.uniqueId] = setTimeout(function () { if (app.store.messagesCallbacks[message.uniqueId]) { delete app.store.messagesCallbacks[message.uniqueId]; } if (timeoutRetriesCount) { app.sdkParams.consoleLogging && console.log("[SDK][sendCallMessage] Retrying call request. uniqueId :" + message.uniqueId, { message: message }); //timeoutCallback(); sendCallMessage(message, callback, { timeoutTime: timeoutTime, timeoutRetriesCount: timeoutRetriesCount - 1 }); } else if (typeof callback == 'function') { /** * Request failed */ callback({ done: 'SKIP' }); } }, timeoutTime || app.call.sharedVariables.globalCallRequestTimeout); } } var trackChangeTimeout = null; function handleReceivingTracksChanges(jsonMessage) { if (!config.receivePeerManager) return; if (jsonMessage && jsonMessage.recvList && jsonMessage.recvList.length) { try { var processedTopics = []; var list = JSON.parse(jsonMessage.recvList); app.logger.log(app.logger.tags.CALL_PROCESS.id, "[media][RECEIVING_MEDIA] ", "Received.. , clientIds: ".concat(list.map(function (it) { return it.clientId; }).join(', '), " ||| topics: ").concat(list.map(function (it) { return it.topic; }).join(', '))); // console.log('[media][RECEIVING_MEDIA] Received.. , clientIds: ', list.map(it => it.clientId).join(', '),' ||| topics: ', list.map(it => it.topic).join(', ')); for (var i = list.length - 1; i >= 0; i--) { if (!processedTopics.includes(list[i].topic)) { processedTopics.push(list[i].topic); var userId = config.users.findUserIdByTopic(list[i].topic); var user = config.users.get(userId); app.logger.log(app.logger.tags.CALL_PROCESS.id, "[media][RECEIVING_MEDIA][User] ", " clientId: ".concat(list[i].clientId, " , topic: ").concat(list[i].topic, " , item: , ").concat(list[i], ", ").concat({ userId: userId, user: user })); if (user) { if (user.isScreenShare() && !config.screenShareInfo.iAmOwner() || !user.isMe()) { user.processTrackChange(list[i]); } } else { console.log('[media][RECEIVING_MEDIA] User not found in the call , clientIds: ', list[i]); console.error('[SDK][handleReceivingTracksChanges] User not found in the call. ', list[i]); } } } } catch (error) { console.error('Unable to parse receive list', error); } } } var prevOffer = null; function handleProcessSdpOffer(jsonMessage) { if (!config.receivePeerManager) return; config.receivePeerManager.resetSubscribeOrUpdateFailedCount(); config.receivePeerSdpVersion = jsonMessage.sdpVersion; if (!config.receivePeerManager) return; config.receivePeerManager.removeRequestTimeout(jsonMessage.uniqueId); if (jsonMessage.topic && jsonMessage.topic.length) { var temp = jsonMessage.sdpOffer.substring(jsonMessage.sdpOffer.indexOf('IP4')); if (prevOffer == temp) { console.warn('[media][handleProcessSdpOffer] same offers', { prevOffer: prevOffer }, jsonMessage.sdpOffer); config.receivePeerManager.handleProcessSDPOfferForReceiveTrackUseExsistingTracks(jsonMessage, null); } else { config.receivePeerManager.handleProcessSDPOfferForReceiveTrack(jsonMessage, null); } prevOffer = temp; } } function handleProcessSdpNegotiate(jsonMessage) { if (!config.receivePeerManager) return; config.receivePeerSdpVersion = jsonMessage.sdpVersion; config.receivePeerManager.removeRequestTimeout(jsonMessage.uniqueId); config.receivePeerManager.addNegotiationOfferToQueue(jsonMessage.sdpOffer, jsonMessage.topic); config.receivePeerManager.maybeNextTrack(); } var requestReceivingMediaTimeout = null; function requestReceivingMedia() { requestReceivingMediaTimeout && clearTimeout(requestReceivingMediaTimeout); requestReceivingMediaTimeout = setTimeout(function () { sendCallMessage({ id: 'REQUEST_RECEIVING_MEDIA', token: app.sdkParams.token, chatId: config.callId, brokerAddress: config.callConfig.brokerAddress }, null, {}); }, 1000); } function handleProcessLatestSdpOffer(jsonMessage) { if (!config.receivePeerManager) return; config.receivePeerSdpVersion = jsonMessage.sdpVersion; config.receivePeerManager.removeRequestTimeout(jsonMessage.uniqueId); if (jsonMessage.sdpOffer) { config.receivePeerManager.addNegotiationOfferToQueue(jsonMessage.sdpOffer, []); } else { requestReceivingMedia(); } } function handleProcessSdpAnswer(jsonMessage) { if (!config.sendPeerManager) return; var peer = config.sendPeerManager.getPeer(); if (peer == null) { app.logger.warn(app.logger.tags.CALL_PROCESS.id, "[".concat(jsonMessage.id, "] "), { callId: config.callId, message: " Skip, no WebRTC Peer", info: getCallDetails() }); if (!config.isReconnecting) reconnectFailedPeers({ receivePeer: false }); return; } peer.processAnswer(jsonMessage.sdpAnswer, function (err) { if (err) { //sendCallSocketError("[handleProcessSdpAnswer] Error: " + err); sendCallLog(_constants.callLog.levels.ERROR, _constants.callLog.types.TRACK_FLOW, "[SDK_BROWSER][handleProcessSdpAnswer] Process sdpAnswer failed. Error: ".concat(err), jsonMessage.uniqueId); app.logger.error(app.logger.tags.CALL_PROCESS.id, "[processAnswer] ", { callId: config.callId, message: " Error: " + err, info: getCallDetails() }); if (!config.isDestroyed) reconnectFailedPeers({ receivePeer: false }); return; } config.sendPeerManager.removeRequestTimeout(jsonMessage.uniqueId); config.sendPeerManager.processingCurrentTrackCompleted(); }); } function handleSendAddIceCandidate(jsonMessage) { var peer = config.sendPeerManager.getPeer(); if (!peer) { app.logger.error(app.logger.tags.CALL_PROCESS.id, "[handleSendAddIceCandidate] ", { callId: config.callId, message: "Error: Skip, no WebRTC Peer ", info: getCallDetails() }); return; } if (jsonMessage.candidate && jsonMessage.candidate.length) { var candidate = JSON.parse(jsonMessage.candidate); config.sendPeerManager.addIceCandidateToQueue(candidate); } } function handleReceiveAddIceCandidate(jsonMessage) { if (!config.receivePeerManager) return; var peer = config.receivePeerManager.getPeer(); if (!peer) { app.logger.error(app.logger.tags.CALL_PROCESS.id, "[handleReceiveAddIceCandidate] ", { callId: config.callId, message: "Error: Skip, no WebRTC Peer ", info: getCallDetails() }); return; } if (jsonMessage.candidate && jsonMessage.candidate.length) { var candidate = JSON.parse(jsonMessage.candidate); config.receivePeerManager.addIceCandidateToQueue(candidate); } } function getCallDetails(customData) { return _objectSpread({ currentUser: app.store.user.get(), isJanus: config.callId && config.callServerController.isJanus(), screenShareInfo: { isStarted: config.screenShareInfo.isStarted(), iAmOwner: config.screenShareInfo.iAmOwner() }, callId: config.callId, startCallInfo: config.callConfig }, customData); } function sendCallSocketError(message) { app.chatEvents.fireEvent('callEvents', { type: 'CALL_ERROR', callId: config.callId, code: 7000, message: message, environmentDetails: getCallDetails() }); sendCallMessage({ id: 'ERROR', message: message }, null, {}); } function handleReceivedMetaData(jsonMessage, uniqueId) { var jMessage = JSON.parse(jsonMessage.message); var id = jMessage.id; if (!id || typeof id === "undefined" || jsonMessage.userid == app.store.user.get().id) { return; } switch (id) { case _constants.callMetaDataTypes.POORCONNECTION: publicized.sendQualityCheckEvent({ userId: jMessage.userid, topic: jMessage.content.description, //jMessage.topic, mediaType: jMessage.content.description.indexOf('Vi') !== -1 ? 'video' : 'audio', //jMessage.mediaType, canSendCallMetaData: false }); break; case _constants.callMetaDataTypes.POORCONNECTIONRESOLVED: publicized.sendQualityCheckEvent({ userId: jMessage.userid, topic: jMessage.content.description, mediaType: jMessage.content.description.indexOf('Vi') !== -1 ? 'video' : 'audio', isResolved: true, canSendCallMetaData: false }); break; case _constants.callMetaDataTypes.CUSTOMUSERMETADATA: if (app.store.messagesCallbacks[uniqueId]) { app.store.messagesCallbacks[uniqueId](jsonMessage); } app.chatEvents.fireEvent('callEvents', { type: 'CUSTOM_USER_METADATA', callId: config.callId, userId: jMessage.userid, content: jMessage.content }); break; case _constants.callMetaDataTypes.SCREENSHAREMETADATA: if (config.screenShareInfo.isStarted()) { config.screenShareInfo.setWidth(jMessage.content.dimension.width); config.screenShareInfo.setHeight(jMessage.content.dimension.height); app.chatEvents.fireEvent("callEvents", { type: 'SCREENSHARE_METADATA', callId: config.callId, userId: jMessage.userid, content: jMessage.content }); } break; } } function handleSlowLink(jsonMessage) { var userId = config.users.findUserIdByClientId(jsonMessage.client); config.users.get(userId).startSLowLink(); } function sendCallMetaData(params) { var message = { id: params.id, userid: params.userid, content: params.content || undefined }; sendCallMessage({ id: 'SENDMETADATA', message: JSON.stringify(message), chatId: config.callId }, null, {}); }