| Crates.io | saorsa-core |
| lib.rs | saorsa-core |
| version | 0.3.22 |
| created_at | 2025-06-30 11:55:25.693065+00 |
| updated_at | 2025-09-17 22:04:14.189071+00 |
| description | Saorsa - Core P2P networking library with DHT, QUIC transport, and four-word addresses |
| homepage | https://github.com/dirvine/saorsa-core-foundation |
| repository | https://github.com/dirvine/saorsa-core-foundation |
| max_upload_size | |
| id | 1731750 |
| size | 5,779,098 |
Core P2P networking library for Saorsa platform with DHT, QUIC transport, dual-stack endpoints (IPv6+IPv4), and four-word endpoint encoding.
four-word-networking (IPv4 encodes to 4 words; IPv6 word count decided by the crate); decode requires an explicit port (no defaults).Add this to your Cargo.toml:
[dependencies]
saorsa-core = "0.3.4"
use saorsa_core::{Network, NetworkConfig, NodeId};
use tokio;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a new network node
let config = NetworkConfig::default();
let mut network = Network::new(config).await?;
// Start the network
network.start().await?;
// Store some data
let key = b"example-key";
let value = b"example-value";
network.store(key, value.to_vec()).await?;
// Retrieve the data
if let Some(retrieved) = network.retrieve(key).await? {
println!("Retrieved: {:?}", retrieved);
}
Ok(())
}
four-word-networking crate’s adaptive API.Network Layer: QUIC-based P2P networking with NAT traversal
DHT: Kademlia-based DHT with RSPS optimization
Placement System: Intelligent shard placement with weighted selection algorithms
Identity: Post‑quantum cryptographic identities with ML‑DSA‑65 signatures (no PoW; no embedded four‑word address)
Storage: Local and distributed content storage with audit and repair
Geographic Routing: Location-aware message routing
Saorsa Core implements a pure post-quantum cryptographic approach for maximum security:
four-word-networking adaptive API; four‑words reserved for endpoints only.UserHandle for messaging identities; migrated mentions, presence, participants, search, reactions, and read/delivered receipts to use it.Application
↓
Network API
↓
Placement Engine → DHT + Geographic Routing
↓ ↓
↓ Audit & Repair
↓ ↓
QUIC Transport (ant-quic)
↓
Internet
Saorsa Core includes an advanced placement system for optimal distribution of erasure-coded shards across the network:
use saorsa_core::placement::{
PlacementEngine, PlacementConfig, GeographicLocation, NetworkRegion
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Configure placement system
let config = PlacementConfig {
replication_factor: (3, 8).into(), // Min 3, target 8 replicas
byzantine_tolerance: 2.into(), // Tolerate up to 2 Byzantine nodes
placement_timeout: Duration::from_secs(30),
geographic_diversity: true,
weights: OptimizationWeights {
trust_weight: 0.4, // EigenTrust reputation
performance_weight: 0.3, // Node performance metrics
capacity_weight: 0.2, // Available storage capacity
diversity_bonus: 0.1, // Geographic/network diversity
},
};
// Create placement engine
let mut engine = PlacementEngine::new(config);
// Place data with optimal shard distribution
let data = b"important data to store";
let decision = placement_orchestrator.place_data(
data.to_vec(),
8, // replication factor
Some(NetworkRegion::NorthAmerica),
).await?;
println!("Placed {} shards across {} nodes",
decision.shard_count,
decision.selected_nodes.len());
Ok(())
}
use saorsa_core::NetworkConfig;
let config = NetworkConfig {
listen_port: 9000,
bootstrap_nodes: vec![
"bootstrap1.example.com:9000".parse()?,
"bootstrap2.example.com:9000".parse()?,
],
enable_four_word_addresses: true,
dht_replication: 20,
storage_capacity: 1024 * 1024 * 1024, // 1GB
..Default::default()
};
default - DHT, ant-quic (four-word addresses always enabled)dht - DHT functionalityant-quic - QUIC transportquantum-resistant - Post-quantum cryptography (ML-DSA, ML-KEM)threshold - Threshold cryptographycli - CLI utilitiesmetrics - Prometheus metricscommercial - Commercial license featuresSaorsa Core is designed for high performance:
Run benchmarks with:
cargo bench
Key benchmarks:
Saorsa Core provides a unique WebRTC-over-QUIC bridge that combines the real-time capabilities of WebRTC with the performance and reliability of QUIC transport. This allows for high-quality media streaming with improved NAT traversal and congestion control.
use saorsa_core::messaging::{
WebRtcQuicBridge, QuicMediaStreamManager, StreamConfig, StreamType, QosParameters
};
use saorsa_core::transport::ant_quic_adapter::P2PNetworkNode;
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create network node
let node = Arc::new(P2PNetworkNode::new("127.0.0.1:0".parse()?).await?);
// Create WebRTC-QUIC bridge
let bridge = WebRtcQuicBridge::new(node).await?;
// Create stream manager for bandwidth management
let manager = QuicMediaStreamManager::new(2000); // 2 Mbps
manager.start_background_tasks().await?;
// Connect to peer
let peer_addr = "192.168.1.100:9000".parse()?;
let peer_id = bridge.connect_peer(peer_addr).await?;
// Configure audio stream
let audio_config = StreamConfig {
stream_type: StreamType::Audio,
codec: "opus".to_string(),
bitrate_kbps: 64,
sample_rate: Some(48000),
resolution: None,
};
bridge.add_stream(peer_id, StreamType::Audio, audio_config).await?;
// Configure video stream
let video_config = StreamConfig {
stream_type: StreamType::Video,
codec: "h264".to_string(),
bitrate_kbps: 1000,
sample_rate: None,
resolution: Some((1280, 720)),
};
bridge.add_stream(peer_id, StreamType::Video, video_config).await?;
// Set QoS parameters
manager.set_qos_params(StreamType::Audio, QosParameters::audio()).await;
manager.set_qos_params(StreamType::Video, QosParameters::video()).await;
// Start receiving packets
let mut receiver = bridge.start_receiving().await?;
// Handle incoming packets
tokio::spawn(async move {
while let Some((peer_id, packet)) = receiver.recv().await {
println!("Received {} packet from {}", packet.stream_type, peer_id);
// Process packet...
}
});
Ok(())
}
use saorsa_core::messaging::RtpPacket;
// Create and send RTP packets
async fn send_media_packets(
bridge: &WebRtcQuicBridge,
peer_id: PeerId,
) -> Result<()> {
// Audio packet (Opus codec)
let audio_packet = RtpPacket::new(
96, // Payload type (Opus)
1001, // Sequence number
48000, // Timestamp (48kHz sample rate)
0x12345678, // SSRC identifier
vec![0xAA; 160], // Opus frame data (20ms @ 48kHz)
StreamType::Audio,
);
bridge.send_rtp_packet(peer_id, audio_packet).await?;
// Video packet (H.264 codec)
let video_packet = RtpPacket::new(
97, // Payload type (H.264)
2001, // Sequence number
90000, // Timestamp (90kHz for video)
0x87654321, // SSRC identifier
vec![0xBB; 1200], // H.264 NAL unit
StreamType::Video,
);
bridge.send_rtp_packet(peer_id, video_packet).await?;
Ok(())
}
use saorsa_core::messaging::QosParameters;
// Configure QoS for different stream types
let audio_qos = QosParameters {
priority: 3, // Highest priority
max_latency_ms: 20, // Low latency for real-time audio
max_jitter_ms: 5, // Minimal jitter tolerance
target_bitrate_kbps: 64,
max_bitrate_kbps: 128,
min_bitrate_kbps: 32,
loss_threshold: 1.0, // 1% packet loss threshold
};
let video_qos = QosParameters {
priority: 2, // Medium priority
max_latency_ms: 100, // Higher latency tolerance
max_jitter_ms: 20, // More jitter tolerance
target_bitrate_kbps: 1000,
max_bitrate_kbps: 2000,
min_bitrate_kbps: 200,
loss_threshold: 3.0, // 3% packet loss threshold
};
manager.set_qos_params(StreamType::Audio, audio_qos).await;
manager.set_qos_params(StreamType::Video, video_qos).await;
// Check for bandwidth adaptation recommendations
if let Some(adjustment) = manager.check_bandwidth_adaptation().await {
match adjustment {
BandwidthAdjustment::Increase { current, recommended } => {
println!("Increase bandwidth: {} -> {} kbps", current, recommended);
// Adjust encoder settings...
}
BandwidthAdjustment::Decrease { current, recommended } => {
println!("Decrease bandwidth: {} -> {} kbps", current, recommended);
// Reduce quality or bitrate...
}
}
}
// Check transmission capacity
let can_send_hd = manager.can_transmit(1500).await; // 1.5KB HD frame
if !can_send_hd {
// Switch to lower resolution or quality
}
// Get peer statistics
if let Some(stats) = bridge.get_peer_stats(peer_id).await {
println!("Packets sent: {}", stats.packets_sent);
println!("Packets received: {}", stats.packets_received);
println!("Bytes transferred: {}", stats.bytes_sent);
println!("Active streams: {}", stats.streams.len());
}
// Get stream-specific statistics
let stream_stats = manager.get_all_stats().await;
for ((peer_id, stream_type), stats) in stream_stats {
println!("{:?} stream to {}:", stream_type, peer_id);
println!(" RTT: {}ms", stats.rtt_ms);
println!(" Loss: {:.2}%", stats.loss_percentage());
println!(" Throughput: {} kbps", stats.effective_bitrate_kbps());
}
// Configure multiple streams for comprehensive communication
bridge.add_stream(peer_id, StreamType::Audio, audio_config).await?;
bridge.add_stream(peer_id, StreamType::Video, video_config).await?;
bridge.add_stream(peer_id, StreamType::ScreenShare, screen_config).await?;
bridge.add_stream(peer_id, StreamType::Data, data_config).await?;
use saorsa_core::messaging::BridgeConfig;
let config = BridgeConfig {
jitter_buffer_size: 100, // 100 packets max
jitter_buffer_delay: Duration::from_millis(50), // 50ms buffer
peer_timeout: Duration::from_secs(30), // 30s peer timeout
cleanup_interval: Duration::from_secs(5), // Cleanup every 5s
max_packet_size: 1500, // MTU consideration
enable_adaptive_jitter: true, // Adaptive jitter buffering
};
let bridge = WebRtcQuicBridge::new_with_config(node, config).await?;
// Robust error handling
match bridge.send_rtp_packet(peer_id, packet).await {
Ok(_) => {
// Packet sent successfully
}
Err(e) => {
eprintln!("Failed to send packet: {}", e);
// Attempt reconnection if peer disconnected
if e.to_string().contains("not connected") {
match bridge.connect_peer(peer_addr).await {
Ok(new_peer_id) => {
// Reconfigure streams for new connection
configure_streams(&bridge, new_peer_id).await?;
}
Err(reconnect_err) => {
eprintln!("Reconnection failed: {}", reconnect_err);
}
}
}
}
}
Built-in media processing capabilities:
SQLite-based persistence with migrations:
use saorsa_core::storage::Database;
let db = Database::open("./data/node.db").await?;
db.store_message(&message).await?;
Location-aware networking:
# Standard build
cargo build --release
# With all features
cargo build --all-features
# Feature-specific build
cargo build --features "dht,quantum-resistant"
# Unit tests
cargo test
# Integration tests
cargo test --test '*'
# Property-based tests
cargo test --features "proptest"
cargo clippy --all-features -- -D warnings
cargo fmt --all
cargo fmt for formattingcargo clippy passesThis project is dual-licensed:
For commercial licensing, contact: saorsalabs@gmail.com
tokio - Async runtimefutures - Future utilitiesserde - Serializationanyhow - Error handlingtracing - Loggingant-quic - QUIC transportfour-word-networking - Human-readable addressesrustls - TLS supportsaorsa-pqc - Post-quantum cryptography (ML-DSA, ML-KEM, ChaCha20-Poly1305)blake3 - Hashingrand - Random number generationsqlx - Database operationslru - LRU cachingreed-solomon-erasure - Error correctionwebrtc - WebRTC implementationimage - Image processingsymphonia - Audio codecsrodio - Audio playbackSee Cargo.toml for complete dependency list.
See CHANGELOG.md for version history.
Saorsa Labs Limited - Building the decentralized future