| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | 
							- /* global APP, JitsiMeetJS, config */
 - var EventEmitter = require("events");
 - import DSEvents from '../../service/desktopsharing/DesktopSharingEventTypes';
 - 
 - const TrackEvents = JitsiMeetJS.events.track;
 - 
 - /**
 -  * Indicates that desktop stream is currently in use (for toggle purpose).
 -  * @type {boolean}
 -  */
 - var isUsingScreenStream = false;
 - 
 - /**
 -  * Indicates that switch stream operation is in progress and prevent from
 -  * triggering new events.
 -  * @type {boolean}
 -  */
 - var switchInProgress = false;
 - 
 - /**
 -  * true if desktop sharing is enabled and false otherwise.
 -  */
 - var isEnabled = false;
 - 
 - var eventEmitter = new EventEmitter();
 - 
 - function streamSwitchDone() {
 -     switchInProgress = false;
 -     eventEmitter.emit(DSEvents.SWITCHING_DONE, isUsingScreenStream);
 - }
 - 
 - function newStreamCreated(track) {
 -     eventEmitter.emit(DSEvents.NEW_STREAM_CREATED, track, streamSwitchDone);
 - }
 - 
 - function getVideoStreamFailed(error) {
 -     console.error("Failed to obtain the stream to switch to", error);
 -     switchInProgress = false;
 -     isUsingScreenStream = false;
 -     newStreamCreated(null);
 - }
 - 
 - function getDesktopStreamFailed(error) {
 -     console.error("Failed to obtain the stream to switch to", error);
 -     switchInProgress = false;
 - }
 - 
 - function onEndedHandler() {
 -     if (!switchInProgress && isUsingScreenStream) {
 -         APP.desktopsharing.toggleScreenSharing();
 -     }
 - }
 - 
 - module.exports = {
 -     isUsingScreenStream: function () {
 -         return isUsingScreenStream;
 -     },
 -     /**
 -      * Initializes the desktop sharing module.
 -      * @param {boolean} <tt>true</tt> if desktop sharing feature is available
 -      * and enabled.
 -      */
 -     init: function (enabled) {
 -         isEnabled = enabled;
 -     },
 -     /**
 -      * @returns {boolean} <tt>true</tt> if desktop sharing feature is available
 -      *          and enabled.
 -      */
 -     isDesktopSharingEnabled: function () {
 -         return isEnabled;
 -     },
 -     addListener: function (type, listener) {
 -         eventEmitter.on(type, listener);
 -     },
 - 
 -     removeListener: function (type, listener) {
 -         eventEmitter.removeListener(type, listener);
 -     },
 - 
 -     /*
 -      * Toggles screen sharing.
 -      */
 -     toggleScreenSharing: function () {
 -         if (switchInProgress) {
 -             console.warn("Switch in progress.");
 -             return;
 -         } else if (!this.isDesktopSharingEnabled()) {
 -             console.warn("Cannot toggle screen sharing: not supported.");
 -             return;
 -         }
 -         switchInProgress = true;
 -         let type;
 -         if (!isUsingScreenStream) {
 -             // Switch to desktop stream
 -             type = "desktop";
 -         } else {
 -             type = "video";
 -         }
 -         var fail = (error) => {
 -             if (type === 'desktop') {
 -                 getDesktopStreamFailed(error);
 -             } else {
 -                 getVideoStreamFailed(error);
 -             }
 -         };
 -         APP.conference.createLocalTracks(type).then((tracks) => {
 -             // FIXME does it mean that 'not track.length' == GUM failed ?
 -             // And will this ever happen if promise is supposed to fail in GUM
 -             // failed case ?
 -             if (!tracks.length) {
 -                 fail();
 -                 return;
 -             }
 -             let stream = tracks[0];
 - 
 -             // We now use screen stream
 -             isUsingScreenStream = type === "desktop";
 -             if (isUsingScreenStream) {
 -                 stream.on(TrackEvents.TRACK_STOPPED, onEndedHandler);
 -             }
 -             newStreamCreated(stream);
 -         }).catch((error) => {
 -             if(error === JitsiMeetJS.errors.track.FIREFOX_EXTENSION_NEEDED)
 -             {
 -                 eventEmitter.emit(
 -                     DSEvents.FIREFOX_EXTENSION_NEEDED,
 -                     config.desktopSharingFirefoxExtensionURL);
 -                 return;
 -             }
 -             fail(error);
 -         });
 -     }
 - };
 
 
  |