index.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Simple server-side event receiver (Node.js example)
  2. // Save as: server/index.js
  3. const express = require('express');
  4. const crypto = require('crypto');
  5. const app = express();
  6. app.use(express.json());
  7. // In-memory store (use Redis/DB in production)
  8. const events = [];
  9. const routers = new Map();
  10. // Authentication middleware
  11. function authenticate(req, res, next) {
  12. const token = req.headers.authorization?.replace('Bearer ', '');
  13. if (!token || token !== process.env.EVENT_TOKEN) {
  14. return res.status(401).json({ error: 'Unauthorized' });
  15. }
  16. next();
  17. }
  18. // Event endpoint
  19. app.post('/api/events', authenticate, (req, res) => {
  20. const event = {
  21. id: crypto.randomUUID(),
  22. ...req.body,
  23. received_at: new Date().toISOString()
  24. };
  25. // Store
  26. events.push(event);
  27. if (events.length > 10000) events.shift();
  28. // Track router
  29. routers.set(event.router_id, {
  30. last_seen: new Date(),
  31. last_event: event.event_type
  32. });
  33. // Log
  34. console.log(`[${event.router_id}] ${event.event_type}`, event.payload);
  35. // Emit real-time (WebSocket)
  36. // io.emit('event', event);
  37. res.json({ success: true, event_id: event.id });
  38. });
  39. // routers endpoint
  40. app.get('/api/routers', (req, res) => {
  41. const online = Array.from(routers.entries()).map(([id, data]) => ({
  42. id,
  43. ...data,
  44. online: (Date.now() - data.last_seen < 300000) // 5 min
  45. }));
  46. res.json({ routers: online });
  47. });
  48. // events endpoint
  49. app.get('/api/events', (req, res) => {
  50. const limit = parseInt(req.query.limit) || 100;
  51. const type = req.query.type;
  52. let filtered = events;
  53. if (type) filtered = events.filter(e => e.event_type === type);
  54. res.json({
  55. events: filtered.slice(-limit),
  56. total: filtered.length
  57. });
  58. });
  59. // Health check
  60. app.get('/health', (req, res) => {
  61. res.json({
  62. status: 'ok',
  63. events: events.length,
  64. routers: routers.size
  65. });
  66. });
  67. const PORT = process.env.PORT || 3000;
  68. app.listen(PORT, () => {
  69. console.log(`📡 Event server listening on port ${PORT}`);
  70. });