logline output buffers rather than updating on every ws message

In builds with lots of output, trying to reload the page partway
through the build results in thousands of websocket messages (one
per line) that each update the DOM.  This can cause the browser to
freeze.  Instead, use requestAnimation frame to delay the DOM
updates.
This commit is contained in:
Michael Nutt 2014-03-01 19:51:14 -05:00
parent 77ff7971d3
commit 6e92e73a98

View file

@ -133,12 +133,35 @@
outputWS.onopen = function () { console.log('output websocket open'); }; outputWS.onopen = function () { console.log('output websocket open'); };
outputWS.onerror = function (e) { console.log('websocket error: ' + e); }; outputWS.onerror = function (e) { console.log('websocket error: ' + e); };
outputWS.onclose = function (e) { window.location.reload(); }; outputWS.onclose = function (e) { window.location.reload(); };
window.requestAnimationFrame = window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
function(callback, element) {
return window.setTimeout(function() {
callback(+new Date());
}, 1000 / 60);
};
var lineBuffer = "";
outputWS.onmessage = function (e) { outputWS.onmessage = function (e) {
outputBox.innerHTML += formatLine(e.data); lineBuffer += formatLine(e.data);
};
function updateScreen() {
if(lineBuffer.length > 0) {
outputBox.innerHTML += lineBuffer;
lineBuffer = '';
if (window.autofollow) { if (window.autofollow) {
window.scrollTo(0, document.body.scrollHeight); window.scrollTo(0, document.body.scrollHeight);
} }
}; }
requestAnimationFrame(updateScreen);
}
requestAnimationFrame(updateScreen);
{{ else }} {{ else }}
$.get("/{{ .Repo.Slug }}/commit/{{ .Commit.Hash }}/build/{{ .Build.Slug }}/out.txt", function( data ) { $.get("/{{ .Repo.Slug }}/commit/{{ .Commit.Hash }}/build/{{ .Build.Slug }}/out.txt", function( data ) {
$( "#stdout" ).html(formatLine(data)); $( "#stdout" ).html(formatLine(data));