podchat-browser
Version:
Javascript SDK to use POD's Chat Service - Browser Only
1,302 lines (1,128 loc) • 76.6 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 // 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