Skip to main content

StatefulSocketBuilder

Struct StatefulSocketBuilder 

Source
pub struct StatefulSocketBuilder<S> { /* private fields */ }
Expand description

Route builder that carries shared state S with no body or query expectation.

Obtained from ServerMechanism::state. S must be Clone + Send + Sync + 'static. For mutable shared state, wrap it in Arc<Mutex<_>> or Arc<RwLock<_>> before passing it here. Finalise with onconnect / onconnect_sync.

Implementations§

Source§

impl<S: Clone + Send + Sync + 'static> StatefulSocketBuilder<S>

Source

pub fn json<T: DeserializeOwned + Send>(self) -> StatefulJsonSocketBuilder<T, S>

Adds a JSON body expectation, transitioning to StatefulJsonSocketBuilder.

Alternative ordering to .json::<T>().state(s) — both produce the same route. On each request the incoming JSON body is deserialised into T and a fresh clone of S is prepared; both are handed to the handler together as (state: S, body: T).

Allows .state(s).json::<T>() as an alternative ordering to .json::<T>().state(s).

Source

pub fn query<T: DeserializeOwned + Send>( self, ) -> StatefulQuerySocketBuilder<T, S>

Adds a query parameter expectation, transitioning to StatefulQuerySocketBuilder.

Alternative ordering to .query::<T>().state(s) — both produce the same route. On each request the URL query string is deserialised into T and a fresh clone of S is prepared; both are handed to the handler together as (state: S, query: T).

Allows .state(s).query::<T>() as an alternative ordering to .query::<T>().state(s).

Source

pub fn encryption<T>( self, key: SerializationKey, ) -> StatefulEncryptedBodyBuilder<T, S>

Adds an encrypted body expectation, transitioning to StatefulEncryptedBodyBuilder.

Alternative ordering to .encryption::<T>(key).state(s) — both produce the same route. On each request the raw body bytes are VEIL-decrypted using key before the handler runs; a wrong key or corrupt body returns 403 Forbidden without invoking the handler. The handler will receive (state: S, body: T) where T is always a trusted, fully-decrypted value.

Allows .state(s).encryption::<T>(key) as an alternative ordering to .encryption::<T>(key).state(s).

Source

pub fn encrypted_query<T>( self, key: SerializationKey, ) -> StatefulEncryptedQueryBuilder<T, S>

Adds an encrypted query expectation, transitioning to StatefulEncryptedQueryBuilder.

Alternative ordering to .encrypted_query::<T>(key).state(s) — both produce the same route. On each request the ?data=<base64url> query parameter is base64-decoded then VEIL-decrypted using key; a missing, malformed, or undecryptable payload returns 403 Forbidden without invoking the handler. The handler will receive (state: S, query: T) where T is always a trusted, fully-decrypted value.

Allows .state(s).encrypted_query::<T>(key) as an alternative ordering to .encrypted_query::<T>(key).state(s).

Source

pub fn onconnect<F, Fut, Re>(self, handler: F) -> SocketType
where F: Fn(S) -> Fut + Clone + Send + Sync + 'static, Fut: Future<Output = Result<Re, Rejection>> + Send, Re: Reply + Send,

Finalises this route with an async handler that receives only the shared state.

On each request a fresh clone of S is injected into the handler. No request body or query parameters are read. The handler must return Result<impl Reply, Rejection>.

Returns a SocketType ready to be passed to Server::mechanism.

Source

pub unsafe fn onconnect_sync<F, Re>(self, handler: F) -> SocketType
where F: Fn(S) -> Result<Re, Rejection> + Clone + Send + Sync + 'static, Re: Reply + Send + 'static,

Finalises this route with a synchronous handler that receives only the shared state.

On each request a fresh clone of S is passed to the handler. If S wraps a mutex or lock, contention across concurrent requests can stall the thread pool — ensure the lock is held only briefly. The closure may block but must complete quickly.

Returns a SocketType ready to be passed to Server::mechanism.

§Safety

Every incoming request spawns an independent task on Tokio’s blocking thread pool. The pool caps the number of live OS threads (default 512), but the queue of waiting tasks is unbounded — under a traffic surge, tasks accumulate without limit, consuming unbounded memory and causing severe latency spikes or OOM crashes before any queued task gets a chance to run. When the handler acquires a lock on S (e.g. Arc<Mutex<_>>), concurrent blocking tasks contending on the same lock can stall indefinitely, causing the thread pool queue to grow without bound and compounding the exhaustion risk. Additionally, any panic inside the handler is silently converted into a Rejection, masking runtime errors. Callers must ensure the handler completes quickly, that lock contention on S cannot produce indefinite stalls, and that adequate backpressure or rate limiting is applied externally.

Auto Trait Implementations§

§

impl<S> Freeze for StatefulSocketBuilder<S>
where S: Freeze,

§

impl<S> RefUnwindSafe for StatefulSocketBuilder<S>
where S: RefUnwindSafe,

§

impl<S> Send for StatefulSocketBuilder<S>
where S: Send,

§

impl<S> Sync for StatefulSocketBuilder<S>
where S: Sync,

§

impl<S> Unpin for StatefulSocketBuilder<S>
where S: Unpin,

§

impl<S> UnsafeUnpin for StatefulSocketBuilder<S>
where S: UnsafeUnpin,

§

impl<S> UnwindSafe for StatefulSocketBuilder<S>
where S: UnwindSafe,

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.

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> 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, 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