use serde_json::Value;
use tokio::sync::oneshot;
use crate::state::{ClientId, ServerId};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InterceptOwner {
Server(ServerId),
Client(ClientId),
}
pub struct PendingIntercept {
pub id: u64,
pub owner: InterceptOwner,
pub connection_id: Option<u32>,
pub event_type: String,
pub description: String,
pub event_data: Option<Value>,
pub created_unix_ms: u64,
pub timeout_secs: u64,
pub(crate) reply_tx: Option<oneshot::Sender<Vec<Value>>>,
}
#[derive(Debug, Clone)]
pub struct InterceptView {
pub id: u64,
pub owner: InterceptOwner,
pub connection_id: Option<u32>,
pub event_type: String,
pub description: String,
pub event_data: Option<Value>,
pub created_unix_ms: u64,
pub timeout_secs: u64,
}
impl InterceptView {
pub fn seconds_until_fail_closed(&self, now_unix_ms: u64) -> u64 {
let deadline = self
.created_unix_ms
.saturating_add(self.timeout_secs.saturating_mul(1000));
deadline.saturating_sub(now_unix_ms) / 1000
}
}
impl PendingIntercept {
pub(crate) fn view(&self) -> InterceptView {
InterceptView {
id: self.id,
owner: self.owner,
connection_id: self.connection_id,
event_type: self.event_type.clone(),
description: self.description.clone(),
event_data: self.event_data.clone(),
created_unix_ms: self.created_unix_ms,
timeout_secs: self.timeout_secs,
}
}
pub(crate) fn is_dead(&self) -> bool {
match &self.reply_tx {
None => true,
Some(tx) => tx.is_closed(),
}
}
}
pub fn now_unix_ms() -> u64 {
crate::utils::clock::SystemTime::now()
.duration_since(crate::utils::clock::UNIX_EPOCH)
.map(|d| d.as_millis() as u64)
.unwrap_or(0)
}