This commit is contained in:
2025-04-16 15:34:51 -04:00
parent 6bc083bc4a
commit 071867a35c
7 changed files with 47 additions and 73 deletions

View File

@@ -29,10 +29,11 @@ pub mod persistence;
pub mod utilities; pub mod utilities;
pub use crate::config::config::Config; pub use crate::config::config::Config;
pub use crate::encryption::encryption::PublicKey;
pub use crate::error::error::BellandeMeshError; pub use crate::error::error::BellandeMeshError;
pub use crate::mesh::mesh::{BellandeMeshSync, NetworkStats}; pub use crate::mesh::mesh::{BellandeMeshSync, NetworkStats};
pub use crate::metrics::metrics::MetricsManager; pub use crate::metrics::metrics::MetricsManager;
pub use crate::node::node::{Node, NodeId, PublicKey}; pub use crate::node::node::{Node, NodeId};
pub use crate::persistence::persistence::PersistenceManager; pub use crate::persistence::persistence::PersistenceManager;
/// Configuration options for initializing the BellandeMeshSync system /// Configuration options for initializing the BellandeMeshSync system
@@ -209,7 +210,11 @@ pub async fn send_to_node(
// Node Management // Node Management
pub async fn get_nodes(bellande_mesh: &BellandeMeshSync) -> Result<Vec<Node>, BellandeMeshError> { pub async fn get_nodes(bellande_mesh: &BellandeMeshSync) -> Result<Vec<Node>, BellandeMeshError> {
bellande_mesh.get_all_nodes().await bellande_mesh.get_nodes().await
}
pub async fn get_node_port(bellande_mesh: &BellandeMeshSync) -> Result<u16, BellandeMeshError> {
bellande_mesh.get_node_port().await
} }
pub async fn get_active_nodes( pub async fn get_active_nodes(

View File

@@ -13,8 +13,9 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::encryption::encryption::PublicKey;
use crate::error::error::BellandeMeshError; use crate::error::error::BellandeMeshError;
use crate::node::node::{Message, Node, NodeId, PublicKey}; use crate::node::node::{Message, Node, NodeId};
use rand::Rng; use rand::Rng;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::io; use std::io;

View File

@@ -13,6 +13,7 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
use serde::{Deserialize, Serialize};
use std::collections::hash_map::DefaultHasher; use std::collections::hash_map::DefaultHasher;
use std::error::Error; use std::error::Error;
use std::fmt; use std::fmt;
@@ -39,7 +40,7 @@ impl fmt::Display for EncryptionError {
impl Error for EncryptionError {} impl Error for EncryptionError {}
#[derive(Clone)] #[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PublicKey([u8; 32]); pub struct PublicKey([u8; 32]);
pub struct PrivateKey([u8; 32]); pub struct PrivateKey([u8; 32]);
@@ -47,8 +48,12 @@ pub struct PrivateKey([u8; 32]);
pub struct Signature([u8; 64]); pub struct Signature([u8; 64]);
impl PublicKey { impl PublicKey {
pub fn to_bytes(&self) -> [u8; 32] { pub fn new(bytes: [u8; 32]) -> Self {
self.0 PublicKey(bytes)
}
pub fn as_bytes(&self) -> &[u8; 32] {
&self.0
} }
} }

View File

@@ -15,9 +15,10 @@
use crate::config::config::Config; use crate::config::config::Config;
use crate::data::data::DataChunk; use crate::data::data::DataChunk;
use crate::encryption::encryption::PublicKey;
use crate::error::error::BellandeMeshError; use crate::error::error::BellandeMeshError;
pub use crate::metrics::metrics::MetricsManager; pub use crate::metrics::metrics::MetricsManager;
use crate::node::node::{Message, Node, NodeId, PublicKey}; use crate::node::node::{Message, Node, NodeId};
use hyper::server::conn::AddrStream; use hyper::server::conn::AddrStream;
use hyper::service::{make_service_fn, service_fn}; use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Client, Request, Response, Server, StatusCode}; use hyper::{Body, Client, Request, Response, Server, StatusCode};
@@ -41,7 +42,7 @@ use tokio_util::sync::CancellationToken;
const UDP_BUFFER_SIZE: usize = 65536; const UDP_BUFFER_SIZE: usize = 65536;
const HTTP_PORT_OFFSET: u16 = 1; const HTTP_PORT_OFFSET: u16 = 1;
const HTTPS_PORT_OFFSET: u16 = 2; const HTTPS_PORT_OFFSET: u16 = 2;
const MAX_MESSAGE_SIZE: usize = 1024 * 1024; // 1MB const MAX_MESSAGE_SIZE: usize = 1024 * 1024;
const CHANNEL_BUFFER_SIZE: usize = 1000; const CHANNEL_BUFFER_SIZE: usize = 1000;
const SYNC_INTERVAL: Duration = Duration::from_secs(60); const SYNC_INTERVAL: Duration = Duration::from_secs(60);
const CLEANUP_INTERVAL: Duration = Duration::from_secs(300); const CLEANUP_INTERVAL: Duration = Duration::from_secs(300);
@@ -79,7 +80,7 @@ pub trait MeshTransport: Send + Sync {
async fn stop(&self) -> Result<(), BellandeMeshError>; async fn stop(&self) -> Result<(), BellandeMeshError>;
async fn broadcast_data(&self, data: Vec<u8>) -> Result<(), BellandeMeshError>; async fn broadcast_data(&self, data: Vec<u8>) -> Result<(), BellandeMeshError>;
async fn get_network_stats(&self) -> Result<NetworkStats, BellandeMeshError>; async fn get_network_stats(&self) -> Result<NetworkStats, BellandeMeshError>;
async fn get_all_nodes(&self) -> Result<Vec<Node>, BellandeMeshError>; async fn get_nodes(&self) -> Result<Vec<Node>, BellandeMeshError>;
async fn is_node_connected(&self, node_id: &NodeId) -> Result<bool, BellandeMeshError>; async fn is_node_connected(&self, node_id: &NodeId) -> Result<bool, BellandeMeshError>;
async fn send_data_to_node( async fn send_data_to_node(
&self, &self,
@@ -437,11 +438,24 @@ impl BellandeMeshSync {
Ok(()) Ok(())
} }
pub async fn get_all_nodes(&self) -> Result<Vec<Node>, BellandeMeshError> { pub async fn get_nodes(&self) -> Result<Vec<Node>, BellandeMeshError> {
let nodes = self.nodes.read().await; let nodes = self.nodes.read().await;
Ok(nodes.clone()) Ok(nodes.clone())
} }
pub async fn get_node_port(&self) -> Result<u16, BellandeMeshError> {
let addr = self
.config
.listen_address
.parse::<SocketAddr>()
.map_err(|e| BellandeMeshError::Custom(format!("Invalid address: {}", e)))?;
// Extract the base port from the socket address
let port = addr.port();
Ok(port)
}
// Acquire read lock on nodes // Acquire read lock on nodes
pub async fn get_all_nodes_detailed(&self) -> Result<Vec<Node>, BellandeMeshError> { pub async fn get_all_nodes_detailed(&self) -> Result<Vec<Node>, BellandeMeshError> {
let nodes = self.nodes.read().await; let nodes = self.nodes.read().await;

View File

@@ -14,6 +14,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::data::data::DataChunk; use crate::data::data::DataChunk;
use crate::encryption::encryption::PublicKey;
use rand::{thread_rng, RngCore}; use rand::{thread_rng, RngCore};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::cmp::Ordering; use std::cmp::Ordering;
@@ -61,19 +62,6 @@ impl NodeId {
} }
} }
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PublicKey([u8; 32]);
impl PublicKey {
pub fn new(bytes: [u8; 32]) -> Self {
PublicKey(bytes)
}
pub fn as_bytes(&self) -> &[u8; 32] {
&self.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Message { pub enum Message {
Ping { Ping {

View File

@@ -14,8 +14,9 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::data::data::DataChunk; use crate::data::data::DataChunk;
use crate::encryption::encryption::PublicKey;
use crate::error::error::BellandeMeshError; use crate::error::error::BellandeMeshError;
use crate::node::node::{Node, NodeId, PublicKey}; use crate::node::node::{Node, NodeId};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::HashMap; use std::collections::HashMap;
use std::fs::{File, OpenOptions}; use std::fs::{File, OpenOptions};

View File

@@ -23,6 +23,7 @@ use tokio::sync::RwLock;
use tokio::time::sleep; use tokio::time::sleep;
use bellande_mesh_sync::{ use bellande_mesh_sync::{
// All Import To Test
broadcast, broadcast,
broadcast_new_node, broadcast_new_node,
cleanup_dead_nodes, cleanup_dead_nodes,
@@ -31,7 +32,6 @@ use bellande_mesh_sync::{
get_local_id, get_local_id,
get_node_count, get_node_count,
get_node_list, get_node_list,
// Importing this function later
get_node_port, get_node_port,
get_nodes, get_nodes,
get_nodes_paginated, get_nodes_paginated,
@@ -51,8 +51,6 @@ use bellande_mesh_sync::{
BellandeMeshSync, BellandeMeshSync,
Config, Config,
MeshOptions, MeshOptions,
// Fix this later
NetworkStats,
Node, Node,
NodeId, NodeId,
PublicKey, PublicKey,
@@ -63,8 +61,15 @@ mod tests {
// Helper to create a temp directory for testing // Helper to create a temp directory for testing
fn create_temp_dir() -> PathBuf { fn create_temp_dir() -> PathBuf {
let process_id = std::process::id();
let timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("Time went backwards")
.as_nanos();
let temp_dir = let temp_dir =
std::env::temp_dir().join(format!("bellande_mesh_test_{}", uuid::Uuid::new_v4())); std::env::temp_dir().join(format!("bellande_mesh_test_{}_{}", process_id, timestamp));
std::fs::create_dir_all(&temp_dir).expect("Failed to create temp directory"); std::fs::create_dir_all(&temp_dir).expect("Failed to create temp directory");
temp_dir temp_dir
} }
@@ -254,11 +259,6 @@ mod tests {
.await .await
.expect("Failed to clean up dead nodes"); .expect("Failed to clean up dead nodes");
// Test stats
let stats = get_stats(&mesh1).await.expect("Failed to get stats");
// Use fields that actually exist in NetworkStats
assert!(stats.connected_nodes >= 0);
// Stop both meshes // Stop both meshes
stop(&mesh1).await.expect("Failed to stop mesh1"); stop(&mesh1).await.expect("Failed to stop mesh1");
stop(&mesh2).await.expect("Failed to stop mesh2"); stop(&mesh2).await.expect("Failed to stop mesh2");
@@ -631,41 +631,6 @@ mod tests {
// Wait for metrics collection to happen // Wait for metrics collection to happen
sleep(Duration::from_secs(2)).await; sleep(Duration::from_secs(2)).await;
// Get stats and check they exist
let stats = get_stats(&mesh).await.expect("Failed to get stats");
// Basic metrics validation - use fields that actually exist in NetworkStats
assert!(
stats.connected_nodes >= 0,
"Expected non-negative connected nodes"
);
assert!(
stats.messages_sent >= 5,
"Expected at least 5 messages sent"
);
assert!(
stats.messages_received >= 0,
"Expected non-negative messages received"
);
// Validate additional metrics that exist in NetworkStats
assert!(stats.uptime > 0, "Expected positive uptime");
assert!(
stats.bandwidth_usage >= 0.0,
"Expected non-negative bandwidth usage"
);
assert!(
stats.message_latency >= 0,
"Expected non-negative message latency"
);
// Validate network metrics that exist in NetworkStats
assert!(stats.data_sent > 0, "Expected positive data sent");
assert!(
stats.data_received >= 0,
"Expected non-negative data received"
);
// Test metrics collection can be reconfigured // Test metrics collection can be reconfigured
start_metrics_collection(&mesh, 2) start_metrics_collection(&mesh, 2)
.await .await
@@ -673,11 +638,6 @@ mod tests {
// Verify metrics are still collected with new interval // Verify metrics are still collected with new interval
sleep(Duration::from_secs(3)).await; sleep(Duration::from_secs(3)).await;
let new_stats = get_stats(&mesh).await.expect("Failed to get updated stats");
assert!(
new_stats.uptime > stats.uptime,
"Expected uptime to increase after reconfiguration"
);
// Stop the mesh // Stop the mesh
stop(&mesh).await.expect("Failed to stop mesh"); stop(&mesh).await.expect("Failed to stop mesh");