service.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package restful_api
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. core "github.com/v2fly/v2ray-core/v4"
  6. "github.com/v2fly/v2ray-core/v4/features"
  7. feature_stats "github.com/v2fly/v2ray-core/v4/features/stats"
  8. "net"
  9. "sync"
  10. )
  11. //go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
  12. type restfulService struct {
  13. *gin.Engine
  14. listener net.Listener
  15. config *Config
  16. access sync.Mutex
  17. stats feature_stats.Manager
  18. ctx context.Context
  19. }
  20. func (r *restfulService) Type() interface{} {
  21. return (*struct{})(nil)
  22. }
  23. func (r *restfulService) Start() error {
  24. defer r.access.Unlock()
  25. r.access.Lock()
  26. return r.start()
  27. }
  28. func (r *restfulService) Close() error {
  29. defer r.access.Unlock()
  30. r.access.Lock()
  31. if r.listener != nil {
  32. return r.listener.Close()
  33. }
  34. return nil
  35. }
  36. func (r *restfulService) init(config *Config, stats feature_stats.Manager) {
  37. r.stats = stats
  38. r.config = config
  39. }
  40. func newRestfulService(ctx context.Context, config *Config) (features.Feature, error) {
  41. r := new(restfulService)
  42. r.ctx = ctx
  43. if err := core.RequireFeatures(ctx, func(stats feature_stats.Manager) {
  44. r.init(config, stats)
  45. }); err != nil {
  46. return nil, err
  47. }
  48. return r, nil
  49. }