WebSocket

Volo-HTTP WebSocket

Volo-HTTP supports the WebSocket protocol

Write handler

Since Volo-HTTP’s built-in WebSocket type implements FromContext, we can add a WebSocket extractor directly to the handler.

The following is a simple example of a WebSocket handler that displays the received text message:

use volo_http::{
    response::ServerResponse,
    server::{
        route::get,
        utils::{Message, WebSocket, WebSocketUpgrade},
    },
    Router,
};

async fn handle_socket(mut socket: WebSocket) {
    while let Some(Ok(msg)) = socket.next().await {
        match msg {
            Message::Text(_) => {
                socket.send(msg).await.unwrap();
            }
            _ => {}
        }
    }
}

async fn ws_handler(ws: WebSocketUpgrade) -> ServerResponse {
    ws.on_upgrade(handle_socket)
}

async fn ws_router() -> Router {
    Router::new().route("/ws", get(ws_handler));
}

WebSocket Settings

Options for WebSocket such as transport configuration and protocol support can be configured via the Config structure.

Transport settings

See tokio_tungstenite::tungstenite::protocol::WebSocketConfig for details.

use tokio_tungstenite::tungstenite::protocol::WebSocketConfig as WebSocketTransConfig;
use volo_http::server::utils::WebSocketConfig;

let config = WebSocketConfig::new().set_transport(WebSocketTransConfig {
    write_buffer_size: 128 * 1024, 
    ..<_>::default()
});

Set supported protocols

use volo_http::server::utils::WebSocketConfig; 

let config = WebSocketConfig::new().set_protocols(["graphql-ws", "graphql-transport-ws"]);

Error Handling

When processing a WebSocket connection, various errors may be encountered, such as a connection upgrade failure. These errors can be handled by providing custom error handling callbacks.

use std::collections::HashMap;

use volo_http::{
    response::ServerResponse,
    server::utils::{WebSocket, WebSocketConfig, WebSocketUpgrade},
};

async fn ws_handler(ws: WebSocketUpgrade) -> ServerResponse {
    ws.on_failed_upgrade(|error| unimplemented!())
        .on_upgrade(|socket| async {}) 
}

Last modified December 9, 2024 : Update prerequisite.md (#1178) (b5e2299)