service.go 2.3 KB

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