• v0.29.1 e0fe88644e

    v0.29.1 — retry a Riot response whose body dies mid-read
    All checks were successful
    CI / gate (push) Successful in 55s
    CI / image (push) Successful in 46s
    Stable

    joeyr released this 2026-09-10 20:29:23 -05:00 | 416 commits to main since this release

    Fixed

    A Riot response whose body died mid-read walked straight past the retry.

    RiotClient.get wrapped only the fetch call in the block that retries transport failures, and read the body on the line after it. fetch resolves once the headers arrive and leaves the body streaming, so a connection dropped partway through the body rejects from res.json() — outside the guard, and therefore out of get entirely, past five perfectly good retries.

    The two phases are distinguishable and only one was ever covered: undici raises TypeError: fetch failed when the connection never came up, and TypeError: terminated (cause: read ECONNRESET, thrown from Fetch.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 terminated against 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 get issues 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