Files
asepharyana-hub/infra/docker/react-server.js
T

78 lines
2.0 KiB
JavaScript
Raw Normal View History

import { existsSync, readFileSync } from 'node:fs';
import { resolve, sep } from 'node:path';
2026-07-09 22:08:26 +07:00
const distDir = resolve('./dist');
const indexPath = resolve(distDir, 'index.html');
2026-07-09 22:08:26 +07:00
const contentTypes = {
html: 'text/html; charset=utf-8',
css: 'text/css; charset=utf-8',
js: 'application/javascript; charset=utf-8',
json: 'application/json; charset=utf-8',
svg: 'image/svg+xml',
png: 'image/png',
jpg: 'image/jpeg',
jpeg: 'image/jpeg',
gif: 'image/gif',
webp: 'image/webp',
ico: 'image/x-icon',
woff: 'font/woff',
woff2: 'font/woff2',
ttf: 'font/ttf',
};
2026-07-09 22:08:26 +07:00
function responseFromFile(filePath, headers) {
try {
return new Response(readFileSync(filePath), { headers });
2026-07-09 22:08:26 +07:00
} catch (error) {
if (error?.code === 'ENOENT') {
return new Response('Not Found', { status: 404 });
2026-07-09 22:08:26 +07:00
}
console.error('File read error:', error);
return new Response('Internal Server Error', { status: 500 });
2026-07-09 22:08:26 +07:00
}
}
function serveIndex() {
return responseFromFile(indexPath, {
'Content-Type': contentTypes.html,
'Cache-Control': 'no-cache',
});
2026-07-09 22:08:26 +07:00
}
function serveFile(filePath, pathname) {
const ext = filePath.split('.').pop() || '';
2026-07-09 22:08:26 +07:00
return responseFromFile(filePath, {
'Content-Type': contentTypes[ext] || 'application/octet-stream',
'Cache-Control': pathname.startsWith('/assets/')
? 'public, max-age=31536000, immutable'
: 'no-cache',
});
2026-07-09 22:08:26 +07:00
}
Bun.serve({
port: 80,
hostname: '0.0.0.0',
2026-07-09 22:08:26 +07:00
fetch(req) {
const url = new URL(req.url);
const pathname = url.pathname;
const filePath = resolve(distDir, pathname.slice(1));
const insideDist = filePath === distDir || filePath.startsWith(`${distDir}${sep}`);
2026-07-09 22:08:26 +07:00
if (!insideDist) {
return new Response('Forbidden', { status: 403 });
2026-07-09 22:08:26 +07:00
}
if (pathname !== '/' && existsSync(filePath)) {
return serveFile(filePath, pathname);
2026-07-09 22:08:26 +07:00
}
if (!pathname.includes('.') && existsSync(indexPath)) {
return serveIndex();
2026-07-09 22:08:26 +07:00
}
return new Response('Not Found', { status: 404 });
2026-07-09 22:08:26 +07:00
},
});