forked from rs-ipfs/rust-ipfs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmod.rs
79 lines (65 loc) · 2.08 KB
/
mod.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
//! P2P handling for IPFS nodes.
use crate::{Ipfs, IpfsOptions, IpfsTypes};
use libp2p::identity::Keypair;
use libp2p::Swarm;
use libp2p::{Multiaddr, PeerId};
use std::io;
use tracing::Span;
pub(crate) mod addr;
mod behaviour;
pub(crate) mod pubsub;
mod swarm;
mod transport;
pub use addr::{MultiaddrWithPeerId, MultiaddrWithoutPeerId};
pub use {behaviour::KadResult, swarm::Connection};
pub type TSwarm<T> = Swarm<behaviour::Behaviour<T>>;
pub struct SwarmOptions {
pub keypair: Keypair,
pub peer_id: PeerId,
pub bootstrap: Vec<(Multiaddr, PeerId)>,
pub mdns: bool,
pub kad_protocol: Option<String>,
}
impl From<&IpfsOptions> for SwarmOptions {
fn from(options: &IpfsOptions) -> Self {
let keypair = options.keypair.clone();
let peer_id = keypair.public().into_peer_id();
let bootstrap = options.bootstrap.clone();
let mdns = options.mdns;
let kad_protocol = options.kad_protocol.clone();
SwarmOptions {
keypair,
peer_id,
bootstrap,
mdns,
kad_protocol,
}
}
}
/// Creates a new IPFS swarm.
pub async fn create_swarm<TIpfsTypes: IpfsTypes>(
options: SwarmOptions,
ipfs: Ipfs<TIpfsTypes>,
) -> io::Result<TSwarm<TIpfsTypes>> {
let peer_id = options.peer_id.clone();
// Set up an encrypted TCP transport over the Mplex protocol.
let transport = transport::build_transport(options.keypair.clone())?;
let swarm_span = ipfs.0.span.clone();
// Create a Kademlia behaviour
let behaviour = behaviour::build_behaviour(options, ipfs).await;
// Create a Swarm
let swarm = libp2p::swarm::SwarmBuilder::new(transport, behaviour, peer_id)
.executor(Box::new(SpannedExecutor(swarm_span)))
.build();
Ok(swarm)
}
struct SpannedExecutor(Span);
impl libp2p::core::Executor for SpannedExecutor {
fn exec(
&self,
future: std::pin::Pin<Box<dyn std::future::Future<Output = ()> + 'static + Send>>,
) {
use tracing_futures::Instrument;
tokio::task::spawn(future.instrument(self.0.clone()));
}
}