Release v0.7.0
This is release includes a significant BREAKING CHANGE to the stream interface.
Previously, Close()
closed streams for writing, but left them open for reading. Unfortunately, this meant streams would not be garbage collected until either (a) an EOF had been read on the stream or (b) Reset
had been called. While technically documented, this behavior was extraordinarily surprising and most libp2p applications end up misusing and leaking streams (leading to memory leaks).
A CloseRead
function has been introduced to close a stream for reading only (writing is still allowed).
- Any in-progress
Read
calls will be interrupted with a non-EOF error. - No further calls to
Read
will succeed. - The handling of new incoming data on the stream after calling close is implementation defined. Currently,
- Yamux and Mplex will throw away incoming data on a closed stream.
- QUIC will return an error to the sender.
Close
now closes the stream for both reading and writing. Close
is equivalent to calling CloseRead
and CloseWrite
. Importantly, Close
will not wait for any form of acknowledgment. If acknowledgment is required, the caller must call CloseWrite
, then wait on the stream for a response (or an EOF), then call Close()
to free the stream object.
When done with a stream, the user must call either Close()
or Reset()
to discard the stream, even after calling CloseRead()
and/or CloseWrite()
.