use serde::{Deserialize, Serialize};
use crate::rex_info::RexId;
pub const BLS12381_PUBLIC_KEY_SIZE: usize = 96;
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct WebSocketConnection {
pub rex_id: RexId,
#[serde(with = "serde_big_array::BigArray")]
pub assigned_validator: [u8; BLS12381_PUBLIC_KEY_SIZE],
pub established_at_timestamp: Option<u64>,
pub url: String,
pub status: ConnectionStatus,
}
impl Default for WebSocketConnection {
fn default() -> Self {
Self {
rex_id: RexId::default(),
assigned_validator: [0u8; BLS12381_PUBLIC_KEY_SIZE],
established_at_timestamp: Some(0),
url: String::new(),
status: ConnectionStatus::default(),
}
}
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub enum ConnectionStatus {
#[default]
Active,
Failed,
Closed,
}
impl ConnectionStatus {
pub fn is_active(&self) -> bool {
matches!(self, ConnectionStatus::Active)
}
pub fn is_closed(&self) -> bool {
matches!(self, ConnectionStatus::Closed)
}
pub fn is_failed(&self) -> bool {
matches!(self, ConnectionStatus::Failed)
}
}
#[cfg(test)]
mod tests {
use rialo_s_pubkey::Pubkey;
use super::*;
#[test]
fn test_connection_status_default() {
let status = ConnectionStatus::default();
assert!(status.is_active());
assert!(!status.is_closed());
}
#[test]
fn test_connection_status_active() {
let status = ConnectionStatus::Active;
assert!(status.is_active());
assert!(!status.is_closed());
}
#[test]
fn test_connection_status_closed() {
let status = ConnectionStatus::Closed;
assert!(!status.is_active());
assert!(status.is_closed());
}
#[test]
fn test_websocket_connection_serde_roundtrip() {
let connection = WebSocketConnection {
rex_id: RexId::new(Pubkey::default(), 42u64),
assigned_validator: [0u8; BLS12381_PUBLIC_KEY_SIZE], established_at_timestamp: Some(100),
url: "wss://example.com/stream".to_string(),
status: ConnectionStatus::Active,
};
let json = serde_json::to_string(&connection).expect("Failed to serialize");
let deserialized: WebSocketConnection =
serde_json::from_str(&json).expect("Failed to deserialize");
assert_eq!(connection, deserialized);
}
#[test]
fn test_websocket_connection_serde_roundtrip_closed() {
let mut authority_key = [0u8; BLS12381_PUBLIC_KEY_SIZE];
authority_key[0] = 0xAB;
authority_key[95] = 0xCD;
let connection = WebSocketConnection {
rex_id: RexId::new(Pubkey::default(), 123u64),
assigned_validator: authority_key,
established_at_timestamp: Some(200),
url: "wss://api.example.com/ws".to_string(),
status: ConnectionStatus::Closed,
};
let json = serde_json::to_string(&connection).expect("Failed to serialize");
let deserialized: WebSocketConnection =
serde_json::from_str(&json).expect("Failed to deserialize");
assert_eq!(connection, deserialized);
}
#[test]
fn test_connection_status_serde_roundtrip() {
for status in [ConnectionStatus::Active, ConnectionStatus::Closed] {
let json = serde_json::to_string(&status).expect("Failed to serialize");
let deserialized: ConnectionStatus =
serde_json::from_str(&json).expect("Failed to deserialize");
assert_eq!(status, deserialized);
}
}
}