/** Handle connections */ var Conn = (function() { var ws; var heartbeatTout; var pingIv; var xoff = false; var autoXoffTout; function onOpen(evt) { console.log("CONNECTED"); } function onClose(evt) { console.warn("SOCKET CLOSED, code "+evt.code+". Reconnecting..."); setTimeout(function() { init(); }, 200); // this happens when the buffer gets fucked up via invalid unicode. // we basically use polling instead of socket then } function onMessage(evt) { try { // . = heartbeat switch (evt.data.charAt(0)) { case 'B': case 'T': case 'S': Screen.load(evt.data); break; case '-': //console.log('xoff'); xoff = true; autoXoffTout = setTimeout(function(){xoff=false;}, 250); break; case '+': //console.log('xon'); xoff = false; clearTimeout(autoXoffTout); break; } heartbeat(); } catch(e) { console.error(e); } } function canSend() { return !xoff; } function doSend(message) { if (_demo) { console.log("TX: ", message); return true; // Simulate success } if (xoff) { // TODO queue console.log("Can't send, flood control."); return false; } if (!ws) return false; // for dry testing if (ws.readyState != 1) { console.error("Socket not ready"); return false; } if (typeof message != "string") { message = JSON.stringify(message); } ws.send(message); return true; } function init() { if (_demo) { console.log("Demo mode!"); Screen.load(_demo_screen); showPage(); return; } heartbeat(); ws = new WebSocket("ws://"+_root+"/term/update.ws"); ws.onopen = onOpen; ws.onclose = onClose; ws.onmessage = onMessage; console.log("Opening socket."); // Ask for initial data $.get('http://'+_root+'/term/init', function(resp, status) { if (status !== 200) location.reload(true); console.log("Data received!"); Screen.load(resp); heartbeat(); showPage(); }); } function heartbeat() { clearTimeout(heartbeatTout); heartbeatTout = setTimeout(heartbeatFail, 2000); } function heartbeatFail() { console.error("Heartbeat lost, probing server..."); pingIv = setInterval(function() { console.log("> ping"); $.get('http://'+_root+'/system/ping', function(resp, status) { if (status == 200) { clearInterval(pingIv); console.info("Server ready, reloading page..."); location.reload(); } }, { timeout: 100, }); }, 500); } return { ws: null, init: init, send: doSend, canSend: canSend, // check flood control }; })();