diff --git a/src/lib/ChatScreens/DefaultChatScreen.svelte b/src/lib/ChatScreens/DefaultChatScreen.svelte index b9adeb83..11df5224 100644 --- a/src/lib/ChatScreens/DefaultChatScreen.svelte +++ b/src/lib/ChatScreens/DefaultChatScreen.svelte @@ -143,10 +143,13 @@ } } + let abortController:null|AbortController = null + async function sendChatMain(saveReroll = false) { messageInput = '' + abortController = new AbortController() try { - await sendChat() + await sendChat(-1, {signal:abortController.signal}) } catch (error) { console.error(error) alertError(`${error}`) @@ -161,6 +164,13 @@ } } + function abortChat(){ + if(abortController){ + console.log('abort') + abortController.abort() + } + } + async function runAutoMode() { if(autoMode){ autoMode = false @@ -323,7 +333,7 @@ {#if $doingChat || doingChatInputTranslate}
+ class="mr-2 bg-selected flex justify-center items-center text-white w-12 h-12 rounded-md hover:bg-green-500 transition-colors" on:click={abortChat}>
diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts index e5654363..13145633 100644 --- a/src/ts/process/index.ts +++ b/src/ts/process/index.ts @@ -32,9 +32,14 @@ export interface OpenAIChatFull extends OpenAIChat{ } export const doingChat = writable(false) +export const abortChat = writable(false) -export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:number} = {}):Promise { +export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:number,signal?:AbortSignal} = {}):Promise { + + const abortSignal = arg.signal ?? (new AbortController()).signal + + let isAborted = false let findCharCache:{[key:string]:character} = {} function findCharacterbyIdwithCache(id:string){ const d = findCharCache[id] @@ -98,7 +103,8 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n } for(let i=0;i void = () => {} + + const abortPromise = (new Promise<"aborted">((res,rej) => { + abortFn = () => { + res("aborted") + } + arg.abortSignal?.addEventListener('abort', abortFn) + })) + + const result = await Promise.any([fetchPromise,abortPromise]) + + arg.abortSignal.removeEventListener('abort', abortFn) + + if(result === 'aborted'){ return { - ok: d.ok, - data: new Uint8Array(d.data as number[]), - headers: d.headers + ok: false, + data: 'aborted', + headers: {} + } + } + + if(arg.rawResponse){ + addFetchLog("Uint8Array Response", result.ok) + return { + ok: result.ok, + data: new Uint8Array(result.data as number[]), + headers: result.headers } } else{ - addFetchLog(d.data, d.ok) + addFetchLog(result.data, result.ok) return { - ok: d.ok, - data: d.data, - headers: d.headers + ok: result.ok, + data: result.data, + headers: result.headers } } }