mirror of
https://github.com/status-im/status-go.git
synced 2025-01-09 22:26:30 +00:00
eeca435064
Update vendor Integrate rendezvous into status node Add a test with failover using rendezvous Use multiple servers in client Use discovery V5 by default and test that node can be started with rendezvous discovet Fix linter Update rendezvous client to one with instrumented stream Address feedback Fix test with updated topic limits Apply several suggestions Change log to debug for request errors because we continue execution Remove web3js after rebase Update rendezvous package
193 lines
6.2 KiB
Go
193 lines
6.2 KiB
Go
package net
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
|
|
"github.com/jbenet/goprocess"
|
|
ic "github.com/libp2p/go-libp2p-crypto"
|
|
peer "github.com/libp2p/go-libp2p-peer"
|
|
pstore "github.com/libp2p/go-libp2p-peerstore"
|
|
protocol "github.com/libp2p/go-libp2p-protocol"
|
|
smux "github.com/libp2p/go-stream-muxer"
|
|
ma "github.com/multiformats/go-multiaddr"
|
|
)
|
|
|
|
// MessageSizeMax is a soft (recommended) maximum for network messages.
|
|
// One can write more, as the interface is a stream. But it is useful
|
|
// to bunch it up into multiple read/writes when the whole message is
|
|
// a single, large serialized object.
|
|
const MessageSizeMax = 1 << 22 // 4 MB
|
|
|
|
// Stream represents a bidirectional channel between two agents in
|
|
// the IPFS network. "agent" is as granular as desired, potentially
|
|
// being a "request -> reply" pair, or whole protocols.
|
|
// Streams are backed by stream-muxer streams underneath the hood.
|
|
type Stream interface {
|
|
smux.Stream
|
|
|
|
Protocol() protocol.ID
|
|
SetProtocol(protocol.ID)
|
|
|
|
// Conn returns the connection this stream is part of.
|
|
Conn() Conn
|
|
}
|
|
|
|
// StreamHandler is the type of function used to listen for
|
|
// streams opened by the remote side.
|
|
type StreamHandler func(Stream)
|
|
|
|
// ConnSecurity is the interface that one can mix into a connection interface to
|
|
// give it the security methods.
|
|
type ConnSecurity interface {
|
|
// LocalPeer returns our peer ID
|
|
LocalPeer() peer.ID
|
|
|
|
// LocalPrivateKey returns our private key
|
|
LocalPrivateKey() ic.PrivKey
|
|
|
|
// RemotePeer returns the peer ID of the remote peer.
|
|
RemotePeer() peer.ID
|
|
|
|
// RemotePublicKey returns the public key of the remote peer.
|
|
RemotePublicKey() ic.PubKey
|
|
}
|
|
|
|
// ConnMultiaddrs is an interface mixin for connection types that provide multiaddr
|
|
// addresses for the endpoints.
|
|
type ConnMultiaddrs interface {
|
|
// LocalMultiaddr returns the local Multiaddr associated
|
|
// with this connection
|
|
LocalMultiaddr() ma.Multiaddr
|
|
|
|
// RemoteMultiaddr returns the remote Multiaddr associated
|
|
// with this connection
|
|
RemoteMultiaddr() ma.Multiaddr
|
|
}
|
|
|
|
// Conn is a connection to a remote peer. It multiplexes streams.
|
|
// Usually there is no need to use a Conn directly, but it may
|
|
// be useful to get information about the peer on the other side:
|
|
// stream.Conn().RemotePeer()
|
|
type Conn interface {
|
|
io.Closer
|
|
|
|
ConnSecurity
|
|
ConnMultiaddrs
|
|
|
|
// NewStream constructs a new Stream over this conn.
|
|
NewStream() (Stream, error)
|
|
|
|
// GetStreams returns all open streams over this conn.
|
|
GetStreams() []Stream
|
|
}
|
|
|
|
// ConnHandler is the type of function used to listen for
|
|
// connections opened by the remote side.
|
|
type ConnHandler func(Conn)
|
|
|
|
// Network is the interface used to connect to the outside world.
|
|
// It dials and listens for connections. it uses a Swarm to pool
|
|
// connnections (see swarm pkg, and peerstream.Swarm). Connections
|
|
// are encrypted with a TLS-like protocol.
|
|
type Network interface {
|
|
Dialer
|
|
io.Closer
|
|
|
|
// SetStreamHandler sets the handler for new streams opened by the
|
|
// remote side. This operation is threadsafe.
|
|
SetStreamHandler(StreamHandler)
|
|
|
|
// SetConnHandler sets the handler for new connections opened by the
|
|
// remote side. This operation is threadsafe.
|
|
SetConnHandler(ConnHandler)
|
|
|
|
// NewStream returns a new stream to given peer p.
|
|
// If there is no connection to p, attempts to create one.
|
|
NewStream(context.Context, peer.ID) (Stream, error)
|
|
|
|
// Listen tells the network to start listening on given multiaddrs.
|
|
Listen(...ma.Multiaddr) error
|
|
|
|
// ListenAddresses returns a list of addresses at which this network listens.
|
|
ListenAddresses() []ma.Multiaddr
|
|
|
|
// InterfaceListenAddresses returns a list of addresses at which this network
|
|
// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to
|
|
// use the known local interfaces.
|
|
InterfaceListenAddresses() ([]ma.Multiaddr, error)
|
|
|
|
// Process returns the network's Process
|
|
Process() goprocess.Process
|
|
}
|
|
|
|
// Dialer represents a service that can dial out to peers
|
|
// (this is usually just a Network, but other services may not need the whole
|
|
// stack, and thus it becomes easier to mock)
|
|
type Dialer interface {
|
|
|
|
// Peerstore returns the internal peerstore
|
|
// This is useful to tell the dialer about a new address for a peer.
|
|
// Or use one of the public keys found out over the network.
|
|
Peerstore() pstore.Peerstore
|
|
|
|
// LocalPeer returns the local peer associated with this network
|
|
LocalPeer() peer.ID
|
|
|
|
// DialPeer establishes a connection to a given peer
|
|
DialPeer(context.Context, peer.ID) (Conn, error)
|
|
|
|
// ClosePeer closes the connection to a given peer
|
|
ClosePeer(peer.ID) error
|
|
|
|
// Connectedness returns a state signaling connection capabilities
|
|
Connectedness(peer.ID) Connectedness
|
|
|
|
// Peers returns the peers connected
|
|
Peers() []peer.ID
|
|
|
|
// Conns returns the connections in this Netowrk
|
|
Conns() []Conn
|
|
|
|
// ConnsToPeer returns the connections in this Netowrk for given peer.
|
|
ConnsToPeer(p peer.ID) []Conn
|
|
|
|
// Notify/StopNotify register and unregister a notifiee for signals
|
|
Notify(Notifiee)
|
|
StopNotify(Notifiee)
|
|
}
|
|
|
|
// Connectedness signals the capacity for a connection with a given node.
|
|
// It is used to signal to services and other peers whether a node is reachable.
|
|
type Connectedness int
|
|
|
|
const (
|
|
// NotConnected means no connection to peer, and no extra information (default)
|
|
NotConnected Connectedness = iota
|
|
|
|
// Connected means has an open, live connection to peer
|
|
Connected
|
|
|
|
// CanConnect means recently connected to peer, terminated gracefully
|
|
CanConnect
|
|
|
|
// CannotConnect means recently attempted connecting but failed to connect.
|
|
// (should signal "made effort, failed")
|
|
CannotConnect
|
|
)
|
|
|
|
// Notifiee is an interface for an object wishing to receive
|
|
// notifications from a Network.
|
|
type Notifiee interface {
|
|
Listen(Network, ma.Multiaddr) // called when network starts listening on an addr
|
|
ListenClose(Network, ma.Multiaddr) // called when network starts listening on an addr
|
|
Connected(Network, Conn) // called when a connection opened
|
|
Disconnected(Network, Conn) // called when a connection closed
|
|
OpenedStream(Network, Stream) // called when a stream opened
|
|
ClosedStream(Network, Stream) // called when a stream closed
|
|
|
|
// TODO
|
|
// PeerConnected(Network, peer.ID) // called when a peer connected
|
|
// PeerDisconnected(Network, peer.ID) // called when a peer disconnected
|
|
}
|