#rpc #rpc-server #async-std #rpc-client #server-framework #async #http-server

toy-rpc-ha421

An async RPC that mimics golang net/rpc's usage and supports both async-std and tokio

1 unstable release

0.9.0-beta.1 Mar 22, 2024

#39 in #rpc-server


Used in rxqlite

MIT/Apache

300KB
6K SLoC

toy-rpc

An async RPC crate that mimics the golang's net/rpc package and supports both async-std and tokio.

This project is still being actively developed. I have kind of run out of ideas for features, so feel free to let me know if there is a feature that you want.

toy-rpc aims to be an easy-to-use async RPC tool that is inspired by golang's net/rpc's API. It supports both async_std and tokio runtimes over either TCP or TLS. Integration with common HTTP server frameworks such as actix_web, warp and tide are provided.

The overall usage and API should feel similar to that of the golang's net/rpc package. Some of the names are changed to make them sound more "rusty". Because rust does not come with runtime reflection, attribute macros #[export_impl] and #[export_trait] / #[export_trait_impl], and attribute #[export_method] are used to mark functions "exported" in golang's net/rpc perspective.

Some other features of toy-rpc:

  • Cascading cancellation: whenever an unfinished Call<Res> is dropped, a cancellation will be sent to the server and thus propagating the cancellation.

More detailed usage can be found in the book and documentation.

Some early documentation and examples for the preview releases can be found here

This crate uses #![forbid(unsafe_code)] to ensure no usage of unsafe in the crate.

Feature flags

The feature flags can be put into three categories.

Choice of runtime and HTTP framework integration

  • async_std_runtime: supports usage with async-std
  • tokio_runtime: supports usage with tokio
  • http_tide: enables tide integration on the server side. This also enables async_std_runtime and ws_async_std
  • http_actix_web: enables actix-web integration on the server side. This also enables tokio_runtime and ws_tokio
  • http_warp: enables integration with warp on the server side. This also enables tokio_runtime and ws_tokio
  • http_axum: enables integration with axum on the server side. This also enables tokio_runtime and ws_tokio

Choice of RPC server or client (both can be enabled at the same time)

  • server: enables RPC server
  • client: enables RPC client

Choice of serialization/deserialzation (only one should be enabled at a time)

  • serde_bincode: (default) the default codec will use bincode for serialization/deserialization
  • serde_json: the default codec will use serde_json for json serialization/deserialization
  • serde_cbor: the default codec will use serde_cbor for serialization/deserialization
  • serde_rmp: the default codec will use rmp-serde for serialization/deserialization

WebSocket support (HTTP integration is implementd with WebSocket)

  • ws_tokio: enables WebSocket and HTTP integrations with tokio. This must be enabled for client to use dial_http(addr) or dial_websocket(addr).
  • ws_async_std: enables WebSocket and HTTP integrations with async-std. This must be enabled for client to use dial_http(addr) or dial_websocket(addr).

TLS support

  • tls: enables TLS support

Other trivial feature flags are listed below, and they are likely of no actual usage for you.

  • docs
  • std: serde/std. There is no actual usage right now.

By default, only serde_bincode feature is enabled. You must enable at least one runtime feature flag and the server and/or client to have something usable.

Default features

default = ["serde_bincode"]

Integration

HTTP integration is provided for actix-web, tide, and warp. More details can be found in the Book/Integrations and in examples.

Quickstart Example

A quickstart example with tokio runtime is provided in the Book/Quickstart.

License: MIT/Apache-2.0

Dependencies

~4–21MB
~340K SLoC