- Added rulesets manager to handle various data types and updates via HTTP and WebSocket. - Introduced layout store for managing kiosk layouts with caching and server synchronization. - Enhanced dashboard and data routes to support new layout and ruleset features. - Updated kiosk HTML and JavaScript to utilize new layout rendering and data binding. - Removed obsolete map route and integrated map functionality into the new tile renderer. - Improved Telegram commands to reflect changes in data structure and logging. - Refactored weather fetching intervals to prevent multiple instances. - Added SSE stream for real-time layout updates in the kiosk.
118 lines
2.6 KiB
JavaScript
118 lines
2.6 KiB
JavaScript
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
|
|
};
|