1
0

server.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package v2rayapi
  2. import (
  3. "errors"
  4. "net"
  5. "net/http"
  6. "github.com/sagernet/sing-box/adapter"
  7. "github.com/sagernet/sing-box/experimental"
  8. "github.com/sagernet/sing-box/log"
  9. "github.com/sagernet/sing-box/option"
  10. "github.com/sagernet/sing/common"
  11. "google.golang.org/grpc"
  12. "google.golang.org/grpc/credentials/insecure"
  13. )
  14. func init() {
  15. experimental.RegisterV2RayServerConstructor(NewServer)
  16. }
  17. var _ adapter.V2RayServer = (*Server)(nil)
  18. type Server struct {
  19. logger log.Logger
  20. listen string
  21. tcpListener net.Listener
  22. grpcServer *grpc.Server
  23. statsService *StatsService
  24. }
  25. func NewServer(logger log.Logger, options option.V2RayAPIOptions) (adapter.V2RayServer, error) {
  26. grpcServer := grpc.NewServer(grpc.Creds(insecure.NewCredentials()))
  27. statsService := NewStatsService(common.PtrValueOrDefault(options.Stats))
  28. if statsService != nil {
  29. RegisterStatsServiceServer(grpcServer, statsService)
  30. }
  31. server := &Server{
  32. logger: logger,
  33. listen: options.Listen,
  34. grpcServer: grpcServer,
  35. statsService: statsService,
  36. }
  37. return server, nil
  38. }
  39. func (s *Server) Name() string {
  40. return "v2ray server"
  41. }
  42. func (s *Server) Start(stage adapter.StartStage) error {
  43. if stage != adapter.StartStatePostStart {
  44. return nil
  45. }
  46. listener, err := net.Listen("tcp", s.listen)
  47. if err != nil {
  48. return err
  49. }
  50. s.logger.Info("grpc server started at ", listener.Addr())
  51. s.tcpListener = listener
  52. go func() {
  53. err = s.grpcServer.Serve(listener)
  54. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  55. s.logger.Error(err)
  56. }
  57. }()
  58. return nil
  59. }
  60. func (s *Server) Close() error {
  61. if s.grpcServer != nil {
  62. s.grpcServer.Stop()
  63. }
  64. return common.Close(
  65. common.PtrOrNil(s.grpcServer),
  66. s.tcpListener,
  67. )
  68. }
  69. func (s *Server) StatsService() adapter.ConnectionTracker {
  70. return s.statsService
  71. }