github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/app/restfulapi/service.go (about)

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