@@ -382,34 +382,6 @@ impl Builder {
382
382
Arc :: new ( EventQueue :: new ( Arc :: clone ( & persister) ) )
383
383
} ;
384
384
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
-
413
385
let peer_store = if let Ok ( mut f) = fs:: File :: open ( format ! (
414
386
"{}/{}" ,
415
387
ldk_data_dir. clone( ) ,
@@ -431,16 +403,15 @@ impl Builder {
431
403
wallet,
432
404
tx_sync,
433
405
event_queue,
434
- event_handler,
435
406
channel_manager,
436
407
chain_monitor,
437
408
peer_manager,
438
409
keys_manager,
410
+ network_graph,
439
411
gossip_sync,
440
412
persister,
441
413
logger,
442
414
scorer,
443
- invoice_payer,
444
415
inbound_payments,
445
416
outbound_payments,
446
417
peer_store,
@@ -453,6 +424,8 @@ impl Builder {
453
424
struct Runtime {
454
425
tokio_runtime : Arc < tokio:: runtime:: Runtime > ,
455
426
_background_processor : BackgroundProcessor ,
427
+ invoice_payer :
428
+ Arc < InvoicePayer < Arc < EventHandler < Arc < FilesystemPersister > , Arc < FilesystemLogger > > > > > ,
456
429
stop_networking : Arc < AtomicBool > ,
457
430
stop_wallet_sync : Arc < AtomicBool > ,
458
431
}
@@ -466,17 +439,15 @@ pub struct Node {
466
439
wallet : Arc < Wallet < bdk:: sled:: Tree > > ,
467
440
tx_sync : Arc < EsploraSyncClient < Arc < FilesystemLogger > > > ,
468
441
event_queue : Arc < EventQueue < Arc < FilesystemPersister > > > ,
469
- event_handler : Arc < EventHandler < Arc < FilesystemPersister > , Arc < FilesystemLogger > > > ,
470
442
channel_manager : Arc < ChannelManager > ,
471
443
chain_monitor : Arc < ChainMonitor > ,
472
444
peer_manager : Arc < PeerManager > ,
473
445
keys_manager : Arc < KeysManager > ,
446
+ network_graph : Arc < NetworkGraph > ,
474
447
gossip_sync : Arc < GossipSync > ,
475
448
persister : Arc < FilesystemPersister > ,
476
449
logger : Arc < FilesystemLogger > ,
477
450
scorer : Arc < Mutex < Scorer > > ,
478
- invoice_payer :
479
- Arc < InvoicePayer < Arc < EventHandler < Arc < FilesystemPersister > , Arc < FilesystemLogger > > > > > ,
480
451
inbound_payments : Arc < PaymentInfoStorage > ,
481
452
outbound_payments : Arc < PaymentInfoStorage > ,
482
453
peer_store : Arc < PeerInfoStorage < FilesystemPersister > > ,
@@ -517,7 +488,6 @@ impl Node {
517
488
518
489
// Drop the held runtimes.
519
490
self . wallet . drop_runtime ( ) ;
520
- self . event_handler . drop_runtime ( ) ;
521
491
522
492
// Drop the runtime, which stops the background processor and any possibly remaining tokio threads.
523
493
* run_lock = None ;
@@ -529,7 +499,34 @@ impl Node {
529
499
Arc :: new ( tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) . unwrap ( ) ) ;
530
500
531
501
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
+ ) ) ;
533
530
534
531
// Setup wallet sync
535
532
let wallet = Arc :: clone ( & self . wallet ) ;
@@ -657,7 +654,7 @@ impl Node {
657
654
// Setup background processing
658
655
let _background_processor = BackgroundProcessor :: start (
659
656
Arc :: clone ( & self . persister ) ,
660
- Arc :: clone ( & self . invoice_payer ) ,
657
+ Arc :: clone ( & invoice_payer) ,
661
658
Arc :: clone ( & self . chain_monitor ) ,
662
659
Arc :: clone ( & self . channel_manager ) ,
663
660
BPGossipSync :: p2p ( Arc :: clone ( & self . gossip_sync ) ) ,
@@ -667,8 +664,13 @@ impl Node {
667
664
) ;
668
665
669
666
// 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
+ } )
672
674
}
673
675
674
676
/// Blocks until the next event is available.
@@ -717,10 +719,10 @@ impl Node {
717
719
return Err ( Error :: NotRunning ) ;
718
720
}
719
721
720
- let peer_info = PeerInfo :: try_from ( node_pubkey_and_address. to_string ( ) ) ?;
721
-
722
722
let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
723
723
724
+ let peer_info = PeerInfo :: try_from ( node_pubkey_and_address. to_string ( ) ) ?;
725
+
724
726
let con_peer_info = peer_info. clone ( ) ;
725
727
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
726
728
let con_success_cloned = Arc :: clone ( & con_success) ;
@@ -822,12 +824,15 @@ impl Node {
822
824
823
825
/// Send a payement given an invoice.
824
826
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 ( ) {
826
829
return Err ( Error :: NotRunning ) ;
827
830
}
828
831
832
+ let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
833
+
829
834
// 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) {
831
836
Ok ( _payment_id) => {
832
837
let payee_pubkey = invoice. recover_payee_pub_key ( ) ;
833
838
// TODO: is this unwrap safe? Would a payment to an invoice with None amount ever
@@ -872,16 +877,18 @@ impl Node {
872
877
pub fn send_spontaneous_payment (
873
878
& self , amount_msat : u64 , node_id : & str ,
874
879
) -> 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 ( ) {
876
882
return Err ( Error :: NotRunning ) ;
877
883
}
878
884
885
+ let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
879
886
let pubkey = hex_utils:: to_compressed_pubkey ( node_id) . ok_or ( Error :: PeerInfoParseFailed ) ?;
880
887
881
888
let payment_preimage = PaymentPreimage ( self . keys_manager . get_secure_random_bytes ( ) ) ;
882
889
let payment_hash = PaymentHash ( Sha256 :: hash ( & payment_preimage. 0 ) . into_inner ( ) ) ;
883
890
884
- let status = match self . invoice_payer . pay_pubkey (
891
+ let status = match runtime . invoice_payer . pay_pubkey (
885
892
pubkey,
886
893
payment_preimage,
887
894
amount_msat,
0 commit comments