From af282880f496542e652494af7ba74a3154111209 Mon Sep 17 00:00:00 2001 From: Bowen Date: Tue, 17 Oct 2023 11:32:35 +0800 Subject: [PATCH 1/2] fix: parse sse --- src/utils/fetch-sse.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/fetch-sse.mjs b/src/utils/fetch-sse.mjs index 7194bbb2..e59a219e 100644 --- a/src/utils/fetch-sse.mjs +++ b/src/utils/fetch-sse.mjs @@ -34,6 +34,7 @@ export async function fetchSSE(resource, options) { parser.feed(formattedStr) } catch (error) { console.debug('json error', error) + parser.feed(str) } } From b6954362275a378c7315162e7bcb1e8f238e0fa8 Mon Sep 17 00:00:00 2001 From: Bowen Date: Tue, 17 Oct 2023 11:43:29 +0800 Subject: [PATCH 2/2] re-order parse process --- src/utils/fetch-sse.mjs | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/utils/fetch-sse.mjs b/src/utils/fetch-sse.mjs index e59a219e..939f8bcf 100644 --- a/src/utils/fetch-sse.mjs +++ b/src/utils/fetch-sse.mjs @@ -13,30 +13,29 @@ export async function fetchSSE(resource, options) { } const parser = createParser((event) => { if (event.type === 'event') { - onMessage(event.data) + if (event.data === '[DONE]') { + onMessage(event.data) + } else { + try { + JSON.parse(event.data) + onMessage(event.data) + } catch (error) { + console.error('json error', error) + onMessage( + event.data + .replace(/^"|"$/g, '') + .replaceAll('\\"', '"') + .replaceAll('\\\\u', '\\u') + .replaceAll('\\\\n', '\\n'), + ) + } + } } }) let hasStarted = false for await (const chunk of streamAsyncIterable(resp.body)) { const str = new TextDecoder().decode(chunk) - if (!str.startsWith('{') && !str.startsWith('"{')) { - parser.feed(str) - } else { - try { - const formattedData = JSON.parse( - str - .replace(/^"|"$/g, '') - .replaceAll('\\"', '"') - .replaceAll('\\\\u', '\\u') - .replaceAll('\\\\n', '\\n'), - ) - const formattedStr = 'data: ' + JSON.stringify(formattedData) + '\n\ndata: [DONE]\n\n' - parser.feed(formattedStr) - } catch (error) { - console.debug('json error', error) - parser.feed(str) - } - } + parser.feed(str) if (!hasStarted) { hasStarted = true