axum-cometd 0.5.0

Framework for CometD server creation
Documentation
use crate::{
    error::HandlerResult,
    messages::{Advice, Message},
    LongPollingServiceContext,
};
use axum::{extract::State, http::HeaderMap, Json};
use std::sync::Arc;

pub(crate) async fn handshake(
    State(context): State<Arc<LongPollingServiceContext>>,
    headers: HeaderMap,
    Json([message]): Json<[Message; 1]>,
) -> HandlerResult<Json<[Message; 1]>> {
    tracing::info!("Got handshake request: `{message:?}`.");

    let Message {
        channel,
        id,
        minimum_version,
        ..
    } = message;

    if channel.as_deref() != Some("/meta/handshake") {
        Err(Message::session_unknown(id, channel, None).into())
    } else if minimum_version.as_deref() != Some("1.0") {
        Err(Message::wrong_minimum_version(id, minimum_version).into())
    } else {
        let client_id = context.register(headers).await;

        Ok(Json([Message {
            id,
            channel,
            successful: Some(true),
            client_id: Some(client_id),
            version: Some("1.0".into()),
            supported_connection_types: Some(vec!["long-polling".into()]),
            advice: Some(Advice::retry(
                context.consts().timeout_ms,
                context.consts().interval_ms,
            )),
            ..Default::default()
        }]))
    }
}