NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #3338 most downloaded on crates.io
An RPC framework for Rust with a focus on ease of use.
Last release 1 months ago
12 Aug 2026
Ships fairly regularly
a new release about every 5 months
Some releases are documented
notes for 26 of 47 stable releases
4 versions withdrawn
withdrawn after publishing
11 years old
51 releases · first in 2016
Prepare for release v0.38.0
Prepare for release v0.38.0
Prepare for release v0.37.0
Prepare for release v0.37.0
Opentelemetry and related dependencies were updated to newer versions. This requires users of tarpc with opentelemetry to update their dependencies as well as code that initializes tracer providers. See example-service/ for how to update code.
One column per quarter.
Bump patch versions of example-service/ and plugins/.
Bump patch versions of example-service/ and plugins/.
Prepare release of tarpc v0.35.0
Prepare release of tarpc v0.35.0
context::Context::deadline and Request::deadline type changed from SystemTime to Instant
to preserve monotonicity of time and better support devices that can't rely on clocks. During
serialization, Instant is converted to Duration in the same way that SystemTime was.serde_transport::{tcp,unix}::Connect to {Tcp,Unix}Connect to disambiguate some
compiler error messages so that CI workflows can test more combinations of features.Serve trait to an extension trait called RequestHook.serde_transport now supports listening on TCP and UDS sockets provided by the caller.impl Serve now also impl Stub.Request and Response types now support any derive, not just serde. Use like
#[tarpc::service(derive = [Clone, Hash])].tarpc::Request and tarpc::Response are no longer non-exhaustive.Prepare for v0.34.0 release
Prepare for v0.34.0 release
#[tarpc::server] is no more! Service traits now use async fns.Channel::execute no longer spawns request handlers. Async-fn-in-traits makes it impossible to
add a Send bound to the future returned by Serve::serve. Instead, Channel::execute returns a
stream of futures, where each future is a request handler. To achieve the former behavior:channel.execute(server.serve())
.for_each(|rpc| { tokio::spawn(rpc); })
Opentelemetry dependency version increased to 0.18.
Opentelemetry dependency version increased to 0.18.
As part of a fix to return more channel errors in RPC results, a few error types have changed:
As part of a fix to return more channel errors in RPC results, a few error types have changed:
client::RpcError::Disconnected was split into the following errors:client::ChannelError and server::ChannelError are unified in tarpc::ChannelError.
Previously, server transport errors would not indicate during which activity the transport
error occurred. Now, just like the client already was, it will be specific: reading, readying,
sending, flushing, or closing.This release adds Unix Domain Sockets to the serde_transport module. To use it, enable the "unix" feature. See the docs for more information.
This release adds Unix Domain Sockets to the serde_transport module.
To use it, enable the "unix" feature. See the docs for more information.
Some types that impl Future are now annotated with #[must_use]. Code that previously created these types but did not use them will now receive a warni
#[must_use]. Code that previously created
these types but did not use them will now receive a warning. Code that disallows warnings will
receive a compilation error.TrackedRequest now contains a response guard that can be used to ensure state cleanup for
aborted requests. (This was already handled automatically by InFlightRequests).Context.deadline is now serialized as a Duration. This prevents clock skew from affecting deadline behavior. For more details see https://github.com/g
Context.deadline is now serialized as a Duration. This prevents clock skew from affecting deadline
behavior. For more details see https://github.com/google/tarpc/pull/367 and its related
issue.
The minimum supported Rust version has increased to 1.58.0.
Clients will now close their transport before dropping it. An attempt at a clean shutdown can help the server drop its connections more quickly.
Clients will now close their transport before dropping it. An attempt at a clean shutdown can help the server drop its connections more quickly.
RPC return types are changing from Result to Result .
RPC return types are changing from Result<Response, io::Error> to Result<Response, tarpc::client::RpcError>.
Becaue tarpc is a library, not an application, it should strive to use structured errors in its API so that users have maximal flexibility in how they handle errors. io::Error makes that hard, because it is a kitchen-sink error type.
RPCs in particular only have 3 classes of errors:
RPC responses can also contain application-specific errors, but from the perspective of the RPC library, those are opaque to the framework, classified as successful responsees.
The Opentelemetry dependency is updated to version 0.16.x.
This version was yanked due to tarpc-plugins version mismatches.
This version was yanked due to tarpc-plugins version mismatches.
Nothing published for this version
Nothing published for this version
tarpc is now instrumented with tracing primitives extended with OpenTelemetry traces. Using a compatible tracing-opentelemetry subscriber like Jaeger,
tarpc is now instrumented with tracing primitives extended with OpenTelemetry traces. Using a compatible tracing-opentelemetry subscriber like Jaeger, each RPC can be traced through the client, server, amd other dependencies downstream of the server. Even for applications not connected to a distributed tracing collector, the instrumentation can also be ingested by regular loggers like env_logger.
Logged events are now structured using tracing. For applications using a logger and not a tracing subscriber, these logs may look different or contain information in a less consumable manner. The easiest solution is to add a tracing subscriber that logs to stdout, such as tracing_subscriber::fmt.
Nothing published for this version
This required the breaking change of removing the Client trait. The intent of the Client trait was to facilitate the decorator pattern by allowing use…
Some of the items in this module were renamed to be less generic:
In the case of Handler: handler of what? Now it's a bit clearer that this is a stream of Channels (aka incoming connections).
Similarly, ClientHandler was a stream of requests over a single connection. Hopefully Requests better reflects that.
ResponseHandler was renamed InFlightRequest because it no longer contains the serving function. Instead, it is just the request, plus the response channel and an abort hook. As a result of this, Channel::respond_with underwent a big change: it used to take the serving function and return a ClientHandler; now it has been renamed Channel::requests and does not take any args.
All methods thats actually result in responses being generated have been consolidated into methods
named execute:
channel.requests().execute().server::Server was removed, as it provided no value over the Incoming/Channel abstractions. Additionally, server::new was removed, since it just returned a Server.
This required the breaking change of removing the Client trait. The intent of the Client trait was to facilitate the decorator pattern by allowing users to create their own Clients that added behavior on top of the base client. Unfortunately, this trait had become a maintenance burden, consistently causing issues with lifetimes and the lack of generic associated types. Specifically, it meant that Client impls could not use async fns, which is no longer tenable today, with channel libraries moving to async fns.
The deadline-exceeded response was largely redundant, because the client shouldn't normally be waiting for such a response, anyway -- the normal client will automatically remove the in-flight request when it reaches the deadline.
This also allows for internalizing the expiration+cleanup logic entirely within BaseChannel, without having it leak into the Channel trait and requiring action taken by the Requests struct.
The server already knows when the request deadline was exceeded, so the client didn't need to inform it.
### Breaking Changes Upgrades tokio to 1.0.
Upgrades tokio to 1.0.
This release was yanked.
This release was yanked.
Nothing published for this version
### Breaking Changes Upgrades tokio to 0.3.
Upgrades tokio to 0.3.
This release adds some flexibility and consistency to serde_transport, with one new feature and one small breaking change.
This release adds some flexibility and consistency to serde_transport, with one new feature and
one small breaking change.
serde_transport::tcp now exposes framing configuration on connect() and listen(). This is
useful if, for instance, you want to send requests or responses that are larger than the maximum
payload allowed by default:
let mut transport = tarpc::serde_transport::tcp::connect(server_addr, Json::default);
transport.config_mut().max_frame_length(4294967296);
let mut client = MyClient::new(client::Config::default(), transport.await?).spawn()?;
The codec argument to serde_transport::tcp::connect changed from a Codec to impl Fn() -> Codec,
to be consistent with serde_transport::tcp::listen. While only one Codec is needed, more than one
person has been tripped up by the inconsistency between connect and listen. Unfortunately, the
compiler errors are not much help in this case, so it was decided to simply do the more intuitive
thing so that the compiler doesn't need to step in in the first place.
When a service impl uses #[tarpc::server], only async fns are re-written. This can lead to confusing compiler errors about missing associated types:
When a service impl uses #[tarpc::server], only async fns are re-written. This can lead to
confusing compiler errors about missing associated types:
error: not all trait items implemented, missing: `HelloFut`
--> $DIR/tarpc_server_missing_async.rs:9:1
|
9 | impl World for HelloServer {
| ^^^^
The proc macro now provides better diagnostics for this case:
error: not all trait items implemented, missing: `HelloFut`
--> $DIR/tarpc_server_missing_async.rs:9:1
|
9 | impl World for HelloServer {
| ^^^^
error: hint: `#[tarpc::server]` only rewrites async fns, and `fn hello` is not async
--> $DIR/tarpc_server_missing_async.rs:10:5
|
10 | fn hello(name: String) -> String {
| ^^
Previously, clients would ignore when the read half of the transport was closed, continuing to write requests. This didn't make much sense, because without the ability to receive responses, clients have no way to know if requests were actually processed by the server. It basically just led to clients that would hang for a few seconds before shutting down. This has now been corrected: clients will immediately shut down when the read-half of the transport is closed.
Previously, docs.rs only documented items enabled by default, notably leaving out documentation for tokio and serde features. This has now been corrected: docs.rs should have documentation for all optional features.
A new proc macro, #[tarpc::server] was added! This enables service impls to elide the boilerplate of specifying associated types for each RPC. With th
A new proc macro, #[tarpc::server] was added! This enables service impls to elide the boilerplate
of specifying associated types for each RPC. With the ubiquity of async-await, most code won't have
nameable futures and will just be boxing the return type anyway. This macro does that for you.
_non_exhaustive fields replaced with the #[non_exhaustive] attribute.https://github.com/google/tarpc/issues/304
A race condition in code that limits number of connections per client caused occasional panics.
https://github.com/google/tarpc/pull/295
Made request timeouts account for time spent in the outbound buffer. Previously, a large outbound queue would lead to requests not timing out correctly.
The bincode-transport and json-transport crates are deprecated and superseded by the serde_transport module, which unifies much of the logic present i…
tarpc, with new Cargo features to enable
functionality.
serde_transport module, which unifies much of the logic present in both crates.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Version 0.13 marks a significant departure from previous versions of tarpc. The API has changed significantly. The tokio-proto crate has been torn out
Version 0.13 marks a significant departure from previous versions of tarpc. The API has changed significantly. The tokio-proto crate has been torn out and replaced with a homegrown rpc framework. Additionally, the crate has been modularized, so that the tarpc crate itself contains only the macro code.
All crates are now at the top level. e.g. tarpc-plugins is now tarpc/plugins rather than tarpc/src/plugins. tarpc itself is now a very small code surface, as most functionality has been moved into the other more granular crates.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Updates tarpc to use tarpc-plugins 0.2.
Updates tarpc to use tarpc-plugins 0.2.
This release updates tarpc to use serde 1.0. As such, users must also update to use serde 1.0. The serde 1.0 release notes detail migration paths.
This release updates tarpc to use serde 1.0. As such, users must also update to use serde 1.0. The serde 1.0 release notes detail migration paths.
This release removes the Sync bound on RPC args for both sync and future clients. No breaking changes.
This release removes the Sync bound on RPC args for both sync and future
clients. No breaking changes.
This release updates tarpc-plugins to work with rustc master. Thus, older versions of rustc are no longer supported. We chose a minor version bump bec
This release updates tarpc-plugins to work with rustc master. Thus, older versions of rustc are no longer supported. We chose a minor version bump because it is still source-compatible with existing code using tarpc.
This release was purely doc fixes. No breaking changes.
This release was purely doc fixes. No breaking changes.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →