-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathtransfer.rs
100 lines (81 loc) · 3.24 KB
/
transfer.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
use std::{path::PathBuf, str::FromStr};
use anyhow::Result;
use iroh::{protocol::Router, Endpoint};
use iroh_base::ticket::BlobTicket;
use iroh_blobs::{
net_protocol::Blobs,
rpc::client::blobs::{ReadAtLen, WrapOption},
store::mem,
util::{local_pool::LocalPool, SetTagOption},
};
#[tokio::main]
async fn main() -> Result<()> {
// Create an endpoint, it allows creating and accepting
// connections in the iroh p2p world
let endpoint = Endpoint::builder().discovery_n0().bind().await?;
// We initialize the Blobs protocol in-memory
let local_pool = LocalPool::default();
let blobs = Blobs::memory().build(&local_pool, &endpoint);
// Now we build a router that accepts blobs connections & routes them
// to the blobs protocol.
let node = Router::builder(endpoint)
.accept(iroh_blobs::ALPN, blobs)
.spawn()
.await?;
let args = std::env::args().collect::<Vec<_>>();
match &args.iter().map(String::as_str).collect::<Vec<_>>()[..] {
[_cmd, "send", path] => {
let abs_path = PathBuf::from_str(path)?.canonicalize()?;
let blobs = node
.get_protocol::<Blobs<mem::Store>>(iroh_blobs::ALPN)
.unwrap()
.client();
println!("Analyzing file.");
let blob = blobs
.add_from_path(abs_path, true, SetTagOption::Auto, WrapOption::NoWrap)
.await?
.finish()
.await?;
let node_id = node.endpoint().node_id();
let ticket = BlobTicket::new(node_id.into(), blob.hash, blob.format)?;
println!("File analyzed. Fetch this file by running:");
println!("cargo run --example transfer -- receive {ticket} {path}");
tokio::signal::ctrl_c().await?;
}
[_cmd, "receive", ticket, path] => {
let path_buf = PathBuf::from_str(path)?;
let ticket = BlobTicket::from_str(ticket)?;
let blobs = node
.get_protocol::<Blobs<mem::Store>>(iroh_blobs::ALPN)
.unwrap()
.client();
println!("Starting download.");
blobs
.download(ticket.hash(), ticket.node_addr().clone())
.await?
.finish()
.await?;
println!("Finished download.");
println!("Copying to destination.");
let mut file = tokio::fs::File::create(path_buf).await?;
let mut reader = blobs.read_at(ticket.hash(), 0, ReadAtLen::All).await?;
tokio::io::copy(&mut reader, &mut file).await?;
println!("Finished copying.");
}
_ => {
println!("Couldn't parse command line arguments.");
println!("Usage:");
println!(" # to send:");
println!(" cargo run --example transfer -- send [FILE]");
println!(" # this will print a ticket.");
println!();
println!(" # to receive:");
println!(" cargo run --example transfer -- receive [TICKET] [FILE]");
}
}
// Gracefully shut down the node
println!("Shutting down.");
node.shutdown().await?;
local_pool.shutdown().await;
Ok(())
}