client/src/js/messaging.js

53 lines
1021 B
JavaScript

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