Fixes issues related to PR #452

This commit is contained in:
hristoterezov 2016-01-25 16:39:05 -06:00
parent 66212862ce
commit 089a9880b0
5 changed files with 255 additions and 47 deletions

View File

@ -111,13 +111,15 @@ class ConferenceConnector {
this._handleConferenceJoined.bind(this));
room.on(ConferenceEvents.CONFERENCE_FAILED,
this._onConferenceFailed.bind(this));
room.on(ConferenceEvents.CONFERENCE_ERROR,
this._onConferenceError.bind(this));
}
_handleConferenceFailed(err, msg) {
this._unsubscribe();
this._reject(err);
}
_onConferenceFailed(err, msg = '') {
console.error('CONFERENCE FAILED:', err, msg);
_onConferenceFailed(err, ...params) {
console.error('CONFERENCE FAILED:', err, params);
switch (err) {
// room is locked by the password
case ConferenceErrors.PASSWORD_REQUIRED:
@ -128,7 +130,10 @@ class ConferenceConnector {
break;
case ConferenceErrors.CONNECTION_ERROR:
APP.UI.notifyConnectionFailed(msg);
{
let [msg] = params;
APP.UI.notifyConnectionFailed(msg);
}
break;
case ConferenceErrors.VIDEOBRIDGE_NOT_AVAILABLE:
@ -146,8 +151,50 @@ class ConferenceConnector {
AuthHandler.requireAuth(APP.conference.roomName);
break;
case ConferenceErrors.RESERVATION_ERROR:
{
let [code, msg] = params;
APP.UI.notifyReservationError(code, msg);
}
break;
case ConferenceErrors.GRACEFUL_SHUTDOWN:
APP.UI.notifyGracefulShudown();
break;
case ConferenceErrors.JINGLE_FATAL_ERROR:
APP.UI.notifyInternalError();
break;
case ConferenceErrors.CONFERENCE_DESTROYED:
{
let [reason] = params;
APP.UI.notifyConferenceDestroyed(reason);
}
break;
case ConferenceErrors.FOCUS_DISCONNECTED:
{
let [focus, retrySec] = params;
APP.UI.notifyFocusDisconnected(focus, retrySec);
}
break;
default:
this._handleConferenceFailed(err, msg);
this._handleConferenceFailed(err, ...params);
}
}
_onConferenceError(err, ...params) {
console.error('CONFERENCE Error:', err, params);
switch (err) {
case ConferenceErrors.CHAT_ERROR:
{
let [code, msg] = params;
APP.UI.showChatError(code, msg);
}
break;
default:
console.error("Unknown error.");
}
}
_unsubscribe() {
@ -513,6 +560,10 @@ export default {
APP.UI.updateRecordingState(status);
});
room.on(ConferenceEvents.USER_STATUS_CHANGED, function (id, status) {
APP.UI.updateUserStatus(id, status);
});
room.on(ConferenceEvents.KICKED, () => {
APP.UI.notifyKicked();
// FIXME close
@ -522,6 +573,10 @@ export default {
APP.UI.updateDTMFSupport(isDTMFSupported);
});
room.on(ConferenceEvents.FIREFOX_EXTENSION_NEEDED, function (url) {
APP.UI.notifyFirefoxExtensionRequired(url);
});
APP.UI.addListener(UIEvents.ROOM_LOCK_CLICKED, () => {
if (room.isModerator()) {
let promise = roomLocker.isLocked
@ -657,6 +712,12 @@ export default {
);
});
room.on(
ConferenceEvents.AVAILABLE_DEVICES_CHANGED, function (id, devices) {
APP.UI.updateDevicesAvailability(id, devices);
}
);
// call hangup
APP.UI.addListener(UIEvents.HANGUP, () => {
APP.UI.requestFeedback().then(() => {

View File

@ -59,6 +59,10 @@ function JitsiConference(options) {
this.startAudioMuted = false;
this.startVideoMuted = false;
this.startMutedPolicy = {audio: false, video: false};
this.availableDevices = {
audio: undefined,
video: undefined
};
}
/**
@ -817,6 +821,24 @@ function setupListeners(conference) {
conference.room.addListener(XMPPEvents.BRIDGE_DOWN, function () {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_FAILED, JitsiConferenceErrors.VIDEOBRIDGE_NOT_AVAILABLE);
});
conference.room.addListener(XMPPEvents.RESERVATION_ERROR, function (code, msg) {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_FAILED, JitsiConferenceErrors.RESERVATION_ERROR, code, msg);
});
conference.room.addListener(XMPPEvents.GRACEFUL_SHUTDOWN, function () {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_FAILED, JitsiConferenceErrors.GRACEFUL_SHUTDOWN);
});
conference.room.addListener(XMPPEvents.JINGLE_FATAL_ERROR, function () {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_FAILED, JitsiConferenceErrors.JINGLE_FATAL_ERROR);
});
conference.room.addListener(XMPPEvents.MUC_DESTROYED, function (reason) {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_FAILED, JitsiConferenceErrors.CONFERENCE_DESTROYED, reason);
});
conference.room.addListener(XMPPEvents.CHAT_ERROR_RECEIVED, function (err, msg) {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_ERROR, JitsiConferenceErrors.CHAT_ERROR, err, msg);
});
conference.room.addListener(XMPPEvents.FOCUS_DISCONNECTED, function (focus, retrySec) {
conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_FAILED, JitsiConferenceErrors.FOCUS_DISCONNECTED, focus, retrySec);
});
// FIXME
// conference.room.addListener(XMPPEvents.MUC_JOINED, function () {
// conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_LEFT);
@ -868,6 +890,16 @@ function setupListeners(conference) {
conference.eventEmitter.emit(JitsiConferenceEvents.MESSAGE_RECEIVED, id, txt, ts);
});
conference.room.addListener(XMPPEvents.PRESENCE_STATUS, function (jid, status) {
var id = Strophe.getResourceFromJid(jid);
var participant = conference.getParticipantById(id);
if (!participant || participant._status === status) {
return;
}
participant._status = status;
conference.eventEmitter.emit(JitsiConferenceEvents.USER_STATUS_CHANGED, id, status);
});
conference.rtc.addListener(RTCEvents.DOMINANTSPEAKER_CHANGED, function (id) {
if(conference.lastDominantSpeaker !== id && conference.room) {
conference.lastDominantSpeaker = id;
@ -945,6 +977,50 @@ function setupListeners(conference) {
}
});
conference.rtc.addListener(RTCEvents.AVAILABLE_DEVICES_CHANGED, function (devices) {
conference.room.updateDeviceAvailability(devices);
});
conference.room.addPresenceListener("devices", function (data, from) {
var isAudioAvailable = false;
var isVideoAvailable = false;
data.children.forEach(function (config) {
if (config.tagName === 'audio') {
isAudioAvailable = config.value === 'true';
}
if (config.tagName === 'video') {
isVideoAvailable = config.value === 'true';
}
});
var availableDevices;
if (conference.myUserId() === from) {
availableDevices = conference.availableDevices;
} else {
var participant = conference.getParticipantById(from);
if (!participant) {
return;
}
availableDevices = participant._availableDevices;
}
var updated = false;
if (availableDevices.audio !== isAudioAvailable) {
updated = true;
availableDevices.audio = isAudioAvailable;
}
if (availableDevices.video !== isVideoAvailable) {
updated = true;
availableDevices.video = isVideoAvailable;
}
if (updated) {
conference.eventEmitter.emit(JitsiConferenceEvents.AVAILABLE_DEVICES_CHANGED, from, availableDevices);
}
});
if(conference.statistics) {
//FIXME: Maybe remove event should not be associated with the conference.
conference.statistics.addAudioLevelListener(function (ssrc, level) {
@ -959,10 +1035,6 @@ function setupListeners(conference) {
function () {
conference.statistics.dispose();
});
// FIXME: Maybe we should move this.
// RTC.addListener(RTCEvents.AVAILABLE_DEVICES_CHANGED, function (devices) {
// conference.room.updateDeviceAvailability(devices);
// });
conference.room.addListener(XMPPEvents.PEERCONNECTION_READY,
function (session) {
@ -1045,7 +1117,31 @@ var JitsiConferenceErrors = {
/**
* Indicates that there is no available videobridge.
*/
VIDEOBRIDGE_NOT_AVAILABLE: "conference.videobridgeNotAvailable"
VIDEOBRIDGE_NOT_AVAILABLE: "conference.videobridgeNotAvailable",
/**
* Indicates that reservation system returned error.
*/
RESERVATION_ERROR: "conference.reservationError",
/**
* Indicates that graceful shutdown happened.
*/
GRACEFUL_SHUTDOWN: "conference.gracefulShutdown",
/**
* Indicates that jingle fatal error happened.
*/
JINGLE_FATAL_ERROR: "conference.jingleFatalError",
/**
* Indicates that conference has been destroyed.
*/
CONFERENCE_DESTROYED: "conference.destroyed",
/**
* Indicates that chat error occurred.
*/
CHAT_ERROR: "conference.chatError",
/**
* Indicates that focus error happened.
*/
FOCUS_DISCONNECTED: "conference.focusDisconnected"
/**
* Many more errors TBD here.
*/
@ -1083,6 +1179,10 @@ var JitsiConferenceEvents = {
* User role changed.
*/
USER_ROLE_CHANGED: "conference.roleChanged",
/**
* User status changed.
*/
USER_STATUS_CHANGED: "conference.statusChanged",
/**
* New text message was received.
*/
@ -1132,6 +1232,10 @@ var JitsiConferenceEvents = {
* Indicates that conference failed.
*/
CONFERENCE_FAILED: "conference.failed",
/**
* Indicates that an error occured.
*/
CONFERENCE_ERROR: "conference.error",
/**
* Indicates that conference has been joined.
*/
@ -1163,7 +1267,11 @@ var JitsiConferenceEvents = {
/**
* Indicates that phone number changed.
*/
PHONE_NUMBER_CHANGED: "conference.phoneNumberChanged"
PHONE_NUMBER_CHANGED: "conference.phoneNumberChanged",
/**
* Indicates that available devices changed.
*/
AVAILABLE_DEVICES_CHANGED: "conference.availableDevicesChanged"
};
module.exports = JitsiConferenceEvents;
@ -1460,6 +1568,11 @@ function JitsiParticipant(jid, conference, displayName){
this._supportsDTMF = false;
this._tracks = [];
this._role = 'none';
this._status = null;
this._availableDevices = {
audio: undefined,
video: undefined
};
}
/**
@ -1497,6 +1610,13 @@ JitsiParticipant.prototype.getDisplayName = function() {
return this._displayName;
};
/**
* @returns {String} The status of the participant.
*/
JitsiParticipant.prototype.getStatus = function () {
return this._status;
};
/**
* @returns {Boolean} Whether this participant is a moderator or not.
*/
@ -1892,7 +2012,6 @@ DataChannels.prototype._some = function (callback, thisArg) {
module.exports = DataChannels;
}).call(this,"/modules/RTC/DataChannels.js")
},{"../../service/RTC/RTCEvents":133,"jitsi-meet-logger":50}],13:[function(require,module,exports){
var JitsiTrack = require("./JitsiTrack");
@ -2428,8 +2547,6 @@ var JitsiTrack = require("./JitsiTrack");
var JitsiLocalTrack = require("./JitsiLocalTrack.js");
var DataChannels = require("./DataChannels");
var JitsiRemoteTrack = require("./JitsiRemoteTrack.js");
var DesktopSharingEventTypes
= require("../../service/desktopsharing/DesktopSharingEventTypes");
var MediaStreamType = require("../../service/RTC/MediaStreamTypes");
var RTCEvents = require("../../service/RTC/RTCEvents.js");
@ -2688,7 +2805,7 @@ RTC.prototype.setAudioLevel = function (jid, audioLevel) {
}
module.exports = RTC;
},{"../../service/RTC/MediaStreamTypes":132,"../../service/RTC/RTCEvents.js":133,"../../service/desktopsharing/DesktopSharingEventTypes":136,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,"events":46}],17:[function(require,module,exports){
},{"../../service/RTC/MediaStreamTypes":132,"../../service/RTC/RTCEvents.js":133,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,"events":46}],17:[function(require,module,exports){
var currentBrowser;
@ -7646,12 +7763,9 @@ ChatRoom.prototype.onPresence = function (pres) {
}
}
if(!member.isFocus)
this.eventEmitter.emit(XMPPEvents.USER_ID_CHANGED, from, member.id);
// Trigger status message update
if (member.status) {
this.eventEmitter.emit(XMPPEvents.PRESENCE_STATUS, from, member);
this.eventEmitter.emit(XMPPEvents.PRESENCE_STATUS, from, member.status);
}
if(jibri)
@ -13093,9 +13207,6 @@ function initStrophePlugins(XMPP)
// broadcastLocalVideoType,
// StreamEventTypes.EVENT_TYPE_LOCAL_CHANGED
// );
// RTC.addListener(RTCEvents.AVAILABLE_DEVICES_CHANGED, function (devices) {
// XMPP.addToPresence("devices", devices);
// });
//}
function XMPP(options) {
@ -31558,11 +31669,6 @@ var XMPPEvents = {
CALL_INCOMING: "xmpp.callincoming.jingle",
// Designates an event indicating that we were kicked from the XMPP MUC.
KICKED: "xmpp.kicked",
// Designates an event indicating that the userID for a specific JID has
// changed.
// Note: currently this event fires every time we receive presence from
// someone (regardless of whether or not the "userID" changed).
USER_ID_CHANGED: "xmpp.user_id_changed",
// Designates an event indicating that we have joined the XMPP MUC.
MUC_JOINED: "xmpp.muc_joined",
// Designates an event indicating that a participant joined the XMPP MUC.
@ -31607,11 +31713,6 @@ var XMPPEvents = {
// Designates an event indicating that we should join the conference with
// audio and/or video muted.
START_MUTED_FROM_FOCUS: "xmpp.start_muted_from_focus",
// Designates an event indicating that a remote participant's available
// devices (whether he supports a audio and/or video) changed.
// Note: currently this event fires every time we receive presence from
// someone (regardless of whether or not the devices changed).
DEVICE_AVAILABLE: "xmpp.device_available",
PEERCONNECTION_READY: "xmpp.peerconnection_ready",

View File

@ -157,13 +157,41 @@ UI.notifyKicked = function () {
messageHandler.openMessageDialog("dialog.sessTerminated", "dialog.kickMessage");
};
/**
* Notify user that conference was destroyed.
* @param reason {string} the reason text
*/
UI.notifyConferenceDestroyed = function (reason) {
//FIXME: use Session Terminated from translation, but
// 'reason' text comes from XMPP packet and is not translated
var title = APP.translation.generateTranslationHTML("dialog.sessTerminated");
messageHandler.openDialog(
title, reason, true, {},
function (event, value, message, formVals) {
return false;
}
);
};
/**
* Notify user that Jitsi Videobridge is not accessible.
*/
UI.notifyBridgeDown = function () {
UI.notifyBridgeDown = function () {
messageHandler.showError("dialog.error", "dialog.bridgeUnavailable");
};
/**
* Show chat error.
* @param err the Error
* @param msg
*/
UI.showChatError = function (err, msg) {
if (interfaceConfig.filmStripOnly) {
return;
}
Chat.chatAddError(err, msg);
};
/**
* Change nickname for the user.
* @param {string} id user id
@ -471,10 +499,9 @@ UI.removeUser = function (id, displayName) {
VideoLayout.removeParticipantContainer(id);
};
//FIXME: NOT USED. Should start using the lib
// function onMucPresenceStatus(jid, info) {
// VideoLayout.setPresenceStatus(Strophe.getResourceFromJid(jid), info.status);
// }
UI.updateUserStatus = function (id, status) {
VideoLayout.setPresenceStatus(id, status);
};
/**
* Update videotype for specified user.
@ -706,7 +733,7 @@ UI.notifyFirefoxExtensionRequired = function (url) {
null,
null,
APP.translation.generateTranslationHTML(
"dialog.firefoxExtensionPrompt", {url: url}
"dialog.firefoxExtensionPrompt", {url}
)
);
};
@ -926,6 +953,18 @@ UI.notifyTokenAuthFailed = function () {
messageHandler.showError("dialog.error", "dialog.tokenAuthFailed");
};
UI.notifyInternalError = function () {
UI.messageHandler.showError("dialog.sorry", "dialog.internalError");
};
UI.notifyFocusDisconnected = function (focus, retrySec) {
UI.messageHandler.notify(
null, "notify.focus",
'disconnected', "notify.focusFail",
{component: focus, ms: retrySec}
);
};
/**
* Updates auth info on the UI.
* @param {boolean} isAuthEnabled if authentication is enabled
@ -988,4 +1027,8 @@ UI.showExtensionRequiredDialog = function (url) {
"dialog.firefoxExtensionPrompt", {url: url}));
};
UI.updateDevicesAvailability = function (id, devices) {
VideoLayout.setDeviceAvailabilityIcons(id, devices);
};
module.exports = UI;

View File

@ -165,6 +165,7 @@ class VideoContainer extends LargeContainer {
get id () {
return getStreamOwnerId(this.stream);
return getStreamId(this.stream);
}
constructor (onPlay) {

View File

@ -187,16 +187,18 @@ var VideoLayout = {
* @param resourceJid the jid of user
* @param devices available devices
*/
setDeviceAvailabilityIcons (resourceJid, devices) {
if(!devices)
return;
if(!resourceJid) {
setDeviceAvailabilityIcons (id, devices) {
if (APP.conference.isLocalId(id)) {
localVideoThumbnail.setDeviceAvailabilityIcons(devices);
} else {
if(remoteVideos[resourceJid])
remoteVideos[resourceJid].setDeviceAvailabilityIcons(devices);
return;
}
let video = remoteVideos[id];
if (!video) {
return;
}
video.setDeviceAvailabilityIcons(devices);
},
/**
@ -387,8 +389,8 @@ var VideoLayout = {
/**
* Shows the presence status message for the given video.
*/
setPresenceStatus (resourceJid, statusMsg) {
remoteVideos[resourceJid].setPresenceStatus(statusMsg);
setPresenceStatus (id, statusMsg) {
remoteVideos[id].setPresenceStatus(statusMsg);
},
/**