RequestContext

Struct RequestContext 

Source
pub struct RequestContext { /* private fields */ }
Expand description

Context provided to each RPC and subscription handler.

RequestContext provides access to connection metadata and three tiers of extensions:

  • Server extensions: Shared across all connections
  • Connection extensions: Scoped to a single connection
  • Request extensions: Unique per request

Additionally, handlers can monitor for graceful shutdown notifications to cleanly exit loops, flush pending data, and release resources.

This allows handlers to access shared resources (like database pools), connection-specific state (like authentication sessions), and request-specific data (like trace IDs).

Implementations§

Source§

impl RequestContext

Source

pub fn new( connection: Connection, endpoint: Endpoint, service: String, resource: String, server_extensions: Extensions, connection_extensions: Extensions, shutdown_signal: Arc<Notify>, ) -> Self

Create a new RequestContext.

This is typically called by the connection handler for each incoming request.

Source

pub fn connection(&self) -> &Connection

Get a reference to the underlying Iroh connection.

Source

pub fn connection_type(&self) -> Option<impl Watcher + use<>>

Get a watcher for the connection type (direct vs relay).

The returned watcher provides real-time monitoring of how this connection is routed:

  • Direct - Direct UDP connection to peer
  • Relay - Routed through a relay server
  • Mixed - Both paths available
  • None - No path available

Use this for adaptive behavior, monitoring, and debugging connectivity issues.

§Example
use iroh::Watcher;

// Get current connection type
if let Some(mut watcher) = ctx.connection_type() {
    let conn_type = watcher.get();
    log::info!("Connection type: {:?}", conn_type);
}

// Monitor for changes
if let Some(watcher) = ctx.connection_type() {
    use futures::StreamExt;
    let mut stream = watcher.stream();
    while let Some(conn_type) = stream.next().await {
        log::info!("Connection type changed: {:?}", conn_type);
    }
}
Source

pub fn remote_id(&self) -> PublicKey

Get the remote peer’s PublicKey.

Source

pub fn service(&self) -> &str

Get the service name for this request.

Source

pub fn resource(&self) -> &str

Get the resource name for this request.

Source

pub fn server_extensions(&self) -> &Extensions

Get server-level extensions (shared across all connections).

Use this to access resources like database pools, configuration, etc.

Source

pub fn connection_extensions(&self) -> &Extensions

Get connection-level extensions (scoped to this connection).

Use this to access connection-specific state like authentication sessions.

Source

pub fn extensions(&self) -> &Extensions

Get request-level extensions (unique to this request).

Use this to access request-specific data like trace IDs, request timing, etc.

Source

pub fn with_extension<T: Send + Sync + 'static>(self, value: T) -> Self

Add a request-level extension, returning a new RequestContext.

This is useful for adding request-specific data like trace IDs.

Source

pub async fn shutdown_notified(&self)

Wait for shutdown notification (async).

Use this in tokio::select! to react to graceful shutdown:

loop {
    tokio::select! {
        _ = interval.tick() => {
            // Normal operation
        }
        _ = ctx.shutdown_notified() => {
            log::info!("Shutdown detected, exiting cleanly");
            break;
        }
    }
}
Source

pub fn connection_rtt(&self) -> Duration

Get the current round-trip time (RTT) estimate for this connection.

This provides the current best estimate of the connection’s latency. Useful for adaptive behavior, monitoring, and debugging.

§Example
let rtt = ctx.connection_rtt();
if rtt > Duration::from_millis(100) {
    log::warn!("High latency detected: {:?}", rtt);
}
Source

pub fn connection_stats(&self) -> ConnectionStats

Get detailed statistics for this connection.

Returns comprehensive metrics including:

  • UDP statistics (packets sent/received, bytes transferred)
  • Path statistics (congestion window, RTT variance)
  • Frame statistics (sent/received frame counts by type)

Useful for monitoring, debugging, and performance analysis.

§Example
let stats = ctx.connection_stats();
log::info!(
    "Connection stats - RTT: {:?}, sent: {} bytes, lost: {} packets",
    stats.path.rtt,
    stats.udp.datagrams_sent,
    stats.path.lost_packets
);

Trait Implementations§

Source§

impl Clone for RequestContext

Source§

fn clone(&self) -> RequestContext

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 RequestContext

Source§

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

Formats the value using the given formatter. Read more

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> CompatExt for T

Source§

fn compat(self) -> Compat<T>

Applies the Compat adapter by value. Read more
Source§

fn compat_ref(&self) -> Compat<&T>

Applies the Compat adapter by shared reference. Read more
Source§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the Compat adapter by mutable reference. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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