1
1
import { useEffect } from 'react' ;
2
- import { useRecoilValue , useResetRecoilState , useSetRecoilState } from 'recoil' ;
3
- import { SSE , createPayload } from 'librechat-data-provider' ;
2
+ import { useResetRecoilState , useSetRecoilState } from 'recoil' ;
3
+ import { SSE , createPayload , tMessageSchema , tConversationSchema } from 'librechat-data-provider' ;
4
+ import type { TPlugin , TMessage , TConversation , TSubmission } from 'librechat-data-provider' ;
4
5
import { useAuthContext } from '~/hooks/AuthContext' ;
5
6
import store from '~/store' ;
6
7
7
- export default function MessageHandler ( ) {
8
- const submission = useRecoilValue ( store . submission ) ;
9
- const setIsSubmitting = useSetRecoilState ( store . isSubmitting ) ;
8
+ type TResData = {
9
+ plugin : TPlugin ;
10
+ final ?: boolean ;
11
+ initial ?: boolean ;
12
+ requestMessage : TMessage ;
13
+ responseMessage : TMessage ;
14
+ conversation : TConversation ;
15
+ } ;
16
+
17
+ export default function useServerStream ( submission : TSubmission | null ) {
10
18
const setMessages = useSetRecoilState ( store . messages ) ;
19
+ const setIsSubmitting = useSetRecoilState ( store . isSubmitting ) ;
11
20
const setConversation = useSetRecoilState ( store . conversation ) ;
12
21
const resetLatestMessage = useResetRecoilState ( store . latestMessage ) ;
13
22
const { token } = useAuthContext ( ) ;
14
23
15
24
const { refreshConversations } = store . useConversations ( ) ;
16
25
17
- const messageHandler = ( data , submission ) => {
26
+ const messageHandler = ( data : string , submission : TSubmission ) => {
18
27
const {
19
28
messages,
20
29
message,
@@ -30,9 +39,9 @@ export default function MessageHandler() {
30
39
{
31
40
...initialResponse ,
32
41
text : data ,
33
- parentMessageId : message ?. overrideParentMessageId ,
42
+ parentMessageId : message ?. overrideParentMessageId ?? null ,
34
43
messageId : message ?. overrideParentMessageId + '_' ,
35
- plugin : plugin ? plugin : null ,
44
+ plugin : plugin ?? null ,
36
45
submitting : true ,
37
46
// unfinished: true
38
47
} ,
@@ -46,15 +55,15 @@ export default function MessageHandler() {
46
55
text : data ,
47
56
parentMessageId : message ?. messageId ,
48
57
messageId : message ?. messageId + '_' ,
49
- plugin : plugin ? plugin : null ,
58
+ plugin : plugin ?? null ,
50
59
submitting : true ,
51
60
// unfinished: true
52
61
} ,
53
62
] ) ;
54
63
}
55
64
} ;
56
65
57
- const cancelHandler = ( data , submission ) => {
66
+ const cancelHandler = ( data : TResData , submission : TSubmission ) => {
58
67
const { requestMessage, responseMessage, conversation } = data ;
59
68
const { messages, isRegenerate = false , isEdited = false } = submission ;
60
69
@@ -84,7 +93,7 @@ export default function MessageHandler() {
84
93
} ) ) ;
85
94
} ;
86
95
87
- const createdHandler = ( data , submission ) => {
96
+ const createdHandler = ( data : TResData , submission : TSubmission ) => {
88
97
const {
89
98
messages,
90
99
message,
@@ -98,7 +107,7 @@ export default function MessageHandler() {
98
107
...( isEdited ? messages . slice ( 0 , - 1 ) : messages ) ,
99
108
{
100
109
...initialResponse ,
101
- parentMessageId : message ?. overrideParentMessageId ,
110
+ parentMessageId : message ?. overrideParentMessageId ?? null ,
102
111
messageId : message ?. overrideParentMessageId + '_' ,
103
112
submitting : true ,
104
113
} ,
@@ -117,14 +126,16 @@ export default function MessageHandler() {
117
126
}
118
127
119
128
const { conversationId } = message ;
120
- setConversation ( ( prevState ) => ( {
121
- ...prevState ,
122
- conversationId,
123
- } ) ) ;
129
+ setConversation ( ( prevState ) =>
130
+ tConversationSchema . parse ( {
131
+ ...prevState ,
132
+ conversationId,
133
+ } ) ,
134
+ ) ;
124
135
resetLatestMessage ( ) ;
125
136
} ;
126
137
127
- const finalHandler = ( data , submission ) => {
138
+ const finalHandler = ( data : TResData , submission : TSubmission ) => {
128
139
const { requestMessage, responseMessage, conversation } = data ;
129
140
const { messages, isRegenerate = false , isEdited = false } = submission ;
130
141
@@ -154,21 +165,21 @@ export default function MessageHandler() {
154
165
} ) ) ;
155
166
} ;
156
167
157
- const errorHandler = ( data , submission ) => {
168
+ const errorHandler = ( data : TResData , submission : TSubmission ) => {
158
169
const { messages, message } = submission ;
159
170
160
171
console . log ( 'Error:' , data ) ;
161
- const errorResponse = {
172
+ const errorResponse = tMessageSchema . parse ( {
162
173
...data ,
163
174
error : true ,
164
175
parentMessageId : message ?. messageId ,
165
- } ;
176
+ } ) ;
166
177
setIsSubmitting ( false ) ;
167
178
setMessages ( [ ...messages , message , errorResponse ] ) ;
168
179
return ;
169
180
} ;
170
181
171
- const abortConversation = ( conversationId ) => {
182
+ const abortConversation = ( conversationId = '' , submission : TSubmission ) => {
172
183
console . log ( submission ) ;
173
184
const { endpoint } = submission ?. conversation || { } ;
174
185
@@ -212,7 +223,7 @@ export default function MessageHandler() {
212
223
headers : { 'Content-Type' : 'application/json' , Authorization : `Bearer ${ token } ` } ,
213
224
} ) ;
214
225
215
- events . onmessage = ( e ) => {
226
+ events . onmessage = ( e : MessageEvent ) => {
216
227
const data = JSON . parse ( e . data ) ;
217
228
218
229
if ( data . final ) {
@@ -227,8 +238,8 @@ export default function MessageHandler() {
227
238
createdHandler ( data , { ...submission , message } ) ;
228
239
console . log ( 'created' , message ) ;
229
240
} else {
230
- let text = data . text || data . response ;
231
- let { initial, plugin } = data ;
241
+ const text = data . text || data . response ;
242
+ const { initial, plugin } = data ;
232
243
if ( initial ) {
233
244
console . log ( data ) ;
234
245
}
@@ -242,9 +253,9 @@ export default function MessageHandler() {
242
253
events . onopen = ( ) => console . log ( 'connection is opened' ) ;
243
254
244
255
events . oncancel = ( ) =>
245
- abortConversation ( message ?. conversationId || submission ?. conversationId ) ;
256
+ abortConversation ( message ?. conversationId ?? submission ?. conversationId , submission ) ;
246
257
247
- events . onerror = function ( e ) {
258
+ events . onerror = function ( e : MessageEvent ) {
248
259
console . log ( 'error in opening conn.' ) ;
249
260
events . close ( ) ;
250
261
@@ -268,6 +279,4 @@ export default function MessageHandler() {
268
279
} ;
269
280
// eslint-disable-next-line react-hooks/exhaustive-deps
270
281
} , [ submission ] ) ;
271
-
272
- return null ;
273
282
}
0 commit comments