use bytes::Bytes;
use serde::{Deserialize, Serialize};
use std::time::{Duration, SystemTime};
use super::{AgentId, MessageId, RequestId};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecureMessage {
pub id: MessageId,
pub sender: AgentId,
pub recipient: Option<AgentId>, pub topic: Option<String>, pub payload: EncryptedPayload,
pub signature: MessageSignature,
pub timestamp: SystemTime,
pub ttl: Duration,
pub message_type: MessageType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MessageType {
Direct(AgentId),
Publish(String),
Subscribe(String),
Broadcast,
Request(RequestId),
Response(RequestId),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EncryptedPayload {
pub data: Bytes,
pub encryption_algorithm: EncryptionAlgorithm,
pub nonce: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum EncryptionAlgorithm {
#[default]
Aes256Gcm,
ChaCha20Poly1305,
None, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageSignature {
pub signature: Vec<u8>,
pub algorithm: SignatureAlgorithm,
pub public_key: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum SignatureAlgorithm {
#[default]
Ed25519,
EcdsaP256,
None, }
#[derive(Debug, Clone)]
pub struct ChannelHandle {
pub id: String,
pub agent_id: AgentId,
pub channel_type: ChannelType,
pub created_at: SystemTime,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ChannelType {
Direct,
Broadcast,
Topic(String),
}
#[derive(Debug, Clone)]
pub struct RouteEntry {
pub destination: AgentId,
pub channel: ChannelHandle,
pub last_used: SystemTime,
pub message_count: u64,
}
#[derive(Debug, Clone)]
pub struct DeadLetterQueue {
pub messages: Vec<DeadLetterMessage>,
pub max_size: usize,
}
impl DeadLetterQueue {
pub fn new(max_size: usize) -> Self {
Self {
messages: Vec::new(),
max_size,
}
}
pub fn add_message(&mut self, message: SecureMessage, reason: DeadLetterReason) {
if self.messages.len() >= self.max_size {
self.messages.remove(0); }
self.messages.push(DeadLetterMessage {
original_message: message,
reason,
timestamp: SystemTime::now(),
});
}
}
#[derive(Debug, Clone)]
pub struct DeadLetterMessage {
pub original_message: SecureMessage,
pub reason: DeadLetterReason,
pub timestamp: SystemTime,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeadLetterReason {
RecipientNotFound,
RecipientUnavailable,
MessageExpired,
PolicyViolation(String),
EncryptionFailure,
SignatureVerificationFailure,
MessageTooLarge,
RateLimitExceeded,
QueueFull,
AgentNotFound,
Expired,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum DeliveryGuarantee {
AtMostOnce,
#[default]
AtLeastOnce,
ExactlyOnce,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitConfig {
pub messages_per_second: u32,
pub burst_size: u32,
pub window_duration: Duration,
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
messages_per_second: 100,
burst_size: 200,
window_duration: Duration::from_secs(60),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageSecurity {
pub encryption_enabled: bool,
pub signature_required: bool,
pub key_rotation_interval: Duration,
pub max_message_size: usize,
pub rate_limiting: RateLimitConfig,
}
impl Default for MessageSecurity {
fn default() -> Self {
Self {
encryption_enabled: true,
signature_required: true,
key_rotation_interval: Duration::from_secs(86400), max_message_size: 1024 * 1024, rate_limiting: RateLimitConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommunicationConfig {
pub max_concurrent_connections: usize,
pub message_buffer_size: usize,
pub connection_timeout: Duration,
pub message_timeout: Duration,
pub security: MessageSecurity,
pub dead_letter_queue_size: usize,
}
impl Default for CommunicationConfig {
fn default() -> Self {
Self {
max_concurrent_connections: 10000,
message_buffer_size: 1000,
connection_timeout: Duration::from_secs(30),
message_timeout: Duration::from_secs(60),
security: MessageSecurity::default(),
dead_letter_queue_size: 1000,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct CommunicationChannels {
pub direct_channel: Option<ChannelHandle>,
pub broadcast_channel: Option<ChannelHandle>,
pub subscribed_topics: Vec<String>,
}