mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-05 19:28:25 +00:00
Follow-up to the Block Relay button, from a review of that change. Dismiss-before-block. The button called blockRelay() fire-and-forget and then dismissed every prompt from the relay. reportSignerErrors swallows a refused or timed-out signature (ManuallyUnauthorizedException, TimedOutException, CouldNotPerformException) with a log line and no toast, so rejecting the signer prompt closed the dialog, left the relay unblocked, and gave the user nothing to tell them so — and the prompts were in the dismissal set for good. The dismissal now runs from a callback that only fires after account.blockRelay() returns; leaving the prompt up is the feedback when it doesn't. This also shrinks the race window, since sendMyPublicAndPrivateOutbox consumes the kind-10006 into LocalCache synchronously before publishing. Non-atomic cache mutations. NOTIFYs are filed from the relay's socket coroutine while dismissals run from the UI, so addPaymentRequestIfNew's `value +=` read-modify-write could drop one of two concurrent edits, and dismissAllFrom read the pending set before updating it — a prompt arriving in between was removed without ever being recorded as dismissed. Both now go through update/getAndUpdate. Also avoids a copy on a hot path in BlockedRelayFilteringClient: every REQ, COUNT and publish went through filterKeys/minus whenever the block list was non-empty, allocating a full copy of the targets just to reproduce them unchanged. A blocked relay is by definition one the app has stopped aiming at, so it now checks whether any target is actually blocked before copying. This matters more now that blocking is one tap from the dialog rather than a trip to the settings screen, so non-empty block lists become the norm. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2GsUAheZmAXv6vk4m7m9T