107 lines
2.4 KiB
Go
107 lines
2.4 KiB
Go
package dinet
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"src.dualinventive.com/go/dinet/rpc"
|
|
)
|
|
|
|
// Transport is the type of Transport to encode/decode rpc messages
|
|
type Transport int
|
|
|
|
const (
|
|
// TransportLowlevel is the Transport for encoding/decoding low level messages
|
|
TransportLowlevel Transport = iota
|
|
// TransportZmq is the Transport for encoding/decoding Zmq messages
|
|
TransportZmq
|
|
// TransportTest is a test-transport used for testing DI-Net connections
|
|
TransportTest
|
|
)
|
|
|
|
// Reader interface allows reading of RPC messages
|
|
type Reader interface {
|
|
Recv() (*rpc.Msg, error)
|
|
}
|
|
|
|
// Writer interface allows writing RPC messages
|
|
type Writer interface {
|
|
Send(*rpc.Msg) error
|
|
}
|
|
|
|
// Closer interface allows closing the RPC interface
|
|
type Closer interface {
|
|
Close() error
|
|
}
|
|
|
|
// ReadCloser implements the Reader and Closer interface
|
|
type ReadCloser interface {
|
|
Reader
|
|
Closer
|
|
}
|
|
|
|
// WriteCloser implements the Writer and Closer interface
|
|
type WriteCloser interface {
|
|
Writer
|
|
Closer
|
|
}
|
|
|
|
// ReadWriter implements the Reader and Writer interface
|
|
type ReadWriter interface {
|
|
Reader
|
|
Writer
|
|
}
|
|
|
|
// ReadWriteCloser implements the Reader, Writer and Closer interface
|
|
type ReadWriteCloser interface {
|
|
Reader
|
|
Writer
|
|
Closer
|
|
}
|
|
|
|
// Conn is a DI-Net connection, reading/writing RPC messages via different transports
|
|
type Conn interface {
|
|
ReadWriteCloser
|
|
Connect(string) error
|
|
Reconnect() error
|
|
|
|
SetTimeout(timeout time.Duration) error
|
|
}
|
|
|
|
// DeviceConn is a DI-Net connection which provides an interface for device abstraction
|
|
type DeviceConn interface {
|
|
Conn
|
|
DeviceHandshake(string) error
|
|
DeviceRegister(string) error
|
|
DeviceUnregister(string) error
|
|
}
|
|
|
|
// Compile-time interface validation
|
|
var _ DeviceConn = &LowLevelTransport{}
|
|
var _ DeviceConn = &TestTransport{}
|
|
var _ Conn = &ZmqTransport{}
|
|
|
|
// NewConn creates a new connection based on the given Transport
|
|
func NewConn(enc Transport) (Conn, error) {
|
|
switch enc {
|
|
case TransportTest:
|
|
return &TestTransport{}, nil
|
|
case TransportLowlevel:
|
|
return &LowLevelTransport{}, nil
|
|
case TransportZmq:
|
|
return &ZmqTransport{timeout: ZmqTransportTimeoutInfinite}, nil
|
|
}
|
|
return nil, errors.New("not supported")
|
|
}
|
|
|
|
// NewDeviceConn creates a new device-based connection based on the given Transport
|
|
func NewDeviceConn(enc Transport) (DeviceConn, error) {
|
|
switch enc {
|
|
case TransportLowlevel:
|
|
return &LowLevelTransport{}, nil
|
|
case TransportTest:
|
|
return &TestTransport{}, nil
|
|
}
|
|
return nil, errors.New("not supported")
|
|
}
|