outbound.go 1.7 KB

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