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(); };