Change saving
This commit is contained in:
@@ -3,7 +3,7 @@ import { getDatabase } from "./database.svelte"
|
||||
import { hubURL } from "../characterCards"
|
||||
import localforage from "localforage"
|
||||
import { alertLogin, alertStore, alertWait } from "../alert"
|
||||
import { forageStorage, getUnpargeables } from "../globalApi"
|
||||
import { forageStorage, getUnpargeables } from "../globalApi.svelte"
|
||||
import { encodeRisuSaveLegacy } from "./risuSave"
|
||||
import { v4 } from "uuid"
|
||||
import { language } from "src/lang"
|
||||
@@ -13,6 +13,7 @@ const risuSession = Date.now().toFixed(0)
|
||||
const cachedForage = localforage.createInstance({name: "risuaiAccountCached"})
|
||||
|
||||
let seenWarnings:string[] = []
|
||||
let lastDbSave = 0
|
||||
|
||||
export class AccountStorage{
|
||||
auth:string
|
||||
@@ -22,7 +23,19 @@ export class AccountStorage{
|
||||
this.checkAuth()
|
||||
let da:Response
|
||||
while((!da) || da.status === 403){
|
||||
|
||||
const saveDate = Date.now().toFixed(0)
|
||||
|
||||
if(key === 'database/database.bin' && Date.now() - lastDbSave < 10000){
|
||||
console.log('saving in cache')
|
||||
//only save in cache if it's database and last save is less than 10 seconds
|
||||
await cachedForage.setItem(key, value).then(() => {
|
||||
cachedForage.setItem(key + '__date', saveDate)
|
||||
})
|
||||
return key
|
||||
}
|
||||
lastDbSave = Date.now()
|
||||
|
||||
da = await fetch(hubURL + '/api/account/write', {
|
||||
method: "POST",
|
||||
body: value,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import localforage from "localforage"
|
||||
import { isNodeServer, replaceDbResources } from "../globalApi"
|
||||
import { isNodeServer, replaceDbResources } from "../globalApi.svelte"
|
||||
import { NodeStorage } from "./nodeStorage"
|
||||
import { OpfsStorage } from "./opfsStorage"
|
||||
import { alertInput, alertSelect, alertStore } from "../alert"
|
||||
@@ -91,7 +91,7 @@ export class AutoStorage{
|
||||
const comp = encodeRisuSaveLegacy(dba, 'compression')
|
||||
//try decoding
|
||||
try {
|
||||
const z:Database = decodeRisuSave(comp)
|
||||
const z:Database = await decodeRisuSave(comp)
|
||||
if(z.formatversion){
|
||||
await accountStorage.setItem('database/database.bin', comp)
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import { checkNullish, decryptBuffer, encryptBuffer, selectSingleFile } from '..
|
||||
import { changeLanguage, language } from '../../lang';
|
||||
import type { RisuPlugin } from '../plugins/plugins';
|
||||
import type {triggerscript as triggerscriptMain} from '../process/triggers';
|
||||
import { downloadFile, saveAsset as saveImageGlobal } from '../globalApi';
|
||||
import { downloadFile, saveAsset as saveImageGlobal } from '../globalApi.svelte';
|
||||
import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from './defaultPrompts';
|
||||
import { alertNormal, alertSelect } from '../alert';
|
||||
import type { NAISettings } from '../process/models/nai';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { get } from "svelte/store";
|
||||
import { getDatabase } from "./database.svelte";
|
||||
import { downloadFile } from "../globalApi";
|
||||
import { downloadFile } from "../globalApi.svelte";
|
||||
import { alertNormal } from "../alert";
|
||||
import { language } from "src/lang";
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import { get } from "svelte/store";
|
||||
import { getDatabase } from "./database.svelte";
|
||||
import { alertNormal } from "../alert";
|
||||
import { language } from "src/lang";
|
||||
import { isNodeServer, isTauri } from "../globalApi";
|
||||
import { isNodeServer, isTauri } from "../globalApi.svelte";
|
||||
|
||||
async function requestPersistantStorageMain() {
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Packr, Unpackr, decode } from "msgpackr";
|
||||
import * as fflate from "fflate";
|
||||
import { isTauri } from "../globalApi";
|
||||
import { AppendableBuffer, isTauri } from "../globalApi.svelte";
|
||||
|
||||
const packr = new Packr({
|
||||
useRecords:false
|
||||
@@ -12,7 +12,8 @@ const unpackr = new Unpackr({
|
||||
})
|
||||
|
||||
const magicHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 7]);
|
||||
const magicCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 8]);
|
||||
const magicCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 8]);
|
||||
const magicStreamCompressedHeader = new Uint8Array([0, 82, 73, 83, 85, 83, 65, 86, 69, 0, 9]);
|
||||
|
||||
export function encodeRisuSaveLegacy(data:any, compression:'noCompression'|'compression' = 'noCompression'){
|
||||
let encoded:Uint8Array = packr.encode(data)
|
||||
@@ -31,7 +32,20 @@ export function encodeRisuSaveLegacy(data:any, compression:'noCompression'|'comp
|
||||
}
|
||||
}
|
||||
|
||||
export function decodeRisuSave(data:Uint8Array){
|
||||
export async function encodeRisuSave(data:any) {
|
||||
let encoded:Uint8Array = packr.encode(data)
|
||||
const cs = new CompressionStream('gzip');
|
||||
const writer = cs.writable.getWriter();
|
||||
writer.write(encoded);
|
||||
writer.close();
|
||||
const buf = await new Response(cs.readable).arrayBuffer()
|
||||
const result = new Uint8Array(new Uint8Array(buf).length + magicStreamCompressedHeader.length);
|
||||
result.set(magicStreamCompressedHeader, 0)
|
||||
result.set(new Uint8Array(buf), magicStreamCompressedHeader.length)
|
||||
return result
|
||||
}
|
||||
|
||||
export async function decodeRisuSave(data:Uint8Array){
|
||||
try {
|
||||
switch(checkHeader(data)){
|
||||
case "compressed":
|
||||
@@ -40,6 +54,15 @@ export function decodeRisuSave(data:Uint8Array){
|
||||
case "raw":
|
||||
data = data.slice(magicHeader.length)
|
||||
return unpackr.decode(data)
|
||||
case "stream":{
|
||||
data = data.slice(magicStreamCompressedHeader.length)
|
||||
const cs = new DecompressionStream('gzip');
|
||||
const writer = cs.writable.getWriter();
|
||||
writer.write(data);
|
||||
writer.close();
|
||||
const buf = await new Response(cs.readable).arrayBuffer()
|
||||
return unpackr.decode(new Uint8Array(buf))
|
||||
}
|
||||
}
|
||||
return unpackr.decode(data)
|
||||
}
|
||||
@@ -63,7 +86,7 @@ export function decodeRisuSave(data:Uint8Array){
|
||||
|
||||
function checkHeader(data: Uint8Array) {
|
||||
|
||||
let header:'none'|'compressed'|'raw' = 'raw'
|
||||
let header:'none'|'compressed'|'raw'|'stream' = 'raw'
|
||||
|
||||
if (data.length < magicHeader.length) {
|
||||
return false;
|
||||
@@ -84,7 +107,18 @@ function checkHeader(data: Uint8Array) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(header === 'none'){
|
||||
header = 'stream'
|
||||
for (let i = 0; i < magicStreamCompressedHeader.length; i++) {
|
||||
if (data[i] !== magicStreamCompressedHeader[i]) {
|
||||
header = 'none'
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// All bytes matched
|
||||
return header;
|
||||
}
|
||||
Reference in New Issue
Block a user