cui-server
Version:
Web UI Agent Platform based on Claude Code
65 lines • 2.37 kB
JavaScript
import { Router } from 'express';
import { logStreamBuffer } from '../services/log-stream-buffer.js';
import { createLogger } from '../services/logger.js';
export function createLogRoutes() {
const router = Router();
const logger = createLogger('LogRoutes');
// Get recent logs
router.get('/recent', (req, res) => {
const requestId = req.requestId;
const limit = req.query.limit !== undefined ? req.query.limit : 100;
logger.debug('Get recent logs request', {
requestId,
limit
});
try {
const logs = logStreamBuffer.getRecentLogs(limit);
res.json({ logs });
}
catch (error) {
logger.error('Failed to get recent logs', error, { requestId });
res.status(500).json({ error: 'Failed to retrieve logs' });
}
});
// Stream logs via SSE
router.get('/stream', (req, res) => {
const requestId = req.requestId;
logger.debug('Log stream connection request', {
requestId,
headers: {
'accept': req.headers.accept,
'user-agent': req.headers['user-agent']
}
});
// Set SSE headers
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'X-Accel-Buffering': 'no' // Disable proxy buffering
});
// Send initial connection confirmation
res.write('data: {"type":"connected"}\n\n');
// Create log listener
const logListener = (logLine) => {
res.write(`data: ${logLine}\n\n`);
};
// Subscribe to log events
logStreamBuffer.on('log', logListener);
// Handle client disconnect
req.on('close', () => {
logger.debug('Log stream connection closed', { requestId });
logStreamBuffer.removeListener('log', logListener);
});
// Send heartbeat every 30 seconds to keep connection alive
const heartbeat = setInterval(() => {
res.write(':heartbeat\n\n');
}, 30000);
// Clean up heartbeat on disconnect
req.on('close', () => {
clearInterval(heartbeat);
});
});
return router;
}
//# sourceMappingURL=log.routes.js.map