(function (root, factory) { if (typeof define === 'function' && define.amd) { define(["converse"], factory); } else { factory(converse); } }(this, function (converse) { var videoRecorder = null, _converse, html, __; converse.plugins.add("screenshare", { 'dependencies': [], 'initialize': function () { _converse = this._converse; html = converse.env.html; __ = _converse.__; _converse.api.listen.on('getToolbarButtons', function(toolbar_el, buttons) { let style = "width:18px; height:18px; fill:var(--chat-color);"; if (toolbar_el.model.get("type") === "chatroom") { style = "width:18px; height:18px; fill:var(--muc-color);"; } buttons.push(html` `); return buttons; }); console.debug("screenshare plugin is ready"); } }); var performScreenShare = function(ev) { ev.stopPropagation(); ev.preventDefault(); const toolbar_el = converse.env.utils.ancestor(ev.target, 'converse-chat-toolbar'); const button = toolbar_el.querySelector('.plugin-screenshare'); const view = _converse.chatboxviews.get(toolbar_el.model.get('jid')); if (videoRecorder == null) { button.classList.add('blink_me'); getDisplayMedia({ video: true }).then(stream => { handleStream(stream, view); stream.getVideoTracks()[0].addEventListener('ended', () => { console.debug('The user has ended sharing the screen'); if (videoRecorder) videoRecorder.stop(); button.classList.remove('blink_me'); }); }, error => { handleError(error); button.classList.remove('blink_me'); }); } else { button.classList.remove('blink_me'); videoRecorder.stop(); videoRecorder = null; } } var getDisplayMedia = function getDisplayMedia() { if (navigator.getDisplayMedia) { return navigator.getDisplayMedia({video: true}); } else if (navigator.mediaDevices.getDisplayMedia) { return navigator.mediaDevices.getDisplayMedia({video: true}); } else { return navigator.mediaDevices.getUserMedia({video: {mediaSource: 'screen'}}); } } var handleStream = function handleStream (stream, view) { navigator.mediaDevices.getUserMedia({audio: true, video: false}).then((audioStream) => handleAudioStream(stream, audioStream, view)).catch((e) => handleError(e)) } var handleAudioStream = function handleStream (stream, audioStream, view) { stream.addTrack(audioStream.getAudioTracks()[0]); audioStream.removeTrack(audioStream.getAudioTracks()[0]); var video = document.createElement('video'); video.playsinline = true; video.autoplay = true; video.muted = true; video.srcObject = stream; video.style.display = "none"; setTimeout(function() { videoRecorder = new MediaRecorder(stream); videoChunks = []; videoRecorder.ondataavailable = function(e) { if (e.data.size > 0) { console.debug("screenshare - ondataavailable", e.data); videoChunks.push(e.data); } } videoRecorder.onstop = function(e) { console.debug("screenshare - onstop", e); stream.getTracks().forEach(track => track.stop()); var blob = new Blob(videoChunks, {type: 'video/webm;codecs=h264'}); var file = new File([blob], "screenshare-" + Math.random().toString(36).substr(2,9) + ".webm", {type: 'video/webm;codecs=h264'}); view.model.sendFiles([file]); videoRecorder = null; } videoRecorder.start(); }); } var handleError = function handleError (e) { console.error("ScreenShare", e) } }));