From: Scott Worley Date: Fri, 3 Aug 2012 01:38:31 +0000 (-0700) Subject: Merge skitch's changes. X-Git-Url: http://git.scottworley.com/reliable-chat/commitdiff_plain/99c1f307f81cc3d92541e41bab1df1f79d83517e?hp=b22a2cedc1be7e6448f6168ce1256e87733573b4 Merge skitch's changes. Conflicts: webclient/rc.html --- diff --git a/server/server.go b/server/server.go index 5c5ef50..9ca5e61 100644 --- a/server/server.go +++ b/server/server.go @@ -11,6 +11,7 @@ import "time" var port = flag.Int("port", 21059, "Port to listen on") +var frame_count = expvar.NewInt("frame_count") var speak_count = expvar.NewInt("speak_count") var fetch_count = expvar.NewInt("fetch_count") var fetch_wait_count = expvar.NewInt("fetch_wait_count") @@ -160,6 +161,7 @@ func start_server(store Store) { return } w.Header().Add("Content-Type", "application/json") + w.Header().Add("Access-Control-Allow-Origin", "*") w.Write(json_encoded) }) @@ -171,6 +173,7 @@ func start_server(store Store) { }) http.HandleFunc("/frame", func(w http.ResponseWriter, r *http.Request) { + frame_count.Add(1) w.Write([]byte(frame_html)); }) @@ -178,6 +181,7 @@ func start_server(store Store) { } func main() { + flag.Parse() store := start_store() start_server(store) } diff --git a/webclient/rc.html b/webclient/rc.html index 9460159..b3109a9 100644 --- a/webclient/rc.html +++ b/webclient/rc.html @@ -63,6 +63,7 @@ var servers = ['chkno.net', 'rc2.chkno.net', 'echto.net', 'the-wes.com', 'vibrantlogic.com']; var session = Math.random(); + var since = {}; var seen = {}; function rcnick() { @@ -109,41 +110,53 @@ return id.replace(/@/g, "@@") + "_@_" + text.replace(/@/g, "@@"); } - function receiveMessage(server, time, id, text) { - var seen_key = make_seen_key(id, text); - if (!(seen_key in seen)) { - seen[seen_key] = true; - rcaddmessagetohistory(text); - for (var i in servers) { - rcchangeserverstatus(servers[i], "sad"); + function rcreceivemessages(server, messages) { + for (var i in messages) { + var seen_key = make_seen_key(messages[i]['ID'], messages[i]['Text']); + if (!(seen_key in seen)) { + seen[seen_key] = true; + rcaddmessagetohistory(messages[i]['Text']); + for (var i in servers) { + rcchangeserverstatus(servers[i], "sad"); + } } + rcchangeserverstatus(server, "happy"); } - rcchangeserverstatus(server, "happy"); } - function receiveMessageEvent(event) - { - for (var i in servers) { - if (event.origin === rcserverbase(servers[i])) { - messages = JSON.parse(event.data); - for (var j in messages) { - if ('Time' in messages[j] && - 'ID' in messages[j] && - 'Text' in messages[j]) { - receiveMessage(servers[i], messages[j]['Time'], messages[j]['ID'], messages[j]['Text']); + function rcfetch(server) { + var delay = 10000; // TODO: Exponential backoff + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { + if (this.readyState == this.DONE) { + if (this.status == 200) { + var rtxt = this.responseText; + if (rtxt != null) { + var messages = JSON.parse(rtxt); + if (messages != null) { + rcreceivemessages(server, messages); + window.parent.postMessage(rtxt, "*"); + delay = 40; + if (messages.length >= 1 && "Time" in messages[messages.length-1]) { + since[server] = messages[messages.length-1]["Time"]; + } + } } } + window.setTimeout(rcfetch, delay, server); } } + var uri = rcserverbase(server) + "/fetch"; + if (server in since) { + uri += '?since="' + since[server] + '"'; + } + xhr.open("GET", uri); + xhr.send(); } function rcconnect() { - window.addEventListener("message", receiveMessageEvent, false); for (var i in servers) { - // Create a hidden iframe for same-origin workaround - var iframe = document.createElement("iframe"); - iframe.setAttribute("src", rcserverbase(servers[i]) + "/frame"); - document.body.insertBefore(iframe, document.body.firstChild); + rcfetch(servers[i]); // Status bar entry var status_indicator = document.createElement("span"); status_indicator.appendChild(document.createTextNode(servers[i])); @@ -196,14 +209,14 @@ message = "<" + rcnick() + "> " + input; } + // Say the message + var d = rcaddmessagetohistory(message); + rcsend(d, message); + // Remind people to set their nick if (rcnick() == 'anonymous') { rcaddmessagetohistory("-!- Set your nick with /nick"); } - - // Say the message - var d = rcaddmessagetohistory(message); - rcsend(d, message); } } //-->