1 个不稳定版本

0.1.12 2024 年 8 月 8 日

#76WebSocket

Download history 91/week @ 2024-08-03 15/week @ 2024-08-10

每月 106 次下载

MIT 许可证

100KB
2K SLoC

tdx Volts 客户端库

此库通过 WebSocket 为 Volt API 提供了 Rust 客户端。

客户端使用 JSON 向 Volts 发送请求并接收响应。

构建

cargo build

用法

以下示例演示了创建和初始化一个 VoltClient 实例,并调用 get_resource 方法从 Volts 获取资源。

use serde_json::json;
use volt_client_rs::{
    volt_client::VoltClient,
    websocket_rpc::{Event, EventType},
};

#[tokio::main]
async fn main() {
    // Load the Volt configuration JSON.
    let config_json = match std::fs::read_to_string("volt.config.json") {
        Ok(config_json) => config_json,
        Err(e) => {
            println!("failed to read config file: {:?}", e);
            return;
        }
    };

    // Create the Volt API client
    let mut client = match VoltClient::create(&config_json).await {
        Ok(client) => client,
        Err(e) => {
            println!("failed to create API client: {:?}", e);
            return;
        }
    };

    // Call methods on the client
    let get_request = json!({
        "resource_id": "did:volt:46c42b5f-22f1-4a7a-af76-c2eb78dbc8ca",
    });

    match client.get_resource(&get_request).await {
        Ok(response) => println!("main: received response: {:?}", response),
        Err(e) => println!("failed to get resource: {:?}", e),
    }

    // Keep the main thread alive to listen for incoming messages
    tokio::signal::ctrl_c()
        .await
        .expect("Failed to listen for ctrl_c signal");
}

上面使用的 get_resource 方法是一个单元 RPC,即它发送单个请求并接收单个响应。 VoltClient 还支持服务器流和客户端流 RPC。

    // Start a `connect` call to the Volt.
    let connect_call = match client.connect(&serde_json::Value::Null).await {
        Ok(connect1) => connect1,
        Err(e) => {
            println!("failed to connect: {:?}", e);
            return;
        }
    };

    {
        // Register a callback for the `Data` event.
        let connect_rpc = connect_call.lock().await;
        connect_rpc.on(EventType::Data, |response| {
            if let Event::Data(data) = response {
                // Do something with the data
                println!("main: received data response: {:?}", data);
            }
        });

        // Send the initial connect request.
        let connect_request = json!({
          "hello": {
            "subscribe_resource_events": true,
            "accept_invocation": false,
            "ping_interval": 10000,
          },
        });

        let _ = connect_rpc.send(&connect_request).await;
    }

依赖关系

~9–17MB
~219K SLoC