var alphaChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
function generateRandomKey(length) {
s = "";
for (var i = 0; i < length; i++) {
var r = Math.floor(Math.random() * 26);
s += alphaChars[r];
}
return s;
}
function formatTime() {
var a_p = "";
var d = new Date();
var curr_hour = d.getHours();
if (curr_hour < 12)
{
a_p = "AM";
}
else
{
a_p = "PM";
}
if (curr_hour == 0)
{
curr_hour = 12;
}
if (curr_hour > 12)
{
curr_hour = curr_hour - 12;
}
if (curr_hour.length == 1)
curr_hour = "0" + curr_hour;
var curr_min = d.getMinutes();
curr_min = curr_min + "";
if (curr_min.length == 1)
{
curr_min = "0" + curr_min;
}
return curr_hour + ":" + curr_min + " " + a_p;
}
Key = generateRandomKey(10);
Timestamp = 0;
Counter = 0;
ClientMap = {};
function showError(err) {
var msg = formatTime() + " " + err;
console.error(msg);
$('#msgs').append($('
').css('color', 'red').text(msg));
};
function handleMessages(msgs, oldTime, newTime) {
$.map(msgs, function(m) {
var split = m.content.split("-");
if (split.length != 2) {
showError("Bad message " + m.content);
return;
}
var client = split[0];
var i = parseInt(split[1]);
console.warn(client + " " + i);
if (client in ClientMap) {
var p = ClientMap[client];
if (i - p != 1) {
showError("[" + Key + "] Error for client " + client
+ "! Expected " + (p+1) + ", got " + i
+ " (" + oldTime + " -> " + newTime + ")"
);
}
}
ClientMap[client] = i;
});
}
function refresh() {
var onSuccess = function(json) {
try {
handleMessages(json.messages, Timestamp, json.timestamp);
Timestamp = json.timestamp;
} catch(e) {
console.error(e);
$('#msgs').append($('
').css('color', 'red').text(e));
}
setTimeout(refresh, 1000);
};
var onError = function(resp, textStatus, errorThrown) {
console.error($.trim(resp.responseText));
setTimeout(refresh, 1000);
};
$.ajax({
type: 'GET',
timeout: 5000,
url: '/refresh',
data: { 'room': 'test', 'since': Timestamp },
cache: false,
dataType: 'json',
success: onSuccess,
error: onError
});
}
function postMessageWrapper() {
var delay = Math.ceil(1000 + Math.random() * 3000);
setTimeout(postMessage, delay);
}
function postMessage() {
var content = Key + "-" + Counter;
Counter++;
var onError = function(resp, textStatus, errorThrown) {
showError("Error posting " + content + ": " + resp.responseText);
postMessageWrapper();
};
$.ajax({
type: 'POST',
timeout: 5000,
url: '/msg',
data: { 'room': 'test', 'content': content },
cache: false,
dataType: 'json',
success: postMessageWrapper,
error: onError
});
}
function initClient() {
showError("Initializing client " + Key);
refresh();
postMessageWrapper();
};