cs_mwc_bch/peer/
mod.rs

1//! Node connection and message handling
2//!
3//! # Examples
4//!
5//! Send and receive a message to a node syncronously:
6//!
7//! ```no_run, rust
8//! use bch::messages::{Message, Ping, Version, NODE_BITCOIN_CASH, PROTOCOL_VERSION};
9//! use bch::network::Network;
10//! use bch::peer::Peer;
11//! use bch::util::rx::Observable;
12//! use bch::util::secs_since;
13//! use std::time::UNIX_EPOCH;
14//!
15//! let (ip, port) = Network::Mainnet.seed_iter().next().unwrap();
16//! let version = Version {
17//!     version: PROTOCOL_VERSION,
18//!     services: NODE_BITCOIN_CASH,
19//!     timestamp: secs_since(UNIX_EPOCH) as i64,
20//!     user_agent: "rust-bch".to_string(),
21//!     ..Default::default()
22//! };
23//!
24//! let peer = Peer::connect(ip, port, Network::Mainnet, version, |_| true);
25//! peer.connected_event().poll();
26//!
27//! let ping = Message::Ping(Ping { nonce: 0 });
28//! peer.send(&ping).unwrap();
29//!
30//! let response = peer.messages().poll();
31//! ```
32//!
33//! Handle node events asynronously:
34//!
35//! ```no_run, rust
36//! use bch::messages::{Version, NODE_BITCOIN_CASH, PROTOCOL_VERSION};
37//! use bch::network::Network;
38//! use bch::peer::{Peer, PeerConnected, PeerDisconnected, PeerMessage};
39//! use bch::util::rx::{Observable, Observer};
40//! use bch::util::secs_since;
41//! use std::sync::Arc;
42//! use std::time::UNIX_EPOCH;
43//!
44//! let (ip, port) = Network::Mainnet.seed_iter().next().unwrap();
45//! let version = Version {
46//!     version: PROTOCOL_VERSION,
47//!     services: NODE_BITCOIN_CASH,
48//!     timestamp: secs_since(UNIX_EPOCH) as i64,
49//!     user_agent: "rust-bch".to_string(),
50//!     ..Default::default()
51//! };
52//!
53//! let peer = Peer::connect(ip, port, Network::Mainnet, version, |_| true);
54//!
55//! struct EventHandler {}
56//!
57//! impl Observer<PeerConnected> for EventHandler {
58//!     fn next(&self, event: &PeerConnected) {
59//!         // Handle node connected
60//!     }
61//! }
62//!
63//! impl Observer<PeerDisconnected> for EventHandler {
64//!     fn next(&self, event: &PeerDisconnected) {
65//!         // Handle node disconnected
66//!     }
67//! }
68//!
69//! impl Observer<PeerMessage> for EventHandler {
70//!     fn next(&self, event: &PeerMessage) {
71//!         // Handle message from node
72//!     }
73//! }
74//!
75//! let event_handler = Arc::new(EventHandler {});
76//!
77//! peer.connected_event().subscribe(&event_handler);
78//! peer.disconnected_event().subscribe(&event_handler);
79//! peer.messages().subscribe(&event_handler);
80//! ```
81
82pub(crate) mod atomic_reader;
83mod peer;
84
85pub use self::peer::{Peer, PeerConnected, PeerDisconnected, PeerMessage};