p2p

package
v1.3.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 25, 2022 License: BSD-3-Clause Imports: 14 Imported by: 15

Documentation

Overview

Package p2p provides the peer-to-peer abstractions used across different protocols in Aurora.

Index

Constants

View Source
const (
	ReachabilityStatusUnknown = ReachabilityStatus(network.ReachabilityUnknown)
	ReachabilityStatusPublic  = ReachabilityStatus(network.ReachabilityPublic)
	ReachabilityStatusPrivate = ReachabilityStatus(network.ReachabilityPrivate)
)
View Source
const (
	DefaultBlocklistTime = 1 * time.Minute
)
View Source
const (
	HeaderNameTracingSpanContext = "tracing-span-context"
)

Common header names.

Variables

View Source
var (
	// ErrPeerNotFound should be returned by p2p service methods when the requested
	// peer is not found.
	ErrPeerNotFound = errors.New("peer not found")
	// ErrAlreadyConnected is returned if connect was called for already connected node.
	ErrAlreadyConnected = errors.New("already connected")
	// ErrDialLightNode is returned if connect was attempted to a light node.
	ErrDialLightNode = errors.New("target peer is a light node")
	// ErrPeerBlocklisted is returned if peer is on blocklist
	ErrPeerBlocklisted = errors.New("peer blocklisted")

	ErrStreamClosed       = errors.New("stream closed")
	ErrNetworkUnavailable = errors.New("network unavailable")
)
View Source
var ErrUnexpected = errors.New("unexpected request while in light mode")

Functions

func Discover

func Discover(ctx context.Context, addr ma.Multiaddr, f func(ma.Multiaddr) (bool, error)) (bool, error)

func NewAuroraStreamName

func NewAuroraStreamName(protocol, version, stream string) string

NewAuroraStreamName constructs a libp2p compatible stream name out of protocol name and version and stream name.

func NewBlockPeerError

func NewBlockPeerError(duration time.Duration, err error) error

NewBlockPeerError wraps error and creates a special error that is treated specially by p2p. It causes peer to be disconnected and blocks any new connection for this peer for the provided duration.

func NewConnectionBackoffError

func NewConnectionBackoffError(err error, tryAfter time.Time) error

NewConnectionBackoffError creates new `ConnectionBackoffError` with provided underlying error and `tryAfter` timestamp.

func NewDisconnectError

func NewDisconnectError(err error) error

NewDisconnectError wraps error and creates a special error that is treated specially by p2p. It causes peer to disconnect.

func WithBlocklistStreams

func WithBlocklistStreams(dur time.Duration, spec ProtocolSpec)

WithBlocklistStreams will mutate the given spec and replace the handler with a always erroring one.

func WithDisconnectStreams

func WithDisconnectStreams(spec ProtocolSpec)

WithDisconnectStreams will mutate the given spec and replace the handler with a always erroring one.

Types

type BlockPeerError

type BlockPeerError struct {
	// contains filtered or unexported fields
}

func (*BlockPeerError) Duration

func (e *BlockPeerError) Duration() time.Duration

Duration represents the period for which the peer will be blocked. 0 duration is treated as infinity

func (*BlockPeerError) Error

func (e *BlockPeerError) Error() string

Error implements function of the standard go error interface.

func (*BlockPeerError) Unwrap

func (e *BlockPeerError) Unwrap() error

Unwrap returns an underlying error.

type BlockPeers added in v1.3.2

type BlockPeers struct {
	Address   boson.Address `json:"address"`
	Timestamp string        `json:"timestamp"`
	Duration  float64       `json:"duration"`
}

type Blocklister added in v1.3.2

type Blocklister interface {
	NetworkStatuser

	// Blocklist will disconnect a peer and put it on a blocklist (blocking in & out connections) for provided duration
	// Duration 0 is treated as an infinite duration.
	Blocklist(overlay boson.Address, duration time.Duration, reason string) error
}

type Connect

type Connect interface {
	// Connect to a peer but do not notify topology about the established connection.
	Connect(ctx context.Context, addr ma.Multiaddr) (peer *Peer, err error)
}

type ConnectionBackoffError

type ConnectionBackoffError struct {
	// contains filtered or unexported fields
}

ConnectionBackoffError indicates that connection calls will not be executed until `tryAfter` timetamp. The reason is provided in the wrappped error.

func (*ConnectionBackoffError) Error

func (e *ConnectionBackoffError) Error() string

Error implements function of the standard go error interface.

func (*ConnectionBackoffError) TryAfter

func (e *ConnectionBackoffError) TryAfter() time.Time

TryAfter returns a tryAfter timetamp.

func (*ConnectionBackoffError) Unwrap

func (e *ConnectionBackoffError) Unwrap() error

Unwrap returns an underlying error.

type DebugService

type DebugService interface {
	Service
	SetWelcomeMessage(val string) error
	GetWelcomeMessage() string
}

DebugService extends the Service with method used for debugging.

type DisconnectError

type DisconnectError struct {
	// contains filtered or unexported fields
}

DisconnectError is an error that is specifically handled inside p2p. If returned by specific protocol handler it causes peer disconnect.

func (*DisconnectError) Error

func (e *DisconnectError) Error() string

Error implements function of the standard go error interface.

func (*DisconnectError) Unwrap

func (e *DisconnectError) Unwrap() error

Unwrap returns an underlying error.

type Disconnecter

type Disconnecter interface {
	Disconnect(overlay boson.Address, reason string) error
	Blocklister
}

type Halter

type Halter interface {
	// Halt new incoming connections while shutting down
	Halt()
}

type HandlerFunc

type HandlerFunc func(context.Context, Peer, Stream) error

HandlerFunc handles a received Stream from a Peer.

type HandlerMiddleware

type HandlerMiddleware func(HandlerFunc) HandlerFunc

HandlerMiddleware decorates a HandlerFunc by returning a new one.

type Headers

type Headers map[string][]byte

Headers represents a collection of p2p header key value pairs.

type HeadlerFunc

type HeadlerFunc func(Headers, boson.Address) Headers

HeadlerFunc is returning response headers based on the received request headers.

type IncompatibleStreamError

type IncompatibleStreamError struct {
	// contains filtered or unexported fields
}

IncompatibleStreamError is the error that should be returned by p2p service NewStream method when the stream or its version is not supported.

func NewIncompatibleStreamError

func NewIncompatibleStreamError(err error) *IncompatibleStreamError

NewIncompatibleStreamError wraps the error that is the cause of stream incompatibility with IncompatibleStreamError that it can be detected and returns it.

func (*IncompatibleStreamError) Error

func (e *IncompatibleStreamError) Error() string

Error implements function of the standard go error interface.

func (*IncompatibleStreamError) Unwrap

func (e *IncompatibleStreamError) Unwrap() error

Unwrap returns an underlying error.

type NetworkStatus added in v1.3.4

type NetworkStatus int

NetworkStatus represents the network availability status.

const (
	NetworkStatusUnknown     NetworkStatus = 0
	NetworkStatusAvailable   NetworkStatus = 1
	NetworkStatusUnavailable NetworkStatus = 2
)

func (NetworkStatus) String added in v1.3.4

func (ns NetworkStatus) String() string

String implements the fmt.Stringer interface.

type NetworkStatuser added in v1.3.4

type NetworkStatuser interface {
	// NetworkStatus returns current network availability status.
	NetworkStatus() NetworkStatus
}

NetworkStatuser handles bookkeeping of the network availability status.

type Notifier

type Notifier interface {
	Connected(context.Context, Peer, bool) error
	Disconnected(peer Peer, reason string)
	Announce(ctx context.Context, peer boson.Address, fullnode bool) error
	AnnounceTo(ctx context.Context, addressee, peer boson.Address, fullnode bool) error
	NotifyPeerState(peer PeerInfo)
}

type Peer

type Peer struct {
	Address boson.Address `json:"address"`
	Mode    aurora.Model  `json:"mode"`
}

Peer holds information about a Peer.

type PeerInfo added in v1.3.0

type PeerInfo struct {
	Overlay boson.Address `json:"overlay"`
	Mode    []byte        `json:"mode"`
	State   PeerState     `json:"state"`
	Reason  string        `json:"reason"`
}

type PeerState added in v1.2.4

type PeerState int
const (
	PeerStateConnectIn PeerState = iota + 1
	PeerStateConnectOut
	PeerStateDisconnect
)

type Picker added in v1.0.9

type Picker interface {
	Pick(Peer) bool
}

type PickyNotifier

type PickyNotifier interface {
	Picker
	Notifier
	ReachabilityUpdater
	ReachableNotifier
}

PickyNotifier can decide whether a peer should be picked

type Pinger

type Pinger interface {
	Ping(ctx context.Context, addr ma.Multiaddr) (rtt time.Duration, err error)
}

Pinger interface is used to ping a underlay address which is not yet known to the aurora node. It uses libp2p's default ping protocol. This is different from the PingPong protocol as this is meant to be used before we know a particular underlay and we can consider it useful

type ProtocolSpec

type ProtocolSpec struct {
	Name          string
	Version       string
	StreamSpecs   []StreamSpec
	ConnectIn     func(context.Context, Peer) error
	ConnectOut    func(context.Context, Peer) error
	DisconnectIn  func(Peer) error
	DisconnectOut func(Peer) error
}

ProtocolSpec defines a collection of Stream specifications with handlers.

type ReachabilityStatus added in v1.3.2

type ReachabilityStatus network.Reachability

ReachabilityStatus represents the node reachability status.

func (ReachabilityStatus) String added in v1.3.2

func (rs ReachabilityStatus) String() string

String implements the fmt.Stringer interface.

type ReachabilityUpdater added in v1.3.2

type ReachabilityUpdater interface {
	UpdateReachability(ReachabilityStatus)
}

type ReachableNotifier added in v1.3.2

type ReachableNotifier interface {
	Reachable(boson.Address, ReachabilityStatus)
}

type Reacher added in v1.3.2

type Reacher interface {
	Connected(boson.Address, ma.Multiaddr)
	Disconnected(boson.Address)
}

type ReaderChan added in v1.2.0

type ReaderChan struct {
	R   chan []byte
	Err chan error
}

type Service

type Service interface {
	CallHandlerWithConnChain(ctx context.Context, last, src Peer, stream Stream, protocolName, protocolVersion, streamName string) error
	CallHandler(ctx context.Context, last Peer, stream Stream) (relayData *pb.RouteRelayReq, w *WriterChan, r *ReaderChan, forward bool, err error)
	AddProtocol(ProtocolSpec) error
	Connect
	Disconnecter
	Peers() []Peer
	PeerID(overlay boson.Address) (id libp2ppeer.ID, found bool)
	ResourceManager() network.ResourceManager
	BlocklistedPeers() ([]BlockPeers, error)
	BlocklistRemove(overlay boson.Address) error
	Addresses() ([]ma.Multiaddr, error)
	NATAddresses() ([]net.Addr, error)
	SetPickyNotifier(PickyNotifier)
	Halter
	NetworkStatuser
}

Service provides methods to handle p2p Peers and Protocols.

type Stream

type Stream interface {
	io.ReadWriter
	io.Closer
	ResponseHeaders() Headers
	Headers() Headers
	FullClose() error
	Reset() error
}

Stream represent a bidirectional data Stream.

type StreamSpec

type StreamSpec struct {
	Name    string
	Handler HandlerFunc
	Headler HeadlerFunc
}

StreamSpec defines a Stream handling within the protocol.

type Streamer

type Streamer interface {
	NewStream(ctx context.Context, address boson.Address, h Headers, protocol, version, stream string) (Stream, error)
	NewRelayStream(ctx context.Context, address boson.Address, h Headers, protocol, version, stream string, midCall bool) (Stream, error)
	NewConnChainRelayStream(ctx context.Context, target boson.Address, h Headers, protocolName, protocolVersion, streamName string) (Stream, error)
}

Streamer is able to create a new Stream.

type StreamerDisconnecter

type StreamerDisconnecter interface {
	Streamer
	Disconnecter
}

type StreamerPinger

type StreamerPinger interface {
	Streamer
	Pinger
}

type VirtualStream added in v1.3.4

type VirtualStream interface {
	Stream
	UpdateStatRealStreamClosed()
	Reader() *ReaderChan
	Writer() *WriterChan
	Done() chan struct{}
	RealStream() Stream
}

type WriterChan added in v1.2.0

type WriterChan struct {
	W   chan []byte
	Err chan error
}

Directories

Path Synopsis
internal/handshake/pb
Package pb holds only Protocol Buffer definitions and generated code.
Package pb holds only Protocol Buffer definitions and generated code.
internal/headers/pb
Package pb holds only Protocol Buffer definitions and generated code.
Package pb holds only Protocol Buffer definitions and generated code.
internal/reacher
Package reacher runs a background worker that will ping peers from an internal queue and report back the reachability to the notifier.
Package reacher runs a background worker that will ping peers from an internal queue and report back the reachability to the notifier.
internal/pb
Package pb holds only Protocol Buffer definitions and generated code for testing purposes.
Package pb holds only Protocol Buffer definitions and generated code for testing purposes.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL