use std::collections::HashMap;
use nostr::event::Kind;
use super::constants::MAX_MESSAGE_SIZE;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct RelayLimits {
pub messages: RelayMessageLimits,
pub events: RelayEventLimits,
}
impl RelayLimits {
pub fn disable() -> Self {
Self {
messages: RelayMessageLimits::disable(),
events: RelayEventLimits::disable(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RelayMessageLimits {
pub max_size: Option<u32>,
}
impl Default for RelayMessageLimits {
fn default() -> Self {
Self {
max_size: Some(MAX_MESSAGE_SIZE),
}
}
}
impl RelayMessageLimits {
#[inline]
pub fn disable() -> Self {
Self { max_size: None }
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RelayEventLimits {
pub max_size: Option<u32>,
pub max_size_per_kind: HashMap<Kind, Option<u32>>,
pub max_num_tags: Option<u16>,
pub max_num_tags_per_kind: HashMap<Kind, Option<u16>>,
}
impl Default for RelayEventLimits {
fn default() -> Self {
let mut max_num_tags_per_kind: HashMap<Kind, Option<u16>> = HashMap::with_capacity(1);
max_num_tags_per_kind.insert(Kind::ContactList, Some(10_000));
Self {
max_size: None,
max_size_per_kind: HashMap::new(),
max_num_tags: Some(2_000),
max_num_tags_per_kind,
}
}
}
impl RelayEventLimits {
pub fn disable() -> Self {
Self {
max_size: None,
max_size_per_kind: HashMap::new(),
max_num_tags: None,
max_num_tags_per_kind: HashMap::new(),
}
}
pub fn set_max_size_per_kind(mut self, kind: Kind, max_size: Option<u32>) -> Self {
self.max_size_per_kind.insert(kind, max_size);
self
}
pub fn set_max_num_tags_per_kind(mut self, kind: Kind, max_num_tags: Option<u16>) -> Self {
self.max_num_tags_per_kind.insert(kind, max_num_tags);
self
}
pub fn get_max_size(&self, kind: &Kind) -> Option<u32> {
match self.max_size_per_kind.get(kind).copied() {
Some(limit) => limit,
None => self.max_size,
}
}
pub fn get_max_num_tags(&self, kind: &Kind) -> Option<u16> {
match self.max_num_tags_per_kind.get(kind).copied() {
Some(limit) => limit,
None => self.max_num_tags,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_event_limits_get_max_size() {
let limits = RelayLimits::default();
assert_eq!(limits.events.get_max_size(&Kind::TextNote), None,);
assert_eq!(limits.events.get_max_size(&Kind::ContactList), None,);
}
}