55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package selector
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/go-gost/core/chain"
|
|
"github.com/go-gost/core/selector"
|
|
)
|
|
|
|
// default options for FailFilter
|
|
const (
|
|
DefaultMaxFails = 1
|
|
DefaultFailTimeout = 10 * time.Second
|
|
)
|
|
|
|
const (
|
|
labelWeight = "weight"
|
|
labelBackup = "backup"
|
|
labelMaxFails = "maxFails"
|
|
labelFailTimeout = "failTimeout"
|
|
)
|
|
|
|
var (
|
|
DefaultNodeSelector = NewSelector(
|
|
RoundRobinStrategy[*chain.Node](),
|
|
// FailFilter[*Node](1, DefaultFailTimeout),
|
|
)
|
|
DefaultChainSelector = NewSelector(
|
|
RoundRobinStrategy[chain.SelectableChainer](),
|
|
// FailFilter[SelectableChainer](1, DefaultFailTimeout),
|
|
)
|
|
)
|
|
|
|
type defaultSelector[T selector.Selectable] struct {
|
|
strategy selector.Strategy[T]
|
|
filters []selector.Filter[T]
|
|
}
|
|
|
|
func NewSelector[T selector.Selectable](strategy selector.Strategy[T], filters ...selector.Filter[T]) selector.Selector[T] {
|
|
return &defaultSelector[T]{
|
|
filters: filters,
|
|
strategy: strategy,
|
|
}
|
|
}
|
|
|
|
func (s *defaultSelector[T]) Select(vs ...T) (v T) {
|
|
for _, filter := range s.filters {
|
|
vs = filter.Filter(vs...)
|
|
}
|
|
if len(vs) == 0 {
|
|
return
|
|
}
|
|
return s.strategy.Apply(vs...)
|
|
}
|