import { existsSync, readFileSync } from 'node:fs'; import { resolve, sep } from 'node:path'; const distDir = resolve('./dist'); const indexPath = resolve(distDir, 'index.html'); 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', }; function responseFromFile(filePath, headers) { try { return new Response(readFileSync(filePath), { headers }); } catch (error) { if (error?.code === 'ENOENT') { return new Response('Not Found', { status: 404 }); } console.error('File read error:', error); return new Response('Internal Server Error', { status: 500 }); } } function serveIndex() { return responseFromFile(indexPath, { 'Content-Type': contentTypes.html, 'Cache-Control': 'no-cache', }); } function serveFile(filePath, pathname) { const ext = filePath.split('.').pop() || ''; return responseFromFile(filePath, { 'Content-Type': contentTypes[ext] || 'application/octet-stream', 'Cache-Control': pathname.startsWith('/assets/') ? 'public, max-age=31536000, immutable' : 'no-cache', }); } Bun.serve({ port: 80, hostname: '0.0.0.0', 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}`); if (!insideDist) { return new Response('Forbidden', { status: 403 }); } if (pathname !== '/' && existsSync(filePath)) { return serveFile(filePath, pathname); } if (!pathname.includes('.') && existsSync(indexPath)) { return serveIndex(); } return new Response('Not Found', { status: 404 }); }, });