outbound.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package outbound
  2. import (
  3. "context"
  4. "sync"
  5. "v2ray.com/core/app/proxyman"
  6. "v2ray.com/core/common"
  7. )
  8. type DefaultOutboundHandlerManager struct {
  9. sync.RWMutex
  10. defaultHandler *Handler
  11. taggedHandler map[string]*Handler
  12. }
  13. func New(ctx context.Context, config *proxyman.OutboundConfig) (*DefaultOutboundHandlerManager, error) {
  14. return &DefaultOutboundHandlerManager{
  15. taggedHandler: make(map[string]*Handler),
  16. }, nil
  17. }
  18. func (DefaultOutboundHandlerManager) Interface() interface{} {
  19. return (*proxyman.OutboundHandlerManager)(nil)
  20. }
  21. func (v *DefaultOutboundHandlerManager) GetDefaultHandler() proxyman.OutboundHandler {
  22. v.RLock()
  23. defer v.RUnlock()
  24. if v.defaultHandler == nil {
  25. return nil
  26. }
  27. return v.defaultHandler
  28. }
  29. func (v *DefaultOutboundHandlerManager) GetHandler(tag string) proxyman.OutboundHandler {
  30. v.RLock()
  31. defer v.RUnlock()
  32. if handler, found := v.taggedHandler[tag]; found {
  33. return handler
  34. }
  35. return nil
  36. }
  37. func (v *DefaultOutboundHandlerManager) AddHandler(ctx context.Context, config *proxyman.OutboundHandlerConfig) error {
  38. v.Lock()
  39. defer v.Unlock()
  40. handler, err := NewHandler(ctx, config)
  41. if err != nil {
  42. return err
  43. }
  44. if v.defaultHandler == nil {
  45. v.defaultHandler = handler
  46. }
  47. if len(config.Tag) > 0 {
  48. v.taggedHandler[config.Tag] = handler
  49. }
  50. return nil
  51. }
  52. func init() {
  53. common.Must(common.RegisterConfig((*proxyman.OutboundConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  54. return New(ctx, config.(*proxyman.OutboundConfig))
  55. }))
  56. }