chie_shared/
lib.rs

1//! Shared types, errors, and utilities for CHIE Protocol.
2//!
3//! This crate provides common types and utilities used across all CHIE Protocol components:
4//! - Core protocol types (content, bandwidth proofs, chunks)
5//! - Error types for protocol operations
6//! - Database conversion traits
7//! - Utility functions for common operations
8//! - JSON schema generation (optional)
9//!
10//! # Examples
11//!
12//! ## Creating Content Metadata
13//!
14//! ```
15//! use chie_shared::{ContentMetadataBuilder, ContentCategory, ContentStatus};
16//! use uuid::Uuid;
17//!
18//! let creator_id = Uuid::new_v4();
19//! let metadata = ContentMetadataBuilder::new()
20//!     .cid("QmExampleCID123")
21//!     .title("My 3D Model")
22//!     .description("A high-quality 3D model")
23//!     .category(ContentCategory::ThreeDModels)
24//!     .add_tag("blender")
25//!     .add_tag("game-ready")
26//!     .size_bytes(5 * 1024 * 1024) // 5 MB
27//!     .price(1000)
28//!     .creator_id(creator_id)
29//!     .status(ContentStatus::Active)
30//!     .build()
31//!     .expect("Failed to build metadata");
32//!
33//! assert!(metadata.is_valid());
34//! assert_eq!(metadata.size_mb(), 5.0);
35//! ```
36//!
37//! ## Building a Bandwidth Proof
38//!
39//! ```
40//! use chie_shared::BandwidthProofBuilder;
41//!
42//! let proof = BandwidthProofBuilder::new()
43//!     .content_cid("QmTest123")
44//!     .chunk_index(0)
45//!     .bytes_transferred(262144) // 256 KB
46//!     .provider_peer_id("12D3KooProvider")
47//!     .requester_peer_id("12D3KooRequester")
48//!     .provider_public_key(vec![1u8; 32])
49//!     .requester_public_key(vec![2u8; 32])
50//!     .provider_signature(vec![3u8; 64])
51//!     .requester_signature(vec![4u8; 64])
52//!     .challenge_nonce(vec![5u8; 32])
53//!     .chunk_hash(vec![6u8; 32])
54//!     .timestamps(1000, 1250) // 250ms latency
55//!     .build()
56//!     .expect("Failed to build proof");
57//!
58//! assert!(proof.is_valid());
59//! assert!(proof.meets_quality_threshold());
60//! assert_eq!(proof.bandwidth_bps(), 1048576.0); // ~1 MB/s
61//! ```
62//!
63//! ## Creating a Chunk Request
64//!
65//! ```
66//! use chie_shared::{ChunkRequest, generate_nonce};
67//!
68//! let request = ChunkRequest::new(
69//!     "QmExampleContent",
70//!     0,
71//!     generate_nonce(),
72//!     "12D3KooRequester",
73//!     [1u8; 32],
74//! );
75//!
76//! assert!(request.is_timestamp_valid());
77//! ```
78//!
79//! ## Using Utility Functions
80//!
81//! ```
82//! use chie_shared::{format_bytes, format_points, calculate_demand_multiplier};
83//!
84//! // Format bytes for display
85//! assert_eq!(format_bytes(1_048_576), "1.00 MB");
86//!
87//! // Format points with thousands separator
88//! assert_eq!(format_points(1_234_567), "1,234,567");
89//!
90//! // Calculate reward multiplier based on demand/supply
91//! let multiplier = calculate_demand_multiplier(100, 50);
92//! assert_eq!(multiplier, 3.0); // High demand = 3x multiplier
93//! ```
94//!
95//! ## Working with Cache Statistics
96//!
97//! ```
98//! use chie_shared::CacheStats;
99//!
100//! // Create cache statistics
101//! let stats = CacheStats::new(50, 100, 80, 20);
102//! println!("Hit rate: {:.2}%", stats.hit_rate * 100.0);
103//! println!("Fill: {:.2}%", stats.fill_percentage() * 100.0);
104//! println!("Efficiency: {:.2}", stats.efficiency_score());
105//! ```
106//!
107//! ## Tracking Performance Metrics
108//!
109//! ```
110//! use chie_shared::{OperationStats, BandwidthMetrics};
111//!
112//! // Operation timing statistics
113//! let ops_stats = OperationStats::new(100, 5000.0, 10.0, 200.0);
114//! println!("Average: {:.2}ms", ops_stats.avg_duration_ms);
115//! println!("Throughput: {:.2} ops/sec", ops_stats.ops_per_second());
116//!
117//! // Bandwidth metrics
118//! let bw_metrics = BandwidthMetrics::new(1_000_000, 1000.0, 10, 2_000_000.0);
119//! println!("Average: {:.2} Mbps", bw_metrics.avg_mbps());
120//! println!("Peak: {:.2} Mbps", bw_metrics.peak_mbps());
121//! ```
122//!
123//! ## Managing User Quotas
124//!
125//! ```
126//! use chie_shared::{UserQuota, StorageQuota, BandwidthQuota, RateLimitQuota};
127//!
128//! // Create storage quota
129//! let storage = StorageQuota::new(
130//!     10 * 1024 * 1024 * 1024, // 10 GB total
131//!     5 * 1024 * 1024 * 1024,  // 5 GB used
132//!     1 * 1024 * 1024 * 1024,  // 1 GB reserved
133//! );
134//! println!("Storage available: {} GB", storage.available_bytes() / (1024 * 1024 * 1024));
135//! println!("Utilization: {:.1}%", storage.utilization() * 100.0);
136//!
137//! // Create bandwidth quota (100 GB/month)
138//! let bandwidth = BandwidthQuota::new(
139//!     100 * 1024 * 1024 * 1024, // 100 GB total
140//!     50 * 1024 * 1024 * 1024,  // 50 GB used
141//!     30 * 24 * 60 * 60,        // 30 days in seconds
142//!     chie_shared::now_ms() as u64,
143//! );
144//! println!("Bandwidth remaining: {} GB", bandwidth.remaining_bytes() / (1024 * 1024 * 1024));
145//!
146//! // Create rate limit quota (100 requests/minute)
147//! let rate_limit = RateLimitQuota::new(100, 45, 60, chie_shared::now_ms() as u64);
148//! println!("Requests remaining: {}", rate_limit.remaining_requests());
149//! ```
150//!
151//! ## Batch Operations
152//!
153//! ```
154//! use chie_shared::{BatchProofSubmission, BandwidthProof, BandwidthProofBuilder};
155//!
156//! // Create multiple proofs
157//! let proof1 = BandwidthProofBuilder::new()
158//!     .content_cid("QmTest1")
159//!     .chunk_index(0)
160//!     .bytes_transferred(262144)
161//!     .provider_peer_id("12D3Koo1")
162//!     .requester_peer_id("12D3Koo2")
163//!     .provider_public_key(vec![1u8; 32])
164//!     .requester_public_key(vec![2u8; 32])
165//!     .provider_signature(vec![3u8; 64])
166//!     .requester_signature(vec![4u8; 64])
167//!     .challenge_nonce(vec![5u8; 32])
168//!     .chunk_hash(vec![6u8; 32])
169//!     .timestamps(1000, 1250)
170//!     .build()
171//!     .expect("Failed to build proof");
172//!
173//! // Submit proofs in batch
174//! let batch = BatchProofSubmission::new(vec![proof1], "12D3Koo1");
175//! println!("Batch contains {} proofs", batch.proof_count());
176//! println!("Total bytes: {}", batch.total_bytes_transferred());
177//! ```
178
179pub mod config;
180pub mod constants;
181pub mod conversions;
182pub mod encoding;
183pub mod errors;
184pub mod messages;
185pub mod result;
186#[cfg(feature = "schema")]
187pub mod schema;
188pub mod types;
189pub mod utils;
190
191pub use config::*;
192pub use constants::*;
193pub use conversions::*;
194pub use encoding::*;
195pub use errors::*;
196pub use messages::*;
197pub use result::*;
198#[cfg(feature = "schema")]
199pub use schema::*;
200pub use types::*;
201pub use utils::*;
202
203// Re-export test helpers for use in other crates
204#[cfg(test)]
205pub use types::bandwidth::test_helpers;