#stream #async #networking #heap-allocation #io-stream

nightly lightws

Lightweight websocket implement for stream transmission

23 releases

0.6.10 Dec 9, 2023
0.6.8 Apr 27, 2023
0.6.7 Aug 30, 2022
0.6.6 Jul 25, 2022
0.2.0 Mar 27, 2022

#42 in WebSocket

Download history 394/week @ 2023-12-19 332/week @ 2023-12-26 21/week @ 2024-01-02 1/week @ 2024-01-09 33/week @ 2024-01-16 7/week @ 2024-01-23 9/week @ 2024-01-30 10/week @ 2024-02-13 320/week @ 2024-02-20 43/week @ 2024-02-27 16/week @ 2024-03-05 137/week @ 2024-03-12 23/week @ 2024-03-19 16/week @ 2024-03-26 141/week @ 2024-04-02

323 downloads per month
Used in 3 crates (via kaminari)

MIT license

150KB
3.5K SLoC

Lightws

Lightws Lightws Released API docs crates.io

Lightweight websocket implement for stream transmission.

Features

  • Avoid heap allocation.
  • Avoid buffering frame payload.
  • Use vectored-io if available.
  • Transparent Read/Write over the underlying IO source.

High-level API

[role, endpoint, stream]

Std:

{
    // handshake
    let stream = Endpoint<TcpStream, Client>::connect(tcp, buf, host, path)?;
    // read some data
    stream.read(&mut buf)?;
    // write some data
    stream.write(&buf)?;
}

Async:

{
    // handshake
    let stream = Endpoint<TcpStream, Client>::connect_async(tcp, buf, host, path).await?;
    // read some data
    stream.read(&mut buf).await?;
    // write some data
    stream.write(&buf).await?;
}

Low-level API

[frame, handshake]

Frame:

{
    // encode a frame head
    let head = FrameHead::new(...);
    let offset = unsafe {
        head.encode_unchecked(&mut buf);
    };

    // decode a frame head
    let (head, offset) = FrameHead::decode(&buf).unwrap();
}

Handshake:

{
    // make a client handshake request
    let request = Request::new(b"/ws", b"example.com", "sec-key..");
    let offset = request.encode(&mut buf).unwrap();

    // parse a server handshake response
    let mut custom_headers = HttpHeader::new_storage();
    let mut response = Response::new_storage(&mut custom_headers);
    let offset = response.decode(&buf).unwrap();
}

Dependencies

~0.8–2.1MB
~39K SLoC