fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: wake node polish - #526

Merged
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish
Dec 19, 2025
Merged

fix: wake node polish#526
jvsena42 merged 34 commits into
masterfrom
fix/wake-node-polish

Conversation

@jvsena42

@jvsena42jvsena42 commented Dec 15, 2025

Copy link
Copy Markdown
Member

Description

Main changes:

  • Fix node lifecycle handling in WakeNodeWorker
  • Improve logging
  • fix: delete FCM token on wallet wipe

Preview

QA Notes

OBS: After channel creation it is necessary wait 3-5 minutes before testing WakeToPay for blocktank cache the channels
FCM Token

  • Fresh install -> display log Got new FCM token via FirebaseMessagingService.onNewToken -> don't create wallet -> finish app -> reopen and create wallet -> Should display Device registered for notifications log
  • Existing install -> reset wallet -> should delete FCM token -> create new wallet -> Should display Device registered for notifications log
  • Moving same seed between two different devices from the same vendor
  • Moving same seed between two different devices from different vendors

Push Notification errors

  • Trigger lightning error with app running in foreground -> shouldn't stop node
  • Trigger lightning error with app running in background -> shouldn't stop node

Wake to operations

  • incomingHtlc
  • mutualClose
  • orderPaymentConfirmed
  • cjitPaymentArrived

@jvsena42jvsena42 self-assigned this Dec 15, 2025
Base automatically changed from chore/update-deps to masterDecember 15, 2025 16:22
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

Comment threadapp/src/main/java/to/bitkit/usecases/WipeWalletUseCase.kt Fixed
@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@ovitrif

Copy link
Copy Markdown
Collaborator

God… claude reviews were supposed to edit the same comment but it doesn't seem to work 🤦🏻

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@claude

This comment was marked as outdated.

@jvsena42
jvsena42 marked this pull request as ready for review December 19, 2025 17:27
@claude

This comment was marked as duplicate.

Comment threadapp/src/main/java/to/bitkit/fcm/WakeNodeWorker.kt
@claude

claudeBot commented Dec 19, 2025

Copy link
Copy Markdown
Contributor

PR Review: fix: wake node polish

Summary

This PR improves node lifecycle handling in WakeNodeWorker, enhances logging consistency, and fixes FCM token deletion on wallet wipe. Overall, the changes are well-structured and address important issues around push notifications and node lifecycle management.


✅ Strengths

  1. Improved Node Lifecycle Management (WakeNodeWorker.kt:245-264)

    • Smart approach to only stop the node when app is in background
    • The 1-second delay allows the app to come to foreground if notification was tapped
    • Prevents unnecessary node stops when user is actively using the app
  2. Consistent Logging

    • All Logger calls now properly include context = TAG parameter throughout FcmService.kt and WakeNodeWorker.kt
    • Follows the CLAUDE.md guideline: "ALWAYS pass the TAG as context to Logger calls"
  3. Better Error Handling (WakeNodeWorker.kt:88-103)

    • Moved from try-catch to .onFailure pattern with Result<T>
    • Aligns with CLAUDE.md rule: "ALWAYS use the Result API instead of try-catch"
    • Properly delegates to blocktankRepo.openChannel() instead of directly calling CoreService
  4. FCM Token Cleanup (WipeWalletUseCase.kt:44)

    • Correctly deletes FCM token on wallet wipe
    • Test coverage updated accordingly
  5. Code Cleanup

    • Removed unnecessary CoreService injection from WakeNodeWorker
    • Removed unused self variable
    • Removed unnecessary lightningRepo.connectToTrustedPeers() call

⚠️ Potential Issues

1. Race Condition in deliver() method (WakeNodeWorker.kt:257)

Severity: Medium

if (App.currentActivity?.value ==null) {
Logger.debug("App in background, stopping node after notification delivery", context =TAG)
lightningRepo.stop()
} else {
Logger.debug("App in foreground, keeping node running", context =TAG)
}

Problem:App.currentActivity is a shared mutable state that could change between the check and the action. If the user backgrounds the app immediately after the check but before the stop, the node could remain running when it shouldn't.

Recommendation: Consider using a thread-safe snapshot:

val isAppInForeground =App.currentActivity?.value !=null
delay(1.seconds)
if (!isAppInForeground) {
lightningRepo.stop()
}

2. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

Severity: Low-Medium

The deleteToken() call is not wrapped in error handling. If Firebase token deletion fails, it could potentially throw and break the entire wipe process.

Recommendation:

runCatching { firebaseMessaging.deleteToken() }
.onFailure { Logger.error("Failed to delete FCM token", it, context =TAG) }

Since wallet wipe should proceed even if FCM token deletion fails, this should be logged but not block the operation.

3. Validation Check Location (LightningRepo.kt:872)

Severity: Low

require(token.isNotEmpty()) { "FCM token is empty or null" }

This validation happens after potentially awaiting the Firebase token, but the error message says "or null" when null was already handled by the elvis operator on line 869.

Recommendation: The message should just say "FCM token is empty" for clarity.

4. setExpedited() without proper fallback handling (FcmService.kt:86)

Severity: Low

.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)

This is added to ensure the work runs expediently, which is good. However, the fallback policy means this could be delayed significantly on quota-exhausted devices, which could impact wake-to-pay reliability.

Consideration: Document this behavior and ensure monitoring/logging exists to track cases where work is delayed.


🎯 Best Practices & Architecture

Positive:

  • ✅ Follows MVVM pattern with proper layer separation
  • ✅ Repository pattern correctly used (blocktankRepo.openChannel())
  • ✅ Coroutine-based async operations
  • ✅ Proper use of Result<T> API
  • ✅ Unit test coverage updated

Alignment with CLAUDE.md:

  • ✅ Uses context = TAG in Logger calls
  • ✅ Uses Result API instead of try-catch
  • ✅ Prefers .onFailure { } over explicit try-catch
  • ✅ Business logic in Repository layer
  • ✅ Architecture flow: UI → ViewModel → Repository → RUST

🔒 Security Considerations

No security issues identified. The changes appropriately:

  • Handle sensitive FCM token lifecycle
  • Properly clean up on wallet wipe
  • Don't expose sensitive information in logs

⚡ Performance Considerations

  1. Positive: Removed unnecessary connectToTrustedPeers() call reduces network overhead
  2. Positive: Smart node lifecycle management prevents unnecessary stop/start cycles
  3. Note: The 1-second delay in deliver() is acceptable for UX but adds latency to notification delivery

🧪 Test Coverage

Good: Test coverage updated for WipeWalletUseCase to include firebaseMessaging mock.

Suggestion: Consider adding tests for:

  1. WakeNodeWorker behavior when app is in foreground vs background
  2. FCM token deletion failure scenarios in WipeWalletUseCase

📝 Minor Suggestions

  1. LightningNodeService.kt:134 - Comment update from "Close all activities" to "Close activities gracefully" is accurate and helpful

  2. LspNotificationsService.kt:55 - Changed from isProduction = null to isProduction = !Env.isDebug. Ensure this is the intended behavior for all build variants.


✅ Recommendation

LGTM with minor suggestions. The core functionality is solid and improves the codebase. Consider addressing the race condition in deliver() and adding error handling for FCM token deletion, but these are not blockers.

The QA testing appears comprehensive, covering the main scenarios for FCM tokens, push notification errors, and wake-to-pay operations.


Code Quality: ⭐⭐⭐⭐ (4/5)
Test Coverage: ⭐⭐⭐⭐ (4/5)
Documentation: ⭐⭐⭐ (3/5) - Could use inline comments for the deliver() logic

@jvsena42

jvsena42 commented Dec 19, 2025

Copy link
Copy Markdown
MemberAuthor
  1. Missing Error Handling for firebaseMessaging.deleteToken() (WipeWalletUseCase.kt:44)

The method doesn't throw exceptions

@ovitrifovitrif left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

utAck

@jvsena42
jvsena42 merged commit 0c22b7e into masterDec 19, 2025
13 checks passed
@jvsena42
jvsena42 deleted the fix/wake-node-polish branch December 19, 2025 20:13
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jvsena42@ovitrif@github-advanced-security