Skip to main content

X402Client

Struct X402Client 

Source
pub struct X402Client<TSelector> { /* private fields */ }
Available on crate feature client only.
Expand description

The main x402 client that orchestrates scheme clients and selection.

The X402Client acts as middleware for reqwest, automatically handling 402 Payment Required responses by extracting payment requirements, signing payments, and retrying requests.

Implementations§

Source§

impl X402Client<FirstMatch>

Source

pub fn new() -> Self

Creates a new X402Client with default settings.

The default client uses FirstMatch payment selection, which selects the first matching payment scheme.

Source§

impl<TSelector> X402Client<TSelector>

Source

pub fn register<S>(self, scheme: S) -> Self
where S: SchemeClient + 'static,

Registers a scheme client for specific chains or networks.

Scheme clients handle the actual payment signing for specific protocols. You can register multiple clients for different chains or schemes.

§Arguments
  • scheme - The scheme client implementation to register
§Returns

A new X402Client with the additional scheme registered.

Source

pub fn with_selector<P: PaymentSelector + 'static>( self, selector: P, ) -> X402Client<P>

Sets a custom payment selector.

By default, FirstMatch is used which selects the first matching scheme. You can implement custom selection logic by providing your own PaymentSelector.

Source

pub fn with_policy<P: PaymentPolicy + 'static>(self, policy: P) -> Self

Adds a payment policy to the filtering pipeline.

Policies are applied in registration order before the selector picks the final candidate. Use policies to restrict which networks, schemes, or amounts are acceptable.

Source

pub fn with_hook(self, hook: impl ClientHooks + 'static) -> Self

Adds a lifecycle hook for payment creation.

Hooks allow intercepting the payment creation pipeline for logging, custom validation, or error recovery. Multiple hooks are executed in registration order.

Source§

impl<TSelector> X402Client<TSelector>
where TSelector: PaymentSelector,

Source

pub async fn make_payment_headers( &self, res: Response, ) -> Result<HeaderMap, ClientError>

Creates payment headers from a 402 response.

This method extracts the payment requirements from the response, selects the best payment option, signs the payment, and returns the appropriate headers to include in the retry request.

§Arguments
  • res - The 402 Payment Required response
§Returns

A HeaderMap containing the payment signature header, or an error.

§Errors

Returns ClientError::ParseError if the response cannot be parsed. Returns ClientError::NoMatchingPaymentOption if no registered scheme can handle the payment requirements.

§Panics

Panics if the signed payload is not a valid HTTP header value.

Trait Implementations§

Source§

impl Default for X402Client<FirstMatch>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<TSelector> Middleware for X402Client<TSelector>
where TSelector: PaymentSelector + Send + Sync + 'static,

Source§

fn handle<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, req: Request, extensions: &'life1 mut Extensions, next: Next<'life2>, ) -> Pin<Box<dyn Future<Output = Result<Response>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait,

Handles a request, automatically handling 402 responses.

When a 402 response is received, this middleware:

  1. Extracts payment requirements from the response
  2. Signs a payment using registered scheme clients
  3. Retries the request with the payment header

If the request body is not cloneable (e.g. streaming), the middleware cannot auto-retry after a 402. In that case the original 402 response is returned as-is so the caller can handle it manually.

Auto Trait Implementations§

§

impl<TSelector> Freeze for X402Client<TSelector>
where TSelector: Freeze,

§

impl<TSelector> !RefUnwindSafe for X402Client<TSelector>

§

impl<TSelector> Send for X402Client<TSelector>
where TSelector: Send,

§

impl<TSelector> Sync for X402Client<TSelector>
where TSelector: Sync,

§

impl<TSelector> Unpin for X402Client<TSelector>
where TSelector: Unpin,

§

impl<TSelector> !UnwindSafe for X402Client<TSelector>

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