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 = "NostrDiscoveryConfig::default_max_concurrent_incoming_offers")]
158 pub max_concurrent_incoming_offers: usize,
159 #[serde(default = "NostrDiscoveryConfig::default_advert_cache_max_entries")]
162 pub advert_cache_max_entries: usize,
163 #[serde(default = "NostrDiscoveryConfig::default_seen_sessions_max_entries")]
166 pub seen_sessions_max_entries: usize,
167 #[serde(default = "NostrDiscoveryConfig::default_attempt_timeout_secs")]
169 pub attempt_timeout_secs: u64,
170 #[serde(default = "NostrDiscoveryConfig::default_replay_window_secs")]
172 pub replay_window_secs: u64,
173 #[serde(default = "NostrDiscoveryConfig::default_punch_start_delay_ms")]
175 pub punch_start_delay_ms: u64,
176 #[serde(default = "NostrDiscoveryConfig::default_punch_interval_ms")]
178 pub punch_interval_ms: u64,
179 #[serde(default = "NostrDiscoveryConfig::default_punch_duration_ms")]
181 pub punch_duration_ms: u64,
182 #[serde(default = "NostrDiscoveryConfig::default_advert_ttl_secs")]
184 pub advert_ttl_secs: u64,
185 #[serde(default = "NostrDiscoveryConfig::default_advert_refresh_secs")]
187 pub advert_refresh_secs: u64,
188 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_delay_secs")]
193 pub startup_sweep_delay_secs: u64,
194 #[serde(default = "NostrDiscoveryConfig::default_startup_sweep_max_age_secs")]
199 pub startup_sweep_max_age_secs: u64,
200 #[serde(default = "NostrDiscoveryConfig::default_failure_streak_threshold")]
206 pub failure_streak_threshold: u32,
207 #[serde(default = "NostrDiscoveryConfig::default_extended_cooldown_secs")]
211 pub extended_cooldown_secs: u64,
212 #[serde(default = "NostrDiscoveryConfig::default_warn_log_interval_secs")]
217 pub warn_log_interval_secs: u64,
218 #[serde(default = "NostrDiscoveryConfig::default_failure_state_max_entries")]
222 pub failure_state_max_entries: usize,
223 #[serde(default = "NostrDiscoveryConfig::default_protocol_mismatch_cooldown_secs")]
230 pub protocol_mismatch_cooldown_secs: u64,
231}
232
233impl Default for NostrDiscoveryConfig {
234 fn default() -> Self {
235 Self {
236 enabled: false,
237 advertise: Self::default_advertise(),
238 advert_relays: Self::default_advert_relays(),
239 dm_relays: Self::default_dm_relays(),
240 stun_servers: Self::default_stun_servers(),
241 share_local_candidates: false,
242 app: Self::default_app(),
243 signal_ttl_secs: Self::default_signal_ttl_secs(),
244 policy: NostrDiscoveryPolicy::default(),
245 open_discovery_max_pending: Self::default_open_discovery_max_pending(),
246 max_concurrent_incoming_offers: Self::default_max_concurrent_incoming_offers(),
247 advert_cache_max_entries: Self::default_advert_cache_max_entries(),
248 seen_sessions_max_entries: Self::default_seen_sessions_max_entries(),
249 attempt_timeout_secs: Self::default_attempt_timeout_secs(),
250 replay_window_secs: Self::default_replay_window_secs(),
251 punch_start_delay_ms: Self::default_punch_start_delay_ms(),
252 punch_interval_ms: Self::default_punch_interval_ms(),
253 punch_duration_ms: Self::default_punch_duration_ms(),
254 advert_ttl_secs: Self::default_advert_ttl_secs(),
255 advert_refresh_secs: Self::default_advert_refresh_secs(),
256 startup_sweep_delay_secs: Self::default_startup_sweep_delay_secs(),
257 startup_sweep_max_age_secs: Self::default_startup_sweep_max_age_secs(),
258 failure_streak_threshold: Self::default_failure_streak_threshold(),
259 extended_cooldown_secs: Self::default_extended_cooldown_secs(),
260 warn_log_interval_secs: Self::default_warn_log_interval_secs(),
261 failure_state_max_entries: Self::default_failure_state_max_entries(),
262 protocol_mismatch_cooldown_secs: Self::default_protocol_mismatch_cooldown_secs(),
263 }
264 }
265}
266
267impl NostrDiscoveryConfig {
268 fn default_advertise() -> bool {
269 true
270 }
271
272 fn default_advert_relays() -> Vec<String> {
273 vec![
274 "wss://relay.damus.io".to_string(),
275 "wss://nos.lol".to_string(),
276 "wss://offchain.pub".to_string(),
277 "wss://temp.iris.to".to_string(),
278 ]
279 }
280
281 fn default_dm_relays() -> Vec<String> {
282 vec![
283 "wss://relay.damus.io".to_string(),
284 "wss://nos.lol".to_string(),
285 "wss://offchain.pub".to_string(),
286 "wss://temp.iris.to".to_string(),
287 ]
288 }
289
290 fn default_stun_servers() -> Vec<String> {
291 vec![
292 "stun:stun.l.google.com:19302".to_string(),
293 "stun:stun.cloudflare.com:3478".to_string(),
294 "stun:global.stun.twilio.com:3478".to_string(),
295 ]
296 }
297
298 fn default_app() -> String {
299 "fips-overlay-v1".to_string()
300 }
301
302 fn default_signal_ttl_secs() -> u64 {
303 120
304 }
305
306 fn default_open_discovery_max_pending() -> usize {
307 64
308 }
309
310 fn default_max_concurrent_incoming_offers() -> usize {
311 16
312 }
313
314 fn default_advert_cache_max_entries() -> usize {
315 2048
316 }
317
318 fn default_seen_sessions_max_entries() -> usize {
319 2048
320 }
321
322 fn default_attempt_timeout_secs() -> u64 {
323 10
324 }
325
326 fn default_replay_window_secs() -> u64 {
327 300
328 }
329
330 fn default_punch_start_delay_ms() -> u64 {
331 2_000
332 }
333
334 fn default_punch_interval_ms() -> u64 {
335 200
336 }
337
338 fn default_punch_duration_ms() -> u64 {
339 10_000
340 }
341
342 fn default_advert_ttl_secs() -> u64 {
343 3_600
344 }
345
346 fn default_advert_refresh_secs() -> u64 {
347 1_800
348 }
349
350 fn default_startup_sweep_delay_secs() -> u64 {
351 5
352 }
353
354 fn default_startup_sweep_max_age_secs() -> u64 {
355 3_600
356 }
357
358 fn default_failure_streak_threshold() -> u32 {
359 5
360 }
361
362 fn default_extended_cooldown_secs() -> u64 {
363 1_800
364 }
365
366 fn default_warn_log_interval_secs() -> u64 {
367 300
368 }
369
370 fn default_failure_state_max_entries() -> usize {
371 4_096
372 }
373
374 fn default_protocol_mismatch_cooldown_secs() -> u64 {
375 86_400
376 }
377}