fix: Geräte-Marker für Systeme ohne Statusdaten anzeigen (z. B. GMA)
- `createAndSetDevices.js` angepasst, sodass Marker auch ohne `statusDistrictData` erzeugt werden. - Problem behoben, dass Marker wie GMA trotz vorhandener Koordinaten und Sichtbarkeit nicht gezeichnet wurden. - Sicherheitsprüfung für Statusdaten optional gemacht, um Systems ohne Messdaten darzustellen.
This commit is contained in:
37
server.js
37
server.js
@@ -33,10 +33,15 @@ app.prepare().then(() => {
|
||||
|
||||
const io = new Server(server);
|
||||
|
||||
// ✅ Globaler Cache für alle aktuellen Daten
|
||||
const globalDataCache = new Map();
|
||||
|
||||
io.on("connection", socket => {
|
||||
const { m: idMap, u: idUser } = socket.handshake.query;
|
||||
console.log(`🔌 WebSocket verbunden (idMap=${idMap}, idUser=${idUser})`);
|
||||
|
||||
const cacheKey = `${idMap}_${idUser}`;
|
||||
|
||||
const endpoints = [
|
||||
{
|
||||
name: "GisLinesStatus",
|
||||
@@ -69,6 +74,22 @@ app.prepare().then(() => {
|
||||
|
||||
const lastDataMap = {};
|
||||
|
||||
// ✅ Funktion um sofort alle verfügbaren Daten zu senden (für Browser-Reload)
|
||||
const sendAllCurrentData = () => {
|
||||
const cachedData = globalDataCache.get(cacheKey);
|
||||
if (cachedData && Object.keys(cachedData).length > 0) {
|
||||
console.log(
|
||||
`📦 Sending all current data to client (${Object.keys(cachedData).length} endpoints)`
|
||||
);
|
||||
Object.entries(cachedData).forEach(([name, data]) => {
|
||||
socket.emit(`${name}Updated`, data);
|
||||
console.log(`🔄 Browser-Reload: ${name} data sent`);
|
||||
});
|
||||
} else {
|
||||
console.log(`📭 No cached data available for ${cacheKey}, will fetch fresh data`);
|
||||
}
|
||||
};
|
||||
|
||||
const fetchData = async () => {
|
||||
for (const { name, getUrl, mock } of endpoints) {
|
||||
try {
|
||||
@@ -99,6 +120,14 @@ app.prepare().then(() => {
|
||||
}
|
||||
|
||||
const newDataStr = JSON.stringify(statis);
|
||||
|
||||
// ✅ Cache aktualisieren
|
||||
if (!globalDataCache.has(cacheKey)) {
|
||||
globalDataCache.set(cacheKey, {});
|
||||
}
|
||||
globalDataCache.get(cacheKey)[name] = statis;
|
||||
|
||||
// ✅ Nur bei Änderungen senden (setInterval-Logik)
|
||||
if (newDataStr !== lastDataMap[name]) {
|
||||
lastDataMap[name] = newDataStr;
|
||||
socket.emit(`${name}Updated`, statis);
|
||||
@@ -113,9 +142,15 @@ app.prepare().then(() => {
|
||||
}
|
||||
};
|
||||
|
||||
// fetchData immer ausführen – unabhängig vom Modus
|
||||
// ✅ Beim Connect: Sofort alle aktuellen Daten senden (für Browser-Reload)
|
||||
sendAllCurrentData();
|
||||
|
||||
// ✅ Dann erste Datenabfrage durchführen
|
||||
fetchData();
|
||||
|
||||
// ✅ setInterval für regelmäßige Updates (nur bei Änderungen)
|
||||
const interval = setInterval(fetchData, 5000); // 5 Sekunden ,TALAS.web nutzt 12 Sekunden
|
||||
|
||||
socket.on("disconnect", () => {
|
||||
clearInterval(interval);
|
||||
console.log("❌ WebSocket getrennt");
|
||||
|
||||
Reference in New Issue
Block a user