Files
amethyst/quic
Claude 15a6bfcc84 feat(quic): step 6 of RFC 9002 retransmit — dispatch lost tokens to pending*
QuicConnection.onTokensLost(tokens) closes the loop between loss
detection (step 5) and writer drain (step 4). For each lost token:

  - Ack: ignored (RFC 9000 §13.2.1: ACK frames not retransmittable)
  - MaxStreamsUni: pendingMaxStreamsUni := token.maxStreams
    iff token.maxStreams == advertisedMaxStreamsUni
  - MaxStreamsBidi / MaxData: same shape, against their advertised cap
  - MaxStreamData: pendingMaxStreamData[streamId] := maxData iff
    stream exists AND token.maxData == stream.receiveLimit

The supersede check (`lost == advertised`) mirrors neqo's
`fc.rs::frame_lost` line 322. If a higher extension has gone out
since, the older lost frame is irrelevant — the newer value
covers the receiver's grant. Without the check we'd resurrect
stale extensions and waste wire bandwidth re-emitting values the
peer already has.

Wired into the parser's AckFrame handler immediately after
detectAndRemoveLost: walk each lost packet's tokens and call
onTokensLost. Caller already holds the connection lock.

Tests added (8, all pass):
  - ackToken_doesNotPopulateAnyPending
  - lostMaxStreamsUni_matchingAdvertised_setsPending
  - lostMaxStreamsUni_supersededByHigherEmit_isDropped (the
    supersede-check invariant from neqo's fc.rs:322)
  - lostMaxStreamsBidi_matchingAdvertised_setsPending
  - lostMaxData_matchingAdvertised_setsPending
  - lostMaxData_supersededIsDropped
  - lostMaxStreamData_unknownStream_dropped (defensive)
  - multipleLostTokens_dispatchAll (one packet's worth of mixed
    tokens dispatched in one call)
  - lostTokensFromMultiplePackets_unionInPending (sequential
    dispatch across multiple lost packets — older stale, newer
    valid; the valid one survives)

Mirror of neqo's `streams.rs::lost` dispatch + the
`no_max_allowed_frame_after_old_loss` and
`set_max_active_equal_does_not_set_frame_pending` tests from
`fc.rs` deferred from step 4 per the plan.

Full :quic test suite + nestsClient moq-lite tests pass.

https://claude.ai/code/session_01PYYez8a6sjiakyjAxsfCEQ
2026-05-04 22:55:34 +00:00
..