@@ -112,6 +112,8 @@ enum class LdkCallbackResponses {
112112 config_init_success,
113113 network_graph_init_success,
114114 add_peer_success,
115+ peer_already_connected,
116+ peer_currently_connecting,
115117 chain_sync_success,
116118 invoice_payment_success,
117119 tx_set_confirmed,
@@ -174,6 +176,11 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
174176 private var currentBlockchainTipHash: String? = null
175177 private var currentBlockchainHeight: Double? = null
176178
179+ // List of peers that "should" remain connected. Stores address: String, port: Double, pubKey: String
180+ private var addedPeers: MutableList <HashMap <String , Any >> = mutableListOf ()
181+ private var currentlyConnectingPeers: MutableList <String > = mutableListOf ()
182+ private var timerTaskScheduled: Boolean = false
183+
177184 // Static to be accessed from other classes
178185 companion object {
179186 lateinit var accountStoragePath: String
@@ -500,6 +507,16 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
500507
501508 peerHandler = channelManagerConstructor!! .nio_peer_handler
502509
510+ // Start watching for dropped peers every 1 second
511+ if (! timerTaskScheduled) {
512+ Timer ().schedule(object : TimerTask () {
513+ override fun run () {
514+ handleDroppedPeers()
515+ }
516+ }, 1000 , 1000 )
517+ timerTaskScheduled = true
518+ }
519+
503520 // Cached for restarts
504521 currentNetwork = network
505522 currentBlockchainTipHash = blockHash
@@ -599,17 +616,71 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
599616 handleResolve(promise, LdkCallbackResponses .chain_sync_success)
600617 }
601618
619+ fun handleDroppedPeers () {
620+ peerHandler ? : return LdkEventEmitter .send(EventTypes .native_log, " Handling dropped peers error. Peer handler not initialized." )
621+
622+ LdkEventEmitter .send(EventTypes .native_log, " Checking for dropped peers" )
623+
624+ val currentlyConnected = peerManager!! ._peer_node_ids
625+
626+ addedPeers.forEach { peer ->
627+ val pubKey = peer[" pubKey" ] as String
628+ val address = peer[" address" ] as String
629+ val port = peer[" port" ] as Double
630+
631+ if (currentlyConnected.map { it._a .hexEncodedString() }.contains(pubKey)) {
632+ return
633+ }
634+
635+ if (currentlyConnectingPeers.contains(pubKey)) {
636+ return
637+ }
638+
639+ try {
640+ currentlyConnectingPeers.add(pubKey)
641+ peerHandler!! .connect(pubKey.hexa(), InetSocketAddress (address, port.toInt()), 10 )
642+ LdkEventEmitter .send(EventTypes .native_log, " Connection to peer $pubKey re-established by handleDroppedPeers()." )
643+ } catch (e: Exception ) {
644+ LdkEventEmitter .send(EventTypes .native_log, " Error connecting peer $pubKey . Error: $e " )
645+ } finally {
646+ currentlyConnectingPeers.remove(pubKey)
647+ }
648+ }
649+ }
650+
602651 @ReactMethod
603652 fun addPeer (address : String , port : Double , pubKey : String , timeout : Double , promise : Promise ) {
604653 peerHandler ? : return handleReject(promise, LdkErrors .init_peer_handler)
605654
655+ // If peer is already connected don't add again
656+ val currentList = peerManager!! ._peer_node_ids
657+ if (currentList.map { it._a .hexEncodedString() }.contains(pubKey)) {
658+ return handleResolve(promise, LdkCallbackResponses .peer_already_connected)
659+ }
660+
661+ // If peer is being currently connected don't add again
662+ if (currentlyConnectingPeers.contains(pubKey)) {
663+ return handleResolve(promise, LdkCallbackResponses .peer_currently_connecting)
664+ }
665+
606666 try {
667+ currentlyConnectingPeers.add(pubKey)
607668 peerHandler!! .connect(pubKey.hexa(), InetSocketAddress (address, port.toInt()), timeout.toInt())
669+
670+ if (! addedPeers.map { it[" pubKey" ] as String }.contains(pubKey)) {
671+ addedPeers.add(hashMapOf(
672+ " address" to address,
673+ " port" to port,
674+ " pubKey" to pubKey
675+ ))
676+ }
677+
678+ handleResolve(promise, LdkCallbackResponses .add_peer_success)
608679 } catch (e: Exception ) {
609- return handleReject(promise, LdkErrors .add_peer_fail, Error (e))
680+ handleReject(promise, LdkErrors .add_peer_fail, Error (e))
681+ } finally {
682+ currentlyConnectingPeers.remove(pubKey)
610683 }
611-
612- handleResolve(promise, LdkCallbackResponses .add_peer_success)
613684 }
614685
615686 @ReactMethod
0 commit comments