-
released this
2026-09-10 20:29:23 -05:00 | 416 commits to main since this releaseFixed
A Riot response whose body died mid-read walked straight past the retry.
RiotClient.getwrapped only thefetchcall in the block that retries transport failures, and read the body on the line after it.fetchresolves once the headers arrive and leaves the body streaming, so a connection dropped partway through the body rejects fromres.json()— outside the guard, and therefore out ofgetentirely, past five perfectly good retries.The two phases are distinguishable and only one was ever covered: undici raises
TypeError: fetch failedwhen the connection never came up, andTypeError: terminated(cause: read ECONNRESET, thrown fromFetch.onAborted) when it came up and then went away mid-body. Every crawl since the client was written has been exposed to the second.It surfaced on the window of 2026-09-10: one reset roughly four hours in threw past the crawl, and all six Riot artifacts recorded
terminatedagainst the same instant while the op.gg half — already finished at 02:01 — published its four classic files normally.The body read moves inside the guard, so a mid-body reset is retried with the same bounded backoff as any other transport fault. Replay is safe because everything
getissues is a GET.No data changes and nothing needs re-crawling — the artifacts the failed window skipped are rebuilt by the next one from the retained rows.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)