fix(lnd): retry channel opens during LND startup + calm non-red notice

LND's RPC answers before its p2p server finishes loading, so connect/open
during that window failed red with the raw "server is still in the
process of starting". Now: quiet ~30s retry first; if still starting, a
calm amber "still finishing its startup" notice instead of an error.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-07-22 17:31:47 -04:00
co-authored by Claude Fable 5
parent 97464779d4
commit 088b3e255a
2 changed files with 69 additions and 13 deletions
@@ -245,8 +245,18 @@
</div>
</div>
<div v-if="openError" class="mt-3 alert-error">
<p class="text-xs">{{ openError }}</p>
<!-- "Still starting" is a wait-a-moment notice, not a failure show
it as calm amber info instead of the red error treatment. -->
<div
v-if="openError"
class="mt-3"
:class="isStartupNotice(openError)
? 'p-3 rounded-lg border border-amber-400/25 bg-amber-500/10 text-amber-200/90'
: 'alert-error'"
>
<p class="text-xs">
<span v-if="isStartupNotice(openError)" class="mr-1"></span>{{ openError }}
</p>
</div>
<div class="flex gap-3 mt-6">
@@ -356,6 +366,14 @@ const openForm = ref(defaultOpenForm())
const openingChannel = ref(false)
const openError = ref<string | null>(null)
/** LND's transient post-unlock state ("still finishing its startup") is a
* wait-a-moment notice, not a failure — the template styles it amber. */
function isStartupNotice(msg: string | null): boolean {
if (!msg) return false
const m = msg.toLowerCase()
return m.includes('still finishing its startup') || m.includes('in the process of starting')
}
const closeTarget = ref<Channel | null>(null)
const closingChannel = ref(false)
const closeError = ref<string | null>(null)