diff --git a/www/all.js b/www/all.js index cbe9c6c..216b98e 100644 --- a/www/all.js +++ b/www/all.js @@ -549,14 +549,51 @@ $( document ).ready(function() { break; } } - var source = new EventSource('stream.php?session='+session); - source.onmessage = function(event) { - var msg=JSON.parse(event.data); - var path=msg[0]; - var msg=msg[1]; - //if(path=="startup") postmsg('startup',1); - runmsg(path,msg); - } + var source = null; + var streamReconnectTimer = null; + var streamReconnectDelay = 1000; + + function scheduleStreamReconnect() { + if(streamReconnectTimer) return; + if(source) { + source.close(); + source = null; + } + streamReconnectTimer = setTimeout(function() { + streamReconnectTimer = null; + connectStream(); + }, streamReconnectDelay); + streamReconnectDelay = Math.min(streamReconnectDelay * 2, 30000); + } + + function connectStream() { + source = new EventSource('stream.php?session='+encodeURIComponent(session)+'&t='+(new Date()).getTime()); + source.onopen = function() { + streamReconnectDelay = 1000; + }; + source.onmessage = function(event) { + if(event.data == "closed") { + scheduleStreamReconnect(); + return; + } + var data; + try { + data=JSON.parse(event.data); + } catch(error) { + console.log("Invalid stream message", event.data, error); + return; + } + var path=data[0]; + var msg=data[1]; + //if(path=="startup") postmsg('startup',1); + runmsg(path,msg); + }; + source.onerror = function() { + scheduleStreamReconnect(); + }; + } + + connectStream(); $('#body').append($('