function Messaging(screen) { var ws = new WebSocket(window.location.origin.replace(/^http/, 'ws') + '/play/'); var debug = getParameters().debug; var doLog = debug != undefined && debug.match(/^(?:1|t(?:rue)?|v(?:rai)?)$/i); 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 getParameters() { var o = {}; window.location.search.substr(1).split('&').forEach(function(s) { var t = s.split('='); o[t[0]] = t[1]; }); return o; } 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; } o.direction = 'client < server'; log(o); }; function log(message) { if(doLog) { console.log(message); } } function start() { ws.addEventListener('message', messageListener); ws.addEventListener('open', ping); addEventListener(["Pong"], ping); } function send(o) { ws.send(JSON.stringify(o)); o.direction = 'client > server'; log(o); } function ping() { setTimeout(function() {send({tag: "Ping"});}, keepAlivePeriod); } }