#rustls #tls #async #anysc

anysc-rustls

crate-level shim layer for any {async crate}-rustls

2 releases

Uses new Rust 2024

0.1.1 Sep 12, 2025
0.1.0 Aug 13, 2025

#934 in Asynchronous

Download history 22/week @ 2025-11-13 32/week @ 2025-11-20 114/week @ 2025-11-27 244/week @ 2025-12-04 43/week @ 2025-12-11 93/week @ 2025-12-18 27/week @ 2025-12-25 4/week @ 2026-01-01 2/week @ 2026-01-15 15/week @ 2026-01-22 104/week @ 2026-01-29 62/week @ 2026-02-05 43/week @ 2026-02-12 259/week @ 2026-02-19 14/week @ 2026-02-26

380 downloads per month
Used in ohkami

MIT license

10KB

anysc-rustls

crate-level shim layer for any {async crate}-rustls


Usage

See the next section for details.

  1. Add to dependencies:

    [dependencies]
    # ...
    anysc-rustls = { version = "0.1", optional = true }
    
  2. Activate one of io_* feature flags:

  3. Depending on the use case, enable some inheritied features:

    • aws-lc-rs
    • aws_lc_rs
    • early-data
    • fips
    • logging
    • ring
    • tls12
  4. Write your code with anysc-rustls as with {tokio, futures}-rustls.


What this does?

Just reexporting all the items of one of

based on the io_* feature flag selected.

The point is that this is a crate: it enables, for some (maybe niche) crates that

  • support multiple async runtimes over different async IO interfaces (tokio::io, futures::io)
  • AND optionally provide rustls-powered TLS functionality behind a feature flag (like tls)

, to switch {async crate}-rustls dependencies without any needless dependencies.

Problem

That's impossible by other way: if simply having a submodule reexporting tokio-rustls and futures-rustls conditionally with respective feature flags (like tokio-io, futures-io), indeed it works, but the crate's [dependencies] will be like

[dependencies]
tokio-rustls = { optional = true, version = ... }
futures-rustls = { optional = true, version = ... }

[features]
tokio-io = ...
futures-io = ...
tls = ...

Here, how we setup the features?

  1. tokio-io = if "tls" ["dep:tokio-rustls"] + futures-io = if "tls" ["dep:futures-tls"]

    impossible.

  2. tls = if "tokio-io" ["dep:tokio-rustls"] else if "futures-io" ["dep:futures-tls"]

    impossible.

  3. tls = ["dep:tokio-rustls", "dep:futures-rustls"]

    works, but one of them must be needless.

So it's impossible to avoid undesired dependencies in this way.

Solution

However, it's enabled by a crate-level shim layer as this crate:

[dependencies]
anysc-rustls = { version = "0.1", optional = true }

[features]
tls = ["dep:anysc-rustls"]
tokio-io = ["anysc-rustls?/io_tokio", ...]
futures-io = ["anysc-rustls?/io_futures", ...]

Yes, that's done by the <crate>?/<feature> syntax!

Dependencies

~0–27MB
~535K SLoC