service.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package box
  2. import (
  3. "context"
  4. "github.com/sagernet/sing-box/adapter"
  5. "github.com/sagernet/sing-box/adapter/inbound"
  6. "github.com/sagernet/sing-box/adapter/outbound"
  7. "github.com/sagernet/sing-box/adapter/route"
  8. "github.com/sagernet/sing-box/log"
  9. "github.com/sagernet/sing-box/option"
  10. "github.com/sagernet/sing/common"
  11. )
  12. var _ adapter.Service = (*Service)(nil)
  13. type Service struct {
  14. router adapter.Router
  15. logger log.Logger
  16. inbounds []adapter.Inbound
  17. outbounds []adapter.Outbound
  18. }
  19. func NewService(ctx context.Context, options *option.Options) (*Service, error) {
  20. var logOptions option.LogOption
  21. if options.Log != nil {
  22. logOptions = *options.Log
  23. }
  24. logger, err := log.NewLogger(logOptions)
  25. if err != nil {
  26. return nil, err
  27. }
  28. router := route.NewRouter(logger)
  29. var inbounds []adapter.Inbound
  30. var outbounds []adapter.Outbound
  31. if len(options.Inbounds) > 0 {
  32. for i, inboundOptions := range options.Inbounds {
  33. var inboundService adapter.Inbound
  34. inboundService, err = inbound.New(ctx, router, logger, i, inboundOptions)
  35. if err != nil {
  36. return nil, err
  37. }
  38. inbounds = append(inbounds, inboundService)
  39. }
  40. }
  41. for i, outboundOptions := range options.Outbounds {
  42. var outboundService adapter.Outbound
  43. outboundService, err = outbound.New(router, logger, i, outboundOptions)
  44. if err != nil {
  45. return nil, err
  46. }
  47. outbounds = append(outbounds, outboundService)
  48. }
  49. if len(outbounds) == 0 {
  50. outbounds = append(outbounds, outbound.NewDirect(nil, logger, "direct", &option.DirectOutboundOptions{}))
  51. }
  52. router.UpdateOutbounds(outbounds)
  53. err = router.UpdateRules(options.Routes)
  54. if err != nil {
  55. return nil, err
  56. }
  57. return &Service{
  58. router: router,
  59. logger: logger,
  60. inbounds: inbounds,
  61. outbounds: outbounds,
  62. }, nil
  63. }
  64. func (s *Service) Start() error {
  65. for _, in := range s.inbounds {
  66. err := in.Start()
  67. if err != nil {
  68. return err
  69. }
  70. }
  71. return nil
  72. }
  73. func (s *Service) Close() error {
  74. for _, in := range s.inbounds {
  75. in.Close()
  76. }
  77. for _, out := range s.outbounds {
  78. common.Close(out)
  79. }
  80. s.logger.Close()
  81. s.router.Close()
  82. return nil
  83. }