#bitmessage #p2p #protocols #client #networking

koibumi-node

作为实验性Bitmessage客户端Koibumi的库实现Bitmessage节点

10个版本

0.0.9 2024年6月26日
0.0.8 2021年1月6日
0.0.7 2020年9月9日
0.0.5 2020年8月24日
0.0.1 2020年5月26日

#3 in #bitmessage

Download history 5/week @ 2024-06-16 132/week @ 2024-06-23 4/week @ 2024-06-30 1/week @ 2024-07-07 60/week @ 2024-07-28

每月 61 次下载
用于 4 crates

AGPL-3.0-or-later

460KB
12K SLoC

本crate是一个Bitmessage节点实现,作为Koibumi库,一个实验性Bitmessage客户端。

有关应用的更多信息,请参阅koibumi。有关协议的更多信息,请参阅Bitmessage


lib.rs:

本crate是一个Bitmessage节点实现,作为Koibumi库,一个实验性Bitmessage客户端。

有关应用的更多信息,请参阅koibumi。有关协议的更多信息,请参阅Bitmessage

示例

use std::str::FromStr;

use async_std::task;
use futures::{sink::SinkExt, stream::StreamExt};

use koibumi_node::{self as node, db, Command, Config, Event, Response};

let (command_sender, mut response_receiver, handle) = node::spawn();

let config = Config::builder()
    .server(Some("127.0.0.1:8444".parse().unwrap()))
    .socks(Some("127.0.0.1:9050".parse().unwrap()))
    .connect_to_onion(true)
    .connect_to_ip(true)
    .seeds(vec!["quzwelsuziwqgpt2.onion:8444".parse().unwrap()])
    .build();

let mut sender = command_sender;
let response = task::block_on(async {
    let pool = db::SqlitePool::connect_with(
        sqlx::sqlite::SqliteConnectOptions::from_str("sqlite::memory:").unwrap()
    ).await;
    if let Err(err) = pool {
        eprintln!("{}", err);
        return None;
    }
    let pool = pool.unwrap();

    if let Err(err) = sender.send(Command::Start(config.into(), pool, Vec::new())).await {
        eprintln!("{}", err);
        return None;
    }
    response_receiver.next().await
});
let Response::Started(mut receiver) = response.unwrap();

task::block_on(async {
    while let Some(event) = receiver.next().await {
        match event {
            Event::ConnectionCounts { .. } => (),
            Event::AddrCount(_count) => (),
            Event::Established { addr, user_agent, rating } => {
                println!("established: {} {} rating:{}", addr, user_agent, rating);
            }
            Event::Disconnected { addr } => {
                println!("disconnected: {}", addr);
            }
            Event::Objects { .. } => (),
            Event::Stopped => {
                break;
            }
            Event::Broadcast {
                user_id,
                address,
                object,
            } => {
                println!("broadcast received from {}", address);
            }
            Event::Msg {
                user_id,
                address,
                object,
            } => {
                println!("received msg for {}", address);
            }
        }
    }

    handle.await;
});

依赖关系

~40–54MB
~847K SLoC