id_effect_rpc 0.3.0

RPC client/server stack and HTTP boundary helpers for id_effect (@effect/rpc parity)
Documentation

id_effect_rpc

RPC client/server stack and HTTP boundary helpers for id_effect@effect/rpc parity (Phase D).

Full stack (D3)

Module Role
protocol Tagged wire request/response (POST /rpc)
serialization JSON + [id_effect::schema] encode/decode
registry [RpcGroup] — register typed handlers
server [RpcServer] — Axum dispatch route
client [RpcClient] — remote calls via [HttpClientKey]
stream NDJSON stream chunk encoding

Edge helpers (D2)

  • RpcError / RpcEnvelope — JSON errors + Axum IntoResponse
  • correlationx-correlation-id
  • spanrpc.request tracing fields
  • versioning — API version negotiation middleware
  • openapi / codegen — OpenAPI 3 emission + trait stub strings

Quick start

use std::sync::Arc;
use id_effect::{Env, schema, succeed};
use id_effect_rpc::{RpcClient, RpcGroup, RpcServer};

let mut group = RpcGroup::new();
group.register(
  "greet",
  Arc::new(schema::struct_("name", schema::string::<()>(), "enthusiasm", schema::i64::<>())),
  &["name", "enthusiasm"],
  Arc::new(schema::struct_("message", schema::string::<()>(), "count", schema::i64::<>())),
  &["message", "count"],
  |(name, n), _| succeed((format!("Hello, {name}!"), n)),
);
let app = RpcServer::new(group).mount_default().with_state(Env::new());

Wire format:

{"tag":"greet","payload":{"name":"Ada","enthusiasm":3}}
{"kind":"success","tag":"greet","success":{"message":"Hello, Ada!","count":3}}

Examples

cargo run -p id_effect_rpc --example 010_json_greet
cargo run -p id_effect_rpc --example 020_rpc_tracing

Phase D status

  • D1–D2: patterns, mdBook, edge helpers — shipped
  • D3: tagged dispatch, RpcGroup, RpcClient, schema bridging — shipped (HTTP+JSON)
  • Backlog: proc-macro codegen, gRPC/tonic protocol layers, bidirectional streaming

See docs/effect-ts-parity/phases/phase-d-rpc.md.