diff --git a/app/utils/stream.ts b/app/utils/stream.ts index 313ec4dd5b8..2eda768f36f 100644 --- a/app/utils/stream.ts +++ b/app/utils/stream.ts @@ -28,7 +28,8 @@ export function fetch(url: string, options?: RequestInit): Promise { body = [], } = options || {}; let unlisten: Function | undefined; - let request_id = 0; + let setRequestId: Function | undefined; + const requestIdPromise = new Promise((resolve) => (setRequestId = resolve)); const ts = new TransformStream(); const writer = ts.writable.getWriter(); @@ -47,20 +48,22 @@ export function fetch(url: string, options?: RequestInit): Promise { } // @ts-ignore 2. listen response multi times, and write to Response.body window.__TAURI__.event - .listen("stream-response", (e: ResponseEvent) => { - const { request_id: rid, chunk, status } = e?.payload || {}; - if (request_id != rid) { - return; - } - if (chunk) { - writer.ready.then(() => { - writer.write(new Uint8Array(chunk)); - }); - } else if (status === 0) { - // end of body - close(); - } - }) + .listen("stream-response", (e: ResponseEvent) => + requestIdPromise.then((request_id) => { + const { request_id: rid, chunk, status } = e?.payload || {}; + if (request_id != rid) { + return; + } + if (chunk) { + writer.ready.then(() => { + writer.write(new Uint8Array(chunk)); + }); + } else if (status === 0) { + // end of body + close(); + } + }), + ) .then((u: Function) => (unlisten = u)); const headers: Record = { @@ -83,8 +86,8 @@ export function fetch(url: string, options?: RequestInit): Promise { : [], }) .then((res: StreamResponse) => { - request_id = res.request_id; - const { status, status_text: statusText, headers } = res; + const { request_id, status, status_text: statusText, headers } = res; + setRequestId?.(request_id); const response = new Response(ts.readable, { status, statusText,