UNPKG

podchat-browser

Version:

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

1,372 lines (1,228 loc) 47.9 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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _utility = _interopRequireDefault(require("../../../utility/utility")); 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: {}, videoIsOpen: false, audioIsOpen: false, topicMetaData: { audioLevelInterval: null }, slowLinkTimeout: null, isDestroyed: false, videoReceiveVersion: -1, audioReceiveVersion: -1, videoStream: null, audioStream: null, streamTracks: { video: null, audio: null }, oldAudioStreamId: null, newAudioStreamId: null }; var publicized = { getAudioStream: function getAudioStream() { return config.audioStream; }, getVideoStream: function getVideoStream() { return config.videoStream; }, 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: try { audioObject = publicized.getAudioObject(); if (audioObject) { audioObject.setSinkId(deviceId); app.sdkParams.consoleLogging && console.log("speaker changed"); } } catch (error) { console.error('Error setting audio output:', error); } case 1: case "end": return _context.stop(); } } }, _callee); }))(); }, audioIsOpen: function audioIsOpen() { return config.audioIsOpen; }, resetTopicVersions: function resetTopicVersions() { config.videoReceiveVersion = -1; config.audioReceiveVersion = -1; }, getAudioObject: function getAudioObject() { return config.audioObject; }, userId: function userId() { return config.userId; }, isMe: function isMe() { return config.userId == app.store.user.get().id; }, setVideoIsOpen: function setVideoIsOpen(value) { config.videoIsOpen = value; }, setAudioIsOpen: function setAudioIsOpen(value) { config.audioIsOpen = value; }, isScreenShare: function isScreenShare() { return false; }, user: function user() { return config.user; }, getHTMLElements: function getHTMLElements() { return config.htmlElements; }, getVideoHtmlElement: function getVideoHtmlElement() { var elementUniqueId = _utility["default"].generateUUID(); if (config.user.video && !config.htmlElement) { config.htmlElement = document.createElement('video'); var el = config.htmlElement; el.setAttribute('id', 'callUserVideo-' + config.user.videoTopicName); el.setAttribute('class', app.call.sharedVariables.callVideoTagClassName); el.setAttribute('playsinline', ''); el.setAttribute('muted', ''); el.setAttribute('autoplay', ''); el.setAttribute('data-uniqueId', elementUniqueId); el.setAttribute('width', app.call.sharedVariables.callVideoMinWidth + 'px'); el.setAttribute('height', app.call.sharedVariables.callVideoMinHeight + 'px'); // el.setAttribute('controls', ''); } return config.htmlElement; }, 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) { if (!document.getElementById("callUserVideo-" + config.user.videoTopicName)) { userContainer.appendChild(config.htmlElements[config.user.videoTopicName]); config.htmlElements[config.user.videoTopicName].play(); } else { var targetEl = document.getElementById('callUserVideo-' + config.user.videoTopicName); if (!targetEl.srcObject) { targetEl.srcObject = config.htmlElements[config.user.videoTopicName].srcObject; } } } app.call.currentCall().sendCallDivs(); }, videoTopicManager: function videoTopicManager() {// return config.videoTopicManager; }, audioTopicManager: function audioTopicManager() {// return config.audioTopicManager; }, removeAudioWatcherInterval: function removeAudioWatcherInterval() { if (config.topicMetaData) { clearInterval(config.topicMetaData.audioLevelInterval); } }, replaceVideoStream: function replaceVideoStream(newStream, callback) { var deviceManager = app.call.deviceManager; if (deviceManager.mediaStreams.getVideoInput()) { config.htmlElements[config.user.videoTopicName].srcObject = newStream; try { app.call.currentCall().sendPeerManager().changeVideoSendStream(newStream); var targetEl = document.getElementById('callUserVideo-' + config.user.videoTopicName); if (!targetEl.srcObject) { targetEl.srcObject = config.htmlElements[config.user.videoTopicName].srcObject; } 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(); }); } } }, changeVideoStream: function changeVideoStream(deviceId, callback) { var conf = { deviceId: { exact: deviceId } }, deviceManager = app.call.deviceManager; if (deviceManager.mediaStreams.getVideoInput()) { deviceManager.mediaStreams.stopVideoInput(); deviceManager.grantUserMediaDevicesPermissions({ video: conf }, function (result) { if (!result.hasError) { var stream = deviceManager.mediaStreams.getVideoInput(); config.htmlElements[config.user.videoTopicName].srcObject = stream; try { app.call.currentCall().sendPeerManager().changeVideoSendStream(stream); var targetEl = document.getElementById('callUserVideo-' + config.user.videoTopicName); if (!targetEl.srcObject) { targetEl.srcObject = config.htmlElements[config.user.videoTopicName].srcObject; } 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); publicized.stopVideo(); setTimeout(function () { app.call.currentCall().sendCallDivs(); }); } }); } else { throw new Error('[SDK] Webcam is not active'); } }, changeAudioStream: function changeAudioStream(deviceId, callback) { var conf = { deviceId: { exact: deviceId } }, deviceManager = app.call.deviceManager; if (deviceManager.mediaStreams.getAudioInput()) { deviceManager.mediaStreams.stopAudioInput(); app.call.deviceManager.grantUserMediaDevicesPermissions({ audio: conf }, function (result) { if (!result.hasError) { try { var stream = app.call.deviceManager.mediaStreams.getAudioInput(); app.call.currentCall().sendPeerManager().getPeer().switchAudioStream(stream); 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'); } }, startAudio: function startAudio(sendTopic, conf) { 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.isMe) { app.call.deviceManager.grantUserMediaDevicesPermissions({ audio: true }, function (result) { if (!result.hasError) { config.audioIsOpen = true; config.user.mute = false; // config.audioReceiveVersion = conf.version; addSendTrackToPeerManager('audio'); } }); } else { config.audioIsOpen = true; config.user.mute = false; config.audioReceiveVersion = conf.version; addReceiveTrackToPeerManager('audio', conf); } case 1: case "end": return _context2.stop(); } } }, _callee2); }))(); }, startVideo: function startVideo(sendTopic, conf) { 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.isMe) { app.call.deviceManager.grantUserMediaDevicesPermissions({ video: { width: app.call.sharedVariables.callVideoMinWidth, framerate: 10 } }, function (result) { if (!result.hasError) { config.user.video = true; config.videoIsOpen = true; addSendTrackToPeerManager('video'); } }); } else { config.user.video = true; config.videoIsOpen = true; config.videoReceiveVersion = conf.version; addReceiveTrackToPeerManager('video', conf); } case 1: case "end": return _context3.stop(); } } }, _callee3); }))(); }, pauseVideoSendStream: function pauseVideoSendStream() { var localStream = app.call.deviceManager.mediaStreams.getVideoInput(); if (localStream) localStream.getTracks()[0].enabled = false; }, pauseAudioSendStream: function pauseAudioSendStream() { var localStream = app.call.deviceManager.mediaStreams.getAudioInput(); if (localStream) localStream.getTracks()[0].enabled = false; }, // pauseSendStream() { // let localStream; // switch (config.mediaType) { // case 'audio': // localStream = app.call.currentCall().deviceManager().mediaStreams.getAudioInput() // break; // case 'video': // if(config.isScreenShare) { // localStream = app.call.currentCall().deviceManager().mediaStreams.getScreenShareInput(); // } else { // localStream = app.call.currentCall().deviceManager().mediaStreams.getVideoInput(); // } // } // if(localStream) // localStream.getTracks()[0].enabled = false; // }, resumeVideoSendStream: function resumeVideoSendStream() { var localStream = app.call.deviceManager.mediaStreams.getVideoInput(); if (localStream) localStream.getTracks()[0].enabled = true; }, resumeAudioSendStream: function resumeAudioSendStream() { var localStream = app.call.deviceManager.mediaStreams.getAudioInput(); if (localStream) localStream.getTracks()[0].enabled = true; }, startSLowLink: function startSLowLink() { app.chatEvents.fireEvent('callEvents', { type: 'SLOW_LINK', callId: config.callId, message: "Slow link", userId: config.userId }); config.slowLinkTimeout && clearTimeout(config.slowLinkTimeout); config.slowLinkTimeout = setTimeout(function () { app.chatEvents.fireEvent('callEvents', { type: 'SLOW_LINK_RESOLVED', callId: config.callId, message: "Slow link resolved", userId: config.userId }); }, 10000); }, correctWithServerData: function correctWithServerData(remoteInfo) { if (config.videoIsOpen && !remoteInfo.video) { publicized.stopVideo(); } if (!config.videoIsOpen && remoteInfo.video) { config.user.video = true; } if (config.audioIsOpen && remoteInfo.mute) { publicized.stopAudio(); } if (!config.audioIsOpen && !remoteInfo.mute) { config.user.mute = false; } }, getAudioStreamHasChanged: function getAudioStreamHasChanged() { var hasChange = config.oldAudioStreamId != config.newAudioStreamId; config.oldAudioStreamId = config.newAudioStreamId; return hasChange; }, getVideoStreamHasChanged: function getVideoStreamHasChanged() { var hasChange = config.oldVideoStreamId != config.newVideoStreamId; config.oldVideoStreamId = config.newVideoStreamId; return hasChange; }, destroy: function destroy() { 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: _context4.next = 2; return publicized.stopVideo(); case 2: _context4.next = 4; return publicized.stopAudio(); case 4: config.isDestroyed = true; // await publicized.destroyVideo(); // await publicized.destroyAudio(); config.htmlElements = {}; user = null; case 7: case "end": return _context4.stop(); } } }, _callee4); }))(); }, stopAudio: function stopAudio() { return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() { var currentCall; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: config.user.mute = true; config.audioIsOpen = false; currentCall = app.call.currentCall(); if (!currentCall.isDestroyed()) { if (config.isMe) currentCall.sendPeerManager() && currentCall.sendPeerManager().removeTrack(config.user.audioTopicName);else { currentCall.receivePeerManager() && currentCall.receivePeerManager().removeTrack(config.user.audioTopicName); } } _context5.next = 6; return publicized.destroyAudio(); case 6: case "end": return _context5.stop(); } } }, _callee5); }))(); }, destroyAudio: function destroyAudio() { 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.audioReceiveVersion = -1; console.log('[media][audio] destroy, topic: ', config.user.audioTopicName); if (config.audioObject) { config.audioObject.srcObject = null; config.audioObject = null; } config.audioIsOpen = false; if (app.call.currentCall().receivePeerManager()) { app.call.currentCall().receivePeerManager().removeTrack(config.user.audioTopicName); } publicized.removeAudioWatcherInterval(); case 6: case "end": return _context6.stop(); } } }, _callee6); }))(); }, stopVideo: function stopVideo() { return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() { var currentCall; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: config.user.video = false; config.videoIsOpen = false; currentCall = app.call.currentCall(); if (!currentCall.isDestroyed()) { if (config.isMe) { currentCall.sendPeerManager() && currentCall.sendPeerManager().removeTrack(config.user.videoTopicName); } else { currentCall.receivePeerManager() && currentCall.receivePeerManager().removeTrack(config.user.videoTopicName); } } _context7.next = 6; return publicized.destroyVideo(); case 6: case "end": return _context7.stop(); } } }, _callee7); }))(); }, destroyVideo: function destroyVideo() { 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.videoReceiveVersion = -1; config.videoIsOpen = false; if (config.htmlElements[config.user.videoTopicName]) { config.htmlElements[config.user.videoTopicName].remove(); delete config.htmlElements[config.user.videoTopicName]; } if (app.call.currentCall().receivePeerManager()) { app.call.currentCall().receivePeerManager().removeTrack(config.user.videoTopicName); } case 4: case "end": return _context8.stop(); } } }, _callee8); }))(); }, getReceiveVideoVersion: function getReceiveVideoVersion() { return config.videoReceiveVersion; }, getReceiveAudioVersion: function getReceiveAudioVersion() { return config.audioReceiveVersion; }, processTrackChange: function processTrackChange(conf) { if (conf.topic.indexOf('Vi-') > -1) { if (!config.videoIsOpen && conf.isReceiving) { publicized.startVideo(conf.topic.replace('Vi-', ''), conf); } else if (config.videoIsOpen && !conf.isReceiving) { publicized.stopVideo(); } else if (config.videoIsOpen && conf.isReceiving && config.videoReceiveVersion != conf.version) { publicized.stopVideo(); setTimeout(function () { publicized.startVideo(conf.topic.replace('Vi-', ''), conf); }, 200); } } else if (conf.topic.indexOf('Vo-') > -1) { // config.audioReceiveVersion = conf.version; if (!config.audioIsOpen && conf.isReceiving) { publicized.startAudio(conf.topic.replace('Vo-', ''), conf); } else if (config.audioIsOpen && !conf.isReceiving) { publicized.stopAudio(); } else if (config.audioIsOpen && conf.isReceiving && config.audioReceiveVersion != conf.version) { publicized.stopAudio(); setTimeout(function () { publicized.startAudio(conf.topic.replace('Vo-', ''), conf); }, 200); } } }, isVideoOpen: function isVideoOpen() { return config.videoIsOpen; }, isAudioOpen: function isAudioOpen() { return config.audioIsOpen; }, resetTopicVersion: function resetTopicVersion(topic) { if (topic.mediaType == 0) { config.videoReceiveVersion = -1; } else if (topic.mediaType == 1) { config.audioReceiveVersion = -1; } }, watchAudioLevel: function watchAudioLevel(stream) { var user = config.user, topicMetadata = config.topicMetaData; // Create and configure the audio pipeline var analyzer = app.call.audioCtx().createAnalyser(); analyzer.fftSize = 512; analyzer.smoothingTimeConstant = 0.1; var sourceNode = app.call.audioCtx().createMediaStreamSource(stream); sourceNode.connect(analyzer); // Analyze the sound topicMetadata.audioLevelInterval = setInterval(function () { // Compute the max volume level (-Infinity...0) var fftBins = new Float32Array(analyzer.frequencyBinCount); // Number of values manipulated for each sample analyzer.getFloatFrequencyData(fftBins); // audioPeakDB varies from -Infinity up to 0 var audioPeakDB = Math.max.apply(Math, (0, _toConsumableArray2["default"])(fftBins)); // Compute a wave (0...) var frequencyRangeData = new Uint8Array(analyzer.frequencyBinCount); analyzer.getByteFrequencyData(frequencyRangeData); var sum = frequencyRangeData.reduce(function (p, c) { return p + c; }, 0); // audioMeter varies from 0 to 10 var audioMeter = Math.sqrt(sum / frequencyRangeData.length); //console.log({audioMeter}, {audioPeakDB}); if (audioPeakDB > -50 && audioMeter > 0) { app.chatEvents.fireEvent('callStreamEvents', { type: 'USER_SPEAKING', userId: config.userId, audioLevel: convertToAudioLevel(audioPeakDB), isNoise: false, isMute: false }); } else if (audioPeakDB !== -Infinity && audioPeakDB < -60 && audioMeter > 0) { app.chatEvents.fireEvent('callStreamEvents', { type: 'USER_SPEAKING', userId: config.userId, audioLevel: 0, isNoise: true, isMute: false }); } else if (audioPeakDB === -Infinity && audioMeter == 0) { app.chatEvents.fireEvent('callStreamEvents', { type: 'USER_SPEAKING', userId: config.userId, audioLevel: 0, isNoise: false, isMute: true }); } }, 500); function convertToAudioLevel(soundPower) { if (soundPower <= -60) { return 0; } else if (soundPower >= -60 && soundPower < -50) { return 1; } else if (soundPower >= -50 && soundPower < -40) { return 2; } else if (soundPower >= -40 && soundPower < 30) { return 3; } else if (soundPower >= -30) { return 4; } } } }; function addSendTrackToPeerManager(media, retries) { if (retries > 3) return; if (!app.call.currentCall().sendPeerManager()) { retryAgain(media, retries + 1); return; } var addRes; if (media == 'video') { var stream = app.call.deviceManager.mediaStreams.getVideoInput(); addRes = app.call.currentCall().sendPeerManager().addTrack({ currentTrackId: stream.getTracks()[0].id, clientId: config.user.clientId, topic: config.user.videoTopicName, mediaType: 0, stream: stream, onTrackCallback: onTrackCallback, onOpenFailure: onOpenFailure }); } else { addRes = app.call.currentCall().sendPeerManager().addTrack({ clientId: config.user.clientId, topic: config.user.audioTopicName, mediaType: 1, stream: app.call.deviceManager.mediaStreams.getAudioInput(), onTrackCallback: onTrackCallback, onOpenFailure: onOpenFailure }); } if (addRes === 0) { retryAgain(media, retries + 1); } function retryAgain(media, retries) { if (config.isDestroyed) return; setTimeout(function () { addSendTrackToPeerManager(media, retries); }, 100); } } function addReceiveTrackToPeerManager(media, conf) { var retries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; if (retries > 3) return; if (!app.call.currentCall().receivePeerManager()) { retryAgain(media, conf, retries + 1); return; } var addRes; if (media == 'video') { addRes = app.call.currentCall().receivePeerManager().addTrack({ clientId: config.user.clientId, topic: config.user.videoTopicName, mediaType: 0, requestedTopicVersion: conf.version, mline: conf && conf.mline, onTrackCallback: onTrackCallback, onOpenFailure: onOpenFailure, onUpdateSuccess: onUpdateSuccess }); } else { addRes = app.call.currentCall().receivePeerManager().addTrack({ clientId: config.user.clientId, topic: config.user.audioTopicName, mediaType: 1, requestedTopicVersion: conf.version, mline: conf && conf.mline, onTrackCallback: onTrackCallback, onOpenFailure: onOpenFailure, onUpdateSuccess: onUpdateSuccess }); } if (addRes === 0) { retryAgain(media, conf, retries + 1); } function retryAgain(media, conf, retries) { if (config.isDestroyed) return; setTimeout(function () { addReceiveTrackToPeerManager(media, conf, retries); }, 100); } } function onOpenFailure(item) { if (item.mediaType == 0) { config.videoIsOpen = false; } else if (item.mediaType == 1) { config.audioIsOpen = false; } if (config.isMe) { if (item.mediaType == 0) { publicized.startVideo(config.user.topicSend, null); } else { publicized.startAudio(config.user.topicSend, null); } } // app.call.currentCall().sendCallMessage({ // id: 'REQUEST_RECEIVING_MEDIA', // token: app.sdkParams.token, // chatId: config.callId, // brokerAddress: config.user.brokerAddress, // }, null, {}); } function onUpdateSuccess(line) { if (line.mediaType == 0) { config.videoReceiveVersion = line.requestedTopicVersion; } else if (line.mediaType == 1) { config.audioReceiveVersion = line.requestedTopicVersion; } } function onTrackCallback(line, track) { var stream, trc, isAudio = line.topic.indexOf('Vo-') > -1, isVideo = line.topic.indexOf('Vi-') > -1; if (isVideo) { if (track) trc = track; // stream = new MediaStream([track]); else trc = config.streamTracks.video; // stream = new MediaStream([config.streamTracks.video]); config.streamTracks.video = trc; } else if (isAudio) { if (track) trc = track;else trc = config.streamTracks.audio; config.streamTracks.audio = trc; } stream = new MediaStream([trc]); if (isAudio) { config.audioStream = stream; if (!config.newAudioStreamId) { config.oldAudioStreamId = null; config.newAudioStreamId = config.audioStream.id; } else { config.oldAudioStreamId = config.newAudioStreamId; config.newAudioStreamId = config.audioStream.id; } } else { config.videoStream = stream; if (!config.newVideoStreamId) { config.oldVideoStreamId = null; config.newVideoStreamId = config.videoStream.id; } else { config.oldVideoStreamId = config.newVideoStreamId; config.newVideoStreamId = config.videoStream.id; } } if (config.isMe) { if (isAudio) { publicized.watchAudioLevel(stream); app.call.currentCall().sendCallDivs(); } else if (app.sdkParams.enableCallDivs) { var el = publicized.getVideoHtmlElement(); el.srcObject = stream; config.htmlElements[config.user.videoTopicName] = el; publicized.appendVideoToCallDiv(); } else { //to send streams app.call.currentCall().sendCallDivs(); } } else { if (isAudio) { console.log('[media][audio] create, topic: ', line.topic); config.audioObject = new Audio(); config.audioObject.srcObject = stream; // config.audioObject.srcObject = stream; config.audioObject.autoplay = true; config.audioObject.play(); publicized.watchAudioLevel(stream); app.call.currentCall().sendCallDivs(); } else if (isVideo && app.sdkParams.enableCallDivs) { var _el = publicized.getVideoHtmlElement(); _el.srcObject = null; setTimeout(function () { _el.srcObject = stream; config.htmlElements[config.user.videoTopicName] = _el; publicized.appendVideoToCallDiv(); }, 100); } else { //to send streams app.call.currentCall().sendCallDivs(); } } } 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; if (app.sdkParams.enableCallDivs) { generateContainerElement(); } } 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: false, user: user, videoIsOpen: false, type: "screenShare", containerTag: null, htmlElements: {}, videoStream: null, isDestroyed: false, videoReceiveVersion: -1, streamTracks: { video: null }, oldAudioStreamId: null, newAudioStreamId: null }; var publicized = { getReceiveVideoVersion: function getReceiveVideoVersion() { return config.videoReceiveVersion; }, isVideoOpen: function isVideoOpen() { return config.videoIsOpen; }, getVideoStream: function getVideoStream() { return config.videoStream; }, getAudioTrack: function getAudioTrack() { return null; }, isMe: function isMe() { return app.call.currentCall().screenShareInfo.iAmOwner(); }, audioIsOpen: function audioIsOpen() { return false; }, resetTopicVersions: function resetTopicVersions() { config.videoReceiveVersion = -1; }, isScreenShare: function isScreenShare() { return true; }, getVideoStreamHasChanged: function getVideoStreamHasChanged() { var hasChange = config.oldVideoStreamId != config.newVideoStreamId; config.oldVideoStreamId = config.newVideoStreamId; if (hasChange) config.htmlElement.setAttribute("data-uniqueId", _utility["default"].generateUUID()); return hasChange; }, user: function user() { return config.user; }, setVideoIsOpen: function setVideoIsOpen(value) { config.videoIsOpen = value; }, setAudioIsOpen: function setAudioIsOpen(value) { config.audioIsOpen = value; }, getHTMLElements: function getHTMLElements() { return config.htmlElements; }, 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) { if (!document.getElementById("callUserVideo-" + config.user.videoTopicName)) { userContainer.appendChild(config.htmlElements[config.user.videoTopicName]); config.videoStream.getTracks()[0].enabled = true; setTimeout(function () { var el = document.getElementById("callUserVideo-" + config.user.videoTopicName); if (!el) return; el.addEventListener('loadedmetadata', playTheTag); el.srcObject = config.videoStream; function playTheTag() { el.play(); } }, 500); // config.htmlElements[config.user.videoTopicName].srcObject = config.videoStream // config.htmlElements[config.user.videoTopicName].play(); } } app.call.currentCall().sendCallDivs(); }, audioStopManager: function audioStopManager() { return config.user.audioStopManager; }, startAudio: function startAudio(sendTopic) { return; }, startVideo: function startVideo(sendTopic, conf) { config.user.video = true; config.videoIsOpen = true; var iAmOwner = app.call.currentCall().screenShareInfo.iAmOwner(); if (iAmOwner) { app.call.deviceManager.grantScreenSharePermission({ closeStream: false }).then(function (stream) { if (!stream) { alert("Error: could not find screenShareInput"); } else { var onScreenShareEndCallback = function onScreenShareEndCallback(event) { // Click on browser UI stop sharing button if (!config.user) return; stream.getVideoTracks()[0].removeEventListener("ended", onScreenShareEndCallback); if (app.call.currentCall() && app.call.currentCall().screenShareInfo.isStarted()) { app.call.endScreenShare({ callId: config.callId }); } }; stream.getVideoTracks()[0].addEventListener("ended", onScreenShareEndCallback); addSendTrackToPeerManager(); } })["catch"](function (error) {// reject(error) }); } else { config.videoReceiveVersion = conf.version; addReceiveTrackToPeerManager(conf); } }, resumeVideoSendStream: function resumeVideoSendStream() { var localStream = app.call.deviceManager.mediaStreams.getVideoInput(); if (localStream) localStream.getTracks()[0].enabled = true; }, processTrackChange: function processTrackChange(conf) { if (conf.topic.indexOf('Vi-') > -1 || conf.topic.indexOf('screen') > -1) { // config.videoReceiveVersion = conf.version; if (!config.videoIsOpen && conf.isReceiving) { publicized.startVideo(conf.topic.replace('Vi-', ''), conf); } else if (config.videoIsOpen && !conf.isReceiving) { config.videoIsOpen = false; publicized.stopVideo(); } else if (config.videoIsOpen && conf.isReceiving && config.videoReceiveVersion != conf.version) { //&& config.videoReceiveVersion != conf.version publicized.stopVideo(); setTimeout(function () { publicized.startVideo(conf.topic.replace('Vi-', ''), conf); }, 200); } } }, resetTopicVersion: function resetTopicVersion(topic) { if (topic.mediaType == 2) { config.videoReceiveVersion = -1; } }, reconnectTopic: function reconnectTopic(media) { 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: _context9.next = 2; return publicized.destroyVideo(); case 2: _context9.next = 4; return publicized.startVideo(config.user.topic); case 4: case "end": return _context9.stop(); } } }, _callee9); }))(); }, destroy: function destroy() { 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 publicized.stopVideo(); case 2: config.isDestroyed = true; config.htmlElements = {}; config.user = null; case 5: case "end": return _context10.stop(); } } }, _callee10); }))(); }, stopVideo: function stopVideo() { var _arguments = arguments; return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() { var _app$call$currentCall; var notifyServer, iAmOwner, currentCall; return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: notifyServer = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : true; config.user.video = false; config.videoIsOpen = false; iAmOwner = (_app$call$currentCall = app.call.currentCall().screenShareInfo) === null || _app$call$currentCall === void 0 ? void 0 : _app$call$currentCall.iAmOwner(); currentCall = app.call.currentCall(); if (!currentCall.isDestroyed()) { // if(notifyServer) { if (iAmOwner) app.call.currentCall().sendPeerManager() && app.call.currentCall().sendPeerManager().removeTrack(config.user.videoTopicName);else app.call.currentCall().receivePeerManager() && app.call.currentCall().receivePeerManager().removeTrack(config.user.videoTopicName); // throw new Error(); // } } _context11.next = 8; return publicized.destroyVideo(); case 8: case "end": return _context11.stop(); } } }, _callee11); }))(); }, destroyAudio: function destroyAudio() {}, destroyVideo: function destroyVideo() { return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() { var el; return _regenerator["default"].wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: config.videoReceiveVersion = -1; config.videoIsOpen = false; if (app.call.currentCall().receivePeerManager()) { app.call.currentCall().receivePeerManager().removeTrack(config.user.videoTopicName); } if (app.call.currentCall().sendPeerManager()) { app.call.currentCall().sendPeerManager().removeTrack(config.user.videoTopicName); } el = document.getElementById("callUserVideo-" + config.user.videoTopicName); if (el) { el.remove(); delete config.htmlElements[config.user.videoTopicName]; } case 6: case "end": return _context12.stop(); } } }, _callee12); }))(); }, isOwnerChanged: function isOwnerChanged(clientId) { return config.user.clientId != clientId; } }; function setup(user) { var iAmOwner = app.call.currentCall().screenShareInfo.iAmOwner(); var obj = { video: true, callId: user.callId, userId: user.userId, topic: user.topicSend, clientId: user.clientId }; obj.direction = iAmOwner ? 'send' : 'receive'; obj.videoTopicName = obj.topic; //`Vi-send-${obj.callId}-screenShare`;//config.topic; config.user = obj; config.isMe = app.call.currentCall().screenShareInfo.iAmOwner(); // publicized.appendUserToCallDiv(generateContainerElement()) if (app.sdkParams.enableCallDivs) { generateContainerElement(); } if (config.user.video && app.call.currentCall().screenShareInfo.iAmOwner()) { publicized.startVideo(obj.topic); } } function addSendTrackToPeerManager(retries) { if (retries > 3) return; if (!app.call.currentCall().sendPeerManager()) { retryAgain(retries + 1); return; } var addRes = app.call.currentCall().sendPeerManager().addTrack({ clientId: config.user.clientId, topic: config.user.videoTopicName, mediaType: 2, isScreenShare: true, stream: app.call.deviceManager.mediaStreams.getScreenShareInput(), onTrackCallback: onTrackCallback }); if (addRes === 0) { retryAgain(retries + 1); } function retryAgain(retries) { if (config.isDestroyed) return; setTimeout(function () { addSendTrackToPeerManager(retries); }, 10); } } function addReceiveTrackToPeerManager(conf) { var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; if (retries > 3) return; if (!app.call.currentCall().receivePeerManager()) { retryAgain(conf, retries + 1); return; } var addRes = app.call.currentCall().receivePeerManager().addTrack({ clientId: config.user.clientId, topic: config.user.videoTopicName, mediaType: 2, isScreenShare: true, requestedTopicVersion: conf.version, mline: conf && conf.mline, onTrackCallback: onTrackCallback, onOpenFailure: onOpenFailure, onUpdateSuccess: onUpdateSuccess }); if (addRes === 0) { retryAgain(conf, retries + 1); } function retryAgain(conf, retries) { if (config.isDestroyed) return; setTimeout(function () { addReceiveTrackToPeerManager(conf, retries); }, 10); } } function onOpenFailure(item) { if (item.mediaType == 2) { config.videoIsOpen = false; } if (publicized.isMe()) { if (item.mediaType == 2) { publicized.startVideo(config.user.topicSend, null); } } // app.call.currentCall().sendCallMessage({ // id: 'REQUEST_RECEIVING_MEDIA', // token: app.sdkParams.token, // chatId: config.callId, // brokerAddress: config.user.brokerAddress, // }, null, {}); } 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 getVideoHtmlElement() { var elementUniqueId = _utility["default"].generateUUID(); if (config.user.video && !config.htmlElement) { config.htmlElement = document.createElement('video'); var el = config.htmlElement; el.setAttribute('id', 'callUserVideo-' + config.user.videoTopicName); el.setAttribute('class', app.call.sharedVariables.callVideoTagClassName); el.setAttribute('playsinline', ''); el.setAttribute('muted', ''); el.setAttribute('autoplay', ''); el.setAttribute('data-uniqueId', elementUniqueId); el.setAttribute('width', app.call.sharedVariables.callVideoMinWidth + 'px'); el.setAttribute('height', app.call.sharedVariables.callVideoMinHeight + 'px'); // el.setAttribute('controls', ''); } return config.htmlElement; } function onUpdateSuccess(line) { config.videoReceiveVersion = line.requestedTopicVersion; } function onTrackCallback(line, track) { var trc; if (line.mediaType == 2) { if (track) trc = track; // stream = new MediaStream([track]); else trc = config.streamTracks.video; } // trc.onunmute = (event) => { // console.log('[debug][onTrackCallback][trc.onunmute] ', event) // } // trc.onmute = (event) => { // console.log('[debug][onTrackCallback][trc.onmute] ', event) // } config.streamTracks.video = trc; var stream = new MediaStream([trc]); config.videoStream = stream; if (!config.newVideoStreamId) { config.oldVideoStreamId = null; config.newVideoStreamId = config.videoStream.id; } else { config.oldVideoStreamId = config.newVideoStreamId; config.newVideoStreamId = config.videoStream.id; } if (app.sdkParams.enableCallDivs) { var el = getVideoHtmlElement(); // el.addEventListener('loadedmetadata', playTheTag); // el.srcObject = stream; config.htmlElements[config.user.videoTopicName] = el; publicized.appendVideoToCallDiv(); } } setup(user); return publicized; }