17 个不稳定版本 (3 个重大更改)

0.3.6 2023年5月2日
0.3.5 2023年3月13日
0.3.4 2023年2月22日
0.3.0-alpha.2 2023年1月31日
0.0.1 2022年12月9日

#14 in #handshake

Download history 5/week @ 2024-04-01

每月56次下载

Apache-2.0

48KB
1K SLoC

cometd-client


lib.rs:

本包旨在为CometD协议创建客户端。

此项目正在开发中,版本之间可能变化很大。

目录

连接端点

客户端可以自定义端点基本路径

  1. CometdClientBuilder::handshake_base_path;
  2. CometdClientBuilder::subscribe_base_path;
  3. CometdClientBuilder::connect_base_path;
  4. CometdClientBuilder::disconnect_base_path;

例如,要更改handshake基本路径并获取 http://[::1]:1025/notifications/node/0/handshake,您可以这样做

use cometd_client::CometdClientBuilder;

let client = CometdClientBuilder::new(&"http://[::1]:1025/notifications/".parse()?)
    .handshake_base_path("hand/")
    .build()?;

其他端点也是如此。

身份验证

在服务器上进行身份验证有两种方式,通过 authorization 头和cookie。

通过授权头进行身份验证

要使用带有 authorization 头的访问令牌,您必须通过 CometdClientBuilder::access_token 设置它。此库提供两个默认结构: types::access_token::Bearertypes::access_token::Basic

use cometd_client::{CometdClientBuilder, types::access_token::{Bearer, Basic}};

// let access_token = Bearer::new("access-token");
let access_token = Basic::create("username", Some("optional password"))?;

let client = CometdClientBuilder::new(&"http://[::1]:1025/notifications/".parse()?)
    .access_token(access_token)
    .build()?;

但您可以自己创建用于 authorization 头的访问令牌

use core::fmt::{Formatter, Debug};
use cometd_client::types::AccessToken;

struct OAuth(String);

impl Debug for OAuth {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "OAuth(***)")
    }
}

impl OAuth {
    pub fn new(access_token: &str) -> Self {
        Self(format!("OAuth {access_token}"))
    }
}

impl AccessToken for OAuth {
    fn get_authorization_token(&self) -> &str {
        &self.0
    }
}

通过cookie进行身份验证

如果您使用会话cookie进行身份验证(或其他原因),您可以通过 CometdClientBuilder::cookieCometdClientBuilder::cookies 设置它(或它们)。

use cometd_client::CometdClientBuilder;

let client = CometdClientBuilder::new(&"http://[::1]:1025/notifications/".parse()?)
    .cookie("cookie0-name", "cookie0-value")
    .cookies([
        ("cookie1-name", "cookie1-value"),
        ("cookie2-name", "cookie2-value")
    ])
    .build()?;

如何与客户端交互?

客户端使用MPMC通道发送消息和错误。通过CometdClientBuilder::build启动任务,进行握手并开始等待消息。如果握手请求因服务器发送types::Reconnect::Handshaketypes::Reconnect::Retry建议而失败,则客户端会尝试通过CometdClientBuilder::number_of_retries次数重新进行。

握手成功后,任务开始监听来自服务器的消息。如果在监听期间出现types::Reconnect::Handshake建议的错误,则客户端将尝试再次进行握手(见上文)。如果错误是types::Reconnect::Retry建议,则它将尝试通过CometdClientBuilder::number_of_retries次数重新进行。

要发送订阅命令,必须使用CometdClient::subscribe。如果发生错误,它将按照与连接相同的方案进行重试(见上文)。

要获取事件通道接收器,请使用CometdClient::rx

use cometd_client::{types::CometdClientEvent, CometdClientBuilder};

let client = CometdClientBuilder::new(&"http://[::0]:1025/notifications/".parse()?)
    .build()?;

let mut rx = client.rx();

tokio::spawn(async move {
    while let Some(event) = rx.recv().await {
        match event {
            CometdClientEvent::Message(messages) => println!("got messages: `{messages:?}`."),
            CometdClientEvent::Error(error) => eprintln!("got error: `{error:?}`."),   
        }   
    }
});

依赖项

~10–21MB
~303K SLoC