dae/component/outbound/dialer/dialer.go

96 lines
2.1 KiB
Go
Raw Normal View History

2023-01-23 18:54:21 +07:00
package dialer
import (
"fmt"
"github.com/sirupsen/logrus"
"golang.org/x/net/proxy"
"sync"
"time"
)
var (
UnexpectedFieldErr = fmt.Errorf("unexpected field")
InvalidParameterErr = fmt.Errorf("invalid parameters")
2023-01-23 18:54:21 +07:00
)
type Dialer struct {
2023-01-28 00:50:21 +07:00
*GlobalOption
2023-01-28 14:47:43 +07:00
instanceOption InstanceOption
2023-01-23 18:54:21 +07:00
proxy.Dialer
name string
protocol string
link string
tcp4Latencies10 *LatenciesN
tcp6Latencies10 *LatenciesN
udp4Latencies10 *LatenciesN
udp6Latencies10 *LatenciesN
2023-01-23 18:54:21 +07:00
aliveDialerSetSetMu sync.Mutex
// aliveDialerSetSet uses reference counting.
tcp4AliveDialerSetSet AliveDialerSetSet
tcp6AliveDialerSetSet AliveDialerSetSet
udp4AliveDialerSetSet AliveDialerSetSet
udp6AliveDialerSetSet AliveDialerSetSet
2023-01-23 18:54:21 +07:00
tickerMu sync.Mutex
ticker *time.Ticker
}
2023-01-28 00:50:21 +07:00
type GlobalOption struct {
Log *logrus.Logger
TcpCheckOption *TcpCheckOption
UdpCheckOption *UdpCheckOption
CheckInterval time.Duration
2023-01-28 00:50:21 +07:00
}
2023-01-28 14:47:43 +07:00
type InstanceOption struct {
CheckEnabled bool
2023-01-23 18:54:21 +07:00
}
type AliveDialerSetSet map[*AliveDialerSet]int
2023-01-28 14:47:43 +07:00
// NewDialer is for register in general.
func NewDialer(dialer proxy.Dialer, option *GlobalOption, iOption InstanceOption, name string, protocol string, link string) *Dialer {
2023-01-23 18:54:21 +07:00
d := &Dialer{
Dialer: dialer,
GlobalOption: option,
instanceOption: iOption,
name: name,
protocol: protocol,
link: link,
tcp4Latencies10: NewLatenciesN(10),
tcp6Latencies10: NewLatenciesN(10),
udp4Latencies10: NewLatenciesN(10),
udp6Latencies10: NewLatenciesN(10),
2023-01-23 18:54:21 +07:00
// Set a very big cycle to wait for init.
ticker: time.NewTicker(time.Hour),
tcp4AliveDialerSetSet: make(AliveDialerSetSet),
tcp6AliveDialerSetSet: make(AliveDialerSetSet),
udp4AliveDialerSetSet: make(AliveDialerSetSet),
udp6AliveDialerSetSet: make(AliveDialerSetSet),
2023-01-23 18:54:21 +07:00
}
if iOption.CheckEnabled {
2023-01-28 14:47:43 +07:00
go d.aliveBackground()
}
2023-01-23 18:54:21 +07:00
return d
}
func (d *Dialer) Close() error {
d.tickerMu.Lock()
d.ticker.Stop()
d.tickerMu.Unlock()
return nil
}
func (d *Dialer) Name() string {
return d.name
}
func (d *Dialer) Protocol() string {
return d.protocol
}
func (d *Dialer) Link() string {
return d.link
}