Implement Agent 6: Real-Time Updates feature for LocalGreenChain: - Add Socket.io server with room-based subscriptions - Create client-side hooks (useSocket, useLiveFeed, usePlantUpdates) - Add SocketProvider context for application-wide state - Implement UI components: - ConnectionStatus: Shows WebSocket connection state - LiveFeed: Real-time event feed display - NotificationToast: Toast notifications with auto-dismiss - LiveChart: Real-time data visualization - Add event type definitions and formatting utilities - Create socket API endpoint for WebSocket initialization - Add socket stats endpoint for monitoring - Extend tailwind with fadeIn/slideIn animations Integrates with existing EventStream SSE system for fallback.
63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
/**
|
|
* Socket.io Stats API Endpoint
|
|
*
|
|
* Returns statistics about the WebSocket server and connections.
|
|
*/
|
|
|
|
import type { NextApiRequest, NextApiResponse } from 'next';
|
|
import { getSocketServer } from '../../../lib/realtime/socketServer';
|
|
import { getEventStream } from '../../../lib/transparency/EventStream';
|
|
|
|
interface SocketStats {
|
|
server: {
|
|
connectedClients: number;
|
|
rooms: string[];
|
|
uptime: number;
|
|
};
|
|
events: {
|
|
totalEvents: number;
|
|
eventsLast24h: number;
|
|
eventsByType: Record<string, number>;
|
|
averageEventsPerMinute: number;
|
|
};
|
|
status: 'running' | 'stopped';
|
|
}
|
|
|
|
/**
|
|
* Get Socket.io server statistics
|
|
*/
|
|
export default function handler(
|
|
req: NextApiRequest,
|
|
res: NextApiResponse<SocketStats | { error: string }>
|
|
) {
|
|
if (req.method !== 'GET') {
|
|
res.status(405).json({ error: 'Method not allowed' });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const socketServer = getSocketServer();
|
|
const eventStream = getEventStream();
|
|
|
|
const serverStats = socketServer.getStats();
|
|
const eventStats = eventStream.getStats();
|
|
|
|
const stats: SocketStats = {
|
|
server: serverStats,
|
|
events: {
|
|
totalEvents: eventStats.totalEvents,
|
|
eventsLast24h: eventStats.eventsLast24h,
|
|
eventsByType: eventStats.eventsByType,
|
|
averageEventsPerMinute: eventStats.averageEventsPerMinute,
|
|
},
|
|
status: socketServer.getIO() ? 'running' : 'stopped',
|
|
};
|
|
|
|
res.status(200).json(stats);
|
|
} catch (error) {
|
|
console.error('[Socket Stats API] Error:', error);
|
|
res.status(500).json({
|
|
error: error instanceof Error ? error.message : 'Unknown error',
|
|
});
|
|
}
|
|
}
|