63 lines
1.5 KiB
JavaScript
63 lines
1.5 KiB
JavaScript
|
function Messaging(screen) {
|
||
|
var ws = new WebSocket('ws://' + window.location.hostname + '/play/');
|
||
|
var keepAlivePeriod = 20000;
|
||
|
var routes = {callbacks: [], children: {}};
|
||
|
|
||
|
return {
|
||
|
addEventListener: addEventListener,
|
||
|
send: send,
|
||
|
start: start
|
||
|
}
|
||
|
|
||
|
function get(obj, path, write) {
|
||
|
write = write || false;
|
||
|
if(path.length < 1) {
|
||
|
return obj;
|
||
|
} else {
|
||
|
if(obj.children[path[0]] == undefined && write) {
|
||
|
obj.children[path[0]] = {callbacks: [], children: {}};
|
||
|
}
|
||
|
if(obj.children[path[0]] != undefined) {
|
||
|
return get(obj.children[path[0]], path.slice(1), write);
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function addEventListener(path, callback) {
|
||
|
var route = get(routes, path, true);
|
||
|
route.callbacks.push(callback);
|
||
|
}
|
||
|
|
||
|
function messageListener(event) {
|
||
|
var o = JSON.parse(event.data);
|
||
|
var path = [];
|
||
|
var tmp = o;
|
||
|
while(tmp != undefined && tmp.tag != undefined) {
|
||
|
path.push(tmp.tag);
|
||
|
tmp = tmp.message;
|
||
|
}
|
||
|
var route = get(routes, path);
|
||
|
if(route != undefined && route.callbacks != undefined) {
|
||
|
route.callbacks.forEach(function(f) {f(o);});
|
||
|
} else {
|
||
|
debug.textContent = event.data;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function start() {
|
||
|
ping();
|
||
|
addEventListener(["Pong"], ping);
|
||
|
ws.addEventListener('message', messageListener);
|
||
|
}
|
||
|
|
||
|
function send(o) {
|
||
|
ws.send(JSON.stringify(o));
|
||
|
}
|
||
|
|
||
|
function ping() {
|
||
|
setTimeout(function() {send({tag: "Ping"});}, keepAlivePeriod);
|
||
|
}
|
||
|
}
|