settings.rs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. use std::sync::Arc;
  2. use serde::Deserialize;
  3. use structopt::StructOpt;
  4. use structopt_toml::StructOptToml;
  5. use url::Url;
  6. use crate::net::TransportName;
  7. /// Atomic pointer to network settings.
  8. pub type SettingsPtr = Arc<Settings>;
  9. /// Default settings for the network. Can be manually configured.
  10. #[derive(Clone, Debug)]
  11. pub struct Settings {
  12. pub inbound: Vec<Url>,
  13. pub outbound_connections: u32,
  14. pub manual_attempt_limit: u32,
  15. pub seed_query_timeout_seconds: u32,
  16. pub connect_timeout_seconds: u32,
  17. pub channel_handshake_seconds: u32,
  18. pub channel_heartbeat_seconds: u32,
  19. pub outbound_retry_seconds: u64,
  20. pub external_addr: Vec<Url>,
  21. pub peers: Vec<Url>,
  22. pub seeds: Vec<Url>,
  23. pub node_id: String,
  24. pub app_version: Option<String>,
  25. pub outbound_transports: Vec<TransportName>,
  26. pub localnet: bool,
  27. pub peer_discovery: bool,
  28. pub channel_log: bool,
  29. }
  30. impl Default for Settings {
  31. fn default() -> Self {
  32. Self {
  33. inbound: Vec::new(),
  34. outbound_connections: 0,
  35. manual_attempt_limit: 0,
  36. seed_query_timeout_seconds: 8,
  37. connect_timeout_seconds: 10,
  38. channel_handshake_seconds: 4,
  39. channel_heartbeat_seconds: 10,
  40. outbound_retry_seconds: 20,
  41. external_addr: Vec::new(),
  42. peers: Vec::new(),
  43. seeds: Vec::new(),
  44. node_id: String::new(),
  45. app_version: Some(option_env!("CARGO_PKG_VERSION").unwrap_or("").to_string()),
  46. outbound_transports: get_outbound_transports(vec![]),
  47. localnet: false,
  48. peer_discovery: true,
  49. channel_log: false,
  50. }
  51. }
  52. }
  53. /// Defines the network settings.
  54. #[derive(Clone, Debug, Deserialize, StructOpt, StructOptToml)]
  55. #[structopt()]
  56. pub struct SettingsOpt {
  57. /// P2P accept addresses
  58. #[serde(default)]
  59. #[structopt(long = "accept")]
  60. pub inbound: Vec<Url>,
  61. /// Connection slots
  62. #[structopt(long = "slots")]
  63. pub outbound_connections: Option<u32>,
  64. /// P2P external addresses
  65. #[serde(default)]
  66. #[structopt(long)]
  67. pub external_addr: Vec<Url>,
  68. /// Peer nodes to connect to
  69. #[serde(default)]
  70. #[structopt(long)]
  71. pub peers: Vec<Url>,
  72. /// Seed nodes to connect to
  73. #[serde(default)]
  74. #[structopt(long)]
  75. pub seeds: Vec<Url>,
  76. #[structopt(skip)]
  77. pub manual_attempt_limit: Option<u32>,
  78. #[structopt(skip)]
  79. pub seed_query_timeout_seconds: Option<u32>,
  80. #[structopt(skip)]
  81. pub connect_timeout_seconds: Option<u32>,
  82. #[structopt(skip)]
  83. pub channel_handshake_seconds: Option<u32>,
  84. #[structopt(skip)]
  85. pub channel_heartbeat_seconds: Option<u32>,
  86. #[structopt(skip)]
  87. pub outbound_retry_seconds: Option<u64>,
  88. #[serde(default)]
  89. #[structopt(skip)]
  90. pub node_id: String,
  91. #[serde(default)]
  92. #[structopt(skip)]
  93. pub app_version: Option<String>,
  94. /// Prefered transports for outbound connections
  95. #[serde(default)]
  96. #[structopt(long = "transports")]
  97. pub outbound_transports: Vec<String>,
  98. /// Enable localnet hosts
  99. #[serde(default)]
  100. #[structopt(long)]
  101. pub localnet: bool,
  102. /// Enable peer discovery
  103. #[serde(default = "default_as_true")]
  104. #[structopt(long)]
  105. pub peer_discovery: bool,
  106. /// Enable channel log
  107. #[serde(default)]
  108. #[structopt(long)]
  109. pub channel_log: bool,
  110. }
  111. impl From<SettingsOpt> for Settings {
  112. fn from(settings_opt: SettingsOpt) -> Self {
  113. Self {
  114. inbound: settings_opt.inbound,
  115. outbound_connections: settings_opt.outbound_connections.unwrap_or(0),
  116. manual_attempt_limit: settings_opt.manual_attempt_limit.unwrap_or(0),
  117. seed_query_timeout_seconds: settings_opt.seed_query_timeout_seconds.unwrap_or(8),
  118. connect_timeout_seconds: settings_opt.connect_timeout_seconds.unwrap_or(10),
  119. channel_handshake_seconds: settings_opt.channel_handshake_seconds.unwrap_or(4),
  120. channel_heartbeat_seconds: settings_opt.channel_heartbeat_seconds.unwrap_or(10),
  121. outbound_retry_seconds: settings_opt.outbound_retry_seconds.unwrap_or(1200),
  122. external_addr: settings_opt.external_addr,
  123. peers: settings_opt.peers,
  124. seeds: settings_opt.seeds,
  125. node_id: settings_opt.node_id,
  126. app_version: settings_opt.app_version,
  127. outbound_transports: get_outbound_transports(settings_opt.outbound_transports),
  128. localnet: settings_opt.localnet,
  129. peer_discovery: settings_opt.peer_discovery,
  130. channel_log: settings_opt.channel_log,
  131. }
  132. }
  133. }
  134. /// Auxiliary function to convert outbound transport Vec<String>
  135. /// to Vec<TransportName>, using defaults if empty.
  136. pub fn get_outbound_transports(opt_outbound_transports: Vec<String>) -> Vec<TransportName> {
  137. let mut outbound_transports = vec![];
  138. for transport in opt_outbound_transports {
  139. let transport_name = TransportName::try_from(transport.as_str()).unwrap();
  140. outbound_transports.push(transport_name);
  141. }
  142. if outbound_transports.is_empty() {
  143. let tls = TransportName::Tcp(Some("tls".into()));
  144. outbound_transports.push(tls);
  145. let tcp = TransportName::Tcp(None);
  146. outbound_transports.push(tcp);
  147. }
  148. outbound_transports
  149. }
  150. /// Auxiliary function to set serde bool value to true.
  151. fn default_as_true() -> bool {
  152. true
  153. }