diff --git a/Cargo.lock b/Cargo.lock index a712105c..72ff022f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1425,7 +1425,7 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkarr" version = "2.2.0" -source = "git+https://github.com/Pubky/pkarr?branch=v3#17975121c809d97dcad907fbb2ffc782e994d270" +source = "git+https://github.com/Pubky/pkarr?branch=serde#680ec9303f5f3ee4b40dc53c0071c4088d4eb6ff" dependencies = [ "base32", "bytes", @@ -1734,9 +1734,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ "base64 0.22.1", "bytes", @@ -1773,7 +1773,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg", + "windows-registry", ] [[package]] @@ -2148,6 +2148,9 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "synchronoise" @@ -2646,6 +2649,36 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2794,16 +2827,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 85148097..acd72a5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ members = [ resolver = "2" [workspace.dependencies] -pkarr = { git = "https://github.com/Pubky/pkarr", branch = "v3", package = "pkarr", features = ["async"] } +pkarr = { git = "https://github.com/Pubky/pkarr", branch = "serde", package = "pkarr", features = ["async"] } serde = { version = "^1.0.209", features = ["derive"] } [profile.release] diff --git a/pubky-homeserver/src/config.rs b/pubky-homeserver/src/config.rs index f182a529..6065306f 100644 --- a/pubky-homeserver/src/config.rs +++ b/pubky-homeserver/src/config.rs @@ -12,9 +12,11 @@ use tracing::info; use pubky_common::timestamp::Timestamp; -const DEFAULT_HOMESERVER_PORT: u16 = 6287; +// === Database === const DEFAULT_STORAGE_DIR: &str = "pubky"; +pub const DEFAULT_MAP_SIZE: usize = 10995116277760; // 10TB (not = disk-space used) +// === Server == pub const DEFAULT_LIST_LIMIT: u16 = 100; pub const DEFAULT_MAX_LIST_LIMIT: u16 = 1000; @@ -29,15 +31,16 @@ struct ConfigToml { dht_request_timeout: Option, default_list_limit: Option, max_list_limit: Option, + db_map_size: Option, } /// Server configuration -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct Config { /// Whether or not this server is running in a testnet. testnet: bool, /// The configured port for this server. - port: Option, + port: u16, /// Bootstrapping DHT nodes. /// /// Helpful to run the server locally or in testnet. @@ -62,6 +65,9 @@ pub struct Config { /// /// Defaults to `1000` max_list_limit: u16, + + // === Database params === + db_map_size: usize, } impl Config { @@ -90,7 +96,7 @@ impl Config { let config = Config { testnet: config_toml.testnet.unwrap_or(false), - port: config_toml.port, + port: config_toml.port.unwrap_or(0), bootstrap: config_toml.bootstrap, domain: config_toml.domain, keypair, @@ -100,6 +106,7 @@ impl Config { max_list_limit: config_toml .default_list_limit .unwrap_or(DEFAULT_MAX_LIST_LIMIT), + db_map_size: config_toml.db_map_size.unwrap_or(DEFAULT_MAP_SIZE), }; if config.testnet { @@ -128,17 +135,11 @@ impl Config { let testnet = pkarr::mainline::Testnet::new(10); info!(?testnet.bootstrap, "Testnet bootstrap nodes"); - let bootstrap = Some(testnet.bootstrap.to_owned()); - let storage = std::env::temp_dir() - .join(Timestamp::now().to_string()) - .join(DEFAULT_STORAGE_DIR); - - Self { - bootstrap, - storage, - port: Some(15411), - dht_request_timeout: Some(Duration::from_millis(10)), - ..Default::default() + Config { + port: 15411, + dht_request_timeout: None, + db_map_size: DEFAULT_MAP_SIZE, + ..Self::test(&testnet) } } @@ -150,14 +151,17 @@ impl Config { .join(DEFAULT_STORAGE_DIR); Self { + testnet: true, bootstrap, storage, + db_map_size: 10485760, + dht_request_timeout: Some(Duration::from_millis(10)), ..Default::default() } } pub fn port(&self) -> u16 { - self.port.unwrap_or(DEFAULT_HOMESERVER_PORT) + self.port } pub fn bootstsrap(&self) -> Option> { @@ -188,13 +192,17 @@ impl Config { pub(crate) fn dht_request_timeout(&self) -> Option { self.dht_request_timeout } + + pub(crate) fn db_map_size(&self) -> usize { + self.db_map_size + } } impl Default for Config { fn default() -> Self { Self { testnet: false, - port: Some(0), + port: 0, bootstrap: None, domain: None, storage: storage(None) @@ -203,6 +211,7 @@ impl Default for Config { dht_request_timeout: None, default_list_limit: DEFAULT_LIST_LIMIT, max_list_limit: DEFAULT_MAX_LIST_LIMIT, + db_map_size: DEFAULT_MAP_SIZE, } } } @@ -239,10 +248,58 @@ fn storage(storage: Option) -> Result { #[cfg(test)] mod tests { + use pkarr::mainline::Testnet; + use super::*; #[test] fn parse_empty() { - Config::try_from_str("").unwrap(); + let config = Config::try_from_str("").unwrap(); + + assert_eq!( + config, + Config { + keypair: config.keypair.clone(), + ..Default::default() + } + ) + } + + #[test] + fn config_test() { + let testnet = Testnet::new(3); + let config = Config::test(&testnet); + + assert_eq!( + config, + Config { + testnet: true, + bootstrap: testnet.bootstrap.into(), + db_map_size: 10485760, + dht_request_timeout: Some(Duration::from_millis(10)), + + storage: config.storage.clone(), + keypair: config.keypair.clone(), + ..Default::default() + } + ) + } + + #[test] + fn config_testnet() { + let config = Config::testnet(); + + assert_eq!( + config, + Config { + testnet: true, + port: 15411, + + bootstrap: config.bootstrap.clone(), + storage: config.storage.clone(), + keypair: config.keypair.clone(), + ..Default::default() + } + ) } } diff --git a/pubky-homeserver/src/database.rs b/pubky-homeserver/src/database.rs index ef82d0bc..e95d1d28 100644 --- a/pubky-homeserver/src/database.rs +++ b/pubky-homeserver/src/database.rs @@ -9,8 +9,6 @@ use crate::config::Config; use tables::{Tables, TABLES_COUNT}; -pub const DEFAULT_MAP_SIZE: usize = 10995116277760; // 10TB (not = disk-space used) - #[derive(Debug, Clone)] pub struct DB { pub(crate) env: Env, @@ -25,8 +23,7 @@ impl DB { let env = unsafe { EnvOpenOptions::new() .max_dbs(TABLES_COUNT) - // TODO: Add a configuration option? - .map_size(DEFAULT_MAP_SIZE) + .map_size(config.db_map_size()) .open(config.storage()) }?;