diff options
| author | Adam Soltys <[email protected]> | 2026-09-14 09:16:23 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-09-14 09:16:23 -0700 |
| commit | dd1489303f59ccef6b322142f94e08d750c06e79 (patch) | |
| tree | eecccbeb577b873b855766f8e064622ce5c2f2dc /src/ark/manager.js | |
| parent | 671d2a96474f59ca9234c876ce6604d03de95727 (diff) | |
| download | coinosv3-dd1489303f59ccef6b322142f94e08d750c06e79.tar.gz coinosv3-dd1489303f59ccef6b322142f94e08d750c06e79.zip | |
A zap answers as fast as the route allows.
The wallet used to add two to four seconds of its own around a Lightning
send: a random pause plus a relay look-back before paying, and a
two-second poll for the result after. The notifier's claim now decides
who pays in one round trip, with the relay look-back kept only for
replays and for when the notifier gives no verdict; a phone answering
from behind another app waits a second so a desktop tab wins the claim
instead of paying at a throttled crawl. After the send, one held
CheckLightningPayment call brings the preimage the moment CLN has it —
for wallet-connect pays, the background worker, and the app's own Send.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QYJfZ4A1TDCEY4Foq3CApR
Diffstat (limited to 'src/ark/manager.js')
| -rw-r--r-- | src/ark/manager.js | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/ark/manager.js b/src/ark/manager.js index 5775d65..c3a8b58 100644 --- a/src/ark/manager.js +++ b/src/ark/manager.js @@ -973,6 +973,21 @@ export class ArkManager { } } + // Wait on the server for a Lightning send to settle or fail, then drive + // the action to its terminal step. One held call instead of polling every + // couple of seconds — the preimage reaches the caller the moment CLN has + // it. A broken long call (proxy timeout, network) just returns the action + // as it stands, and the caller's polling takes over. + async awaitLnPay(id, timeoutMs = 90_000) { + const a = this.lnAction(id); + if (!a || a.step !== 'initiated') return this.driveLn(id); + await Promise.race([ + checkLightningPayment(this.arkUrl, hex.decode(a.paymentHash), true).catch(() => null), + new Promise((r) => setTimeout(r, timeoutMs)), + ]); + return this.driveLn(id); + } + lnAction(id) { return this.state.actions.find((a) => a.id === id && a.type.startsWith('ln-')); } |
