3 releases
0.0.3 | Aug 4, 2024 |
---|---|
0.0.2 | Jul 28, 2024 |
0.0.1 | Jul 28, 2024 |
#1913 in Network programming
112 downloads per month
42KB
835 lines
mrpc
A MessagePack-RPC implementation in Rust.
Features
- Write asynchronous RPC servers and clients
- Support for TCP and Unix domain sockets
- Full msgpack-rpc implementation (requests, responses, notifications)
- Support for bidirectional communication - both servers and clients can handle incoming RPC messages
- Built on
tokio
for async I/O - Uses
rmpv
for MessagePack serialization
Quick Start
use mrpc::{Client, Connection, Result, RpcSender, Server};
use rmpv::Value;
#[derive(Clone, Default)]
struct Echo;
#[async_trait::async_trait]
impl Connection for Echo {
async fn handle_request(
&self,
_: RpcSender,
method: &str,
params: Vec<Value>,
) -> Result<Value> {
Ok(format!("{} -> {}", method, params[0]).into())
}
}
#[tokio::main]
async fn main() -> Result<()> {
// We're just using the default constructor as our ConnectionMaker
let server = Server::from_fn(Echo::default).tcp("127.0.0.1:0").await?;
let addr = server.local_addr().unwrap();
tokio::spawn(server.run());
// `Connection` is implemented for (), as a convenience for clients who don't need to handle
// requests or responses.
let client = Client::connect_tcp(&addr.to_string(), ()).await?;
let result = client
.send_request("echo", &[Value::String("Hello there!".into())])
.await?;
println!("{}", result);
Ok(())
}
Dependencies
~3.5–10MB
~95K SLoC