Skip to main content

DeviceLease

Struct DeviceLease 

Source
pub struct DeviceLease {
    pub kind: DeviceLeaseKind,
    pub max_concurrent: Option<u32>,
    pub refresh_secs: u32,
}
Expand description

Rate-limit lease contract for PrincipalKind::Device principals.

Carries the information distributed-ratelimit needs to implement the Device floor in PrincipalKindPolicy without re-deriving semantics.

§Refresh bound

refresh is the hardware-attestation renewal cadence and sets the upper bound on the rate-limit TTL floor for this device. It must not exceed 3 600 seconds (1 h), consistent with the Agent credential hard-cap in platform ADR 0012. The definitive value will be pinned when quorumauth#25 (Device/Agent attestation split) settles; until then callers should treat 3 600 s as the ceiling.

Fields§

§kind: DeviceLeaseKind

Whether to track this device as a connection gauge or a request counter.

§max_concurrent: Option<u32>

Maximum concurrent connections (Connection kind) or maximum burst requests per window (RequestStream kind). None means no device-specific cap; the extractor falls back to the global default.

§refresh_secs: u32

Hardware-attestation refresh cadence. Sets the upper bound on the rate-limit TTL floor. Must not exceed 3 600 s (see doc comment).

Implementations§

Source§

impl DeviceLease

Source

pub const MAX_REFRESH_SECS: u32 = 3_600

Maximum permitted refresh_secs value (1 h, matching platform ADR 0012 Agent credential hard-cap and acting as a proxy for the quorumauth#25 attestation cadence until that ADR settles).

Source

pub fn new( kind: DeviceLeaseKind, max_concurrent: Option<u32>, refresh_secs: u32, ) -> Self

Construct a DeviceLease, clamping refresh_secs to Self::MAX_REFRESH_SECS.

§Examples
use api_bones::{DeviceLease, DeviceLeaseKind};

// Connection-count gauge, max 10 simultaneous, 15-minute refresh.
let lease = DeviceLease::new(DeviceLeaseKind::Connection, Some(10), 900);
assert_eq!(lease.refresh_secs, 900);

// Refresh value is clamped to MAX_REFRESH_SECS (3 600 s).
let capped = DeviceLease::new(DeviceLeaseKind::RequestStream, None, 99_999);
assert_eq!(capped.refresh_secs, DeviceLease::MAX_REFRESH_SECS);

Trait Implementations§

Source§

impl Clone for DeviceLease

Source§

fn clone(&self) -> DeviceLease

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DeviceLease

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for DeviceLease

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for DeviceLease

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for DeviceLease

Source§

fn eq(&self, other: &DeviceLease) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for DeviceLease

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for DeviceLease

Source§

impl Eq for DeviceLease

Source§

impl StructuralPartialEq for DeviceLease

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,