refactor dependency resolution

This commit is contained in:
Darien Raymond committed 2018-10-21 10:27:13 +02:00
1 parent d9cdfffc69
commit a5dcb0f13e
36 files changed
+355 -729

No files matched your search

+30 -25
View File
@@ -12,29 +12,46 @@ import (
"v2ray.com/core"
"v2ray.com/core/common"
"v2ray.com/core/common/signal/done"
"v2ray.com/core/features"
"v2ray.com/core/features/outbound"
)
// Commander is a V2Ray feature that provides gRPC methods to external clients.
type Commander struct {
sync.Mutex
server *grpc.Server
config Config
v *core.Instance
ohm outbound.Manager
server *grpc.Server
services []Service
ohm outbound.Manager
tag string
}
// NewCommander creates a new Commander based on the given config.
func NewCommander(ctx context.Context, config *Config) (*Commander, error) {
v := core.MustFromContext(ctx)
c := &Commander{
config: *config,
ohm: v.OutboundHandlerManager(),
v: v,
tag: config.Tag,
}
if err := v.RegisterFeature(c); err != nil {
return nil, err
v := core.MustFromContext(ctx)
v.RequireFeatures([]interface{}{outbound.ManagerType()}, func(fs []features.Feature) {
c.ohm = fs[0].(outbound.Manager)
})
for _, rawConfig := range config.Service {
config, err := rawConfig.GetInstance()
if err != nil {
return nil, err
}
rawService, err := common.CreateObject(ctx, config)
if err != nil {
return nil, err
}
service, ok := rawService.(Service)
if !ok {
return nil, newError("not a Service.")
}
c.services = append(c.services, service)
}
return c, nil
}
@@ -47,19 +64,7 @@ func (c *Commander) Type() interface{} {
func (c *Commander) Start() error {
c.Lock()
c.server = grpc.NewServer()
for _, rawConfig := range c.config.Service {
config, err := rawConfig.GetInstance()
if err != nil {
return err
}
rawService, err := core.CreateObject(c.v, config)
if err != nil {
return err
}
service, ok := rawService.(Service)
if !ok {
return newError("not a Service.")
}
for _, service := range c.services {
service.Register(c.server)
}
c.Unlock()
@@ -75,12 +80,12 @@ func (c *Commander) Start() error {
}
}()
if err := c.ohm.RemoveHandler(context.Background(), c.config.Tag); err != nil {
if err := c.ohm.RemoveHandler(context.Background(), c.tag); err != nil {
newError("failed to remove existing handler").WriteToLog()
}
return c.ohm.AddHandler(context.Background(), &Outbound{
tag: c.config.Tag,
tag: c.tag,
listener: listener,
})
}
+15 -9
View File
@@ -16,6 +16,7 @@ import (
"v2ray.com/core/common/protocol"
"v2ray.com/core/common/session"
"v2ray.com/core/common/vio"
"v2ray.com/core/features"
"v2ray.com/core/features/outbound"
"v2ray.com/core/features/policy"
"v2ray.com/core/features/routing"
@@ -91,17 +92,22 @@ type DefaultDispatcher struct {
// NewDefaultDispatcher create a new DefaultDispatcher.
func NewDefaultDispatcher(ctx context.Context, config *Config) (*DefaultDispatcher, error) {
d := &DefaultDispatcher{}
v := core.MustFromContext(ctx)
d := &DefaultDispatcher{
ohm: v.OutboundHandlerManager(),
router: v.Router(),
policy: v.PolicyManager(),
stats: v.Stats(),
}
v.RequireFeatures([]interface{}{outbound.ManagerType(), routing.RouterType(), policy.ManagerType()}, func(fs []features.Feature) {
d.ohm = fs[0].(outbound.Manager)
d.router = fs[1].(routing.Router)
d.policy = fs[2].(policy.Manager)
})
v.RequireFeatures([]interface{}{core.ServerType()}, func([]features.Feature) {
f := v.GetFeature(stats.ManagerType())
if f == nil {
return
}
d.stats = f.(stats.Manager)
})
if err := v.RegisterFeature(d); err != nil {
return nil, newError("unable to register Dispatcher").Base(err)
}
return d, nil
}
+8 -4
View File
@@ -7,6 +7,8 @@ import (
"sync"
"time"
"v2ray.com/core/features/routing"
"v2ray.com/core"
"v2ray.com/core/common"
"v2ray.com/core/common/net"
@@ -42,9 +44,6 @@ func New(ctx context.Context, config *Config) (*Server, error) {
server.hosts = hosts
v := core.MustFromContext(ctx)
if err := v.RegisterFeature(server); err != nil {
return nil, newError("unable to register DNSClient.").Base(err)
}
addNameServer := func(endpoint *net.Endpoint) int {
address := endpoint.Address.AsAddress()
@@ -56,7 +55,12 @@ func New(ctx context.Context, config *Config) (*Server, error) {
dest.Network = net.Network_UDP
}
if dest.Network == net.Network_UDP {
server.servers = append(server.servers, NewClassicNameServer(dest, v.Dispatcher(), server.clientIP))
idx := len(server.servers)
server.servers = append(server.servers, nil)
v.RequireFeatures([]interface{}{routing.DispatcherType()}, func(fs []features.Feature) {
dispatcher := fs[0].(routing.Dispatcher)
server.servers[idx] = NewClassicNameServer(dest, dispatcher, server.clientIP)
})
}
}
return len(server.servers) - 1
+3 -2
View File
@@ -13,6 +13,7 @@ import (
_ "v2ray.com/core/app/proxyman/outbound"
"v2ray.com/core/common/net"
"v2ray.com/core/common/serial"
feature_dns "v2ray.com/core/features/dns"
"v2ray.com/core/proxy/freedom"
"v2ray.com/core/testing/servers/udp"
. "v2ray.com/ext/assert"
@@ -85,7 +86,7 @@ func TestUDPServer(t *testing.T) {
v, err := core.New(config)
assert(err, IsNil)
client := v.DNSClient()
client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client)
ips, err := client.LookupIP("google.com")
assert(err, IsNil)
@@ -171,7 +172,7 @@ func TestPrioritizedDomain(t *testing.T) {
v, err := core.New(config)
assert(err, IsNil)
client := v.DNSClient()
client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client)
startTime := time.Now()
ips, err := client.LookupIP("google.com")
-6
View File
@@ -6,7 +6,6 @@ import (
"context"
"sync"
"v2ray.com/core"
"v2ray.com/core/common"
"v2ray.com/core/common/log"
)
@@ -28,11 +27,6 @@ func New(ctx context.Context, config *Config) (*Instance, error) {
}
log.RegisterHandler(g)
v := core.FromContext(ctx)
if v != nil {
common.Must(v.RegisterFeature(g))
}
return g, nil
}
-8
View File
@@ -3,7 +3,6 @@ package policy
import (
"context"
"v2ray.com/core"
"v2ray.com/core/common"
"v2ray.com/core/features/policy"
)
@@ -28,13 +27,6 @@ func New(ctx context.Context, config *Config) (*Instance, error) {
}
}
v := core.FromContext(ctx)
if v != nil {
if err := v.RegisterFeature(m); err != nil {
return nil, newError("unable to register PolicyManager in core").Base(err).AtError()
}
}
return m, nil
}
+9 -4
View File
@@ -4,8 +4,10 @@ import (
"context"
grpc "google.golang.org/grpc"
"v2ray.com/core"
"v2ray.com/core/common"
"v2ray.com/core/features"
"v2ray.com/core/features/inbound"
"v2ray.com/core/features/outbound"
"v2ray.com/core/proxy"
@@ -136,11 +138,14 @@ type service struct {
}
func (s *service) Register(server *grpc.Server) {
RegisterHandlerServiceServer(server, &handlerServer{
s: s.v,
ihm: s.v.InboundHandlerManager(),
ohm: s.v.OutboundHandlerManager(),
hs := &handlerServer{
s: s.v,
}
s.v.RequireFeatures([]interface{}{inbound.ManagerType(), outbound.ManagerType()}, func(fs []features.Feature) {
hs.ihm = fs[0].(inbound.Manager)
hs.ohm = fs[1].(outbound.Manager)
})
RegisterHandlerServiceServer(server, hs)
}
func init() {
+4 -2
View File
@@ -10,6 +10,7 @@ import (
"v2ray.com/core/common/dice"
"v2ray.com/core/common/net"
"v2ray.com/core/common/serial"
"v2ray.com/core/features/policy"
"v2ray.com/core/features/stats"
"v2ray.com/core/proxy"
"v2ray.com/core/transport/internet"
@@ -19,9 +20,9 @@ func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter)
var uplinkCounter stats.Counter
var downlinkCounter stats.Counter
policy := v.PolicyManager()
statsManager := v.Stats()
policy := v.GetFeature(policy.ManagerType()).(policy.Manager)
if len(tag) > 0 && policy.ForSystem().Stats.InboundUplink {
statsManager := v.GetFeature(stats.ManagerType()).(stats.Manager)
name := "inbound>>>" + tag + ">>>traffic>>>uplink"
c, _ := stats.GetOrRegisterCounter(statsManager, name)
if c != nil {
@@ -29,6 +30,7 @@ func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter)
}
}
if len(tag) > 0 && policy.ForSystem().Stats.InboundDownlink {
statsManager := v.GetFeature(stats.ManagerType()).(stats.Manager)
name := "inbound>>>" + tag + ">>>traffic>>>downlink"
c, _ := stats.GetOrRegisterCounter(statsManager, name)
if c != nil {
-4
View File
@@ -27,10 +27,6 @@ func New(ctx context.Context, config *proxyman.InboundConfig) (*Manager, error)
m := &Manager{
taggedHandlers: make(map[string]inbound.Handler),
}
v := core.MustFromContext(ctx)
if err := v.RegisterFeature(m); err != nil {
return nil, newError("unable to register InboundHandlerManager").Base(err)
}
return m, nil
}
+7 -3
View File
@@ -8,6 +8,8 @@ import (
"sync"
"time"
"v2ray.com/core/features"
"v2ray.com/core"
"v2ray.com/core/app/proxyman"
"v2ray.com/core/common"
@@ -304,9 +306,11 @@ type Server struct {
// NewServer creates a new mux.Server.
func NewServer(ctx context.Context) *Server {
s := &Server{
dispatcher: core.MustFromContext(ctx).Dispatcher(),
}
s := &Server{}
v := core.MustFromContext(ctx)
v.RequireFeatures([]interface{}{routing.DispatcherType()}, func(fs []features.Feature) {
s.dispatcher = fs[0].(routing.Dispatcher)
})
return s
}
+1 -1
View File
@@ -29,7 +29,7 @@ func NewHandler(ctx context.Context, config *core.OutboundHandlerConfig) (outbou
v := core.MustFromContext(ctx)
h := &Handler{
config: config,
outboundManager: v.OutboundHandlerManager(),
outboundManager: v.GetFeature(outbound.ManagerType()).(outbound.Manager),
}
if config.SenderSettings != nil {
-4
View File
@@ -26,10 +26,6 @@ func New(ctx context.Context, config *proxyman.OutboundConfig) (*Manager, error)
m := &Manager{
taggedHandler: make(map[string]outbound.Handler),
}
v := core.MustFromContext(ctx)
if err := v.RegisterFeature(m); err != nil {
return nil, newError("unable to register outbound.Manager").Base(err)
}
return m, nil
}
+5 -5
View File
@@ -9,6 +9,7 @@ import (
"v2ray.com/core/common"
"v2ray.com/core/common/net"
"v2ray.com/core/common/session"
"v2ray.com/core/features"
"v2ray.com/core/features/dns"
"v2ray.com/core/features/routing"
"v2ray.com/core/proxy"
@@ -23,11 +24,9 @@ type Router struct {
// NewRouter creates a new Router based on the given config.
func NewRouter(ctx context.Context, config *Config) (*Router, error) {
v := core.MustFromContext(ctx)
r := &Router{
domainStrategy: config.DomainStrategy,
rules: make([]Rule, len(config.Rule)),
dns: v.DNSClient(),
}
for idx, rule := range config.Rule {
@@ -39,9 +38,10 @@ func NewRouter(ctx context.Context, config *Config) (*Router, error) {
r.rules[idx].Condition = cond
}
if err := v.RegisterFeature(r); err != nil {
return nil, newError("unable to register Router").Base(err)
}
v := core.MustFromContext(ctx)
v.RequireFeatures([]interface{}{dns.ClientType()}, func(fs []features.Feature) {
r.dns = fs[0].(dns.Client)
})
return r, nil
}
+2 -1
View File
@@ -12,6 +12,7 @@ import (
"v2ray.com/core/common/net"
"v2ray.com/core/common/serial"
"v2ray.com/core/common/session"
"v2ray.com/core/features/routing"
. "v2ray.com/ext/assert"
)
@@ -38,7 +39,7 @@ func TestSimpleRouter(t *testing.T) {
v, err := core.New(config)
common.Must(err)
r := v.Router()
r := v.GetFeature(routing.RouterType()).(routing.Router)
ctx := withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.com"), 80)})
tag, err := r.PickRoute(ctx)
+2 -1
View File
@@ -79,7 +79,8 @@ type service struct {
}
func (s *service) Register(server *grpc.Server) {
RegisterStatsServiceServer(server, NewStatsServer(s.v.Stats()))
f := s.v.GetFeature(feature_stats.ManagerType())
RegisterStatsServiceServer(server, NewStatsServer(f.(feature_stats.Manager)))
}
func init() {
-8
View File
@@ -7,7 +7,6 @@ import (
"sync"
"sync/atomic"
"v2ray.com/core"
"v2ray.com/core/features/stats"
)
@@ -42,13 +41,6 @@ func NewManager(ctx context.Context, config *Config) (*Manager, error) {
counters: make(map[string]*Counter),
}
v := core.FromContext(ctx)
if v != nil {
if err := v.RegisterFeature(m); err != nil {
return nil, newError("failed to register StatManager").Base(err)
}
}
return m, nil
}