Files
buzz/mobile/lib/shared
Meli e3a3247b13 Answer a rate-limited EVENT with OK false and retry it once the gate clears
The first message after a community switch (or a cold launch) spun for
25s, failed with "Timed out while sending the message", then worked on
the second try. The relay's WS admission window (50 frames / 5s per
pubkey) counts REQ and EVENT together, and the post-(re)connect REQ
fan-out alone can exhaust it. An over-quota REQ already got a correlated
`CLOSED <subId> rate-limited:`, but an over-quota EVENT got a bare
`NOTICE rate-limited:` — nothing ever settled the publisher's pending
OK, so it sat until PUBLISH_TIMEOUT_MS.

Relay (`connection.rs`): replace the `Option<sub_id>` passed into
`request_rejection_message` with a `RejectionTarget` so an EVENT refused
by admission or the handler semaphore is answered with
`["OK", <id>, false, "rate-limited: …"]`. REQ keeps CLOSED; COUNT keeps
NOTICE. The `rate-limited:` prefix and `retry in Ns` hint are unchanged
so every client's existing parser still applies.

Desktop (`relayClientSession.ts`): on `OK false rate-limited:` arm the
gate and re-send the EVENT once it clears instead of rejecting the
publish — the relay dedups by id, so the resend cannot double-post.
Exactly one retry per publish; a second refusal, or a gate longer than
the publish timeout, fails fast with the relay's reason. The NOTICE
branch gives in-flight publishes the same single retry so the fix also
holds against relays that predate this change.

buzz-acp (`relay.rs`): an `OK false rate-limited:` used to fall through
to `acknowledge_observer_frame`, silently dropping the refused observer
frame from the in-flight window. Arm the gate and put that one frame
back at the head of the paced drain instead.

Mobile (`relay_session.dart`): an `OK false rate-limited:` now arms the
gate before failing the publish, so concurrent work backs off.

Tests: relay frame-shape unit test; desktop fail-first unit tests for
the retry, its bound, non-rate-limit rejection, legacy NOTICE, and a
reset during the wait; acp requeue-only-the-refused-frame; mobile
gate-armed-on-OK-false (verified failing before the lib change).

Co-authored-by: Meli <5aaa86bce934fc3445fc254aab560a40923f10252f92107e665073dede0e04d3@buzz.block.builderlab.xyz>
Signed-off-by: Meli <5aaa86bce934fc3445fc254aab560a40923f10252f92107e665073dede0e04d3@buzz.block.builderlab.xyz>
2026-08-22 20:44:46 -04:00
..
2026-08-22 05:28:16 -07:00