@@ -42,7 +42,8 @@ enum class EventTypes {
4242 channel_manager_payment_claimed,
4343 emergency_force_close_channel,
4444 new_channel,
45- network_graph_updated
45+ network_graph_updated,
46+ channel_manager_restarted
4647}
4748// *****************************************************************
4849
@@ -101,7 +102,8 @@ enum class LdkCallbackResponses {
101102 tx_set_unconfirmed,
102103 process_pending_htlc_forwards_success,
103104 claim_funds_success,
104- ldk_reset,
105+ ldk_stop,
106+ ldk_restart,
105107 close_channel_success,
106108 file_write_success
107109}
@@ -142,6 +144,11 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
142144 private var ldkNetwork: Network ? = null
143145 private var ldkCurrency: Currency ? = null
144146
147+ // Keep these in memory for restarting the channel manager constructor
148+ private var currentNetwork: String? = null
149+ private var currentBlockchainTipHash: String? = null
150+ private var currentBlockchainHeight: Double? = null
151+
145152 // Static to be accessed from other classes
146153 companion object {
147154 lateinit var accountStoragePath: String
@@ -157,10 +164,6 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
157164
158165 @ReactMethod
159166 fun setAccountStoragePath (storagePath : String , promise : Promise ) {
160- if (accountStoragePath != " " ) {
161- return handleReject(promise, LdkErrors .already_init)
162- }
163-
164167 val accountStoragePath = File (storagePath)
165168 val channelStoragePath = File (" $storagePath /channels/" )
166169
@@ -397,8 +400,6 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
397400 channelMonitors.add(it.toFile().readBytes())
398401 }
399402
400- println (" ***1***" )
401-
402403 LdkEventEmitter .send(EventTypes .native_log, " Restoring node from disk2" )
403404
404405 channelManagerConstructor = ChannelManagerConstructor (
@@ -419,7 +420,6 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
419420 logger.logger
420421 )
421422
422- println (" ***2***" )
423423 } else {
424424 // New node
425425 LdkEventEmitter .send(EventTypes .native_log, " Creating new channel manager" )
@@ -451,11 +451,56 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
451451
452452 peerHandler = channelManagerConstructor!! .nio_peer_handler
453453
454+ // Cached for restarts
455+ currentNetwork = network
456+ currentBlockchainTipHash = blockHash
457+ currentBlockchainHeight = blockHeight
458+
454459 handleResolve(promise, LdkCallbackResponses .channel_manager_init_success)
455460 }
461+ @ReactMethod
462+ fun restart (promise : Promise ) {
463+ if (channelManagerConstructor == null ) {
464+ return handleReject(promise, LdkErrors .init_channel_manager)
465+ }
466+
467+ // Node was never started
468+ val currentNetwork = currentNetwork ? : return handleReject(promise, LdkErrors .init_channel_manager)
469+ val currentBlockchainTipHash = currentBlockchainTipHash ? : return handleReject(promise, LdkErrors .init_channel_manager)
470+ val currentBlockchainHeight = currentBlockchainHeight ? : return handleReject(promise, LdkErrors .init_channel_manager)
471+
472+ LdkEventEmitter .send(EventTypes .native_log, " Stopping LDK background tasks" )
473+
474+ // Reset only objects created by initChannelManager
475+ channelManagerConstructor?.interrupt()
476+ channelManagerConstructor = null
477+ channelManager = null
478+ peerManager = null
479+ peerHandler = null
480+
481+ LdkEventEmitter .send(EventTypes .native_log, " Starting LDK background tasks again" )
482+
483+ val initPromise = PromiseImpl (
484+ { resolve ->
485+ LdkEventEmitter .send(EventTypes .channel_manager_restarted, " " )
486+ LdkEventEmitter .send(EventTypes .native_log, " LDK restarted successfully" )
487+ handleResolve(promise, LdkCallbackResponses .ldk_restart)
488+ },
489+ { reject ->
490+ LdkEventEmitter .send(EventTypes .native_log, " Error restarting LDK. Error: $reject " )
491+ handleReject(promise, LdkErrors .unknown_error)
492+ })
493+
494+ initChannelManager(
495+ currentNetwork,
496+ currentBlockchainTipHash,
497+ currentBlockchainHeight,
498+ initPromise
499+ )
500+ }
456501
457502 @ReactMethod
458- fun reset (promise : Promise ) {
503+ fun stop (promise : Promise ) {
459504 channelManagerConstructor?.interrupt()
460505 channelManagerConstructor = null
461506 chainMonitor = null
@@ -467,10 +512,8 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
467512 peerHandler = null
468513 ldkNetwork = null
469514 ldkCurrency = null
470- accountStoragePath = " "
471- channelStoragePath = " "
472515
473- handleResolve(promise, LdkCallbackResponses .ldk_reset )
516+ handleResolve(promise, LdkCallbackResponses .ldk_stop )
474517 }
475518
476519 // MARK: Update methods
@@ -488,7 +531,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
488531 }
489532
490533 @ReactMethod
491- fun syncToTip (header : String , height : Double , promise : Promise ) {
534+ fun syncToTip (header : String , blockHash : String , height : Double , promise : Promise ) {
492535 channelManager ? : return handleReject(promise, LdkErrors .init_channel_manager)
493536 chainMonitor ? : return handleReject(promise, LdkErrors .init_chain_monitor)
494537
@@ -499,6 +542,10 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
499542 return handleReject(promise, LdkErrors .unknown_error, Error (e))
500543 }
501544
545+ // Used for quick restarts
546+ currentBlockchainTipHash = blockHash
547+ currentBlockchainHeight = height
548+
502549 handleResolve(promise, LdkCallbackResponses .chain_sync_success)
503550 }
504551
0 commit comments