mod client;
mod protocol;
use std::io;
use std::net::SocketAddr;
use std::thread::JoinHandle;
use bitcoin::p2p::message::RawNetworkMessage;
use crate::net;
pub trait Peerlike:
Clone + Copy + Eq + PartialEq + std::fmt::Debug + std::fmt::Display + std::hash::Hash
{
}
pub trait Outbox<P: Peerlike> {
fn connect(&self, target: net::Service);
#[allow(unused)]
fn disconnect(&self, peer: P);
fn version(&self, peer: P);
fn verack(&self, peer: P);
fn tx(&self, peer: P, tx: bitcoin::Transaction);
}
pub trait Receiver<P: Peerlike, T: Into<Event<P>>> {
fn receiver(&self) -> &crossbeam_channel::Receiver<T>;
}
pub trait Sender {
fn send(&self) -> io::Result<()>;
fn shutdown(self) -> JoinHandle<std::io::Result<()>>;
}
#[derive(Debug)]
pub enum Event<P: Peerlike> {
ConnectedTo {
target: net::Service,
result: io::Result<P>,
},
ConnectedFrom {
peer: P,
addr: SocketAddr,
interface: SocketAddr,
},
Disconnected {
peer: P,
reason: DisconnectReason,
},
Message {
peer: P,
message: RawNetworkMessage,
},
NoPeer(P),
SendBufferFull {
peer: P,
message: RawNetworkMessage,
},
}
#[derive(Debug)]
pub enum DisconnectReason {
Requested,
Left,
CodecViolation,
WriteStale,
Error,
}
pub fn client(
socks_proxy: Option<SocketAddr>,
network: crate::Network,
ua: Option<(String, u64, u64)>,
) -> impl Sender
+ Receiver<peerlink::PeerId, peerlink::Event<protocol::Message, net::Service>>
+ Outbox<peerlink::PeerId> {
client::client(socks_proxy, network, ua)
}