- 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.
150 lines
4.2 KiB
JavaScript
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);
|
|
});
|
|
});
|
|
}
|