]> git.sesse.net Git - remoteglot/commitdiff
Make serve-analysis.js support inline serving of the HTML.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 12 Jul 2023 10:18:00 +0000 (12:18 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 12 Jul 2023 10:18:00 +0000 (12:18 +0200)
server/serve-analysis.js

index 4c9a24e9a2abf922e59a273c425a9f5cb3d32337..0008cd78fdcac69c2c84a48133e41ac899c118a6 100644 (file)
@@ -23,9 +23,11 @@ var json_filename = '/srv/analysis.sesse.net/www/analysis.json';
 if (process.argv.length >= 3) {
        json_filename = process.argv[2];
 }
+var html_filename = '/srv/analysis.sesse.net/www/index.html';
 
 // Expected destination filenames.
 var serve_url = '/analysis.pl';
+var html_serve_url = '/index-inline.html';
 var hash_serve_url = '/hash';
 if (process.argv.length >= 4) {
        serve_url = process.argv[3];
@@ -53,6 +55,7 @@ var json_lock = 0;
 
 // The current contents of the file to hand out, and its last modified time.
 var json = undefined;
+var html = undefined;
 
 // The last five timestamps, and diffs from them to the latest version.
 var historic_json = [];
@@ -192,6 +195,33 @@ var reread_file = function(event, filename) {
        console.log("Rereading " + json_filename);
        read_entire_file(json_filename, function(new_json_contents, mtime) {
                replace_json(new_json_contents, mtime);
+
+               // The HTML can go async, it's not too hopeless if it's out of date by a few milliseconds
+               read_entire_file(html_filename, function(new_html_contents, html_mtime) {
+                       var json_headers = {
+                               'X-RGLM': mtime,
+                               'X-RGNV': count_viewers(),  // May be slightly out of date.
+                       };
+                       if (MINIMUM_VERSION) {
+                               json_headers['X-RGMV'] = MINIMUM_VERSION;
+                       }
+                       let inline_json = {
+                               'data': JSON.parse(new_json_contents),
+                               'headers': json_headers,
+                       };
+                       delete inline_json['data']['internal'];
+
+                       new_html_contents = new_html_contents.replace(
+                               '/*REPLACE:inlinejson*/',
+                               'window.inline_json=' + JSON.stringify(inline_json) + ';');
+                       zlib.gzip(new_html_contents, function(err, buffer) {
+                               if (err) throw err;
+                               html = {
+                                       plain: new_html_contents,
+                                       gzip: buffer,
+                               };
+                       });
+               });
        });
 
        if (touch_timer !== undefined) {
@@ -248,6 +278,24 @@ var send_json = function(response, ims, accept_gzip, num_viewers) {
        }
        response.end();
 }
+var send_html = function(response, accept_gzip, num_viewers) {
+       var headers = {
+               'Content-type': 'text/html; charset=utf-8',
+               'Vary': 'Accept-Encoding',
+       };
+
+       if (accept_gzip) {
+               headers['Content-Length'] = html.gzip.length;
+               headers['Content-Encoding'] = 'gzip';
+               response.writeHead(200, headers);
+               response.write(html.gzip);
+       } else {
+               headers['Content-Length'] = html.plain.length;
+               response.writeHead(200, headers);
+               response.write(html.plain);
+       }
+       response.end();
+}
 var mark_recently_seen = function(unique) {
        if (unique) {
                last_seen_clients[unique] = (new Date).getTime();
@@ -294,7 +342,7 @@ if (COUNT_FROM_VARNISH_LOG) {
        // Note: We abuse serve_url as a regex.
        var varnishncsa = child_process.spawn(
                'varnishncsa', ['-F', '%{%s}t %U %q tffb=%{Varnish:time_firstbyte}x',
-               '-q', 'ReqURL ~ "^' + serve_url + '"']);
+               '-q', 'ReqURL ~ "^(' + serve_url + '|' + html_serve_url + ')"']);
        var rl = readline.createInterface({
                input: varnishncsa.stdout,
                output: varnishncsa.stdin,
@@ -365,17 +413,22 @@ server.on('request', function(request, response) {
                hash_lookup.handle_request(fen, response);
                return;
        }
-       if (u.pathname !== serve_url) {
+       if (u.pathname !== serve_url && u.pathname !== html_serve_url) {
                // This is not the request you are looking for.
                send_404(response);
                return;
        }
 
-       mark_recently_seen(unique);
-
        var accept_encoding = request.headers['accept-encoding'];
        let accept_gzip = (accept_encoding !== undefined && accept_encoding.match(/\bgzip\b/));
 
+       if (u.pathname === html_serve_url) {
+               send_html(response, accept_gzip, count_viewers());
+               return;
+       }
+
+       mark_recently_seen(unique);
+
        // If we already have something newer than what the user has,
        // just send it out and be done with it.
        if (json !== undefined && (!ims || json.last_modified > ims)) {