From 18cc671e78bcf74545535ab2ab7e4dc0ef3b6b58 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 12 Jul 2023 12:18:00 +0200 Subject: [PATCH] Make serve-analysis.js support inline serving of the HTML. --- server/serve-analysis.js | 61 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/server/serve-analysis.js b/server/serve-analysis.js index 4c9a24e..0008cd7 100644 --- a/server/serve-analysis.js +++ b/server/serve-analysis.js @@ -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)) { -- 2.39.2