1use super::*;
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct DiscoveryConfig {
6 #[serde(default = "DiscoveryConfig::default_ttl")]
8 pub ttl: u8,
9 #[serde(default = "DiscoveryConfig::default_attempt_timeouts_secs")]
15 pub attempt_timeouts_secs: Vec<u64>,
16 #[serde(default = "DiscoveryConfig::default_recent_expiry_secs")]
18 pub recent_expiry_secs: u64,
19 #[serde(default = "DiscoveryConfig::default_backoff_base_secs")]
23 pub backoff_base_secs: u64,
24 #[serde(default = "DiscoveryConfig::default_backoff_max_secs")]
26 pub backoff_max_secs: u64,
27 #[serde(default = "DiscoveryConfig::default_forward_min_interval_secs")]
31 pub forward_min_interval_secs: u64,
32 #[serde(default = "DiscoveryConfig::default_nostr")]
34 pub nostr: NostrDiscoveryConfig,
35 #[serde(default = "DiscoveryConfig::default_lan")]
40 pub lan: crate::discovery::lan::LanDiscoveryConfig,
41 #[serde(default = "DiscoveryConfig::default_local")]
46 pub local: crate::discovery::local::LocalInstanceDiscoveryConfig,
47}
48
49impl Default for DiscoveryConfig {
50 fn default() -> Self {
51 Self {
52 ttl: 64,
53 attempt_timeouts_secs: vec![1, 2, 4, 8],
54 recent_expiry_secs: 10,
55 backoff_base_secs: 30,
56 backoff_max_secs: 300,
57 forward_min_interval_secs: 2,
58 nostr: NostrDiscoveryConfig::default(),
59 lan: crate::discovery::lan::LanDiscoveryConfig::default(),
60 local: crate::discovery::local::LocalInstanceDiscoveryConfig::default(),
61 }
62 }
63}
64
65impl DiscoveryConfig {
66 fn default_ttl() -> u8 {
67 64
68 }
69 fn default_attempt_timeouts_secs() -> Vec<u64> {
70 vec![1, 2, 4, 8]
71 }
72 fn default_recent_expiry_secs() -> u64 {
73 10
74 }
75 fn default_backoff_base_secs() -> u64 {
76 30
77 }
78 fn default_backoff_max_secs() -> u64 {
79 300
80 }
81 fn default_forward_min_interval_secs() -> u64 {
82 2
83 }
84 fn default_nostr() -> NostrDiscoveryConfig {
85 NostrDiscoveryConfig::default()
86 }
87 fn default_lan() -> crate::discovery::lan::LanDiscoveryConfig {
88 crate::discovery::lan::LanDiscoveryConfig::default()
89 }
90 fn default_local() -> crate::discovery::local::LocalInstanceDiscoveryConfig {
91 crate::discovery::local::LocalInstanceDiscoveryConfig::default()
92 }
93}
94
95#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
102#[serde(rename_all = "snake_case")]
103pub enum NostrDiscoveryPolicy {
104 Disabled,
105 #[default]
106 ConfiguredOnly,
107 Open,
108}
109
110#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
118#[serde(rename_all = "snake_case")]
119pub enum NostrPeerfindingSource {
120 #[default]
121 Relays,
122 External,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127#[serde(deny_unknown_fields)]
128pub struct NostrDiscoveryConfig {
129 #[serde(default)]
131 pub enabled: bool,
132 #[serde(default = "NostrDiscoveryConfig::default_advertise")]
134 pub advertise: bool,
135 #[serde(default)]
137 pub peerfinding_source: NostrPeerfindingSource,
138 #[serde(default = "NostrDiscoveryConfig::default_advert_relays")]
140 pub advert_relays: Vec<String>,
141 #[serde(default = "NostrDiscoveryConfig::default_stun_servers")]
145 pub stun_servers: Vec<String>,
146 #[serde(default)]
156 pub share_local_candidates: bool,
157 #[serde(default = "NostrDiscoveryConfig::default_app")]
159 pub app: String,
160 #[serde(default = "NostrDiscoveryConfig::default_signal_ttl_secs")]
162 pub signal_ttl_secs: u64,
163 #[serde(default)]
165 pub policy: NostrDiscoveryPolicy,
166 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_max_pending")]
169 pub open_discovery_max_pending: usize,
170 #[serde(default)]
176 pub open_discovery_trust_ratings_enabled: bool,
177 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_newcomer_probe_slots")]
180 pub open_discovery_newcomer_probe_slots: usize,
181 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_rating_scope")]
183 pub open_discovery_rating_scope: String,
184 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_rating_lookback_secs")]
187 pub open_discovery_rating_lookback_secs: u64,
188 #[serde(default)]
192 pub open_discovery_trusted_rating_authors: Vec<String>,
193 #[serde(default)]
198 pub open_discovery_rating_event_files: Vec<std::path::PathBuf>,
199 #[serde(default = "NostrDiscoveryConfig::default_max_concurrent_incoming_offers")]
202 pub max_concurrent_incoming_offers: usize,
203 #[serde(default = "NostrDiscoveryConfig::default_advert_cache_max_entries")]
206 pub advert_cache_max_entries: usize,
207 #[serde(default = "NostrDiscoveryConfig::default_seen_sessions_max_entries")]
210 pub seen_sessions_max_entries: usize,
211 #[serde(default = "NostrDiscoveryConfig::default_attempt_timeout_secs")]
213 pub attempt_timeout_secs: u64,
214 #[serde(default = "NostrDiscoveryConfig::default_replay_window_secs")]
216 pub replay_window_secs: u64,
217 #[serde(default = "NostrDiscoveryConfig::default_punch_start_delay_ms")]
219 pub punch_start_delay_ms: u64,
220 #[serde(default = "NostrDiscoveryConfig::default_punch_interval_ms")]
222 pub punch_interval_ms: u64,
223 #[serde(default = "NostrDiscoveryConfig::default_punch_duration_ms")]
225 pub punch_duration_ms: u64,
226 #[serde(default = "NostrDiscoveryConfig::default_advert_ttl_secs")]
228 pub advert_ttl_secs: u64,
229 #[serde(default = "NostrDiscoveryConfig::default_advert_refresh_secs")]
231 pub advert_refresh_secs: u64,
232 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_delay_secs")]
237 pub startup_sweep_delay_secs: u64,
238 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_max_age_secs")]
243 pub startup_sweep_max_age_secs: u64,
244 #[serde(default = "NostrDiscoveryConfig::default_failure_streak_threshold")]
251 pub failure_streak_threshold: u32,
252 #[serde(default = "NostrDiscoveryConfig::default_extended_cooldown_secs")]
256 pub extended_cooldown_secs: u64,
257 #[serde(default = "NostrDiscoveryConfig::default_warn_log_interval_secs")]
262 pub warn_log_interval_secs: u64,
263 #[serde(default = "NostrDiscoveryConfig::default_failure_state_max_entries")]
267 pub failure_state_max_entries: usize,
268 #[serde(default = "NostrDiscoveryConfig::default_protocol_mismatch_cooldown_secs")]
275 pub protocol_mismatch_cooldown_secs: u64,
276}
277
278impl Default for NostrDiscoveryConfig {
279 fn default() -> Self {
280 let open_discovery_newcomer_probe_slots =
281 Self::default_open_discovery_newcomer_probe_slots();
282 let open_discovery_rating_lookback_secs =
283 Self::default_open_discovery_rating_lookback_secs();
284 Self {
285 enabled: false,
286 advertise: Self::default_advertise(),
287 peerfinding_source: NostrPeerfindingSource::default(),
288 advert_relays: Self::default_advert_relays(),
289 stun_servers: Self::default_stun_servers(),
290 share_local_candidates: false,
291 app: Self::default_app(),
292 signal_ttl_secs: Self::default_signal_ttl_secs(),
293 policy: NostrDiscoveryPolicy::default(),
294 open_discovery_max_pending: Self::default_open_discovery_max_pending(),
295 open_discovery_trust_ratings_enabled: false,
296 open_discovery_newcomer_probe_slots,
297 open_discovery_rating_scope: Self::default_open_discovery_rating_scope(),
298 open_discovery_rating_lookback_secs,
299 open_discovery_trusted_rating_authors: Vec::new(),
300 open_discovery_rating_event_files: Vec::new(),
301 max_concurrent_incoming_offers: Self::default_max_concurrent_incoming_offers(),
302 advert_cache_max_entries: Self::default_advert_cache_max_entries(),
303 seen_sessions_max_entries: Self::default_seen_sessions_max_entries(),
304 attempt_timeout_secs: Self::default_attempt_timeout_secs(),
305 replay_window_secs: Self::default_replay_window_secs(),
306 punch_start_delay_ms: Self::default_punch_start_delay_ms(),
307 punch_interval_ms: Self::default_punch_interval_ms(),
308 punch_duration_ms: Self::default_punch_duration_ms(),
309 advert_ttl_secs: Self::default_advert_ttl_secs(),
310 advert_refresh_secs: Self::default_advert_refresh_secs(),
311 startup_sweep_delay_secs: Self::default_startup_sweep_delay_secs(),
312 startup_sweep_max_age_secs: Self::default_startup_sweep_max_age_secs(),
313 failure_streak_threshold: Self::default_failure_streak_threshold(),
314 extended_cooldown_secs: Self::default_extended_cooldown_secs(),
315 warn_log_interval_secs: Self::default_warn_log_interval_secs(),
316 failure_state_max_entries: Self::default_failure_state_max_entries(),
317 protocol_mismatch_cooldown_secs: Self::default_protocol_mismatch_cooldown_secs(),
318 }
319 }
320}
321
322impl NostrDiscoveryConfig {
323 #[must_use]
325 pub const fn uses_relay_peerfinding(&self) -> bool {
326 matches!(self.peerfinding_source, NostrPeerfindingSource::Relays)
327 }
328
329 fn default_advertise() -> bool {
330 true
331 }
332
333 fn default_advert_relays() -> Vec<String> {
334 vec![
335 "wss://relay.damus.io".to_string(),
336 "wss://nos.lol".to_string(),
337 "wss://offchain.pub".to_string(),
338 "wss://temp.iris.to".to_string(),
339 ]
340 }
341
342 fn default_stun_servers() -> Vec<String> {
343 vec![
344 "stun:stun.l.google.com:19302".to_string(),
345 "stun:stun.cloudflare.com:3478".to_string(),
346 "stun:global.stun.twilio.com:3478".to_string(),
347 ]
348 }
349
350 fn default_app() -> String {
351 "fips-overlay-v1".to_string()
352 }
353
354 fn default_signal_ttl_secs() -> u64 {
355 120
356 }
357
358 fn default_open_discovery_max_pending() -> usize {
359 64
360 }
361
362 fn default_open_discovery_newcomer_probe_slots() -> usize {
363 1
364 }
365
366 fn default_open_discovery_rating_scope() -> String {
367 "fips.peer".to_string()
368 }
369
370 fn default_open_discovery_rating_lookback_secs() -> u64 {
371 604_800
372 }
373
374 fn default_max_concurrent_incoming_offers() -> usize {
375 16
376 }
377
378 fn default_advert_cache_max_entries() -> usize {
379 2048
380 }
381
382 fn default_seen_sessions_max_entries() -> usize {
383 2048
384 }
385
386 fn default_attempt_timeout_secs() -> u64 {
387 10
388 }
389
390 fn default_replay_window_secs() -> u64 {
391 300
392 }
393
394 fn default_punch_start_delay_ms() -> u64 {
395 2_000
396 }
397
398 fn default_punch_interval_ms() -> u64 {
399 200
400 }
401
402 fn default_punch_duration_ms() -> u64 {
403 10_000
404 }
405
406 fn default_advert_ttl_secs() -> u64 {
407 3_600
408 }
409
410 fn default_advert_refresh_secs() -> u64 {
411 1_800
412 }
413
414 fn default_startup_sweep_delay_secs() -> u64 {
415 5
416 }
417
418 fn default_startup_sweep_max_age_secs() -> u64 {
419 3_600
420 }
421
422 fn default_failure_streak_threshold() -> u32 {
423 5
424 }
425
426 fn default_extended_cooldown_secs() -> u64 {
427 1_800
428 }
429
430 fn default_warn_log_interval_secs() -> u64 {
431 300
432 }
433
434 fn default_failure_state_max_entries() -> usize {
435 4_096
436 }
437
438 fn default_protocol_mismatch_cooldown_secs() -> u64 {
439 86_400
440 }
441}