2021-05-22 16:12:26 -07:00
|
|
|
package transport
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
transportDrivers = make(map[string]TransportDriver)
|
|
|
|
lock = &sync.RWMutex{}
|
2023-08-09 19:47:20 -07:00
|
|
|
|
|
|
|
ErrorTransport = fmt.Errorf("transport error")
|
2021-05-22 16:12:26 -07:00
|
|
|
)
|
|
|
|
|
2023-08-09 19:47:20 -07:00
|
|
|
type DriverTransportError struct {
|
|
|
|
Driver string
|
|
|
|
Err error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *DriverTransportError) Error() string {
|
|
|
|
return fmt.Sprintf("%s for %s transport", e.Err.Error(), e.Driver)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *DriverTransportError) Unwrap() []error {
|
|
|
|
return []error{ErrorTransport, e.Err}
|
|
|
|
}
|
|
|
|
|
2021-05-22 16:12:26 -07:00
|
|
|
type TransportDriver interface {
|
|
|
|
Prepare() error // Prepare driver (eg: flag registration)
|
2023-08-09 19:47:20 -07:00
|
|
|
Init() error // Initialize driver (eg: start connections, open files...)
|
|
|
|
Close() error // Close driver (eg: close connections and files...)
|
2021-05-22 16:12:26 -07:00
|
|
|
Send(key, data []byte) error // Send a formatted message
|
|
|
|
}
|
|
|
|
|
|
|
|
type TransportInterface interface {
|
|
|
|
Send(key, data []byte) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type Transport struct {
|
2023-08-09 19:47:20 -07:00
|
|
|
TransportDriver
|
|
|
|
name string
|
2021-05-22 16:12:26 -07:00
|
|
|
}
|
|
|
|
|
2023-08-09 19:47:20 -07:00
|
|
|
func (t *Transport) Close() error {
|
|
|
|
if err := t.TransportDriver.Close(); err != nil {
|
|
|
|
return &DriverTransportError{t.name, err}
|
|
|
|
}
|
|
|
|
return nil
|
2021-05-22 16:12:26 -07:00
|
|
|
}
|
2023-08-09 19:47:20 -07:00
|
|
|
|
2021-05-22 16:12:26 -07:00
|
|
|
func (t *Transport) Send(key, data []byte) error {
|
2023-08-09 19:47:20 -07:00
|
|
|
if err := t.TransportDriver.Send(key, data); err != nil {
|
|
|
|
return &DriverTransportError{t.name, err}
|
|
|
|
}
|
|
|
|
return nil
|
2021-05-22 16:12:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func RegisterTransportDriver(name string, t TransportDriver) {
|
|
|
|
lock.Lock()
|
|
|
|
transportDrivers[name] = t
|
|
|
|
lock.Unlock()
|
|
|
|
|
|
|
|
if err := t.Prepare(); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-09 19:47:20 -07:00
|
|
|
func FindTransport(name string) (*Transport, error) {
|
2021-05-22 16:12:26 -07:00
|
|
|
lock.RLock()
|
|
|
|
t, ok := transportDrivers[name]
|
|
|
|
lock.RUnlock()
|
|
|
|
if !ok {
|
2023-08-09 19:47:20 -07:00
|
|
|
return nil, fmt.Errorf("%w %s not found", ErrorTransport, name)
|
2021-05-22 16:12:26 -07:00
|
|
|
}
|
|
|
|
|
2023-08-09 19:47:20 -07:00
|
|
|
err := t.Init()
|
|
|
|
if err != nil {
|
|
|
|
err = &DriverTransportError{name, err}
|
|
|
|
}
|
|
|
|
return &Transport{t, name}, err
|
2021-05-22 16:12:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func GetTransports() []string {
|
|
|
|
lock.RLock()
|
2021-09-23 09:57:14 +02:00
|
|
|
defer lock.RUnlock()
|
2021-05-22 16:12:26 -07:00
|
|
|
t := make([]string, len(transportDrivers))
|
|
|
|
var i int
|
2023-08-09 19:47:20 -07:00
|
|
|
for k := range transportDrivers {
|
2021-05-22 16:12:26 -07:00
|
|
|
t[i] = k
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
return t
|
|
|
|
}
|