diff options
| author | Adam Soltys <[email protected]> | 2026-07-06 14:55:40 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-07-06 14:55:40 -0700 |
| commit | 312621af84136fddbe7d7e47ffecc1ba2b38920d (patch) | |
| tree | 6090489ef5ae7bac16a25340bd2c11f426079cbb /src/wallet.js | |
| parent | d071a09604599831d370b06563144cf4ba028902 (diff) | |
| download | coinosv3-312621af84136fddbe7d7e47ffecc1ba2b38920d.tar.gz coinosv3-312621af84136fddbe7d7e47ffecc1ba2b38920d.zip | |
Fee rates from live explorer + reconnect half-open socket on wake
- Fee rates on the electrum backend came from Fulcrum's estimatefee
(Core's estimatesmartfee): historical, laggy, floored at 1 sat/vB, so
it showed 1 across the board while mempool.space showed 11/10. Pull the
configured explorer's live recommendation instead (/v1/fees/recommended,
then /fee-estimates), falling back to estimatefee only when the explorer
is unreachable — self-hosted/regtest behaviour unchanged.
- On mobile a backgrounded page leaves the socket half-open: TCP is dead
but readyState still reads OPEN, so wake() never reconnected and fired
scan RPCs into the void, waiting ~20s for the heartbeat to recover.
wake() now forces a reconnect when the socket has been silent past the
heartbeat window, so a payment shows the instant you refocus.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Diffstat (limited to 'src/wallet.js')
| -rw-r--r-- | src/wallet.js | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/wallet.js b/src/wallet.js index 1c58de6..2417383 100644 --- a/src/wallet.js +++ b/src/wallet.js @@ -1520,7 +1520,15 @@ export class Wallet { this._wakeHooked = true; const wake = () => { if (this.offline || !this._wsWant) return; - if (!this._ws || this._ws.readyState !== 1) this._reconnectNow(); + // A backgrounded mobile page often leaves the socket HALF-OPEN: the OS + // killed the TCP connection but the frozen JS runtime never got onclose, + // so readyState still reads 1 (OPEN). Don't trust it — if the socket has + // been silent past the heartbeat window it's dead, so force a reconnect + // rather than firing scan RPCs into the void and waiting ~20s for the + // heartbeat to notice. A healthy foreground socket pings every 10s, so + // _lastMsg stays fresh and this never churns a live connection. + const stale = Date.now() - (this._lastMsg || 0) > 15000; + if (!this._ws || this._ws.readyState !== 1 || stale) this._reconnectNow(); this.scan({ silent: true }).catch(() => {}); }; document.addEventListener('visibilitychange', () => { |
