UNPKG

podchat-browser

Version:

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

739 lines (657 loc) 25.3 kB
"use strict"; 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; }