use std::net::SocketAddr;
use weida::{Identity, Runtime, RuntimeConfig, TransferMeta, Trust};
const JOBS: usize = 5;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let identity = Identity::generate()?;
let fingerprint = identity.fingerprint()?;
let server = Runtime::new(RuntimeConfig::default())?;
let listener = server.listener();
let binding = listener
.bind_quic("127.0.0.1:0".parse::<SocketAddr>()?, identity)
.await?;
let url = format!(
"weida://{fingerprint}@127.0.0.1:{}/jobs",
binding.local_addr().port()
);
let puller = listener.puller("/jobs")?;
let worker = tokio::spawn(async move {
for _ in 0..JOBS {
let transfer = puller.recv().await?;
let body = transfer.collect(64 * 1024).await?;
println!(" pulled {:>7}", String::from_utf8_lossy(&body));
}
Ok::<(), weida::Error>(())
});
let client = Runtime::new(RuntimeConfig::default())?;
let pusher = client.pusher(Trust::by_address());
pusher.connect(&url).await?;
println!("pushing {JOBS} jobs to {url}");
for i in 0..JOBS - 1 {
pusher.send(format!("job-{i}").as_bytes()).await?;
println!(" sent job-{i} -> queued");
}
let last = JOBS - 1;
let mut transfer = pusher.open(TransferMeta::default()).await?;
transfer.write_all(format!("job-{last}").as_bytes()).await?;
transfer.finish()?.delivered().await?;
println!(" sent job-{last} -> delivered (transport receipt)");
worker.await??;
client.shutdown().await;
server.shutdown().await;
Ok(())
}