use std::time::Duration;
use frame_core::error::FailureReason;
use serde::{Deserialize, Serialize};
use crate::id::{ConversationId, ConversationSeq, CorrelationId, ParticipantRef, PublicationId};
#[derive(Debug)]
pub enum RequestOutcome<R> {
Replied {
reply: R,
responder: ParticipantRef,
seq: ConversationSeq,
},
DeadlineElapsed {
deadline: Duration,
},
ResponderFailed {
peer: ParticipantRef,
failure: FailureReason,
seq: ConversationSeq,
},
}
#[derive(Debug, Clone)]
pub struct IncomingRequest<Q> {
pub body: Q,
pub correlation: CorrelationId,
pub requester: ParticipantRef,
pub seq: ConversationSeq,
}
#[derive(Debug, Clone)]
pub enum InboundRequest<Q> {
Valid(IncomingRequest<Q>),
SchemaInvalid {
correlation: CorrelationId,
requester: ParticipantRef,
seq: ConversationSeq,
detail: String,
},
}
#[derive(Debug)]
pub enum SubscriptionItem<E> {
Event {
body: E,
publisher: ParticipantRef,
seq: ConversationSeq,
},
SchemaInvalid {
publisher: ParticipantRef,
seq: ConversationSeq,
detail: String,
},
PeerJoined {
peer: ParticipantRef,
seq: ConversationSeq,
},
PeerDeparted {
peer: ParticipantRef,
seq: ConversationSeq,
reason: DepartReason,
},
PeerFailed {
peer: ParticipantRef,
seq: ConversationSeq,
failure: FailureReason,
},
HistoryCompacted {
seq: ConversationSeq,
},
Gap {
expected: ConversationSeq,
observed: ConversationSeq,
},
}
#[derive(Debug)]
pub enum PublicationItem<P> {
Publication {
id: PublicationId,
body: P,
publisher: ParticipantRef,
seq: ConversationSeq,
},
SchemaInvalid {
id: PublicationId,
publisher: ParticipantRef,
seq: ConversationSeq,
detail: String,
},
PeerJoined {
peer: ParticipantRef,
seq: ConversationSeq,
},
PeerDeparted {
peer: ParticipantRef,
seq: ConversationSeq,
reason: DepartReason,
},
PeerFailed {
peer: ParticipantRef,
seq: ConversationSeq,
failure: FailureReason,
},
HistoryCompacted {
seq: ConversationSeq,
},
Gap {
expected: ConversationSeq,
observed: ConversationSeq,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LeaveOutcome {
Left {
seq: ConversationSeq,
},
AlreadyLeft,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DepartReason {
Deregistered,
Superseded,
ServerShutdown,
Left,
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct JoinCredential([u8; 32]);
impl JoinCredential {
#[must_use]
pub const fn from_bytes(bytes: [u8; 32]) -> Self {
Self(bytes)
}
#[must_use]
pub const fn to_bytes(&self) -> [u8; 32] {
self.0
}
}
impl std::fmt::Debug for JoinCredential {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("JoinCredential(..)")
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct JoinGrant {
pub conversation: ConversationId,
pub participant: ParticipantRef,
pub credential: JoinCredential,
pub generation: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PublishReceipt {
pub seq: ConversationSeq,
}