You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nostrweb/tools/serve.js

56 lines
1.7 KiB
JavaScript

import { createServer, request } from 'http'
import esbuild from 'esbuild';
import config from '../esbuildconf.js';
// from https://github.com/evanw/esbuild/issues/802
const clients = [];
config.options.banner = {
js: ' (() => new EventSource("/_live").onmessage = () => location.reload())();'
};
config.options.watch = {
onRebuild(err, res) {
if (err) {
console.log(err);
return;
}
clients.forEach((c) => c.write('data: update\n\n'));
const n = clients.length;
clients.length = 0;
console.log(`>>> sent reload msg to ${n} client(s)`);
}
};
esbuild.build(config.options).catch(() => process.exit(1));
const s = {
host: '127.0.0.1',
servedir: config.options.outdir,
onRequest: (req) => {
console.log(`${req.method} ${req.path} ${req.status} ${req.timeInMS}ms`);
}
};
esbuild.serve(s, {}).then(server => {
const {host, port} = server;
const livePort = port + 1;
console.log(`serving content from http://${host}:${port}/`);
console.log(`serving live reload at http://${host}:${livePort}/`);
createServer((req, resp) => {
const { url, method, headers } = req;
if (url === '/_live') {
clients.push(resp.writeHead(200, {
'content-type': 'text/event-stream',
'cache-control': 'no-cache',
'connection': 'keep-alive',
}));
console.log(`>>> client connected; total is now ${clients.length}`);
return;
}
const path = ~url.split('/').pop().indexOf('.') ? url : '/index.html';
const proxyReq = request({hostname: host, port: port, path, method, headers}, (proxyResp) => {
resp.writeHead(proxyResp.statusCode, proxyResp.headers);
proxyResp.pipe(resp, {end: true});
});
req.pipe(proxyReq, {end: true});
}).listen(livePort, host);
});