Skip to content

Commit 06c2338

Browse files
committed
Message passing solution
1 parent 9d80fef commit 06c2338

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

crates/server/src/main.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
use std::sync::Arc;
1+
use std::sync::{Arc, LazyLock};
22

33
use miniserve::{http::StatusCode, Content, Request, Response};
44
use serde::{Deserialize, Serialize};
5-
use tokio::join;
5+
use tokio::{
6+
join,
7+
sync::{mpsc, oneshot},
8+
};
69

710
async 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+
1739
async 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

Comments
 (0)