axum_adapter.rs 808 B

123456789101112131415161718192021222324
  1. use crate::{LiveViewError, LiveViewSocket};
  2. use axum::extract::ws::{Message, WebSocket};
  3. use futures_util::{SinkExt, StreamExt};
  4. /// Convert an Axum WebSocket into a `LiveViewSocket`.
  5. ///
  6. /// This is required to launch a LiveView app using the Axum web framework.
  7. pub fn axum_socket(ws: WebSocket) -> impl LiveViewSocket {
  8. ws.map(transform_rx)
  9. .with(transform_tx)
  10. .sink_map_err(|_| LiveViewError::SendingFailed)
  11. }
  12. fn transform_rx(message: Result<Message, axum::Error>) -> Result<Vec<u8>, LiveViewError> {
  13. message
  14. .map_err(|_| LiveViewError::SendingFailed)?
  15. .into_text()
  16. .map(|s| s.into_bytes())
  17. .map_err(|_| LiveViewError::SendingFailed)
  18. }
  19. async fn transform_tx(message: Vec<u8>) -> Result<Message, axum::Error> {
  20. Ok(Message::Binary(message))
  21. }