#stdout-stderr #file-descriptor #stderr #stdout #pipe #log

io-mux

Provide multiple file descriptors writing into one in-order pipe, tagged by the source of data (e.g. stdout/stderr)

10 stable releases

2.2.0 Jan 16, 2024
2.1.0 Jul 17, 2023
1.5.0 Jun 6, 2023
1.4.0 Nov 15, 2020
0.1.1 Feb 5, 2020

#165 in Command-line interface

Download history 34/week @ 2024-01-15 96/week @ 2024-02-26 9/week @ 2024-03-11 45/week @ 2024-04-01

54 downloads per month
Used in 2 crates

MIT/Apache

25KB
351 lines

io-mux

A Mux provides a single receive end and multiple send ends. Data sent to any of the send ends comes out the receive end, in order, tagged by the sender.

Each send end works as a file descriptor. For instance, with io-mux you can collect stdout and stderr from a process, and highlight any error output from stderr, while preserving the relative order of data across both stdout and stderr.

Note that reading provides no "EOF" indication; if no further data arrives, it will block forever. Avoid reading after the source of the data exits.

Documentation

async

If you enable the async feature, io-mux additionally provides an AsyncMux type, which allows processing data asynchronously.

You may want to use this with async-process or async-pidfd to concurrently wait on the exit of a process and the muxed output and error of that process. Until the process exits, call AsyncMux::read() to get the next bit of output, awaiting that concurrently with the exit of the process. Once the process exits and will thus produce no further output, call AsyncMux::read_nonblock until it returns None to drain the remaining output out of the mux.

Portability

io-mux uses UNIX sockets, so it only runs on UNIX platforms. Support for non-Linux platforms is experimental, and has a major caveat in its semantics; please see the documentation for more details.

Dependencies

~2–12MB
~122K SLoC