pub struct RequestIdAllocator {
role: Role,
next_id: u64,
max_id: u64,
}Expand description
Allocates and validates request IDs per the MoQT spec.
- Client: even IDs (0, 2, 4, …)
- Server: odd IDs (1, 3, 5, …)
- Default MAX_REQUEST_ID: 0 (no requests until increased)
- MAX_REQUEST_ID can only increase
Fields§
§role: Role§next_id: u64§max_id: u64Implementations§
Source§impl RequestIdAllocator
impl RequestIdAllocator
Sourcepub fn new(role: Role) -> Self
pub fn new(role: Role) -> Self
Create a new allocator for the given role, starting at ID 0 or 1.
Sourcepub fn allocate(&mut self) -> Result<VarInt, RequestIdError>
pub fn allocate(&mut self) -> Result<VarInt, RequestIdError>
Allocate the next request ID.
Sourcepub fn update_max(&mut self, new_max: u64) -> Result<(), RequestIdError>
pub fn update_max(&mut self, new_max: u64) -> Result<(), RequestIdError>
Update the maximum allowed request ID (can only increase).
Sourcepub fn validate_peer_id(&self, id: u64) -> Result<(), RequestIdError>
pub fn validate_peer_id(&self, id: u64) -> Result<(), RequestIdError>
Validate a request ID the peer put on the wire.
Draft-19 Section 10.1: “The client generates even numbered Request IDs, starting at 0, and the server generates odd numbered Request IDs, starting at 1.” The parity checked here is therefore the peer’s, the opposite of this allocator’s own — a client validates odd ids.
The same section makes a wrong bit fatal to the session: “If an
endpoint receives a Request ID where the least significant bit is
incorrect for the sender, or a duplicate Request ID, it MUST close the
session with INVALID_REQUEST_ID.” Only the first half is answered here.
Duplicate detection needs memory of every id the peer has already
spent, which this allocator does not keep and cannot keep without
taking &mut self; it lives on the endpoint instead.
The parity rule is also what makes one HashMap per request kind
enough for both directions: an id this endpoint allocates and an id the
peer allocates can never be equal, so a peer’s request cannot collide
with one of ours.
§Errors
RequestIdError::WrongParitycarrying the id and the peer’s role, so the message names the endpoint that broke the rule rather than the one that caught it.RequestIdError::ExceedsMaxif the id is past the current MAX_REQUEST_ID. Draft-17 removed MAX_REQUEST_ID and draft-19 keeps it gone, andRequestIdAllocator::newsets the ceiling tou64::MAX, so on this draft the check cannot fire for any id a varint can carry.
Sourcepub fn is_blocked(&self) -> bool
pub fn is_blocked(&self) -> bool
Check if we are blocked (max_id is 0 or next_id > max_id).