#websocket #network #stream #async

nightly lightws

Lightweight websocket implement for stream transmission

21 releases

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

#1397 in Network programming

Download history 79/week @ 2023-08-14 14/week @ 2023-08-21 95/week @ 2023-08-28 70/week @ 2023-09-04 139/week @ 2023-09-11 18/week @ 2023-09-18 55/week @ 2023-09-25 17/week @ 2023-10-02 18/week @ 2023-10-09 23/week @ 2023-10-16 31/week @ 2023-10-23 58/week @ 2023-10-30 49/week @ 2023-11-06 58/week @ 2023-11-13 54/week @ 2023-11-20 89/week @ 2023-11-27

255 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.9–2.1MB
~38K SLoC