Web Dev Solutions

Catalin Mititiuc

aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCatalin Mititiuc <webdevcat@proton.me>2024-05-27 15:29:32 -0700
committerCatalin Mititiuc <webdevcat@proton.me>2024-05-27 15:29:32 -0700
commite6fb0354e01ce31931392106b4e360cbc9cb5894 (patch)
tree5ebca1a56b05dfc7d7e232fb0388737841da8945 /esbuild-server.mjs
parent693d0c05017d14c82dd292fde37c00e84822a616 (diff)
WIP: add mimetypes to response headers
Diffstat (limited to 'esbuild-server.mjs')
-rw-r--r--esbuild-server.mjs80
1 files changed, 61 insertions, 19 deletions
diff --git a/esbuild-server.mjs b/esbuild-server.mjs
index 73fabab..72ab68b 100644
--- a/esbuild-server.mjs
+++ b/esbuild-server.mjs
@@ -1,6 +1,7 @@
import * as esbuild from 'esbuild';
import * as fs from 'node:fs';
import http from 'node:http';
+import path from 'node:path';
const colors = {
reset: '\x1b[0m',
@@ -18,29 +19,32 @@ const svgUseCacheBust = {
name: 'svgUseCacheBust',
setup(build) {
build.onStart(() => {
- const version = Date.now();
- console.log(`Adding cache buster ${version}`);
- const file = fs.readFileSync('./src/scenario-side_show.svg', { encoding: 'utf-8' });
- const newFile = file.replaceAll('%%VERSION%%', version);
- fs.writeFileSync('./public/assets/images/scenario-side_show.svg', newFile);
- const files = fs.readdirSync('./public/assets/images').filter(fn => regex.test(fn));
- files.forEach(fn => fs.unlinkSync(`./public/assets/images/${fn}`));
- fs.copyFileSync('./public/assets/images/mapsheets.svg', `./public/assets/images/mapsheets.${version}.svg`);
+ console.log("BUILD START");
+
+ // const version = Date.now();
+ // const file = fs.readFileSync('./src/scenario-side_show.svg', { encoding: 'utf-8' });
+ // const newFile = file.replaceAll('%%VERSION%%', version);
+ // fs.writeFileSync('./public/assets/images/scenario-side_show.svg', newFile);
+ // const files = fs.readdirSync('./public/assets/images').filter(fn => regex.test(fn));
+ // files.forEach(fn => fs.unlinkSync(`./public/assets/images/${fn}`));
+ // fs.copyFileSync('./public/assets/images/mapsheets.svg', `./public/assets/images/mapsheets.${version}.svg`);
})
}
-}
+};
+
+const paths = ['/esbuild', '/index.js', '/map.js', '/soldier_record_block.js'];
const ctx = await esbuild.context({
entryPoints: ['src/*.js'],
bundle: true,
- outdir: 'public',
+ outdir: 'build',
plugins: [svgUseCacheBust],
});
await ctx.watch();
const { host, port } = await ctx.serve({
- servedir: 'public',
+ servedir: 'build',
port: 3000,
onRequest: function({ remoteAddress, method, path, status, timeInMS }) {
let statusColor = colors.red;
@@ -64,15 +68,53 @@ http.createServer((req, res) => {
headers: req.headers,
}
- const proxyReq = http.request(options, proxyRes => {
- for (const k in proxyRes.headers) {
- res.setHeader(k, proxyRes.headers[k]);
- }
+ if (paths.includes(req.url)) {
+ const proxyReq = http.request(options, proxyRes => {
+ for (const k in proxyRes.headers) {
+ res.setHeader(k, proxyRes.headers[k]);
+ }
+
+ res.writeHead(proxyRes.statusCode, { 'Cache-Control': 'no-cache, no-store, must-revalidate' });
+
+ proxyRes.pipe(res, { end: true });
+ })
+
+ return req.pipe(proxyReq, { end: true });
+ }
+
+ console.log(host, port, req.method, req.url, res.statusCode);
+
+ const serverUrl = `http://localhost:${port}`;
+ const url = new URL(`${serverUrl}${req.url}`);
+ const dir = 'public';
+
+ const filePath = path.normalize(
+ path.join(dir, url.pathname === '/' ? 'index.html' : url.pathname)
+ );
- res.writeHead(proxyRes.statusCode, { 'Cache-Control': 'no-cache, no-store, must-revalidate' });
+ for (const k in res.headers) {
+ res.setHeader(k, res.headers[k]);
+ }
+
+ let contentType;
+
+ if (req.url.endsWith('.svg')) {
+ contentType = 'image/svg+xml';
+ } else if (req.url.endsWith('.png')) {
+ contentType = 'image/png';
+ } else if (req.url.endsWith('.jpg')) {
+ contentType = 'image/jpeg';
+ } else if (req.url.endsWith('.css')) {
+ contentType = 'text/css';
+ } else {
+ contentType = 'text/html';
+ }
- proxyRes.pipe(res, { end: true });
- })
+ res.writeHead(res.statusCode, {
+ 'Cache-Control': 'no-cache, no-store, must-revalidate',
+ 'Content-Type': contentType
+ });
- req.pipe(proxyReq, { end: true });
+ const readStream = fs.createReadStream(filePath, { autoClose: true });
+ readStream.pipe(res, { end: true });
}).listen(8080);