SRPC is a high level and asynchronous JSON-RPC client and server library which aims for ease of use. It only supports transportation over TCP sockets for now.
SRPC is in the early development phase.
use srpc::server::Server;
use std::sync::Arc;
struct StrService {
// Some server data
};
#[srpc::service]
#[allow(unused)]
impl StrService {
// 'self' and 'context' params are reserved. They are not transferred.
// 'self' is used for local server data.
// 'context' contains address of the caller.
// Reserved params are optional.
async fn foo(self: Arc<Self>, context: Arc<Context>, x: i32, y: i32) -> i32 {
x + y
}
async fn bar(is_cool: bool) {
println!("Is cool? {}", is_cool);
}
}
#[tokio::main]
async fn main() {
let server = Server::new(StrService{ /* data */ }, StrService::caller);
let _ = server.serve("127.0.0.1:8080").await;
}
use {
srpc::{client::Client, transport::Transport},
std::sync::Arc,
};
#[srpc::client]
trait StrService {
// Define an RPC call, that expects and waits for a response.
// Note that reserved params does not exist in the client side.
async fn foo(x: i32, y: i32) -> i32;
// Define an RPC notification that does not wait for a response.
#[notification]
async fn bar(is_cool: bool);
}
#[tokio::main]
async fn main() {
let transporter = Arc::new(Transport::new());
let client = Client::new(([127, 0, 0, 1], 8080).into(), transporter.clone());
let _ = StrService::foo(&client, true).await;
let res = StrService::bar(&client, 3, 5)
.await
.unwrap();
println!("{}", res);
}
- JSON-RPC 2.0
- Persistent connection
- Batched requests on the server side
- Asyncronous RPC methods
- Tokio as runtime
- Batched requests on the client side (0.2.0)
- Blocking annotation for blocking RPC methods (0.2.0)
- Executor agnostic (0.3.0)
- Data framing over TCP (0.3.0)
- JSON-RPC 1.0 (after 0.3.0)
I don't have a contribution guideline yet, so feel free to go to issues, pick one and send a PR :) Easy ones are marked with "good first issue" label.