wist 0.1.6

Websocket Tunneling
Documentation
use crate::*;
use alloc::boxed::Box;
use core::convert::Infallible;

use wisp_mux::{
    WispError,
    ws::{Frame, LockedWebSocketWrite, OpCode, WebSocketRead, WebSocketWrite},
};
#[cfg(feature = "wisp-mux")]
trait SHTTP: HTTP<req(..): Send> {}
#[cfg(feature = "wisp-mux")]
impl<T: HTTP<req(..): Send>> SHTTP for T {}

#[async_trait::async_trait]
impl<H: SHTTP<Error: Into<WispError>> + Send> WebSocketRead for WsHandler<H> {
    async fn wisp_read_frame(
        &mut self,
        tx: &LockedWebSocketWrite,
    ) -> Result<Frame<'static>, WispError> {
        let r = self.recv().await.map_err(|a| a.into())?;
        Ok(match r {
            WsFrame::String(s) => Frame::text(wisp_mux::ws::Payload::Bytes(
                s.into_bytes().as_slice().into(),
            )),
            WsFrame::Bytes(items) => {
                Frame::binary(wisp_mux::ws::Payload::Bytes(items.as_slice().into()))
            }
            WsFrame::Close => Frame::close(wisp_mux::ws::Payload::Borrowed(&[])),
        })
    }
}
#[async_trait::async_trait]
impl<H: SHTTP<Error: Into<WispError>> + Send> WebSocketWrite for WsHandler<H> {
    async fn wisp_write_frame(&mut self, frame: Frame<'_>) -> Result<(), WispError> {
        self.send(match frame.opcode {
            OpCode::Text => {
                WsFrame::String(String::from_utf8_lossy(&frame.payload).as_ref().to_owned())
            }
            OpCode::Binary => WsFrame::Bytes(frame.payload.to_vec()),
            OpCode::Close => WsFrame::Close,
            _ => todo!(),
        });
        Ok(())
    }
    async fn wisp_close(&mut self) -> Result<(), WispError> {
        self.close().await.map_err(|a| a.into())
    }
}
#[async_trait::async_trait]
impl WebSocketRead for HTTPHandlerOnce {
    async fn wisp_read_frame(
        &mut self,
        tx: &LockedWebSocketWrite,
    ) -> Result<Frame<'static>, WispError> {
        let r = self.recv_frame().await;
        Ok(match r {
            WsFrame::String(s) => Frame::text(wisp_mux::ws::Payload::Bytes(
                s.into_bytes().as_slice().into(),
            )),
            WsFrame::Bytes(items) => {
                Frame::binary(wisp_mux::ws::Payload::Bytes(items.as_slice().into()))
            }
            WsFrame::Close => Frame::close(wisp_mux::ws::Payload::Borrowed(&[])),
        })
    }
}
#[async_trait::async_trait]
impl WebSocketWrite for HTTPHandlerOnce {
    async fn wisp_write_frame(&mut self, frame: Frame<'_>) -> Result<(), WispError> {
        self.send_frame(match frame.opcode {
            OpCode::Text => {
                WsFrame::String(String::from_utf8_lossy(&frame.payload).as_ref().to_owned())
            }
            OpCode::Binary => WsFrame::Bytes(frame.payload.to_vec()),
            OpCode::Close => WsFrame::Close,
            _ => todo!(),
        })
        .await;
        Ok(())
    }
    async fn wisp_close(&mut self) -> Result<(), WispError> {
        self.send_frame(WsFrame::Close).await;
        Ok(())
    }
}