Crates.io | jsonlrpc_mio |
lib.rs | jsonlrpc_mio |
version | 0.2.1 |
created_at | 2024-11-12 09:39:22.249827+00 |
updated_at | 2024-12-06 12:50:53.980547+00 |
description | Non-blocking `jsonlrpc` server and client using `mio` |
homepage | https://github.com/sile/jsonlrpc_mio |
repository | https://github.com/sile/jsonlrpc_mio |
max_upload_size | |
id | 1444696 |
size | 30,380 |
Non-blocking jsonlrpc
server and client using mio
.
use std::net::SocketAddr;
use jsonlrpc::{RequestId, RequestObject, ResponseObject};
use jsonlrpc_mio::{RpcClient, RpcServer};
use mio::{Events, Poll, Token};
let mut poller = Poll::new()?;
let mut events = Events::with_capacity(1024);
let mut server: RpcServer = RpcServer::start(
&mut poller,
SocketAddr::from(([127, 0, 0, 1], 0)),
Token(0),
Token(9),
)?;
let mut client = RpcClient::new(Token(10), server.listen_addr());
let request = RequestObject {
jsonrpc: jsonlrpc::JsonRpcVersion::V2,
method: "ping".to_owned(),
params: None,
id: Some(RequestId::Number(123)),
};
client.send(&mut poller, &request)?;
loop {
poller.poll(&mut events, None)?;
for event in events.iter() {
server.handle_event(&mut poller, event)?;
if let Some((from, request)) = server.try_recv() {
assert_eq!(request.method, "ping");
let response = ResponseObject::Ok {
jsonrpc: jsonlrpc::JsonRpcVersion::V2,
result: serde_json::json! { "pong" },
id: request.id.unwrap(),
};
server.reply(&mut poller, from, &response)?;
}
client.handle_event(&mut poller, event)?;
if let Some(response) = client.try_recv() {
let value = response.into_std_result().unwrap();
assert_eq!(value, serde_json::json! { "pong" });
return Ok(());
}
}
}