|
@@ -1,4 +1,5 @@
|
|
|
-import { API_PREFIX, PUBLIC_API_PREFIX, IS_CE_EDITION } from '@/config'
|
|
|
+/* eslint-disable no-new, prefer-promise-reject-errors */
|
|
|
+import { API_PREFIX, IS_CE_EDITION, PUBLIC_API_PREFIX } from '@/config'
|
|
|
import Toast from '@/app/components/base/toast'
|
|
|
|
|
|
const TIME_OUT = 100000
|
|
@@ -46,12 +47,11 @@ function unicodeToChar(text: string) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-
|
|
|
export function format(text: string) {
|
|
|
let res = text.trim()
|
|
|
- if (res.startsWith('\n')) {
|
|
|
+ if (res.startsWith('\n'))
|
|
|
res = res.replace('\n', '')
|
|
|
- }
|
|
|
+
|
|
|
return res.replaceAll('\n', '<br/>').replaceAll('```', '')
|
|
|
}
|
|
|
|
|
@@ -77,12 +77,22 @@ const handleStream = (response: any, onData: IOnData, onCompleted?: IOnCompleted
|
|
|
lines.forEach((message) => {
|
|
|
if (message.startsWith('data: ')) { // check if it starts with data:
|
|
|
// console.log(message);
|
|
|
- bufferObj = JSON.parse(message.substring(6)) // remove data: and parse as json
|
|
|
+ try {
|
|
|
+ bufferObj = JSON.parse(message.substring(6)) // remove data: and parse as json
|
|
|
+ }
|
|
|
+ catch (e) {
|
|
|
+ // mute handle message cut off
|
|
|
+ onData('', isFirstMessage, {
|
|
|
+ conversationId: bufferObj?.conversation_id,
|
|
|
+ messageId: bufferObj?.id,
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
if (bufferObj.status === 400 || !bufferObj.event) {
|
|
|
onData('', false, {
|
|
|
conversationId: undefined,
|
|
|
messageId: '',
|
|
|
- errorMessage: bufferObj.message
|
|
|
+ errorMessage: bufferObj.message,
|
|
|
})
|
|
|
hasError = true
|
|
|
onCompleted && onCompleted(true)
|
|
@@ -97,19 +107,19 @@ const handleStream = (response: any, onData: IOnData, onCompleted?: IOnCompleted
|
|
|
}
|
|
|
})
|
|
|
buffer = lines[lines.length - 1]
|
|
|
- } catch (e) {
|
|
|
+ }
|
|
|
+ catch (e) {
|
|
|
onData('', false, {
|
|
|
conversationId: undefined,
|
|
|
messageId: '',
|
|
|
- errorMessage: e + ''
|
|
|
+ errorMessage: `${e}`,
|
|
|
})
|
|
|
hasError = true
|
|
|
onCompleted && onCompleted(true)
|
|
|
return
|
|
|
}
|
|
|
- if (!hasError) {
|
|
|
+ if (!hasError)
|
|
|
read()
|
|
|
- }
|
|
|
})
|
|
|
}
|
|
|
read()
|
|
@@ -120,8 +130,8 @@ const baseFetch = (
|
|
|
fetchOptions: any,
|
|
|
{
|
|
|
isPublicAPI = false,
|
|
|
- needAllResponseContent
|
|
|
- }: IOtherOptions
|
|
|
+ needAllResponseContent,
|
|
|
+ }: IOtherOptions,
|
|
|
) => {
|
|
|
const options = Object.assign({}, baseOptions, fetchOptions)
|
|
|
if (isPublicAPI) {
|
|
@@ -129,7 +139,7 @@ const baseFetch = (
|
|
|
options.headers.set('Authorization', `bearer ${sharedToken}`)
|
|
|
}
|
|
|
|
|
|
- let urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX
|
|
|
+ const urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX
|
|
|
let urlWithPrefix = `${urlPrefix}${url.startsWith('/') ? url : `/${url}`}`
|
|
|
|
|
|
const { method, params, body } = options
|
|
@@ -176,12 +186,14 @@ const baseFetch = (
|
|
|
bodyJson.then((data: any) => {
|
|
|
if (data.code === 'not_setup') {
|
|
|
globalThis.location.href = `${globalThis.location.origin}/install`
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
if (location.pathname === '/signin') {
|
|
|
bodyJson.then((data: any) => {
|
|
|
Toast.notify({ type: 'error', message: data.message })
|
|
|
})
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
globalThis.location.href = loginUrl
|
|
|
}
|
|
|
}
|
|
@@ -195,15 +207,13 @@ const baseFetch = (
|
|
|
new Promise(() => {
|
|
|
bodyJson.then((data: any) => {
|
|
|
Toast.notify({ type: 'error', message: data.message })
|
|
|
- if (data.code === 'already_setup') {
|
|
|
+ if (data.code === 'already_setup')
|
|
|
globalThis.location.href = `${globalThis.location.origin}/signin`
|
|
|
- }
|
|
|
})
|
|
|
})
|
|
|
break
|
|
|
// fall through
|
|
|
default:
|
|
|
- // eslint-disable-next-line no-new
|
|
|
new Promise(() => {
|
|
|
bodyJson.then((data: any) => {
|
|
|
Toast.notify({ type: 'error', message: data.message })
|
|
@@ -215,7 +225,7 @@ const baseFetch = (
|
|
|
|
|
|
// handle delete api. Delete api not return content.
|
|
|
if (res.status === 204) {
|
|
|
- resolve({ result: "success" })
|
|
|
+ resolve({ result: 'success' })
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -243,22 +253,21 @@ export const upload = (options: any): Promise<any> => {
|
|
|
...defaultOptions,
|
|
|
...options,
|
|
|
headers: { ...defaultOptions.headers, ...options.headers },
|
|
|
- };
|
|
|
- return new Promise(function (resolve, reject) {
|
|
|
+ }
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
const xhr = options.xhr
|
|
|
- xhr.open(options.method, options.url);
|
|
|
- for (const key in options.headers) {
|
|
|
- xhr.setRequestHeader(key, options.headers[key]);
|
|
|
- }
|
|
|
+ xhr.open(options.method, options.url)
|
|
|
+ for (const key in options.headers)
|
|
|
+ xhr.setRequestHeader(key, options.headers[key])
|
|
|
+
|
|
|
xhr.withCredentials = true
|
|
|
xhr.responseType = 'json'
|
|
|
xhr.onreadystatechange = function () {
|
|
|
if (xhr.readyState === 4) {
|
|
|
- if (xhr.status === 201) {
|
|
|
+ if (xhr.status === 201)
|
|
|
resolve(xhr.response)
|
|
|
- } else {
|
|
|
+ else
|
|
|
reject(xhr)
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
xhr.upload.onprogress = options.onprogress
|
|
@@ -287,7 +296,6 @@ export const ssePost = (url: string, fetchOptions: any, { isPublicAPI = false, o
|
|
|
.then((res: any) => {
|
|
|
// debugger
|
|
|
if (!/^(2|3)\d{2}$/.test(res.status)) {
|
|
|
- // eslint-disable-next-line no-new
|
|
|
new Promise(() => {
|
|
|
res.json().then((data: any) => {
|
|
|
Toast.notify({ type: 'error', message: data.message || 'Server Error' })
|