From 9f4bc29025287e8e12a7ef31c9918c1adfdfff5d Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 26 Jun 2026 13:50:23 -0700 Subject: Fix broadcast hanging forever on a stalled response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Esplora broadcast cleared its abort timer right after fetch() resolved, so the subsequent res.text() body read had no timeout — a stalled response body hung the whole broadcast (and the send spinner) indefinitely, with the tx never reaching the network. Keep the abort timer active through the body read, and add a hard 30s outer timeout in the send handler so a wedged broadcast always surfaces as 'timed out — try again' instead of spinning forever. (The silent-payment tx itself is valid — verified structure + BIP143 signature over the real outputs.) Co-Authored-By: Claude Opus 4.8 (1M context) --- src/app.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/app.js') diff --git a/src/app.js b/src/app.js index d5452ec..cba23ba 100644 --- a/src/app.js +++ b/src/app.js @@ -2764,7 +2764,10 @@ async function broadcast() { render(); try { const hexTx = wallet.sign(ui.draft.tx); - const txid = await wallet.broadcast(hexTx); + const txid = await Promise.race([ + wallet.broadcast(hexTx), + new Promise((_, rej) => setTimeout(() => rej(new Error(t('broadcastTimeout'))), 30000)), + ]); ui.sendResult = { txid }; ui.draft = null; ui.send = blankSend(); -- cgit v1.2.3