podchat-browser
Version:
Javascript SDK to use POD's Chat Service - Browser Only
1,273 lines (1,110 loc) • 80.3 kB
JavaScript
"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, {});
}