3个不稳定版本
0.3.0 | 2024年5月7日 |
---|---|
0.2.1 | 2024年5月6日 |
0.2.0 | 2024年5月6日 |
#12 in #krossbar
69 每月下载次数
33KB
641 行
更名为 krossbar
lib.rs
:
卡罗平台用于通信的RPC库。
该库
- 接收 tokio::net::UnixStream 并返回RPC句柄;
- 允许通过RPC连接调用、订阅端点和发送 tokio::net::UnixStream;
- 支持在重新连接后替换流、重新订阅活跃订阅并保持所有客户端句柄有效;
- 支持通过[Monitor]进行消息交换监控;
使用 rpc::Rpc::poll 方法轮询流。这包括等待调用或订阅响应。
示例
RPC调用
use futures::{select, FutureExt};
use tokio::net::UnixStream;
use karo_common_rpc::rpc::Rpc;
async fn call() {
let stream = UnixStream::connect("/tmp/hub.sock").await.unwrap();
let mut rpc = Rpc::new(stream);
let call = rpc.call::<u32, u32>("echo", &42).await.unwrap();
select! {
response = call.fuse() => {
println!("Call response: {response:?}")
},
_ = rpc.poll().fuse() => {}
}
}
RPC订阅
use futures::{select, FutureExt, StreamExt};
use tokio::net::UnixStream;
use karo_common_rpc::rpc::Rpc;
async fn subscribe() {
let stream = UnixStream::connect("/tmp/hub.sock").await.unwrap();
let mut rpc = Rpc::new(stream);
let subscription = rpc.subscribe::<u32>("signal").await.unwrap();
select! {
response = subscription.take(2).collect::<Vec<karo_common_rpc::Result<u32>>>() => {
println!("Subscription response: {response:?}")
},
_ = rpc.poll().fuse() => {}
}
}
轮询传入消息
use futures::{select, FutureExt};
use tokio::net::UnixStream;
use karo_common_rpc::{rpc::Rpc, request::Body};
async fn poll() {
let stream = UnixStream::connect("/tmp/hub.sock").await.unwrap();
let mut rpc = Rpc::new(stream);
loop {
let request = rpc.poll().await;
if request.is_none() {
println!("Client disconnected");
return;
}
let mut request = request.unwrap();
println!("Incoming method call: {}", request.endpoint());
match request.take_body().unwrap() {
Body::Call(bson) => {
println!("Incoming call: {bson:?}");
request.respond(Ok(bson)).await;
},
Body::Subscription => {
println!("Incoming subscription");
request.respond(Ok(41)).await;
request.respond(Ok(42)).await;
request.respond(Ok(43)).await;
},
Body::Fd(client_name, _) => {
println!("Incoming connection request from {client_name}");
request.respond(Ok(())).await;
}
}
}
}
更多信息请参阅 tests/
中的示例。
依赖项
~10–20MB
~274K SLoC