|
@@ -1,8 +1,11 @@
|
|
|
+import fetchStream from 'fetch-readablestream'
|
|
|
import { API_PREFIX, IS_CE_EDITION, PUBLIC_API_PREFIX } from '@/config'
|
|
|
import Toast from '@/app/components/base/toast'
|
|
|
import type { MessageEnd, MessageReplace, ThoughtItem } from '@/app/components/app/chat/type'
|
|
|
+import { isSupportNativeFetchStream } from '@/utils/stream'
|
|
|
|
|
|
const TIME_OUT = 100000
|
|
|
+const supportNativeFetchStream = isSupportNativeFetchStream()
|
|
|
|
|
|
const ContentType = {
|
|
|
json: 'application/json',
|
|
@@ -220,6 +223,9 @@ const baseFetch = <T>(
|
|
|
if (body && bodyStringify)
|
|
|
options.body = JSON.stringify(body)
|
|
|
|
|
|
+ // for those do not support native fetch stream, we use fetch-readablestream as polyfill
|
|
|
+ const doFetch = supportNativeFetchStream ? globalThis.fetch : fetchStream
|
|
|
+
|
|
|
// Handle timeout
|
|
|
return Promise.race([
|
|
|
new Promise((resolve, reject) => {
|
|
@@ -228,7 +234,7 @@ const baseFetch = <T>(
|
|
|
}, TIME_OUT)
|
|
|
}),
|
|
|
new Promise((resolve, reject) => {
|
|
|
- globalThis.fetch(urlWithPrefix, options as RequestInit)
|
|
|
+ doFetch(urlWithPrefix, options as RequestInit)
|
|
|
.then((res) => {
|
|
|
const resClone = res.clone()
|
|
|
// Error handler
|