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

Tests Validations License: MIT

让你的应用通过实时体验焕发生机!

概述

这是官方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
全部 启用所有非冲突功能 配置、发布、订阅、访问管理器、解析令牌、存在状态、加密模块
默认 启用默认功能: publishsubscribeserdereqweststd 配置、发布、订阅
发布 启用发布 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