podchat-browser
Version:
Javascript SDK to use POD's Chat Service - Browser Only
739 lines (657 loc) • 25.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CallScreenShare = CallScreenShare;
exports.CallUser = CallUser;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _callTopicManager = require("./callTopicManager");
var _errorHandler = require("../errorHandler");
function CallUser(app, user) {
var config = {
callId: user.callId,
userId: user.userId,
user: user,
isMe: user.userId == app.store.user.get().id,
containerTag: null,
htmlElements: {},
videoTopicManager: null,
audioTopicManager: null
};
var publicized = {
getAudioStream: function getAudioStream() {
return config.audioTopicManager.getStream();
},
getVideoStream: function getVideoStream() {
return config.videoTopicManager.getStream();
},
switchSpeaker: function switchSpeaker(deviceId) {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var audioObject;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
audioObject = config.audioTopicManager;
if (audioObject) {
audioObject.changeAudioObject(deviceId);
}
case 2:
case "end":
return _context.stop();
}
}
}, _callee);
}))();
},
isMe: function isMe() {
return config.userId == app.store.user.get().id;
},
isScreenShare: function isScreenShare() {
return false;
},
user: function user() {
return config.user;
},
getHTMLElements: function getHTMLElements() {
return config.htmlElements;
},
appendAudioToCallDiv: function appendAudioToCallDiv() {
if (!app.call.sharedVariables.callDivId) {
app.sdkParams.consoleLogging && console.log('No Call DIV has been declared!');
return;
}
var user = config.user,
callParentDiv = document.getElementById(app.call.sharedVariables.callDivId),
userContainer = document.getElementById("callParticipantWrapper-" + config.userId);
if (!userContainer) {
callParentDiv.appendChild(config.htmlElements.container);
userContainer = document.getElementById("callParticipantWrapper-" + config.userId);
}
if (typeof user.mute !== "undefined" && !user.mute && config.audioTopicManager) {
if (!document.getElementById("callUserAudio-" + config.user.audioTopicName)) {
userContainer.appendChild(config.htmlElements[config.user.audioTopicName]);
config.audioTopicManager.startMedia();
config.audioTopicManager.watchAudioLevel();
}
}
},
appendVideoToCallDiv: function appendVideoToCallDiv() {
if (!app.call.sharedVariables.callDivId) {
app.sdkParams.consoleLogging && console.log('No Call DIV has been declared!');
return;
}
var user = config.user,
callParentDiv = document.getElementById(app.call.sharedVariables.callDivId),
userContainer = document.getElementById("callParticipantWrapper-" + config.userId);
if (!userContainer) {
callParentDiv.appendChild(config.htmlElements.container);
userContainer = document.getElementById("callParticipantWrapper-" + config.userId);
}
if (user.video && config.videoTopicManager) {
if (!document.getElementById("callUserVideo-" + config.user.videoTopicName)) {
userContainer.appendChild(config.htmlElements[config.user.videoTopicName]);
config.videoTopicManager.startMedia();
}
}
app.call.currentCall().sendCallDivs();
},
videoTopicManager: function videoTopicManager() {
return config.videoTopicManager;
},
audioTopicManager: function audioTopicManager() {
return config.audioTopicManager;
},
startAudio: function startAudio(sendTopic) {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!config.audioTopicManager) {
_context2.next = 2;
break;
}
return _context2.abrupt("return");
case 2:
config.user.audioTopicName = 'Vo-' + sendTopic;
config.user.mute = false;
config.audioTopicManager = new _callTopicManager.CallTopicManager({
app: app,
callId: config.user.callId,
userId: config.user.userId,
topic: 'Vo-' + config.user.topicSend,
mediaType: 'audio',
direction: config.user.userId === app.store.user.get().id ? 'send' : 'receive',
user: config.user,
onHTMLElement: function onHTMLElement(el) {
config.htmlElements[config.user.audioTopicName] = el;
publicized.appendAudioToCallDiv();
}
});
config.audioTopicManager.createTopic();
case 6:
case "end":
return _context2.stop();
}
}
}, _callee2);
}))();
},
startVideo: function startVideo(sendTopic) {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (!config.videoTopicManager) {
_context3.next = 2;
break;
}
return _context3.abrupt("return");
case 2:
config.user.videoTopicName = 'Vi-' + sendTopic;
config.user.video = true;
config.videoTopicManager = new _callTopicManager.CallTopicManager({
app: app,
callId: config.user.callId,
userId: config.user.userId,
topic: 'Vi-' + config.user.topicSend,
mediaType: 'video',
direction: config.user.userId === app.store.user.get().id ? 'send' : 'receive',
user: config.user,
onHTMLElement: function onHTMLElement(el) {
config.htmlElements[config.user.videoTopicName] = el;
publicized.appendVideoToCallDiv();
}
});
config.videoTopicManager.createTopic();
case 6:
case "end":
return _context3.stop();
}
}
}, _callee3);
}))();
},
reconnectTopic: function reconnectTopic(media) {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
if (!(media == 'audio')) {
_context4.next = 9;
break;
}
_context4.next = 3;
return config.audioTopicManager.stopTopicOnServer();
case 3:
_context4.next = 5;
return publicized.destroyAudio();
case 5:
_context4.next = 7;
return publicized.startAudio(config.user.topicSend);
case 7:
_context4.next = 15;
break;
case 9:
_context4.next = 11;
return config.videoTopicManager.stopTopicOnServer();
case 11:
_context4.next = 13;
return publicized.destroyVideo();
case 13:
_context4.next = 15;
return publicized.startVideo(config.user.topicSend);
case 15:
case "end":
return _context4.stop();
}
}
}, _callee4);
}))();
},
destroy: function destroy() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
if (!(config.videoTopicManager && config.videoTopicManager.getPeer())) {
_context5.next = 3;
break;
}
_context5.next = 3;
return publicized.destroyVideo();
case 3:
if (!(config.audioTopicManager && config.audioTopicManager.getPeer())) {
_context5.next = 6;
break;
}
_context5.next = 6;
return publicized.destroyAudio();
case 6:
// user.topicMetaData = {};
config.htmlElements = {};
user = null;
case 8:
case "end":
return _context5.stop();
}
}
}, _callee5);
}))();
},
stopAudio: function stopAudio() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
config.user.mute = true;
_context6.next = 3;
return publicized.destroyAudio();
case 3:
case "end":
return _context6.stop();
}
}
}, _callee6);
}))();
},
destroyAudio: function destroyAudio() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
if (config.audioTopicManager) {
_context7.next = 2;
break;
}
return _context7.abrupt("return");
case 2:
if (!config.isMe) {
_context7.next = 5;
break;
}
_context7.next = 5;
return app.call.deviceManager.mediaStreams.stopAudioInput();
case 5:
_context7.next = 7;
return config.audioTopicManager.destroy();
case 7:
delete config.htmlElements[config.user.audioTopicName];
config.audioTopicManager = null;
case 9:
case "end":
return _context7.stop();
}
}
}, _callee7);
}))();
},
changeAudioStream: function changeAudioStream(deviceId, callback) {
var conf = {
deviceId: {
exact: deviceId
}
},
deviceManager = app.call.deviceManager;
if (deviceManager.mediaStreams.getAudioInput()) {
deviceManager.mediaStreams.stopAudioInput(); // setTimeout(()=> {
deviceManager.grantUserMediaDevicesPermissions({
audio: conf
}, function (result) {
if (!result.hasError) {
try {
config.audioTopicManager.updateStream(deviceManager.mediaStreams.getAudioInput());
callback && callback();
} catch (error) {
app.call.currentCall().raiseCallError({
code: _errorHandler.errorList.CHANGE_MEDIA_DEVICE_FAILED.code,
message: error.message
}, null, true);
publicized.stopAudio();
}
} else {
app.call.currentCall().raiseCallError({
code: result.errorCode,
message: result.errorMessage
}, null, true);
publicized.stopAudio();
}
});
} else {
throw new Error('[SDK] Microphone is not active');
}
},
changeVideoStream: function changeVideoStream(deviceId, callback) {
var conf = {
deviceId: {
exact: deviceId
}
},
deviceManager = app.call.deviceManager;
if (deviceManager.mediaStreams.getVideoInput()) {
deviceManager.mediaStreams.stopVideoInput(); // setTimeout(()=> {
var video = Object.assign(conf, {
width: 320,
framerate: 10
});
app.call.deviceManager.grantUserMediaDevicesPermissions({
video: video
}, function (result) {
if (!result.hasError) {
var _user = app.call.currentCall().users().get(app.store.user.get().id);
try {
config.videoTopicManager.updateStream(app.call.deviceManager.mediaStreams.getVideoInput());
callback && callback();
} catch (error) {
app.call.currentCall().raiseCallError({
code: _errorHandler.errorList.CHANGE_MEDIA_DEVICE_FAILED.code,
message: error.message
}, null, true);
publicized.stopVideo();
setTimeout(function () {
app.call.currentCall().sendCallDivs();
});
}
} else {
app.call.currentCall().raiseCallError({
code: result.errorCode,
message: result.errorMessage
}, null, true);
app.call.currentCall().users().get(app.store.user.get().id).stopVideo();
setTimeout(function () {
app.call.currentCall().sendCallDivs();
});
}
});
} else {
throw new Error('[SDK] Webcam is not active');
}
},
stopVideo: function stopVideo() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
return _regenerator["default"].wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
config.user.video = false;
_context8.next = 3;
return publicized.destroyVideo();
case 3:
case "end":
return _context8.stop();
}
}
}, _callee8);
}))();
},
destroyVideo: function destroyVideo() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
return _regenerator["default"].wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
if (config.videoTopicManager) {
_context9.next = 2;
break;
}
return _context9.abrupt("return");
case 2:
if (config.isMe) app.call.deviceManager.mediaStreams.stopVideoInput();
_context9.next = 5;
return config.videoTopicManager.destroy();
case 5:
delete config.htmlElements[config.user.videoTopicName];
config.videoTopicManager = null;
case 7:
case "end":
return _context9.stop();
}
}
}, _callee9);
}))();
}
};
function setup(participant) {
config.user = participant;
if (config.isMe) {
config.user.direction = 'send';
} else {
config.user.direction = 'receive';
}
config.user.videoTopicName = 'Vi-' + config.user.topicSend;
config.user.audioTopicName = 'Vo-' + config.user.topicSend; // config.user.audioStopManager = new DevicePauseStopManager({
// callId: config.callId,
// userId: config.user.userId,
// mediaType: 'audio',
// timeout: app.sdkParams.callOptions?.streamCloseTimeout || 10000
// });
// if (config.user.mute) {
// config.user.audioStopManager.pauseStream();
// config.user.audioStopManager.stopStream();
// }
// config.user.videoStopManager = new DevicePauseStopManager({
// callId: config.callId,
// userId: config.user.userId,
// mediaType: 'video',
// timeout: app.sdkParams.callOptions?.streamCloseTimeout || 10000
// });
// if (!config.user.video) {
// config.user.videoStopManager.pauseStream();
// config.user.videoStopManager.stopStream();
// }
// publicized.appendUserToCallDiv(generateContainerElement())
generateContainerElement();
if (config.user.video) publicized.startVideo(config.user.topicSend);
if (!config.user.mute) publicized.startAudio(config.user.topicSend);
}
function generateContainerElement() {
if (!config.htmlElements.container) {
config.htmlElements.container = document.createElement('div');
var el = config.htmlElements.container;
el.setAttribute('id', 'callParticipantWrapper-' + config.userId);
el.classList.add('participant');
el.classList.add('wrapper');
el.classList.add('user-' + config.userId);
el.classList.add(config.isMe ? 'local' : 'remote');
}
return config.htmlElements;
}
setup(user);
return publicized;
}
function CallScreenShare(app, user) {
var config = {
callId: user.callId,
userId: user.userId,
isMe: user.userId == app.store.user.get().id,
user: user,
type: "screenShare",
containerTag: null,
htmlElements: {},
videoTopicManager: null
};
var publicized = {
getVideoStream: function getVideoStream() {
return config.videoTopicManager.getStream();
},
isMe: function isMe() {
return false;
},
isScreenShare: function isScreenShare() {
return true;
},
user: function user() {
return config.user;
},
getHTMLElements: function getHTMLElements() {
return config.htmlElements;
},
appendVideoToCallDiv: function appendVideoToCallDiv() {
var _config$videoTopicMan;
if (!app.call.sharedVariables.callDivId) {
app.sdkParams.consoleLogging && console.log('No Call DIV has been declared!');
return;
}
var user = config.user,
callParentDiv = document.getElementById(app.call.sharedVariables.callDivId),
userContainer = document.getElementById("callParticipantWrapper-" + config.userId);
if (!userContainer) {
callParentDiv.appendChild(config.htmlElements.container);
userContainer = document.getElementById("callParticipantWrapper-" + config.userId);
}
if (user.video && config.videoTopicManager) {
if (!document.getElementById("callUserVideo-" + config.user.videoTopicName)) {
userContainer.appendChild(config.htmlElements[config.user.videoTopicName]);
config.videoTopicManager.startMedia();
}
} // if(currentCall().screenShareInfo.iAmOwner())
(_config$videoTopicMan = config.videoTopicManager) === null || _config$videoTopicMan === void 0 ? void 0 : _config$videoTopicMan.restartMediaOnKeyFrame("screenShare", [1000, 4000]); // else {
// config.videoTopicManager?.restartMediaOnKeyFrame("screenShare", [1000, 3000, 6000]);
// }
app.call.currentCall().sendCallDivs();
},
videoTopicManager: function videoTopicManager() {
return config.videoTopicManager;
},
audioTopicManager: function audioTopicManager() {
return config.audioTopicManager;
},
audioStopManager: function audioStopManager() {
return config.user.audioStopManager;
},
startAudio: function startAudio(sendTopic) {
return;
},
startVideo: function startVideo(sendTopic) {
config.user.videoTopicName = sendTopic;
config.user.video = true;
config.videoTopicManager = new _callTopicManager.CallTopicManager({
app: app,
callId: config.user.callId,
userId: config.user.userId,
topic: config.user.videoTopicName,
mediaType: 'video',
direction: app.callsManager.get(config.callId).screenShareInfo.iAmOwner() ? 'send' : 'receive',
user: config.user,
isScreenShare: true,
onHTMLElement: function onHTMLElement(el) {
config.htmlElements[config.user.videoTopicName] = el;
publicized.appendVideoToCallDiv();
}
}); // publicized.appendUserToCallDiv(generateVideoElement());
config.videoTopicManager.createTopic();
},
reconnectTopic: function reconnectTopic(media) {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
return _regenerator["default"].wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
_context10.next = 2;
return config.videoTopicManager.stopTopicOnServer();
case 2:
_context10.next = 4;
return publicized.destroyVideo();
case 4:
_context10.next = 6;
return publicized.startVideo(config.user.topic);
case 6:
case "end":
return _context10.stop();
}
}
}, _callee10);
}))();
},
destroy: function destroy() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
return _regenerator["default"].wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
if (!(config.videoTopicManager && config.videoTopicManager.getPeer())) {
_context11.next = 3;
break;
}
_context11.next = 3;
return config.videoTopicManager.destroy();
case 3:
// user.topicMetaData = {};
config.htmlElements = {};
user = null;
case 5:
case "end":
return _context11.stop();
}
}
}, _callee11);
}))();
},
destroyAudio: function destroyAudio() {
return new Promise(function (resolve) {
resolve();
});
},
destroyVideo: function destroyVideo() {
return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
return _regenerator["default"].wrap(function _callee12$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
_context12.next = 2;
return config.videoTopicManager.destroy();
case 2:
delete config.htmlElements[config.user.videoTopicName];
config.videoTopicManager = null;
case 4:
case "end":
return _context12.stop();
}
}
}, _callee12);
}))();
}
};
function setup(user) {
var iAmOwner = app.callsManager.get(config.callId).screenShareInfo.iAmOwner();
var obj = {
video: true,
callId: user.callId,
userId: user.userId,
topic: user.topicSend
};
obj.direction = iAmOwner ? 'send' : 'receive';
obj.videoTopicName = config.topic;
config.user = obj; // publicized.appendUserToCallDiv(generateContainerElement())
generateContainerElement();
if (config.user.video) publicized.startVideo(obj.topic);
}
function generateContainerElement() {
if (!config.htmlElements.container) {
config.htmlElements.container = document.createElement('div');
var el = config.htmlElements.container;
el.setAttribute('id', 'callParticipantWrapper-' + config.userId);
el.classList.add('participant');
el.classList.add('wrapper');
el.classList.add('user-' + config.userId);
el.classList.add(config.isMe ? 'local' : 'remote');
}
return config.htmlElements;
}
function generateVideoElement() {
if (config.user.video && !config.htmlElements[config.user.videoTopicName]) {
var el = config.videoTopicManager.getHtmlElement();
config.htmlElements[config.user.videoTopicName] = el;
}
}
setup(user);
return publicized;
}