UNPKG

podchat-browser

Version:

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

1,302 lines (1,128 loc) 76.6 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 // canProcessSdpNegotiate: false }; 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; } }; 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 = 16; 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 = 17; break; case 16: if (result.errorCode == 171) { _callId = config.callId; 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) { app.call.endCall({ callId: config.callId }, null); app.chatEvents.fireEvent('callEvents', { type: 'CALL_ENDED', callId: config.callId }); app.callsManager.removeItem(config.callId); } case 17: case "end": return _context.stop(); } } }, _callee); })); return function (_x) { return _ref2.apply(this, arguments); }; }()); } } function correctWhenScreenOwnerChanged(_x2) { return _correctWhenScreenOwnerChanged.apply(this, arguments); } function _correctWhenScreenOwnerChanged() { _correctWhenScreenOwnerChanged = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(_ref3) { var inquiryResult, dataChangeDetected, screenOwnerChatId; return _regenerator["default"].wrap(function _callee7$(_context8) { while (1) { switch (_context8.prev = _context8.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')) { _context8.next = 11; break; } _context8.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 _context8.stop(); } } }, _callee7); })); 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; // destroyPeerManager('send'); } if (!config.receivePeerManager || config.receivePeerManager && (badStates.includes(config.receivePeerManager.getPeer().peerConnection.connectionState) || badStates.includes(config.receivePeerManager.getPeer().peerConnection.iceConnectionState))) { receivePeerFailed = true; // destroyPeerManager('receive'); } 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 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); // if (app.call.sharedVariables.callDivId) { new Promise(function (resolve) { var 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 (var 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()) { var clientId = callConfig.screenShare.split('-')[2]; var screenOwnerClientId; var _iterator = _createForOfIteratorHelper(callConfig.clientsList), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var 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; createSessionInChat(); resolve(); }).then(function () { app.call.currentCall().sendCallDivs(); }); // } else { // app.sdkParams.consoleLogging && console.log('No Call DIV has been declared!'); // } } 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 { app.call.currentCall().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() }); // app.callsManager.removeItem(config.callId); // endCall({callId: config.callId}); // callStop(true, true); } }; 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 _callee8() { var resetCurrentCallId, resetCameraPaused, _args9 = arguments; return _regenerator["default"].wrap(function _callee8$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: resetCurrentCallId = _args9.length > 0 && _args9[0] !== undefined ? _args9[0] : true; resetCameraPaused = _args9.length > 1 && _args9[1] !== undefined ? _args9[1] : true; _context9.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 _context9.stop(); } } }, _callee8); })); return _callStop.apply(this, arguments); } function sendCallMessage(message, callback, _ref5) { var _ref5$timeoutTime = _ref5.timeoutTime, timeoutTime = _ref5$timeoutTime === void 0 ? 0 : _ref5$timeoutTime, _ref5$timeoutRetriesC = _ref5.timeoutRetriesCount, timeoutRetriesCount = _ref5$timeoutRetriesC === void 0 ? 0 : _ref5$timeoutRetriesC; message.token = app.sdkParams.token; // let uniqueId; if (!message.uniqueId) { message.uniqueId = _utility["default"].generateUUID(); } // message.uniqueId = uniqueId; 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 })); // console.log('[media][[RECEIVING_MEDIA][User] clientId: ', list[i].clientId,' , topic: ', list[i].topic,' , item: ', list[i], {userId, user}); if (user) { if (user.isScreenShare() && !config.screenShareInfo.iAmOwner() || !user.isMe()) { user.processTrackChange(list[i]); // setTimeout(()=>{ // config.receivePeerManager && config.receivePeerManager.maybeNextTrack(); // }, 10); } // else if (user.isMe()){ // config.sendPeerManager.removeRequestTimeoutByTopic(list[i].topic); // config.sendPeerManager.processingCurrentTrackCompleted(); // } } 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]); } } } // trackChangeTimeout && clearTimeout(trackChangeTimeout); // trackChangeTimeout = setTimeout(() => { // config.receivePeerManager && config.receivePeerManager.maybeNextTrack(); // }, 10); } 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); // let topics = JSON.parse(jsonMessage.topic); 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(); // if (jsonMessage.sdpOffer) // config.receivePeerManager.handleProcessSDPOfferForRenegotiate(jsonMessage, null); } 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); // config.receivePeerSdpVersion = jsonMessage.sdpVersion; // // config.receivePeerManager.removeRequestTimeout(jsonMessage.uniqueId); if (jsonMessage.sdpOffer) { config.receivePeerManager.addNegotiationOfferToQueue(jsonMessage.sdpOffer, []); // config.receivePeerManager.handleProcessLatestSDPOffer(jsonMessage, () => { // requestReceivingMedia(); // }); } 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.peerConnection.onicecandidate = ({candidate}) => { // app.call.currentCall().sendCallMessage({ // id: "SEND_ADD_ICE_CANDIDATE", // token: app.sdkParams.token, // chatId: config.callId, // brokerAddress: config.callConfig.brokerAddress, // // iceCandidate: JSON.stringify(candidate), // }, null, {}); // }; peer.processAnswer(jsonMessage.sdpAnswer, function (err) { if (err) { sendCallSocketError("[handleProcessSdpAnswer] Error: " + err); 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() }); // app.chatEvents.fireEvent('callEvents', { // type: 'CALL_ERROR', // callId: config.callId, // code: 7000, // message: "[handleSendAddIceCandidate] Skip, no WebRTC Peer", // error: JSON.stringify(peer), // environmentDetails: getCallDetails() // }); return; } if (jsonMessage.candidate && jsonMessage.candidate.length) { var candidate = JSON.parse(jsonMessage.candidate); config.sendPeerManager.addIceCandidateToQueue(candidate); } } // let receiveAddIceCandidates = []; 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() }); // app.chatEvents.fireEvent('callEvents', { // type: 'CALL_ERROR', // callId: config.callId, // code: 7000, // message: "[handleReceiveAddIceCandidate] Skip, no WebRTC Peer", // error: JSON.stringify(peer), // environmentDetails: 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(), // currentServers: { // callTurnIp: app.call.sharedVariables.callTurnIp, // }, 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, {}); } function handleError(jsonMessage, sendingTopic, receiveTopic) { var errMessage = jsonMessage.message; app.chatEvents.fireEvent('callEvents', { type: 'CALL_ERROR', callId: config.callId, code: 7000, message: "Kurento error: " + errMessage, environmentDetails: getCallDetails() }); } function processCallMessage(message) { var uniqueId = message.uniqueId; if (message.done !== 'FALSE' || message.done === 'FALSE' && message.desc === 'duplicated') { app.store.asyncRequestTimeouts[uniqueId] && clearTimeout(app.store.asyncRequestTimeouts[uniqueId]); } else if (message.done === 'FALSE') { // app.chatEvents.fireEvent('callEvents', { // type: 'CALL_ERROR', // callId: config.callId, // code: 7000, // message: "Server error: " + (message.desc ? message.desc : message.message), // environmentDetails: getCallDetails() // }); app.logger.error(app.logger.tags.CALL_SERVER_MESSAGE.id, "[processCallMessage] ", { callId: config.callId, message: " Server error: " + (message.desc ? message.desc : message.message), info: getCallDetails() }); app.chatEvents.fireEvent("callEvents", { type: 'CALL_SERVER_ERROR', result: message }); } //app.logger.log('callMessage', `[${message.id}]`, message); app.logger.log(app.logger.tags.CALL_SERVER_MESSAGE.id, "[".concat(message.id, "] "), message); switch (message.id) { case 'PROCESS_SDP_ANSWER': //For send connection 1 handleProcessSdpAnswer(message); break; case 'SEND_COMPLETE': //For send connection 2 // config.sendPeerManager.processingCurrentTrackCompleted(); break; case 'RECEIVING_MEDIA': // Only for receiving topics from janus, first we subscribe if (app.store.messagesCallbacks[uniqueId]) { app.store.messagesCallbacks[uniqueId](message); } else { if (!config.isReconnecting) { handleReceivingTracksChanges(message); } } break; case 'UNPUBLISHED': // handleReceivingTracksChanges(message); break; case 'PROCESS_SDP_OFFER': //Then janus sends offers case 'PROCESS_SDP_UPDATE': config.receivePeerReConnectTimes = 0; handleProcessSdpOffer(message); break; case 'PROCESS_SDP_NEGOTIATE': config.receivePeerReConnectTimes = 0; if (app.store.messagesCallbacks[uniqueId]) { app.store.messagesCallbacks[uniqueId](message); } else { handleProcessSdpNegotiate(message); } // if(config.canProcessSdpNegotiate) { // config.canProcessSdpNegotiate = false; // } break; case 'PROCESS_LATEST_SDP_OFFER': config.receivePeerReConnectTimes = 0; if (app.store.messagesCallbacks[uniqueId]) { app.store.messagesCallbacks[uniqueId](message); } else { handleProcessLatestSdpOffer(message); } // handleProcessSdpNegotiate(message); // handleProcessSdpNegotiate(message); break; case 'SEND_ADD_ICE_CANDIDATE': handleSendAddIceCandidate(message); break; case 'RECIVE_ADD_ICE_CANDIDATE': handleReceiveAddIceCandidate(message); break; case 'JOIN_AADDITIONN_COMPLETE': // For receive connections 2 var topics = JSON.parse(message.topic); // let recvData = message.addition; // if(recvData && recvData.length) { // try { // recvData = JSON.parse(recvData); // } catch (error) { // console.error('Unable to parse JOIN_AADDITIONN_COMPLETE result', error); // } // let userId = config.users.findUserIdByTopic(recvData[0].topic); // if(recvData[0].topic.indexOf('Vo-') > -1) { // let el = config.users.get(userId).getAudioHtmlElement(); // config.htmlElements[config.user.audioTopicName] = el; // config.users.get(userId).appendAudioToCallDiv(); // } else { // let el = config.users.get(userId).getVideoHtmlElement(); // config.htmlElements[config.user.videoTopicName] = el; // config.users.get(userId).appendVideoToCallDiv(); // } // } config.receivePeerManager && config.receivePeerManager.processingCurrentTrackCompleted(); // config.isReconnecting = false; // config.receivePeerManager && requestReceivingMedia(); break; case 'JOIN_DELETION_COMPLETE': config.receivePeerManager && co