This commit is contained in:
lloydzhou 2024-10-09 16:12:01 +08:00
parent 19b42aac5d
commit 3e63d405c1
1 changed files with 20 additions and 17 deletions

View File

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