16 breaking releases

0.16.0 Mar 3, 2023
0.15.0 Nov 27, 2022
0.14.0 Nov 8, 2022
0.13.0 Jun 16, 2022
0.3.1 Mar 4, 2021

#2294 in Rust patterns

Download history 32/week @ 2024-01-04 77/week @ 2024-01-11 25/week @ 2024-01-18 24/week @ 2024-01-25 10/week @ 2024-02-01 22/week @ 2024-02-08 44/week @ 2024-02-15 145/week @ 2024-02-22 61/week @ 2024-02-29 55/week @ 2024-03-07 48/week @ 2024-03-14 49/week @ 2024-03-21 116/week @ 2024-03-28 52/week @ 2024-04-04 27/week @ 2024-04-11 16/week @ 2024-04-18

213 downloads per month
Used in 8 crates (7 directly)


51 lines


The Duplex trait: interactive streams

Github Actions CI Status crates.io page docs.rs docs

This crate defines the Duplex trait, for types that have logically independent input and output channels.

The Read and Write traits take their streams by &mut self and block, so they cannot be used on the same stream simultaneously. This crate provides and implements the HalfDuplex trait for any type which implements Duplex, Read, and Write.

The AsyncRead and AsyncWrite traits take their streams by &mut self but do not block, so they can be used on the same stream simultaneously, at least when they're connected to an endpoint which supports it. When the "futures-io" feature is enabled, this crate provides and implements the FullDuplex trait for any type which implements Duplex, AsyncRead, and AsyncWrite.

Tokio uses its own AsyncRead, and AsyncWrite. When the "tokio" feature is enabled, this crate also provides and implements TokioFullDuplex for any type which implements Duplex, tokio::io::AsyncRead, and tokio::io::AsyncWrite.

Normal Files are not duplex devices, because even though they support input and output, the input and output are not logically independent since they share a current-position pointer in the OS. Character devices are often unified with files in OS APIs, however they may represent duplex devices. So while File does not implement Duplex, CharDevice does.

The following are some notable types for which Duplex is implemented:

Type cfg Notes
char_device::CharDevice feature = char-device
socketpair::SocketpairStream feature = socketpair
ssh2::Stream feature = ssh2
ssh2::Channel feature = ssh2
serialport::TTYPort all(unix, feature = serialport) serialport dependencies
readwrite::ReadWrite feature = readwrite
duplexify::Duplexify feature = duplexify
socket2::Socket feature = socket2

Support for async-std and tokio in char-device and socketpair is temporarily disabled until those crates contain the needed implementations of the I/O safety traits.


~140K SLoC