mirror of
https://github.com/wassname/chatGPTBox.git
synced 2026-06-30 16:47:49 +08:00
44 lines
1.1 KiB
JavaScript
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()
|
|
}
|