update selector

This commit is contained in:
ginuerzh
2022-09-04 13:22:34 +08:00
parent 7136710673
commit 99adf4bb06
5 changed files with 16 additions and 19 deletions

View File

@ -11,11 +11,6 @@ type Chainer interface {
Route(ctx context.Context, network, address string) Route Route(ctx context.Context, network, address string) Route
} }
type SelectableChainer interface {
Chainer
selector.Selectable
}
type Chain struct { type Chain struct {
name string name string
groups []*NodeGroup groups []*NodeGroup
@ -39,10 +34,12 @@ func (c *Chain) WithMetadata(md metadata.Metadata) {
c.metadata = md c.metadata = md
} }
// Metadata implements metadata.Metadatable interface.
func (c *Chain) Metadata() metadata.Metadata { func (c *Chain) Metadata() metadata.Metadata {
return c.metadata return c.metadata
} }
// Marker implements selector.Markable interface.
func (c *Chain) Marker() selector.Marker { func (c *Chain) Marker() selector.Marker {
return c.marker return c.marker
} }
@ -78,15 +75,15 @@ func (c *Chain) Route(ctx context.Context, network, address string) Route {
} }
type ChainGroup struct { type ChainGroup struct {
chains []SelectableChainer chains []Chainer
selector selector.Selector[SelectableChainer] selector selector.Selector[Chainer]
} }
func NewChainGroup(chains ...SelectableChainer) *ChainGroup { func NewChainGroup(chains ...Chainer) *ChainGroup {
return &ChainGroup{chains: chains} return &ChainGroup{chains: chains}
} }
func (p *ChainGroup) WithSelector(s selector.Selector[SelectableChainer]) *ChainGroup { func (p *ChainGroup) WithSelector(s selector.Selector[Chainer]) *ChainGroup {
p.selector = s p.selector = s
return p return p
} }

View File

@ -54,10 +54,12 @@ func (node *Node) WithMetadata(md metadata.Metadata) *Node {
return node return node
} }
// Marker implements selector.Markable interface.
func (node *Node) Marker() selector.Marker { func (node *Node) Marker() selector.Marker {
return node.marker return node.marker
} }
// Metadata implements metadadta.Metadatable interface.
func (node *Node) Metadata() metadata.Metadata { func (node *Node) Metadata() metadata.Metadata {
return node.metadata return node.metadata
} }

View File

@ -1,7 +1,7 @@
package metadata package metadata
type Metadatable interface { type Metadatable interface {
GetMetadata() Metadata Metadata() Metadata
} }
type Metadata interface { type Metadata interface {

View File

@ -4,27 +4,24 @@ import (
"context" "context"
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/go-gost/core/metadata"
) )
type Selectable interface {
Marker() Marker
Metadata() metadata.Metadata
}
type Selector[T any] interface { type Selector[T any] interface {
Select(context.Context, ...T) T Select(context.Context, ...T) T
} }
type Strategy[T Selectable] interface { type Strategy[T any] interface {
Apply(context.Context, ...T) T Apply(context.Context, ...T) T
} }
type Filter[T Selectable] interface { type Filter[T any] interface {
Filter(context.Context, ...T) []T Filter(context.Context, ...T) []T
} }
type Markable interface {
Marker() Marker
}
type Marker interface { type Marker interface {
Time() time.Time Time() time.Time
Count() int64 Count() int64

View File

@ -85,6 +85,7 @@ func (s *service) Serve() error {
for { for {
conn, e := s.listener.Accept() conn, e := s.listener.Accept()
if e != nil { if e != nil {
// TODO: remove Temporary checking
if ne, ok := e.(net.Error); ok && ne.Temporary() { if ne, ok := e.(net.Error); ok && ne.Temporary() {
if tempDelay == 0 { if tempDelay == 0 {
tempDelay = 1 * time.Second tempDelay = 1 * time.Second