@@ -382,34 +382,6 @@ impl Builder {
382382 Arc :: new ( EventQueue :: new ( Arc :: clone ( & persister) ) )
383383 } ;
384384
385- let event_handler = Arc :: new ( EventHandler :: new (
386- Arc :: clone ( & wallet) ,
387- Arc :: clone ( & event_queue) ,
388- Arc :: clone ( & channel_manager) ,
389- Arc :: clone ( & network_graph) ,
390- Arc :: clone ( & keys_manager) ,
391- Arc :: clone ( & inbound_payments) ,
392- Arc :: clone ( & outbound_payments) ,
393- Arc :: clone ( & logger) ,
394- Arc :: clone ( & config) ,
395- ) ) ;
396-
397- //// Step 16: Create Router and InvoicePayer
398- let router = DefaultRouter :: new (
399- Arc :: clone ( & network_graph) ,
400- Arc :: clone ( & logger) ,
401- keys_manager. get_secure_random_bytes ( ) ,
402- Arc :: clone ( & scorer) ,
403- ) ;
404-
405- let invoice_payer = Arc :: new ( InvoicePayer :: new (
406- Arc :: clone ( & channel_manager) ,
407- router,
408- Arc :: clone ( & logger) ,
409- Arc :: clone ( & event_handler) ,
410- payment:: Retry :: Timeout ( LDK_PAYMENT_RETRY_TIMEOUT ) ,
411- ) ) ;
412-
413385 let peer_store = if let Ok ( mut f) = fs:: File :: open ( format ! (
414386 "{}/{}" ,
415387 ldk_data_dir. clone( ) ,
@@ -431,16 +403,15 @@ impl Builder {
431403 wallet,
432404 tx_sync,
433405 event_queue,
434- event_handler,
435406 channel_manager,
436407 chain_monitor,
437408 peer_manager,
438409 keys_manager,
410+ network_graph,
439411 gossip_sync,
440412 persister,
441413 logger,
442414 scorer,
443- invoice_payer,
444415 inbound_payments,
445416 outbound_payments,
446417 peer_store,
@@ -453,6 +424,8 @@ impl Builder {
453424struct Runtime {
454425 tokio_runtime : Arc < tokio:: runtime:: Runtime > ,
455426 _background_processor : BackgroundProcessor ,
427+ invoice_payer :
428+ Arc < InvoicePayer < Arc < EventHandler < Arc < FilesystemPersister > , Arc < FilesystemLogger > > > > > ,
456429 stop_networking : Arc < AtomicBool > ,
457430 stop_wallet_sync : Arc < AtomicBool > ,
458431}
@@ -466,17 +439,15 @@ pub struct Node {
466439 wallet : Arc < Wallet < bdk:: sled:: Tree > > ,
467440 tx_sync : Arc < EsploraSyncClient < Arc < FilesystemLogger > > > ,
468441 event_queue : Arc < EventQueue < Arc < FilesystemPersister > > > ,
469- event_handler : Arc < EventHandler < Arc < FilesystemPersister > , Arc < FilesystemLogger > > > ,
470442 channel_manager : Arc < ChannelManager > ,
471443 chain_monitor : Arc < ChainMonitor > ,
472444 peer_manager : Arc < PeerManager > ,
473445 keys_manager : Arc < KeysManager > ,
446+ network_graph : Arc < NetworkGraph > ,
474447 gossip_sync : Arc < GossipSync > ,
475448 persister : Arc < FilesystemPersister > ,
476449 logger : Arc < FilesystemLogger > ,
477450 scorer : Arc < Mutex < Scorer > > ,
478- invoice_payer :
479- Arc < InvoicePayer < Arc < EventHandler < Arc < FilesystemPersister > , Arc < FilesystemLogger > > > > > ,
480451 inbound_payments : Arc < PaymentInfoStorage > ,
481452 outbound_payments : Arc < PaymentInfoStorage > ,
482453 peer_store : Arc < PeerInfoStorage < FilesystemPersister > > ,
@@ -517,7 +488,6 @@ impl Node {
517488
518489 // Drop the held runtimes.
519490 self . wallet . drop_runtime ( ) ;
520- self . event_handler . drop_runtime ( ) ;
521491
522492 // Drop the runtime, which stops the background processor and any possibly remaining tokio threads.
523493 * run_lock = None ;
@@ -529,7 +499,34 @@ impl Node {
529499 Arc :: new ( tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ) ;
530500
531501 self . wallet . set_runtime ( Arc :: clone ( & tokio_runtime) ) ;
532- self . event_handler . set_runtime ( Arc :: clone ( & tokio_runtime) ) ;
502+
503+ let event_handler = Arc :: new ( EventHandler :: new (
504+ Arc :: clone ( & self . wallet ) ,
505+ Arc :: clone ( & self . event_queue ) ,
506+ Arc :: clone ( & self . channel_manager ) ,
507+ Arc :: clone ( & self . network_graph ) ,
508+ Arc :: clone ( & self . keys_manager ) ,
509+ Arc :: clone ( & self . inbound_payments ) ,
510+ Arc :: clone ( & self . outbound_payments ) ,
511+ Arc :: clone ( & tokio_runtime) ,
512+ Arc :: clone ( & self . logger ) ,
513+ Arc :: clone ( & self . config ) ,
514+ ) ) ;
515+
516+ let router = DefaultRouter :: new (
517+ Arc :: clone ( & self . network_graph ) ,
518+ Arc :: clone ( & self . logger ) ,
519+ self . keys_manager . get_secure_random_bytes ( ) ,
520+ Arc :: clone ( & self . scorer ) ,
521+ ) ;
522+
523+ let invoice_payer = Arc :: new ( InvoicePayer :: new (
524+ Arc :: clone ( & self . channel_manager ) ,
525+ router,
526+ Arc :: clone ( & self . logger ) ,
527+ Arc :: clone ( & event_handler) ,
528+ payment:: Retry :: Timeout ( LDK_PAYMENT_RETRY_TIMEOUT ) ,
529+ ) ) ;
533530
534531 // Setup wallet sync
535532 let wallet = Arc :: clone ( & self . wallet ) ;
@@ -657,7 +654,7 @@ impl Node {
657654 // Setup background processing
658655 let _background_processor = BackgroundProcessor :: start (
659656 Arc :: clone ( & self . persister ) ,
660- Arc :: clone ( & self . invoice_payer ) ,
657+ Arc :: clone ( & invoice_payer) ,
661658 Arc :: clone ( & self . chain_monitor ) ,
662659 Arc :: clone ( & self . channel_manager ) ,
663660 BPGossipSync :: p2p ( Arc :: clone ( & self . gossip_sync ) ) ,
@@ -667,8 +664,13 @@ impl Node {
667664 ) ;
668665
669666 // TODO: frequently check back on background_processor if there was an error
670-
671- Ok ( Runtime { tokio_runtime, _background_processor, stop_networking, stop_wallet_sync } )
667+ Ok ( Runtime {
668+ tokio_runtime,
669+ _background_processor,
670+ invoice_payer,
671+ stop_networking,
672+ stop_wallet_sync,
673+ } )
672674 }
673675
674676 /// Blocks until the next event is available.
@@ -717,10 +719,10 @@ impl Node {
717719 return Err ( Error :: NotRunning ) ;
718720 }
719721
720- let peer_info = PeerInfo :: try_from ( node_pubkey_and_address. to_string ( ) ) ?;
721-
722722 let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
723723
724+ let peer_info = PeerInfo :: try_from ( node_pubkey_and_address. to_string ( ) ) ?;
725+
724726 let con_peer_info = peer_info. clone ( ) ;
725727 let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
726728 let con_success_cloned = Arc :: clone ( & con_success) ;
@@ -822,12 +824,15 @@ impl Node {
822824
823825 /// Send a payement given an invoice.
824826 pub fn send_payment ( & self , invoice : Invoice ) -> Result < PaymentHash , Error > {
825- if self . running . read ( ) . unwrap ( ) . is_none ( ) {
827+ let runtime_lock = self . running . read ( ) . unwrap ( ) ;
828+ if runtime_lock. is_none ( ) {
826829 return Err ( Error :: NotRunning ) ;
827830 }
828831
832+ let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
833+
829834 // TODO: ensure we never tried paying the given payment hash before
830- let status = match self . invoice_payer . pay_invoice ( & invoice) {
835+ let status = match runtime . invoice_payer . pay_invoice ( & invoice) {
831836 Ok ( _payment_id) => {
832837 let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
833838 // TODO: is this unwrap safe? Would a payment to an invoice with None amount ever
@@ -872,16 +877,18 @@ impl Node {
872877 pub fn send_spontaneous_payment (
873878 & self , amount_msat : u64 , node_id : & str ,
874879 ) -> Result < PaymentHash , Error > {
875- if self . running . read ( ) . unwrap ( ) . is_none ( ) {
880+ let runtime_lock = self . running . read ( ) . unwrap ( ) ;
881+ if runtime_lock. is_none ( ) {
876882 return Err ( Error :: NotRunning ) ;
877883 }
878884
885+ let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
879886 let pubkey = hex_utils:: to_compressed_pubkey ( node_id) . ok_or ( Error :: PeerInfoParseFailed ) ?;
880887
881888 let payment_preimage = PaymentPreimage ( self . keys_manager . get_secure_random_bytes ( ) ) ;
882889 let payment_hash = PaymentHash ( Sha256 :: hash ( & payment_preimage. 0 ) . into_inner ( ) ) ;
883890
884- let status = match self . invoice_payer . pay_pubkey (
891+ let status = match runtime . invoice_payer . pay_pubkey (
885892 pubkey,
886893 payment_preimage,
887894 amount_msat,
0 commit comments