Skip to content
This repository was archived by the owner on Feb 9, 2026. It is now read-only.

Commit 05f47d6

Browse files
committed
feat: android pre-populated scorer download
1 parent d995d42 commit 05f47d6

3 files changed

Lines changed: 50 additions & 12 deletions

File tree

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

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.ldk.structs.Result_StrSecp256k1ErrorZ.Result_StrSecp256k1ErrorZ_OK
1919
import org.ldk.util.UInt128
2020
import java.io.File
2121
import java.net.InetSocketAddress
22+
import java.net.URL
2223
import java.nio.file.Files
2324
import java.nio.file.Paths
2425
import java.text.SimpleDateFormat
@@ -92,7 +93,8 @@ enum class LdkErrors {
9293
backup_check_failed,
9394
backup_setup_failed,
9495
backup_restore_failed,
95-
backup_restore_failed_existing_files
96+
backup_restore_failed_existing_files,
97+
scorer_download_fail
9698
}
9799

98100
enum class LdkCallbackResponses {
@@ -119,7 +121,9 @@ enum class LdkCallbackResponses {
119121
file_write_success,
120122
backup_client_setup_success,
121123
backup_restore_success,
122-
backup_client_check_success
124+
backup_client_check_success,
125+
scorer_download_success,
126+
scorer_download_skip
123127
}
124128

125129
enum class LdkFileNames(val fileName: String) {
@@ -254,7 +258,41 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
254258
}
255259

256260
@ReactMethod
257-
fun initNetworkGraph(network: String, rapidGossipSyncUrl: String, promise: Promise) {
261+
fun downloadScorer(scorerSyncUrl: String, skipHoursThreshold: Double, promise: Promise) {
262+
val scorerFile = File(accountStoragePath + "/" + LdkFileNames.scorer.fileName)
263+
//If old one is still recent, skip download. Else delete it.
264+
if (scorerFile.exists()) {
265+
val lastModifiedHours = (System.currentTimeMillis().toDouble() - scorerFile.lastModified().toDouble()) / 1000 / 60 / 60
266+
if (lastModifiedHours < skipHoursThreshold) {
267+
LdkEventEmitter.send(EventTypes.native_log, "Skipping scorer download. Last updated $lastModifiedHours hours ago.")
268+
return handleResolve(promise, LdkCallbackResponses.scorer_download_skip)
269+
}
270+
271+
scorerFile.delete()
272+
}
273+
274+
Thread(Runnable {
275+
val destinationFile = accountStoragePath + "/" + LdkFileNames.scorer.fileName
276+
277+
URL(scorerSyncUrl).downloadFile(destinationFile) { error ->
278+
if (error != null) {
279+
UiThreadUtil.runOnUiThread {
280+
handleReject(promise, LdkErrors.scorer_download_fail, Error(error))
281+
}
282+
return@downloadFile
283+
}
284+
285+
UiThreadUtil.runOnUiThread {
286+
LdkEventEmitter.send(EventTypes.native_log, "Scorer downloaded successfully.")
287+
handleResolve(promise, LdkCallbackResponses.scorer_download_success)
288+
}
289+
return@downloadFile
290+
}
291+
}).start()
292+
}
293+
294+
@ReactMethod
295+
fun initNetworkGraph(network: String, rapidGossipSyncUrl: String, skipHoursThreshold: Double, promise: Promise) {
258296
if (networkGraph !== null) {
259297
return handleReject(promise, LdkErrors.already_init)
260298
}
@@ -292,7 +330,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
292330
//If it's been more than 24 hours then we need to update RGS
293331
val timestamp = if (networkGraph!!._last_rapid_gossip_sync_timestamp is Option_u32Z.Some) (networkGraph!!._last_rapid_gossip_sync_timestamp as Option_u32Z.Some).some.toLong() else 0 // (networkGraph!!._last_rapid_gossip_sync_timestamp as Option_u32Z.Some).some
294332
val minutesDiffSinceLastRGS = (System.currentTimeMillis() / 1000 - timestamp) / 60
295-
if (minutesDiffSinceLastRGS < 60) {
333+
if (minutesDiffSinceLastRGS < (60 * skipHoursThreshold)) {
296334
LdkEventEmitter.send(EventTypes.native_log, "Skipping rapid gossip sync. Last updated ${minutesDiffSinceLastRGS/60} hours ago.")
297335
return handleResolve(promise, LdkCallbackResponses.network_graph_init_success)
298336
}
@@ -366,7 +404,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
366404
networkGraph!!,
367405
logger.logger
368406
) ?: return handleReject(promise, LdkErrors.init_scorer_failed)
369-
407+
370408
val scorer = MultiThreadedLockableScore.of(probabilisticScorer.as_Score())
371409

372410
val scoringParams = ProbabilisticScoringDecayParameters.with_default()

lib/ios/Ldk.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -482,12 +482,7 @@ class Ldk: NSObject {
482482
currentBlockchainTipHash = blockHash
483483
currentBlockchainHeight = blockHeight
484484
addForegroundObserver()
485-
486-
print("Scorer:")
487-
// Task {
488-
// probabilisticScorer.debugLogLiquidityStats()
489-
// }
490-
485+
491486
return handleResolve(resolve, .channel_manager_init_success)
492487
}
493488

lib/src/lightning-manager.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,12 @@ class LightningManager {
349349
return this.handleStartError(paramCheckResponse);
350350
}
351351
} else {
352-
console.warn('Skipping start param check. Switch back on for debugging.');
352+
ldk
353+
.writeToLogFile(
354+
'info',
355+
'Skipping start param check. Set skipParamCheck=false for debugging.',
356+
)
357+
.catch(console.error);
353358
}
354359

355360
this.getBestBlock = getBestBlock;

0 commit comments

Comments
 (0)