Skip to content

Commit 564684d

Browse files
authored
Merge pull request #245 from synonymdev/android-peer-watcher
feat: watches for dropped peers and prevents duplicate connections on android
2 parents 243c8af + 22952ce commit 564684d

File tree

1 file changed

+74
-3
lines changed

1 file changed

+74
-3
lines changed

lib/android/src/main/java/com/reactnativeldk/LdkModule.kt

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)