1+ use std:: sync:: Arc ;
2+
13use miniserve:: { http:: StatusCode , Content , Request , Response } ;
24use serde:: { Deserialize , Serialize } ;
35use tokio:: join;
@@ -16,19 +18,23 @@ async fn chat(req: Request) -> Response {
1618 let Request :: Post ( body) = req else {
1719 return Err ( StatusCode :: METHOD_NOT_ALLOWED ) ;
1820 } ;
19- let Ok ( mut messages ) = serde_json:: from_str :: < Messages > ( & body) else {
21+ let Ok ( mut data ) = serde_json:: from_str :: < Messages > ( & body) else {
2022 return Err ( StatusCode :: INTERNAL_SERVER_ERROR ) ;
2123 } ;
2224
23- let ( i, mut responses) = join ! (
25+ let messages = Arc :: new ( data. messages ) ;
26+ let messages_ref = Arc :: clone ( & messages) ;
27+ let ( i, responses) = join ! (
2428 chatbot:: gen_random_number( ) ,
25- chatbot:: query_chat( & messages . messages )
29+ tokio :: spawn ( async move { chatbot:: query_chat( & messages_ref ) . await } )
2630 ) ;
31+ let mut responses = responses. unwrap ( ) ;
2732
2833 let response = responses. remove ( i % responses. len ( ) ) ;
29- messages. messages . push ( response) ;
34+ data. messages = Arc :: into_inner ( messages) . unwrap ( ) ;
35+ data. messages . push ( response) ;
3036
31- Ok ( Content :: Json ( serde_json:: to_string ( & messages ) . unwrap ( ) ) )
37+ Ok ( Content :: Json ( serde_json:: to_string ( & data ) . unwrap ( ) ) )
3238}
3339
3440#[ tokio:: main]
0 commit comments