5个版本 (3个重大更改)

0.3.1 2021年4月4日
0.3.0 2021年1月14日
0.2.0 2021年1月14日
0.1.0 2020年4月6日
0.0.1 2020年2月20日

网络编程 中排名 2056

Download history 363/week @ 2024-03-10 394/week @ 2024-03-17 346/week @ 2024-03-24 501/week @ 2024-03-31 340/week @ 2024-04-07 192/week @ 2024-04-14 189/week @ 2024-04-21 164/week @ 2024-04-28 255/week @ 2024-05-05 217/week @ 2024-05-12 365/week @ 2024-05-19 267/week @ 2024-05-26 186/week @ 2024-06-02 274/week @ 2024-06-09 259/week @ 2024-06-16 269/week @ 2024-06-23

每月下载量 1,000

MIT/Apache

130KB
3K SLoC

wamp_async

crates.io mio Lines of Code

使用Rust编写的异步 WAMP 客户端实现。

用法

有关用法示例,请参阅

  • 发布者/订阅者

    // Publish event with no arguments and with acknowledgment
    let ack_id = client.publish("peer.heartbeat", None, None, true).await?;
    println!("Ack id {}", ack_id.unwrap());
    
    // Register for events
    let (_sub_id, mut event_queue) = client.subscribe("peer.heartbeat").await?;
    // Wait for the next event
    match event_queue.recv().await {
        Some((_pub_id, args, kwargs)) => println!("Event(args: {:?}, kwargs: {:?})", args, kwargs),
        None => println!("Event queue closed"),
    };
    
  • RPC 调用者 & 被调用者

    // Call endpoint with one argument
    let (args, kwargs) = client.call("peer.echo", Some(vec![12.into()]), None).await?;
    println!("RPC returned {:?} {:?}", args, kwargs);
    
    // Declare your RPC function
    async fn rpc_echo(args: Option<WampArgs>, kwargs: Option<WampKwArgs>) -> Result<(Option<WampArgs>, Option<WampKwArgs>), WampError> {
        println!("peer.echo {:?} {:?}", args, kwargs);
        Ok((args, kwargs))
    }
    
    // Register the function
    let rpc_id = client.register("peer.echo", rpc_echo).await?;
    

结构序列化和反序列化

// Call endpoint with one argument
let (args, kwargs) = client.call("peer.echo", Some(vec![12.into()]), None).await?;
// or
let (args, kwargs) = client.call("peer.echo", Some(wamp_async::try_into_args((12,))), None).await?;
println!("RPC returned {:?} {:?}", args, kwargs);
#[derive(serde::Deserialize, serde::Serialize)]
struct MyKwArgs {
    name: String,
}

// Declare your RPC function
async fn rpc_echo(args: Option<WampArgs>, kwargs: Option<WampKwArgs>) -> Result<(Option<WampArgs>, Option<WampKwArgs>), WampError> {
    // You only need serde-deserializable structure (e.g. a tuple of two integers)
    let valid_args: (i32, i32) = if let Some(args) = args {
        wamp_async::try_from_args(args)?
    } else {
        return Err(wamp_async::WampError::UnknownError("positional args are required".to_string()));
    };
    println!("Two integers are: {}, {}", valid_args.0, valid_args.1);

    // You can also use a custom struct and use a little bit of Rust helpers
    let valid_kwargs: Option<MyKwArgs> = kwargs.map(wamp_async::try_from_kwargs).transpose()?;

    if let Some(MyKwArgs { name }) = valid_kwargs {
        println!("Name is {}", name);
    } else {
        println!("There were no kwargs specified");
    }

    Ok((
        Some(wamp_async::try_into_args(valid_args)?),
        valid_kwargs.map(wamp_async::try_into_kwargs).transpose()?,
    ))
}

// Register the function
let rpc_id = client.register("peer.echo", rpc_echo).await?;

特性

特性 描述 状态
WebSocket 使用 WebSocket 作为传输
安全WebSocket 通过HTTPS的WebSocket
原始套接字 使用轻量级TCP作为传输
安全原始套接字 带TLS的原始套接字
MsgPack 使用 MessagePack 进行消息序列化
JSON 使用 JSON 进行消息序列化

客户端

基本配置

特性 描述 状态
发布者 能够在主题上发布消息
订阅者 可以订阅并接收主题的事件
调用者 能够调用RPC端点
被调用者 能够注册RPC端点

高级配置

特性 描述 状态
客户端认证 对客户端认证的低级别支持(基于票据的,CRA)
逐步调用 从被调用者向调用者报告部分结果 需要帮助

许可证

贡献

除非您明确说明,否则您提交的任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证的定义,应按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~7–19MB
~290K SLoC