Files
chatGPTBox/src/utils/fetch-sse.mjs
T
2023-10-30 23:40:33 +08:00

44 lines
1.1 KiB
JavaScript

import { createParser } from './eventsource-parser.mjs'
export async function fetchSSE(resource, options) {
const { onMessage, onStart, onEnd, onError, ...fetchOptions } = options
const resp = await fetch(resource, fetchOptions).catch(async (err) => {
await onError(err)
})
if (!resp) return
if (!resp.ok) {
await onError(resp)
return
}
const parser = createParser((event) => {
if (event.type === 'event') {
onMessage(event.data)
}
})
let hasStarted = false
const reader = resp.body.getReader()
let result
while (!(result = await reader.read()).done) {
const chunk = result.value
if (!hasStarted) {
const str = new TextDecoder().decode(chunk)
hasStarted = true
await onStart(str)
let fakeSseData
try {
const commonResponse = JSON.parse(str)
fakeSseData = 'data: ' + JSON.stringify(commonResponse) + '\n\ndata: [DONE]\n\n'
} catch (error) {
console.debug('not common response', error)
}
if (fakeSseData) {
parser.feed(new TextEncoder().encode(fakeSseData))
break
}
}
parser.feed(chunk)
}
await onEnd()
}