diff --git a/src/lib/UI/ModelList.svelte b/src/lib/UI/ModelList.svelte index 9feecb1a..cf290ca7 100644 --- a/src/lib/UI/ModelList.svelte +++ b/src/lib/UI/ModelList.svelte @@ -63,10 +63,11 @@ - - + + + @@ -80,6 +81,7 @@ {#if isTauri ||isNodeServer} + {/if} {#await getHordeModels()} diff --git a/src/ts/drive/drive.ts b/src/ts/drive/drive.ts index e1278d7a..88ce9f33 100644 --- a/src/ts/drive/drive.ts +++ b/src/ts/drive/drive.ts @@ -2,7 +2,6 @@ import { get } from "svelte/store"; import { alertError, alertInput, alertNormal, alertSelect, alertStore } from "../alert"; import { DataBase, setDatabase, type Database } from "../storage/database"; import { forageStorage, getUnpargeables, isNodeServer, isTauri, openURL } from "../storage/globalApi"; -import pako from "pako"; import { BaseDirectory, exists, readBinaryFile, readDir, writeBinaryFile } from "@tauri-apps/api/fs"; import { language } from "../../lang"; import { relaunch } from '@tauri-apps/api/process'; @@ -10,6 +9,7 @@ import { open } from '@tauri-apps/api/shell'; import { cloneDeep, isEqual, last } from "lodash"; import { sleep } from "../util"; import { hubURL } from "../characterCards"; +import { decodeRisuSave, encodeRisuSave } from "../storage/risuSave"; export async function checkDriver(type:'save'|'load'|'loadtauri'|'savetauri'|'reftoken'){ const CLIENT_ID = '580075990041-l26k2d3c0nemmqiu3d3aag01npfrkn76.apps.googleusercontent.com'; @@ -245,10 +245,7 @@ async function backupDrive(ACCESS_TOKEN:string) { } } - const dbjson = JSON.stringify(get(DataBase)) - const dbData = pako.deflate( - Buffer.from(dbjson, 'utf-8') - ) + const dbData = encodeRisuSave(get(DataBase)) alertStore.set({ type: "wait", @@ -355,7 +352,7 @@ async function loadDrive(ACCESS_TOKEN:string, mode: 'backup'|'sync'):Promise { + changed = true + }) while(true){ - const dbjson = JSON.stringify(get(DataBase)) - if(dbjson !== lastSave){ - lastSave = dbjson - const dbData = pako.deflate( - Buffer.from(dbjson, 'utf-8') - ) + if(changed){ + const dbData = encodeRisuSave(get(DataBase)) if(isTauri){ await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData}) await writeBinaryFile(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData, {dir: BaseDirectory.AppData}) @@ -275,13 +275,13 @@ export async function loadData() { } if(!await exists('database/database.bin', {dir: BaseDirectory.AppData})){ await writeBinaryFile('database/database.bin', - pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8')) + encodeRisuSave({}) ,{dir: BaseDirectory.AppData}) } try { setDatabase( - JSON.parse(Buffer.from(pako.inflate(Buffer.from(await readBinaryFile('database/database.bin',{dir: BaseDirectory.AppData})))).toString('utf-8')) - ) + decodeRisuSave(await readBinaryFile('database/database.bin',{dir: BaseDirectory.AppData})) + ) } catch (error) { const backups = await getDbBackups() let backupLoaded = false @@ -289,7 +289,7 @@ export async function loadData() { try { const backupData = await readBinaryFile(`database/dbbackup-${backup}.bin`,{dir: BaseDirectory.AppData}) setDatabase( - JSON.parse(Buffer.from(pako.inflate(Buffer.from(backupData))).toString('utf-8')) + decodeRisuSave(backupData) ) backupLoaded = true } catch (error) {} @@ -305,12 +305,11 @@ export async function loadData() { else{ let gotStorage:Uint8Array = await forageStorage.getItem('database/database.bin') if(checkNullish(gotStorage)){ - gotStorage = pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8')) - await forageStorage.setItem('database/database.bin', gotStorage) + await forageStorage.setItem('database/database.bin', encodeRisuSave({})) } try { setDatabase( - JSON.parse(Buffer.from(pako.inflate(Buffer.from(gotStorage))).toString('utf-8')) + decodeRisuSave(gotStorage) ) } catch (error) { const backups = await getDbBackups() @@ -319,7 +318,7 @@ export async function loadData() { try { const backupData:Uint8Array = await forageStorage.getItem(`database/dbbackup-${backup}.bin`) setDatabase( - JSON.parse(Buffer.from(pako.inflate(Buffer.from(backupData))).toString('utf-8')) + decodeRisuSave(backupData) ) backupLoaded = true } catch (error) {} diff --git a/src/ts/storage/risuSave.ts b/src/ts/storage/risuSave.ts new file mode 100644 index 00000000..4c56d8d8 --- /dev/null +++ b/src/ts/storage/risuSave.ts @@ -0,0 +1,31 @@ +import { decode, encode } from "@msgpack/msgpack"; +import { isEqual } from "lodash"; +import pako from "pako"; + + +export function encodeRisuSave(data:any){ + const risuSaveHeader = new Uint8Array(Buffer.from("\u0000\u0000RISU",'utf-8')) + const encoded = encode(data) + const mergedArray = new Uint8Array(risuSaveHeader.length + encoded.length); + mergedArray.set(risuSaveHeader); + mergedArray.set(encoded, risuSaveHeader.length); + return mergedArray +} + +export function decodeRisuSave(data:Uint8Array){ + const risuSaveHeader = new Uint8Array(Buffer.from("\u0000\u0000RISU",'utf-8')) + const sub = data.subarray(0, risuSaveHeader.length) + if(isEqual(sub, risuSaveHeader)){ + try { + const realData = data.subarray(risuSaveHeader.length) + const dec = decode(realData) + return dec + } catch (error) { + console.error(error) + throw error + } + } + else{ + return JSON.parse(Buffer.from(pako.inflate(Buffer.from(data))).toString('utf-8')) + } +} \ No newline at end of file