pub struct RestDemand { /* private fields */ }Expand description
DemandGateway over api.github.com.
Holds no credential of its own: authentication is entirely
AuthenticatedClient’s, and this type only ever hands it an
ApiRequest.
§Why this is not a method on c3’s RestInventory
It would be the better shape, and it is not available. RestInventory::get
— the one place cancellation, request accounting and the rate-limit gate meet
— is private to crates/github/src/rest.rs, and a sibling module cannot
reach a private item. Making it pub(crate) is an edit to c3’s file, which
this task does not own, so the choice was between duplicating c3’s whole
rate-limit policy here and consuming what c3 already exports. This
consumes.
§What “consuming c3’s rate-limit policy” means precisely
RateLimited::detect is c3’s decision procedure for whether a failure is
a rate limit and which of GitHub’s two it is, including the part that keeps a
permissions 403 landing on an exhausted quota from being misreported as
one. It is public, and this module calls it rather than re-deciding.
What this module deliberately does not copy is c3’s in-gateway
back-off latch, the window during which RestInventory opens no socket at
all. A second latch would be a second, quietly divergent copy of a policy
that only works if there is one of it. The scheduling floor is
crate::rest::RefreshState::retry_delay, which c3 documents as “the
absolute floor on when e1 may try again” — an e1 honouring it stops
demand polling for the same window, from the layer that owns the schedule.
The residual gap is stated rather than hidden: a rate limit whose first
evidence arrives on a demand request does not silence RestInventory, and
vice versa. Both report InventoryError::RateLimited to e1, which is the
layer that can act on either.
Implementations§
Source§impl RestDemand
impl RestDemand
pub fn new(client: Arc<AuthenticatedClient>, clock: Arc<dyn Clock>) -> Self
Sourcepub fn requests_issued(&self) -> u64
pub fn requests_issued(&self) -> u64
How many HTTP requests this gateway has issued.
demand_requests_per_poll projects a cost and this measures it. A
projection nothing measures is a table in a document, which is why c3
exposes the same counter and why the tests below assert one against the
other.
Trait Implementations§
Source§impl Debug for RestDemand
impl Debug for RestDemand
Source§impl DemandGateway for RestDemand
impl DemandGateway for RestDemand
Source§fn queued_demand<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 ActivityScope,
cancel: &'life2 CancelToken,
) -> Pin<Box<dyn Future<Output = Result<QueuedDemand, InventoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn queued_demand<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
scope: &'life1 ActivityScope,
cancel: &'life2 CancelToken,
) -> Pin<Box<dyn Future<Output = Result<QueuedDemand, InventoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
scope. Read more