mirror of
https://github.com/libp2p/go-libp2p-core.git
synced 2024-12-26 23:30:27 +08:00
e4c76cf7cd
* add resource manager interfaces * add scope accessors to streams and conns * add ResourceManager accessor to the Network interface * allow initially unattached streams. * introduce service scopes, canonicalize ownership interface through setters * make system scope explicit * make memory stat an int64 * make the system scope a generic resource scope, introduce the DMZ * fix typo Co-authored-by: Marten Seemann <martenseemann@gmail.com> * fix typo Co-authored-by: Marten Seemann <martenseemann@gmail.com> * rename DMZ to transient scope, remove OpenConnection from PeerScope * remove ncopy param from GrowBuffer * remove protocols from OpenStream The stream is unnegotiated state until the actual protocol has been determined. * document nil receiver contract, fix protocol scope protocol accessor method * remove nil receiver contract requirement * flesh out stat struct * turn resource manager scope accessors into viewers * interface refiniments 1. Introduce transactions in all scopes 2. Limit the view of stream/connection scope for users, to avoid the Done footgun 3. Move OpenStream to the resource manager * add Buffer interface * fix typo Co-authored-by: Marten Seemann <martenseemann@gmail.com> * fix typo Co-authored-by: Marten Seemann <martenseemann@gmail.com> * fix typo Co-authored-by: Marten Seemann <martenseemann@gmail.com> * rename user scopes to plain names, management scopes as such * rename BeginTxn to BeginTransaction * RIP Buffers * make ErrResourceLimitExceeded a temporary error; move rcmgr errors with the other errors. * unexport TemporaryError * null resource manager stub * unexport the null stubs, make entry point a variable * don't rely on typed nils but instead use actual null object instances So that we don't confuse the hell out of everyone! * add Scope to the CapableConn interface * rename ConnectionScope to ConnScope for consistency * fix typo * rename ConnectionManagementScope to ConnManagementScope * add the ConnManagementScope to Upgrader.Upgrade * fix argument name * godocs for ResourceManager * introduce MemoryStatus indicator in ReserveMemory * use uint8 for MemoryStatus Co-authored-by: Marten Seemann <martenseemann@gmail.com> * rework reservation interface to pass priority instead of returning memory status so that we don't have to undo reservations if there is too much pressure. * improve comment * fix typo * export the NullScope * Stream.SetProtocol can return an error It needs to attach the protocol to the protocol scope, which may fail. * merge the mux package into network * pass the PeerScope to Multiplexer.NetConn * Update network/rcmgr.go Co-authored-by: raulk <raul@protocol.ai> * Update network/rcmgr.go Co-authored-by: raulk <raul@protocol.ai> * Update network/rcmgr.go Co-authored-by: raulk <raul@protocol.ai> * Update network/rcmgr.go Co-authored-by: Adin Schmahmann <adin.schmahmann@gmail.com> * remove reference to deprecated mux.MuxedConn * rename transaction to span * indicate bytes in ReserveMemory * break ResourceManager View methods into Viewer interface. * add experimental interface warning Co-authored-by: Marten Seemann <martenseemann@gmail.com> Co-authored-by: raulk <raul@protocol.ai> Co-authored-by: Adin Schmahmann <adin.schmahmann@gmail.com>
96 lines
3.1 KiB
Go
96 lines
3.1 KiB
Go
package network
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
// ErrReset is returned when reading or writing on a reset stream.
|
|
var ErrReset = errors.New("stream reset")
|
|
|
|
// MuxedStream is a bidirectional io pipe within a connection.
|
|
type MuxedStream interface {
|
|
io.Reader
|
|
io.Writer
|
|
|
|
// Close closes the stream.
|
|
//
|
|
// * Any buffered data for writing will be flushed.
|
|
// * Future reads will fail.
|
|
// * Any in-progress reads/writes will be interrupted.
|
|
//
|
|
// Close may be asynchronous and _does not_ guarantee receipt of the
|
|
// data.
|
|
//
|
|
// Close 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`.
|
|
io.Closer
|
|
|
|
// CloseWrite closes the stream for writing but leaves it open for
|
|
// reading.
|
|
//
|
|
// CloseWrite does not free the stream, users must still call Close or
|
|
// Reset.
|
|
CloseWrite() error
|
|
|
|
// CloseRead closes the stream for reading but leaves it open for
|
|
// writing.
|
|
//
|
|
// When CloseRead is called, all in-progress Read calls are interrupted with a non-EOF error and
|
|
// no further calls to Read will succeed.
|
|
//
|
|
// The handling of new incoming data on the stream after calling this function is implementation defined.
|
|
//
|
|
// CloseRead does not free the stream, users must still call Close or
|
|
// Reset.
|
|
CloseRead() error
|
|
|
|
// Reset closes both ends of the stream. Use this to tell the remote
|
|
// side to hang up and go away.
|
|
Reset() error
|
|
|
|
SetDeadline(time.Time) error
|
|
SetReadDeadline(time.Time) error
|
|
SetWriteDeadline(time.Time) error
|
|
}
|
|
|
|
// MuxedConn represents a connection to a remote peer that has been
|
|
// extended to support stream multiplexing.
|
|
//
|
|
// A MuxedConn allows a single net.Conn connection to carry many logically
|
|
// independent bidirectional streams of binary data.
|
|
//
|
|
// Together with network.ConnSecurity, MuxedConn is a component of the
|
|
// transport.CapableConn interface, which represents a "raw" network
|
|
// connection that has been "upgraded" to support the libp2p capabilities
|
|
// of secure communication and stream multiplexing.
|
|
type MuxedConn interface {
|
|
// Close closes the stream muxer and the the underlying net.Conn.
|
|
io.Closer
|
|
|
|
// IsClosed returns whether a connection is fully closed, so it can
|
|
// be garbage collected.
|
|
IsClosed() bool
|
|
|
|
// OpenStream creates a new stream.
|
|
OpenStream(context.Context) (MuxedStream, error)
|
|
|
|
// AcceptStream accepts a stream opened by the other side.
|
|
AcceptStream() (MuxedStream, error)
|
|
}
|
|
|
|
// Multiplexer wraps a net.Conn with a stream multiplexing
|
|
// implementation and returns a MuxedConn that supports opening
|
|
// multiple streams over the underlying net.Conn
|
|
type Multiplexer interface {
|
|
// NewConn constructs a new connection
|
|
NewConn(c net.Conn, isServer bool, scope PeerScope) (MuxedConn, error)
|
|
}
|