PretendYoureXyzzy/WebContent/js/cah.longpoll.js

68 lines
2.0 KiB
JavaScript
Raw Normal View History

/**
* AJAX long polling library.
*
* @author ajanata
*/
cah.longpoll = {};
cah.longpoll.TIMEOUT = 2 * 60 * 1000;
// cah.longpoll.TIMEOUT = 5 * 1000;
cah.longpoll.INITIAL_BACKOFF = 500;
cah.longpoll.Backoff = cah.longpoll.INITIAL_BACKOFF;
cah.longpoll.Resume = true;
cah.longpoll.ErrorCodeHandlers = {};
cah.longpoll.EventHandlers = {};
cah.longpoll.longPoll = function() {
cah.log.debug("starting long poll");
$.ajax({
complete : cah.longpoll.complete,
error : cah.longpoll.error,
success : cah.longpoll.done,
timeout : cah.longpoll.TIMEOUT,
url : '/cah/LongPollServlet',
});
};
cah.longpoll.complete = function() {
if (cah.longpoll.Resume) {
setTimeout("cah.longpoll.longPoll()", cah.longpoll.Backoff);
}
};
cah.longpoll.done = function(data_list) {
cah.log.debug("long poll done", data_list);
for ( var index in data_list) {
var data = data_list[index];
if (data['error']) {
// TODO cancel any timers or whatever we may have, and disable interface
// this probably should be done in the appropriate error code handler because we may not
// want to always be that extreme.
if (cah.longpoll.ErrorCodeHandlers[data.error_code]) {
cah.longpoll.ErrorCodeHandlers[data.error_code](data);
} else {
cah.log.error(data.error_message);
}
} else {
if (cah.longpoll.EventHandlers[data.event]) {
cah.longpoll.EventHandlers[data.event](data);
} else {
cah.log.error("Unhandled event " + data.event);
}
}
}
// reset the backoff to normal when there's a successful operation
cah.longpoll.Backoff = cah.longpoll.INITIAL_BACKOFF;
};
cah.longpoll.error = function(jqXHR, textStatus, errorThrown) {
// TODO deal with this somehow
cah.log.debug(textStatus);
cah.longpoll.Backoff *= 2;
cah.log
.error("Error communicating with server. Will try again in " + (cah.longpoll.Backoff / 1000)
+ " second" + (cah.longpoll.Backoff != 1000 ? "s" : "") + ".");
};