TeaSpeak-Client/modules/core/ui-loader/Cache.ts

97 lines
2.8 KiB
TypeScript

import * as path from "path";
import * as fs from "fs-extra";
import * as electron from "electron";
import validateCacheFile from "./CacheFile.validator";
import CacheFile, {UIPackInfo} from "./CacheFile";
let localUiCacheInstance: CacheFile;
async function doLoad() {
const file = path.join(uiCachePath(), "data.json");
if(!(await fs.pathExists(file))) {
console.debug("Missing UI cache file. Creating a new one.");
/* we've no cache */
return;
}
const anyData = await fs.readJSON(file);
try {
if(anyData["version"] !== 3) {
throw "unsupported version " + anyData["version"];
}
localUiCacheInstance = validateCacheFile(anyData);
} catch (error) {
if(error?.message?.startsWith("CacheFile")) {
/* We have no need to fully print the read data */
error = "\n- " + error.message.split("\n")[0].split(", ").join("\n- ");
} else if(error?.message) {
error = error.message;
} else if(typeof error !== "string") {
console.error(error);
}
console.warn("Current Ui cache file seems to be invalid. Renaming it and creating a new one: %s", error);
try {
await fs.rename(file, path.join(uiCachePath(), "data.json." + Date.now()));
} catch (error) {
console.warn("Failed to invalidate old ui cache file: %o", error);
}
}
}
/**
* Will not throw or return undefined!
*/
export async function loadLocalUiCache() {
if(localUiCacheInstance) {
throw "ui cache has already been loaded";
}
try {
await doLoad();
} catch (error) {
console.warn("Failed to load UI cache file: %o. This will cause loss of the file content.", error);
}
if(!localUiCacheInstance) {
localUiCacheInstance = {
version: 3,
cachedPacks: []
}
}
}
export function localUiCache() : CacheFile {
if(typeof localUiCacheInstance !== "object") {
throw "missing local ui cache";
}
return localUiCacheInstance;
}
/**
* Will not throw anything
*/
export async function saveLocalUiCache() {
const file = path.join(uiCachePath(), "data.json");
try {
if(!(await fs.pathExists(path.dirname(file)))) {
await fs.mkdirs(path.dirname(file));
}
await fs.writeJson(file, localUiCacheInstance);
} catch (error) {
console.error("Failed to save UI cache file. This will may cause some data loss: %o", error);
}
}
export function uiCachePath() {
return path.join(electron.app.getPath('userData'), "cache", "ui");
}
export function uiPackCachePath(version: UIPackInfo) : string {
return path.join(uiCachePath(), version.channel + "_" + version.versions_hash + "_" + version.timestamp + ".tar.gz");
}