Skip to content

Commit d53a267

Browse files
JOHNJOHN
authored andcommitted
chore: remove deprecated paykit service methods
1 parent e686ac2 commit d53a267

16 files changed

+779
-3232
lines changed

app/src/main/java/to/bitkit/paykit/PaykitManager.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ class PaykitManager @Inject constructor(
6969
var ownerPubkey: String? = null
7070
private set
7171

72+
/**
73+
* Update owner pubkey after a successful session setup.
74+
* Called by ViewModels after completing Paykit Connect flow.
75+
*/
76+
fun setOwnerPubkey(pubkey: String) {
77+
ownerPubkey = pubkey
78+
Logger.info("Owner pubkey updated: ${pubkey.take(12)}...", context = TAG)
79+
}
80+
7281
/**
7382
* Payment service instance for executing payments.
7483
*/
@@ -108,7 +117,8 @@ class PaykitManager @Inject constructor(
108117
// Configure DirectoryService with first available session for authenticated writes
109118
pubkyRingBridge.getCachedSessions().firstOrNull()?.let { session ->
110119
directoryService.configureWithPubkySession(session)
111-
Logger.info("DirectoryService configured with restored session", context = TAG)
120+
ownerPubkey = session.pubkey
121+
Logger.info("DirectoryService configured with restored session for ${session.pubkey.take(12)}...", context = TAG)
112122
}
113123

114124
// Schedule background workers for session refresh and polling
@@ -174,6 +184,8 @@ class PaykitManager @Inject constructor(
174184
val session = pubkyRingBridge.requestSession(context)
175185
// Configure DirectoryService for authenticated writes to homeserver
176186
directoryService.configureWithPubkySession(session)
187+
ownerPubkey = session.pubkey
188+
Logger.info("Session obtained and ownerPubkey set: ${session.pubkey.take(12)}...", context = TAG)
177189
return session
178190
}
179191
throw PaykitException.PubkyRingNotInstalled

app/src/main/java/to/bitkit/paykit/services/DirectoryService.kt

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -495,41 +495,6 @@ removeNoiseEndpoint(transport)
495495
}
496496
}
497497

498-
/**
499-
* Discover pending payment requests from the directory.
500-
*
501-
* DEPRECATED: This method lists our own storage which is the wrong model.
502-
* Use [discoverPendingRequestsFromPeer] to poll each known contact's storage.
503-
*
504-
* For backwards compatibility, this method will still work if requests are
505-
* addressed to our raw pubkey (legacy format).
506-
*/
507-
@Deprecated("Use discoverPendingRequestsFromPeer to poll known contacts")
508-
suspend fun discoverPendingRequests(ownerPubkey: String): List<to.bitkit.paykit.workers.DiscoveredRequest> {
509-
val adapter = pubkyStorage.createUnauthenticatedAdapter(homeserverURL)
510-
val scope = PaykitV0Protocol.recipientScope(ownerPubkey)
511-
val requestsPath = "${PaykitV0Protocol.PAYKIT_V0_PREFIX}/${PaykitV0Protocol.REQUESTS_SUBPATH}/$scope/"
512-
513-
return try {
514-
val requestFiles = pubkyStorage.listDirectory(requestsPath, adapter, ownerPubkey)
515-
516-
requestFiles.mapNotNull { requestId ->
517-
try {
518-
val requestPath = "$requestsPath$requestId"
519-
val envelopeBytes = pubkyStorage.retrieve(requestPath, adapter, ownerPubkey)
520-
val envelopeJson = envelopeBytes?.let { String(it) }
521-
decryptAndParsePaymentRequest(requestId, envelopeJson, ownerPubkey)
522-
} catch (e: Exception) {
523-
Logger.error("Failed to parse request $requestId", e, context = TAG)
524-
null
525-
}
526-
}
527-
} catch (e: Exception) {
528-
Logger.error("Failed to discover pending requests for $ownerPubkey", e, context = TAG)
529-
emptyList()
530-
}
531-
}
532-
533498
/**
534499
* Discover subscription proposals from a peer's storage.
535500
*
@@ -569,42 +534,6 @@ removeNoiseEndpoint(transport)
569534
}
570535
}
571536

572-
/**
573-
* Discover subscription proposals from the directory.
574-
*
575-
* DEPRECATED: This method uses the wrong storage model.
576-
* Use [discoverSubscriptionProposalsFromPeer] to poll each known provider's storage.
577-
*/
578-
@Deprecated("Use discoverSubscriptionProposalsFromPeer to poll known providers")
579-
suspend fun discoverSubscriptionProposals(
580-
ownerPubkey: String,
581-
): List<to.bitkit.paykit.workers.DiscoveredSubscriptionProposal> {
582-
val adapter = pubkyStorage.createUnauthenticatedAdapter(homeserverURL)
583-
val scope = PaykitV0Protocol.subscriberScope(ownerPubkey)
584-
val proposalsPath =
585-
"${PaykitV0Protocol.PAYKIT_V0_PREFIX}/${PaykitV0Protocol.SUBSCRIPTION_PROPOSALS_SUBPATH}/$scope/"
586-
587-
return try {
588-
val proposalFiles = pubkyStorage.listDirectory(proposalsPath, adapter, ownerPubkey)
589-
590-
proposalFiles.mapNotNull { proposalId ->
591-
try {
592-
val proposalPath = "$proposalsPath$proposalId"
593-
val envelopeBytes = pubkyStorage.retrieve(proposalPath, adapter, ownerPubkey)
594-
val envelopeJson = envelopeBytes?.let { String(it) }
595-
// NOTE: This deprecated method cannot verify provider binding since we don't know who we're polling
596-
decryptAndParseSubscriptionProposal(proposalId, envelopeJson, ownerPubkey, expectedProviderPubkey = null)
597-
} catch (e: Exception) {
598-
Logger.error("Failed to parse proposal $proposalId", e, context = TAG)
599-
null
600-
}
601-
}
602-
} catch (e: Exception) {
603-
Logger.error("Failed to discover subscription proposals for $ownerPubkey", e, context = TAG)
604-
emptyList()
605-
}
606-
}
607-
608537
/**
609538
* Publish a subscription proposal to our storage for the subscriber to discover.
610539
* The proposal is stored ENCRYPTED at the canonical v0 path:

app/src/main/java/to/bitkit/paykit/services/NoisePaymentService.kt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,12 @@ class NoisePaymentService @Inject constructor(
404404
* an incoming Noise connection.
405405
*
406406
* @param port Port to listen on
407+
* @param externalHost Optional external host address for publishing endpoint (for relay/NAT traversal)
407408
* @param onRequest Callback invoked when a payment request is received
408409
*/
409410
suspend fun startBackgroundServer(
410411
port: Int,
412+
externalHost: String? = null,
411413
onRequest: (NoisePaymentRequest) -> Unit
412414
) = withContext(Dispatchers.IO) {
413415
if (isServerRunning) {
@@ -424,6 +426,11 @@ class NoisePaymentService @Inject constructor(
424426

425427
Logger.info("Noise server started on port $port", context = TAG)
426428

429+
// Update Noise endpoint on homeserver with actual host/port
430+
// This allows other clients to discover how to connect for real-time Noise payments
431+
// Note: For mobile, externalHost should be provided by a relay/NAT traversal service
432+
updateNoiseEndpointOnServer(port, externalHost)
433+
427434
// Accept a single connection (push-wake mode)
428435
val clientSocket = serverSocket?.accept()
429436
if (clientSocket != null) {
@@ -440,6 +447,46 @@ class NoisePaymentService @Inject constructor(
440447
}
441448
}
442449

450+
/**
451+
* Update Noise endpoint on homeserver with current server address.
452+
* Best-effort: failures are logged but don't stop the server.
453+
*/
454+
private suspend fun updateNoiseEndpointOnServer(port: Int, externalHost: String?) {
455+
try {
456+
val keypair = keyManager.getCachedNoiseKeypair() ?: run {
457+
Logger.warn("Cannot update Noise endpoint: no keypair cached", context = TAG)
458+
return
459+
}
460+
461+
// Use provided host, or fall back to local IP for testing
462+
val host = externalHost ?: getLocalIpAddress() ?: "localhost"
463+
464+
directoryService.publishNoiseEndpoint(
465+
host = host,
466+
port = port,
467+
noisePubkey = keypair.publicKeyHex,
468+
metadata = null,
469+
)
470+
Logger.info("Updated Noise endpoint to $host:$port", context = TAG)
471+
} catch (e: Exception) {
472+
// Log but don't fail - server is already running
473+
Logger.warn("Failed to update Noise endpoint: ${e.message}", context = TAG)
474+
}
475+
}
476+
477+
/**
478+
* Get local IP address for testing purposes.
479+
* In production, use a relay service for NAT traversal.
480+
*/
481+
private fun getLocalIpAddress(): String? = try {
482+
java.net.NetworkInterface.getNetworkInterfaces()?.asSequence()
483+
?.flatMap { it.inetAddresses.asSequence() }
484+
?.firstOrNull { !it.isLoopbackAddress && it is java.net.Inet4Address }
485+
?.hostAddress
486+
} catch (e: Exception) {
487+
null
488+
}
489+
443490
/**
444491
* Stop the background server
445492
*/

0 commit comments

Comments
 (0)