fix: image chunk data broken

This commit is contained in:
jialin
2024-11-27 21:13:31 +08:00
parent 146bcdcf1c
commit 324bd57e3d
6 changed files with 86 additions and 12 deletions
+45 -1
View File
@@ -59,7 +59,9 @@ export const fetchChunkedData = async (params: {
};
}
const reader = response?.body?.getReader();
const decoder = new TextDecoder('utf-8');
const decoder = new TextDecoder('utf-8', {
fatal: true
});
return {
reader,
decoder
@@ -77,12 +79,54 @@ export const readStreamData = async (
}
let chunk = decoder.decode(value, { stream: true });
extractJSON(chunk).forEach((data) => {
callback?.(data);
});
await readStreamData(reader, decoder, callback);
};
export const readLargeStreamData = async (
reader: any,
decoder: TextDecoder,
callback: (data: any) => void
) => {
let buffer = '';
const processStream = async () => {
const { done, value } = await reader.read();
if (done) {
if (buffer) {
try {
extractJSON(buffer).forEach((data) => {
callback?.(data);
});
} catch (e) {
console.error('parse buffer failed:', buffer);
}
}
return;
}
// cache each chunk
buffer += decoder.decode(value, { stream: true });
const extractedData = extractJSON(buffer);
extractedData.forEach((data) => {
callback?.(data);
});
const lastIndex = buffer.lastIndexOf('}');
buffer = lastIndex !== -1 ? buffer.slice(lastIndex + 1) : buffer;
// next chunk
await processStream();
};
await processStream();
};
export const readTextEventStreamData = async (
reader: any,
decoder: TextDecoder,