diff --git a/app/dispatcher/default.go b/app/dispatcher/default.go index 553ab7727..217b3a64b 100644 --- a/app/dispatcher/default.go +++ b/app/dispatcher/default.go @@ -19,6 +19,7 @@ import ( "v2ray.com/core/common/vio" "v2ray.com/core/features/outbound" "v2ray.com/core/features/routing" + feature_stats "v2ray.com/core/features/stats" "v2ray.com/core/transport/pipe" ) @@ -85,7 +86,7 @@ type DefaultDispatcher struct { ohm outbound.HandlerManager router routing.Router policy core.PolicyManager - stats core.StatManager + stats feature_stats.Manager } // NewDefaultDispatcher create a new DefaultDispatcher. @@ -132,7 +133,7 @@ func (d *DefaultDispatcher) getLink(ctx context.Context) (*vio.Link, *vio.Link) p := d.policy.ForLevel(user.Level) if p.Stats.UserUplink { name := "user>>>" + user.Email + ">>>traffic>>>uplink" - if c, _ := core.GetOrRegisterStatCounter(d.stats, name); c != nil { + if c, _ := feature_stats.GetOrRegisterCounter(d.stats, name); c != nil { inboundLink.Writer = &stats.SizeStatWriter{ Counter: c, Writer: inboundLink.Writer, @@ -141,7 +142,7 @@ func (d *DefaultDispatcher) getLink(ctx context.Context) (*vio.Link, *vio.Link) } if p.Stats.UserDownlink { name := "user>>>" + user.Email + ">>>traffic>>>downlink" - if c, _ := core.GetOrRegisterStatCounter(d.stats, name); c != nil { + if c, _ := feature_stats.GetOrRegisterCounter(d.stats, name); c != nil { outboundLink.Writer = &stats.SizeStatWriter{ Counter: c, Writer: outboundLink.Writer, diff --git a/app/proxyman/command/command.go b/app/proxyman/command/command.go index 30fb2e480..e9cc8aabf 100755 --- a/app/proxyman/command/command.go +++ b/app/proxyman/command/command.go @@ -6,6 +6,7 @@ import ( grpc "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/common" + "v2ray.com/core/features/inbound" "v2ray.com/core/features/outbound" "v2ray.com/core/proxy" ) @@ -13,7 +14,7 @@ import ( // InboundOperation is the interface for operations that applies to inbound handlers. type InboundOperation interface { // ApplyInbound applies this operation to the given inbound handler. - ApplyInbound(context.Context, core.InboundHandler) error + ApplyInbound(context.Context, inbound.Handler) error } // OutboundOperation is the interface for operations that applies to outbound handlers. @@ -22,7 +23,7 @@ type OutboundOperation interface { ApplyOutbound(context.Context, outbound.Handler) error } -func getInbound(handler core.InboundHandler) (proxy.Inbound, error) { +func getInbound(handler inbound.Handler) (proxy.Inbound, error) { gi, ok := handler.(proxy.GetInbound) if !ok { return nil, newError("can't get inbound proxy from handler.") @@ -31,7 +32,7 @@ func getInbound(handler core.InboundHandler) (proxy.Inbound, error) { } // ApplyInbound implements InboundOperation. -func (op *AddUserOperation) ApplyInbound(ctx context.Context, handler core.InboundHandler) error { +func (op *AddUserOperation) ApplyInbound(ctx context.Context, handler inbound.Handler) error { p, err := getInbound(handler) if err != nil { return err @@ -48,7 +49,7 @@ func (op *AddUserOperation) ApplyInbound(ctx context.Context, handler core.Inbou } // ApplyInbound implements InboundOperation. -func (op *RemoveUserOperation) ApplyInbound(ctx context.Context, handler core.InboundHandler) error { +func (op *RemoveUserOperation) ApplyInbound(ctx context.Context, handler inbound.Handler) error { p, err := getInbound(handler) if err != nil { return err @@ -62,7 +63,7 @@ func (op *RemoveUserOperation) ApplyInbound(ctx context.Context, handler core.In type handlerServer struct { s *core.Instance - ihm core.InboundHandlerManager + ihm inbound.Manager ohm outbound.HandlerManager } @@ -71,7 +72,7 @@ func (s *handlerServer) AddInbound(ctx context.Context, request *AddInboundReque if err != nil { return nil, err } - handler, ok := rawHandler.(core.InboundHandler) + handler, ok := rawHandler.(inbound.Handler) if !ok { return nil, newError("not an InboundHandler.") } diff --git a/app/proxyman/inbound/always.go b/app/proxyman/inbound/always.go index 24998d102..d67a7b86c 100644 --- a/app/proxyman/inbound/always.go +++ b/app/proxyman/inbound/always.go @@ -10,26 +10,27 @@ import ( "v2ray.com/core/common/dice" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" + "v2ray.com/core/features/stats" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" ) -func getStatCounter(v *core.Instance, tag string) (core.StatCounter, core.StatCounter) { - var uplinkCounter core.StatCounter - var downlinkCounter core.StatCounter +func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter) { + var uplinkCounter stats.Counter + var downlinkCounter stats.Counter policy := v.PolicyManager() - stats := v.Stats() + statsManager := v.Stats() if len(tag) > 0 && policy.ForSystem().Stats.InboundUplink { name := "inbound>>>" + tag + ">>>traffic>>>uplink" - c, _ := core.GetOrRegisterStatCounter(stats, name) + c, _ := stats.GetOrRegisterCounter(statsManager, name) if c != nil { uplinkCounter = c } } if len(tag) > 0 && policy.ForSystem().Stats.InboundDownlink { name := "inbound>>>" + tag + ">>>traffic>>>downlink" - c, _ := core.GetOrRegisterStatCounter(stats, name) + c, _ := stats.GetOrRegisterCounter(statsManager, name) if c != nil { downlinkCounter = c } diff --git a/app/proxyman/inbound/inbound.go b/app/proxyman/inbound/inbound.go index c249bcf4a..8caf34227 100644 --- a/app/proxyman/inbound/inbound.go +++ b/app/proxyman/inbound/inbound.go @@ -11,30 +11,31 @@ import ( "v2ray.com/core/common" "v2ray.com/core/common/serial" "v2ray.com/core/common/session" + "v2ray.com/core/features/inbound" ) // Manager is to manage all inbound handlers. type Manager struct { access sync.RWMutex - untaggedHandler []core.InboundHandler - taggedHandlers map[string]core.InboundHandler + untaggedHandler []inbound.Handler + taggedHandlers map[string]inbound.Handler running bool } // New returns a new Manager for inbound handlers. func New(ctx context.Context, config *proxyman.InboundConfig) (*Manager, error) { m := &Manager{ - taggedHandlers: make(map[string]core.InboundHandler), + taggedHandlers: make(map[string]inbound.Handler), } v := core.MustFromContext(ctx) - if err := v.RegisterFeature((*core.InboundHandlerManager)(nil), m); err != nil { + if err := v.RegisterFeature((*inbound.Manager)(nil), m); err != nil { return nil, newError("unable to register InboundHandlerManager").Base(err) } return m, nil } -// AddHandler implements core.InboundHandlerManager. -func (m *Manager) AddHandler(ctx context.Context, handler core.InboundHandler) error { +// AddHandler implements inbound.Manager. +func (m *Manager) AddHandler(ctx context.Context, handler inbound.Handler) error { m.access.Lock() defer m.access.Unlock() @@ -52,8 +53,8 @@ func (m *Manager) AddHandler(ctx context.Context, handler core.InboundHandler) e return nil } -// GetHandler implements core.InboundHandlerManager. -func (m *Manager) GetHandler(ctx context.Context, tag string) (core.InboundHandler, error) { +// GetHandler implements inbound.Manager. +func (m *Manager) GetHandler(ctx context.Context, tag string) (inbound.Handler, error) { m.access.RLock() defer m.access.RUnlock() @@ -64,7 +65,7 @@ func (m *Manager) GetHandler(ctx context.Context, tag string) (core.InboundHandl return handler, nil } -// RemoveHandler implements core.InboundHandlerManager. +// RemoveHandler implements inbound.Manager. func (m *Manager) RemoveHandler(ctx context.Context, tag string) error { if len(tag) == 0 { return common.ErrNoClue @@ -131,8 +132,8 @@ func (m *Manager) Close() error { return nil } -// NewHandler creates a new core.InboundHandler based on the given config. -func NewHandler(ctx context.Context, config *core.InboundHandlerConfig) (core.InboundHandler, error) { +// NewHandler creates a new inbound.Handler based on the given config. +func NewHandler(ctx context.Context, config *core.InboundHandlerConfig) (inbound.Handler, error) { rawReceiverSettings, err := config.ReceiverSettings.GetInstance() if err != nil { return nil, err diff --git a/app/proxyman/inbound/worker.go b/app/proxyman/inbound/worker.go index b7081f582..772a68d94 100644 --- a/app/proxyman/inbound/worker.go +++ b/app/proxyman/inbound/worker.go @@ -6,7 +6,6 @@ import ( "sync/atomic" "time" - "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/buf" @@ -16,6 +15,7 @@ import ( "v2ray.com/core/common/signal/done" "v2ray.com/core/common/task" "v2ray.com/core/features/routing" + "v2ray.com/core/features/stats" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tcp" @@ -39,8 +39,8 @@ type tcpWorker struct { tag string dispatcher routing.Dispatcher sniffingConfig *proxyman.SniffingConfig - uplinkCounter core.StatCounter - downlinkCounter core.StatCounter + uplinkCounter stats.Counter + downlinkCounter stats.Counter hub internet.Listener } @@ -145,8 +145,8 @@ type udpConn struct { remote net.Addr local net.Addr done *done.Instance - uplink core.StatCounter - downlink core.StatCounter + uplink stats.Counter + downlink stats.Counter } func (c *udpConn) updateActivity() { @@ -225,8 +225,8 @@ type udpWorker struct { tag string stream *internet.MemoryStreamConfig dispatcher routing.Dispatcher - uplinkCounter core.StatCounter - downlinkCounter core.StatCounter + uplinkCounter stats.Counter + downlinkCounter stats.Counter checker *task.Periodic activeConn map[connID]*udpConn diff --git a/app/stats/command/command.go b/app/stats/command/command.go index e44b0f493..c6f93beff 100644 --- a/app/stats/command/command.go +++ b/app/stats/command/command.go @@ -11,14 +11,15 @@ import ( "v2ray.com/core/app/stats" "v2ray.com/core/common" "v2ray.com/core/common/strmatcher" + feature_stats "v2ray.com/core/features/stats" ) // statsServer is an implementation of StatsService. type statsServer struct { - stats core.StatManager + stats feature_stats.Manager } -func NewStatsServer(manager core.StatManager) StatsServiceServer { +func NewStatsServer(manager feature_stats.Manager) StatsServiceServer { return &statsServer{stats: manager} } @@ -54,7 +55,7 @@ func (s *statsServer) QueryStats(ctx context.Context, request *QueryStatsRequest return nil, newError("QueryStats only works its own stats.Manager.") } - manager.Visit(func(name string, c core.StatCounter) bool { + manager.Visit(func(name string, c feature_stats.Counter) bool { if matcher.Match(name) { var value int64 if request.Reset_ { diff --git a/app/stats/stats.go b/app/stats/stats.go index 94bcb7925..a39432ed8 100644 --- a/app/stats/stats.go +++ b/app/stats/stats.go @@ -8,29 +8,30 @@ import ( "sync/atomic" "v2ray.com/core" + "v2ray.com/core/features/stats" ) -// Counter is an implementation of core.StatCounter. +// Counter is an implementation of stats.Counter. type Counter struct { value int64 } -// Value implements core.StatCounter. +// Value implements stats.Counter. func (c *Counter) Value() int64 { return atomic.LoadInt64(&c.value) } -// Set implements core.StatCounter. +// Set implements stats.Counter. func (c *Counter) Set(newValue int64) int64 { return atomic.SwapInt64(&c.value, newValue) } -// Add implements core.StatCounter. +// Add implements stats.Counter. func (c *Counter) Add(delta int64) int64 { return atomic.AddInt64(&c.value, delta) } -// Manager is an implementation of core.StatManager. +// Manager is an implementation of stats.Manager. type Manager struct { access sync.RWMutex counters map[string]*Counter @@ -43,7 +44,7 @@ func NewManager(ctx context.Context, config *Config) (*Manager, error) { v := core.FromContext(ctx) if v != nil { - if err := v.RegisterFeature((*core.StatManager)(nil), m); err != nil { + if err := v.RegisterFeature((*stats.Manager)(nil), m); err != nil { return nil, newError("failed to register StatManager").Base(err) } } @@ -51,7 +52,7 @@ func NewManager(ctx context.Context, config *Config) (*Manager, error) { return m, nil } -func (m *Manager) RegisterCounter(name string) (core.StatCounter, error) { +func (m *Manager) RegisterCounter(name string) (stats.Counter, error) { m.access.Lock() defer m.access.Unlock() @@ -64,7 +65,7 @@ func (m *Manager) RegisterCounter(name string) (core.StatCounter, error) { return c, nil } -func (m *Manager) GetCounter(name string) core.StatCounter { +func (m *Manager) GetCounter(name string) stats.Counter { m.access.RLock() defer m.access.RUnlock() @@ -74,7 +75,7 @@ func (m *Manager) GetCounter(name string) core.StatCounter { return nil } -func (m *Manager) Visit(visitor func(string, core.StatCounter) bool) { +func (m *Manager) Visit(visitor func(string, stats.Counter) bool) { m.access.RLock() defer m.access.RUnlock() diff --git a/app/stats/stats_test.go b/app/stats/stats_test.go index 51a145acf..917db3df9 100644 --- a/app/stats/stats_test.go +++ b/app/stats/stats_test.go @@ -4,16 +4,16 @@ import ( "context" "testing" - "v2ray.com/core" . "v2ray.com/core/app/stats" "v2ray.com/core/common" + "v2ray.com/core/features/stats" . "v2ray.com/ext/assert" ) func TestInternface(t *testing.T) { assert := With(t) - assert((*Manager)(nil), Implements, (*core.StatManager)(nil)) + assert((*Manager)(nil), Implements, (*stats.Manager)(nil)) } func TestStatsCounter(t *testing.T) { @@ -22,7 +22,7 @@ func TestStatsCounter(t *testing.T) { raw, err := common.CreateObject(context.Background(), &Config{}) assert(err, IsNil) - m := raw.(core.StatManager) + m := raw.(stats.Manager) c, err := m.RegisterCounter("test.counter") assert(err, IsNil) diff --git a/common/stats/io.go b/common/stats/io.go index 4d92f8b6a..60ffabac6 100644 --- a/common/stats/io.go +++ b/common/stats/io.go @@ -1,14 +1,14 @@ package stats import ( - "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" + "v2ray.com/core/features/stats" "v2ray.com/core/transport/pipe" ) type SizeStatWriter struct { - Counter core.StatCounter + Counter stats.Counter Writer buf.Writer } diff --git a/features/inbound/inbound.go b/features/inbound/inbound.go new file mode 100644 index 000000000..fc7845474 --- /dev/null +++ b/features/inbound/inbound.go @@ -0,0 +1,31 @@ +package inbound + +import ( + "context" + + "v2ray.com/core/common" + "v2ray.com/core/common/net" + "v2ray.com/core/features" +) + +// Handler is the interface for handlers that process inbound connections. +type Handler interface { + common.Runnable + // The tag of this handler. + Tag() string + + // Deprecated. Do not use in new code. + GetRandomInboundProxy() (interface{}, net.Port, int) +} + +// Manager is a feature that manages InboundHandlers. +type Manager interface { + features.Feature + // GetHandlers returns an InboundHandler for the given tag. + GetHandler(ctx context.Context, tag string) (Handler, error) + // AddHandler adds the given handler into this InboundHandlerManager. + AddHandler(ctx context.Context, handler Handler) error + + // RemoveHandler removes a handler from InboundHandlerManager. + RemoveHandler(ctx context.Context, tag string) error +} diff --git a/features/stats/stats.go b/features/stats/stats.go new file mode 100644 index 000000000..a5cdf82a7 --- /dev/null +++ b/features/stats/stats.go @@ -0,0 +1,26 @@ +package stats + +import "v2ray.com/core/features" + +type Counter interface { + Value() int64 + Set(int64) int64 + Add(int64) int64 +} + +type Manager interface { + features.Feature + + RegisterCounter(string) (Counter, error) + GetCounter(string) Counter +} + +// GetOrRegisterCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter. +func GetOrRegisterCounter(m Manager, name string) (Counter, error) { + counter := m.GetCounter(name) + if counter != nil { + return counter, nil + } + + return m.RegisterCounter(name) +} diff --git a/network.go b/network.go index 060da2676..3e9119568 100644 --- a/network.go +++ b/network.go @@ -5,78 +5,56 @@ import ( "sync" "v2ray.com/core/common" - "v2ray.com/core/common/net" + "v2ray.com/core/features/inbound" "v2ray.com/core/features/outbound" ) -// InboundHandler is the interface for handlers that process inbound connections. -type InboundHandler interface { - common.Runnable - // The tag of this handler. - Tag() string - - // Deprecated. Do not use in new code. - GetRandomInboundProxy() (interface{}, net.Port, int) -} - -// InboundHandlerManager is a feature that manages InboundHandlers. -type InboundHandlerManager interface { - Feature - // GetHandlers returns an InboundHandler for the given tag. - GetHandler(ctx context.Context, tag string) (InboundHandler, error) - // AddHandler adds the given handler into this InboundHandlerManager. - AddHandler(ctx context.Context, handler InboundHandler) error - - // RemoveHandler removes a handler from InboundHandlerManager. - RemoveHandler(ctx context.Context, tag string) error -} - type syncInboundHandlerManager struct { sync.RWMutex - InboundHandlerManager + inbound.Manager } -func (m *syncInboundHandlerManager) GetHandler(ctx context.Context, tag string) (InboundHandler, error) { +func (m *syncInboundHandlerManager) GetHandler(ctx context.Context, tag string) (inbound.Handler, error) { m.RLock() defer m.RUnlock() - if m.InboundHandlerManager == nil { - return nil, newError("InboundHandlerManager not set.").AtError() + if m.Manager == nil { + return nil, newError("inbound.Manager not set.").AtError() } - return m.InboundHandlerManager.GetHandler(ctx, tag) + return m.Manager.GetHandler(ctx, tag) } -func (m *syncInboundHandlerManager) AddHandler(ctx context.Context, handler InboundHandler) error { +func (m *syncInboundHandlerManager) AddHandler(ctx context.Context, handler inbound.Handler) error { m.RLock() defer m.RUnlock() - if m.InboundHandlerManager == nil { - return newError("InboundHandlerManager not set.").AtError() + if m.Manager == nil { + return newError("inbound.Manager not set.").AtError() } - return m.InboundHandlerManager.AddHandler(ctx, handler) + return m.Manager.AddHandler(ctx, handler) } func (m *syncInboundHandlerManager) Start() error { m.RLock() defer m.RUnlock() - if m.InboundHandlerManager == nil { - return newError("InboundHandlerManager not set.").AtError() + if m.Manager == nil { + return newError("inbound.Manager not set.").AtError() } - return m.InboundHandlerManager.Start() + return m.Manager.Start() } func (m *syncInboundHandlerManager) Close() error { m.RLock() defer m.RUnlock() - return common.Close(m.InboundHandlerManager) + return common.Close(m.Manager) } -func (m *syncInboundHandlerManager) Set(manager InboundHandlerManager) { +func (m *syncInboundHandlerManager) Set(manager inbound.Manager) { if manager == nil { return } @@ -84,8 +62,8 @@ func (m *syncInboundHandlerManager) Set(manager InboundHandlerManager) { m.Lock() defer m.Unlock() - common.Close(m.InboundHandlerManager) // nolint: errcheck - m.InboundHandlerManager = manager + common.Close(m.Manager) // nolint: errcheck + m.Manager = manager } type syncOutboundHandlerManager struct { diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 97205df32..b9bda6134 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -20,6 +20,7 @@ import ( "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/common/uuid" + feature_inbound "v2ray.com/core/features/inbound" "v2ray.com/core/features/routing" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/encoding" @@ -100,7 +101,7 @@ func (v *userByEmail) Remove(email string) bool { // Handler is an inbound connection handler that handles messages in VMess protocol. type Handler struct { policyManager core.PolicyManager - inboundHandlerManager core.InboundHandlerManager + inboundHandlerManager feature_inbound.Manager clients *vmess.TimedUserValidator usersByEmail *userByEmail detours *DetourConfig diff --git a/stats.go b/stats.go index 2c7d50828..7665c6d6f 100644 --- a/stats.go +++ b/stats.go @@ -2,86 +2,65 @@ package core import ( "sync" + + "v2ray.com/core/features/stats" ) -type StatCounter interface { - Value() int64 - Set(int64) int64 - Add(int64) int64 -} - -type StatManager interface { - Feature - - RegisterCounter(string) (StatCounter, error) - GetCounter(string) StatCounter -} - -// GetOrRegisterStatCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter. -func GetOrRegisterStatCounter(m StatManager, name string) (StatCounter, error) { - counter := m.GetCounter(name) - if counter != nil { - return counter, nil - } - - return m.RegisterCounter(name) -} - type syncStatManager struct { sync.RWMutex - StatManager + stats.Manager } func (s *syncStatManager) Start() error { s.RLock() defer s.RUnlock() - if s.StatManager == nil { + if s.Manager == nil { return nil } - return s.StatManager.Start() + return s.Manager.Start() } func (s *syncStatManager) Close() error { s.RLock() defer s.RUnlock() - if s.StatManager == nil { + if s.Manager == nil { return nil } - return s.StatManager.Close() + return s.Manager.Close() } -func (s *syncStatManager) RegisterCounter(name string) (StatCounter, error) { +func (s *syncStatManager) RegisterCounter(name string) (stats.Counter, error) { s.RLock() defer s.RUnlock() - if s.StatManager == nil { + if s.Manager == nil { return nil, newError("StatManager not set.") } - return s.StatManager.RegisterCounter(name) + return s.Manager.RegisterCounter(name) } -func (s *syncStatManager) GetCounter(name string) StatCounter { +func (s *syncStatManager) GetCounter(name string) stats.Counter { s.RLock() defer s.RUnlock() - if s.StatManager == nil { + if s.Manager == nil { return nil } - return s.StatManager.GetCounter(name) + return s.Manager.GetCounter(name) } -func (s *syncStatManager) Set(m StatManager) { +func (s *syncStatManager) Set(m stats.Manager) { if m == nil { return } s.Lock() defer s.Unlock() - if s.StatManager != nil { - s.StatManager.Close() // nolint: errcheck + if s.Manager != nil { + s.Manager.Close() // nolint: errcheck } - s.StatManager = m + s.Manager = m } diff --git a/v2ray.go b/v2ray.go index 20e23a7b7..d25d14f72 100755 --- a/v2ray.go +++ b/v2ray.go @@ -7,8 +7,10 @@ import ( "v2ray.com/core/common" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" + "v2ray.com/core/features/inbound" "v2ray.com/core/features/outbound" "v2ray.com/core/features/routing" + "v2ray.com/core/features/stats" ) // Server is an instance of V2Ray. At any time, there must be at most one Server instance running. @@ -64,12 +66,12 @@ func New(config *Config) (*Instance, error) { } } - for _, inbound := range config.Inbound { - rawHandler, err := CreateObject(server, inbound) + for _, inboundConfig := range config.Inbound { + rawHandler, err := CreateObject(server, inboundConfig) if err != nil { return nil, err } - handler, ok := rawHandler.(InboundHandler) + handler, ok := rawHandler.(inbound.Handler) if !ok { return nil, newError("not an InboundHandler") } @@ -153,12 +155,12 @@ func (s *Instance) RegisterFeature(feature interface{}, instance Feature) error s.router.Set(instance.(routing.Router)) case routing.Dispatcher, *routing.Dispatcher: s.dispatcher.Set(instance.(routing.Dispatcher)) - case InboundHandlerManager, *InboundHandlerManager: - s.ihm.Set(instance.(InboundHandlerManager)) + case inbound.Manager, *inbound.Manager: + s.ihm.Set(instance.(inbound.Manager)) case outbound.HandlerManager, *outbound.HandlerManager: s.ohm.Set(instance.(outbound.HandlerManager)) - case StatManager, *StatManager: - s.stats.Set(instance.(StatManager)) + case stats.Manager, *stats.Manager: + s.stats.Set(instance.(stats.Manager)) default: s.access.Lock() s.features = append(s.features, instance) @@ -210,7 +212,7 @@ func (s *Instance) Dispatcher() routing.Dispatcher { } // InboundHandlerManager returns the InboundHandlerManager used by this Instance. If InboundHandlerManager was not registered before, the returned value doesn't work. -func (s *Instance) InboundHandlerManager() InboundHandlerManager { +func (s *Instance) InboundHandlerManager() inbound.Manager { return &(s.ihm) } @@ -219,7 +221,7 @@ func (s *Instance) OutboundHandlerManager() outbound.HandlerManager { return &(s.ohm) } -// Stats returns the StatManager used by this Instance. If StatManager was not registered before, the returned value doesn't work. -func (s *Instance) Stats() StatManager { +// Stats returns the stats.Manager used by this Instance. If StatManager was not registered before, the returned value doesn't work. +func (s *Instance) Stats() stats.Manager { return &(s.stats) }