<!DOCTYPE html>
<html lang="en">
  <head>
    <title>example</title>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <style>
      #container { margin-right: auto; margin-left: auto; max-width: 480px; }
      #info { background: #e0f0f0; border-radius: .5em; padding: 2em;  }
      #static, #live { background: #f0f0f0; border-radius: .5em; padding: 0.5em; max-height: 10em; overflow: auto; height: 100%; }
      #wrapper { display: flex; justify-content: flex-evenly; margin-top: 1em; }
    </style>
  </head>
  <body>
    <div id="container">
      <div id="info">
        A div below shows file log.txt, which is produced by the server.
        The server appends a new log message to that file every second,
        and a div below also shows that, implementing a "live log" feature.
        JS code on this page first fetches /api/log/static that returns
        log.txt contents, then fetches /api/log/live that does not return,
        but feeds chunks of data as they arrive (live log).
        <br/><br/>
        You can also use <code>curl</code> command-line utility to see
        live logs:
        <br/><code>curl localhost:8000/api/log/live</code>
      </div>
      <div id="wrapper">
        <div style="width: 50%"><b>Static</b><pre id="static"></pre></div>
        <div style="width: 1em;"></div>
        <div style="width: 50%"><b>Live</b><pre id="live"></pre></div>
      </div>
    </div>
  </body>
  <script>
    var f = function(r) {
      return r.read().then(function(result) {
        var data = String.fromCharCode.apply(null, result.value);
        document.getElementById('live').innerText += data;  // Append live log
        if (!result.done) f(r);  // Read next chunk
      });
    };
    window.onload = ev => fetch('/api/log/static')
      .then(r => r.text())
      .then(r => { document.getElementById('static').innerText = r; })
      .then(r => fetch('/api/log/live'))
      .then(r => r.body.getReader())
      .then(f);
  </script>
</html>