function Messaging() { var ws = new WebSocket('ws://' + window.location.hostname + '/play/'); var keepAlivePeriod = 20000; var receiveHook; var queue = [] ws.addEventListener('message', messageListener); return { receive: receive, send: send } function messageListener(event) { var o = JSON.parse(event.data); if(o.tag == "Error") { console.log(o.error); } else { if(receiveHook != undefined) { receiveHook(o); } else { queue.push(o); } } }; function receive(predicate) { predicate = predicate || function() {return true;}; return function(f) { for(var i = 0; i < queue.length; i++) { if(predicate(queue[i])) { return f(queue.splice(i, 1)[0]); } } receiveHook = function(message) { if(predicate(message)) { receiveHook = null; f(message); } else { queue.push(o); } } }; } function send(o) { ws.send(JSON.stringify(o)); } function ping() { setTimeout(function() {send({tag: "Ping"});}, keepAlivePeriod); } }