const express = require('express'); const axios = require('axios'); const NodeCache = require('node-cache'); const http = require('http'); const socketIo = require('socket.io'); const app = express(); const PORT = process.env.PORT || 80; const stopCache = new NodeCache({ stdTTL: 86400 }); // 1 day // Create HTTP server and attach Socket.IO const server = http.createServer(app); const io = socketIo(server); async function fetchStops() { try { const { data } = await axios.get('https://elron.ee/stops_data.json'); stopCache.set('stops', data.data || []); } catch (err) { console.error('Error fetching stops:', err); } } fetchStops(); setInterval(fetchStops, 86400 * 1000); // Serve static files app.use(express.static('public')); app.get('/api/trip/:id', async (req, res) => { const tripId = req.params.id; const response = await fetch(`https://elron.ee/live-map/trip/${tripId}`, { headers: { 'Accept': 'application/json' } }); const data = await response.text(); // if response is not pure JSON res.set('Access-Control-Allow-Origin', '*'); res.send(data); }); // Socket.IO connection io.on('connection', (socket) => { console.log('New client connected'); // Emit stops data to the client socket.emit('stops', stopCache.get('stops') || []); // Emit vehicles data to the client every 2 seconds const vehicleInterval = setInterval(async () => { const vehicles = await fetchVehicles(); socket.emit('vehicles', vehicles); }, 2000); socket.on('disconnect', () => { console.log('Client disconnected'); clearInterval(vehicleInterval); }); }); // Fetch vehicles function async function fetchVehicles() { try { const { data } = await axios.get('https://elron.ee/map_data.json'); return data.data || []; } catch (err) { console.error('Error fetching vehicle data:', err); return []; } } // Start the server server.listen(PORT, () => console.log(`Server running on ${PORT}`));