2个不稳定版本

0.2.0 2022年11月8日
0.1.0 2022年2月11日

#1960 in Web编程

每月22次下载

Apache-2.0

135KB
3K SLoC

Ably

Ably 是一个平台,它为实时同步数字体验提供动力。无论是在虚拟场馆参加活动、接收实时财务信息,还是监控实时汽车性能数据,消费者都期望将实时数字体验作为标准。Ably为每月80个国家的超过2.5亿台设备提供一系列API,以构建、扩展和交付强大的实时数字体验。像彭博社、HubSpot、Verizon和Hopin这样的组织依赖Ably的平台来减轻全球范围内业务关键实时数据同步日益增长复杂性。有关更多信息,请参阅Ably文档

这是一个Ably REST API的Rust客户端库。它目前不包含任何实时功能。

注意:此SDK是开发者预览版,不适合生产环境。

安装

ablytokio包添加到您的Cargo.toml

[dependencies]
ably = "0.2.0"
tokio = { version = "1", features = ["full"] }

使用REST API

初始化客户端

使用Ably身份验证方法初始化客户端。

  • 使用API密钥
let client = ably::Rest::from("xVLyHw.SmDuMg:************");
  • 使用认证URL
let auth_url = "https://example.com/auth".parse()?;

let client = ably::ClientOptions::new().auth_url(auth_url).client()?;

发布消息

给定

let channel = client.channels.get("test");
  • 发布字符串
let result = channel.publish().string("a string").send().await;
  • 发布JSON对象
#[derive(Serialize)]
struct Point {
    x: i32,
    y: i32,
}
let point = Point { x: 3, y: 4 };
let result = channel.publish().json(point).send().await;
  • 发布二进制数据
let data = vec![0x01, 0x02, 0x03, 0x04];
let result = channel.publish().binary(data).send().await;

检索历史记录

let mut pages = channel.history().pages();
while let Some(Ok(page)) = pages.next().await {
    for msg in page.items().await? {
        println!("message data = {:?}", msg.data);
    }
}

检索存在状态

let mut pages = channel.presence.get().pages();
while let Some(Ok(page)) = pages.next().await {
    for msg in page.items().await? {
        println!("presence data = {:?}", msg.data);
    }
}

检索存在状态历史记录

let mut pages = channel.presence.history().pages();
while let Some(Ok(page)) = pages.next().await {
    for msg in page.items().await? {
        println!("presence data = {:?}", msg.data);
    }
}

加密消息数据

当提供128位或256位密钥给库时,所有消息的数据属性将自动使用该密钥进行加密和解密。密钥永远不会被发送到Ably。请参阅https://www.ably.com/documentation/realtime/encryption

// Initialize a channel with cipher parameters so that published messages
// get encrypted.
let cipher_key = ably::crypto::generate_random_key::<ably::crypto::Key256>();
let params = ably::rest::CipherParams::from(cipher_key);
let channel = client.channels.name("rust-example").cipher(params).get();

channel
    .publish()
    .name("name is not encrypted")
    .string("sensitive data is encrypted")
    .send()
    .await;

请求令牌

let result = client
    .auth
    .request_token()
    .client_id("[email protected]")
    .capability(r#"{"example":["subscribe"]}"#)
    .send()
    .await;

检索应用程序统计信息

let mut pages = client.stats().pages();
while let Some(Ok(page)) = pages.next().await {
    for stats in page.items().await? {
        println!("stats = {:?}", stats);
    }
}

依赖项

~9–25MB
~364K SLoC