Change saving
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { get, writable } from "svelte/store"
|
||||
import { sleep } from "./util"
|
||||
import { language } from "../lang"
|
||||
import { isNodeServer, isTauri } from "./globalApi"
|
||||
import { isNodeServer, isTauri } from "./globalApi.svelte"
|
||||
import { Capacitor } from "@capacitor/core"
|
||||
import { getDatabase, type MessageGenerationInfo } from "./storage/database.svelte"
|
||||
import { alertStore as alertStoreImported } from "./stores.svelte"
|
||||
|
||||
@@ -5,7 +5,7 @@ import { checkNullish, decryptBuffer, encryptBuffer, isKnownUri, selectFileByDom
|
||||
import { language } from "src/lang"
|
||||
import { v4 as uuidv4, v4 } from 'uuid';
|
||||
import { characterFormatUpdate } from "./characters"
|
||||
import { AppendableBuffer, BlankWriter, checkCharOrder, downloadFile, isNodeServer, isTauri, loadAsset, LocalWriter, openURL, readImage, saveAsset, VirtualWriter } from "./globalApi"
|
||||
import { AppendableBuffer, BlankWriter, checkCharOrder, downloadFile, isNodeServer, isTauri, loadAsset, LocalWriter, openURL, readImage, saveAsset, VirtualWriter } from "./globalApi.svelte"
|
||||
import { SettingsMenuIndex, ShowRealmFrameStore, selectedCharID, settingsOpen } from "./stores.svelte"
|
||||
import { convertImage, hasher } from "./parser.svelte"
|
||||
import { CCardLib, type CharacterCardV3, type LorebookEntry } from '@risuai/ccardlib'
|
||||
|
||||
@@ -6,7 +6,7 @@ import { decode as decodeMsgpack } from "msgpackr";
|
||||
import { checkNullish, findCharacterbyId, getUserName, selectMultipleFile, selectSingleFile, sleep } from "./util";
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { MobileGUIStack, OpenRealmStore, selectedCharID } from "./stores.svelte";
|
||||
import { checkCharOrder, downloadFile, getFileSrc } from "./globalApi";
|
||||
import { checkCharOrder, downloadFile, getFileSrc } from "./globalApi.svelte";
|
||||
import { reencodeImage } from "./process/files/image";
|
||||
import { updateInlayScreen } from "./process/inlayScreen";
|
||||
import { PngChunk } from "./pngChunk";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { language } from "src/lang";
|
||||
import { alertError, alertInput, alertNormal, alertSelect, alertStore } from "../alert";
|
||||
import { requestChatData } from "../process/request";
|
||||
import { checkCharOrder, globalFetch, isNodeServer, isTauri, saveAsset } from "../globalApi";
|
||||
import { checkCharOrder, globalFetch, isNodeServer, isTauri, saveAsset } from "../globalApi.svelte";
|
||||
import { tokenize } from "../tokenizer";
|
||||
import { createBlankChar } from "../characters";
|
||||
import { getDatabase, setDatabase, type character } from "../storage/database.svelte";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { BaseDirectory, readFile, readDir, writeFile } from "@tauri-apps/plugin-fs";
|
||||
import { alertError, alertNormal, alertStore, alertWait } from "../alert";
|
||||
import { LocalWriter, forageStorage, isTauri } from "../globalApi";
|
||||
import { LocalWriter, forageStorage, isTauri } from "../globalApi.svelte";
|
||||
import { decodeRisuSave, encodeRisuSaveLegacy } from "../storage/risuSave";
|
||||
import { getDatabase, setDatabaseLite } from "../storage/database.svelte";
|
||||
import { relaunch } from "@tauri-apps/plugin-process";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { alertError, alertInput, alertNormal, alertSelect, alertStore } from "../alert";
|
||||
import { getDatabase, type Database } from "../storage/database.svelte";
|
||||
import { forageStorage, getUnpargeables, isTauri, openURL } from "../globalApi";
|
||||
import { forageStorage, getUnpargeables, isTauri, openURL } from "../globalApi.svelte";
|
||||
import { BaseDirectory, exists, readFile, readDir, writeFile } from "@tauri-apps/plugin-fs";
|
||||
import { language } from "../../lang";
|
||||
import { relaunch } from '@tauri-apps/plugin-process';
|
||||
@@ -287,7 +287,7 @@ async function loadDrive(ACCESS_TOKEN:string, mode: 'backup'|'sync'):Promise<voi
|
||||
}
|
||||
const selectedIndex = (await alertSelect([language.loadLatest, language.loadOthers]) === '0') ? 0 : parseInt(await alertSelect(selectables))
|
||||
const selectedDb = dbs[selectedIndex][0]
|
||||
const decompressedDb:Database = decodeRisuSave(await getFileData(ACCESS_TOKEN, selectedDb.id))
|
||||
const decompressedDb:Database = await decodeRisuSave(await getFileData(ACCESS_TOKEN, selectedDb.id))
|
||||
return decompressedDb
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import {open} from '@tauri-apps/plugin-shell'
|
||||
import { setDatabase, type Database, defaultSdDataFunc, getDatabase } from "./storage/database.svelte";
|
||||
import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow";
|
||||
import { checkRisuUpdate } from "./update";
|
||||
import { MobileGUI, botMakerMode, selectedCharID, loadedStore } from "./stores.svelte";
|
||||
import { MobileGUI, botMakerMode, selectedCharID, loadedStore, DBState } from "./stores.svelte";
|
||||
import { loadPlugins } from "./plugins/plugins";
|
||||
import { alertConfirm, alertError, alertNormal, alertNormalWait, alertSelect, alertTOS, alertWait } from "./alert";
|
||||
import { checkDriverInit, syncDrive } from "./drive/drive";
|
||||
@@ -24,7 +24,7 @@ import { hasher } from "./parser.svelte";
|
||||
import { characterURLImport, hubURL } from "./characterCards";
|
||||
import { defaultJailbreak, defaultMainPrompt, oldJailbreak, oldMainPrompt } from "./storage/defaultPrompts";
|
||||
import { loadRisuAccountData } from "./drive/accounter";
|
||||
import { decodeRisuSave, encodeRisuSaveLegacy } from "./storage/risuSave";
|
||||
import { decodeRisuSave, encodeRisuSave, encodeRisuSaveLegacy } from "./storage/risuSave";
|
||||
import { AutoStorage } from "./storage/autoStorage";
|
||||
import { updateAnimationSpeed } from "./gui/animation";
|
||||
import { updateColorScheme, updateTextThemeAndCSS } from "./gui/colorscheme";
|
||||
@@ -309,7 +309,6 @@ let lastSave = ''
|
||||
* @returns {Promise<void>} - A promise that resolves when the database has been saved.
|
||||
*/
|
||||
export async function saveDb(){
|
||||
lastSave = JSON.stringify(getDatabase())
|
||||
let changed = true
|
||||
syncDrive()
|
||||
let gotChannel = false
|
||||
@@ -330,58 +329,75 @@ export async function saveDb(){
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let savetrys = 0
|
||||
let lastDbData = new Uint8Array(0)
|
||||
await sleep(1000)
|
||||
while(true){
|
||||
try {
|
||||
if(changed){
|
||||
if(gotChannel){
|
||||
//Data is saved in other tab
|
||||
await sleep(1000)
|
||||
continue
|
||||
}
|
||||
if(channel){
|
||||
channel.postMessage(sessionID)
|
||||
}
|
||||
let db = getDatabase()
|
||||
if(!db.characters){
|
||||
await sleep(1000)
|
||||
continue
|
||||
}
|
||||
db.saveTime = Math.floor(Date.now() / 1000)
|
||||
if(isTauri){
|
||||
const dbData = encodeRisuSaveLegacy(db)
|
||||
await writeFile('database/database.bin', dbData, {baseDir: BaseDirectory.AppData});
|
||||
await writeFile(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData, {baseDir: BaseDirectory.AppData});
|
||||
}
|
||||
else{
|
||||
if(!forageStorage.isAccount){
|
||||
const dbData = encodeRisuSaveLegacy(db)
|
||||
await forageStorage.setItem('database/database.bin', dbData)
|
||||
await forageStorage.setItem(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData)
|
||||
}
|
||||
if(forageStorage.isAccount){
|
||||
const dbData = encodeRisuSaveLegacy(db, 'compression')
|
||||
const z:Database = decodeRisuSave(dbData)
|
||||
if(z.formatversion){
|
||||
await forageStorage.setItem('database/database.bin', dbData)
|
||||
}
|
||||
await sleep(5000);
|
||||
}
|
||||
}
|
||||
if(!forageStorage.isAccount){
|
||||
await getDbBackups()
|
||||
}
|
||||
savetrys = 0
|
||||
if(gotChannel){
|
||||
//Data is saved in other tab
|
||||
await sleep(1000)
|
||||
continue
|
||||
}
|
||||
if(channel){
|
||||
channel.postMessage(sessionID)
|
||||
}
|
||||
let db = getDatabase()
|
||||
if(!db.characters){
|
||||
await sleep(1000)
|
||||
continue
|
||||
}
|
||||
if(isTauri){
|
||||
const dbData = encodeRisuSaveLegacy(db)
|
||||
await writeFile('database/database.bin', dbData, {baseDir: BaseDirectory.AppData});
|
||||
await writeFile(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData, {baseDir: BaseDirectory.AppData});
|
||||
}
|
||||
else{
|
||||
if(!forageStorage.isAccount){
|
||||
const dbData = encodeRisuSaveLegacy(db)
|
||||
await forageStorage.setItem('database/database.bin', dbData)
|
||||
await forageStorage.setItem(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData)
|
||||
}
|
||||
if(forageStorage.isAccount){
|
||||
const dbData = await encodeRisuSave(db)
|
||||
|
||||
if(lastDbData.length === dbData.length){
|
||||
let same = true
|
||||
for(let i = 20; i < dbData.length; i++){
|
||||
if(dbData[i] !== lastDbData[i]){
|
||||
same = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if(same){
|
||||
await sleep(500)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
lastDbData = dbData
|
||||
const z:Database = await decodeRisuSave(dbData)
|
||||
if(z.formatversion){
|
||||
await forageStorage.setItem('database/database.bin', dbData)
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!forageStorage.isAccount){
|
||||
await getDbBackups()
|
||||
}
|
||||
savetrys = 0
|
||||
|
||||
await saveDbKei()
|
||||
await sleep(500)
|
||||
} catch (error) {
|
||||
savetrys += 1
|
||||
if(savetrys > 4){
|
||||
await alertConfirm(`DBSaveError: ${error.message ?? error}. report to the developer.`)
|
||||
}
|
||||
else{
|
||||
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -458,7 +474,7 @@ export async function loadData() {
|
||||
await writeFile('database/database.bin', encodeRisuSaveLegacy({}), {baseDir: BaseDirectory.AppData});
|
||||
}
|
||||
try {
|
||||
const decoded = decodeRisuSave(await readFile('database/database.bin',{baseDir: BaseDirectory.AppData}))
|
||||
const decoded = await decodeRisuSave(await readFile('database/database.bin',{baseDir: BaseDirectory.AppData}))
|
||||
setDatabase(decoded)
|
||||
} catch (error) {
|
||||
const backups = await getDbBackups()
|
||||
@@ -467,7 +483,7 @@ export async function loadData() {
|
||||
try {
|
||||
const backupData = await readFile(`database/dbbackup-${backup}.bin`,{baseDir: BaseDirectory.AppData})
|
||||
setDatabase(
|
||||
decodeRisuSave(backupData)
|
||||
await decodeRisuSave(backupData)
|
||||
)
|
||||
backupLoaded = true
|
||||
} catch (error) {
|
||||
@@ -489,7 +505,7 @@ export async function loadData() {
|
||||
await forageStorage.setItem('database/database.bin', gotStorage)
|
||||
}
|
||||
try {
|
||||
const decoded = decodeRisuSave(gotStorage)
|
||||
const decoded = await decodeRisuSave(gotStorage)
|
||||
console.log(decoded)
|
||||
setDatabase(decoded)
|
||||
} catch (error) {
|
||||
@@ -500,7 +516,7 @@ export async function loadData() {
|
||||
try {
|
||||
const backupData:Uint8Array = await forageStorage.getItem(`database/dbbackup-${backup}.bin`) as unknown as Uint8Array
|
||||
setDatabase(
|
||||
decodeRisuSave(backupData)
|
||||
await decodeRisuSave(backupData)
|
||||
)
|
||||
backupLoaded = true
|
||||
} catch (error) {}
|
||||
@@ -517,7 +533,7 @@ export async function loadData() {
|
||||
}
|
||||
try {
|
||||
setDatabase(
|
||||
decodeRisuSave(gotStorage)
|
||||
await decodeRisuSave(gotStorage)
|
||||
)
|
||||
} catch (error) {
|
||||
const backups = await getDbBackups()
|
||||
@@ -526,7 +542,7 @@ export async function loadData() {
|
||||
try {
|
||||
const backupData:Uint8Array = await forageStorage.getItem(`database/dbbackup-${backup}.bin`) as unknown as Uint8Array
|
||||
setDatabase(
|
||||
decodeRisuSave(backupData)
|
||||
await decodeRisuSave(backupData)
|
||||
)
|
||||
backupLoaded = true
|
||||
} catch (error) {}
|
||||
@@ -2045,7 +2061,7 @@ export async function loadInternalBackup(){
|
||||
) : (await forageStorage.getItem(selectedBackup))
|
||||
|
||||
setDatabase(
|
||||
decodeRisuSave(Buffer.from(data) as unknown as Uint8Array)
|
||||
await decodeRisuSave(Buffer.from(data) as unknown as Uint8Array)
|
||||
)
|
||||
|
||||
await alertNormal('Loaded backup')
|
||||
@@ -1,6 +1,6 @@
|
||||
import { get, writable } from "svelte/store";
|
||||
import { getDatabase, setDatabase } from "../storage/database.svelte";
|
||||
import { downloadFile } from "../globalApi";
|
||||
import { downloadFile } from "../globalApi.svelte";
|
||||
import { BufferToText, selectSingleFile } from "../util";
|
||||
import { alertError } from "../alert";
|
||||
import { isLite } from "../lite";
|
||||
|
||||
@@ -2,7 +2,7 @@ import DOMPurify from 'isomorphic-dompurify';
|
||||
import markdownit from 'markdown-it'
|
||||
import { getCurrentCharacter, type Database, type Message, type character, type customscript, type groupChat, type triggerscript } from './storage/database.svelte';
|
||||
import { DBState } from './stores.svelte';
|
||||
import { getFileSrc } from './globalApi';
|
||||
import { getFileSrc } from './globalApi.svelte';
|
||||
import { processScriptFull } from './process/scripts';
|
||||
import { get } from 'svelte/store';
|
||||
import css, { type CssAtRuleAST } from '@adobe/css-tools'
|
||||
|
||||
@@ -2,7 +2,7 @@ import { get } from "svelte/store"
|
||||
import { getDatabase, saveImage, setDatabase } from "./storage/database.svelte"
|
||||
import { getUserName, selectSingleFile, sleep } from "./util"
|
||||
import { alertError, alertNormal, alertStore } from "./alert"
|
||||
import { downloadFile, readImage } from "./globalApi"
|
||||
import { downloadFile, readImage } from "./globalApi.svelte"
|
||||
import { language } from "src/lang"
|
||||
import { reencodeImage } from "./process/files/image"
|
||||
import { PngChunk } from "./pngChunk"
|
||||
|
||||
@@ -4,7 +4,7 @@ import { alertError } from "../alert";
|
||||
import { getDatabase, setDatabaseLite } from "../storage/database.svelte";
|
||||
import { checkNullish, selectSingleFile, sleep } from "../util";
|
||||
import type { OpenAIChat } from "../process/index.svelte";
|
||||
import { globalFetch } from "../globalApi";
|
||||
import { globalFetch } from "../globalApi.svelte";
|
||||
import { selectedCharID } from "../stores.svelte";
|
||||
import { addAdditionalCharaJS } from "./embedscript";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Buffer } from 'buffer';
|
||||
import crc32 from 'crc/crc32';
|
||||
import { AppendableBuffer, VirtualWriter, type LocalWriter } from './globalApi';
|
||||
import { AppendableBuffer, VirtualWriter, type LocalWriter } from './globalApi.svelte';
|
||||
import { blobToUint8Array } from './util';
|
||||
|
||||
class StreamChunkWriter{
|
||||
|
||||
@@ -2,7 +2,7 @@ import { getDatabase, setDatabase } from 'src/ts/storage/database.svelte';
|
||||
import { selectedCharID } from 'src/ts/stores.svelte';
|
||||
import { get } from 'svelte/store';
|
||||
import { doingChat, sendChat } from '../index.svelte';
|
||||
import { downloadFile, isTauri } from 'src/ts/globalApi';
|
||||
import { downloadFile, isTauri } from 'src/ts/globalApi.svelte';
|
||||
import { HypaProcesser } from '../memory/hypamemory';
|
||||
import { BufferToText as BufferToText, selectSingleFile, sleep } from 'src/ts/util';
|
||||
import { postInlayImage } from './image';
|
||||
|
||||
@@ -6,7 +6,7 @@ import { tokenize } from "../tokenizer";
|
||||
import { checkNullish, selectSingleFile } from "../util";
|
||||
import { alertError, alertNormal } from "../alert";
|
||||
import { language } from "../../lang";
|
||||
import { downloadFile } from "../globalApi";
|
||||
import { downloadFile } from "../globalApi.svelte";
|
||||
import { getModuleLorebooks } from "./modules";
|
||||
import { CCardLib } from "@risuai/ccardlib";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import localforage from "localforage";
|
||||
import { globalFetch } from "src/ts/globalApi";
|
||||
import { globalFetch } from "src/ts/globalApi.svelte";
|
||||
import { runEmbedding } from "../transformers";
|
||||
import { alertError } from "src/ts/alert";
|
||||
import { appendLastPath } from "src/ts/util";
|
||||
|
||||
@@ -3,7 +3,7 @@ import type { OpenAIChat } from "../index.svelte";
|
||||
import type { ChatTokenizer } from "src/ts/tokenizer";
|
||||
import { requestChatData } from "../request";
|
||||
import { HypaProcesser } from "./hypamemory";
|
||||
import { globalFetch } from "src/ts/globalApi";
|
||||
import { globalFetch } from "src/ts/globalApi.svelte";
|
||||
import { runSummarizer } from "../transformers";
|
||||
|
||||
export interface HypaV2Data {
|
||||
|
||||
@@ -4,7 +4,7 @@ import { tokenize, type ChatTokenizer } from "../../tokenizer";
|
||||
import { requestChatData } from "../request";
|
||||
import { HypaProcesser } from "./hypamemory";
|
||||
import { stringlizeChat } from "../stringlize";
|
||||
import { globalFetch } from "src/ts/globalApi";
|
||||
import { globalFetch } from "src/ts/globalApi.svelte";
|
||||
import { runSummarizer } from "../transformers";
|
||||
import { getUserName } from "src/ts/util";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { globalFetch } from "src/ts/globalApi";
|
||||
import { globalFetch } from "src/ts/globalApi.svelte";
|
||||
import { sleep } from "src/ts/util";
|
||||
import * as path from "@tauri-apps/api/path";
|
||||
import { exists, readTextFile } from "@tauri-apps/plugin-fs";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { getDatabase, setDatabase } from "src/ts/storage/database.svelte"
|
||||
import type { OpenAIChat } from "../index.svelte"
|
||||
import { globalFetch } from "src/ts/globalApi"
|
||||
import { globalFetch } from "src/ts/globalApi.svelte"
|
||||
import { alertError, alertInput, alertNormal, alertWait } from "src/ts/alert"
|
||||
import { getUserName, sleep } from "src/ts/util"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { language } from "src/lang"
|
||||
import { alertConfirm, alertError, alertModuleSelect, alertNormal, alertStore } from "../alert"
|
||||
import { getCurrentCharacter, getCurrentChat, getDatabase, setCurrentCharacter, setDatabase, type customscript, type loreBook, type triggerscript } from "../storage/database.svelte"
|
||||
import { AppendableBuffer, downloadFile, isNodeServer, isTauri, readImage, saveAsset } from "../globalApi"
|
||||
import { AppendableBuffer, downloadFile, isNodeServer, isTauri, readImage, saveAsset } from "../globalApi.svelte"
|
||||
import { selectSingleFile, sleep } from "../util"
|
||||
import { v4 } from "uuid"
|
||||
import { convertExternalLorebook } from "./lorebook.svelte"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AppendableBuffer, isNodeServer, isTauri, saveAsset, type LocalWriter, type VirtualWriter } from "../globalApi";
|
||||
import { AppendableBuffer, isNodeServer, isTauri, saveAsset, type LocalWriter, type VirtualWriter } from "../globalApi.svelte";
|
||||
import * as fflate from "fflate";
|
||||
import { sleep } from "../util";
|
||||
import { alertStore } from "../alert";
|
||||
|
||||
@@ -4,7 +4,7 @@ import { getDatabase, type character } from "../storage/database.svelte";
|
||||
import { pluginProcess } from "../plugins/plugins";
|
||||
import { language } from "../../lang";
|
||||
import { stringlizeAINChat, stringlizeChat, getStopStrings, unstringlizeAIN, unstringlizeChat } from "./stringlize";
|
||||
import { addFetchLog, fetchNative, globalFetch, isNodeServer, isTauri, textifyReadableStream } from "../globalApi";
|
||||
import { addFetchLog, fetchNative, globalFetch, isNodeServer, isTauri, textifyReadableStream } from "../globalApi.svelte";
|
||||
import { sleep } from "../util";
|
||||
import { NovelAIBadWordIds, stringlizeNAIChat } from "./models/nai";
|
||||
import { strongBan, tokenize, tokenizeNum } from "../tokenizer";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { get } from "svelte/store";
|
||||
import { CharEmotion, selectedCharID } from "../stores.svelte";
|
||||
import { type character, type customscript, type groupChat, type Database, getDatabase } from "../storage/database.svelte";
|
||||
import { downloadFile } from "../globalApi";
|
||||
import { downloadFile } from "../globalApi.svelte";
|
||||
import { alertError, alertNormal } from "../alert";
|
||||
import { language } from "src/lang";
|
||||
import { selectSingleFile } from "../util";
|
||||
|
||||
@@ -2,7 +2,7 @@ import { get } from "svelte/store"
|
||||
import { getDatabase, type character } from "../storage/database.svelte"
|
||||
import { requestChatData } from "./request"
|
||||
import { alertError } from "../alert"
|
||||
import { globalFetch, readImage } from "../globalApi"
|
||||
import { globalFetch, readImage } from "../globalApi.svelte"
|
||||
import { CharEmotion } from "../stores.svelte"
|
||||
import type { OpenAIChat } from "./index.svelte"
|
||||
import { processZip } from "./processzip"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {env, AutoTokenizer, pipeline, type SummarizationOutput, type TextGenerationConfig, type TextGenerationOutput, FeatureExtractionPipeline, TextToAudioPipeline, type ImageToTextOutput } from '@xenova/transformers';
|
||||
import { unzip } from 'fflate';
|
||||
import { globalFetch, loadAsset, saveAsset } from 'src/ts/globalApi';
|
||||
import { globalFetch, loadAsset, saveAsset } from 'src/ts/globalApi.svelte';
|
||||
import { selectSingleFile } from 'src/ts/util';
|
||||
import { v4 } from 'uuid';
|
||||
let tfCache:Cache = null
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { alertError } from "../alert";
|
||||
import { getCurrentCharacter, getDatabase, type character } from "../storage/database.svelte";
|
||||
import { runTranslator, translateVox } from "../translator/translator";
|
||||
import { globalFetch, loadAsset } from "../globalApi";
|
||||
import { globalFetch, loadAsset } from "../globalApi.svelte";
|
||||
import { language } from "src/lang";
|
||||
import { sleep } from "../util";
|
||||
import { runVITS } from "./transformers";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { get } from "svelte/store";
|
||||
import { exportCharacterCard } from "./characterCards";
|
||||
import { VirtualWriter, isTauri, openURL } from "./globalApi";
|
||||
import { VirtualWriter, isTauri, openURL } from "./globalApi.svelte";
|
||||
import { getCurrentCharacter, getDatabase, type character } from "./storage/database.svelte";
|
||||
import { alertStore } from "./alert";
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import { setDatabase, type character, saveImage, type Chat, getCurrentChat, setC
|
||||
import { selectedCharID } from '../stores.svelte';
|
||||
import { findCharacterIndexbyId, sleep } from '../util';
|
||||
import type { DataConnection, Peer } from 'peerjs';
|
||||
import { readImage } from '../globalApi';
|
||||
import { readImage } from '../globalApi.svelte';
|
||||
import { doingChat } from '../process/index.svelte';
|
||||
|
||||
async function importPeerJS(){
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { MultiModal, OpenAIChat } from "./process/index.svelte";
|
||||
import { supportsInlayImage } from "./process/files/image";
|
||||
import { risuChatParser } from "./parser.svelte";
|
||||
import { tokenizeGGUFModel } from "./process/models/local";
|
||||
import { globalFetch } from "./globalApi";
|
||||
import { globalFetch } from "./globalApi.svelte";
|
||||
|
||||
|
||||
export const tokenizerList = [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { get } from "svelte/store"
|
||||
import { translatorPlugin } from "../plugins/plugins"
|
||||
import { getDatabase, type character, type customscript, type groupChat } from "../storage/database.svelte"
|
||||
import { globalFetch, isTauri } from "../globalApi"
|
||||
import { globalFetch, isTauri } from "../globalApi.svelte"
|
||||
import { alertError } from "../alert"
|
||||
import { requestChatData } from "../process/request"
|
||||
import { doingChat, type OpenAIChat } from "../process/index.svelte"
|
||||
|
||||
@@ -7,7 +7,7 @@ import { readFile } from "@tauri-apps/plugin-fs"
|
||||
import { basename } from "@tauri-apps/api/path"
|
||||
import { createBlankChar, getCharImage } from "./characters"
|
||||
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow';
|
||||
import { isTauri } from "./globalApi"
|
||||
import { isTauri } from "./globalApi.svelte"
|
||||
const appWindow = isTauri ? getCurrentWebviewWindow() : null
|
||||
|
||||
export const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1
|
||||
|
||||
Reference in New Issue
Block a user