EchoStream

2026-01Packages

A bi-directional RPC and streaming framework
源码

项目简介

EchoStream 是 EchoRPC 双向 RPC 框架的升级版,支持实时流式数据传输。

支持客户端与服务端双向主动通信:RPC 请求、事件推送、流式数据传输

四端(Rust / Node / Python / Web)共享同一份 Rust 核心,逻辑同构。

核心特性

快速开始(Rust)

use echostream::prelude::*;

// 用声明式宏定义处理器,像写本地函数一样简单
#[rpc("add")]
async fn add((a, b): (i64, i64)) -> Result<i64> {
    Ok(a + b)
}

#[event("hello")]
async fn on_hello(session: &Session, msg: String) -> Result<()> {
    println!("[{}] {msg}", session.peer_addr());
    Ok(())
}

// 服务端(常驻运行,Ctrl+C 或 shutdown 退出)
#[tokio::main]
async fn main() -> Result<()> {
    ServerBuilder::new()
        .bind("0.0.0.0:5000")     // QUIC 监听器(自动自签证书)
        .add_rpc(Add)
        .add_event(OnHello)
        .serve()
        .await
}

// 客户端
async fn client_demo() -> Result<()> {
    let client = ClientBuilder::new().connect("127.0.0.1:5000").await?;
    let sum: i64 = client.request("add", &(10, 20)).await?;  // 30
    client.emit("hello", &"world".to_string()).await?;
    Ok(())
}

多端开发体验一致

# Python
import echostream

client = echostream.connect("127.0.0.1:5000")
total = client.request("add", 10, 20)              # 30,自动编解码
// Node.js(ESM)
import { connect } from "echostream-node";

const client = await connect("127.0.0.1:5000");
const sum = await client.request("add", 10, 20);   // 30,自动编解码
// 浏览器 SDK
import { EchoStream } from "./dist/echostream.js";

const client = new EchoStream("ws://192.168.1.100:8081");
await client.connect();
const sum = await client.request("add", 10, 20);   // 30,自动编解码

服务发现(mDNS)

use echostream::prelude::*;
use std::time::Duration;

// 服务端:广播服务(携带元数据)
let service = ServiceInfo::new("echo-server", 5000)?
    .set_property("version", "1.0.0");
let _advertiser = Discovery::advertise(service)?;   // RAII:drop 后自动停止

// 客户端:零配置发现并连接
let found = Discovery::discover("echo-server", Duration::from_secs(3)).await?;
let client = ClientBuilder::new().connect(found[0].address()).await?;