<!doctype html>
<html>
<head>
<title>EventSource Loader Buffering</title>
<script>
window.onload = function () {
    setTimeout(test_es, 500);
};

function test_es() {
    var len = 0;
    var count = 0;
    var step = 1000;
    var es = new EventSource("eventsource-loader-buffering.php");
    es.onopen = function () {
        log("got 'open' event");
        log("waiting for the first " + step + " 'message' events");
    };
    es.onmessage = function (evt) {
        len += evt.data.length;
        if (++count % step)
            return;
        log("got " + count + " 'message' events (" + len + " characters)", 1);
        if (len >= 1e9)
            end();
    };
    es.onerror = function () {
        log("got 'error' event");
        end();
    };
    function end() {
        if (es.readyState != es.CLOSED)
            es.close();
        log("ENDED");
    };
}

function log(message, updateLast) {
    if (!log.list)
        log.list = document.getElementById("log");
    var text = document.createTextNode(message);
    if (updateLast)
        log.list.lastChild.replaceChild(text, log.list.lastChild.firstChild);
    else
        log.list.appendChild(document.createElement("li")).appendChild(text);
}
</script>
</head>
<body>
<p>Manual test to verify that the EventSource loader does not buffer data (may result in memory growth with long lived connections). Monitor memory usage; it should be stable. This file has to be served from the same web server as the php script with the same name.</p>
<ul id="log" style="list-style-type: none"></ul>
</body>
</html>

