| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | package outbound//go:generate errorgenimport (	"context"	"sync"	"v2ray.com/core"	"v2ray.com/core/app/proxyman"	"v2ray.com/core/common")// Manager is to manage all outbound handlers.type Manager struct {	access           sync.RWMutex	defaultHandler   core.OutboundHandler	taggedHandler    map[string]core.OutboundHandler	untaggedHandlers []core.OutboundHandler	running          bool}// New creates a new Manager.func New(ctx context.Context, config *proxyman.OutboundConfig) (*Manager, error) {	m := &Manager{		taggedHandler: make(map[string]core.OutboundHandler),	}	v := core.MustFromContext(ctx)	if err := v.RegisterFeature((*core.OutboundHandlerManager)(nil), m); err != nil {		return nil, newError("unable to register OutboundHandlerManager").Base(err)	}	return m, nil}// Start implements core.Featurefunc (m *Manager) Start() error {	m.access.Lock()	defer m.access.Unlock()	m.running = true	for _, h := range m.taggedHandler {		if err := h.Start(); err != nil {			return err		}	}	for _, h := range m.untaggedHandlers {		if err := h.Start(); err != nil {			return err		}	}	return nil}// Close implements core.Featurefunc (m *Manager) Close() error {	m.access.Lock()	defer m.access.Unlock()	m.running = false	for _, h := range m.taggedHandler {		h.Close()	}	for _, h := range m.untaggedHandlers {		h.Close()	}	return nil}// GetDefaultHandler implements core.OutboundHandlerManager.func (m *Manager) GetDefaultHandler() core.OutboundHandler {	m.access.RLock()	defer m.access.RUnlock()	if m.defaultHandler == nil {		return nil	}	return m.defaultHandler}// GetHandler implements core.OutboundHandlerManager.func (m *Manager) GetHandler(tag string) core.OutboundHandler {	m.access.RLock()	defer m.access.RUnlock()	if handler, found := m.taggedHandler[tag]; found {		return handler	}	return nil}// AddHandler implements core.OutboundHandlerManager.func (m *Manager) AddHandler(ctx context.Context, handler core.OutboundHandler) error {	m.access.Lock()	defer m.access.Unlock()	if m.defaultHandler == nil {		m.defaultHandler = handler	}	tag := handler.Tag()	if len(tag) > 0 {		m.taggedHandler[tag] = handler	} else {		m.untaggedHandlers = append(m.untaggedHandlers, handler)	}	if m.running {		return handler.Start()	}	return nil}// RemoveHandler implements core.OutboundHandlerManager.func (m *Manager) RemoveHandler(ctx context.Context, tag string) error {	if len(tag) == 0 {		return core.ErrNoClue	}	m.access.Lock()	defer m.access.Unlock()	delete(m.taggedHandler, tag)	if m.defaultHandler.Tag() == tag {		m.defaultHandler = nil	}	return nil}func init() {	common.Must(common.RegisterConfig((*proxyman.OutboundConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {		return New(ctx, config.(*proxyman.OutboundConfig))	}))	common.Must(common.RegisterConfig((*core.OutboundHandlerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {		return NewHandler(ctx, config.(*core.OutboundHandlerConfig))	}))}
 |