tokio-websockets
High performance, strict, tokio-util based WebSockets implementation.
Why use tokio-websockets?
- Built with tokio-util, intended to be used with tokio from the ground up
- Minimal dependencies: The base only requires:
tokio,tokio-util,bytes,futures-core,futures-sink- SHA1 backend, e.g.
sha1_smol(see Feature flags)
- Big selection of features to tailor dependencies to any project (see Feature flags)
- SIMD support: AVX512, AVX2, SSE2, NEON or AltiVec for frame (un)masking and accelerated UTF-8 validation
- Strict conformance with the WebSocket specification, passes the Autobahn test suite without relaxations by default
- TLS support
- Reusable TLS connectors
- Uses widely known crates from the ecosystem for types, for example
Urifromhttpin the client - Cheaply clonable messages due to
Bytesas payload storage - Tuned for performance (see the benchmarks)
Feature flags
Feature flags in tokio-websockets are added to allow tailoring it to your needs.
simdwill enable AVX2, SSE2 or NEON (on aarch64) accelerated masking and UTF-8 validation. Additionally enabling thenightlyfeature when using a nightly compiler will also enable AVX512, NEON (on 32-bit ARM) or AltiVec accelerated maskingclientenables a tiny client implementationserverenables a tiny server implementation
TLS is supported via any of the following feature flags:
native-tlsfor atokio-native-tlsbacked implementationrustls-webpki-rootsfor atokio-rustlsbacked implementation withwebpki-rootsrustls-native-rootsfor atokio-rustlsbacked implementation withrustls-native-certsrustls-platform-verifierfor atokio-rustlsbacked implementation withrustls-platform-verifierrustls-bring-your-own-connectorfor atokio-rustlsbacked implementation that requires you to create your ownConnector::Rustls- theConnector::newmethod will return a plain connector
The rustls-*-roots and rustls-platform-verifier features require a crypto provider for rustls. You can either enable the aws_lc_rs (optionally also FIPS-compliant via the fips feature) or ring features to use these crates as the providers and then use TlsConnector::new(), or bring your own with TlsConnector::new_rustls_with_crypto_provider().
One SHA1 implementation is required, usually provided by the TLS implementation:
ringoraws_lc_rsare used if theringoraws_lc_rsfeatures are enabled (recommended whenrustlsis used)- The
opensslfeature will useopenssl, usually preferred on most Linux/BSD systems withnative-tls - The
sha1_smolfeature can be used as a fallback if no TLS is needed
The client feature requires enabling one random number generator:
fastrandcan be used as aPRNGgetrandomcan be used as a cryptographically secure RNGrandcan be used as an alternative tofastrandand should be preferred if it is already in the dependency tree
Example
This is a simple WebSocket echo server without any proper error handling.
More examples can be found in the examples folder.
use ;
use Uri;
use TcpListener;
use ;
async
MSRV
The current MSRV for all feature combinations is Rust 1.79.
Caveats / Limitations / ToDo
WebSocket compression is currently unsupported.