Files
CPLv4.0/utils/loadWindowVariables.js
ISA cbfd865323 feat: Optimized variable loading and storage in IndexedDB and localStorage
- Added parallel saving of required variables to both IndexedDB and localStorage using Promise.all for improved performance.
- Implemented a recursive check for missing variables with a retry mechanism for reliable loading.
- Enhanced error handling for script loading and storage processes.
- Streamlined loading scripts sequentially and storing in IndexedDB and localStorage upon successful loading.
2024-10-30 08:04:33 +01:00

150 lines
4.2 KiB
JavaScript

// utils/loadWindowVariables.js
export async function loadWindowVariables() {
return new Promise((resolve, reject) => {
const requiredVars = [
"last20Messages",
"deviceName",
"mac1",
"mac2",
"ip",
"subnet",
"gateway",
"datetime",
"de",
"counter",
"flutter",
"kueOnline",
"kueID",
"kueAlarm1",
"kueAlarm2",
"kueRes",
"kueCableBreak",
"kueGroundFault",
"kueLimit1",
"kueLimit2Low",
"kueDelay1",
"kueLoopInterval",
"kueVersion",
"tdrAtten",
"tdrPulse",
"tdrSpeed",
"tdrAmp",
"tdrTrigger",
"tdrLocation",
"tdrActive",
"kueOverflow",
"kueResidence",
"tdrLast",
"appVersion",
];
const loadScript = (src) => {
return new Promise((resolve, reject) => {
const script = document.createElement("script");
const environment = process.env.NEXT_PUBLIC_NODE_ENV || "production";
script.src =
environment === "production"
? `/CPL?/CPL/SERVICE/${src}`
: `/CPLmockData/SERVICE/${src}`;
script.async = true;
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
};
const saveToIndexedDB = async (key, value) => {
const request = indexedDB.open("CPLDatabase", 1);
request.onupgradeneeded = () => {
const db = request.result;
if (!db.objectStoreNames.contains("cplVariables")) {
db.createObjectStore("cplVariables");
}
};
return new Promise((resolve, reject) => {
request.onsuccess = () => {
const db = request.result;
const tx = db.transaction("cplVariables", "readwrite");
const store = tx.objectStore("cplVariables");
store.put(value, key);
tx.oncomplete = resolve;
tx.onerror = reject;
};
request.onerror = reject;
});
};
const saveVariables = async () => {
const savePromises = requiredVars.map(async (variable) => {
if (window[variable] !== undefined) {
localStorage.setItem(variable, window[variable]);
await saveToIndexedDB(variable, window[variable]);
}
});
await Promise.all(savePromises);
};
const scripts = ["de.js", "kueData.js", "Start.js", "System.js"];
// Lade die Skripte nacheinander
scripts
.reduce((promise, script) => {
return promise.then(() => loadScript(script));
}, Promise.resolve())
.then(async () => {
const checkVariables = () => {
const missingVars = requiredVars.filter(
(variable) => window[variable] === undefined
);
return missingVars;
};
const initialMissingVars = checkVariables();
if (initialMissingVars.length === 0) {
console.log("Alle Variablen von CPL geladen.");
await saveVariables();
resolve();
} else {
console.log(
"Noch fehlende Variablen beim ersten Aufruf:",
initialMissingVars
);
const maxChecks = 10;
let checkCount = 0;
const checkInterval = setInterval(async () => {
const remainingMissingVars = checkVariables();
if (remainingMissingVars.length === 0) {
clearInterval(checkInterval);
console.log("Alle fehlenden Systemvariablen sind jetzt geladen.");
await saveVariables();
resolve();
} else if (checkCount >= maxChecks) {
clearInterval(checkInterval);
console.warn(
"Einige Variablen wurden nicht geladen:",
remainingMissingVars
);
reject(
new Error(
"Einige Variablen fehlen nach wiederholten Versuchen."
)
);
} else {
console.log("Noch fehlende Variablen:", remainingMissingVars);
}
checkCount++;
}, 10000); // Überprüfung alle 10 Sekunden
}
})
.catch((error) => {
console.error("Fehler beim Laden eines Skripts:", error);
reject(error);
});
});
}