import { Hono } from 'hono'; import { serveStatic } from 'hono/bun'; import { cors } from 'hono/cors'; import { getDb, getConfig } from './db/index'; import setupRoutes from './api/setup'; import scanRoutes from './api/scan'; import reviewRoutes from './api/review'; import executeRoutes from './api/execute'; import nodesRoutes from './api/nodes'; import subtitlesRoutes from './api/subtitles'; import dashboardRoutes from './api/dashboard'; const app = new Hono(); // ─── CORS (dev: Vite on :5173 talks to Hono on :3000) ──────────────────────── app.use('/api/*', cors({ origin: ['http://localhost:5173', 'http://localhost:3000'] })); // ─── API routes ─────────────────────────────────────────────────────────────── app.route('/api/dashboard', dashboardRoutes); app.route('/api/setup', setupRoutes); app.route('/api/scan', scanRoutes); app.route('/api/review', reviewRoutes); app.route('/api/execute', executeRoutes); app.route('/api/subtitles', subtitlesRoutes); app.route('/api/nodes', nodesRoutes); // ─── Static assets (production: serve Vite build) ──────────────────────────── app.use('/assets/*', serveStatic({ root: './dist' })); app.use('/favicon.ico', serveStatic({ path: './dist/favicon.ico' })); // ─── SPA fallback ───────────────────────────────────────────────────────────── // All non-API routes serve the React index.html so TanStack Router handles them. app.get('*', (c) => { const accept = c.req.header('Accept') ?? ''; if (c.req.path.startsWith('/api/')) return c.notFound(); // In dev the Vite server handles the SPA. In production serve dist/index.html. try { const html = Bun.file('./dist/index.html').text(); return html.then((text) => c.html(text)); } catch { return c.text('Run `bun build` first to generate the frontend.', 503); } }); // ─── Start ──────────────────────────────────────────────────────────────────── const port = Number(process.env.PORT ?? '3000'); console.log(`netfelix-audio-fix API on http://localhost:${port}`); getDb(); export default { port, fetch: app.fetch, idleTimeout: 0, };