outbound.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 (DefaultOutboundHandlerManager) Start() error { return nil }
  22. func (DefaultOutboundHandlerManager) Close() {}
  23. func (v *DefaultOutboundHandlerManager) GetDefaultHandler() proxyman.OutboundHandler {
  24. v.RLock()
  25. defer v.RUnlock()
  26. if v.defaultHandler == nil {
  27. return nil
  28. }
  29. return v.defaultHandler
  30. }
  31. func (v *DefaultOutboundHandlerManager) GetHandler(tag string) proxyman.OutboundHandler {
  32. v.RLock()
  33. defer v.RUnlock()
  34. if handler, found := v.taggedHandler[tag]; found {
  35. return handler
  36. }
  37. return nil
  38. }
  39. func (v *DefaultOutboundHandlerManager) AddHandler(ctx context.Context, config *proxyman.OutboundHandlerConfig) error {
  40. v.Lock()
  41. defer v.Unlock()
  42. handler, err := NewHandler(ctx, config)
  43. if err != nil {
  44. return err
  45. }
  46. if v.defaultHandler == nil {
  47. v.defaultHandler = handler
  48. }
  49. if len(config.Tag) > 0 {
  50. v.taggedHandler[config.Tag] = handler
  51. }
  52. return nil
  53. }
  54. func init() {
  55. common.Must(common.RegisterConfig((*proxyman.OutboundConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  56. return New(ctx, config.(*proxyman.OutboundConfig))
  57. }))
  58. }