use xlb::{AssetClass, AssetClassConfig, BandwidthPolicy, BwCaps, Discovery, PeerTier, SeedRole};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let class = AssetClass::register(AssetClassConfig {
name: "my-app-assets",
permanent_seeds: vec![],
cdn_fallback: Some("https://cdn.example.com/assets/{blake3}".into()),
discovery: Discovery::default(), bandwidth: BandwidthPolicy::default()
.role(
PeerTier::Cloud,
BwCaps {
up_mbit: 1000,
down_mbit: 10_000,
},
)
.role(
PeerTier::Camp,
BwCaps {
up_mbit: 10,
down_mbit: 100,
},
)
.role(
PeerTier::Workstation,
BwCaps {
up_mbit: 5,
down_mbit: 50,
},
)
.role(PeerTier::Mobile, BwCaps::passive()),
cache_dir: None,
cache_budget_bytes: 1024 * 1024 * 1024, observer: Some(std::sync::Arc::new(|r: &xlb::FetchReport| {
println!(
"fetched {} from {} — {} bytes in {}ms",
r.hash.to_hex(),
r.tier_label(),
r.bytes_served,
r.duration_ms,
);
})),
})
.await?;
class
.set_role(SeedRole::Participant, PeerTier::Workstation)
.await?;
let gov = class.governor();
let caps = gov.effective_caps(PeerTier::Workstation);
let seeding = if gov.is_passive() {
"paused (battery or metered)"
} else {
"active"
};
println!("class: {}", class.name());
println!(
"seeding: {} — {} Mbit/s up, {} Mbit/s down",
seeding, caps.up_mbit, caps.down_mbit
);
println!();
println!("To fetch a blob once you have its BLAKE3 hash:");
println!(" let hash: xlb::BlakeHash = \"<64-char hex>\".parse()?;");
println!(" let bytes = class.asset(hash).fetch().await?;");
println!();
println!("fetch() tries: cache → LAN peers → swarm → seeds → CDN (in that order).");
println!("Every byte is BLAKE3-verified regardless of source.");
Ok(())
}