Skip to main content

RequestIdAllocator

Struct RequestIdAllocator 

Source
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: u64

Implementations§

Source§

impl RequestIdAllocator

Source

pub fn new(role: Role) -> Self

Create a new allocator for the given role, starting at ID 0 or 1.

Source

pub fn allocate(&mut self) -> Result<VarInt, RequestIdError>

Allocate the next request ID.

Source

pub fn update_max(&mut self, new_max: u64) -> Result<(), RequestIdError>

Update the maximum allowed request ID (can only increase).

Source

pub fn validate_peer_id(&self, id: u64) -> Result<(), RequestIdError>

Validate a request ID the peer put on the wire.

Draft-17 Section 9.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::WrongParity carrying 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::ExceedsMax if the id is past the current MAX_REQUEST_ID. Draft-17 removed MAX_REQUEST_ID and RequestIdAllocator::new sets the ceiling to u64::MAX, so on this draft the check cannot fire for any id a varint can carry.
Source

pub fn is_blocked(&self) -> bool

Check if we are blocked (max_id is 0 or next_id > max_id).

Source

pub fn max_id(&self) -> u64

Get the current maximum request ID.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more