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, Serialize, Deserialize)]
112#[serde(deny_unknown_fields)]
113pub struct NostrDiscoveryConfig {
114 #[serde(default)]
116 pub enabled: bool,
117 #[serde(default = "NostrDiscoveryConfig::default_advertise")]
119 pub advertise: bool,
120 #[serde(default = "NostrDiscoveryConfig::default_advert_relays")]
122 pub advert_relays: Vec<String>,
123 #[serde(default = "NostrDiscoveryConfig::default_dm_relays")]
125 pub dm_relays: Vec<String>,
126 #[serde(default = "NostrDiscoveryConfig::default_stun_servers")]
130 pub stun_servers: Vec<String>,
131 #[serde(default)]
141 pub share_local_candidates: bool,
142 #[serde(default = "NostrDiscoveryConfig::default_app")]
144 pub app: String,
145 #[serde(default = "NostrDiscoveryConfig::default_signal_ttl_secs")]
147 pub signal_ttl_secs: u64,
148 #[serde(default)]
150 pub policy: NostrDiscoveryPolicy,
151 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_max_pending")]
154 pub open_discovery_max_pending: usize,
155 #[serde(default)]
161 pub open_discovery_trust_ratings_enabled: bool,
162 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_newcomer_probe_slots")]
165 pub open_discovery_newcomer_probe_slots: usize,
166 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_rating_scope")]
168 pub open_discovery_rating_scope: String,
169 #[serde(default = "NostrDiscoveryConfig::default_open_discovery_rating_lookback_secs")]
172 pub open_discovery_rating_lookback_secs: u64,
173 #[serde(default)]
177 pub open_discovery_trusted_rating_authors: Vec<String>,
178 #[serde(default)]
183 pub open_discovery_rating_event_files: Vec<std::path::PathBuf>,
184 #[serde(default = "NostrDiscoveryConfig::default_max_concurrent_incoming_offers")]
187 pub max_concurrent_incoming_offers: usize,
188 #[serde(default = "NostrDiscoveryConfig::default_advert_cache_max_entries")]
191 pub advert_cache_max_entries: usize,
192 #[serde(default = "NostrDiscoveryConfig::default_seen_sessions_max_entries")]
195 pub seen_sessions_max_entries: usize,
196 #[serde(default = "NostrDiscoveryConfig::default_attempt_timeout_secs")]
198 pub attempt_timeout_secs: u64,
199 #[serde(default = "NostrDiscoveryConfig::default_replay_window_secs")]
201 pub replay_window_secs: u64,
202 #[serde(default = "NostrDiscoveryConfig::default_punch_start_delay_ms")]
204 pub punch_start_delay_ms: u64,
205 #[serde(default = "NostrDiscoveryConfig::default_punch_interval_ms")]
207 pub punch_interval_ms: u64,
208 #[serde(default = "NostrDiscoveryConfig::default_punch_duration_ms")]
210 pub punch_duration_ms: u64,
211 #[serde(default = "NostrDiscoveryConfig::default_advert_ttl_secs")]
213 pub advert_ttl_secs: u64,
214 #[serde(default = "NostrDiscoveryConfig::default_advert_refresh_secs")]
216 pub advert_refresh_secs: u64,
217 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_delay_secs")]
222 pub startup_sweep_delay_secs: u64,
223 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_max_age_secs")]
228 pub startup_sweep_max_age_secs: u64,
229 #[serde(default = "NostrDiscoveryConfig::default_failure_streak_threshold")]
235 pub failure_streak_threshold: u32,
236 #[serde(default = "NostrDiscoveryConfig::default_extended_cooldown_secs")]
240 pub extended_cooldown_secs: u64,
241 #[serde(default = "NostrDiscoveryConfig::default_warn_log_interval_secs")]
246 pub warn_log_interval_secs: u64,
247 #[serde(default = "NostrDiscoveryConfig::default_failure_state_max_entries")]
251 pub failure_state_max_entries: usize,
252 #[serde(default = "NostrDiscoveryConfig::default_protocol_mismatch_cooldown_secs")]
259 pub protocol_mismatch_cooldown_secs: u64,
260}
261
262impl Default for NostrDiscoveryConfig {
263 fn default() -> Self {
264 let open_discovery_newcomer_probe_slots =
265 Self::default_open_discovery_newcomer_probe_slots();
266 let open_discovery_rating_lookback_secs =
267 Self::default_open_discovery_rating_lookback_secs();
268 Self {
269 enabled: false,
270 advertise: Self::default_advertise(),
271 advert_relays: Self::default_advert_relays(),
272 dm_relays: Self::default_dm_relays(),
273 stun_servers: Self::default_stun_servers(),
274 share_local_candidates: false,
275 app: Self::default_app(),
276 signal_ttl_secs: Self::default_signal_ttl_secs(),
277 policy: NostrDiscoveryPolicy::default(),
278 open_discovery_max_pending: Self::default_open_discovery_max_pending(),
279 open_discovery_trust_ratings_enabled: false,
280 open_discovery_newcomer_probe_slots,
281 open_discovery_rating_scope: Self::default_open_discovery_rating_scope(),
282 open_discovery_rating_lookback_secs,
283 open_discovery_trusted_rating_authors: Vec::new(),
284 open_discovery_rating_event_files: Vec::new(),
285 max_concurrent_incoming_offers: Self::default_max_concurrent_incoming_offers(),
286 advert_cache_max_entries: Self::default_advert_cache_max_entries(),
287 seen_sessions_max_entries: Self::default_seen_sessions_max_entries(),
288 attempt_timeout_secs: Self::default_attempt_timeout_secs(),
289 replay_window_secs: Self::default_replay_window_secs(),
290 punch_start_delay_ms: Self::default_punch_start_delay_ms(),
291 punch_interval_ms: Self::default_punch_interval_ms(),
292 punch_duration_ms: Self::default_punch_duration_ms(),
293 advert_ttl_secs: Self::default_advert_ttl_secs(),
294 advert_refresh_secs: Self::default_advert_refresh_secs(),
295 startup_sweep_delay_secs: Self::default_startup_sweep_delay_secs(),
296 startup_sweep_max_age_secs: Self::default_startup_sweep_max_age_secs(),
297 failure_streak_threshold: Self::default_failure_streak_threshold(),
298 extended_cooldown_secs: Self::default_extended_cooldown_secs(),
299 warn_log_interval_secs: Self::default_warn_log_interval_secs(),
300 failure_state_max_entries: Self::default_failure_state_max_entries(),
301 protocol_mismatch_cooldown_secs: Self::default_protocol_mismatch_cooldown_secs(),
302 }
303 }
304}
305
306impl NostrDiscoveryConfig {
307 fn default_advertise() -> bool {
308 true
309 }
310
311 fn default_advert_relays() -> Vec<String> {
312 vec![
313 "wss://relay.damus.io".to_string(),
314 "wss://nos.lol".to_string(),
315 "wss://offchain.pub".to_string(),
316 "wss://temp.iris.to".to_string(),
317 ]
318 }
319
320 fn default_dm_relays() -> Vec<String> {
321 vec![
322 "wss://relay.damus.io".to_string(),
323 "wss://nos.lol".to_string(),
324 "wss://offchain.pub".to_string(),
325 "wss://temp.iris.to".to_string(),
326 ]
327 }
328
329 fn default_stun_servers() -> Vec<String> {
330 vec![
331 "stun:stun.l.google.com:19302".to_string(),
332 "stun:stun.cloudflare.com:3478".to_string(),
333 "stun:global.stun.twilio.com:3478".to_string(),
334 ]
335 }
336
337 fn default_app() -> String {
338 "fips-overlay-v1".to_string()
339 }
340
341 fn default_signal_ttl_secs() -> u64 {
342 120
343 }
344
345 fn default_open_discovery_max_pending() -> usize {
346 64
347 }
348
349 fn default_open_discovery_newcomer_probe_slots() -> usize {
350 1
351 }
352
353 fn default_open_discovery_rating_scope() -> String {
354 "fips.peer".to_string()
355 }
356
357 fn default_open_discovery_rating_lookback_secs() -> u64 {
358 604_800
359 }
360
361 fn default_max_concurrent_incoming_offers() -> usize {
362 16
363 }
364
365 fn default_advert_cache_max_entries() -> usize {
366 2048
367 }
368
369 fn default_seen_sessions_max_entries() -> usize {
370 2048
371 }
372
373 fn default_attempt_timeout_secs() -> u64 {
374 10
375 }
376
377 fn default_replay_window_secs() -> u64 {
378 300
379 }
380
381 fn default_punch_start_delay_ms() -> u64 {
382 2_000
383 }
384
385 fn default_punch_interval_ms() -> u64 {
386 200
387 }
388
389 fn default_punch_duration_ms() -> u64 {
390 10_000
391 }
392
393 fn default_advert_ttl_secs() -> u64 {
394 3_600
395 }
396
397 fn default_advert_refresh_secs() -> u64 {
398 1_800
399 }
400
401 fn default_startup_sweep_delay_secs() -> u64 {
402 5
403 }
404
405 fn default_startup_sweep_max_age_secs() -> u64 {
406 3_600
407 }
408
409 fn default_failure_streak_threshold() -> u32 {
410 5
411 }
412
413 fn default_extended_cooldown_secs() -> u64 {
414 1_800
415 }
416
417 fn default_warn_log_interval_secs() -> u64 {
418 300
419 }
420
421 fn default_failure_state_max_entries() -> usize {
422 4_096
423 }
424
425 fn default_protocol_mismatch_cooldown_secs() -> u64 {
426 86_400
427 }
428}