const PUBLIC_DIR = './public' const PORT = process.env.PORT ? Number(process.env.PORT) : 3000 function getContentType(path) { if (path.endsWith('.html')) return 'text/html' if (path.endsWith('.js')) return 'application/javascript' if (path.endsWith('.css')) return 'text/css' if (path.endsWith('.json')) return 'application/json' if (path.endsWith('.png')) return 'image/png' if (path.endsWith('.jpg') || path.endsWith('.jpeg')) return 'image/jpeg' if (path.endsWith('.svg')) return 'image/svg+xml' if (path.endsWith('.woff2')) return 'font/woff2' if (path.endsWith('.woff')) return 'font/woff' if (path.endsWith('.ttf')) return 'font/ttf' return 'application/octet-stream' } Bun.serve({ port: PORT, async fetch(req) { const url = new URL(req.url) if (url.pathname === '/health') { return new Response('OK', { status: 200 }) } const filePath = url.pathname === '/' ? '/index.html' : url.pathname const fullPath = `${PUBLIC_DIR}${filePath}` const file = Bun.file(fullPath) if (await file.exists()) { return new Response(file, { headers: { 'Content-Type': getContentType(filePath) }, }) } // SPA fallback const indexFile = Bun.file(`${PUBLIC_DIR}/index.html`) if (await indexFile.exists()) { return new Response(indexFile, { headers: { 'Content-Type': 'text/html' }, }) } return new Response('Not Found', { status: 404 }) }, }) console.log(`Server running on http://localhost:${PORT}`)