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