1- use std:: sync:: Arc ;
1+ use std:: sync:: { Arc , LazyLock } ;
22
33use miniserve:: { http:: StatusCode , Content , Request , Response } ;
44use serde:: { Deserialize , Serialize } ;
5- use tokio:: join;
5+ use tokio:: {
6+ join,
7+ sync:: { mpsc, oneshot} ,
8+ } ;
69
710async fn index ( _req : Request ) -> Response {
811 let content = include_str ! ( "../index.html" ) . to_string ( ) ;
@@ -14,6 +17,25 @@ struct Messages {
1417 messages : Vec < String > ,
1518}
1619
20+ async fn query_chat ( messages : & Arc < Vec < String > > ) -> Vec < String > {
21+ type Payload = ( Arc < Vec < String > > , oneshot:: Sender < Vec < String > > ) ;
22+ static SENDER : LazyLock < mpsc:: Sender < Payload > > = LazyLock :: new ( || {
23+ let ( tx, mut rx) = mpsc:: channel :: < Payload > ( 1024 ) ;
24+ tokio:: spawn ( async move {
25+ let mut chatbot = chatbot:: Chatbot :: new ( vec ! [ ":-)" . into( ) , "^^" . into( ) ] ) ;
26+ while let Some ( ( messages, responder) ) = rx. recv ( ) . await {
27+ let response = chatbot. query_chat ( & messages) . await ;
28+ responder. send ( response) . unwrap ( ) ;
29+ }
30+ } ) ;
31+ tx
32+ } ) ;
33+
34+ let ( tx, rx) = oneshot:: channel ( ) ;
35+ SENDER . send ( ( Arc :: clone ( messages) , tx) ) . await . unwrap ( ) ;
36+ rx. await . unwrap ( )
37+ }
38+
1739async fn chat ( req : Request ) -> Response {
1840 let Request :: Post ( body) = req else {
1941 return Err ( StatusCode :: METHOD_NOT_ALLOWED ) ;
@@ -23,12 +45,7 @@ async fn chat(req: Request) -> Response {
2345 } ;
2446
2547 let messages = Arc :: new ( data. messages ) ;
26- let messages_ref = Arc :: clone ( & messages) ;
27- let ( i, responses) = join ! (
28- chatbot:: gen_random_number( ) ,
29- tokio:: spawn( async move { chatbot:: query_chat( & messages_ref) . await } )
30- ) ;
31- let mut responses = responses. unwrap ( ) ;
48+ let ( i, mut responses) = join ! ( chatbot:: gen_random_number( ) , query_chat( & messages) ) ;
3249
3350 let response = responses. remove ( i % responses. len ( ) ) ;
3451 data. messages = Arc :: into_inner ( messages) . unwrap ( ) ;
0 commit comments