NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1870 most downloaded on crates.io
Multiplexer over reliable, ordered connections
Last release 16 days ago
21 Sep 2026
Ships fairly regularly
a new release about every 3 months
Nearly every release is documented
notes for 48 of 49 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
51 releases · first in 2018
Fix a deadlock when a Stream is split and its two halves are driven by separate tasks. Both halves used to share a single channel handle to the connec
Fix a deadlock when a Stream is split and its two halves are driven by separate tasks. Both halves used to share a single channel handle to the connection, whose only waker slot the half polled last would overwrite, so the other half was never woken again. See #233.
Replace rand -based connection IDs and ping nonces with per-connection atomic counters. Removes rand from runtime dependencies. See PR 229 .
One column per quarter.
Fix panic when processing oversized inbound Data|SYN frames. See ac71745 and GHSA-vxx9-2994-q338 .
Fix panic when processing oversized inbound Data|SYN frames. See ac71745 and GHSA-vxx9-2994-q338.
Improve flow-control credit verification for window updates. See #221 .
Improve flow-control credit verification for window updates. See #221.
Introduce WriteState::Poisoned to avoid further reads after the returned number of bytes from a write operation is bigger than the header size. See #2
Introduce WriteState::Poisoned to avoid further reads after the returned number of bytes from a write operation is bigger than the header size. See #211.
Fix compilation on rust versions < 1.87.0. See #208 .
Fix compilation on rust versions < 1.87.0. See #208.
Fix panic on frame io when the returned number of bytes from a write operation is bigger than the header size. See #202 .
Fix panic on frame io when the returned number of bytes from a write operation is bigger than the header size. See #202.
Fix possible poisoned connection when closing. See #199 .
Fix possible poisoned connection when closing. See #199.
Fix sending pending frames after closing. See #194 .
Fix sending pending frames after closing. See #194.
Wake up readers after setting the state to RecvClosed to not miss EOF. See #190 .
See changelog for details.
See changelog for details.
Fix WASM support using instant::{Duration, Instant} instead of std::{Duration, Instant}. See PR 179.
instant::{Duration, Instant} instead of std::time::{Duration, Instant}.
See PR 179.Introduce dynamic stream receive window auto-tuning. While low-resourced deployments maintain the benefit of small buffers, high resource deployments
WindowUpdateMode.
Behavior will always be WindowUpdateMode::OnRead, thus enabling flow-control and enforcing backpressure.
See PR 178.Deprecate WindowUpdateMode::OnReceive. It does not enforce flow-control, i.e. breaks backpressure. Use WindowUpdateMode::OnRead instead. See PR #177.
WindowUpdateMode::OnReceive.
It does not enforce flow-control, i.e. breaks backpressure.
Use WindowUpdateMode::OnRead instead.
See PR #177.Remove Control and ControlledConnection. Users have to move to the poll_ functions of Connection. See PR #164.
Avoid race condition between pending frames and closing stream. See [PR 156].
Remove Connection::control in favor of Control::new. Remove Connection::next_stream in favor of Connection::poll_next_inbound. See [PR 142].
Connection::control in favor of Control::new.
Remove Connection::next_stream in favor of Connection::poll_next_inbound.
See PR 142.Process command or socket result immediately and thereby no longer accessing the socket after it returned an error. See [PR 138] for details.
Update parking_lot dependency. See [PR 126].
Nothing published for this version
Default to WindowUpdateMode::OnRead, thus enabling full Yamux flow-control, exercising back pressure on senders, preventing stream resets due to reach
Default to WindowUpdateMode::OnRead, thus enabling full Yamux flow-control,
exercising back pressure on senders, preventing stream resets due to reaching
the buffer limit.
See the WindowUpdateMode documentation for details, especially the section
on deadlocking when sending data larger than the receivers window.
Force-split larger frames, for better interleaving of reads and writes between different substreams and to avoid single, large writes. By default fram
Force-split larger frames, for better interleaving of
reads and writes between different substreams and to avoid
single, large writes. By default frames are capped at, and
thus split at, 16KiB, which can be adjusted by a new
configuration option, if necessary.
Send window updates earlier, when half of the window has been consumed, to minimise pauses due to transmission delays, particularly if there is just a single dominant substream.
Avoid possible premature stream resets of streams that have been properly closed and already dropped but receive window update or other frames while the remaining buffered frames are still sent out. Incoming frames for unknown streams are now ignored, instead of triggering a stream reset for the remote.
Avoid possible premature stream resets of streams that have been properly closed and already dropped but receive window update or other frames while t
Upgrade step 4 of 4. This version always assumes the new semantics and no longer sets the non-standard flag in intial window updates.
lazy_open is removed. Initial window updates
are sent automatically if the receive window is configured to be larger
than the default.Upgrade step 3 of 4. This version sets the non-standard flag, but irrespective of whether it is present or not, always assumes the new additive semant
Upgrade step 3 of 4. This version sets the non-standard flag, but irrespective of whether it is present or not, always assumes the new additive semantics of the intial window update.
Upgrade step 2 of 4. This version sets the non-standard flag, version 0.5.0 already recognises.
Upgrade step 2 of 4. This version sets the non-standard flag, version 0.5.0 already recognises.
This version begins the upgrade process spawning multiple versions that changes the meaning of the initial window update from *"This is the total size
This version begins the upgrade process spawning multiple versions that changes the meaning of the initial window update from "This is the total size of the receive window." to "This is the size of the receive window in addition to the default size." This is necessary for compatibility with other yamux implementations. See issue #92 for details.
As a first step, version 0.5.0 interprets a non-standard flag to imply the
new meaning. Future versions will set this flag and eventually the new
meaning will always be assumed. Upgrading from the current implemention to
the new semantics requires deployment of every intermediate version, each of
which is only compatible with its immediate predecessor. Alternatively, if
the default configuration together with lazy_open set to true is
deployed on all communicating endpoints, one can skip directly to the end
of the transition.
- Bugfixes (#93).
- Bugfixes (#91). - Improve documentation (#88).
- Bugfix release (#85).
Send RST frame if the window of a dropped stream is 0 and it is in state SendClosed (#84).
SendClosed (#84).Removed bytes (#77) and thiserror (#78) dependencies.
bytes (#77) and thiserror (#78) dependencies.BufWriter creation (#77). Client code that depends on
this (undocumented) behaviour needs to wrap the socket in a BufWriter
before passing it to Connection::new.Connection::is_closed flag (#80) to immediately return Ok(None)
from Connection::next_stream after Err(_) or Ok(None) have been
returned previously.Control and stream command channels are now closed and drained immediately on error. This is done to prevent client code from submitting further close
Connection::next_stream is that after None or an Err(_) is returned
it must not be called again.Updates nohash-hasher dependency to v0.2.0.
A new configuration option lazy_open (off by default) has been added and inbound streams are now acknowledged (#73). If lazy_open is set to true we wi
lazy_open (off by default) has been added and
inbound streams are now acknowledged (#73). If lazy_open is set to true
we will not immediately send an initial WindowUpdate frame but instead
just set the SYN flag on the first outbound Data frame.
See Configuration::set_lazy_open for details.Log connection reset errors on debug level (#72).
Hide StreamId::new and update dependencies.
StreamId::new and update dependencies.Update to use and work with async/await:
Update to use and work with async/await:
Config::set_max_pending_frames has been removed. Internal back-pressure
made the setting unnecessary. As another consequence the error
ConnectionError::TooManyPendingFrames has been removed.Connection no longer has methods to open a new stream or to close the
connection. Instead a separate handle type Control has been added which
allows these operations concurrently to the connection itself.StreamHandle I/O operation would drive the
Connection. Now, the only way the Connection makes progress is through
its next_stream method which must be called continuously. For convenience
a function into_stream has been added which turns the Connection into
a futures::stream::Stream impl, invoking next_stream in its poll_next
method.StreamHandle has been renamed to Stream and its methods credit and
state have been removed.Stream also implements futures::stream::Stream and produces Packets.ConnectionError::StreamNotFound has been removed. Incoming frames for
unknown streams are answered with a RESET frame, unless they finish the
stream.DecodeError has been renamed to FrameDecodeError and DecodeError::Type
corresponds to FramedDecodeError::Header which handles not just unknown
frame type errors, but more. Hence a new error HeaderDecodeError has been
added for those error cases.- Updated dependencies (#56).
Bugfix release (pull request #54).
Removed Connection::shutdown method which was deprecated since version 0.1.8.
max_pending_frames setting to Config. A Connection buffers outgoing
frames up to this limit (see pull request #51).ConnectionError::TooManyPendingFrames if max_pending_frames has been reached.Connection::close and Connection::flush from std::io::Error
to yamux::ConnectionError.Connection::shutdown method which was deprecated since version 0.1.8.Add read_after_close setting to Config which defaults to true to match the behaviour of previous versions. Setting read_after_close to false will caus
read_after_close setting to Config which defaults
to true to match the behaviour of previous versions.
Setting read_after_close to false will cause stream reads
to return with Ok(0) as soon as the connection is closed,
preventing them from reading data from their buffer.Mark Connection::shutdown as deprecated (#44).
Connection::shutdown as deprecated (#44).Support for half-closed streams (#38).
Bugfix release (pull requests #34 and #35).
Bugfix release (pull request #33).
Bugfix release (pull requests #30 and #31).
Bugfix release (pull requests #27 and #28).
Bugfix release. See pull request #26 for details.
Forward Stream::poll to the newly added Connection::poll method which accepts self as a shared reference. See pull request #24 for details.
Stream::poll to the newly added Connection::poll method which accepts self as a
shared reference. See pull request #24 for details.Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →