// server.js const http = require('http'); const express = require('express'); const { createClient } = require('redis'); const { Server } = require('socket.io'); const fetch = require('node-fetch'); // npm i node-fetch@2 const app = express(); const server = http.createServer(app); const io = new Server(server); // ---------- Socket.io ---------- io.on('connection', async socket => { console.log('client connected:', socket.id); // Call the external API every time a client connects try { const resp = await fetch('http://192.168.37.1:5000/start_timer', { method: 'GET' }); const data = await resp.json(); console.log('API responded to connect:', data); } catch (err) { console.error('Failed to hit start_timer endpoint:', err); } // Listen for tableRendered event from the client socket.on('tableRendered', async () => { console.log('Client reported table rendered - starting timer'); try { const resp = await fetch('http://192.168.37.1:5000/start_timer', { method: 'GET' }); const text = await resp.text(); console.log('Timer endpoint responded:', text); } catch (err) { console.error('Failed to hit start_timer:', err); } }); }); // Serve static files (index.html, etc.) app.use(express.static('public')); // ---------- Redis subscriber ---------- const redisClient = createClient({ url: 'redis://192.168.37.1:6379' }); redisClient.on('error', err => console.error('Redis error', err)); (async () => { await redisClient.connect(); const sub = redisClient.duplicate(); // duplicate to keep separate pub/sub await sub.connect(); // Subscribe to the channel that sends host stats await sub.subscribe( ['host_metrics'], (message, channel) => { let payload; try { payload = JSON.parse(message); // message is a JSON string } catch (e) { console.error(`Failed to parse ${channel}`, e); return; } io.emit(channel, payload); } ); sub.on('error', err => console.error('Subscriber error', err)); })(); // ---------- Start ---------- const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`Server listening on http://localhost:${PORT}`); });