Files
gpustack-ui/src/utils/fetch-chunk-data.ts
T
2024-11-25 20:07:17 +08:00

104 lines
2.2 KiB
TypeScript

import qs from 'query-string';
const extractStreamRegx = /data:\s*({.*?})(?=\n|$)/g;
const extractJSON = (dataStr: string) => {
let match;
const results: any[] = [];
if (!dataStr) {
return results;
}
while ((match = extractStreamRegx.exec(dataStr)) !== null) {
try {
const jsonData = JSON.parse(match[1]);
results.push(jsonData);
} catch (error) {
console.error('JSON parse error:', error, 'for match:', match[1]);
continue;
}
}
return results;
};
/**
*
* @param params data: for post request, params: for get request
* @returns
*/
export const fetchChunkedData = async (params: {
data?: any;
url: string;
params?: any;
signal?: AbortSignal;
method?: string;
headers?: any;
}) => {
const method = params.method || 'POST';
let url = params.url;
if (params.params) {
url = `${url}?${qs.stringify(params.params)}`;
}
const response = await fetch(url, {
method,
body: method === 'POST' ? JSON.stringify(params.data) : null,
signal: params.signal,
headers: {
'Content-Type': 'application/json',
...params.headers
}
});
console.log('response====', response);
if (!response.ok) {
return {
error: true,
data: await response.json()
};
}
const reader = response?.body?.getReader();
const decoder = new TextDecoder('utf-8');
return {
reader,
decoder
};
};
export const readStreamData = async (
reader: any,
decoder: TextDecoder,
callback: (data: any) => void
) => {
const { done, value } = await reader.read();
console.log('done====', done, value);
if (done) {
return;
}
let chunk = decoder.decode(value, { stream: true });
extractJSON(chunk).forEach((data) => {
console.log('data====', data);
callback?.(data);
});
// callback(chunk);
await readStreamData(reader, decoder, callback);
};
export const readTextEventStreamData = async (
reader: any,
decoder: TextDecoder,
callback: (data: any) => void
) => {
const { done, value } = await reader.read();
if (done) {
return;
}
let chunk = decoder.decode(value, { stream: true });
callback(chunk);
await readTextEventStreamData(reader, decoder, callback);
};