Merge branch 'main' into chatsticker
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
"@msgpack/msgpack": "3.0.0-beta2",
|
"@msgpack/msgpack": "3.0.0-beta2",
|
||||||
"@tauri-apps/api": "1.3.0",
|
"@tauri-apps/api": "1.3.0",
|
||||||
"@xenova/transformers": "^2.1.1",
|
"@xenova/transformers": "^2.1.1",
|
||||||
|
"blueimp-md5": "^2.19.0",
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"core-js": "^3.30.2",
|
"core-js": "^3.30.2",
|
||||||
@@ -43,6 +44,7 @@
|
|||||||
"showdown": "^2.1.0",
|
"showdown": "^2.1.0",
|
||||||
"sweetalert2": "^11.7.3",
|
"sweetalert2": "^11.7.3",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
|
"wasmoon": "^1.15.0",
|
||||||
"web-streams-polyfill": "^3.2.1"
|
"web-streams-polyfill": "^3.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -50,6 +52,7 @@
|
|||||||
"@tailwindcss/typography": "^0.5.9",
|
"@tailwindcss/typography": "^0.5.9",
|
||||||
"@tauri-apps/cli": "1.3.1",
|
"@tauri-apps/cli": "1.3.1",
|
||||||
"@tsconfig/svelte": "^3.0.0",
|
"@tsconfig/svelte": "^3.0.0",
|
||||||
|
"@types/blueimp-md5": "^2.18.0",
|
||||||
"@types/dompurify": "^3.0.1",
|
"@types/dompurify": "^3.0.1",
|
||||||
"@types/lodash": "^4.14.194",
|
"@types/lodash": "^4.14.194",
|
||||||
"@types/lodash.clonedeep": "^4.5.7",
|
"@types/lodash.clonedeep": "^4.5.7",
|
||||||
|
|||||||
28
pnpm-lock.yaml
generated
28
pnpm-lock.yaml
generated
@@ -16,6 +16,9 @@ dependencies:
|
|||||||
'@xenova/transformers':
|
'@xenova/transformers':
|
||||||
specifier: ^2.1.1
|
specifier: ^2.1.1
|
||||||
version: 2.1.1
|
version: 2.1.1
|
||||||
|
blueimp-md5:
|
||||||
|
specifier: ^2.19.0
|
||||||
|
version: 2.19.0
|
||||||
body-parser:
|
body-parser:
|
||||||
specifier: ^1.20.2
|
specifier: ^1.20.2
|
||||||
version: 1.20.2
|
version: 1.20.2
|
||||||
@@ -88,6 +91,9 @@ dependencies:
|
|||||||
uuid:
|
uuid:
|
||||||
specifier: ^9.0.0
|
specifier: ^9.0.0
|
||||||
version: 9.0.0
|
version: 9.0.0
|
||||||
|
wasmoon:
|
||||||
|
specifier: ^1.15.0
|
||||||
|
version: 1.15.0
|
||||||
web-streams-polyfill:
|
web-streams-polyfill:
|
||||||
specifier: ^3.2.1
|
specifier: ^3.2.1
|
||||||
version: 3.2.1
|
version: 3.2.1
|
||||||
@@ -105,6 +111,9 @@ devDependencies:
|
|||||||
'@tsconfig/svelte':
|
'@tsconfig/svelte':
|
||||||
specifier: ^3.0.0
|
specifier: ^3.0.0
|
||||||
version: 3.0.0
|
version: 3.0.0
|
||||||
|
'@types/blueimp-md5':
|
||||||
|
specifier: ^2.18.0
|
||||||
|
version: 2.18.0
|
||||||
'@types/dompurify':
|
'@types/dompurify':
|
||||||
specifier: ^3.0.1
|
specifier: ^3.0.1
|
||||||
version: 3.0.1
|
version: 3.0.1
|
||||||
@@ -731,12 +740,20 @@ packages:
|
|||||||
resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==}
|
resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@types/blueimp-md5@2.18.0:
|
||||||
|
resolution: {integrity: sha512-f4A+++lGZGJvVSgeyMkqA7BEf2BVQli6F+qEykKb49c5ieWQBkfpn6CP5c1IZr2Yi2Ofl6Fj+v0e1fN18Z8Cnw==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/dompurify@3.0.1:
|
/@types/dompurify@3.0.1:
|
||||||
resolution: {integrity: sha512-ubq8VKmf8W+U48jUOiZO4BoSGS7NnbITPMvrF+7HgMN4L+eezCKv8QBPB8p3o4YPicLMmNeTyDkE5X4c2ViHJQ==}
|
resolution: {integrity: sha512-ubq8VKmf8W+U48jUOiZO4BoSGS7NnbITPMvrF+7HgMN4L+eezCKv8QBPB8p3o4YPicLMmNeTyDkE5X4c2ViHJQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/jsdom': 21.1.1
|
'@types/jsdom': 21.1.1
|
||||||
'@types/trusted-types': 2.0.3
|
'@types/trusted-types': 2.0.3
|
||||||
|
|
||||||
|
/@types/emscripten@1.39.5:
|
||||||
|
resolution: {integrity: sha512-DIOOg+POSrYl+OlNRHQuIEqCd8DCtynG57H862UCce16nXJX7J8eWxNGgOcf8Eyge8zXeSs27mz1UcFu8L/L7g==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@types/jsdom@21.1.1:
|
/@types/jsdom@21.1.1:
|
||||||
resolution: {integrity: sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==}
|
resolution: {integrity: sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -912,6 +929,10 @@ packages:
|
|||||||
readable-stream: 3.6.2
|
readable-stream: 3.6.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/blueimp-md5@2.19.0:
|
||||||
|
resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/body-parser@1.20.1:
|
/body-parser@1.20.1:
|
||||||
resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
|
resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
|
||||||
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
|
||||||
@@ -3190,6 +3211,13 @@ packages:
|
|||||||
xml-name-validator: 4.0.0
|
xml-name-validator: 4.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/wasmoon@1.15.0:
|
||||||
|
resolution: {integrity: sha512-QU33AnnMTgbcGOJLzcqM2UBcSksmLvwkvB/Bcgkf5hS+EFoHxB6nyiQiDG+ZnALN8mn/ezeeMSm6eY1zs0cKTg==}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
'@types/emscripten': 1.39.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
/web-streams-polyfill@3.2.1:
|
/web-streams-polyfill@3.2.1:
|
||||||
resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
|
resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ use serde_json::Value;
|
|||||||
use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
|
use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
|
||||||
use base64::{engine::general_purpose, Engine as _};
|
use base64::{engine::general_purpose, Engine as _};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use serde_json::json;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
@@ -61,13 +63,15 @@ async fn native_request(url: String, body: String, header: String, method:String
|
|||||||
|
|
||||||
match response {
|
match response {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
|
let headers = resp.headers();
|
||||||
|
let header_json = header_map_to_json(headers);
|
||||||
let bytes = match resp.bytes().await {
|
let bytes = match resp.bytes().await {
|
||||||
Ok(b) => b,
|
Ok(b) => b,
|
||||||
Err(e) => return format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()),
|
Err(e) => return format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()),
|
||||||
};
|
};
|
||||||
let encoded = general_purpose::STANDARD.encode(&bytes);
|
let encoded = general_purpose::STANDARD.encode(&bytes);
|
||||||
|
|
||||||
format!(r#"{{"success":true,"body":"{}"}}"#, encoded)
|
format!(r#"{{"success":true,"body":"{}","headers":{}}}"#, encoded, header_json)
|
||||||
}
|
}
|
||||||
Err(e) => format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()),
|
Err(e) => format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()),
|
||||||
}
|
}
|
||||||
@@ -79,3 +83,12 @@ fn main() {
|
|||||||
.run(tauri::generate_context!())
|
.run(tauri::generate_context!())
|
||||||
.expect("error while running tauri application");
|
.expect("error while running tauri application");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn header_map_to_json(header_map: &HeaderMap) -> serde_json::Value {
|
||||||
|
let mut map = HashMap::new();
|
||||||
|
for (key, value) in header_map {
|
||||||
|
map.insert(key.as_str().to_string(), value.to_str().unwrap().to_string());
|
||||||
|
}
|
||||||
|
json!(map)
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "RisuAI",
|
"productName": "RisuAI",
|
||||||
"version": "1.26.0"
|
"version": "1.27.1"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import { getHordeModels } from "src/ts/horde/getModels";
|
import { getHordeModels } from "src/ts/horde/getModels";
|
||||||
import Arcodion from "./Arcodion.svelte";
|
import Arcodion from "./Arcodion.svelte";
|
||||||
import { language } from "src/lang";
|
import { language } from "src/lang";
|
||||||
import { isNodeServer, isTauri } from "src/ts/storage/globalApi";
|
import { isNodeServer, isTauri } from "src/ts/storage/globalApi";
|
||||||
|
|
||||||
export let value = ""
|
export let value = ""
|
||||||
export let onChange: (v:string) => void = (v) => {}
|
export let onChange: (v:string) => void = (v) => {}
|
||||||
@@ -63,10 +63,11 @@
|
|||||||
<Arcodion name="OpenAI GPT">
|
<Arcodion name="OpenAI GPT">
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35')}}>GPT-3.5 Turbo</button>
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35')}}>GPT-3.5 Turbo</button>
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35_16k')}}>GPT-3.5 Turbo 16K</button>
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35_16k')}}>GPT-3.5 Turbo 16K</button>
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35_16k_0613')}}>GPT-3.5 Turbo 16K 0613</button>
|
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4')}}>GPT-4</button>
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4')}}>GPT-4</button>
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_0613')}}>GPT-4 0613</button>
|
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_32k')}}>GPT-4 32K</button>
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_32k')}}>GPT-4 32K</button>
|
||||||
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35_0613')}}>GPT-3.5 Turbo 0613</button>
|
||||||
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt35_16k_0613')}}>GPT-3.5 Turbo 16K 0613</button>
|
||||||
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_0613')}}>GPT-4 0613</button>
|
||||||
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_32k_0613')}}>GPT-4 32K 0613</button>
|
<button class="p-2 hover:text-green-500" on:click={() => {changeModel('gpt4_32k_0613')}}>GPT-4 32K 0613</button>
|
||||||
</Arcodion>
|
</Arcodion>
|
||||||
<Arcodion name="Anthropic Claude">
|
<Arcodion name="Anthropic Claude">
|
||||||
@@ -80,6 +81,7 @@
|
|||||||
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('kobold')}}>Kobold</button>
|
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('kobold')}}>Kobold</button>
|
||||||
{#if isTauri ||isNodeServer}
|
{#if isTauri ||isNodeServer}
|
||||||
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('novelai')}}>NovelAI Clio</button>
|
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('novelai')}}>NovelAI Clio</button>
|
||||||
|
<button class="hover:bg-selected px-6 py-2 text-lg" on:click={() => {changeModel('deepai')}}>DeepAI</button>
|
||||||
{/if}
|
{/if}
|
||||||
<Arcodion name="Horde">
|
<Arcodion name="Horde">
|
||||||
{#await getHordeModels()}
|
{#await getHordeModels()}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { get } from "svelte/store";
|
|||||||
import { alertError, alertInput, alertNormal, alertSelect, alertStore } from "../alert";
|
import { alertError, alertInput, alertNormal, alertSelect, alertStore } from "../alert";
|
||||||
import { DataBase, setDatabase, type Database } from "../storage/database";
|
import { DataBase, setDatabase, type Database } from "../storage/database";
|
||||||
import { forageStorage, getUnpargeables, isNodeServer, isTauri, openURL } from "../storage/globalApi";
|
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 { BaseDirectory, exists, readBinaryFile, readDir, writeBinaryFile } from "@tauri-apps/api/fs";
|
||||||
import { language } from "../../lang";
|
import { language } from "../../lang";
|
||||||
import { relaunch } from '@tauri-apps/api/process';
|
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 { cloneDeep, isEqual, last } from "lodash";
|
||||||
import { sleep } from "../util";
|
import { sleep } from "../util";
|
||||||
import { hubURL } from "../characterCards";
|
import { hubURL } from "../characterCards";
|
||||||
|
import { decodeRisuSave, encodeRisuSave } from "../storage/risuSave";
|
||||||
|
|
||||||
export async function checkDriver(type:'save'|'load'|'loadtauri'|'savetauri'|'reftoken'){
|
export async function checkDriver(type:'save'|'load'|'loadtauri'|'savetauri'|'reftoken'){
|
||||||
const CLIENT_ID = '580075990041-l26k2d3c0nemmqiu3d3aag01npfrkn76.apps.googleusercontent.com';
|
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 = encodeRisuSave(get(DataBase))
|
||||||
const dbData = pako.deflate(
|
|
||||||
Buffer.from(dbjson, 'utf-8')
|
|
||||||
)
|
|
||||||
|
|
||||||
alertStore.set({
|
alertStore.set({
|
||||||
type: "wait",
|
type: "wait",
|
||||||
@@ -355,7 +352,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 selectedIndex = (await alertSelect([language.loadLatest, language.loadOthers]) === '0') ? 0 : parseInt(await alertSelect(selectables))
|
||||||
const selectedDb = dbs[selectedIndex][0]
|
const selectedDb = dbs[selectedIndex][0]
|
||||||
const decompressedDb:Database = JSON.parse(Buffer.from(pako.inflate(await getFileData(ACCESS_TOKEN, selectedDb.id))).toString('utf-8'))
|
const decompressedDb:Database = decodeRisuSave(await getFileData(ACCESS_TOKEN, selectedDb.id))
|
||||||
return decompressedDb
|
return decompressedDb
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,10 +402,7 @@ async function loadDrive(ACCESS_TOKEN:string, mode: 'backup'|'sync'):Promise<voi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
db.didFirstSetup = true
|
db.didFirstSetup = true
|
||||||
const dbjson = JSON.stringify(db)
|
const dbData = encodeRisuSave(db)
|
||||||
const dbData = pako.deflate(
|
|
||||||
Buffer.from(dbjson, 'utf-8')
|
|
||||||
)
|
|
||||||
|
|
||||||
if(isTauri){
|
if(isTauri){
|
||||||
await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData})
|
await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData})
|
||||||
|
|||||||
@@ -58,24 +58,35 @@ DOMPurify.addHook("uponSanitizeAttribute", (node, data) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export async function ParseMarkdown(data:string, char:(character | groupChat) = null, mode:'normal'|'back' = 'normal') {
|
async function parseAdditionalAssets(data:string, char:character, mode:'normal'|'back'){
|
||||||
if(char && char.type !== 'group'){
|
if(char.additionalAssets){
|
||||||
if(char.additionalAssets){
|
for(const asset of char.additionalAssets){
|
||||||
for(const asset of char.additionalAssets){
|
const assetPath = await getFileSrc(asset[1])
|
||||||
const assetPath = await getFileSrc(asset[1])
|
data = data.replaceAll(`{{raw::${asset[0]}}}`, assetPath).
|
||||||
data = data.replaceAll(`{{raw::${asset[0]}}}`, assetPath).
|
replaceAll(`{{img::${asset[0]}}}`,`<img src="${assetPath}" alt="${asset[0]}"/>`)
|
||||||
replaceAll(`{{img::${asset[0]}}}`,`<img src="${assetPath}" alt="${asset[0]}"/>`)
|
.replaceAll(`{{video::${asset[0]}}}`,`<video controls autoplay loop><source src="${assetPath}" type="video/mp4"></video>`)
|
||||||
.replaceAll(`{{video::${asset[0]}}}`,`<video controls autoplay loop><source src="${assetPath}" type="video/mp4"></video>`)
|
.replaceAll(`{{audio::${asset[0]}}}`,`<audio controls autoplay loop><source src="${assetPath}" type="audio/mpeg"></audio>`)
|
||||||
.replaceAll(`{{audio::${asset[0]}}}`,`<audio controls autoplay loop><source src="${assetPath}" type="audio/mpeg"></audio>`)
|
if(mode === 'back'){
|
||||||
if(mode === 'back'){
|
data = data.replaceAll(`{{bg::${asset[0]}}}`, `<div style="width:100%;height:100%;background: linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)),url(${assetPath}); background-size: cover;"></div>`)
|
||||||
data = data.replaceAll(`{{bg::${asset[0]}}}`, `<div style="width:100%;height:100%;background: linear-gradient(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)),url(${assetPath}); background-size: cover;"></div>`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function ParseMarkdown(data:string, char:(character | groupChat) = null, mode:'normal'|'back' = 'normal') {
|
||||||
|
let firstParsed = ''
|
||||||
|
if(char && char.type !== 'group'){
|
||||||
|
data = await parseAdditionalAssets(data, char, mode)
|
||||||
|
firstParsed = data
|
||||||
|
}
|
||||||
if(char){
|
if(char){
|
||||||
data = processScript(char, data, 'editdisplay')
|
data = processScript(char, data, 'editdisplay')
|
||||||
}
|
}
|
||||||
|
if(firstParsed !== data && char && char.type !== 'group'){
|
||||||
|
data = await parseAdditionalAssets(data, char, mode)
|
||||||
|
}
|
||||||
return DOMPurify.sanitize(convertor.makeHtml(data), {
|
return DOMPurify.sanitize(convertor.makeHtml(data), {
|
||||||
ADD_TAGS: ["iframe"],
|
ADD_TAGS: ["iframe"],
|
||||||
ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling"],
|
ADD_ATTR: ["allow", "allowfullscreen", "frameborder", "scrolling"],
|
||||||
|
|||||||
40
src/ts/process/deepai.ts
Normal file
40
src/ts/process/deepai.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import md5 from "blueimp-md5";
|
||||||
|
import { globalFetch } from "../storage/globalApi";
|
||||||
|
import type { OpenAIChat } from ".";
|
||||||
|
|
||||||
|
function randomBytes(size: number): Uint8Array {
|
||||||
|
const array = new Uint8Array(size);
|
||||||
|
return crypto.getRandomValues(array);
|
||||||
|
}
|
||||||
|
export async function createDeep(messages: OpenAIChat[]) {
|
||||||
|
const userAgent = navigator.userAgent;
|
||||||
|
|
||||||
|
const part1 = Math.floor(Math.random() * Math.pow(10, 11)).toString();
|
||||||
|
|
||||||
|
const md5Text = (text: string): string => {
|
||||||
|
return md5(text).split('').reverse().join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
const part2 = md5Text(userAgent + md5Text(userAgent + md5Text(userAgent + part1 + "x")));
|
||||||
|
|
||||||
|
const apiKey = `tryit-${part1}-${part2}`;
|
||||||
|
|
||||||
|
const headers = {
|
||||||
|
"api-key": apiKey,
|
||||||
|
"user-agent": userAgent
|
||||||
|
};
|
||||||
|
|
||||||
|
const body = new URLSearchParams();
|
||||||
|
body.append("chat_style", "chat");
|
||||||
|
console.log(messages);
|
||||||
|
body.append("chatHistory", JSON.stringify(messages));
|
||||||
|
|
||||||
|
const response = await globalFetch("https://api.deepai.org/chat_response", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: headers,
|
||||||
|
body: body,
|
||||||
|
rawResponse: true
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
@@ -139,6 +139,11 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
maxContextTokens = 8000
|
maxContextTokens = 8000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(db.aiModel === 'deepai'){
|
||||||
|
if(maxContextTokens > 3000){
|
||||||
|
maxContextTokens = 3000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
let unformated = {
|
let unformated = {
|
||||||
@@ -154,7 +159,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!currentChar.utilityBot){
|
if(!currentChar.utilityBot){
|
||||||
const mainp = currentChar.systemPrompt || db.mainPrompt
|
const mainp = currentChar.systemPrompt?.replaceAll('{{original}}', db.mainPrompt) || db.mainPrompt
|
||||||
|
|
||||||
|
|
||||||
function formatPrompt(data:string){
|
function formatPrompt(data:string){
|
||||||
@@ -183,7 +188,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
|
|||||||
unformated.jailbreak.push(...formatPrompt(replacePlaceholders(db.jailbreak, currentChar.name)))
|
unformated.jailbreak.push(...formatPrompt(replacePlaceholders(db.jailbreak, currentChar.name)))
|
||||||
}
|
}
|
||||||
|
|
||||||
unformated.globalNote.push(...formatPrompt(replacePlaceholders(currentChar.replaceGlobalNote || db.globalNote, currentChar.name)))
|
unformated.globalNote.push(...formatPrompt(replacePlaceholders(currentChar.replaceGlobalNote?.replaceAll('{{original}}', db.globalNote) || db.globalNote, currentChar.name)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if(currentChat.note){
|
if(currentChat.note){
|
||||||
|
|||||||
33
src/ts/process/lua.ts
Normal file
33
src/ts/process/lua.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { get } from "svelte/store";
|
||||||
|
import { DataBase, type character } from "../storage/database";
|
||||||
|
import type {LuaEngine} from 'wasmoon'
|
||||||
|
import { selectedCharID } from "../stores";
|
||||||
|
|
||||||
|
let lua: LuaEngine = null
|
||||||
|
|
||||||
|
|
||||||
|
export class CharacterLua{
|
||||||
|
char:character
|
||||||
|
constructor(char:character){
|
||||||
|
this.char = char
|
||||||
|
}
|
||||||
|
async init(){
|
||||||
|
if(!lua){
|
||||||
|
const factory = new (await import("wasmoon")).LuaFactory
|
||||||
|
lua = await factory.createEngine()
|
||||||
|
lua.global.set('getChat', () => {
|
||||||
|
const cha = get(DataBase).characters[get(selectedCharID)]
|
||||||
|
return cha.chats[cha.chatPage].message
|
||||||
|
})
|
||||||
|
lua.global.set('setChat', () => {
|
||||||
|
const cha = get(DataBase).characters[get(selectedCharID)]
|
||||||
|
return cha.chats[cha.chatPage].message
|
||||||
|
})
|
||||||
|
lua.global.set('doSend', (a:string) => {
|
||||||
|
console.log(a)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import { language } from "../../lang";
|
|||||||
import { stringlizeChat, unstringlizeChat } from "./stringlize";
|
import { stringlizeChat, unstringlizeChat } from "./stringlize";
|
||||||
import { globalFetch, isTauri } from "../storage/globalApi";
|
import { globalFetch, isTauri } from "../storage/globalApi";
|
||||||
import { sleep } from "../util";
|
import { sleep } from "../util";
|
||||||
|
import { createDeep } from "./deepai";
|
||||||
|
|
||||||
interface requestDataArgument{
|
interface requestDataArgument{
|
||||||
formated: OpenAIChat[]
|
formated: OpenAIChat[]
|
||||||
@@ -183,6 +184,13 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(da.headers.get('Content-Type') !== 'text/event-stream'){
|
||||||
|
return {
|
||||||
|
type: "fail",
|
||||||
|
result: await da.text()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let dataUint = new Uint8Array([])
|
let dataUint = new Uint8Array([])
|
||||||
|
|
||||||
const transtream = new TransformStream<Uint8Array, string>( {
|
const transtream = new TransformStream<Uint8Array, string>( {
|
||||||
@@ -572,6 +580,40 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model'
|
|||||||
'result': unstringlizeChat(result, formated, currentChar?.name ?? '')
|
'result': unstringlizeChat(result, formated, currentChar?.name ?? '')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case "deepai":{
|
||||||
|
|
||||||
|
for(let i=0;i<formated.length;i++){
|
||||||
|
delete formated[i].memo
|
||||||
|
delete formated[i].name
|
||||||
|
if(arg.isGroupChat && formated[i].name && formated[i].role === 'assistant'){
|
||||||
|
formated[i].content = formated[i].name + ": " + formated[i].content
|
||||||
|
}
|
||||||
|
if(formated[i].role !== 'assistant' && formated[i].role !== 'user'){
|
||||||
|
formated[i].content = formated[i].role + ": " + formated[i].content
|
||||||
|
formated[i].role = 'assistant'
|
||||||
|
}
|
||||||
|
formated[i].name = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await createDeep([{
|
||||||
|
role: 'user',
|
||||||
|
content: stringlizeChat(formated, currentChar?.name ?? '')
|
||||||
|
}])
|
||||||
|
|
||||||
|
if(!response.ok){
|
||||||
|
return {
|
||||||
|
type: 'fail',
|
||||||
|
result: response.data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = Buffer.from(response.data).toString('utf-8')
|
||||||
|
|
||||||
|
return {
|
||||||
|
'type': 'success',
|
||||||
|
'result': result
|
||||||
|
}
|
||||||
|
}
|
||||||
default:{
|
default:{
|
||||||
if(aiModel.startsWith('claude')){
|
if(aiModel.startsWith('claude')){
|
||||||
for(let i=0;i<formated.length;i++){
|
for(let i=0;i<formated.length;i++){
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { defaultAutoSuggestPrompt, defaultJailbreak, defaultMainPrompt } from '.
|
|||||||
|
|
||||||
export const DataBase = writable({} as any as Database)
|
export const DataBase = writable({} as any as Database)
|
||||||
export const loadedStore = writable(false)
|
export const loadedStore = writable(false)
|
||||||
export let appVer = '1.26.0'
|
export let appVer = '1.27.1'
|
||||||
|
|
||||||
export function setDatabase(data:Database){
|
export function setDatabase(data:Database){
|
||||||
if(checkNullish(data.characters)){
|
if(checkNullish(data.characters)){
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import { appDataDir, join } from "@tauri-apps/api/path";
|
|||||||
import { get } from "svelte/store";
|
import { get } from "svelte/store";
|
||||||
import {open} from '@tauri-apps/api/shell'
|
import {open} from '@tauri-apps/api/shell'
|
||||||
import { DataBase, loadedStore, setDatabase, type Database, updateTextTheme, defaultSdDataFunc } from "./database";
|
import { DataBase, loadedStore, setDatabase, type Database, updateTextTheme, defaultSdDataFunc } from "./database";
|
||||||
import pako from "pako";
|
|
||||||
import { appWindow } from "@tauri-apps/api/window";
|
import { appWindow } from "@tauri-apps/api/window";
|
||||||
import { checkOldDomain, checkUpdate } from "../update";
|
import { checkOldDomain, checkUpdate } from "../update";
|
||||||
import { selectedCharID } from "../stores";
|
import { selectedCharID } from "../stores";
|
||||||
@@ -21,6 +20,7 @@ import { cloneDeep } from "lodash";
|
|||||||
import { NodeStorage } from "./nodeStorage";
|
import { NodeStorage } from "./nodeStorage";
|
||||||
import { defaultJailbreak, defaultMainPrompt, oldJailbreak, oldMainPrompt } from "./defaultPrompts";
|
import { defaultJailbreak, defaultMainPrompt, oldJailbreak, oldMainPrompt } from "./defaultPrompts";
|
||||||
import { loadRisuAccountData } from "../drive/accounter";
|
import { loadRisuAccountData } from "../drive/accounter";
|
||||||
|
import { decodeRisuSave, encodeRisuSave } from "./risuSave";
|
||||||
|
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
export const isTauri = !!window.__TAURI__
|
export const isTauri = !!window.__TAURI__
|
||||||
@@ -200,14 +200,14 @@ let lastSave = ''
|
|||||||
|
|
||||||
export async function saveDb(){
|
export async function saveDb(){
|
||||||
lastSave =JSON.stringify(get(DataBase))
|
lastSave =JSON.stringify(get(DataBase))
|
||||||
|
let changed = false
|
||||||
syncDrive()
|
syncDrive()
|
||||||
|
DataBase.subscribe(() => {
|
||||||
|
changed = true
|
||||||
|
})
|
||||||
while(true){
|
while(true){
|
||||||
const dbjson = JSON.stringify(get(DataBase))
|
if(changed){
|
||||||
if(dbjson !== lastSave){
|
const dbData = encodeRisuSave(get(DataBase))
|
||||||
lastSave = dbjson
|
|
||||||
const dbData = pako.deflate(
|
|
||||||
Buffer.from(dbjson, 'utf-8')
|
|
||||||
)
|
|
||||||
if(isTauri){
|
if(isTauri){
|
||||||
await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData})
|
await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData})
|
||||||
await writeBinaryFile(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData, {dir: BaseDirectory.AppData})
|
await writeBinaryFile(`database/dbbackup-${(Date.now()/100).toFixed()}.bin`, dbData, {dir: BaseDirectory.AppData})
|
||||||
@@ -279,13 +279,13 @@ export async function loadData() {
|
|||||||
}
|
}
|
||||||
if(!await exists('database/database.bin', {dir: BaseDirectory.AppData})){
|
if(!await exists('database/database.bin', {dir: BaseDirectory.AppData})){
|
||||||
await writeBinaryFile('database/database.bin',
|
await writeBinaryFile('database/database.bin',
|
||||||
pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8'))
|
encodeRisuSave({})
|
||||||
,{dir: BaseDirectory.AppData})
|
,{dir: BaseDirectory.AppData})
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
setDatabase(
|
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) {
|
} catch (error) {
|
||||||
const backups = await getDbBackups()
|
const backups = await getDbBackups()
|
||||||
let backupLoaded = false
|
let backupLoaded = false
|
||||||
@@ -293,7 +293,7 @@ export async function loadData() {
|
|||||||
try {
|
try {
|
||||||
const backupData = await readBinaryFile(`database/dbbackup-${backup}.bin`,{dir: BaseDirectory.AppData})
|
const backupData = await readBinaryFile(`database/dbbackup-${backup}.bin`,{dir: BaseDirectory.AppData})
|
||||||
setDatabase(
|
setDatabase(
|
||||||
JSON.parse(Buffer.from(pako.inflate(Buffer.from(backupData))).toString('utf-8'))
|
decodeRisuSave(backupData)
|
||||||
)
|
)
|
||||||
backupLoaded = true
|
backupLoaded = true
|
||||||
} catch (error) {}
|
} catch (error) {}
|
||||||
@@ -309,12 +309,11 @@ export async function loadData() {
|
|||||||
else{
|
else{
|
||||||
let gotStorage:Uint8Array = await forageStorage.getItem('database/database.bin')
|
let gotStorage:Uint8Array = await forageStorage.getItem('database/database.bin')
|
||||||
if(checkNullish(gotStorage)){
|
if(checkNullish(gotStorage)){
|
||||||
gotStorage = pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8'))
|
await forageStorage.setItem('database/database.bin', encodeRisuSave({}))
|
||||||
await forageStorage.setItem('database/database.bin', gotStorage)
|
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
setDatabase(
|
setDatabase(
|
||||||
JSON.parse(Buffer.from(pako.inflate(Buffer.from(gotStorage))).toString('utf-8'))
|
decodeRisuSave(gotStorage)
|
||||||
)
|
)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const backups = await getDbBackups()
|
const backups = await getDbBackups()
|
||||||
@@ -323,7 +322,7 @@ export async function loadData() {
|
|||||||
try {
|
try {
|
||||||
const backupData:Uint8Array = await forageStorage.getItem(`database/dbbackup-${backup}.bin`)
|
const backupData:Uint8Array = await forageStorage.getItem(`database/dbbackup-${backup}.bin`)
|
||||||
setDatabase(
|
setDatabase(
|
||||||
JSON.parse(Buffer.from(pako.inflate(Buffer.from(backupData))).toString('utf-8'))
|
decodeRisuSave(backupData)
|
||||||
)
|
)
|
||||||
backupLoaded = true
|
backupLoaded = true
|
||||||
} catch (error) {}
|
} catch (error) {}
|
||||||
@@ -380,7 +379,11 @@ export async function loadData() {
|
|||||||
|
|
||||||
const knownHostes = ["localhost","127.0.0.1","api.openai.com"]
|
const knownHostes = ["localhost","127.0.0.1","api.openai.com"]
|
||||||
|
|
||||||
export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:string]:string}, rawResponse?:boolean, method?:"POST"|"GET", abortSignal?:AbortSignal} = {}) {
|
export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:string]:string}, rawResponse?:boolean, method?:"POST"|"GET", abortSignal?:AbortSignal} = {}): Promise<{
|
||||||
|
ok: boolean;
|
||||||
|
data: any;
|
||||||
|
headers:{[key:string]:string}
|
||||||
|
}> {
|
||||||
try {
|
try {
|
||||||
const db = get(DataBase)
|
const db = get(DataBase)
|
||||||
const method = arg.method ?? "POST"
|
const method = arg.method ?? "POST"
|
||||||
@@ -430,7 +433,8 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300)
|
addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300)
|
||||||
return {
|
return {
|
||||||
ok: da.ok && da.status >= 200 && da.status < 300,
|
ok: da.ok && da.status >= 200 && da.status < 300,
|
||||||
data: new Uint8Array(await da.arrayBuffer())
|
data: new Uint8Array(await da.arrayBuffer()),
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -438,7 +442,8 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
|
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
|
||||||
return {
|
return {
|
||||||
ok: da.ok && da.status >= 200 && da.status < 300,
|
ok: da.ok && da.status >= 200 && da.status < 300,
|
||||||
data: dat
|
data: dat,
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,6 +451,7 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
return {
|
return {
|
||||||
ok: false,
|
ok: false,
|
||||||
data: `${error}`,
|
data: `${error}`,
|
||||||
|
headers: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -469,7 +475,8 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300)
|
addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300)
|
||||||
return {
|
return {
|
||||||
ok: da.ok && da.status >= 200 && da.status < 300,
|
ok: da.ok && da.status >= 200 && da.status < 300,
|
||||||
data: new Uint8Array(await da.arrayBuffer())
|
data: new Uint8Array(await da.arrayBuffer()),
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -477,7 +484,8 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
|
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
|
||||||
return {
|
return {
|
||||||
ok: da.ok && da.status >= 200 && da.status < 300,
|
ok: da.ok && da.status >= 200 && da.status < 300,
|
||||||
data: dat
|
data: dat,
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -485,6 +493,7 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
return {
|
return {
|
||||||
ok: false,
|
ok: false,
|
||||||
data: `${error}`,
|
data: `${error}`,
|
||||||
|
headers: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -492,20 +501,33 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
if(db.requester === 'new'){
|
if(db.requester === 'new'){
|
||||||
try {
|
try {
|
||||||
let preHeader = arg.headers ?? {}
|
let preHeader = arg.headers ?? {}
|
||||||
preHeader["Content-Type"] = `application/json`
|
let body:any
|
||||||
const body = JSON.stringify(arg.body)
|
if(arg.body instanceof URLSearchParams){
|
||||||
|
const argBody = arg.body as URLSearchParams
|
||||||
|
body = argBody.toString()
|
||||||
|
preHeader["Content-Type"] = `application/x-www-form-urlencoded`
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
body = JSON.stringify(arg.body)
|
||||||
|
preHeader["Content-Type"] = `application/json`
|
||||||
|
}
|
||||||
|
console.log(body)
|
||||||
const header = JSON.stringify(preHeader)
|
const header = JSON.stringify(preHeader)
|
||||||
const res:string = await invoke('native_request', {url:url, body:body, header:header, method: method})
|
const res:string = await invoke('native_request', {url:url, body:body, header:header, method: method})
|
||||||
const d:{
|
const d:{
|
||||||
success: boolean
|
success: boolean
|
||||||
body:string
|
body:string,
|
||||||
|
headers: {[key:string]:string}
|
||||||
} = JSON.parse(res)
|
} = JSON.parse(res)
|
||||||
|
|
||||||
|
const resHeader = d.headers ?? {}
|
||||||
|
|
||||||
if(!d.success){
|
if(!d.success){
|
||||||
addFetchLog(Buffer.from(d.body, 'base64').toString('utf-8'), false)
|
addFetchLog(Buffer.from(d.body, 'base64').toString('utf-8'), false)
|
||||||
return {
|
return {
|
||||||
ok:false,
|
ok:false,
|
||||||
data: Buffer.from(d.body, 'base64').toString('utf-8')
|
data: Buffer.from(d.body, 'base64').toString('utf-8'),
|
||||||
|
headers: resHeader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -513,14 +535,16 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
addFetchLog("Uint8Array Response", true)
|
addFetchLog("Uint8Array Response", true)
|
||||||
return {
|
return {
|
||||||
ok:true,
|
ok:true,
|
||||||
data: new Uint8Array(Buffer.from(d.body, 'base64'))
|
data: new Uint8Array(Buffer.from(d.body, 'base64')),
|
||||||
|
headers: resHeader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
addFetchLog(JSON.parse(Buffer.from(d.body, 'base64').toString('utf-8')), true)
|
addFetchLog(JSON.parse(Buffer.from(d.body, 'base64').toString('utf-8')), true)
|
||||||
return {
|
return {
|
||||||
ok:true,
|
ok:true,
|
||||||
data: JSON.parse(Buffer.from(d.body, 'base64').toString('utf-8'))
|
data: JSON.parse(Buffer.from(d.body, 'base64').toString('utf-8')),
|
||||||
|
headers: resHeader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -528,6 +552,7 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
return {
|
return {
|
||||||
ok: false,
|
ok: false,
|
||||||
data: `${error}`,
|
data: `${error}`,
|
||||||
|
headers: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -549,6 +574,7 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
return {
|
return {
|
||||||
ok: d.ok,
|
ok: d.ok,
|
||||||
data: new Uint8Array(d.data as number[]),
|
data: new Uint8Array(d.data as number[]),
|
||||||
|
headers: d.headers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -556,20 +582,33 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
return {
|
return {
|
||||||
ok: d.ok,
|
ok: d.ok,
|
||||||
data: d.data,
|
data: d.data,
|
||||||
|
headers: d.headers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
try {
|
try {
|
||||||
let headers = arg.headers ?? {}
|
let body:any
|
||||||
if(!headers["Content-Type"]){
|
if(arg.body instanceof URLSearchParams){
|
||||||
headers["Content-Type"] = `application/json`
|
const argBody = arg.body as URLSearchParams
|
||||||
|
body = argBody.toString()
|
||||||
|
let headers = arg.headers ?? {}
|
||||||
|
if(!headers["Content-Type"]){
|
||||||
|
headers["Content-Type"] = `application/x-www-form-urlencoded`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
body = JSON.stringify(arg.body)
|
||||||
|
let headers = arg.headers ?? {}
|
||||||
|
if(!headers["Content-Type"]){
|
||||||
|
headers["Content-Type"] = `application/json`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(arg.rawResponse){
|
if(arg.rawResponse){
|
||||||
const furl = `/proxy?url=${encodeURIComponent(url)}`
|
const furl = `/proxy?url=${encodeURIComponent(url)}`
|
||||||
|
|
||||||
const da = await fetch(furl, {
|
const da = await fetch(furl, {
|
||||||
body: JSON.stringify(arg.body),
|
body: body,
|
||||||
headers: {
|
headers: {
|
||||||
"risu-header": encodeURIComponent(JSON.stringify(arg.headers)),
|
"risu-header": encodeURIComponent(JSON.stringify(arg.headers)),
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
@@ -581,40 +620,53 @@ export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:stri
|
|||||||
addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300)
|
addFetchLog("Uint8Array Response", da.ok && da.status >= 200 && da.status < 300)
|
||||||
return {
|
return {
|
||||||
ok: da.ok && da.status >= 200 && da.status < 300,
|
ok: da.ok && da.status >= 200 && da.status < 300,
|
||||||
data: new Uint8Array(await da.arrayBuffer())
|
data: new Uint8Array(await da.arrayBuffer()),
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
const furl = `/proxy?url=${encodeURIComponent(url)}`
|
const furl = `/proxy?url=${encodeURIComponent(url)}`
|
||||||
|
|
||||||
const da = await fetch(furl, {
|
const da = await fetch(furl, {
|
||||||
body: JSON.stringify(arg.body),
|
body: body,
|
||||||
headers: {
|
headers: {
|
||||||
"risu-header": encodeURIComponent(JSON.stringify(arg.headers)),
|
"risu-header": encodeURIComponent(JSON.stringify(arg.headers)),
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
},
|
},
|
||||||
method: method
|
method: method
|
||||||
})
|
})
|
||||||
|
const daText = await da.text()
|
||||||
const dat = await da.json()
|
try {
|
||||||
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
|
const dat = JSON.parse(daText)
|
||||||
return {
|
addFetchLog(dat, da.ok && da.status >= 200 && da.status < 300)
|
||||||
ok: da.ok && da.status >= 200 && da.status < 300,
|
return {
|
||||||
data: dat
|
ok: da.ok && da.status >= 200 && da.status < 300,
|
||||||
|
data: dat,
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
addFetchLog(daText, false)
|
||||||
|
return {
|
||||||
|
ok:false,
|
||||||
|
data: daText,
|
||||||
|
headers: Object.fromEntries(da.headers)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
return {
|
return {
|
||||||
ok:false,
|
ok:false,
|
||||||
data: `${error}`
|
data: `${error}`,
|
||||||
|
headers: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return {
|
return {
|
||||||
ok:false,
|
ok:false,
|
||||||
data: `${error}`
|
data: `${error}`,
|
||||||
|
headers: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -834,4 +886,14 @@ export function openURL(url:string){
|
|||||||
else{
|
else{
|
||||||
window.open(url, "_blank")
|
window.open(url, "_blank")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formDataToString(formData: FormData): string {
|
||||||
|
const params: string[] = [];
|
||||||
|
|
||||||
|
for (const [name, value] of formData.entries()) {
|
||||||
|
params.push(`${encodeURIComponent(name)}=${encodeURIComponent(value.toString())}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return params.join('&');
|
||||||
|
}
|
||||||
31
src/ts/storage/risuSave.ts
Normal file
31
src/ts/storage/risuSave.ts
Normal file
@@ -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'))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
{"version":"1.26.0"}
|
{"version":"1.27.1"}
|
||||||
Reference in New Issue
Block a user