#channel #phoenix #elixir #async-client #send-message

phoenix_channels_client

提供 Rust 中 Phoenix Channels 的异步客户端

3 个版本

0.1.2 2023年3月10日
0.1.1 2023年3月9日
0.1.0 2022年10月1日

#99 in WebSocket

Apache-2.0

82KB
1.5K SLoC

Phoenix Channels

此包实现了 Rust 中的 Phoenix Channels (v2) 客户端。

状态

注意:虽然此客户端仍在开发中,但它已经具备足够的特性来支持许多用例。以下列出了已知缺失的特性

  • 错误/断开重连
  • 能够发送二进制消息,接收已实现
  • 更全面的集成测试
  • 添加对 v1 协议的支持

关于

此客户端是为了支持其在 LiveView Native 核心库 中的使用而构建的,该库也使用 Rust 实现。

客户端基于 tokio 实现,旨在用于 Rust 异步生态系统,尽管在非异步应用程序中使用客户端也是可能的,但前提是你仍然需要拉取 tokio 及其依赖项。

此客户端是新开发的,因此可能存在错误和缺失的特性。欢迎提交错误报告/功能请求,如果你发现任何问题,请在问题跟踪器上告诉我们!

用法

将其添加到你的依赖项中,如下所示

[dependencies]
phoenix_channels_client = { version = "0.1" }

.cargo/config.toml 中,开启我们需要的不稳定 tokio 特性,例如合作调度

[build]
rustflags = ["--cfg", "tokio_unstable"]

您还可以使用 features = ["nightly"] 启用夜间功能,目前这仅用于利用一些夜间 API 来操作切片,我们在解析时使用这些 API。

示例

use std::time::Duration;
use serde_json::json;

use phoenix_channels_client::{Config, Client};

#[tokio::main]
async fn main() {
    // Prepare configuration for the client
    let mut config = Config::new("ws://127.0.0.1:9002/socket/websocket").unwrap();
    config.set("shared_secret", "supersecret");

    // Create a client
    let mut client = Client::new(config).unwrap();

    // Connect the client
    client.connect().await.unwrap();

    // Join a channel with a timeout
    let channel = client.join("channel:mytopic", Some(Duration::from_secs(15))).await.unwrap();

    // Register an event handler, save the ref returned and use `off` to unsubscribe
    channel.on("some_event", |channel, payload| {
        println!("channel received {} from topic '{}'", payload, channel.topic());
    }).await.unwrap();

    // Send a message, waiting for a reply indefinitely
    let result = channel.send("send_reply", json!({ "name": "foo", "message": "hi"})).await.unwrap();

    // Send a message, waiting for a reply with an optional timeout
    let result = channel.send_with_timeout("send_reply", json!({ "name": "foo", "message": "hello"}), Some(Duration::from_secs(5))).await.unwrap();

    // Send a message, not waiting for a reply
    let result = channel.send_noreply("send_noreply", json!({ "name": "foo", "message": "jeez"})).await.unwrap();

    // Leave the channel
    channel.leave().await;
}

贡献

欢迎贡献!在开始任何大型 PR 的工作之前,建议你先打开一个 issue 与维护者讨论工作,否则你可能会浪费时间去实现已经在进行中的功能!

许可证

Apache 2.0

依赖项

~6–18MB
~274K SLoC