JetServer

Struct JetServer 

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

AT-Jet HTTP Server

A high-performance HTTP server optimized for Protobuf APIs.

§Example

use at_jet::prelude::*;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let server = JetServer::new()
        .route("/api/health", get(health_check))
        .with_cors()
        .with_compression()
        .with_tracing();

    server.serve("0.0.0.0:8080").await?;
    Ok(())
}

async fn health_check() -> &'static str {
    "OK"
}

Implementations§

Source§

impl JetServer

Source

pub fn new() -> Self

Create a new JetServer instance

Source

pub fn route(self, path: &str, method_router: MethodRouter) -> Self

Add a route to the server

§Example
use at_jet::prelude::*;

let server = JetServer::new()
    .route("/api/users", get(list_users).post(create_user))
    .route("/api/users/:id", get(get_user).delete(delete_user));
Source

pub fn merge(self, router: Router) -> Self

Merge another router into this server

Source

pub fn nest(self, path: &str, router: Router) -> Self

Nest a router under a path prefix

§Example
use at_jet::prelude::*;

let api_routes = Router::new()
    .route("/users", get(list_users))
    .route("/posts", get(list_posts));

let server = JetServer::new()
    .nest("/api/v1", api_routes);
Source

pub fn with_cors(self) -> Self

Enable CORS with permissive defaults (suitable for development)

This allows any origin, method, and header. For production, use with_cors_config() for fine-grained control.

§Example
let server = JetServer::new()
    .route("/api/users", get(list_users))
    .with_cors();  // Allow all origins (development only)
Source

pub fn with_cors_config(self, cors: CorsLayer) -> Self

Enable CORS with custom configuration (recommended for production)

§Example
use tower_http::cors::{CorsLayer, AllowOrigin};
use http::{HeaderValue, Method};

let cors = CorsLayer::new()
    .allow_origin([
        "https://app.example.com".parse::<HeaderValue>().unwrap(),
        "https://admin.example.com".parse::<HeaderValue>().unwrap(),
    ])
    .allow_methods([Method::GET, Method::POST, Method::PUT, Method::DELETE])
    .allow_headers([http::header::CONTENT_TYPE, http::header::AUTHORIZATION])
    .allow_credentials(true)
    .max_age(Duration::from_secs(3600));

let server = JetServer::new()
    .route("/api/users", get(list_users))
    .with_cors_config(cors);
Source

pub fn with_compression(self) -> Self

Enable response compression (gzip)

Source

pub fn with_tracing(self) -> Self

Enable request/response tracing

This adds detailed logging for HTTP requests including:

  • Request method, URI, and version
  • Response status code
  • Request duration

Requires a tracing subscriber to be initialized.

§Example
use tracing_subscriber::EnvFilter;

// Initialize tracing subscriber
tracing_subscriber::fmt()
    .with_env_filter(EnvFilter::from_default_env())
    .init();

let server = JetServer::new()
    .route("/api/users", get(list_users))
    .with_tracing();
Source

pub fn layer<L>(self, layer: L) -> Self
where L: Layer<Route> + Clone + Send + 'static, L::Service: Service<Request, Response = Response, Error = Infallible> + Clone + Send + 'static, <L::Service as Service<Request>>::Future: Send + 'static,

Add a custom middleware layer to the server

This method allows you to add any tower-compatible middleware layer.

§Example - Request Timeout
use std::time::Duration;
use tower_http::timeout::TimeoutLayer;

let server = JetServer::new()
    .route("/api/users", get(list_users))
    .layer(TimeoutLayer::new(Duration::from_secs(30)));
§Example - Custom Authentication Middleware
use axum::{middleware, http::Request, response::Response};

async fn auth_middleware<B>(
    request: Request<B>,
    next: axum::middleware::Next<B>,
) -> Response {
    // Check authentication here
    next.run(request).await
}

let server = JetServer::new()
    .route("/api/users", get(list_users))
    .layer(middleware::from_fn(auth_middleware));
Source

pub fn into_router(self) -> Router

Get the router for advanced customization

Source

pub async fn serve(self, addr: &str) -> Result<()>

Start the server

§Arguments
  • addr - Address to bind to (e.g., “0.0.0.0:8080”)
§Example
use at_jet::prelude::*;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let server = JetServer::new()
        .route("/health", get(|| async { "OK" }));

    server.serve("0.0.0.0:8080").await?;
    Ok(())
}

Trait Implementations§

Source§

impl Default for JetServer

Source§

fn default() -> Self

Returns the “default value” for a type. 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> 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
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,