97 lines
2.8 KiB
TypeScript
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");
|
||
|
}
|