update selector
This commit is contained in:
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package metadata
|
package metadata
|
||||||
|
|
||||||
type Metadatable interface {
|
type Metadatable interface {
|
||||||
GetMetadata() Metadata
|
Metadata() Metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
type Metadata interface {
|
type Metadata interface {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user