| import { existsSync } from 'node:fs'; |
| import { join, resolve } from 'node:path'; |
|
|
| const root = resolve(import.meta.dirname, '..'); |
| const distDir = join(root, 'dist'); |
| const port = Number(process.env.PORT || 7860); |
|
|
| if (!existsSync(join(distDir, 'index.html'))) { |
| const proc = Bun.spawnSync(['bun', 'run', 'build'], { |
| cwd: root, |
| stdout: 'inherit', |
| stderr: 'inherit', |
| env: process.env, |
| }); |
|
|
| if (proc.exitCode !== 0) { |
| process.exit(proc.exitCode ?? 1); |
| } |
| } |
|
|
| const mimeByExt = { |
| '.css': 'text/css; charset=utf-8', |
| '.html': 'text/html; charset=utf-8', |
| '.ico': 'image/x-icon', |
| '.js': 'text/javascript; charset=utf-8', |
| '.json': 'application/json; charset=utf-8', |
| '.map': 'application/json; charset=utf-8', |
| '.png': 'image/png', |
| '.svg': 'image/svg+xml', |
| '.webmanifest': 'application/manifest+json; charset=utf-8', |
| }; |
|
|
| function contentType(pathname) { |
| const dot = pathname.lastIndexOf('.'); |
| if (dot === -1) return 'application/octet-stream'; |
| return mimeByExt[pathname.slice(dot)] ?? 'application/octet-stream'; |
| } |
|
|
| function safePath(pathname) { |
| const decoded = decodeURIComponent(pathname.split('?')[0] || '/'); |
| const normalized = decoded === '/' ? '/index.html' : decoded; |
| return join(distDir, normalized.replace(/^\/+/, '')); |
| } |
|
|
| Bun.serve({ |
| hostname: '0.0.0.0', |
| port, |
| async fetch(request) { |
| const url = new URL(request.url); |
| const filePath = safePath(url.pathname); |
| const file = Bun.file(filePath); |
|
|
| if (await file.exists()) { |
| const isAsset = url.pathname.startsWith('/assets/'); |
| return new Response(file, { |
| headers: { |
| 'content-type': contentType(filePath), |
| 'cache-control': isAsset |
| ? 'public, max-age=31536000, immutable' |
| : 'no-cache', |
| }, |
| }); |
| } |
|
|
| const index = Bun.file(join(distDir, 'index.html')); |
| return new Response(index, { |
| headers: { |
| 'content-type': 'text/html; charset=utf-8', |
| 'cache-control': 'no-cache', |
| }, |
| }); |
| }, |
| }); |
|
|
| console.log(`CarboAny Space server listening on 0.0.0.0:${port}`); |
|
|