diff --git a/api/routes/sessions.ts b/api/routes/sessions.ts index 6291f1b..7cefb27 100644 --- a/api/routes/sessions.ts +++ b/api/routes/sessions.ts @@ -46,7 +46,18 @@ export function createSessionsRouter(db: SessionsDb): Router { const { events } = await parseSessionFile(session.jsonl_path) return res.json({ meta: session, events }) } catch (err) { - return res.status(500).json({ error: 'Failed to parse session', message: (err as Error).message }) + const e = err as NodeJS.ErrnoException + if (e.code === 'ENOENT') { + return res.status(410).json({ + error: 'Session file missing (stale index)', + session_id: parsed.data.id, + }) + } + const isProduction = process.env.NODE_ENV === 'production' + return res.status(500).json({ + error: 'Failed to parse session', + ...(isProduction ? {} : { message: e.message }), + }) } }) diff --git a/api/server.ts b/api/server.ts index 6c8c19b..c208986 100755 --- a/api/server.ts +++ b/api/server.ts @@ -140,6 +140,16 @@ app.use('/api/operations', operationsRouter) const sessionsDb = openSessionsDb(process.env.OBSERVABILIDADE_DB ?? DEFAULT_DB_PATH) app.use('/api/sessions', createSessionsRouter(sessionsDb)) +function closeSessionsDb(): void { + try { + sessionsDb.close() + } catch (err) { + console.error('[sessionsDb] erro ao fechar:', err) + } +} +process.on('SIGTERM', closeSessionsDb) +process.on('SIGINT', closeSessionsDb) + // Serve static files in production if (isProduction) { // __dirname is /app/api/dist, need to go up 2 levels to /app/dist