micro/tunnel/tunnel.go

108 lines
3.3 KiB
Go
Raw Permalink Normal View History

2019-08-07 20:44:33 +03:00
// Package tunnel provides gre network tunnelling
package tunnel
import (
"errors"
"time"
"github.com/micro/go-micro/v2/transport"
)
2019-10-15 17:40:04 +03:00
const (
// send over one link
2019-10-15 17:40:04 +03:00
Unicast Mode = iota
// send to all channel listeners
2019-10-15 17:40:04 +03:00
Multicast
2019-10-15 18:08:38 +03:00
// send to all links
2019-10-15 17:40:04 +03:00
Broadcast
)
2019-09-04 14:00:11 +03:00
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")
2019-09-11 21:57:41 +03:00
// ErrLinkNotFound is returned when a link is specified at dial time and does not exist
ErrLinkNotFound = errors.New("link not found")
2020-01-13 23:06:02 +03:00
// 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")
2019-12-08 02:28:39 +03:00
// ErrReadTimeout is a timeout on session.Recv
ErrReadTimeout = errors.New("read timeout")
2019-12-12 20:10:32 +03:00
// ErrDecryptingData is for when theres a nonce error
ErrDecryptingData = errors.New("error decrypting data")
2019-09-04 14:00:11 +03:00
)
// Mode of the session
2019-10-15 17:40:04 +03:00
type Mode uint8
2019-08-31 19:32:20 +03:00
// Tunnel creates a gre tunnel on top of the go-micro/transport.
// It establishes multiple streams using the Micro-Tunnel-Channel header
2019-08-07 20:44:33 +03:00
// and Micro-Tunnel-Session header. The tunnel id is a hash of
// the address being requested.
type Tunnel interface {
// Init initializes tunnel with options
2019-08-07 23:58:25 +03:00
Init(opts ...Option) error
// Address returns the address the tunnel is listening on
2019-08-21 14:55:10 +03:00
Address() string
// Connect connects the tunnel
Connect() error
// Close closes the tunnel
Close() error
// Links returns all the links the tunnel is connected to
2019-09-11 22:49:27 +03:00
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
2019-10-15 17:40:04 +03:00
Listen(channel string, opts ...ListenOption) (Listener, error)
// String returns the name of the tunnel implementation
2019-08-20 19:21:35 +03:00
String() string
2019-08-07 20:44:33 +03:00
}
2019-09-04 17:41:57 +03:00
// Link represents internal links to the tunnel
type Link interface {
// Id returns the link unique Id
2019-09-04 17:41:57 +03:00
Id() string
2019-10-22 18:53:47 +03:00
// Delay is the current load on the link (lower is better)
2019-10-22 18:50:00 +03:00
Delay() int64
// Length returns the roundtrip time as nanoseconds (lower is better)
Length() int64
2019-10-22 19:02:22 +03:00
// 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
2019-09-04 17:41:57 +03:00
// honours transport socket
transport.Socket
}
2019-08-07 20:44:33 +03:00
// The listener provides similar constructs to the transport.Listener
type Listener interface {
2019-08-31 19:32:20 +03:00
Accept() (Session, error)
2019-08-30 22:05:00 +03:00
Channel() string
2019-08-07 20:44:33 +03:00
Close() error
}
2019-08-30 22:05:00 +03:00
// Session is a unique session created when dialling or accepting connections on the tunnel
type Session interface {
2019-08-31 19:32:20 +03:00
// The unique session id
2019-08-07 20:44:33 +03:00
Id() string
2019-08-31 19:32:20 +03:00
// The channel name
2019-08-30 22:05:00 +03:00
Channel() string
2019-09-11 22:07:43 +03:00
// The link the session is on
Link() string
2019-08-07 20:44:33 +03:00
// a transport socket
transport.Socket
2019-08-05 21:41:48 +03:00
}
2019-08-07 20:44:33 +03:00
// NewTunnel creates a new tunnel
2019-08-05 21:41:48 +03:00
func NewTunnel(opts ...Option) Tunnel {
return newTunnel(opts...)
}