yerpc

docs.rs Crates.io

A JSON-RPC 2.0 server handler for Rust, with automatic generation of a TypeScript client.

yerpc includes (optional) integration with axum and tokio-tungstenite for easy setup and usage. Enable the support-axum and support-tungstenite feature flags for these integrations.

Integration with tide is available through the included yerpc-tide crate.

Example

```rust use axum::{ extract::ws::WebSocketUpgrade, http::StatusCode, response::Response, routing::get, Router, }; use std::net::SocketAddr; use yerpc::{rpc, RpcClient, RpcSession}; use yerpc::axum::handlewsrpc;

struct Api;

[rpc(all_positional)]

impl Api { async fn shout(&self, msg: String) -> String { msg.to_uppercase() } async fn add(&self, a: f32, b: f32) -> f32 { a + b } }

[tokio::main]

async fn main() -> Result<(), std::io::Error> { let api = Api {} let app = Router::new() .route("/rpc", get(handler)) .layer(Extension(api)); let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); eprintln!("listening on {}", addr); axum::Server::bind(&addr) .serve(app.intomakeservice()) .await .unwrap();

Ok(())

}

async fn handler( ws: WebSocketUpgrade, Extension(api): Extension, ) -> Response { let (client, outchannel) = RpcClient::new(); let session = RpcSession::new(client, api); handlewsrpc(ws, outchannel, session).await } ```

Now you can connect any JSON-RPC client to ws://localhost:3000/rpc and call the shout and add methods.

After running cargo test you will find an autogenerated TypeScript client in the typescript/generated folder. See examples/axum for a full usage example with Rust server and TypeScript client for a chat server.