use crate::types::payload::NegotiatedPayload;
use crate::types::trust::TrustDomain;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SessionState {
Initiating,
Proposed,
Active,
Suspended,
Closed,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LdpSession {
pub session_id: String,
pub remote_url: String,
pub remote_delegate_id: String,
pub state: SessionState,
pub payload: NegotiatedPayload,
pub trust_domain: TrustDomain,
pub created_at: DateTime<Utc>,
pub last_used: DateTime<Utc>,
pub ttl_secs: u64,
pub task_count: u64,
}
impl LdpSession {
pub fn is_active(&self) -> bool {
if self.state != SessionState::Active {
return false;
}
let elapsed = Utc::now()
.signed_duration_since(self.last_used)
.num_seconds();
elapsed < self.ttl_secs as i64
}
pub fn touch(&mut self) {
self.last_used = Utc::now();
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionConfig {
pub preferred_payload_modes: Vec<crate::types::payload::PayloadMode>,
pub ttl_secs: u64,
pub required_trust_domain: Option<String>,
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
preferred_payload_modes: vec![
crate::types::payload::PayloadMode::SemanticFrame,
crate::types::payload::PayloadMode::Text,
],
ttl_secs: 3600, required_trust_domain: None,
}
}
}