websocketz 0.2.0

A zerocopy websockets implementation for no_std environments.
Documentation
//! A collection of examples to be used in the documentation.

mod lib {

    #[tokio::test]
    #[ignore = "Example"]
    async fn client() {
        use crate::mock::Noop;
        use crate::{Message, WebSocket, http::Header, next, options::ConnectOptions};

        // An already connected stream.
        // Impl embedded_io_async Read + Write.
        let stream = Noop;

        let read_buffer = &mut [0u8; 1024];
        let write_buffer = &mut [0u8; 1024];
        let fragments_buffer = &mut [0u8; 1024];

        // Impl rand_core RngCore.
        let rng = Noop;

        // Perform a WebSocket handshake as a client.
        // 16 is the max number of headers to allocate space for.
        let mut websocketz = WebSocket::connect::<16>(
            // Set the connection options.
            // The path for the WebSocket endpoint as well as any additional HTTP headers.
            ConnectOptions::default()
                .with_path("/ws")
                .expect("Valid path")
                .with_headers(&[
                    Header {
                        name: "Host",
                        value: b"example.com",
                    },
                    Header {
                        name: "User-Agent",
                        value: b"WebSocketz",
                    },
                ]),
            stream,
            rng,
            read_buffer,
            write_buffer,
            fragments_buffer,
        )
        .await
        .expect("Handshake failed");

        // Send a text message.
        websocketz
            .send(Message::Text("Hello, WebSocket!"))
            .await
            .expect("Failed to send message");

        // Receive messages in a loop.
        loop {
            match next!(websocketz) {
                None => {
                    // Connection closed.
                    break;
                }
                Some(Ok(msg)) => {
                    // Handle received message.
                    let _ = msg;
                }
                Some(Err(err)) => {
                    // Handle error.
                    let _ = err;

                    break;
                }
            }
        }
    }

    #[tokio::test]
    #[ignore = "Example"]
    async fn server() {
        use crate::mock::Noop;
        use crate::{Message, WebSocket, http::Header, next, options::AcceptOptions};

        // An already connected stream.
        // Impl embedded_io_async Read + Write.
        let stream = Noop;

        let read_buffer = &mut [0u8; 1024];
        let write_buffer = &mut [0u8; 1024];
        let fragments_buffer = &mut [0u8; 1024];

        // Impl rand_core RngCore.
        let rng: Noop = Noop;

        // Perform a WebSocket handshake as a server.
        // 16 is the max number of headers to allocate space for.
        let mut websocketz = WebSocket::accept::<16>(
            // Set the acceptance options.
            // Any additional HTTP headers.
            AcceptOptions::default().with_headers(&[Header {
                name: "Server",
                value: b"WebSocketz",
            }]),
            stream,
            rng,
            read_buffer,
            write_buffer,
            fragments_buffer,
        )
        .await
        .expect("Handshake failed");

        // Receive messages in a loop.
        loop {
            match next!(websocketz) {
                None => {
                    // Connection closed.
                    break;
                }
                Some(Ok(msg)) => {
                    // Handle received message.
                    let _ = msg;

                    // Send a binary message.
                    if let Err(err) = websocketz.send(Message::Binary(b"Hello, WebSocket!")).await {
                        let _ = err;

                        break;
                    }
                }
                Some(Err(err)) => {
                    // Handle error.
                    let _ = err;

                    break;
                }
            }
        }
    }

    #[tokio::test]
    #[ignore = "Example"]
    async fn next_macro() {
        use crate::mock::Noop;
        use crate::{WebSocket, next, options::ConnectOptions};

        let stream = Noop;
        let read_buffer = &mut [0u8; 1024];
        let write_buffer = &mut [0u8; 1024];
        let fragments_buffer = &mut [0u8; 1024];
        let rng = Noop;

        let websocketz = WebSocket::connect::<16>(
            ConnectOptions::default()
                .with_path("/ws")
                .expect("Valid path"),
            stream,
            rng,
            read_buffer,
            write_buffer,
            fragments_buffer,
        )
        .await
        .expect("Handshake failed");

        let existing_websocket = || websocketz;

        let mut websocketz = existing_websocket();

        while let Some(Ok(msg)) = next!(websocketz) {
            // Messages hold references to the websocket buffers.
            let _ = msg;
        }
    }

    #[tokio::test]
    #[ignore = "Example"]
    async fn send_method_no_compile() {
        use crate::mock::Noop;
        use crate::{WebSocket, next, options::ConnectOptions};

        let stream = Noop;
        let read_buffer = &mut [0u8; 1024];
        let write_buffer = &mut [0u8; 1024];
        let fragments_buffer = &mut [0u8; 1024];
        let rng = Noop;

        let websocketz = WebSocket::connect::<16>(
            ConnectOptions::default()
                .with_path("/ws")
                .expect("Valid path"),
            stream,
            rng,
            read_buffer,
            write_buffer,
            fragments_buffer,
        )
        .await
        .expect("Handshake failed");

        let existing_websocket = || websocketz;

        let mut websocketz = existing_websocket();

        while let Some(Ok(_msg)) = next!(websocketz) {
            // Messages hold references to the websocket buffers.
            // So this will not compile:
            // cannot borrow `websocketz` as mutable more than once at a time.
            // websocketz.send(msg).await.expect("Failed to send message");
        }
    }

    #[tokio::test]
    #[ignore = "Example"]
    async fn send_macro() {
        use crate::mock::Noop;
        use crate::{WebSocket, next, options::ConnectOptions, send};

        let stream = Noop;
        let read_buffer = &mut [0u8; 1024];
        let write_buffer = &mut [0u8; 1024];
        let fragments_buffer = &mut [0u8; 1024];
        let rng = Noop;

        let websocketz = WebSocket::connect::<16>(
            ConnectOptions::default()
                .with_path("/ws")
                .expect("Valid path"),
            stream,
            rng,
            read_buffer,
            write_buffer,
            fragments_buffer,
        )
        .await
        .expect("Handshake failed");

        let existing_websocket = || websocketz;

        let mut websocketz = existing_websocket();

        while let Some(Ok(msg)) = next!(websocketz) {
            send!(websocketz, msg).expect("Failed to send message");
        }
    }

    #[tokio::test]
    #[ignore = "Example"]
    async fn split() {
        use crate::mock::Noop;
        use crate::{Message, WebSocket, next, options::ConnectOptions};

        let stream = Noop;
        let read_buffer = &mut [0u8; 1024];
        let write_buffer = &mut [0u8; 1024];
        let fragments_buffer = &mut [0u8; 1024];
        let rng = Noop;

        let websocketz = WebSocket::connect::<16>(
            ConnectOptions::default()
                .with_path("/ws")
                .expect("Valid path"),
            stream,
            rng,
            read_buffer,
            write_buffer,
            fragments_buffer,
        )
        .await
        .expect("Handshake failed");

        let existing_websocket = || websocketz;

        fn split(_stream: Noop) -> (Noop, Noop) {
            // Let's assume we split the stream here.

            (Noop, Noop)
        }

        let websocketz = existing_websocket();

        let (mut websocketz_read, mut websocketz_write) = websocketz.split_with(split);

        websocketz_write
            .send(Message::Text("Hello, WebSocket!"))
            .await
            .expect("Failed to send message");

        while let Some(Ok(msg)) = next!(websocketz_read) {
            // `send` method works here,
            // because `websocketz_read` and `websocketz_write` do not hold the same references.
            websocketz_write
                .send(msg)
                .await
                .expect("Failed to send message");
        }
    }
}