Reloads the page when focus leaves to dispose MUC room. Adds exponential backoff to focus polling.
This commit is contained in:
parent
7dc8102dee
commit
84a453597c
25
app.js
25
app.js
|
@ -219,29 +219,8 @@ function doJoin() {
|
||||||
generateRoomName();
|
generateRoomName();
|
||||||
}
|
}
|
||||||
|
|
||||||
var elem = $iq({to: config.hosts.focus, type: 'set'});
|
Moderator.allocateConferenceFocus(
|
||||||
elem.c('conference', {
|
roomName, doJoinAfterFocus);
|
||||||
xmlns: 'http://jitsi.org/protocol/focus',
|
|
||||||
room: roomName
|
|
||||||
});
|
|
||||||
elem.up();
|
|
||||||
connection.sendIQ(elem,
|
|
||||||
function (result) {
|
|
||||||
console.info("Focus replied ", result);
|
|
||||||
if ('true' === $(result).find('conference').attr('ready')) {
|
|
||||||
doJoinAfterFocus();
|
|
||||||
} else {
|
|
||||||
console.info("Waiting for the focus...");
|
|
||||||
window.setTimeout(
|
|
||||||
function () {
|
|
||||||
doJoin();
|
|
||||||
}, 3000);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function (error) {
|
|
||||||
console.warn(error);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function doJoinAfterFocus() {
|
function doJoinAfterFocus() {
|
||||||
|
|
53
moderator.js
53
moderator.js
|
@ -1,10 +1,13 @@
|
||||||
/* global $, config, connection, Etherpad, Toolbar, VideoLayout */
|
/* global $, $iq, config, connection, Etherpad, hangUp, Strophe, Toolbar,
|
||||||
|
Util, VideoLayout */
|
||||||
/**
|
/**
|
||||||
* Contains logic responsible for enabling/disabling functionality available
|
* Contains logic responsible for enabling/disabling functionality available
|
||||||
* only to moderator users.
|
* only to moderator users.
|
||||||
*/
|
*/
|
||||||
var Moderator = (function (my) {
|
var Moderator = (function (my) {
|
||||||
|
|
||||||
|
var getNextTimeout = Util.createExpBackoffTimer(1000);
|
||||||
|
|
||||||
my.isModerator = function () {
|
my.isModerator = function () {
|
||||||
return connection.emuc.isModerator();
|
return connection.emuc.isModerator();
|
||||||
};
|
};
|
||||||
|
@ -44,6 +47,54 @@ var Moderator = (function (my) {
|
||||||
Moderator.onModeratorStatusChanged(Moderator.isModerator());
|
Moderator.onModeratorStatusChanged(Moderator.isModerator());
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$(document).bind(
|
||||||
|
'left.muc',
|
||||||
|
function (event, jid) {
|
||||||
|
console.info("Someone left is it focus ? " + jid);
|
||||||
|
var resource = Strophe.getResourceFromJid(jid);
|
||||||
|
if (resource === 'focus') {
|
||||||
|
console.info(
|
||||||
|
"Focus has left the room - leaving conference");
|
||||||
|
//hangUp();
|
||||||
|
// We'd rather reload to have everything re-initialized
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
my.allocateConferenceFocus = function (roomName, callback) {
|
||||||
|
var elem = $iq({to: config.hosts.focus, type: 'set'});
|
||||||
|
elem.c('conference', {
|
||||||
|
xmlns: 'http://jitsi.org/protocol/focus',
|
||||||
|
room: roomName
|
||||||
|
});
|
||||||
|
elem.up();
|
||||||
|
connection.sendIQ(elem,
|
||||||
|
function (result) {
|
||||||
|
if ('true' === $(result).find('conference').attr('ready')) {
|
||||||
|
// Reset timer
|
||||||
|
getNextTimeout(true);
|
||||||
|
callback();
|
||||||
|
} else {
|
||||||
|
var waitMs = getNextTimeout();
|
||||||
|
console.info("Waiting for the focus... " + waitMs);
|
||||||
|
window.setTimeout(
|
||||||
|
function () {
|
||||||
|
Moderator.allocateConferenceFocus(roomName, callback);
|
||||||
|
}, waitMs);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function (error) {
|
||||||
|
var waitMs = getNextTimeout();
|
||||||
|
console.error("Focus error, retry after " + waitMs, error);
|
||||||
|
window.setTimeout(
|
||||||
|
function () {
|
||||||
|
Moderator.allocateConferenceFocus(roomName, callback);
|
||||||
|
}, waitMs);
|
||||||
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return my;
|
return my;
|
||||||
|
|
15
util.js
15
util.js
|
@ -84,5 +84,20 @@ var Util = (function (my) {
|
||||||
element.setAttribute("data-container", "body");
|
element.setAttribute("data-container", "body");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
my.createExpBackoffTimer = function (step) {
|
||||||
|
var count = 1;
|
||||||
|
return function (reset) {
|
||||||
|
// Reset call
|
||||||
|
if (reset) {
|
||||||
|
count = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Calculate next timeout
|
||||||
|
var timeout = Math.pow(2, count - 1);
|
||||||
|
count += 1;
|
||||||
|
return timeout * step;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
return my;
|
return my;
|
||||||
}(Util || {}));
|
}(Util || {}));
|
||||||
|
|
Loading…
Reference in New Issue