jiti-meet/modules/desktopsharing/desktopsharing.js

149 lines
4.4 KiB
JavaScript
Raw Normal View History

/* global APP, config */
2015-08-24 21:03:50 +00:00
var EventEmitter = require("events");
var DesktopSharingEventTypes
= require("../../service/desktopsharing/DesktopSharingEventTypes");
var RTCBrowserType = require("../RTC/RTCBrowserType");
var RTCEvents = require("../../service/RTC/RTCEvents");
var ScreenObtainer = require("./ScreenObtainer");
2015-08-24 21:03:50 +00:00
/**
* 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;
/**
* Used to obtain the screen sharing stream from the browser.
*/
var screenObtainer = new ScreenObtainer();
2015-01-13 13:11:05 +00:00
var eventEmitter = new EventEmitter();
function streamSwitchDone() {
switchInProgress = false;
eventEmitter.emit(
DesktopSharingEventTypes.SWITCHING_DONE,
isUsingScreenStream);
}
function newStreamCreated(stream) {
eventEmitter.emit(DesktopSharingEventTypes.NEW_STREAM_CREATED,
stream, isUsingScreenStream, streamSwitchDone);
}
function getVideoStreamFailed(error) {
2014-04-13 12:30:47 +00:00
console.error("Failed to obtain the stream to switch to", error);
switchInProgress = false;
isUsingScreenStream = false;
newStreamCreated(null);
2014-04-13 12:30:47 +00:00
}
function getDesktopStreamFailed(error) {
console.error("Failed to obtain the stream to switch to", error);
switchInProgress = false;
}
function onEndedHandler(stream) {
if (!switchInProgress && isUsingScreenStream) {
APP.desktopsharing.toggleScreenSharing();
}
//FIXME: to be verified
if (stream.removeEventListener) {
stream.removeEventListener('ended', onEndedHandler);
} else {
stream.detachEvent('ended', onEndedHandler);
}
}
2015-01-13 13:11:05 +00:00
module.exports = {
isUsingScreenStream: function () {
return isUsingScreenStream;
},
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 () {
return screenObtainer.isSupported();
},
2015-01-13 13:11:05 +00:00
init: function () {
// Called when RTC finishes initialization
APP.RTC.addListener(RTCEvents.RTC_READY,
function() {
screenObtainer.init(eventEmitter);
eventEmitter.emit(DesktopSharingEventTypes.INIT);
});
2015-01-13 13:11:05 +00:00
},
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;
} else if (!screenObtainer.isSupported()) {
console.warn("Cannot toggle screen sharing: not supported.");
2015-01-13 13:11:05 +00:00
return;
}
switchInProgress = true;
if (!isUsingScreenStream) {
2015-01-13 13:11:05 +00:00
// Switch to desktop stream
screenObtainer.obtainStream(
2015-01-13 13:11:05 +00:00
function (stream) {
// We now use screen stream
isUsingScreenStream = true;
// Hook 'ended' event to restore camera
// when screen stream stops
//FIXME: to be verified
if (stream.addEventListener) {
stream.addEventListener('ended', function () {
onEndedHandler(stream);
});
} else {
stream.attachEvent('ended', function () {
onEndedHandler(stream);
});
}
2015-01-13 13:11:05 +00:00
newStreamCreated(stream);
},
getDesktopStreamFailed);
2015-01-13 13:11:05 +00:00
} else {
// Disable screen stream
APP.RTC.getUserMediaWithConstraints(
2015-01-13 13:11:05 +00:00
['video'],
function (stream) {
// We are now using camera stream
isUsingScreenStream = false;
newStreamCreated(stream);
},
getVideoStreamFailed, config.resolution || '360'
2015-01-13 13:11:05 +00:00
);
}
},
/*
* Exports the event emitter to allow use by ScreenObtainer. Not for outside
* use.
*/
eventEmitter: eventEmitter
2015-01-13 13:11:05 +00:00
};