Browse Source

chore: mute handle message cut off (#291)

Joel 1 year ago
parent
commit
5f38214a41
2 changed files with 38 additions and 29 deletions
  1. 1 0
      web/package.json
  2. 37 29
      web/service/base.ts

+ 1 - 0
web/package.json

@@ -44,6 +44,7 @@
     "i18next-resources-to-backend": "^1.1.3",
     "immer": "^9.0.19",
     "js-cookie": "^3.0.1",
+    "katex": "^0.16.7",
     "lodash-es": "^4.17.21",
     "negotiator": "^0.6.3",
     "next": "13.2.4",

+ 37 - 29
web/service/base.ts

@@ -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' })