3 releases

0.0.3 Aug 4, 2024
0.0.2 Jul 28, 2024
0.0.1 Jul 28, 2024

#1810 in Network programming

Download history 228/week @ 2024-07-27 134/week @ 2024-08-03 5/week @ 2024-08-10 44/week @ 2024-09-14 21/week @ 2024-09-21 7/week @ 2024-09-28

112 downloads per month

MIT license

42KB
835 lines

Crates.io Documentation License: MIT

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

~4–10MB
~97K SLoC