use rust_ipfs::Ipfs;
use rust_ipfs::builder::IpfsBuilder;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
let ipfs: Ipfs = IpfsBuilder::new()
.with_custom_behaviour(|_| Ok(ext_behaviour::Behaviour::default()))
.with_default()
.enable_tcp()
.add_listening_addr("/ip4/127.0.0.1/tcp/0".parse()?)
.start()
.await?;
tokio::signal::ctrl_c().await?;
ipfs.exit_daemon().await;
Ok(())
}
mod ext_behaviour {
use connexa::dummy::DummyHandler;
use connexa::prelude::swarm::derive_prelude::PortUse;
use connexa::prelude::swarm::{
ConnectionDenied, FromSwarm, NewListenAddr, THandler, THandlerInEvent, THandlerOutEvent,
ToSwarm,
};
use connexa::prelude::transport::Endpoint;
use rust_ipfs::{ConnectionId, Multiaddr, NetworkBehaviour, PeerId};
use std::convert::Infallible;
use std::task::{Context, Poll};
#[derive(Default, Debug)]
pub struct Behaviour;
impl NetworkBehaviour for Behaviour {
type ConnectionHandler = DummyHandler;
type ToSwarm = Infallible;
fn handle_pending_inbound_connection(
&mut self,
_: ConnectionId,
_: &Multiaddr,
_: &Multiaddr,
) -> Result<(), ConnectionDenied> {
Ok(())
}
fn handle_pending_outbound_connection(
&mut self,
_: ConnectionId,
_: Option<PeerId>,
_: &[Multiaddr],
_: Endpoint,
) -> Result<Vec<Multiaddr>, ConnectionDenied> {
Ok(vec![])
}
fn handle_established_inbound_connection(
&mut self,
_: ConnectionId,
_: PeerId,
_: &Multiaddr,
_: &Multiaddr,
) -> Result<THandler<Self>, ConnectionDenied> {
Ok(DummyHandler)
}
fn handle_established_outbound_connection(
&mut self,
_: ConnectionId,
_: PeerId,
_: &Multiaddr,
_: Endpoint,
_: PortUse,
) -> Result<THandler<Self>, ConnectionDenied> {
Ok(DummyHandler)
}
fn on_connection_handler_event(
&mut self,
_: PeerId,
_: ConnectionId,
_: THandlerOutEvent<Self>,
) {
}
fn on_swarm_event(&mut self, event: FromSwarm) {
if let FromSwarm::NewListenAddr(NewListenAddr { addr, .. }) = event {
println!("Listening on {addr}");
}
}
fn poll(&mut self, _: &mut Context) -> Poll<ToSwarm<Self::ToSwarm, THandlerInEvent<Self>>> {
Poll::Pending
}
}
}