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_dm_relays")]
143 pub dm_relays: Vec<String>,
144 #[serde(default = "NostrDiscoveryConfig::default_stun_servers")]
148 pub stun_servers: Vec<String>,
149 #[serde(default)]
159 pub share_local_candidates: bool,
160 #[serde(default = "NostrDiscoveryConfig::default_app")]
162 pub app: String,
163 #[serde(default = "NostrDiscoveryConfig::default_signal_ttl_secs")]
165 pub signal_ttl_secs: u64,
166 #[serde(default)]
168 pub policy: NostrDiscoveryPolicy,
169 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_max_pending")]
172 pub open_discovery_max_pending: usize,
173 #[serde(default)]
179 pub open_discovery_trust_ratings_enabled: bool,
180 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_newcomer_probe_slots")]
183 pub open_discovery_newcomer_probe_slots: usize,
184 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_rating_scope")]
186 pub open_discovery_rating_scope: String,
187 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_rating_lookback_secs")]
190 pub open_discovery_rating_lookback_secs: u64,
191 #[serde(default)]
195 pub open_discovery_trusted_rating_authors: Vec<String>,
196 #[serde(default)]
201 pub open_discovery_rating_event_files: Vec<std::path::PathBuf>,
202 #[serde(default = "NostrDiscoveryConfig::default_max_concurrent_incoming_offers")]
205 pub max_concurrent_incoming_offers: usize,
206 #[serde(default = "NostrDiscoveryConfig::default_advert_cache_max_entries")]
209 pub advert_cache_max_entries: usize,
210 #[serde(default = "NostrDiscoveryConfig::default_seen_sessions_max_entries")]
213 pub seen_sessions_max_entries: usize,
214 #[serde(default = "NostrDiscoveryConfig::default_attempt_timeout_secs")]
216 pub attempt_timeout_secs: u64,
217 #[serde(default = "NostrDiscoveryConfig::default_replay_window_secs")]
219 pub replay_window_secs: u64,
220 #[serde(default = "NostrDiscoveryConfig::default_punch_start_delay_ms")]
222 pub punch_start_delay_ms: u64,
223 #[serde(default = "NostrDiscoveryConfig::default_punch_interval_ms")]
225 pub punch_interval_ms: u64,
226 #[serde(default = "NostrDiscoveryConfig::default_punch_duration_ms")]
228 pub punch_duration_ms: u64,
229 #[serde(default = "NostrDiscoveryConfig::default_advert_ttl_secs")]
231 pub advert_ttl_secs: u64,
232 #[serde(default = "NostrDiscoveryConfig::default_advert_refresh_secs")]
234 pub advert_refresh_secs: u64,
235 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_delay_secs")]
240 pub startup_sweep_delay_secs: u64,
241 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_max_age_secs")]
246 pub startup_sweep_max_age_secs: u64,
247 #[serde(default = "NostrDiscoveryConfig::default_failure_streak_threshold")]
254 pub failure_streak_threshold: u32,
255 #[serde(default = "NostrDiscoveryConfig::default_extended_cooldown_secs")]
259 pub extended_cooldown_secs: u64,
260 #[serde(default = "NostrDiscoveryConfig::default_warn_log_interval_secs")]
265 pub warn_log_interval_secs: u64,
266 #[serde(default = "NostrDiscoveryConfig::default_failure_state_max_entries")]
270 pub failure_state_max_entries: usize,
271 #[serde(default = "NostrDiscoveryConfig::default_protocol_mismatch_cooldown_secs")]
278 pub protocol_mismatch_cooldown_secs: u64,
279}
280
281impl Default for NostrDiscoveryConfig {
282 fn default() -> Self {
283 let open_discovery_newcomer_probe_slots =
284 Self::default_open_discovery_newcomer_probe_slots();
285 let open_discovery_rating_lookback_secs =
286 Self::default_open_discovery_rating_lookback_secs();
287 Self {
288 enabled: false,
289 advertise: Self::default_advertise(),
290 peerfinding_source: NostrPeerfindingSource::default(),
291 advert_relays: Self::default_advert_relays(),
292 dm_relays: Self::default_dm_relays(),
293 stun_servers: Self::default_stun_servers(),
294 share_local_candidates: false,
295 app: Self::default_app(),
296 signal_ttl_secs: Self::default_signal_ttl_secs(),
297 policy: NostrDiscoveryPolicy::default(),
298 open_discovery_max_pending: Self::default_open_discovery_max_pending(),
299 open_discovery_trust_ratings_enabled: false,
300 open_discovery_newcomer_probe_slots,
301 open_discovery_rating_scope: Self::default_open_discovery_rating_scope(),
302 open_discovery_rating_lookback_secs,
303 open_discovery_trusted_rating_authors: Vec::new(),
304 open_discovery_rating_event_files: Vec::new(),
305 max_concurrent_incoming_offers: Self::default_max_concurrent_incoming_offers(),
306 advert_cache_max_entries: Self::default_advert_cache_max_entries(),
307 seen_sessions_max_entries: Self::default_seen_sessions_max_entries(),
308 attempt_timeout_secs: Self::default_attempt_timeout_secs(),
309 replay_window_secs: Self::default_replay_window_secs(),
310 punch_start_delay_ms: Self::default_punch_start_delay_ms(),
311 punch_interval_ms: Self::default_punch_interval_ms(),
312 punch_duration_ms: Self::default_punch_duration_ms(),
313 advert_ttl_secs: Self::default_advert_ttl_secs(),
314 advert_refresh_secs: Self::default_advert_refresh_secs(),
315 startup_sweep_delay_secs: Self::default_startup_sweep_delay_secs(),
316 startup_sweep_max_age_secs: Self::default_startup_sweep_max_age_secs(),
317 failure_streak_threshold: Self::default_failure_streak_threshold(),
318 extended_cooldown_secs: Self::default_extended_cooldown_secs(),
319 warn_log_interval_secs: Self::default_warn_log_interval_secs(),
320 failure_state_max_entries: Self::default_failure_state_max_entries(),
321 protocol_mismatch_cooldown_secs: Self::default_protocol_mismatch_cooldown_secs(),
322 }
323 }
324}
325
326impl NostrDiscoveryConfig {
327 #[must_use]
329 pub const fn uses_relay_peerfinding(&self) -> bool {
330 matches!(self.peerfinding_source, NostrPeerfindingSource::Relays)
331 }
332
333 fn default_advertise() -> bool {
334 true
335 }
336
337 fn default_advert_relays() -> Vec<String> {
338 vec![
339 "wss://relay.damus.io".to_string(),
340 "wss://nos.lol".to_string(),
341 "wss://offchain.pub".to_string(),
342 "wss://temp.iris.to".to_string(),
343 ]
344 }
345
346 fn default_dm_relays() -> Vec<String> {
347 vec![
348 "wss://relay.damus.io".to_string(),
349 "wss://nos.lol".to_string(),
350 "wss://offchain.pub".to_string(),
351 "wss://temp.iris.to".to_string(),
352 ]
353 }
354
355 fn default_stun_servers() -> Vec<String> {
356 vec![
357 "stun:stun.l.google.com:19302".to_string(),
358 "stun:stun.cloudflare.com:3478".to_string(),
359 "stun:global.stun.twilio.com:3478".to_string(),
360 ]
361 }
362
363 fn default_app() -> String {
364 "fips-overlay-v1".to_string()
365 }
366
367 fn default_signal_ttl_secs() -> u64 {
368 120
369 }
370
371 fn default_open_discovery_max_pending() -> usize {
372 64
373 }
374
375 fn default_open_discovery_newcomer_probe_slots() -> usize {
376 1
377 }
378
379 fn default_open_discovery_rating_scope() -> String {
380 "fips.peer".to_string()
381 }
382
383 fn default_open_discovery_rating_lookback_secs() -> u64 {
384 604_800
385 }
386
387 fn default_max_concurrent_incoming_offers() -> usize {
388 16
389 }
390
391 fn default_advert_cache_max_entries() -> usize {
392 2048
393 }
394
395 fn default_seen_sessions_max_entries() -> usize {
396 2048
397 }
398
399 fn default_attempt_timeout_secs() -> u64 {
400 10
401 }
402
403 fn default_replay_window_secs() -> u64 {
404 300
405 }
406
407 fn default_punch_start_delay_ms() -> u64 {
408 2_000
409 }
410
411 fn default_punch_interval_ms() -> u64 {
412 200
413 }
414
415 fn default_punch_duration_ms() -> u64 {
416 10_000
417 }
418
419 fn default_advert_ttl_secs() -> u64 {
420 3_600
421 }
422
423 fn default_advert_refresh_secs() -> u64 {
424 1_800
425 }
426
427 fn default_startup_sweep_delay_secs() -> u64 {
428 5
429 }
430
431 fn default_startup_sweep_max_age_secs() -> u64 {
432 3_600
433 }
434
435 fn default_failure_streak_threshold() -> u32 {
436 5
437 }
438
439 fn default_extended_cooldown_secs() -> u64 {
440 1_800
441 }
442
443 fn default_warn_log_interval_secs() -> u64 {
444 300
445 }
446
447 fn default_failure_state_max_entries() -> usize {
448 4_096
449 }
450
451 fn default_protocol_mismatch_cooldown_secs() -> u64 {
452 86_400
453 }
454}