1- use std:: net:: { IpAddr , Ipv6Addr , SocketAddr } ;
21use std:: result:: Result ;
32use std:: str:: FromStr ;
43use std:: sync:: Arc ;
54use std:: time:: Duration ;
65
6+ use axum_server:: tls_rustls:: RustlsConfig ;
77use bitcoin:: { Amount , Psbt } ;
88pub use corepc_node; // re-export for convenience
99use corepc_node:: AddressType ;
@@ -18,7 +18,6 @@ use reqwest::{Client, ClientBuilder};
1818use rustls:: pki_types:: CertificateDer ;
1919use rustls:: RootCertStore ;
2020use tempfile:: tempdir;
21- use tokio:: net:: TcpListener ;
2221use tokio:: task:: JoinHandle ;
2322use tracing:: Level ;
2423use tracing_subscriber:: { EnvFilter , FmtSubscriber } ;
@@ -61,11 +60,9 @@ impl TestServices {
6160 let mut root_store = RootCertStore :: empty ( ) ;
6261 root_store. add ( CertificateDer :: from ( cert. cert . der ( ) . to_vec ( ) ) ) . unwrap ( ) ;
6362
64- let directory = init_directory ( cert_key) . await ?;
63+ let directory = init_directory ( cert_key, root_store. clone ( ) ) . await ?;
64+ let ohttp_relay = init_ohttp_relay ( directory. 0 , root_store) . await ?;
6565
66- let gateway_origin =
67- ohttp_relay:: GatewayUri :: from_str ( & format ! ( "https://localhost:{}" , directory. 0 ) ) ?;
68- let ohttp_relay = ohttp_relay:: listen_tcp_on_free_port ( gateway_origin, root_store) . await ?;
6966 let http_agent: Arc < Client > = Arc :: new ( http_agent ( cert_der) ?) ;
7067
7168 Ok ( Self {
@@ -114,33 +111,58 @@ impl TestServices {
114111
115112pub async fn init_directory (
116113 local_cert_key : ( Vec < u8 > , Vec < u8 > ) ,
114+ root_store : RootCertStore ,
117115) -> std:: result:: Result <
118116 ( u16 , tokio:: task:: JoinHandle < std:: result:: Result < ( ) , BoxSendSyncError > > ) ,
119117 BoxSendSyncError ,
120118> {
121- let timeout = Duration :: from_secs ( 2 ) ;
122- let ohttp_server = payjoin_directory:: gen_ohttp_server_config ( ) ?;
123-
124- let metrics = payjoin_directory:: metrics:: Metrics :: new ( ) ;
125119 let tempdir = tempdir ( ) ?;
126- let db = payjoin_directory:: FilesDb :: init ( timeout, tempdir. path ( ) . to_path_buf ( ) ) . await ?;
120+ let config = payjoin_service:: config:: Config {
121+ port : 0 , // let OS assign a free port
122+ storage_dir : tempdir. path ( ) . to_path_buf ( ) ,
123+ timeout : Duration :: from_secs ( 2 ) ,
124+ gateway_origin : String :: from ( "https://localhost" ) ,
125+ } ;
127126
128- let service = payjoin_directory :: Service :: new ( db , ohttp_server . into ( ) , metrics ) ;
127+ let tls_config = RustlsConfig :: from_der ( vec ! [ local_cert_key . 0 ] , local_cert_key . 1 ) . await ? ;
129128
130- let listener = bind_free_port ( ) . await ?;
131- let port = listener. local_addr ( ) ?. port ( ) ;
129+ let ( port, handle) = payjoin_service:: serve_manual_tls ( config, Some ( tls_config) , root_store)
130+ . await
131+ . map_err ( |e| e. to_string ( ) ) ?;
132132
133133 let handle = tokio:: spawn ( async move {
134134 let _tempdir = tempdir; // keep the tempdir until the directory shuts down
135- service . serve_tls ( listener , local_cert_key ) . await
135+ handle . await . map_err ( |e| e . to_string ( ) ) ? . map_err ( |e| e . to_string ( ) . into ( ) )
136136 } ) ;
137137
138138 Ok ( ( port, handle) )
139139}
140140
141- async fn bind_free_port ( ) -> Result < tokio:: net:: TcpListener , std:: io:: Error > {
142- let bind_addr = SocketAddr :: new ( IpAddr :: V6 ( Ipv6Addr :: UNSPECIFIED ) , 0 ) ;
143- TcpListener :: bind ( bind_addr) . await
141+ async fn init_ohttp_relay (
142+ directory_port : u16 ,
143+ root_store : RootCertStore ,
144+ ) -> std:: result:: Result <
145+ ( u16 , tokio:: task:: JoinHandle < std:: result:: Result < ( ) , BoxSendSyncError > > ) ,
146+ BoxSendSyncError ,
147+ > {
148+ let tempdir = tempdir ( ) ?;
149+ let config = payjoin_service:: config:: Config {
150+ port : 0 , // let OS assign a free port
151+ storage_dir : tempdir. path ( ) . to_path_buf ( ) ,
152+ timeout : Duration :: from_secs ( 2 ) ,
153+ gateway_origin : format ! ( "https://localhost:{}" , directory_port) ,
154+ } ;
155+
156+ let ( port, handle) = payjoin_service:: serve_manual_tls ( config, None , root_store)
157+ . await
158+ . map_err ( |e| e. to_string ( ) ) ?;
159+
160+ let handle = tokio:: spawn ( async move {
161+ let _tempdir = tempdir; // keep the tempdir until the relay shuts down
162+ handle. await . map_err ( |e| e. to_string ( ) ) ?. map_err ( |e| e. to_string ( ) . into ( ) )
163+ } ) ;
164+
165+ Ok ( ( port, handle) )
144166}
145167
146168/// generate or get a DER encoded localhost cert and key.
0 commit comments