jiti-meet/modules/desktopsharing/desktopsharing.js

128 lines
3.3 KiB
JavaScript
Raw Normal View History

2015-12-30 12:14:56 +00:00
/* global APP, JitsiMeetJS, config */
2015-08-24 21:03:50 +00:00
var EventEmitter = require("events");
2015-12-30 13:28:56 +00:00
import DSEvents from '../../service/desktopsharing/DesktopSharingEventTypes';
2015-08-24 21:03:50 +00:00
2015-12-30 12:14:56 +00:00
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;
/**
2015-12-29 22:30:50 +00:00
* true if desktop sharing is enabled and false otherwise.
*/
2015-12-29 22:30:50 +00:00
var isEnabled = false;
2015-01-13 13:11:05 +00:00
var eventEmitter = new EventEmitter();
function streamSwitchDone() {
switchInProgress = false;
2015-12-30 13:28:56 +00:00
eventEmitter.emit(DSEvents.SWITCHING_DONE, isUsingScreenStream);
}
2015-12-29 22:30:50 +00:00
function newStreamCreated(track) {
2015-12-30 13:28:56 +00:00
eventEmitter.emit(DSEvents.NEW_STREAM_CREATED, track, streamSwitchDone);
}
2015-12-30 12:14:56 +00:00
function getVideoStreamFailed() {
console.error("Failed to obtain the stream to switch to");
2014-04-13 12:30:47 +00:00
switchInProgress = false;
isUsingScreenStream = false;
newStreamCreated(null);
2014-04-13 12:30:47 +00:00
}
2015-12-30 12:14:56 +00:00
function getDesktopStreamFailed() {
console.error("Failed to obtain the stream to switch to");
switchInProgress = false;
}
2015-12-29 22:30:50 +00:00
function onEndedHandler() {
if (!switchInProgress && isUsingScreenStream) {
APP.desktopsharing.toggleScreenSharing();
}
}
2015-01-13 13:11:05 +00:00
module.exports = {
isUsingScreenStream: function () {
return isUsingScreenStream;
},
2015-12-29 22:30:50 +00:00
/**
* Initializes the desktop sharing module.
* @param {boolean} <tt>true</tt> if desktop sharing feature is available
* and enabled.
*/
init: function (enabled) {
isEnabled = enabled;
},
2015-01-13 13:11:05 +00:00
/**
* @returns {boolean} <tt>true</tt> if desktop sharing feature is available
* and enabled.
2015-01-13 13:11:05 +00:00
*/
isDesktopSharingEnabled: function () {
2015-12-29 22:30:50 +00:00
return isEnabled;
},
addListener: function (type, listener) {
2015-01-13 13:11:05 +00:00
eventEmitter.on(type, listener);
},
removeListener: function (type, listener) {
2015-01-13 13:11:05 +00:00
eventEmitter.removeListener(type, listener);
},
/*
* Toggles screen sharing.
*/
toggleScreenSharing: function () {
if (switchInProgress) {
console.warn("Switch in progress.");
return;
2015-12-29 22:30:50 +00:00
} else if (!this.isDesktopSharingEnabled()) {
console.warn("Cannot toggle screen sharing: not supported.");
2015-01-13 13:11:05 +00:00
return;
}
switchInProgress = true;
2015-12-30 12:14:56 +00:00
let type;
if (!isUsingScreenStream) {
2015-01-13 13:11:05 +00:00
// Switch to desktop stream
2015-12-29 22:30:50 +00:00
type = "desktop";
2015-01-13 13:11:05 +00:00
} else {
2015-12-29 22:30:50 +00:00
type = "video";
2015-01-13 13:11:05 +00:00
}
2015-12-31 15:23:23 +00:00
APP.conference.createLocalTracks(type).then(function (tracks) {
2015-12-30 12:14:56 +00:00
if (!tracks.length) {
if (type === 'desktop') {
getDesktopStreamFailed();
} else {
getVideoStreamFailed();
}
return;
}
let stream = tracks[0];
// We now use screen stream
isUsingScreenStream = type === "desktop";
if (isUsingScreenStream) {
stream.on(TrackEvents.TRACK_STOPPED, onEndedHandler);
}
newStreamCreated(stream);
});
},
/*
* Exports the event emitter to allow use by ScreenObtainer. Not for outside
* use.
*/
eventEmitter: eventEmitter
2015-01-13 13:11:05 +00:00
};