1use serde::{Deserialize, Serialize};
2use std::collections::HashSet;
3use std::net::SocketAddr;
4use std::path::PathBuf;
5
6#[derive(Clone, Debug, Serialize, Deserialize)]
7#[serde(rename_all = "kebab-case")]
8pub struct ServerConfig {
9 pub lnurl_service: Option<LnUrlBalancerServiceConfig>,
10 pub discovery_service: Option<DiscoveryServiceConfig>,
11 pub offer_service: Option<OfferServiceConfig>,
12 pub store: Option<ServerStoreConfig>,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
16#[serde(rename_all = "kebab-case")]
17pub struct LnUrlBalancerServiceConfig {
18 pub partitions: HashSet<String>,
19 pub address: SocketAddr,
20 pub health_check_frequency_secs: f64,
21 pub parallel_health_check: bool,
22 pub health_check_consecutive_success_to_healthy: usize,
23 pub health_check_consecutive_failure_to_unhealthy: usize,
24 pub backend_update_frequency_secs: f64,
25 pub invoice_expiry_secs: u64,
26 pub allowed_hosts: HashSet<String>,
27 pub backoff: BackoffConfig,
28 pub backend_selection: BackendSelectionConfig,
29 pub tls: Option<TlsConfig>,
30 pub ln_client_timeout_secs: f64,
31 pub selection_capacity_bias: Option<f64>,
32 pub comment_allowed: Option<u32>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36#[serde(rename_all = "kebab-case")]
37pub struct DiscoveryServiceConfig {
38 pub address: SocketAddr,
39 pub auth_authority: PathBuf,
40 pub tls: Option<TlsConfig>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(rename_all = "kebab-case")]
45pub struct OfferServiceConfig {
46 pub address: SocketAddr,
47 pub auth_authority: PathBuf,
48 pub tls: Option<TlsConfig>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52#[serde(tag = "type", rename_all = "kebab-case")]
53pub enum BackoffConfig {
54 Stop,
55 #[serde(rename_all = "kebab-case")]
56 Exponential {
57 initial_interval_secs: Option<f64>,
58 randomization_factor: Option<f64>,
59 multiplier: Option<f64>,
60 max_interval_secs: Option<f64>,
61 max_elapsed_time_secs: Option<f64>,
62 },
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66#[serde(rename_all = "kebab-case")]
67pub enum BackendSelectionConfig {
68 RoundRobin,
69 Random,
70 Consistent { max_iterations: usize },
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "kebab-case")]
75pub struct ServerStoreConfig {
76 pub offer: Option<OfferStoreConfig>,
77 pub discover: Option<DiscoveryStoreConfig>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81#[serde(tag = "type", rename_all = "kebab-case")]
82pub enum OfferStoreConfig {
83 #[serde(rename_all = "kebab-case")]
84 Database {
85 database_url: String,
86 max_connections: u32,
87 },
88 Memory,
89 #[serde(rename_all = "kebab-case")]
90 Http {
91 base_url: String,
92 connect_timeout_secs: f64,
93 total_timeout_secs: f64,
94 trusted_roots: Vec<PathBuf>,
95 authorization: PathBuf,
96 },
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100#[serde(tag = "type", rename_all = "kebab-case")]
101pub enum DiscoveryStoreConfig {
102 #[serde(rename_all = "kebab-case")]
103 Database {
104 database_url: String,
105 max_connections: u32,
106 },
107 Memory,
108 #[serde(rename_all = "kebab-case")]
109 Http {
110 base_url: String,
111 connect_timeout_secs: f64,
112 total_timeout_secs: f64,
113 trusted_roots: Vec<PathBuf>,
114 authorization: PathBuf,
115 },
116 #[serde(rename_all = "kebab-case")]
117 File {
118 storage_dir: String,
119 },
120}
121
122#[derive(Clone, Debug, Serialize, Deserialize)]
123#[serde(rename_all = "kebab-case")]
124pub struct TlsConfig {
125 pub cert_path: PathBuf,
126 pub key_path: PathBuf,
127}