mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 16:14:40 +00:00
Every account-level loader is a PerUserEoseManager, which opens one subscription per user. With four accounts open that multiplies, and shared relays run out of room: nos.lol (strfry, `max_subscriptions: 20`) answered `ERROR: too many concurrent REQs` — 0 times before this branch, 7 with three accounts subscribed, 13 with four. The refusal arrives as a NOTICE, which carries no subscription id and never reaches RelayReqRefusals (wired only to CLOSED), and "too many concurrent REQs" matches none of its markers. So the relay drops those REQs while we still believe they are live: they never EOSE and never deliver. Notifications are `#p`-scoped, so a relay serving several accounts can be asked about all of them in one filter naming every pubkey — same query, wider tag. The manager moves to SingleSubEoseManager: one REQ per relay instead of one per (account, relay), with the `since` floor taken per relay as the OLDEST of the participating accounts' floors so widening for one can never cut another short. Gift wraps deliberately do NOT merge. They are unsolicited and opaque to the relay, so it cannot rate-limit them per recipient; a merged query would let one spammed account eat the shared `limit` and starve every other account's DMs. Each account keeps its own budget there. A merged filter serves several accounts, so accountPubKey becomes accountPubKeys. The subscriptions screen shows such a filter under each account it serves — "why is this relay busy for me" has to be answerable per account — which makes the per-account counts a breakdown of a shared filter rather than a partition of the total. attributedFilters is that sum, and is what a card's share is drawn against now; dividing by the wire total would read as 100% for each of two accounts sharing one filter. Measured, and it is only part of the answer: nos.lol carries 24-26 subscriptions against its cap of 20, and this removes 3 of them. The rest are the other per-account managers — account metadata alone is 7 filters in a subscription per account, and gift wraps another. Merging metadata (it is `authors`-keyed and merges the same way) is the next lever; this commit does not get us under the cap on its own. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>