fix(channels): handle Discord API 429 rate-limit responses with retry#4746
Open
bug-ops wants to merge 1 commit into
Open
fix(channels): handle Discord API 429 rate-limit responses with retry#4746bug-ops wants to merge 1 commit into
bug-ops wants to merge 1 commit into
Conversation
Add `send_with_retry` helper in the Discord REST client that intercepts HTTP 429 responses, reads `Retry-After` from the response header or JSON body (clamped to 60 s), sleeps, and retries up to 3 times before surfacing the error. All three call sites — `send_message`, `edit_message`, and `trigger_typing` — now use this helper. A 30-second per-request timeout is applied via `RequestBuilder::timeout` to guard every external await including the final exhausted-retry request. Closes #4728
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
send_with_retryhelper tocrates/zeph-channels/src/discord/rest.rsthat intercepts HTTP 429 responses from the Discord APIRetry-Afterheader (float/int), falls back to JSON bodyretry_afterfield, clamps to 60 s maximumErrwithTOO_MANY_REQUESTSstatus after all retries exhaustedRequestBuilder::timeoutto guard all external awaits including the final exhausted-retry callsend_message,edit_message,trigger_typingTest plan
zeph-channelstests pass (cargo nextest run -p zeph-channels --features discord)send_with_retry_errors_when_retries_exhausted: mock returns 429 on all calls → assertErr(TOO_MANY_REQUESTS)Closes #4728