From 99adf4bb0692b7b93c9bee9ed64350d4722abf12 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sun, 4 Sep 2022 13:22:34 +0800 Subject: [PATCH] update selector --- chain/chain.go | 15 ++++++--------- chain/node.go | 2 ++ metadata/metadata.go | 2 +- selector/selector.go | 15 ++++++--------- service/service.go | 1 + 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/chain/chain.go b/chain/chain.go index 786408d..1013a84 100644 --- a/chain/chain.go +++ b/chain/chain.go @@ -11,11 +11,6 @@ type Chainer interface { Route(ctx context.Context, network, address string) Route } -type SelectableChainer interface { - Chainer - selector.Selectable -} - type Chain struct { name string groups []*NodeGroup @@ -39,10 +34,12 @@ func (c *Chain) WithMetadata(md metadata.Metadata) { c.metadata = md } +// Metadata implements metadata.Metadatable interface. func (c *Chain) Metadata() metadata.Metadata { return c.metadata } +// Marker implements selector.Markable interface. func (c *Chain) Marker() selector.Marker { return c.marker } @@ -78,15 +75,15 @@ func (c *Chain) Route(ctx context.Context, network, address string) Route { } type ChainGroup struct { - chains []SelectableChainer - selector selector.Selector[SelectableChainer] + chains []Chainer + selector selector.Selector[Chainer] } -func NewChainGroup(chains ...SelectableChainer) *ChainGroup { +func NewChainGroup(chains ...Chainer) *ChainGroup { 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 return p } diff --git a/chain/node.go b/chain/node.go index 336b7dd..9e136cc 100644 --- a/chain/node.go +++ b/chain/node.go @@ -54,10 +54,12 @@ func (node *Node) WithMetadata(md metadata.Metadata) *Node { return node } +// Marker implements selector.Markable interface. func (node *Node) Marker() selector.Marker { return node.marker } +// Metadata implements metadadta.Metadatable interface. func (node *Node) Metadata() metadata.Metadata { return node.metadata } diff --git a/metadata/metadata.go b/metadata/metadata.go index 73dfd04..41c2052 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -1,7 +1,7 @@ package metadata type Metadatable interface { - GetMetadata() Metadata + Metadata() Metadata } type Metadata interface { diff --git a/selector/selector.go b/selector/selector.go index 0aa38ae..510af9f 100644 --- a/selector/selector.go +++ b/selector/selector.go @@ -4,27 +4,24 @@ import ( "context" "sync/atomic" "time" - - "github.com/go-gost/core/metadata" ) -type Selectable interface { - Marker() Marker - Metadata() metadata.Metadata -} - type Selector[T any] interface { Select(context.Context, ...T) T } -type Strategy[T Selectable] interface { +type Strategy[T any] interface { Apply(context.Context, ...T) T } -type Filter[T Selectable] interface { +type Filter[T any] interface { Filter(context.Context, ...T) []T } +type Markable interface { + Marker() Marker +} + type Marker interface { Time() time.Time Count() int64 diff --git a/service/service.go b/service/service.go index 402e876..6e7009b 100644 --- a/service/service.go +++ b/service/service.go @@ -85,6 +85,7 @@ func (s *service) Serve() error { for { conn, e := s.listener.Accept() if e != nil { + // TODO: remove Temporary checking if ne, ok := e.(net.Error); ok && ne.Temporary() { if tempDelay == 0 { tempDelay = 1 * time.Second