import { Hono } from 'hono' import { cors } from 'hono/cors' import { logger } from 'hono/logger' import { botsRouter } from './routes/bots.js' import { fightsRouter } from './routes/fights.js' import { queueRouter } from './routes/queue.js' import { authRouter } from './routes/auth.js' import { docsRouter } from './routes/docs.js' import { rateLimit } from './middleware/rate-limit.js' import { cleanupOrphanedFights } from './engine/orchestrator.js' export const app = new Hono() app.onError((err, c) => { console.error('[botfights] ERROR:', err.message, err.stack) return c.json({ error: err.message }, 500) }) app.use('*', logger()) app.use('/api/*', cors({ origin: '*' })) // Rate limit all POST endpoints (60/min per IP) app.use('/api/*', rateLimit(60_000, 60)) app.get('/api/health', (c) => c.json({ status: 'ok', name: 'botfights' })) app.route('/api/auth', authRouter) app.route('/api/bots', botsRouter) app.route('/api/fights', fightsRouter) app.route('/api/queue', queueRouter) app.route('/api/docs', docsRouter) // Cleanup orphaned fights on startup cleanupOrphanedFights().then(() => { console.log('[botfights] orphaned fights cleaned up') }).catch(err => { console.error('[botfights] cleanup error:', err) })