use std::sync::Arc;
use std::time::{Duration, Instant};
use calimero_primitives::context::ContextId;
use calimero_primitives::identity::PublicKey;
use dashmap::DashMap;
pub const CONFIRMATION_TTL: Duration = Duration::from_secs(60);
#[derive(Debug, Clone)]
pub enum InviteState {
Pending,
AwaitingConfirmation {
invited_at: Instant,
invitee_public_key: PublicKey,
},
}
impl InviteState {
#[must_use]
pub fn is_expired(&self) -> bool {
match self {
Self::Pending => false,
Self::AwaitingConfirmation { invited_at, .. } => {
invited_at.elapsed() > CONFIRMATION_TTL
}
}
}
#[must_use]
pub fn can_accept_request(&self) -> bool {
match self {
Self::Pending => true,
Self::AwaitingConfirmation { .. } => self.is_expired(),
}
}
}
#[derive(Debug, Clone)]
pub enum SpecializedNodeInviteAction {
HandleContextInvite {
context_id: ContextId,
inviter_id: PublicKey,
},
}
#[derive(Debug, Clone)]
pub struct PendingSpecializedNodeInvite {
pub action: SpecializedNodeInviteAction,
pub state: InviteState,
}
impl PendingSpecializedNodeInvite {
#[must_use]
pub fn new(action: SpecializedNodeInviteAction) -> Self {
Self {
action,
state: InviteState::Pending,
}
}
pub fn transition_to_awaiting(&mut self, invitee_public_key: PublicKey) {
self.state = InviteState::AwaitingConfirmation {
invited_at: Instant::now(),
invitee_public_key,
};
}
pub fn reset_to_pending(&mut self) {
self.state = InviteState::Pending;
}
}
pub type PendingSpecializedNodeInvites = Arc<DashMap<[u8; 32], PendingSpecializedNodeInvite>>;
#[must_use]
pub fn new_pending_specialized_node_invites() -> PendingSpecializedNodeInvites {
Arc::new(DashMap::new())
}