• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

payjoin / rust-payjoin / 21153500862

19 Jan 2026 10:49PM UTC coverage: 82.793% (-0.6%) from 83.357%
21153500862

Pull #1232

github

web-flow
Merge c7444e8de into 93d4888c6
Pull Request #1232: Unified payjoin service

291 of 413 new or added lines in 12 files covered. (70.46%)

41 existing lines in 3 files now uncovered.

10133 of 12239 relevant lines covered (82.79%)

430.47 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/payjoin-directory/src/main.rs
1
use clap::Parser;
2
use ohttp_relay::SentinelTag;
3
use payjoin_directory::metrics::Metrics;
4
use payjoin_directory::*;
5
use tokio::net::TcpListener;
6
use tracing_subscriber::filter::LevelFilter;
7
use tracing_subscriber::EnvFilter;
8

9
#[tokio::main]
10
async fn main() -> Result<(), BoxError> {
×
11
    init_logging();
×
12

13
    let cli = cli::Cli::parse();
×
14
    let config = config::Config::new(&cli)?;
×
15

16
    let key_dir = config.ohttp_keys;
×
17
    std::fs::create_dir_all(&key_dir).expect("Failed to create key directory");
×
18

19
    let ohttp = match key_config::read_server_config(&key_dir) {
×
20
        Ok(config) => config,
×
21
        Err(_) => {
22
            let ohttp_config = key_config::gen_ohttp_server_config()?;
×
23
            let path = key_config::persist_new_key_config(ohttp_config, &key_dir)?;
×
24
            println!("Generated new key configuration at {}", path.display());
×
25
            key_config::read_server_config(&key_dir).expect("Failed to read newly generated config")
×
26
        }
27
    };
28

29
    let metrics = Metrics::new();
×
30
    let db = payjoin_directory::FilesDb::init(config.timeout, config.storage_dir)
×
31
        .await
×
32
        .expect("Failed to initialize persistent storage");
×
33

NEW
34
    let service = Service::new(db, ohttp.into(), metrics, SentinelTag::new([0u8; 32]));
×
35

36
    // Start metrics server in the background
37
    if let Some(addr) = config.metrics_listen_addr {
×
38
        let metrics_listener = TcpListener::bind(addr.clone()).await?;
×
39
        let service_clone = service.clone();
×
40

41
        tokio::spawn(async move {
×
42
            if let Err(e) = service_clone.serve_metrics_tcp(metrics_listener).await {
×
43
                eprintln!("Metrics server error: {e}");
×
44
            }
×
45
            println!("Metrics server started on {}", addr);
×
46
        });
×
47
    }
×
48

49
    let listener = TcpListener::bind(config.listen_addr).await?;
×
50

51
    #[cfg(feature = "acme")]
52
    if let Some(acme_config) = config.acme {
×
53
        service.serve_acme(listener, acme_config.into()).await;
×
54
        return Ok(());
×
55
    }
×
56

57
    service.serve_tcp(listener).await;
×
58

59
    Ok(())
×
60
}
×
61

62
fn init_logging() {
×
63
    let env_filter =
×
64
        EnvFilter::builder().with_default_directive(LevelFilter::INFO.into()).from_env_lossy();
×
65

66
    tracing_subscriber::fmt().with_target(true).with_level(true).with_env_filter(env_filter).init();
×
67

68
    println!("Logging initialized");
×
69
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc