APIBuilder

Struct APIBuilder 

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

An API server whose routes can be added and removed at runtime.

APIBuilder serves HTTP and gRPC on a given address, on a single port. gRPC is HTTP/2 with a distinct route naming convention, so both protocols share one router and one server. Route additions and removals are handled by subscribing to assertions/retractions of DynamicRoute in the DataspaceRegistry.

§Adding and removing routes

Any process that wants to dynamically register API routes can simply assert a DynamicRoute in the DataspaceRegistry. Retracting the assertion will remove the route, either when retracted manually or when the process owning the route assertions exits.

If the API server is restarted, it will re-register any routes that were previously asserted.

§Static handlers and services

In addition to dynamic routes, callers can register static HTTP handlers and gRPC services up-front via with_handler, with_optional_handler, and with_grpc_service. These form a base router that’s cloned on every rebuild and merged with the currently asserted dynamic routes. Static routes take precedence on conflicts: a dynamic route whose path and method overlap with a static route is skipped (with a warning) until the conflict clears.

HTTP and gRPC routes share one path space, so a gRPC route can, in principle, collide with an HTTP one. In practice, this should never occur because the structure of gRPC routes includes programmatic aspects (/<package>.<service>/<method>) that don’t collide with any typical HTTP routes registered by components.

§Assertions

See HttpServer for more information on available assertions. The server ID provided by APIBuilder to the underlying HttpServer will be privileged-api or unprivileged-api, depending on the configured endpoint type.

§Supervision

The API can’t be run directly: into_supervisor turns it into the Supervisor that runs it, which is then added to another supervisor like any other child.

Implementations§

Source§

impl APIBuilder

Source

pub fn new(endpoint_type: EndpointType, listen_address: ListenAddress) -> Self

Creates a new APIBuilder for the given endpoint type and listen address.

Source

pub fn with_handler<H>(self, handler: H) -> Self
where H: APIHandler,

Adds the given handler as a static HTTP handler.

The handler’s initial state and routes are merged into the base router. These routes are always served by the API regardless of which dynamic routes are currently asserted.

Source

pub fn with_optional_handler<H>(self, handler: Option<H>) -> Self
where H: APIHandler,

Adds the given optional handler as a static HTTP handler.

If handler is Some, its initial state and routes are merged into the base router. Otherwise the builder is returned unchanged.

Source

pub fn with_grpc_service<S>(self, svc: S) -> Self
where S: Service<Request<GrpcBody>, Response = Response<GrpcBody>, Error = Infallible> + NamedService + Clone + Send + Sync + 'static, S::Future: Send + 'static, S::Error: Into<Box<dyn Error + Send + Sync>> + Send,

Adds the given gRPC service as a static service on the base router.

Source

pub fn with_tls_config(self, config: ServerConfig) -> Self

Sets the TLS configuration for the server.

Source

pub fn with_self_signed_tls(self) -> Self

Sets the TLS configuration for the server based on a dynamically generated, self-signed certificate.

Source

pub fn try_with_self_signed_tls(self) -> Result<Self, GenericError>

Sets the TLS configuration for the server based on a dynamically generated, self-signed certificate.

§Errors

If the certificate cannot be generated, the TLS configuration cannot be built, or the resulting TLS configuration is not FIPS compliant, an error is returned.

Source§

impl APIBuilder

Source

pub fn into_supervisor(self) -> Supervisor

Converts this builder into a supervisor.

The supervisor is configured to run the underlying HTTP/gRPC server, as well as a worker to manage the dynamic route updates as routes are asserted and retracted.

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.

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

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Track for T

Source§

fn track_resources(self, token: ResourceGroupToken) -> Tracked<Self>

Instruments this type by attaching the given resource group token, returning a Tracked wrapper. Read more
Source§

fn in_current_resource_group(self) -> Tracked<Self>

Instruments this type by attaching the current resource group, returning a Tracked wrapper. 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