From 698021baf1891cd00450920db54b14851e9e157e Mon Sep 17 00:00:00 2001 From: Webifi Date: Thu, 15 Jun 2023 13:48:30 -0500 Subject: [PATCH] Fix memory leak with abort controller --- src/lib/ChatRequest.svelte | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/lib/ChatRequest.svelte b/src/lib/ChatRequest.svelte index ae51002..6c23fe5 100644 --- a/src/lib/ChatRequest.svelte +++ b/src/lib/ChatRequest.svelte @@ -47,7 +47,6 @@ export class ChatRequest { count = count || 1 _this.updating = true _this.updatingMessage = 'Generating Image...' - const signal = _this.controller.signal const size = this.chat.settings.imageGenerationSize const request: RequestImageGeneration = { prompt, @@ -55,6 +54,16 @@ export class ChatRequest { size, n: count } + // fetchEventSource doesn't seem to throw on abort, + // so we deal with it ourselves + _this.controller = new AbortController() + const signal = _this.controller.signal + const abortListener = (e:Event) => { + chatResponse.updateFromError('User aborted request.') + signal.removeEventListener('abort', abortListener) + } + signal.addEventListener('abort', abortListener) + // Create request const fetchOptions = { method: 'POST', headers: { @@ -180,7 +189,15 @@ export class ChatRequest { // (streaming doesn't return counts, so we need to do it client side) chatResponse.setPromptTokenCount(promptTokenCount) + // fetchEventSource doesn't seem to throw on abort, + // so we deal with it ourselves + _this.controller = new AbortController() const signal = _this.controller.signal + const abortListener = (e:Event) => { + chatResponse.updateFromError('User aborted request.') + signal.removeEventListener('abort', abortListener) + } + signal.addEventListener('abort', abortListener) const fetchOptions = { method: 'POST', @@ -192,15 +209,6 @@ export class ChatRequest { signal } - // fetchEventSource doesn't seem to throw on abort, - // so we deal with it ourselves - const abortListener = (e:Event) => { - _this.controller = new AbortController() - chatResponse.updateFromError('User aborted request.') - signal.removeEventListener('abort', abortListener) - } - signal.addEventListener('abort', abortListener) - if (opts.streaming) { /** * Streaming request/response