Making progress towoards responses
This commit is contained in:
+5
-1
@@ -20,7 +20,11 @@ async fn main() -> session_rs::Result<()> {
|
|||||||
println!("{:?}", session.request::<Data>(()).await?);
|
println!("{:?}", session.request::<Data>(()).await?);
|
||||||
|
|
||||||
session
|
session
|
||||||
.on::<Data, _>(async |i, d| println!("Ok {i} {d:?}"))
|
.on::<Data, _>(async |i, d| {
|
||||||
|
println!("Ok {i} {d:?}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await;
|
tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await;
|
||||||
|
|||||||
+19
-29
@@ -1,7 +1,17 @@
|
|||||||
use std::sync::Arc;
|
use serde::{Deserialize, Serialize};
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
|
|
||||||
use session_rs::ws::{Frame, WebSocket};
|
use session_rs::{Method, session::Session, ws::WebSocket};
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct Data;
|
||||||
|
|
||||||
|
impl Method for Data {
|
||||||
|
const NAME: &'static str = "data";
|
||||||
|
type Request = ();
|
||||||
|
type Response = ();
|
||||||
|
type Error = ();
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main(flavor = "current_thread")]
|
#[tokio::main(flavor = "current_thread")]
|
||||||
async fn main() -> session_rs::Result<()> {
|
async fn main() -> session_rs::Result<()> {
|
||||||
@@ -14,35 +24,15 @@ async fn main() -> session_rs::Result<()> {
|
|||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
// Wrap session in Arc so tasks can share it
|
// Wrap session in Arc so tasks can share it
|
||||||
let session = match WebSocket::handshake(stream).await {
|
let session = Session::from_ws(
|
||||||
Ok(s) => Arc::new(s),
|
WebSocket::handshake(stream)
|
||||||
Err(e) => {
|
.await
|
||||||
eprintln!("Handshake failed: {:?}", e);
|
.expect("Failed to initialize websocket"),
|
||||||
return;
|
);
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
session.start_ping_loop();
|
session.start_receiver();
|
||||||
|
|
||||||
// Read loop
|
session.on::<Data, _>(async |_, _| Ok(())).await;
|
||||||
loop {
|
|
||||||
match session.read().await {
|
|
||||||
Ok(Frame::Text(text)) => {
|
|
||||||
println!("Received text: {}", text);
|
|
||||||
|
|
||||||
// Echo back
|
|
||||||
if let Err(e) = session.send(&text).await {
|
|
||||||
eprintln!("Send error: {:?}", e);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(_) => {}
|
|
||||||
Err(e) => {
|
|
||||||
eprintln!("{e:?}");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ pub mod session;
|
|||||||
pub mod ws;
|
pub mod ws;
|
||||||
|
|
||||||
pub type Result<T> = std::result::Result<T, Error>;
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
pub type BoxFuture<'a> = Pin<Box<dyn Future<Output = ()> + Send + 'a>>;
|
pub type BoxFuture<'a> = Pin<Box<dyn Future<Output = Option<(bool, serde_json::Value)>> + Send + 'a>>;
|
||||||
pub type MethodHandler = Box<dyn Fn(u32, serde_json::Value) -> BoxFuture<'static> + Send + Sync>;
|
pub type MethodHandler = Box<dyn Fn(u32, serde_json::Value) -> BoxFuture<'static> + Send + Sync>;
|
||||||
|
|
||||||
pub trait Method {
|
pub trait Method {
|
||||||
|
|||||||
+18
-5
@@ -75,7 +75,14 @@ impl Session {
|
|||||||
match msg {
|
match msg {
|
||||||
Message::Request { id, method, data } => {
|
Message::Request { id, method, data } => {
|
||||||
if let Some(m) = s.methods.lock().await.get(&method) {
|
if let Some(m) = s.methods.lock().await.get(&method) {
|
||||||
(m)(id, data).await
|
(m)(id, data).await;
|
||||||
|
// let s = s.clone();
|
||||||
|
// if let Ok(req) = serde_json::from_value(value) {
|
||||||
|
// match handler(id, req).await {
|
||||||
|
// Ok(res) => s.respond::<M>(id, res).await,
|
||||||
|
// Err(res) => s.respond_error::<M>(id, res).await,
|
||||||
|
// };
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::Response { id, result } => {
|
Message::Response { id, result } => {
|
||||||
@@ -94,7 +101,10 @@ impl Session {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn on<M: Method, Fut: Future<Output = ()> + Send + 'static>(
|
pub async fn on<
|
||||||
|
M: Method,
|
||||||
|
Fut: Future<Output = Result<M::Response, M::Error>> + Send + 'static,
|
||||||
|
>(
|
||||||
&self,
|
&self,
|
||||||
handler: impl Fn(u32, M::Request) -> Fut + Send + Sync + 'static,
|
handler: impl Fn(u32, M::Request) -> Fut + Send + Sync + 'static,
|
||||||
) {
|
) {
|
||||||
@@ -106,9 +116,12 @@ impl Session {
|
|||||||
let handler = Arc::clone(&handler);
|
let handler = Arc::clone(&handler);
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
if let Ok(req) = serde_json::from_value(value) {
|
Some(
|
||||||
handler(id, req).await;
|
match handler(id, serde_json::from_value(value).ok()?).await {
|
||||||
}
|
Ok(v) => (false, serde_json::to_value(v).ok()?),
|
||||||
|
Err(v) => (true, serde_json::to_value(v).ok()?),
|
||||||
|
},
|
||||||
|
)
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user