builder.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package outbound
  2. import (
  3. "context"
  4. "github.com/sagernet/sing-box/adapter"
  5. C "github.com/sagernet/sing-box/constant"
  6. "github.com/sagernet/sing-box/log"
  7. "github.com/sagernet/sing-box/option"
  8. E "github.com/sagernet/sing/common/exceptions"
  9. )
  10. func New(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.Outbound) (adapter.Outbound, error) {
  11. if tag != "" {
  12. ctx = adapter.WithContext(ctx, &adapter.InboundContext{
  13. Outbound: tag,
  14. })
  15. }
  16. if options.Type == "" {
  17. return nil, E.New("missing outbound type")
  18. }
  19. ctx = ContextWithTag(ctx, tag)
  20. switch options.Type {
  21. case C.TypeDirect:
  22. return NewDirect(router, logger, tag, options.DirectOptions)
  23. case C.TypeBlock:
  24. return NewBlock(logger, tag), nil
  25. case C.TypeDNS:
  26. return NewDNS(router, tag), nil
  27. case C.TypeSOCKS:
  28. return NewSocks(router, logger, tag, options.SocksOptions)
  29. case C.TypeHTTP:
  30. return NewHTTP(ctx, router, logger, tag, options.HTTPOptions)
  31. case C.TypeShadowsocks:
  32. return NewShadowsocks(ctx, router, logger, tag, options.ShadowsocksOptions)
  33. case C.TypeVMess:
  34. return NewVMess(ctx, router, logger, tag, options.VMessOptions)
  35. case C.TypeTrojan:
  36. return NewTrojan(ctx, router, logger, tag, options.TrojanOptions)
  37. case C.TypeWireGuard:
  38. return NewWireGuard(ctx, router, logger, tag, options.WireGuardOptions)
  39. case C.TypeHysteria:
  40. return NewHysteria(ctx, router, logger, tag, options.HysteriaOptions)
  41. case C.TypeTor:
  42. return NewTor(ctx, router, logger, tag, options.TorOptions)
  43. case C.TypeSSH:
  44. return NewSSH(ctx, router, logger, tag, options.SSHOptions)
  45. case C.TypeShadowTLS:
  46. return NewShadowTLS(ctx, router, logger, tag, options.ShadowTLSOptions)
  47. case C.TypeShadowsocksR:
  48. return NewShadowsocksR(ctx, router, logger, tag, options.ShadowsocksROptions)
  49. case C.TypeVLESS:
  50. return NewVLESS(ctx, router, logger, tag, options.VLESSOptions)
  51. case C.TypeTUIC:
  52. return NewTUIC(ctx, router, logger, tag, options.TUICOptions)
  53. case C.TypeHysteria2:
  54. return NewHysteria2(ctx, router, logger, tag, options.Hysteria2Options)
  55. case C.TypeSelector:
  56. return NewSelector(ctx, router, logger, tag, options.SelectorOptions)
  57. case C.TypeURLTest:
  58. return NewURLTest(ctx, router, logger, tag, options.URLTestOptions)
  59. default:
  60. return nil, E.New("unknown outbound type: ", options.Type)
  61. }
  62. }