103 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package tunnel provides gre network tunnelling
 | 
						|
package tunnel
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/v3/network/transport"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// send over one link
 | 
						|
	Unicast Mode = iota
 | 
						|
	// send to all channel listeners
 | 
						|
	Multicast
 | 
						|
	// send to all links
 | 
						|
	Broadcast
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	// DefaultDialTimeout is the dial timeout if none is specified
 | 
						|
	DefaultDialTimeout = time.Second * 5
 | 
						|
	// ErrDialTimeout is returned by a call to Dial where the timeout occurs
 | 
						|
	ErrDialTimeout = errors.New("dial timeout")
 | 
						|
	// ErrDiscoverChan is returned when we failed to receive the "announce" back from a discovery
 | 
						|
	ErrDiscoverChan = errors.New("failed to discover channel")
 | 
						|
	// ErrLinkNotFound is returned when a link is specified at dial time and does not exist
 | 
						|
	ErrLinkNotFound = errors.New("link not found")
 | 
						|
	// ErrLinkDisconnected is returned when a link we attempt to send to is disconnected
 | 
						|
	ErrLinkDisconnected = errors.New("link not connected")
 | 
						|
	// ErrLinkLoppback is returned when attempting to send an outbound message over loopback link
 | 
						|
	ErrLinkLoopback = errors.New("link is loopback")
 | 
						|
	// ErrLinkRemote is returned when attempting to send a loopback message over remote link
 | 
						|
	ErrLinkRemote = errors.New("link is remote")
 | 
						|
	// ErrReadTimeout is a timeout on session.Recv
 | 
						|
	ErrReadTimeout = errors.New("read timeout")
 | 
						|
	// ErrDecryptingData is for when theres a nonce error
 | 
						|
	ErrDecryptingData = errors.New("error decrypting data")
 | 
						|
)
 | 
						|
 | 
						|
// Mode of the session
 | 
						|
type Mode uint8
 | 
						|
 | 
						|
// Tunnel creates a gre tunnel on top of the go-micro/transport.
 | 
						|
// It establishes multiple streams using the Micro-Tunnel-Channel header
 | 
						|
// and Micro-Tunnel-Session header. The tunnel id is a hash of
 | 
						|
// the address being requested.
 | 
						|
type Tunnel interface {
 | 
						|
	// Init initializes tunnel with options
 | 
						|
	Init(opts ...Option) error
 | 
						|
	// Address returns the address the tunnel is listening on
 | 
						|
	Address() string
 | 
						|
	// Connect connects the tunnel
 | 
						|
	Connect() error
 | 
						|
	// Close closes the tunnel
 | 
						|
	Close() error
 | 
						|
	// Links returns all the links the tunnel is connected to
 | 
						|
	Links() []Link
 | 
						|
	// Dial allows a client to connect to a channel
 | 
						|
	Dial(channel string, opts ...DialOption) (Session, error)
 | 
						|
	// Listen allows to accept connections on a channel
 | 
						|
	Listen(channel string, opts ...ListenOption) (Listener, error)
 | 
						|
	// String returns the name of the tunnel implementation
 | 
						|
	String() string
 | 
						|
}
 | 
						|
 | 
						|
// Link represents internal links to the tunnel
 | 
						|
type Link interface {
 | 
						|
	// Id returns the link unique Id
 | 
						|
	Id() string
 | 
						|
	// Delay is the current load on the link (lower is better)
 | 
						|
	Delay() int64
 | 
						|
	// Length returns the roundtrip time as nanoseconds (lower is better)
 | 
						|
	Length() int64
 | 
						|
	// Current transfer rate as bits per second (lower is better)
 | 
						|
	Rate() float64
 | 
						|
	// Is this a loopback link
 | 
						|
	Loopback() bool
 | 
						|
	// State of the link: connected/closed/error
 | 
						|
	State() string
 | 
						|
	// honours transport socket
 | 
						|
	transport.Socket
 | 
						|
}
 | 
						|
 | 
						|
// The listener provides similar constructs to the transport.Listener
 | 
						|
type Listener interface {
 | 
						|
	Accept() (Session, error)
 | 
						|
	Channel() string
 | 
						|
	Close() error
 | 
						|
}
 | 
						|
 | 
						|
// Session is a unique session created when dialling or accepting connections on the tunnel
 | 
						|
type Session interface {
 | 
						|
	// The unique session id
 | 
						|
	Id() string
 | 
						|
	// The channel name
 | 
						|
	Channel() string
 | 
						|
	// The link the session is on
 | 
						|
	Link() string
 | 
						|
	// a transport socket
 | 
						|
	transport.Socket
 | 
						|
}
 |