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}