signer-remote 0.4.1

Signer remote communication package.
Documentation
//! 消息类型定义,用于设备间传输的 WebSocket 通信。
//! 这些消息在设备加入 channel、更新设备列表、发起/接受传输请求时使用。

use serde::{Deserialize, Serialize};
use signer_core::{SignerCrypted, SignerUser};

use crate::SignerSummary;

/// 从客户端发送到传输服务器的消息类型。
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] // 添加 PartialEq 以支持测试中的比较
#[serde(tag = "type", content = "data")]
pub enum ClientToTransferMessage {
    /// 客户端加入一个传输 channel。
    /// 主设备创建 channel 时发送此消息(不带 channel_id)。
    /// 加入设备加入已存在的 channel 时发送此消息(带 channel_id)。
    JoinChannel {
        /// 可选的 channel ID。如果为 None,则表示请求创建一个新的 channel。
        channel_id: Option<String>,
        /// 发起连接的设备的用户信息,用于在设备列表中展示。
        user_info: SignerUser,
    },

    /// 主设备选择了一个目标设备并同意发送账户信息。
    /// 此消息会触发 Hub 将加密的 `SignerSummary` 转发给目标设备。
    AcceptTransfer {
        /// 目标设备的唯一标识符(例如,其 SignerKeys 的公钥)。
        target_device_id: String,
        /// 经过端到端加密的用户账户摘要。
        /// 这个 `SignerCrypted<SignerSummary>` 是由主设备使用目标设备的公钥加密的。
        /// 序列化为 JSON 字符串后再进行 Base64 编码。
        encrypted_summary: SignerCrypted<SignerSummary>, // Base64 encoded JSON of SignerCrypted<SignerSummary>
    },

    /// 接收方确认传输已成功完成。
    /// 此消息由接收方在成功解密并处理传输数据后发送给发送方。
    TransferCompleted {
        /// 发送方设备的唯一标识符。
        sender_device_id: String,
    },
}

/// 从传输服务器发送到客户端的消息类型。
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] // 添加 PartialEq 以支持测试中的比较
#[serde(tag = "type", content = "data")]
pub enum TransferToClientMessage {
    /// 传输服务器对 `JoinChannel` 请求的响应,返回分配的 channel ID。
    /// 所有加入此 channel 的设备都会收到此消息。
    ChannelJoined {
        /// 分配或确认的 channel ID。
        channel_id: String,
        /// 当前 channel 的所有设备列表。
        devices: Vec<ChannelDevice>,
    },

    /// 当 channel 内的设备列表发生变化时(有新设备加入或离开),传输服务器会广播此消息。
    DeviceListUpdate {
        /// 更新后的设备列表。
        devices: Vec<ChannelDevice>,
    },

    /// 当主设备发起传输请求并被目标设备接受后,传输服务器会将此消息转发给主设备。
    /// 这可以作为一个确认,告知主设备传输已开始。
    TransferStarted {
        /// 目标设备的唯一标识符。
        target_device_id: String,
    },

    /// 当主设备选择的目标设备接受了传输请求,传输服务器会将此消息转发给目标设备。
    /// 消息中包含了加密的 `SignerSummary`。
    ReceiveTransfer {
        /// 发起传输的主设备的唯一标识符。
        from_device_id: String,
        /// 经过端到端加密的用户账户摘要。
        /// 这是一个 Base64 编码的 JSON 字符串,代表 `SignerCrypted<SignerSummary>`。
        encrypted_summary: SignerCrypted<SignerSummary>, // Base64 encoded JSON of SignerCrypted<SignerSummary>
    },
    
    /// 传输成功完成的确认消息。
    /// 当接收方成功解密并处理传输数据后,Hub 会将此消息转发给发送方。
    TransferCompleted {
        /// 接收方设备的唯一标识符。
        receiver_device_id: String,
    },

    /// Channel 关闭消息。
    /// 当发送方断开连接时,Hub 会向所有剩余设备发送此消息。
    ChannelClosed {
        /// 关闭原因。
        reason: String,
    },

    /// 错误消息。
    Error {
        /// 错误描述。
        message: String,
    },
}

/// 代表一个在 channel 中的设备的信息。
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] // 添加 PartialEq 以支持测试中的比较
pub struct ChannelDevice {
    /// 设备的唯一标识符,使用用户的公钥。
    pub device_id: String,
    /// 设备的用户信息,用于在列表中展示。
    pub user_info: SignerUser,
}