use std::collections::HashMap;
use chrono::DateTime;
use samod_core::{ConnectionId, DocumentId, PeerId};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConnectionInfo {
pub id: ConnectionId,
pub last_received: Option<chrono::DateTime<chrono::Utc>>,
pub last_sent: Option<chrono::DateTime<chrono::Utc>>,
pub docs: HashMap<DocumentId, PeerDocState>,
pub state: ConnectionState,
}
impl From<samod_core::network::ConnectionInfo> for ConnectionInfo {
fn from(value: samod_core::network::ConnectionInfo) -> Self {
ConnectionInfo {
id: value.id,
last_received: value
.last_received
.map(|i| DateTime::from_timestamp_millis(i.as_millis() as i64).unwrap()),
last_sent: value
.last_sent
.map(|i| DateTime::from_timestamp_millis(i.as_millis() as i64).unwrap()),
docs: value.docs.into_iter().map(|(k, v)| (k, v.into())).collect(),
state: value.state.into(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ConnectionState {
Handshaking,
Connected { their_peer_id: PeerId },
}
impl From<samod_core::network::ConnectionState> for ConnectionState {
fn from(value: samod_core::network::ConnectionState) -> Self {
match value {
samod_core::network::ConnectionState::Handshaking => ConnectionState::Handshaking,
samod_core::network::ConnectionState::Connected { their_peer_id } => {
ConnectionState::Connected { their_peer_id }
}
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd)]
pub struct PeerDocState {
pub last_received: Option<chrono::DateTime<chrono::Utc>>,
pub last_sent: Option<chrono::DateTime<chrono::Utc>>,
pub last_sent_heads: Option<Vec<automerge::ChangeHash>>,
pub last_acked_heads: Option<Vec<automerge::ChangeHash>>,
pub shared_heads: Option<Vec<automerge::ChangeHash>>,
pub their_heads: Option<Vec<automerge::ChangeHash>>,
}
impl From<samod_core::network::PeerDocState> for PeerDocState {
fn from(value: samod_core::network::PeerDocState) -> Self {
PeerDocState {
last_received: value
.last_received
.map(|t| DateTime::from_timestamp_millis(t.as_millis() as i64).unwrap()),
last_sent: value
.last_sent
.map(|t| DateTime::from_timestamp_millis(t.as_millis() as i64).unwrap()),
last_sent_heads: value.last_sent_heads,
last_acked_heads: value.last_acked_heads,
shared_heads: value.shared_heads,
their_heads: value.their_heads,
}
}
}