const os = require('os'); const auth = require('./auth'); const socket = require('./socket'); const configManager = require('../../config/configManager.js'); let reconnectTimer = null; let isShuttingDown = false; /** * Inizializza la connessione al server realtime. * Autentica il sensore e apre la connessione WebSocket. * In caso di disconnessione, tenta di riconnettersi. */ async function init() { isShuttingDown = false; await connectToServer(); } /** * Esegue il flusso di connessione: auth → websocket */ async function connectToServer() { if (isShuttingDown) return; console.log('[REALTIME] connecting...'); let result; try { result = await auth.authenticate(); } catch (err) { console.error('[REALTIME] auth error:', err.message); scheduleReconnect(); return; } if (!result) { scheduleReconnect(); return; } let connected = false; try { connected = await socket.connect(result.socketToken, () => { if (!isShuttingDown) { scheduleReconnect(); } }); } catch (err) { console.error('[REALTIME] socket connect error:', err.message); } if (!connected) { scheduleReconnect(); } } /** * Pianifica un tentativo di riconnessione dopo il ritardo configurato. */ function scheduleReconnect() { if (reconnectTimer || isShuttingDown) return; const RECONNECT_DELAY = configManager.getReconnectDelay(); console.log(`[REALTIME] riconnessione in ${RECONNECT_DELAY / 1000}s...`); reconnectTimer = setTimeout(async () => { reconnectTimer = null; await connectToServer(); }, RECONNECT_DELAY); } /** * Invia dati al server se la connessione è attiva. * @param {Array} data - Array nel formato [timestamp, measurement, fields] */ function send(data) { if (socket.isConnected()) { socket.send(data); } } /** * Invia un oggetto raw al server (senza trasformazione [ts, _m, fields]). * Usato per forecast_batch e altri messaggi con struttura custom. */ function sendRaw(obj) { if (socket.isConnected()) { socket.sendRaw(obj); } } /** * @returns {boolean} true se la connessione WebSocket è attiva */ function isConnected() { return socket.isConnected(); } /** * Ferma la connessione e i tentativi di riconnessione. */ function stop() { isShuttingDown = true; if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; } socket.close(); } module.exports = { init, send, sendIfConnected: send, sendRaw, isConnected, stop };