7 个版本 (4 个重大变更)
0.6.0 | 2024年2月8日 |
---|---|
0.5.0 | 2024年1月26日 |
0.4.1 | 2023年11月3日 |
0.4.0 | 2023年10月16日 |
0.2.1 | 2023年6月7日 |
#198 在 异步
每月42 次下载
1MB
21K SLoC
PubNub Rust SDK
概述
这是官方PubNub Rust SDK仓库。
PubNub 负责您应用程序实时通信层所需的基础设施和API。专注于您应用程序的逻辑,让PubNub处理全球范围内的数据发送和接收,时间不到100毫秒。
入门
以下是一切开始消息所需的内容!
获取PubNub密钥
您需要发布和订阅密钥来验证您的应用程序。从 管理门户 获取您的密钥。
使用 Cargo 导入
将 pubnub
添加到您的Rust项目中的 Cargo.toml
文件
# default features
[dependencies]
pubnub = "0.6.0"
# all features
[dependencies]
pubnub = { version = "0.6.0", features = ["full"] }
示例
尝试以下示例代码以快速启动!
use pubnub::subscribe::Subscriber;
use futures::StreamExt;
use tokio::time::sleep;
use std::time::Duration;
use serde_json;
use pubnub::{
dx::subscribe::Update,
subscribe::EventSubscriber,
Keyset, PubNubClientBuilder,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
use pubnub::subscribe::{EventEmitter, SubscriptionParams};
let publish_key = "my_publish_key";
let subscribe_key = "my_subscribe_key";
let client = PubNubClientBuilder::with_reqwest_transport()
.with_keyset(Keyset {
subscribe_key,
publish_key: Some(publish_key),
secret_key: None,
})
.with_user_id("user_id")
.build()?;
println!("PubNub instance created");
let subscription = client.subscription(SubscriptionParams {
channels: Some(&["my_channel"]),
channel_groups: None,
options: None
});
let channel_entity = client.channel("my_channel_2");
let channel_entity_subscription = channel_entity.subscription(None);
subscription.subscribe();
channel_entity_subscription.subscribe();
println!("Subscribed to channels");
// Launch a new task to print out each received message
tokio::spawn(client.status_stream().for_each(|status| async move {
println!("\nStatus: {:?}", status)
}));
tokio::spawn(subscription.stream().for_each(|event| async move {
match event {
Update::Message(message) | Update::Signal(message) => {
// Silently log if UTF-8 conversion fails
if let Ok(utf8_message) = String::from_utf8(message.data.clone()) {
if let Ok(cleaned) = serde_json::from_str::<String>(&utf8_message) {
println!("message: {}", cleaned);
}
}
}
Update::Presence(presence) => {
println!("presence: {:?}", presence)
}
Update::AppContext(object) => {
println!("object: {:?}", object)
}
Update::MessageAction(action) => {
println!("message action: {:?}", action)
}
Update::File(file) => {
println!("file: {:?}", file)
}
}
}));
// Explicitly listen only for real-time `message` updates.
tokio::spawn(
channel_entity_subscription
.messages_stream()
.for_each(|message| async move {
if let Ok(utf8_message) = String::from_utf8(message.data.clone()) {
if let Ok(cleaned) = serde_json::from_str::<String>(&utf8_message) {
println!("message: {}", cleaned);
}
}
}),
);
sleep(Duration::from_secs(2)).await;
// Send a message to the channel
client
.publish_message("hello world!")
.channel("my_channel")
.r#type("text-message")
.execute()
.await?;
// Send a message to another channel
client
.publish_message("hello world on the other channel!")
.channel("my_channel_2")
.r#type("text-message")
.execute()
.await?;
sleep(Duration::from_secs(15)).await;
Ok(())
}
您可以在我们的 示例 目录中找到更多示例!
功能
pubnub
crate 被分为多个功能。您可以在 Cargo.toml
文件中启用或禁用它们,如下所示
# only blocking and access + default features
[dependencies]
pubnub = { version = "0.6.0", features = ["blocking", "access"] }
# only parse_token + default features
[dependencies]
pubnub = { version = "0.6.0", features = ["parse_token"] }
可用功能
功能名称 | 描述 | 可用的 PubNub API |
---|---|---|
全部 |
启用所有非冲突功能 | 配置、发布、订阅、访问管理器、解析令牌、存在状态、加密模块 |
默认 |
启用默认功能: publish 、subscribe 、serde 、reqwest 、std |
配置、发布、订阅 |
发布 |
启用发布 API | 配置、发布 |
访问 |
启用访问管理器 API | 配置、访问管理器 |
解析令牌 |
启用解析访问管理器令牌 | 配置、解析令牌 |
订阅 |
启用订阅 API | 配置、订阅 |
存在状态 |
启用存在状态 API | 配置、存在状态 |
tokio |
启用订阅和存在状态 API 的 tokio 异步运行时 | 不适用 |
serde |
使用 serde 进行序列化 | 不适用 |
reqwest |
使用 reqwest 作为传输层 | 不适用 |
阻塞 |
启用 API 的阻塞执行 | 不适用 |
加密 |
启用数据加密和解密的加密模块 | 不适用 |
std |
启用 std 库 |
不适用 |
文档
WebAssembly 支持
pubnub
包与 WebAssembly 兼容。您可以在您的 Wasm 项目中使用它。
no_std
支持
pubnub
包与 no_std
兼容。要在 no_std
环境中使用它,您必须禁用默认功能并启用所需的功能,例如
[dependencies]
pubnub = { version = "0.6.0", default-features = false, features = ["serde", "publish",
"blocking"] }
限制
no_std
支持受 SDK 实现细节的限制。
SDK 使用 alloc
包为某些操作分配内存,这意味着某些目标不受支持。此外,由于我们提供了同步 API,我们使用了 alloc::sync
模块的一些部分,这在某些 no_std
环境中也不受支持。
某些 SDK 功能在 no_std
环境中不受支持
- 部分
access
模块(因为缺少时间戳支持) - 部分
reqwest
传输(因为 reqwest 的实现细节) - 部分
subscribe
模块(因为任务创建和时间依赖性) - 部分
presence
模块(因为任务创建和时间依赖性) std
功能(因为std
库)
我们依赖随机数生成器来生成调试数据。如果您想在 no_std
环境中使用 SDK,您必须为某些目标提供自己的随机数生成器实现。
更多信息
如果您在编译此包用于更特殊的目标时遇到问题,您可以尝试使用 extra_platforms
功能。请注意,此功能不受支持,我们不推荐使用它。
有关此功能的更多信息,请参阅 [features]
部分的 Cargo.toml。
支持
如果您需要帮助或有任何疑问,请联系 [email protected]。
许可证
本项目采用MIT许可证。
依赖项
~10–23MB
~356K SLoC