koibumi_node_sync/
lib.rs

1//! This crate is a Bitmessage node implementation as a library for Koibumi (sync version), an experimental Bitmessage client.
2//!
3//! See [`koibumi-sync`](https://crates.io/crates/koibumi-sync) for more about the application.
4//! See [Bitmessage](https://bitmessage.org/) for more about the protocol.
5//!
6//! # Examples
7//!
8//! ```no_run
9//! use std::{path::PathBuf, str::FromStr};
10//!
11//! use koibumi_node_sync::{self as node, Command, Config, Event, Response};
12//!
13//! let (command_sender, mut response_receiver, handle) = node::spawn();
14//!
15//! let config = Config::builder()
16//!     .server(Some("127.0.0.1:8444".parse().unwrap()))
17//!     .socks(Some("127.0.0.1:9050".parse().unwrap()))
18//!     .connect_to_onion(true)
19//!     .connect_to_ip(true)
20//!     .seeds(vec!["quzwelsuziwqgpt2.onion:8444".parse().unwrap()])
21//!     .build();
22//!
23//! let mut sender = command_sender;
24//! let response = {
25//!     let db_path = PathBuf::from_str("sqlite::memory:").unwrap();
26//!
27//!     if let Err(err) = sender.send(Command::Start(config.into(), db_path, Vec::new())) {
28//!         eprintln!("{}", err);
29//!         return
30//!     }
31//!     response_receiver.recv()
32//! };
33//! let Response::Started(mut receiver) = response.unwrap();
34//!
35//! while let Ok(event) = receiver.recv() {
36//!     match event {
37//!         Event::ConnectionCounts { .. } => (),
38//!         Event::AddrCount(_count) => (),
39//!         Event::Established { addr, user_agent, rating } => {
40//!             println!("established: {} {} rating:{}", addr, user_agent, rating);
41//!         }
42//!         Event::Disconnected { addr } => {
43//!             println!("disconnected: {}", addr);
44//!         }
45//!         Event::Objects { .. } => (),
46//!         Event::Stopped => {
47//!             break;
48//!         }
49//!         Event::Broadcast {
50//!             user_id,
51//!             address,
52//!             object,
53//!         } => {
54//!             println!("broadcast received from {}", address);
55//!         }
56//!         Event::Msg {
57//!             user_id,
58//!             address,
59//!             object,
60//!         } => {
61//!             println!("received msg for {}", address);
62//!         }
63//!     }
64//! }
65//!
66//! if let Err(err) = handle.join() {
67//!     eprintln!("{:?}", err);
68//!     return
69//! }
70//! ```
71
72#![deny(unsafe_code)]
73#![warn(missing_docs)]
74#![recursion_limit = "2048"]
75
76mod config;
77mod connection;
78mod connection_loop;
79mod constant;
80mod inv_manager;
81mod manager;
82mod message_handler;
83mod net;
84mod node_manager;
85mod object_processor;
86mod pow_manager;
87mod user_manager;
88
89use std::thread;
90
91use crossbeam_channel::{bounded, Receiver, Sender};
92
93pub use config::{Builder as ConfigBuilder, Config, SocksAuth};
94pub use manager::{run, Command, Event, Response};
95pub use net::SocketAddrNode;
96pub use node_manager::Rating;
97pub use user_manager::User;
98
99/// Spawns a task that manage a Bitmessage node.
100pub fn spawn() -> (Sender<Command>, Receiver<Response>, thread::JoinHandle<()>) {
101    const COMMAND_BUFFER: usize = 0x10000;
102    const RESPONSE_BUFFER: usize = 0x10000;
103    let (command_sender, command_receiver) = bounded(COMMAND_BUFFER);
104    let (response_sender, response_receiver) = bounded(RESPONSE_BUFFER);
105    let handle = thread::spawn(|| manager::run(command_receiver, response_sender));
106    (command_sender, response_receiver, handle)
107}