package network

import (
	"github.com/libp2p/go-libp2p/core/protocol"
)

// Stream represents a bidirectional channel between two agents in
// a libp2p network. "agent" is as granular as desired, potentially
// being a "request -> reply" pair, or whole protocols.
//
// Streams are backed by a multiplexer underneath the hood.
type Stream interface {
	MuxedStream

	// ID returns an identifier that uniquely identifies this Stream within this
	// host, during this run. Stream IDs may repeat across restarts.
	ID() string

	Protocol() protocol.ID
	SetProtocol(id protocol.ID) error

	// Stat returns metadata pertaining to this stream.
	Stat() Stats

	// Conn returns the connection this stream is part of.
	Conn() Conn

	// Scope returns the user's view of this stream's resource scope
	Scope() StreamScope

	// ResetWithError closes both ends of the stream with errCode. The errCode is sent
	// to the peer.
	ResetWithError(errCode StreamErrorCode) error
}
